Spaces:
Runtime error
Runtime error
from typing import List, Optional | |
from pydantic import BaseModel, Field | |
import json | |
class AttachmentStyle(BaseModel): | |
secured: float = 0.0 | |
anxious_preoccupied: float = 0.0 | |
dismissive_avoidant: float = 0.0 | |
fearful_avoidant: float = 0.0 | |
avoidance: int = 0 | |
self_model: int = 0 | |
anxiety: int = 0 | |
others_model: int = 0 | |
explanation: str = "No explanation provided" | |
class BigFiveTraits(BaseModel): | |
extraversion: int = 0 | |
agreeableness: int = 0 | |
conscientiousness: int = 0 | |
neuroticism: int = 0 | |
openness: int = 0 | |
explanation: str = "No explanation provided" | |
class PersonalityDisorder(BaseModel): | |
depressed: int = 0 | |
paranoid: int = 0 | |
schizoid_schizotypal: int = 0 | |
antisocial_psychopathic: int = 0 | |
borderline_dysregulated: int = 0 | |
narcissistic: int = 0 | |
anxious_avoidant: int = 0 | |
dependent_victimized: int = 0 | |
obsessional: int = 0 | |
explanation: str = "No explanation provided" | |
class SpeakerAnalysis(BaseModel): | |
speaker: str = "Unknown Speaker" | |
general_impression: str = "No general impression provided" | |
attachment_style: AttachmentStyle = AttachmentStyle() | |
big_five_traits: BigFiveTraits = BigFiveTraits() | |
personality_disorder: PersonalityDisorder = PersonalityDisorder() | |
class OutputParser: | |
def parse(self, text: str) -> List[SpeakerAnalysis]: | |
try: | |
data = json.loads(text) | |
if "speaker_analyses" in data and isinstance(data["speaker_analyses"], list): | |
return [self.parse_speaker_analysis(item) for item in data["speaker_analyses"]] | |
else: | |
raise ValueError("Invalid JSON structure: missing or invalid 'speaker_analyses' key") | |
except json.JSONDecodeError: | |
raise ValueError(f"Invalid JSON: {text}") | |
except Exception as e: | |
raise ValueError(f"Error parsing output: {str(e)}") | |
def parse_speaker_analysis(self, obj: dict) -> SpeakerAnalysis: | |
attachment_styles = obj.get("Attachment Styles", {}) | |
big_five_traits = obj.get("Big Five Traits", {}) | |
personality_disorders = obj.get("Personality Disorders", {}) | |
# Handle general_impression as a string | |
general_impression = obj.get("General Impression", {}) | |
if isinstance(general_impression, dict): | |
# Convert the dictionary to a formatted string | |
general_impression_str = "\n".join([f"{key}: {value}" for key, value in general_impression.items()]) | |
else: | |
general_impression_str = str(general_impression) | |
return SpeakerAnalysis( | |
speaker=str(obj.get("Speaker", "Unknown Speaker")), # Convert to string | |
general_impression=general_impression_str, | |
attachment_style=AttachmentStyle( | |
secured=attachment_styles.get("Secured", 0.0), | |
anxious_preoccupied=attachment_styles.get("Anxious-Preoccupied", 0.0), | |
dismissive_avoidant=attachment_styles.get("Dismissive-Avoidant", 0.0), | |
fearful_avoidant=attachment_styles.get("FearfulAvoidant", 0.0), | |
avoidance=attachment_styles.get("Avoidance", 0), | |
self_model=attachment_styles.get("Self", 0), | |
anxiety=attachment_styles.get("Anxiety", 0), | |
others_model=attachment_styles.get("Others", 0), | |
explanation=attachment_styles.get("Explanation", "No explanation provided") | |
), | |
big_five_traits=BigFiveTraits( | |
extraversion=big_five_traits.get("Extraversion", 0), | |
agreeableness=big_five_traits.get("Agreeableness", 0), | |
conscientiousness=big_five_traits.get("Conscientiousness", 0), | |
neuroticism=big_five_traits.get("Neuroticism", 0), | |
openness=big_five_traits.get("Openness", 0), | |
explanation=big_five_traits.get("Explanation", "No explanation provided") | |
), | |
personality_disorder=PersonalityDisorder( | |
depressed=personality_disorders.get("Depressed", 0), | |
paranoid=personality_disorders.get("Paranoid", 0), | |
schizoid_schizotypal=personality_disorders.get("Schizoid-Schizotypal", 0), | |
antisocial_psychopathic=personality_disorders.get("Antisocial-Psychopathic", 0), | |
borderline_dysregulated=personality_disorders.get("Borderline-Dysregulated", 0), | |
narcissistic=personality_disorders.get("Narcissistic", 0), | |
anxious_avoidant=personality_disorders.get("Anxious-Avoidant", 0), | |
dependent_victimized=personality_disorders.get("Dependent-Victimized", 0), | |
obsessional=personality_disorders.get("Obsessional", 0), | |
explanation=personality_disorders.get("Explanation", "No explanation provided") | |
) | |
) | |
output_parser = OutputParser() |