o
    i>                     @   s0  d dl Z d dlZd dlZd dlZd dlmZ d dlmZ d dlm	Z	m
Z
mZmZmZmZmZmZ d dlmZmZ d dlmZ d dlmZ d dlmZ ed	Zed
 dZG dd de	Ze
 Zed ed ed ed defddZee_ej dddefddZ!e"dkre#e dS dS )    N)load_dotenv)rtc)AgentAgentServerAgentSession
JobContext
JobProcesscli	inferenceroom_io)noise_cancellationsilero)
elevenlabs)MultilingualModel)loggeragentz
.env.locala  You are a helpful voice AI assistant. The user is interacting with you via voice, even if you perceive the conversation as text.
You eagerly assist users with their questions by providing information from your extensive knowledge.
Your responses are concise, to the point, and without any complex formatting or punctuation including emojis, asterisks, or other symbols.
You are curious, friendly, and have a sense of humor.c                       s,   e Zd ZddedB ddf fddZ  ZS )	AssistantNinstructionsreturnc                    s   t  j|ptd d S )Nr   )super__init__DEFAULT_INSTRUCTIONS)selfr   	__class__ R/var/www/html/vikas/2025-Nov-21-Voicebot/BackEnd/agent-starter-python/src/agent.pyr   #   s   
zAssistant.__init__N)__name__
__module____qualname__strr   __classcell__r   r   r   r   r   "   s    $r   z<============================================================zAGENT SERVER INITIALIZEDz$Agent is ready to accept connectionsprocc                 C   s(   t d tj | jd< t d d S )NzPrewarming agent process...vadz#Prewarm complete - VAD model loaded)r   infor   VADloaduserdata)r$   r   r   r   prewarmB   s   
r*   default)
agent_namectxc                    s6  d| j ji| _i }tdt| j  tdt| jdr"| jjnd  td| j  td| j j	 d t| jdrk| jjrkzt
| jj}td	|  W n t
jyj   td
| jj  Y nw |s| j j	rzt
| j j	}td|  W n t
jy   td| j j	  Y nw d}|std |  I d H  d}dd l}|dI d H  | j j D ]U}td|j d|j	 d |j	rzt
|j	}|}td|  W  n. t
jy   td|j	  Y q ty } ztd|  W Y d }~qd }~ww q|r|dnd }|r%|ddnd}|r0|ddnd}	|r;|ddnd}
|rF|ddnd}|rQ|d dnd}|r\|d!d"nd"}|rf|d#nd }td$d%  td& td$d%  td'|rd(nd)  td*|  td+|	  td,|
  td-|  td.|  td/|  td0|pd  td$d%  td1| j j  ztj| j j|pt||	|
d2}td3|  W n# ty } ztd4|  dd l}|  W Y d }~nd }~ww d d d d d td5p%td6}|s.td7 d8|i}|r9||d9< ||d:}|rE||d9< |rL||d;< ttj d_i |t!j"|
d<tj#d_i |t$ | j%j&d= dd>}td? td@t'|  d`dAdB |(dC fdDdE}|(dF fdGdH}|(dI fdJdK}|(dL fdMdN}|(dO fdPdQ}tdR z|j)t*|dS| j t+j,t+j-dTdU dVdWdXI d H  W n ty } zt.dY|  d }~ww |stdZ |  I d H  ntd[ td\ d]d^ }| /| d S )aNroomzJob object attributes: zJob request metadata: agent_metadatazN/AzJob request (full): zRaw room metadata: ''zUsing agent dispatch metadata: z(Failed to parse agent metadata as JSON: zUsing room metadata: z'Failed to parse room metadata as JSON: FzBNo metadata found yet, connecting to room to check participants...Tr   g      ?zChecking participant: z, metadata: 'u    ✓ Using participant metadata: z.Failed to parse participant metadata as JSON: z$Error parsing participant metadata: agent_instructionsagent_voiceEXAVITQu4vr4xnSDxMaLagent_languageenagent_llm_modelzopenai/gpt-4.1-miniagent_stt_modelr+   agent_stt_language_codeagent_tts_modeleleven_turbo_v2_5agent_tts_encoding=<   z(STARTING AGENT WITH CUSTOM CONFIGURATIONz  - Instructions: CUSTOMDEFAULTz  - Voice ID: z  - Language: z  - LLM Model: z  - STT model: z  - STT language: z  - TTS model: z  - TTS encoding: z.About to start conversation logging for room: )	room_namer   voice_idlanguage	llm_modelu"   ✓ Started conversation logging: z%ERROR starting conversation logging: ELEVENLABS_API_KEYELEVEN_API_KEYuZ   ELEVENLABS_API_KEY (or ELEVEN_API_KEY) not set – STT/TTS will fail. Set it in .env.locallanguage_codeapi_key)rA   modelencoding)rH   r%   )sttllmttsturn_detectionr%   preemptive_generationz/Registering conversation logging event handlerszSession object type: c                 S   s:   | d u r|S t | |rt| |S t| tr| ||S |S r   )hasattrgetattr
isinstancedictget)evkeyr+   r   r   r   _ev   s   


