Ë
    @hŠ5  ã                   óP  — d Z ddlmZmZmZmZmZmZ ddlm	Z	m
Z
 ddlZddlZddlm	Z	 ddlmZmZ ddlmZmZmZmZ ddlZddlmZ ddlZddlZddlZdd	lmZmZmZm Z   e«       Z! G d
„ de«      Z" G d„ de«      Z# G d„ de"«      Z$e!jK                  d«       ed«      fdefd„«       Z&e!jK                  d«       edd¬«       edd¬«      fde'de'fd„«       Z(ddl)m*Z*m+Z+ ddl,Z,ddl-Z-e!jK                  d«       ed«       edd¬«      fdede'fd„«       Z.e!jK                  d«       ed«       edd¬«      fdede'fd „«       Z/e!jK                  d!e#d"¬#«       ed«      fd$e"fd%„«       Z0e!jK                  d&d"¬'«       ed«      fd$e$fd(„«       Z1e!je                  d)d"¬'«      d*e'fd+„«       Z3y),zˆ
Chat assistant API endpoints for FarmGenius
This module provides endpoints for interacting with the general-purpose AI chat assistant.
é    )Ú	APIRouterÚHTTPExceptionÚDependsÚBodyÚFileÚ
UploadFile)ÚStreamingResponseÚFileResponseN)r	   )Ú	BaseModelÚField)ÚOptionalÚDictÚAnyÚList)ÚgTTS)Ú	AgentTypeÚMessageÚcoordinatorÚcontext_protocolc                   óð   — e Zd ZU dZ eddd¬«      Zeed<    edd¬	«      Ze	e   ed
<    edd¬	«      Z
e	e   ed<    edd¬	«      Ze	e   ed<    edd¬	«      Ze	eeef      ed<    edd¬	«      Ze	e   ed<   y)Ú	ChatInputzModel for chat input data.é   z$User's message to the chat assistant)Ú
min_lengthÚdescriptionÚmessageNz'Session ID for continuing conversations)r   Ú
session_idÚgeminiz'Model to use (only gemini is supported)ÚmodelÚenzLanguage code (en, hi, mr)ÚlanguagezAdditional context for the chatÚcontext_dataÚgeneral_assistantz"Expert agent to handle the messageÚagent)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   ÚstrÚ__annotations__r   r   r   r    r!   r   r   r#   © ó    úEC:\Users\aadil\OneDrive\Desktop\404\backend\app\api\endpoints\chat.pyr   r      s‘   … Ù#Ù˜¨Ð8^Ô_€GˆSÓ_Ù % dÐ8aÔ b€J�˜‘ÓbÙ  Ð7`Ôa€Eˆ8�C‰=ÓaÙ# DÐ6RÔS€Hˆh�s‰mÓSÙ-2°4ÐEfÔ-g€L�(˜4  S ™>Ñ*ÓgÙ Ð!4ÐBfÔg€Eˆ8�C‰=Ôgr+   r   c                   ó4   — e Zd ZU dZeed<   eed<   dZeed<   y)ÚChatResponsezModel for chat response dataÚresponser   zgemini-1.5-proÚ
model_usedN)r$   r%   r&   r'   r(   r)   r0   r*   r+   r,   r.   r.      s   … Ù&ØƒMØƒOØ&€J�Ô&r+   r.   c                   ó   — e Zd ZdZy)ÚStreamChatInputz3Model for streaming chat input, extending ChatInputN)r$   r%   r&   r'   r*   r+   r,   r2   r2   %   s   „ Ù=Ør+   r2   z/speech-to-text.Úfilec              ƒ   ó^  K  — t        j                  «       }t        j                  dd¬«      5 }|j	                  | j                  «       ƒ d{  –—† «       |j                  «        t        j                  |j                  «      5 }|j                  |«      }	 |j                  |«      }d|icddd«       cddd«       S 7 Œq# t         j                  $ r t        dd¬«      ‚t         j                  $ r}t        d	d
|› �¬«      ‚d}~ww xY w# 1 sw Y   nxY w	 ddd«       y# 1 sw Y   yxY w­w)zf
    Convert uploaded speech audio to text using SpeechRecognition.
    Accepts WAV or MP3 files.
    Fz.wav)ÚdeleteÚsuffixNÚtexté�  zCould not understand audio.©Ústatus_codeÚdetailéô  zSTT service error: )ÚsrÚ
