Ë
    I»jû  ã                   óP   — d Z ddlmZ ddlmZmZmZmZmZ ddl	m
Z
  G d„ d«      Zy)z<Adaptive interview follow-ups + real-time answer evaluation.é    )Ú	JobStatus)ÚEvaluateAnswerRequestÚEvaluateAnswerResponseÚFollowUpQuestionÚFollowUpRequestÚFollowUpResponse)Úgenerate_jsonc                   ó,   — e Zd Zdedefd„Zdedefd„Zy)ÚInterviewsServiceÚpayloadÚreturnc              ƒ   óÚ  ‡K  — d}d‰j                   › d‰j                  j                  › d‰j                  j                  › d‰j                  › d‰j
                  › d‰j                  xs d› d	‰j                  › d
‰j                  › �}dt        fˆfd„}t        |||¬«      ƒ d {  –—† \  }}}t        |j                  d«      xs g «      D ��	cg c]•  \  }}	t        |	t        «      r€|	j                  d«      rot        t        |	j                  dd|› �«      «      t        |	j                  dd«      «      |	j                  d«      t!        |	j                  d«      xs g «      ¬«      ‘Œ— }
}}	t#        ‰j$                  ‰j&                  t(        j*                  |d|› �t-        |j                  dt-        |
«      «      «      |
t        |j                  d«      xs d«      ¬«      S 7 �Œ=c c}	}w ­w)NzÇYou are an adaptive interviewer. Decide if a follow-up is needed. Return JSON: {"should_follow_up":bool,"next_action":"continue|wrap_up|skip","follow_ups":[{"id","text","rationale","skill_tags":[]}]}úRole: ú

Persona: z
Mode: z
Planned Q: z	
Answer: ú
JD: zn/az
Skills focus: z
Max follow-ups: r   c                  óv   •— dddd‰ j                   › d�d‰ j                  d d xs dgd	œgd ‰ j                   d
œS )NTÚcontinuezfu-1z.Can you go deeper on how you applied that for u"    â€” what trade-offs did you make?z0Probe depth and decision-making from the answer.é   Údepth©ÚidÚtextÚ	rationaleÚ
skill_tags)Úshould_follow_upÚnext_actionÚ
follow_ups)Ú
role_titleÚskills_focusÚmax_follow_ups)r   s   €ú1/var/www/html/TJ-AI/tj/app/services/interviews.pyÚlocalz3InterviewsService.generate_follow_up.<locals>.local   si   ø€ à$(Ø)ð %àLØ&×1Ñ1Ð2Ð2TðVð &XØ&-×&:Ñ&:¸2¸AÐ&>Ò&KÀ7À)ñð
ð +�G×*Ñ*ð
,ñð ó    ©ÚsystemÚuserÚlocal_factoryr   r   r   zfu-Ú r   r   r   zFollow-up generated via r   r   r   )Úcorrelation_idÚinterview_idÚstatusÚstubÚmessager   r   r   )r   ÚpersonaÚvalueÚmodeÚplanned_questionÚcandidate_answerÚjob_descriptionr   r    Údictr	   Ú	enumerateÚgetÚ
isinstancer   ÚstrÚlistr   r)   r*   r   Ú	SUCCEEDEDÚbool)Úselfr   r%   r&   r"   Údatar,   ÚproviderÚiÚfr   s    `         r!   Úgenerate_follow_upz$InterviewsService.generate_follow_up   sî  øè ø€ ðRð 	ð �W×'Ñ'Ð(¨°G·O±O×4IÑ4IÐ3Jð KØ—\‘\×'Ñ'Ð(¨°g×6NÑ6NÐ5Oð PØ×/Ñ/Ð0ð 1Ø×*Ñ*Ò3¨eÐ4ð 5Ø$×1Ñ1Ð2ð 3Ø&×5Ñ5Ð6ð8ð 	ð	”tõ 	ô" &3Ø °Eô&
÷  
Ñˆˆd�Hô " $§(¡(¨<Ó"8Ò">¸BÔ?ô	
ñ @‘��1Ü˜!œTÔ" q§u¡u¨V¤}ô Ü�q—u‘u˜T S¨¨ 9Ó-Ó.Ü˜Ÿ™˜v rÓ*Ó+ØŸ%™% Ó,Ü §¡ lÓ 3Ò 9°rÓ:ö	ð @ð 	ñ 	
ô  Ø"×1Ñ1Ø ×-Ñ-Ü×&Ñ&ØØ.¨x¨jÐ9Ü! $§(¡(Ð+=¼tÀJÓ?OÓ"PÓQØ!Ü˜DŸH™H ]Ó3ÒA°zÓBô	
ð 		
ð 
ûó	
ùs&   ƒB"G+Â%G"Â&)G+ÃBG%Å)A:G+Ç%G+c              ƒ   ón  ‡K  — d}d‰j                   › d‰j                  j                  › d‰j                  › d‰j                  › d‰j
                  › d‰j                  › �}dt        fˆfd	„}t        |||¬
