
    @i-                         S SK JrJrJrJr  S SKJr  S SKrS SKJr  S SK	J
r
  S SKJr  S SKJr  S SKJr   " S	 S
5      rg)    )DictListAnyOptional)datetimeN)RoleplayScenario)ConversationTurn)GroqService)OllamaService)JSONHandlerc                      \ rS rSrSS jrS\4S jrSS\S\S\S	\	4S
 jjr
SS\	S\S\	S\S\S	\\	   4S jjrS\	S\S	\4S jrS\	S\S	\\\\	\4         4S jrS\	S\S	\\\      4S jrS\	S\S	\4S jrS\	S\S	\\\	\4      4S jrSrg)RoleplayEngine
   Nc                     U=(       d
    [        5       U l        U=(       d
    [        5       U l        [	        5       U l        g )N)r
   groq_servicer   ollama_servicer   json_handler)selfr   r   s      J/var/www/eduai.edurigo.com/roleplay/production/services/roleplay_engine.py__init__RoleplayEngine.__init__   s*    (9KM,?'M    use_groqc                 @    U(       a  U R                   $ U R                  $ )z9Get the appropriate AI service based on groqRoleplay flag)r   r   )r   r   s     r   _get_ai_serviceRoleplayEngine._get_ai_service   s    $,t  E$2E2EEr   scenariois_adminforce_restartreturnc           
         UR                   nU R                  R                  XB5      nU(       a  [        S5        OU(       a  [        S5        U$ [        S5        UUR                   [        R
                  " 5       R                  5       SSSUR                  [        R
                  " 5       R                  5       S.SS	UR                  [        R
                  " 5       R                  5       S./S
.nU R                  R                  XFU5        U$ )zStart a new roleplay sessionzFDEBUG: Force restarting conversation - replacing existing conversationz8DEBUG: Conversation already exists, not creating new onez7DEBUG: No existing conversation found, creating new oneactive   systemturn_numberspeakermessage	timestamp   ai)
session_idscenario_id
started_atstatusturns)
r,   r   load_conversationprintr   now	isoformatscenario_introconversation_startersave_conversation)r   r   r   r   r,   existing_conversationconversation_datas          r   start_sessionRoleplayEngine.start_session   s    ((
 !% 1 1 C CJ YZ\"LNKM %#..",,.224 $%''66!)!9!9!;	 $%#'<<!)!9!9!;	
, 	++J8Tr   r,   learner_messagec                 $  #    U R                   R                  X5      nU(       d  g[        US   5      S-   nUSU[        R                  " 5       R                  5       S.nUS   R                  U5        US    V	s/ s H  oS   S:X  d  M  U	PM     n
n	[        U
5      S:H  nUS   SS  V	s/ s H  oS   S:w  d  M  U	S   U	S	   S
.PM     nn	[        U
5      S:H  nU R                  U5      nUR                  UR                  5       UUUUR                  5      I Sh  vN nU(       d  gUS-   SU[        R                  " 5       R                  5       S.nUS   R                  U5        U R                   R                  XU5        U$ s  sn	f s  sn	f  Ns7f)z%Add learner response and get AI replyNr0   r#   learnerr%   r'   r$   r(   )r'   r(      r+   )r   r1   lenr   r3   r4   appendr   play_characterto_dictroleplay_questionsr7   )r   r,   r   r<   r   r   r9   r&   learner_turnturnlearner_turnsis_first_learner_responseconversation_historyis_conclusion
ai_serviceai_responseai_turns                    r   add_learner_response#RoleplayEngine.add_learner_response?   s     !--??
U  +G459& &!113	
 	'")),7 +<G*De*D$Y[dHd*De$'$6!$;! *'23B7 

 8	?h;V		?	? 8 	  
 M*a/ ))(3
&55 ''
 
  '?"!113	
 	'"))'2 	++J8TU f
 

s8   A8F:F
FF*F	:F		AFFA4Fc                    #    U R                   R                  X5      nU(       d  gSUS'   [        R                  " 5       R	                  5       US'   U R                   R                  XU5      $ 7f)zEnd a roleplay sessionF	completedr/   ended_at)r   r1   r   r3   r4   r7   r   r,   r   r9   s       r   end_sessionRoleplayEngine.end_session~   sa      --??
U &1(#(0(@(@(B*%  22:RZ[[s   A+A-c                 R    U R                   R                  X5      nU(       d  gUS   $ )zGet full conversation historyNr0   )r   r1   rT   s       r   get_conversation_history'RoleplayEngine.get_conversation_history   s*     --??
U  ))r   c                     U R                   R                  X5      nU(       d  g/ nUS    H,  n[        US   US   US   US   S9nUR                  U5        M.     U$ )z/Get conversation turns formatted for assessmentNr0   r&   r'   r(   r)   r%   )r   r1   r	   rB   )r   r,   r   r9   r0   	turn_datarG   s          r   %get_conversation_turns_for_assessment4RoleplayEngine.get_conversation_turns_for_assessment   sr     --??
U *73I#%m4!),!),#K0	D LL 4 r   c                 r    U R                   R                  X5      nU(       d  gUR                  SS5      S:H  $ )z"Check if a session is still activeFr/   r"   )r   r1   getrT   s       r   is_session_active RoleplayEngine.is_session_active   s7     --??
U  $$Xx8HDDr   c                     U R                   R                  X5      nU(       d  gUS   US   US   UR                  SS5      [        US   5      UR                  S5      S	.$ )
zGet basic session informationNr,   r-   r.   r/   r"   r0   rS   )r,   r-   r.   r/   
turn_countrS   )r   r1   r_   rA   rT   s       r   get_session_infoRoleplayEngine.get_session_info   so     --??
U  ,L9,];+L9'++Hh?/89)--j9
 	
r   )r   r   r   )NN)F)T)__name__
__module____qualname____firstlineno__r   boolr   r   intstrr:   r   rO   rU   r   r   r   rX   r	   r\   r`   rd   __static_attributes__ r   r   r   r   
   sD   *F F(&6 (# (VZ (gj (T=S =DT =gj =vy =  FJ =  V^  _b  Vc =~	\C 	\3 	\4 	\*3 *# *(SWX\]`be]eXfSgJh * s W_`deu`vWw $EC E3 E4 E
3 
# 
(4PSUXPX>BZ 
r   r   )typingr   r   r   r   r   uuidmodels.scenarior   models.assessmentr	   services.groq_servicer
   services.ollama_servicer   utils.json_handlerr   r   rn   r   r   <module>rv      s,    , ,   , . - 1 *n
 n
r   