RecognizerÚtempfileÚNamedTemporaryFileÚwriteÚreadÚflushÚ	AudioFileÚnameÚrecordÚrecognize_googleÚUnknownValueErrorr   ÚRequestError)r3   Ú
recognizerÚ
temp_audioÚsourceÚaudior7   Úes          r,   Úspeech_to_textrO   )   sÿ   è ø€ ô —‘“€JÜ	×	$Ñ	$¨E¸&Õ	AÀZØ×Ñ˜tŸy™y›{×*Ô+Ø×ÑÔÜ�\‰\˜*Ÿ/™/Ô*¨fØ×%Ñ% fÓ-ˆEðWØ!×2Ñ2°5Ó9�Ø �~÷	 +Ð*÷ 
BÑ	AØ*ùô ×'Ñ'ò [Ü#°Ð<YÔZÐZÜ—?‘?ò WÜ#°Ð>QÐRSÐQTÐ<UÔVÐVûðWú÷ +Ð*úÐ*÷ 
B×	AÑ	Aüsj   ‚,D-®D!ÁB?
Á7D!ÂDÂCÂ,	D!Â5
D-Â?D!Ã2DÃ3DÄDÄDÄD	ÄD!Ä	D-Ä!D*Ä&D-z/text-to-speechT)Úembedr   r7   r    c              ƒ   óî   K  — 	 t        | |¬«      }t        j                  «       }|j                  |«       |j	                  d«       t        |d¬«      S # t        $ r}t        dd|› �¬«      ‚d}~ww xY w­w)	zN
    Convert text to speech audio using gTTS and return as an MP3 stream.
    )r7   Úlangr   z
audio/mpeg©Ú
media_typer<   zTTS error: r9   N)r   ÚioÚBytesIOÚwrite_to_fpÚseekr	   Ú	Exceptionr   )r7   r    ÚttsÚmp3_fprN   s        r,   Útext_to_speechr\   =   sl   è ø€ ð
GÜ˜ 8Ô,ˆÜ—‘“ˆØ�‰˜ÔØ�‰�AŒÜ  °LÔAÐAøÜò GÜ¨°kÀ!ÀÐ4EÔFÐFûðGüs)   ‚A5„AA ÁA5Á	A2ÁA-Á-A2Á2A5)ÚspeechÚtexttospeechz/sttzen-USc              ƒ   óÞ  K  — t        j                  «       }| j                  «       ƒ d{  –—† }t        j                  |¬«      }t        j                  t         j                  j
                  j                  |dd¬«      }|j                  ||¬«      }dj                  |j                  D �cg c]  }|j                  d   j                  ‘Œ c}«      }|st        d	d
¬«      ‚d|iS 7 Œ»c c}w ­w)z]
    Accepts an audio file and returns the transcript using Google Cloud Speech-to-Text.
    N©Úcontentr   T©ÚencodingÚlanguage_codeÚaudio_channel_countÚenable_automatic_punctuation©ÚconfigrM   Ú r   r8   úCould not transcribe audio.r9   Ú
transcript)r]   ÚSpeechClientrB   ÚRecognitionAudioÚRecognitionConfigÚAudioEncodingÚLINEAR16Ú	recognizeÚjoinÚresultsÚalternativesrk   r   )	r3   r    ÚclientÚaudio_contentrM   rh   r/   Úresultrk   s	            r,   Ústtrx   O   sÖ   è ø€ ô
 × Ñ Ó"€FØŸ)™)›+×%€MÜ×#Ñ#¨MÔ:€EÜ×%Ñ%Ü×)Ñ)×7Ñ7×@Ñ@ØØØ%)ô	€Fð ×Ñ v°UÐÓ;€HØ—‘È8×K[ÒK[Ó\ÑK[À˜6×.Ñ.¨qÑ1×<Ó<ÐK[Ñ\Ó]€JÙÜ¨Ð4QÔRÐRØ˜*Ð%Ð%ð &úò ]ùs"   ‚(C-ªC&«BC-Â, C(ÃC-Ã(C-z/speech-chatc              ƒ   óÒ  K  — t        j                  «       }| j                  «       ƒ d{  –—† }t        j                  |¬«      }t        j                  t         j                  j
                  j                  |dd¬«      }|j                  ||¬«      }dj                  |j                  D �cg c]  }|j                  d   j                  ‘Œ c}«      }|st        d	d
