Ë
    @h\/  ã                   ó  — d Z ddlZddlmZmZmZmZmZmZ ddl	Z	ddl
mZ ddlmZ ddlZ e	j                  e	j                   ¬«        e	j"                  e«      Z G d„ de«      Ze G d	„ d
«      «       Z G d„ d«      ZddlmZ  G d„ de«      Z G d„ de«      Z G d„ de«      Z G d„ d«      Z G d„ d«      Z e«       Z e«       Z ejC                   ee«      «       ejC                   ee«      «       ejC                   ee«      «       y)z×
Multi-Agent System for FarmGenius
This module implements a multi-agent system architecture that coordinates specialized agents
for crop disease detection, yield prediction, market analysis, and voice interactions.
é    N)ÚDictÚListÚAnyÚOptionalÚCallableÚUnion)ÚEnum)Ú	dataclass)Úlevelc                   ó8   — e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZy)Ú	AgentTypez)Types of specialized agents in the systemÚcoordinatorÚdisease_detectorÚyield_predictorÚmarket_analyzerÚvoice_assistantÚ
translatorÚchat_assistantÚmarket_expertÚweather_advisorÚcrop_doctorN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚCOORDINATORÚDISEASE_DETECTORÚYIELD_PREDICTORÚMARKET_ANALYZERÚVOICE_ASSISTANTÚ
TRANSLATORÚCHAT_ASSISTANTÚMARKET_EXPERTÚWEATHER_ADVISORÚCROP_DOCTOR© ó    úCC:\Users\aadil\OneDrive\Desktop\404\backend\app\core\multi_agent.pyr   r      s8   „ Ù3Ø€KØ)ÐØ'€OØ'€OØ'€OØ€JØ%€NØ#€MØ'€OØ�Kr'   r   c                   óŒ   — e Zd ZU dZeed<   eed<   eed<   eed<   dZe	eef   ed<   de	eef   fd	„Z
ed
e	eef   dd fd„«       Zy)ÚMessagez,Message object for inter-agent communicationÚsenderÚreceiverÚcontentÚmessage_typeNÚcontextÚreturnc                 ó¦   — | j                   j                  | j                  j                  | j                  | j                  | j
                  xs i dœS )zConvert message to dictionary©r+   r,   r-   r.   r/   )r+   Úvaluer,   r-   r.   r/   ©Úselfs    r(   Úto_dictzMessage.to_dict'   sD   € ð —k‘k×'Ñ'ØŸ™×+Ñ+Ø—|‘|Ø ×-Ñ-Ø—|‘|Ò) rñ
ð 	
r'   Údatac           
      óx   —  | t        |d   «      t        |d   «      |d   |d   |j                  di «      ¬«      S )zCreate message from dictionaryr+   r,   r-   r.   r/   r2   )r   Úget)Úclsr7   s     r(   Ú	from_dictzMessage.from_dict1   sG   € ñ Ü˜T (™^Ó,Ü˜t JÑ/Ó0Ø˜‘OØ˜nÑ-Ø—H‘H˜Y¨Ó+ô
ð 	
r'   )r   r   r   r   r   Ú__annotations__r   Ústrr/   r   r6   Úclassmethodr;   r&   r'   r(   r*   r*      sl   … á6ØÓØÓØƒLØÓØ"€GˆT�#�s�(‰^Ó"ð
˜˜c 3˜h™ó 
ð ð
˜T # s (™^ð 
°	ò 
ó ñ
r'   r*   c                   óH   — e Zd ZdZddeddfd„Zdedefd	„Zd
e	de
e	   fd„Zy)ÚAgentz*Base agent class with common functionalityNÚ
agent_typer   ÚAgentCoordinatorc                 ó.   — || _         || _        i | _        y ©N)rA   r   Úmessage_handlers)r5   rA   r   s      r(   Ú__init__zAgent.__init__?   s   € Ø$ˆŒØ&ˆÔØ57ˆÕr'   r.   Úhandlerc                 ó"   — || j                   |<   y)z.Register a handler for a specific message typeN)rE   )r5   r.   rG   s      r(   Úregister_handlerzAgent.register_handlerD   s   € à.5ˆ×Ñ˜lÒ+r'   Úmessager0   c              ƒ   ó   K  — |j                   | j                  v r' | j                  |j                      |«      ƒ d{  –—† S t        j                  d| j                  j
                  › d|j                   › �«       y7 Œ>­w)z9Process incoming message and optionally return a responseNúAgent z! has no handler for message type )r.   rE   ÚloggerÚwarningrA   r3   )r5   rJ   s     r(   Úhandle_messagezAgent.handle_messageH   sq   è ø€ à×Ñ 4×#8Ñ#8Ñ8ØD˜×.Ñ.¨w×/CÑ/CÑDÀWÓM×MÐMä�N‰N˜V D§O¡O×$9Ñ$9Ð#:Ð:[Ð\c×\pÑ\pÐ[qÐrÔsØð Nús   ‚;A>½A<¾?A>rD   )r   r   r   r   r   rF   r=   r   rI   r*   r   rO   r&   r'   r(   r@   r@   <   sD   „ Ù4ñ8 9ð 8Ð;Mó 8ð
6¨Sð 6¸8ó 6ð¨Gð ¸ÀÑ8Iô r'   r@   c                   ó*   ‡ — e Zd ZdZdˆ fd„	Zd„ Zˆ xZS )ÚMarketExpertAgentz,Specialized agent for market-related queriesc                 ó®   •— t         ‰| �  t        j                  |«       | j	                  d| j
                  «       t        j                  d«      | _        y ©NÚchatzgemini-1.5-pro)	ÚsuperrF   r   r#   rI   Úhandle_chatÚgenaiÚGenerativeModelÚgemini_model©r5   r   Ú	__class__s     €r(   rF   zMarketExpertAgent.__init__T   sB   ø€ Ü‰Ñœ×0Ñ0°+Ô>Ø×Ñ˜f d×&6Ñ&6Ô7Ü!×1Ñ1Ð2BÓCˆÕr'   c              ƒ   óª  K  — |j                   j                  dd«      }d}|› d|› �}	 | j                  j                  |«      }t	        |d«      r|j
                  n