«      ƒ d {  –—† \  }}}t        ‰j                  ‰j                  t        j                  |d|› �|j                  d«      d|j                  d«      t        |j                  d«      xs g «      t        |j                  d«      xs g «      t!        |j                  d«      xs d«      ¬«      S 7 Œµ­w)Nz�Evaluate one live interview answer. Return JSON: {"score":0-1,"feedback","strengths":[],"gaps":[],"next_action":"continue|follow_up|wrap_up"}r   r   z
Q: z
A: r   z	
Skills: r   c                  ó¬   •— t        ‰j                  j                  «       «      } | dk  rdn| dk  rdnd}|d| dkD  rdgng |d	k  rd
gng |d	k  rddœS ddœS )Né(   gÍÌÌÌÌÌÜ?éÈ   gffffffæ?g333333ë?z5Answer captured. Add concrete metrics where possible.é   zRelevant to the questiong      è?zNeeds more evidence / examplesÚ	follow_upr   )ÚscoreÚfeedbackÚ	strengthsÚgapsr   )Úlenr2   Ústrip)ÚlengthrH   r   s     €r!   r"   z0InterviewsService.evaluate_answer.<locals>.localU   sz   ø€ Ü˜×1Ñ1×7Ñ7Ó9Ó:ˆFØ" RšK‘D°F¸S²L©SÀdˆEàØSØ=CÀbº[Ð8Ñ9ÈbØ>CÀdºlÐ9Ñ:ÐPRØ.3°dªl˜{ñð ð
 AKñð r#   r$   zAnswer evaluated via rH   g      ð?rI   rJ   rK   r   r   )r)   r*   r+   r,   r-   rH   Ú	max_scorerI   rJ   rK   r   )r   r.   r/   Úquestionr2   r3   r   r4   r	   r   r)   r*   r   r:   r6   r9   r8   )r<   r   r%   r&   r"   r=   r,   r>   s    `      r!   Úevaluate_answerz!InterviewsService.evaluate_answerG   s?  øè ø€ ð>ð 	ð �W×'Ñ'Ð(¨°G·O±O×4IÑ4IÐ3Jð KØ×"Ñ"Ð# 5¨×)AÑ)AÐ(Bð CØ×*Ñ*Ð+¨:°g×6JÑ6JÐ5KðMð 	ð		”tõ 		ô &3Ø °Eô&
÷  
Ñˆˆd�Hô &Ø"×1Ñ1Ø ×-Ñ-Ü×&Ñ&ØØ+¨H¨:Ð6Ø—(‘(˜7Ó#ØØ—X‘X˜jÓ)Ü˜4Ÿ8™8 KÓ0Ò6°BÓ7Ü�d—h‘h˜vÓ&Ò,¨"Ó-Ü˜DŸH™H ]Ó3ÒA°zÓBô
ð 	
ð 
ús   ƒA:D5Á=D3Á>B6D5N)	Ú__name__Ú
__module__Ú__qualname__r   r   rA   r   r   rQ   © r#   r!   r   r      s,   „ ð6
°ð 6
ÐDTó 6
ðp(
Ø,ð(
à	ô(
r#   r   N)Ú__doc__Úapp.schemas.commonr   Úapp.schemas.interviewsr   r   r   r   r   Úapp.services.ai_generater	   r   rU   r#   r!   Ú<module>rZ      s&   ðÙ Bå (÷õ õ 3÷a
ò a
r#   