¬«      ‚t        ||¬«      }	t        |	«      ƒ d{  –—† }
|
j                  }t!        j"                  «       }t!        j$                  |¬«      }t!        j&                  |t         j(                  j*                  ¬«      }t!        j,                  t         j
                  j.                  ¬«      }|j1                  |||¬«      }t3        j4                  |j6                  «      j9                  d«      }|||dœS 7 �Œ³c c}w 7 Œç­w)z›
    Accepts an audio file, transcribes it with Google Cloud STT, sends to chat AI, and returns the response as audio and text using Google Cloud TTS.
    Nr`   r   Trb   rg   ri   r   r8   rj   r9   )r   r    )r7   )rd   Ússml_gender)Úaudio_encoding)ÚinputÚvoiceÚaudio_configzutf-8)Úuser_transcriptÚai_textÚai_audio_base64)r]   rl   rB   rm   rn   ro   rp   rq   rr   rs   rt   rk   r   r   Úchat_messager/   r^   ÚTextToSpeechClientÚSynthesisInputÚVoiceSelectionParamsÚSsmlVoiceGenderÚNEUTRALÚAudioConfigÚMP3Úsynthesize_speechÚbase64Ú	b64encoderv   Údecode)r3   r    Ú
client_sttrv   rM   rh   r/   rw   r7   Ú
chat_inputÚchat_responser€   Ú
tts_clientÚsynthesis_inputr}   r~   Útts_responseÚaudio_base64s                     r,   Úspeech_chatr•   c   s¦  è ø€ ô
 ×$Ñ$Ó&€JØŸ)™)›+×%€MÜ×#Ñ#¨MÔ:€EÜ×%Ñ%Ü×)Ñ)×7Ñ7×@Ñ@ØØØ%)ô	€Fð ×#Ñ#¨6¸Ð#Ó?€HØ�8‰8ÀX×EUÒEUÓVÑEU¸6�V×(Ñ(¨Ñ+×6Ó6ÐEUÑVÓW€DÙÜ¨Ð4QÔRÐRä 4°(Ô;€JÜ& zÓ2×2€MØ×$Ñ$€Gô ×0Ñ0Ó2€JÜ"×1Ñ1°wÔ?€OÜ×-Ñ-ØÜ ×0Ñ0×8Ñ8ô€Eô  ×+Ñ+¼<×;UÑ;U×;YÑ;YÔZ€LØ×/Ñ/Ø U¸ð 0ó €Lô ×#Ñ# L×$>Ñ$>Ó?×FÑFÀwÓO€LàØØ'ñð ð; &ûò Wð
 3ús/   ‚(G'ªG«BG'Â, G Ã1G'Ã=G%Ã>C G'Ç G'z/messageéÈ   )Úresponse_modelr:   r�   c              ƒ   ó€  K  — 	 | j                   xs t        t        j                  «       «      }t	        j
                  || j                  | j                  dœ| j                  xs i ¥«       t        j                  t        j                  t        j                  t        j                  dœ}|j                  | j                  xs dt        j                  «      }t        j                  dt        j                  dt        j                  dt        j                  di}|j                  ||t        j                     «      }t!        j"                  t%        t        j&                  || j                  | j(                  |dœd	|| j                  d
œ¬«      «      ƒ d{  –—† }t+        |j,                  t        «      r|j,                  n|j,                  j                  dd«      }t/        ||| j(                  ¬«      S 7 Œ^# t0        $ r}|‚d}~wt2        $ r,}	t5        d|	› �«       t1        ddt        |	«      › �¬«      ‚d}	~	ww xY w­w)zŠ
    Send a message to the AI chat assistant and get a response.
    This endpoint handles regular (non-streaming) chat interactions.
    ©r    Úlast_message)r"   Úmarket_expertÚweather_advisorÚcrop_doctorr"   zGYou are FarmGenius, your general agriculture AI assistant across India.zrYou are MarketExpert: Provide expert analysis and advice on agricultural markets, prices, and trends across India.zuYou are WeatherAdvisor: Provide expert advice on weather patterns, forecasts, and climate impact on farming in India.zmYou are CropDoctor: Provide expert advice on crop diseases, soil, and crop management for Indian agriculture.)r   r   Úsystem_promptÚchat)r   r    ©ÚsenderÚreceiverra   Úmessage_typeÚcontextNr/   z(No response))r/   r   r0   z,Unexpected error in /chat/message endpoint: r<   ú#An internal server error occurred: r9   )r   r(   ÚuuidÚuuid4r   Úset_contextr    r   r!   r   ÚCHAT_ASSISTANTÚMARKET_EXPERTÚWEATHER_ADVISORÚCROP_DOCTORÚgetr#   r   Úroute_messager   ÚCOORDINATORr   Ú
isinstancera   r.   r   rY   Úprint)
r�   r   Ú	agent_mapÚselected_agentÚsystem_promptsrž   r   Úresponse_textÚhttp_excrN   s
             r,   r‚   r‚   ’   s  è ø€ ð8dà×*Ñ*Ò?¬c´$·*±*³,Ó.?ˆ
ô 	×$Ñ$ ZØ"×+Ñ+Ø&×.Ñ.ñ2
ð ×&Ñ&Ò,¨"ð2
ô 	ô "+×!9Ñ!9Ü&×4Ñ4Ü(×8Ñ8Ü$×0Ñ0ñ	
ˆ	ð #Ÿ™ z×'7Ñ'7Ò'NÐ;NÔPY×PhÑPhÓiˆô ×$Ñ$Ð&oÜ×#Ñ#ð  &ZÜ×%Ñ%ð  (_Ü×!Ñ!ð  $Sð	
ˆð '×*Ñ*¨>¸>Ì)×JbÑJbÑ;cÓdˆô $×1Ñ1ÜÜ ×,Ñ,Ø'à)×1Ñ1Ø'×-Ñ-Ø%2ñð
 $à",Ø *× 3Ñ 3ñôó
÷ 
ˆô  ,6°g·o±oÄsÔ+K˜ŸšÐQX×Q`ÑQ`×QdÑQdÐeoð  rAó  RBˆÜ ]¸zÐV`×VfÑVfÔgÐgð#
ùô( ò àˆûÜò däÐ<¸Q¸CÐ@ÔAÜ¨Ð6YÔZ]Ð^_ÓZ`ÐYaÐ4bÔcÐcûðdüsH   ‚H>„FG8 ÆG6ÆAG8 Ç5H>Ç6G8 Ç8	H;ÈHÈH;È'H6È6H;È;H>z/stream)r:   c           
   ƒ   ó  ‡K  — 	 | j                   xs t        t        j                  «       «      }t	        j
                  || j                  | j                  dœ| j                  xs i ¥«       t        j                  t        t        j                  t        j                  | j                  | j                  dœdd|i¬«      «      ƒ d{  –—† }|rd|j                   v r-|r|j                   j#                  dd«      nd	}t%        d
|¬«      ‚|j                   j#                  dd«      Šˆfd„}t'         |«       d¬«      S 7 Œt# t$        $ r}|‚d}~wt(        $ r,}t+        d|› �«       t%        ddt        |«      › �¬«      ‚d}~ww xY w­w)a!  
    Stream a chat response from the AI assistant.
    This endpoint provides a streaming response for a more interactive experience.
    
    Note: This is a simplified implementation. In a production environment,
    you would implement actual streaming with the Gemini or Groq API.
    r™   )r   r   rŸ   r   r    NÚerrorz%Unknown error processing chat messagezNo response from chat agenti÷  r9   r/   z&Sorry, I couldn't generate a response.c                 óÖ   •K  — t        ‰«      } t        d| dz  «      }t        d| |«      D ]8  }t        ||z   | «      }‰|| }|­–— t	        j
                  d«      ƒ d {  –—†  Œ: y 7 Œ­w)Né   é   r   gš™™™™™©?)ÚlenÚmaxÚrangeÚminÚasyncioÚsleep)Útotal_lengthÚ
chunk_sizeÚiÚendÚchunkrµ   s        €r,   Úfake_stream_generatorz*stream_chat.<locals>.fake_stream_generatorü   ss   øè ø€ ä˜}Ó-ˆLÜ˜Q °Ñ 2Ó3ˆJô ˜1˜l¨JÖ7�Ü˜!˜j™.¨,Ó7�Ø% a¨Ð,�ð “ô —m‘m DÓ)×)Ñ)ñ 8ð *ús   ƒAA)ÁA'Á A)zapplication/x-ndjsonrS   z+Unexpected error in /chat/stream endpoint: r<   r¥   )r   r(   r¦   r§   r   r¨   r    r   r!   r   r®   r   r   r¯   r©   r   ra   r­   r   r	   rY   r±   )r�   r   r   r¸   rÇ   r¶   rN   rµ   s          @r,   Ústream_chatrÈ   Ò   sƒ  øè ø€ ð<dà×*Ñ*Ò?¬c´$·*±*³,Ó.?ˆ
ô 	×$Ñ$ ZØ"×+Ñ+Ø&×.Ñ.ñ2
ð ×&Ñ&Ò,¨"ð2
ô 	ô $×1Ñ1ÜÜ ×,Ñ,Ü"×1Ñ1à)×1Ñ1Ø'×-Ñ-ñð $Ø% zÐ2ô	ó
÷ 
ˆñ ˜' W§_¡_Ñ4Ù]d�G—O‘O×'Ñ'¨Ð1XÔYð  kHˆEÜ¨C¸Ô>Ð>ð  Ÿ™×+Ñ+¨JÐ8`Óaˆô	*ô  !Ù!Ó#Ø-ô
ð 	
ðK
ùôT ò àˆûÜò däÐ;¸A¸3Ð?Ô@Ü¨Ð6YÔZ]Ð^_ÓZ`ÐYaÐ4bÔcÐcûðdüsH   ƒF…CD? ÃD=Ã	A3D? Ä<FÄ=D? Ä?	FÅE
Å
FÅ'E=Å=FÆFz/history/{session_id}r   c           
   ƒ   ó  K  — 	 d| › �}t        j                  |«      }|s| g dœS g }|D ]ž  }|j                  d«      }t        |t        «      r3ddlm}m} |j                  ||j                  ¬«      j                  «       }|j                  |d   › dt        |t        «      rt        t	        |«      «      n|› �|d   |d	   |d
œ«       Œ  | |dœS # t        $ r,}t        d|› �«       t        ddt        |«      › �¬«      ‚d}~ww xY w­w)z‚
    Get the chat history for a specific session.
    This is useful for continuing conversations or displaying chat history.
    Úchat_history_)r   ÚmessagesÚ	timestampr   )ÚdatetimeÚtimezone)ÚtzÚroleÚ-ra   )ÚidrÐ   ra   rÌ   zError retrieving chat history: r<   r9   N)r   Úget_contextr­   r°   ÚfloatrÍ   rÎ   ÚfromtimestampÚutcÚ	isoformatÚappendÚintrY   r±   r   r(   )	r   Úchat_history_keyÚchat_historyrË   ÚitemrÌ   rÍ   rÎ   rN   s	            r,   Úget_chat_historyrÝ     s  è ø€ ð`Ø*¨:¨,Ð7ÐÜ'×3Ñ3Ð4DÓEˆáØ",¸"Ñ=Ð=ð ˆÛ ˆDØŸ™ Ó-ˆIÜ˜)¤UÔ+ç7Ø$×2Ñ2°9ÀÇÁÐ2ÓN×XÑXÓZ�	à�O‰OØ˜f™˜ aÄÈIÔW\ÔA]¬¬E°)Ó,<Ô(=ÐclÐ'mÐnØ˜V™Ø 	™?Ø&ñ	õ ð !ð )°hÑ?Ð?øäò `ÜÐ/°¨sÐ3Ô4Ü¨Ð6UÔVYÐZ[ÓV\ÐU]Ð4^Ô_Ð_ûð`üs3   ‚D„ C ¤D¥B)C ÃDÃ	DÃ'C?Ã?DÄD)4r'   Úfastapir   r   r   r   r   r   Úfastapi.responsesr	   r
   rU   r?   Úpydanticr   r   Útypingr   r   r   r   Úspeech_recognitionr=   Úgttsr   r¦   rÀ   ÚjsonÚapp.core.multi_agentr   r   r   r   Úrouterr   r.   r2   ÚpostrO   r(   r\   Úgoogle.cloudr]   r^   r‹   Úosrx   r•   r‚   rÈ   r­   rÝ   r*   r+   r,   Ú<module>rê      sø  ðñ÷ N× Mß =Û 	Û Ý /ß %ß ,Ó ,Û Ý Û Û Û ç RÓ Rá	‹€ôh�	ô hô'�9ô 'ô	�iô 	ð ‡�ÐÓÙ,0°«Iñ W˜zò Wó  ðWð& ‡�ÐÓÙ%)¨#°TÔ%:ÉDÐQUÐ]aÔLbñ G˜sð GÀcò Gó  ðG÷ .Û Û 	à‡�ˆVÓÙ!% c£¹DÀÐPTÔ<Uñ &�Jð &°cò &ó ð&ð& ‡�ˆ^ÓÙ)-¨c«ÁDÈÐX\ÔD]ñ &˜Jð &¸cò &ó ð&ð\ ‡�ˆZ¨À#€ÓFÙ/3°C«yñ =d 9ò =dó Gð=dð~ ‡�ˆY C€Ó(Ù48¸³Iñ Dd /ò Ddó )ðDdðL ‡�Ð#°€Ó5ð ` sò  `ó 6ñ `r+   