zmy_agent.<locals>._evuser_input_transcribedc                    s    | dpd} | dpd}t d| d| |rBt|d  t d ur9 d }t d|d	d
 d t d d S d S )N
transcript is_finalFz([EVENT] user_input_transcribed is_final=z transcript=  z,[LATENCY] User turn (speaking + STT final): .0f mszE[LATENCY] user_speech_committed at T+0 (reference for LLM/TTS timing))r   r&   conversation_loggerlog_user_messagetime)rT   rX   rZ   user_turn_ms)rV   t_user_commituser_message_startr   r   on_user_input_transcribed   s   z+my_agent.<locals>.on_user_input_transcribedconversation_item_addedc           	         s^   | d}|d u rd S t |dr |dnt|tr|dnd }t |dr+ |dnt|tr6|dg ng }|d u r>g }d}|rgt|trI|n|g}|D ]}t|dd }|r\||7 }qN|sgt|d d }|dkrt t	d|d d	 d
 d ur d }t	d|dd t
|d  d S |dkrt	d|d d	 d
 d S d S )NitemrolecontentrY   text   	assistantz4[EVENT] conversation_item_added role=assistant text=P   z...r[   z/[LATENCY] LLM (user_commit -> agent_response): r\   r]   userz/[EVENT] conversation_item_added role=user text=)rO   rQ   rR   rS   listrP   r"   r`   r   r&   r^   log_bot_message)	rT   rf   rg   rh   ri   partsparttllm_ms)rV   bot_message_startt_agent_responserb   r   r   on_conversation_item_added   s8   
,.z,my_agent.<locals>.on_conversation_item_addedspeech_createdc                    s   t    | dpd}td|  d ur) d }td|dd d ur? d }td|dd d S d S )	Nsource?z[EVENT] speech_created source=r[   z3[LATENCY] End-to-end (user_commit -> first audio): r\   r]   z/[LATENCY] TTS (agent_response -> first audio): )r`   r   r&   )rT   rx   e2e_mstts_ms)rV   rt   ru   t_agent_speakrb   r   r   on_speech_created  s   z#my_agent.<locals>.on_speech_createdagent_state_changedc                    sN    | d} | d}t d| d|  |dkr#|dkr%t d S d S d S )N	old_state	new_statez[EVENT] agent_state_changed z -> speakingr   r&   r`   )rT   old_snew_s)rV   rt   r   r   on_agent_state_changed"  s   

z(my_agent.<locals>.on_agent_state_changeduser_state_changedc                    s<    | dp	 | d}t d|  |dkrt d S d S )Nr   statez![EVENT] user_state_changed state=r   r   )rT   r   )rV   rc   r   r   on_user_state_changed,  s
   z'my_agent.<locals>.on_user_state_changedz&Event handlers registered successfullyr   c                 S   s    | j jtjjkrt S t S r   )participantkindr   ParticipantKindPARTICIPANT_KIND_SIPr   BVCTelephonyBVC)paramsr   r   r   <lambda>O  s   zmy_agent.<locals>.<lambda>)r   )audio_input)r   r.   room_optionsz`Failed to start voice session (check ELEVENLABS_API_KEY, OPENAI_API_KEY / LiveKit Inference): %szConnecting to room...z-Already connected to room from metadata checkz7Agent is in the room and listening. User can say hello.c                     s(   t d t } t d|   d S )Nz*Session ending, saving conversation log...zConversation log saved to: )r   r&   r^   end_session)log_filer   r   r   cleanupc  s   
zmy_agent.<locals>.cleanupr   r   )0r.   namelog_context_fieldsr   r&   dirjobrO   r/   metadatajsonloadsJSONDecodeErrorwarningconnectasynciosleepremote_participantsvaluesidentity	ExceptionrS   r^   start_sessionr   error	traceback	print_excosgetenvr   r   STTr
   LLMTTSr   r$   r)   typeonstartr   r   RoomOptionsAudioInputOptions	exceptionadd_shutdown_callback)r-   metadata_dictconnected_earlyr   r   participant_metaecustom_instructionscustom_voicecustom_languagecustom_llm_modelcustom_stt_modelcustom_stt_language_codecustom_tts_modelcustom_tts_encoding
session_idr   elevenlabs_key
stt_kwargs
tts_kwargssessionrd   rv   r}   r   r   r   r   )rV   rt   ru   r|   rb   rc   r   my_agentL   s  $







	



r   __main__)$r   loggingr`   r   dotenvr   livekitr   livekit.agentsr   r   r   r   r   r	   r
   r   livekit.pluginsr   r   r   *livekit.plugins.turn_detector.multilingualr   r^   r   	getLoggerr   r   serverr&   r*   	setup_fncrtc_sessionr   r   run_appr   r   r   r   <module>   s:    (






  !