t        |«      }t        | j                  |j                  |d¬	«      S # t        $ r=}t        j                  | j                  j                  › d|› �«       d|› �}Y d }~Œdd }~ww xY w­w)
NrJ   Ú zòYou are MarketExpert, an AI specialized in Indian agricultural markets. Provide accurate, up-to-date advice on prices, trends, and market strategies. Use real data if available. If the user asks about a specific crop or location, be specific.ú
User: Útextú Gemini error: z:Sorry, MarketExpert AI is temporarily unavailable. Error: Úchat_response©r+   r,   r-   r.   ©r-   r9   rY   Úgenerate_contentÚhasattrr_   r=   Ú	ExceptionrM   ÚerrorrA   r3   r*   r+   ©r5   rJ   Úuser_messageÚsystem_promptÚpromptÚgemini_responseÚresponse_textÚes           r(   rV   zMarketExpertAgent.handle_chatY   sØ   è ø€ Ø—‘×*Ñ*¨9°bÓ9ˆðkð 	ð
 "�? (¨<¨.Ð9ˆð	]Ø"×/Ñ/×@Ñ@ÀÓHˆOÜ4;¸OÈVÔ4T˜O×0Ò0ÔZ]Ð^mÓZnˆMô Ø—?‘?Ø—^‘^Ø!Ø(ô	
ð 	
øô ò 	]Ü�L‰L˜DŸO™O×1Ñ1Ð2°/À!ÀÐEÔFØXÐYZÐX[Ð\�Mûð	]üó.   ‚&C©>B
 Á'#CÂ
	CÂ3CÃCÃCÃCrD   ©r   r   r   r   rF   rV   Ú__classcell__©r[   s   @r(   rQ   rQ   R   s   ø„ Ù6õDö

r'   rQ   c                   ó*   ‡ — e Zd ZdZdˆ fd„	Zd„ Zˆ xZS )ÚWeatherAdvisorAgentz-Specialized agent for weather-related queriesc                 ó®   •— t         ‰| �  t        j                  |«       | j	                  d| j
                  «       t        j                  d«      | _        y rS   )	rU   rF   r   r$   rI   rV   rW   rX   rY   rZ   s     €r(   rF   zWeatherAdvisorAgent.__init__r   sB   ø€ Ü‰Ñœ×2Ñ2°KÔ@Ø×Ñ˜f d×&6Ñ&6Ô7Ü!×1Ñ1Ð2BÓCˆÕr'   c              ƒ   óª  K  — |j                   j                  dd«      }d}|› d|› �}	 | j                  j                  |«      }t	        |d«      r|j
                  n
t        |«      }t        | j                  |j                  |d¬	«      S # t        $ r=}t        j                  | j                  j                  › d|› �«       d|› �}Y d }~Œdd }~ww xY w­w)
NrJ   r]   zÃYou are WeatherAdvisor, an AI expert in Indian agricultural weather. Provide accurate weather forecasts, climate advice, and explain how weather impacts farming. Reference real data if available.r^   r_   r`   z<Sorry, WeatherAdvisor AI is temporarily unavailable. Error: ra   rb   rc   rh   s           r(   rV   zWeatherAdvisorAgent.handle_chatw   s×   è ø€ Ø—‘×*Ñ*¨9°bÓ9ˆð0ð 	ð
 "�? (¨<¨.Ð9ˆð	_Ø"×/Ñ/×@Ñ@ÀÓHˆOÜ4;¸OÈVÔ4T˜O×0Ò0ÔZ]Ð^mÓZnˆMô Ø—?‘?Ø—^‘^Ø!Ø(ô	
ð 	
øô ò 	_Ü�L‰L˜DŸO™O×1Ñ1Ð2°/À!ÀÐEÔFØZÐ[\ÐZ]Ð^�Mûð	_üro   rD   rp   rr   s   @r(   rt   rt   p   s   ø„ Ù7õDö

r'   rt   c                   óX   ‡ — e Zd ZdZd
ˆ fd„	Zd„ Zd
dededede	eef   de
e   f
d	„Zˆ xZS )ÚCropDoctorAgentz6Specialized agent for crop and disease-related queriesc                 ó®   •— t         ‰| �  t        j                  |«       | j	                  d| j
                  «       t        j                  d«      | _        y rS   )	rU   rF   r   r%   rI   rV   rW   rX   rY   rZ   s     €r(   rF   zCropDoctorAgent.__init__�   sB   ø€ Ü‰Ñœ×.Ñ.°Ô<Ø×Ñ˜f d×&6Ñ&6Ô7Ü!×1Ñ1Ð2BÓCˆÕr'   c              ƒ   óª  K  — |j                   j                  dd«      }d}|› d|› �}	 | j                  j                  |«      }t	        |d«      r|j
                  n
t        |«      }t        | j                  |j                  |d¬	«      S # t        $ r=}t        j                  | j                  j                  › d|› �«       d|› �}Y d }~Œdd }~ww xY w­w)
NrJ   r]   zèYou are CropDoctor, an AI expert in Indian crop health, soil, and disease management. Give actionable, specific advice for crop issues, pest management, and soil health. Reference real data and best practices for Indian agriculture.r^   r_   r`   z8Sorry, CropDoctor AI is temporarily unavailable. Error: ra   rb   rc   rh   s           r(   rV   zCropDoctorAgent.handle_chat•   sØ   è ø€ Ø—‘×*Ñ*¨9°bÓ9ˆðMð 	ð
 "�? (¨<¨.Ð9ˆð	[Ø"×/Ñ/×@Ñ@ÀÓHˆOÜ4;¸OÈVÔ4T˜O×0Ò0ÔZ]Ð^mÓZnˆMô Ø—?‘?Ø—^‘^Ø!Ø(ô	
ð 	
øô ò 	[Ü�L‰L˜DŸO™O×1Ñ1Ð2°/À!ÀÐEÔFØVÐWXÐVYÐZ�Mûð	[üro   r,   r-   r.   r/   r0   c              ƒ   óü   K  — | j                   r=t        | j                  ||||¬«      }| j                   j                  |«      ƒ d{  –—† S t        j                  d| j                  j                  › d�«       y7 Œ2­w)z-Send message to another agent via coordinatorr2   NrL   z$ has no coordinator to send messages)r   r*   rA   Úroute_messagerM   rg   r3   )r5   r,   r-   r.   r/   rJ   s         r(   Úsend_messagezCropDoctorAgent.send_message¬   sr   è ø€ à×ÒÜØ—‘Ø!ØØ)ØôˆGð ×)Ñ)×7Ñ7¸Ó@×@Ð@ä�L‰L˜6 $§/¡/×"7Ñ"7Ð!8Ð8\Ð]Ô^Øð Aús   ‚AA<ÁA:Á3A<rD   )r   r   r   r   rF   rV   r   r   r=   r   r   r*   r}   rq   rr   s   @r(   rx   rx   Ž   sZ   ø„ Ù@õDò

ñ.¨9ð ¸sð ÐRUð Ð`dÐehÐjmÐemÑ`nð ð  {Cð  DKñ  {L÷ r'   rx   c                   ór   — e Zd ZdZd„ Zdefd„Zdedee   fd„Z	dd	e
d
ededeeef   dee   f
d„Zd„ Zd„ Zy)rB   z4Central coordinator for managing agent communicationc                 óR   — i | _         t        j                  «       | _        d| _        y )NF)ÚagentsÚasyncioÚQueueÚmessage_queueÚrunningr4   s    r(   rF   zAgentCoordinator.__init__¾   s   € Ø.0ˆŒÜ$Ÿ]™]›_ˆÔØˆ�r'   Úagentc                 óœ   — | |_         || j                  |j                  <   t        j	                  d|j                  j
                  › �«       y)z&Register an agent with the coordinatorzRegistered agent: N)r   r€   rA   rM   Úinfor3   )r5   r…   s     r(   Úregister_agentzAgentCoordinator.register_agentÃ   s?   € à ˆÔØ(-ˆ�‰�E×$Ñ$Ñ%Ü�‰Ð(¨×)9Ñ)9×)?Ñ)?Ð(@ÐAÕBr'   rJ   r0   c           	   ƒ   óø  K  — |j                   | j                  vr-t        j                  d|j                   j                  › �«       y	 t        j                  d|j                  j                  › d|j                   j                  › d|j                  › d�«       | j                  |j                      j                  |«      ƒ d{  –—† S 7 Œ# t        $ r"}t        j                  d|› �«       Y d}~yd}~ww xY w­w)z(Route a message to the appropriate agentzNo agent registered for type: NzRouting message: z -> z (Ú)zError routing message: )
r,   r€   rM   rg   r3   Údebugr+   r.   rO   rf   )r5   rJ   rn   s      r(   r|   zAgentCoordinator.route_messageÉ   sÑ   è ø€ à×Ñ 4§;¡;Ñ.Ü�L‰LÐ9¸'×:JÑ:J×:PÑ:PÐ9QÐRÔSØð	Ü�L‰LÐ,¨W¯^©^×-AÑ-AÐ,BÀ$Àw×GWÑGW×G]ÑG]ÐF^Ð^`Ðah×auÑauÐ`vÐvwÐxÔyØŸ™ W×%5Ñ%5Ñ6×EÑEÀgÓN×NÐNÐNùÜò 	Ü�L‰LÐ2°1°#Ð6Ô7Üûð	üsC   ‚AC:Á	A<C ÃC
ÃC Ã	C:Ã
C Ã	C7ÃC2Ã-C:Ã2C7Ã7C:Nr+   r-   r.   r/   c              ƒ   óà   K  — g }| j                   j                  «       D ]H  \  }}||k7  sŒt        |||||¬«      }|j                  |«      ƒ d{  –—† }	|	sŒ8|j	                  |	«       ŒJ |S 7 Œ­w)z.Send a message to all agents except the senderr2   N)r€   Úitemsr*   rO   Úappend)
r5   r+   r-   r.   r/   Ú	responsesrA   r…   rJ   Úresponses
             r(   Úbroadcast_messagez"AgentCoordinator.broadcast_messageÖ   s{   è ø€ àˆ	Ø!%§¡×!2Ñ!2Ö!4ÑˆJ˜Ø˜VÓ#Ü!Ø!Ø'Ø#Ø!-Ø#ô�ð "'×!5Ñ!5°gÓ!>×>�ÚØ×$Ñ$ XÕ.ð "5ð Ðð ?ús   ‚(A.«$A.ÁA,ÁA.ÁA.c              ƒ   óD   K  — d| _         t        j                  d«       y­w)z(Start processing messages from the queueTzAgent coordinator startedN©r„   rM   r‡   r4   s    r(   ÚstartzAgentCoordinator.startç   s   è ø€ àˆŒÜ�‰Ð/Õ0ùó   ‚ c              ƒ   óD   K  — d| _         t        j                  d«       y­w)zStop the coordinatorFzAgent coordinator stoppedNr“   r4   s    r(   ÚstopzAgentCoordinator.stopì   s   è ø€ àˆŒÜ�‰Ð/Õ0ùr•   rD   )r   r   r   r   rF   r@   rˆ   r*   r   r|   r   r   r=   r   r   r‘   r”   r—   r&   r'   r(   rB   rB   »   sƒ   „ Ù>òð
C Eó Cð¨7ð °xÀÑ7Hó ñ¨ið À#ð ÐUXð ÐcgÐhkÐmpÐhpÑcqð ð  ~Bð  CJñ  ~Kó ò"1ó
1r'   rB   c                   ób   — e Zd ZdZd„ Zdedefd„Zdedee   fd„Z	dede
eef   fd„Zdefd	„Zy
)ÚModelContextProtocolz˜
    Protocol for maintaining context between agent interactions.
    This allows agents to share a common understanding of the conversation state.
    c                 ó   — i | _         y rD   ©Úcontextsr4   s    r(   rF   zModelContextProtocol.__init__÷   s	   € Ø(*ˆ�r'   Ú
context_idr7   c                 ó"   — || j                   |<   y)z"Set context data for a specific IDNr›   ©r5   r�   r7   s      r(   Úset_contextz ModelContextProtocol.set_contextú   s   € à$(ˆ�‰�jÒ!r'   r0   c                 ó8   — | j                   j                  |«      S )z"Get context data for a specific ID)rœ   r9   ©r5   r�   s     r(   Úget_contextz ModelContextProtocol.get_contextþ   s   € à�}‰}× Ñ  Ó,Ð,r'   c                 óî   — || j                   v rUt        | j                   |   t        «      r| j                   |   j                  |«       yt        j                  d|› �«       y| j                  ||«       y)z%Update existing context with new dataz Cannot update non-dict context: N)rœ   Ú
isinstanceÚdictÚupdaterM   rN   r    rŸ   s      r(   Úupdate_contextz#ModelContextProtocol.update_context  s\   € à˜Ÿ™Ñ&Ü˜$Ÿ-™-¨
Ñ3´TÔ:Ø—‘˜jÑ)×0Ñ0°Õ6ä—‘Ð!AÀ*ÀÐNÕOà×Ñ˜Z¨Õ.r'   c                 ó<   — || j                   v r| j                   |= yy)zClear context for a specific IDNr›   r¢   s     r(   Úclear_contextz"ModelContextProtocol.clear_context  s   € à˜Ÿ™Ñ&Ø—‘˜jÑ)ð 'r'   N)r   r   r   r   rF   r=   r   r    r   r£   r   r¨   rª   r&   r'   r(   r™   r™   ñ   s]   „ ñò
+ð) cð )°ó )ð- cð -¨h°s©mó -ð/¨ð /°D¸¸c¸±Nó /ð*¨ô *r'   r™   )"r   r�   Útypingr   r   r   r   r   r   ÚloggingÚenumr	   Údataclassesr
   ÚjsonÚbasicConfigÚINFOÚ	getLoggerr   rM   r   r*   r@   Úgoogle.generativeaiÚgenerativeairW   rQ   rt   rx   rB   r™   r   Úcontext_protocolrˆ   r&   r'   r(   Ú<module>r¶      s  ðñó
 ß =× =Û Ý Ý !Û ð €× Ñ ˜'Ÿ,™,Õ 'Ø	ˆ×	Ñ	˜8Ó	$€ô �ô  ð ÷
ð 
ó ð
÷:ñ õ( $ô
˜ô 
ô<
˜%ô 
ô<+�eô +÷Z41ñ 41÷l*ñ *ñB Ó €Ù'Ó)Ð ð × Ñ Ñ,¨[Ó9Ô :Ø × Ñ Ñ.¨{Ó;Ô <Ø × Ñ ™?¨;Ó7Ô 8ðr'   