o
    2h*                     @   s^   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 G dd dZdS )    N)DictListAnyOptional)Groq)SCENARIO_GENERATION_PROMPTCHARACTER_ROLEPLAY_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eeef deeeef  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   Y/var/www/eduai.edurigo.com/doc_train/edurigo_ai/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)r/   r0   r1   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messager8   strip
startswithendswithjsonloadsJSONDecodeErrorr$   	Exception)r   r.   promptresponseresponse_texter   r   r   generate_scenario2   sL   



zGroqService.generate_scenarioscenarioconversation_historyuser_messagec           
      C   s&  zxd}|D ]}|d dkrdn|d d }|| d|d  d	7 }qt j|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: rK   
personalitygoals
backgroundemotional_stateneutralscenario_setupcontextenvironmentconstraints)
character_namerc   rd   re   rf   ri   rj   rk   rY   rZ   r5   zbYou are a roleplay character. Stay in character at all times. Respond naturally and realistically.r6   r9   g?i   r;   r   r   zError in character roleplay: Nz:I'm having trouble responding right now. Please try again.)r   rD   getr   rF   rG   rH   r   r(   rI   rJ   rK   r8   rL   rR   r$   )
r   rX   rY   rZ   history_textturnr\   rS   rT   rV   r   r   r   play_characterc   sH   








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 Characterra   rK   rb   z
Category: r/   z
Objective: r0   z

Context: rh   ri   z
Success Criteria: success_criteriaz
AI Character: r_   r`   z - re   r3   r2   )r4   scenario_contextr   skill_analysis_templater5   z`You are an expert skill assessor. Provide detailed, accurate analysis in valid JSON format only.r6   r9   g333333?i  r;   r   r   r?   r@   NrA      rB   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: rC   z\{.*\}z0Successfully extracted JSON using regex fallbackzRegex fallback also failedzError analyzing skills: )r
   r	   rD   rE   r   rF   rG   rH   r   r(   rI   rJ   rK   r8   rL   rM   rN   rO   rP   allr$   rQ   researchDOTALLgrouprR   )r   rX   rq   conversation_textro   r\   rs   r4   skill_templaterS   rT   rU   rV   r   
json_matchr   rx   r   analyze_skills   s   








zGroqService.analyze_skillsrS   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 LLMr5   z]You are a helpful assistant. Provide clear, natural responses without any formatting symbols.r6   r9   r:   i  r;   r   r   zError getting completion: N)r   rF   rG   rH   r   r(   rI   rJ   rK   r8   rL   rR   r$   )r   rS   rT   rV   r   r   r   get_completion   s(   

zGroqService.get_completionN)__name__
__module____qualname__r   strr(   r   r   r+   r-   r   rW   r   rp   r   r   r   r   r   r   r      s    &216/Zr   )r   rO   typingr   r   r   r   groqr   config.promptsr   r   r	   r
   r   r   r   r   r   <module>   s    