o
    2&i\+                     @   sb   d dl Z d dlZd dlmZmZmZmZ d dlmZ d dl	m
Z
mZmZmZmZ G dd dZdS )    N)DictListAnyOptional)Groq)SCENARIO_GENERATION_PROMPTCHARACTER_ROLEPLAY_PROMPTCHARACTER_CONCLUSION_PROMPTSKILL_ANALYSIS_PROMPTget_skill_analysis_templatec                   @   s   e Zd Zdd ZdefddZdeeef fddZd	d
 Z	deeef de
eeef  fddZddeeef deeeef  dedede
e f
ddZdeeef deeeef  de
eeef  fddZdede
e fddZdS )GroqServicec                 C   sR   t d}|stdt|d| _d| _ddddddddddddd| _d S )NGROQ_API_KEYz/GROQ_API_KEY not found in environment variables)api_keyzopenai/gpt-oss-20br   inputoutputtotal)previewconversation
assessment)osgetenv
ValueErrorr   clientmodeltoken_counts)selfr    r   D/var/www/eduai.edurigo.com/roleplay/testing/services/groq_service.py__init__   s   



zGroqService.__init__operation_typec              	   C   s   |rHt |drJt |drL|j}|j}|j}| j| d  |7  < | j| d  |7  < | j| d  |7  < td| d| d| d	|  d
S d
S d
S d
S )z*Update token counts for specific operationprompt_tokenscompletion_tokensr   r   r   zGROQ Token count for z: Input=z	, Output=z, Total=N)hasattrr!   r"   total_tokensr   print)r   r    usage_statsinput_tokensoutput_tokensr$   r   r   r   _update_token_count   s   $zGroqService._update_token_countreturnc                 C   s
   | j  S )z+Get current token counts for all operations)r   copy)r   r   r   r   get_token_counts*   s   
zGroqService.get_token_countsc                 C   s"   | j D ]}dddd| j |< qdS )zReset all token countersr   r   N)r   )r   	operationr   r   r   reset_token_counts.   s   
zGroqService.reset_token_countsadmin_inputc              
   C   s*  zzt j|d |d |d d|d d}| jjjjddd	d
|d	g| jddd}| d|j	 |j
d jj }z|drF|dd }|drQ|dd }t|W W S  tjyz } ztd|  td|  W Y d}~W dS d}~ww  ty } ztd|  W Y d}~dS d}~ww )z-Generate structured scenario from admin inputcategory	objectivedetails, skills_to_assess)r0   r1   r2   skillssystemzHYou are a training scenario expert. Always respond with valid JSON only.rolecontentuserffffff?i   messagesr   temperature
max_tokensr   r   ```json   N```zJSON parsing error: Response text: zError generating scenario: )r   formatjoinr   chatcompletionscreater   r)   usagechoicesmessager9   strip
startswithendswithjsonloadsJSONDecodeErrorr%   	Exception)r   r/   promptresponseresponse_texter   r   r   generate_scenario3   sL   



zGroqService.generate_scenarioFscenarioconversation_historyuser_messageis_conclusionc                 C   s>  zd}|D ]}|d dkrdn|d d }|| d|d  d	7 }q|r't }nt}|j|d d |d d
 |d d |d d |d dd|d d |d d |dd|d d ||d}	| jjjjdddd|	dg| jddd}
| 	d|
j
 |
jd jj W S  ty } ztd|  W Y d}~d S d}~ww )!z&AI character responses during roleplay speakerlearnerLearnerai_charactername: rL   
personalitygoals
backgroundemotional_stateneutralscenario_setupcontextenvironmentr1   constraints)character_namere   rf   rg   rh   rk   rl   r1   rm   rZ   r[   r6   zYou are a roleplay character. Stay in character at all times. Respond naturally, realistically, and politely. Maintain a courteous and professional tone throughout the conversation. Guide conversations toward professional conclusions when appropriate.r7   r:   g?i   r<   r   r   zError in character roleplay: Nz:I'm having trouble responding right now. Please try again.)r	   r   rE   getr   rG   rH   rI   r   r)   rJ   rK   rL   r9   rM   rS   r%   )r   rY   rZ   r[   r\   history_textturnr^   prompt_templaterT   rU   rW   r   r   r   play_characterd   sP   









zGroqService.play_characterconversation_turnsc                    sj  zd}|D ]}|d dkrdnd}|| d|d  d7 }qd	|d
  d|d  d|d d  d|d  d|d d  d|d d  d}|d }t |}tjd||||d}	| jjjjdddd|	dg| jddd }
| 	d!|
j
 |
jd" jj }zB|d#r|d$d% }n|d&r|d'd% }|d&r|d%d( }| }t| t fd)d*d+D std, W W d%S  W W S  tjy } zJtd-|  td.|  d"d%l}|d/||j}|rzt|  td0  W W  Y d%}~W S  tjy   td1 Y nw W Y d%}~W d%S d%}~ww  ty4 } ztd2|  W Y d%}~d%S d%}~ww )3zComprehensive skill analysisr]   r^   r_   r`   zAI Characterrc   rL   rd   z
Category: r0   z
Objective: r1   z

Context: rj   rk   z
Success Criteria: success_criteriaz
AI Character: ra   rb   z - rg   r4   r3   )r5   scenario_contextr   skill_analysis_templater6   z`You are an expert skill assessor. Provide detailed, accurate analysis in valid JSON format only.r7   r:   g333333?i  r<   r   r   r@   rA   NrB      rC   c                 3   s    | ]}| v V  qd S )Nr   ).0keyanalysisr   r   	<genexpr>   s    z-GroqService.analyze_skills.<locals>.<genexpr>)skill_analysisoverall_performanceconversation_analysisrecommendationszAnalysis missing required keysz JSON parsing error in analysis: rD   z\{.*\}z0Successfully extracted JSON using regex fallbackzRegex fallback also failedzError analyzing skills: )r   r
   rE   rF   r   rG   rH   rI   r   r)   rJ   rK   rL   r9   rM   rN   rO   rP   rQ   allr%   rR   researchDOTALLgrouprS   )r   rY   rt   conversation_textrq   r^   rv   r5   skill_templaterT   rU   rV   rW   r   
json_matchr   r{   r   analyze_skills   s   








zGroqService.analyze_skillsrT   c              
   C   s   z&| j jjjdddd|dg| jddd}| d|j |jd	 jj	
 W S  ty@ } ztd
|  W Y d}~dS d}~ww )z)Get a simple text completion from the LLMr6   z]You are a helpful assistant. Provide clear, natural responses without any formatting symbols.r7   r:   r;   i  r<   r   r   zError getting completion: N)r   rG   rH   rI   r   r)   rJ   rK   rL   r9   rM   rS   r%   )r   rT   rU   rW   r   r   r   get_completion   s(   

zGroqService.get_completionN)F)__name__
__module____qualname__r   strr)   r   r   r,   r.   r   rX   r   boolrs   r   r   r   r   r   r   r      s    &8165Zr   )r   rP   typingr   r   r   r   groqr   config.promptsr   r   r	   r
   r   r   r   r   r   r   <module>   s    