o
    z­j�]  ã                   @   s6  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
Z
ddlZddlmZ ddlmZmZ ddlZddlmZmZmZmZmZ ddlmZmZmZmZmZ ddlmZmZ dd	l m!Z! e!ƒ Z"e	j#e	j$d
� e	 %e&¡Z'G dd„ deƒZ(G dd„ deƒZ)G dd„ deƒZ*G dd„ deƒZ+G dd„ deƒZ,dd„ Z-dS )zx
Specialized agents for the CropPilot multi-agent system.
Each agent is responsible for a specific domain of expertise.
é    N)ÚDictÚListÚAnyÚOptionalÚCallableÚUnion)ÚImage)ÚdatetimeÚ	timedelta)ÚAgentÚ	AgentTypeÚMessageÚcoordinatorÚcontext_protocol)Úget_disease_predictionÚget_yield_estimateÚprocess_voice_command_aiÚget_market_summary_aiÚrun_gemini_text_prompt)Úget_all_pricesÚget_scraper)Úget_settings)Úlevelc                       óL   e Zd ZdZ‡ fdd„Zdedee fdd„Zdedee fdd	„Z‡  Z	S )
ÚDiseaseDetectorAgentz8Agent specializing in crop disease detection from imagesc                    s.   t ƒ  tj¡ |  d| j¡ |  d| j¡ d S )NÚanalyze_imageÚget_treatment)ÚsuperÚ__init__r   ÚDISEASE_DETECTORÚregister_handlerÚhandle_analyze_imageÚhandle_get_treatment©Úself©Ú	__class__© ú2/var/www/html/CropPilot/backend/app/core/agents.pyr   #   s   zDiseaseDetectorAgent.__init__ÚmessageÚreturnc              
   Ã   sä   �zE|j  d¡}|st| j|jddidd�W S t|ƒI dH }| d¡s8|jr,|j d¡nd}|r8t 	|d|i¡ t| j|jd	|id
|jd�W S  t
yq } zt d|› �¡ t| j|jddt|ƒ› �idd�W  Y d}~S d}~ww )z%Analyze image to detect crop diseasesÚimage_bytesÚerrorzNo image data provided©ÚsenderÚreceiverÚcontentÚmessage_typeNzError:Ú
session_idÚlast_disease_detectionÚresultÚanalysis_result©r.   r/   r0   r1   ÚcontextzError in disease detection: zError analyzing image: )r0   Úgetr   Ú
agent_typer.   r   Ú
startswithr7   r   Úupdate_contextÚ	ExceptionÚloggerr,   Ústr)r$   r)   r+   r4   Ú
context_idÚer'   r'   r(   r!   (   sD   €ü
ÿûü€þz)DiseaseDetectorAgent.handle_analyze_imagec              
   Ã   sî   �|j  d¡}|j  dd¡}|jr|j d¡nd}d}|r*t |¡}|r*| dd¡}z!d|› d	|› d
�}t|ƒI dH }|}	t| j|jd|	id|jd�W S  t	yv }
 zt
 d|
› �¡ t| j|jddt|
ƒ› �idd�W  Y d}
~
S d}
~
ww )z2Get treatment recommendations for detected diseaseÚdisease_nameÚ	crop_typeúunknown cropr2   NÚenÚlanguagez7Provide organic and conventional treatment options for z in zk. 
            Include locally available options common in Maharashtra, India. Keep it brief and practical.Ú	treatmentÚtreatment_recommendationr6   z(Error getting treatment recommendation: r,   r-   )r0   r8   r7   r   Úget_contextr   r   r9   r.   r<   r=   r,   r>   )r$   r)   rA   rB   r?   rE   r7   Úpromptr4   rF   r@   r'   r'   r(   r"   V   s<   €
ûü€þz)DiseaseDetectorAgent.handle_get_treatment)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r!   r"   Ú__classcell__r'   r'   r%   r(   r       s
    .r   c                       ó6   e Zd ZdZ‡ fdd„Zdedee fdd„Z‡  ZS )ÚYieldPredictorAgentz,Agent specializing in crop yield predictionsc                    s    t ƒ  tj¡ |  d| j¡ d S )NÚpredict_yield)r   r   r   ÚYIELD_PREDICTORr    Úhandle_predict_yieldr#   r%   r'   r(   r   �   s   zYieldPredictorAgent.__init__r)   r*   c              
   Ã   sæ   �zF|j  d¡}|st| j|jddidd�W S t|ƒI dH }|jr'|j d¡nd}|r9t |d|j	|j
|dœi¡ t| j|jd	|id
|jd�W S  tyr } zt d|› �¡ t| j|jddt|ƒ› �idd�W  Y d}~S d}~ww )z+Generate yield prediction from farmer inputÚyield_inputr,   zNo yield input data providedr-   Nr2   Úlast_yield_prediction)ÚcropÚareaÚ
predictionr4   Úprediction_resultr6   zError in yield prediction: zError making yield prediction: )r0   r8   r   r9   r.   r   r7   r   r;   rB   Ú	area_sizer<   r=   r,   r>   )r$   r)   rT   r4   r?   r@   r'   r'   r(   rS   …   sJ   €üýÿûü€þz(YieldPredictorAgent.handle_predict_yield)	rJ   rK   rL   rM   r   r   r   rS   rN   r'   r'   r%   r(   rP   ~   s    rP   c                       sb   e Zd ZdZ‡ fdd„Zdedee fdd„Zdedee fdd	„Zdedee fd
d„Z	‡  Z
S )ÚMarketAnalyzerAgentz=Agent specializing in market data analysis and price trackingc                    sH   t ƒ  tj¡ |  d| j¡ |  d| j¡ |  d| j¡ d | _g | _	d S )NÚ
get_pricesÚanalyze_trendsÚget_summary)
r   r   r   ÚMARKET_ANALYZERr    Úhandle_get_pricesÚhandle_analyze_trendsÚhandle_get_summaryÚlast_updateÚcached_pricesr#   r%   r'   r(   r   ´   s   
zMarketAnalyzerAgent.__init__r)   r*   c           	   
   Ã   s   �zc|j  d¡}|j  dd¡}|j  dd¡}|r'tdƒ}|j||d�I dH }n| jr,|r:tƒ I dH | _t ¡  ¡ | _	| j}|j
rF|j
 d	¡nd}|rVt |d
|||dœi¡ t| j|jd|id|j
d�W S  ty� } zt d|› �¡ t| j|jddt|ƒ› �idd�W  Y d}~S d}~ww )z#Get current market prices for cropsrV   ÚlocationÚBaramatiÚforce_refreshFÚ	agmarknet)ÚdistrictNr2   Úlast_market_query)rV   re   Úpricesrk   Ú
price_datar6   zError getting market prices: r,   r-   )r0   r8   r   r\   rd   r   ÚasyncioÚget_event_loopÚtimerc   r7   r   r;   r   r9   r.   r<   r=   r,   r>   )	r$   r)   rV   re   rg   Úscraperrk   r?   r@   r'   r'   r(   r`   ¼   sL   €
ýÿûü€þz%MarketAnalyzerAgent.handle_get_pricesc                 Ã   sÒ  �z¶|j  dd¡}t d|› �¡ t ¡ }g }t dd¡}tdddƒD ]-}|t	|d	�  
d
¡}t dd¡}|d| dd|    }	t|	dƒ}	| ||	dœ¡ |	}q#|d d }
|d d }||
 |
 d }|dkrtd|› d|d›d�}n|dk rƒd|› d|d›d�}n
d|› d|d›d�}|jr–|j d¡nd}|r¨t |d|› �||d œi¡ t| j|j||d!œd"|jd#�W S  tyè } z%t d$|› d%|› �¡ t| j|jd&d'|› d%t|ƒ› �id&d(�W  Y d}~S d}~ww ))z4Analyze market trends for specific crops (Simulated)rV   rC   z)Generating simulated trend analysis for: iÜ  iˆ  é   r   éÿÿÿÿ)Údaysz%Y-%m-%dgš™™™™™©¿gìQ¸…ë±?é   gü©ñÒMbP?é   )ÚdateÚpricerw   éd   é   zPrices for zC have shown a noticeable upward trend over the past month (approx. z.1fz% increase).éûÿÿÿzE have shown a noticeable downward trend over the past month (approx. z% decrease).z@ have remained relatively stable over the past month (change of z%).r2   NÚtrend_analysis_)ÚsummaryÚhistorical_data)r)   r}   Útrend_analysis_resultr6   z&Error generating simulated trends for z: r,   zError analyzing trends for r-   )r0   r8   r=   Úinfor	   ÚnowÚrandomÚrandintÚranger
   ÚstrftimeÚuniformÚroundÚappendr7   r   r;   r   r9   r.   r<   r,   r>   )r$   r)   rV   ÚtodayÚhistorical_pricesÚ
base_priceÚirv   Úprice_fluctuationrw   Ústart_priceÚ	end_priceÚtrend_percentageÚtrend_summaryr?   r@   r'   r'   r(   ra   í   sb   €
þÿþøü€þz)MarketAnalyzerAgent.handle_analyze_trendsc              
   Ã   sª   �z(| j stƒ I dH | _ t ¡  ¡ | _t| j ƒI dH }t| j|j	d|id|j
d�W S  tyT } zt d|› �¡ t| j|j	ddt|ƒ› �idd�W  Y d}~S d}~ww )z*Get a summary of current market conditionsNr|   Úmarket_summaryr6   zError getting market summary: r,   r-   )rd   r   rm   rn   ro   rc   r   r   r9   r.   r7   r<   r=   r,   r>   )r$   r)   r|   r@   r'   r'   r(   rb   +  s.   €ûü€þz&MarketAnalyzerAgent.handle_get_summary)rJ   rK   rL   rM   r   r   r   r`   ra   rb   rN   r'   r'   r%   r(   r[   ±   s    1>r[   c                       r   )
ÚVoiceAssistantAgentz?Agent specializing in voice interaction and language processingc                    s<   t ƒ  tj¡ |  d| j¡ |  d| j¡ ddddœ| _d S )NÚprocess_commandÚtext_to_speechÚEnglishÚHindiÚMarathi©rD   ÚhiÚmr)r   r   r   ÚVOICE_ASSISTANTr    Úhandle_process_commandÚhandle_text_to_speechÚ	languagesr#   r%   r'   r(   r   J  s   ýzVoiceAssistantAgent.__init__r)   r*   c              
   ƒ   s:  �zï|j  d¡‰ ˆ st| j|jddidd�W S |jr |j d¡nd}d}|r3t |¡}|r3| dd¡}tˆ |ƒI dH }d	}d}t	‡ fd
d„dD ƒƒrPd}t
j}n‹t	‡ fdd„dD ƒƒrad}t
j}nzt	‡ fdd„dD ƒƒrÛd}t
j}g d¢}t‡ fdd„|D ƒdƒ}	|	rÛ|t
jkrÛ| jt
jd|	id|jd�I dH }
|
rÛ|
j  dg ¡}|rÛg }|D ])}d|v r½| |d › d|d › d�¡ q§d|v rÐ| |d › d|d › d�¡ q§|rÛdd |¡› �}t| j|j|||rç|jnddœd |jd!�W S  t�y } zt d"|› �¡ t| j|jdd"t|ƒ› �idd�W  Y d}~S d}~ww )#z!Process voice command transcriptsÚ
transcriptr,   zNo transcript providedr-   r2   NrD   rE   Fc                 3   ó   � | ]	}|ˆ   ¡ v V  qd S ©N©Úlower©Ú.0Úword©rŸ   r'   r(   Ú	<genexpr>u  ó   € z=VoiceAssistantAgent.handle_process_command.<locals>.<genexpr>)ÚdiseaseÚ	infectionÚspotsÚleafÚanalyzeTc                 3   r    r¡   r¢   r¤   r§   r'   r(   r¨   {  r©   )ÚyieldÚharvestÚ
productionzhow muchc                 3   r    r¡   r¢   r¤   r§   r'   r(   r¨   €  r©   )rw   ÚmarketÚsellÚcostÚmandi)ÚwheatÚonionÚsoybeanÚ	sugarcaneÚriceÚcottonc                 3   s    � | ]}|ˆ   ¡ v r|V  qd S r¡   r¢   )r¥   rV   r§   r'   r(   r¨   ˆ  s   € rV   r\   )r/   r0   r1   r7   rk   Úprice_per_quintalz is z rupees per quintalÚprice_per_tonnez rupees per tonnezHere are the current prices: z, )ÚresponseÚshould_routeÚtarget_agentÚvoice_responser6   z Error processing voice command: )r0   r8   r   r9   r.   r7   r   rH   r   Úanyr   r   rR   r_   ÚnextÚsend_messager‡   ÚjoinÚvaluer<   r=   r,   r>   )r$   r)   r?   rE   r7   r4   r¿   rÀ   Úcommon_cropsrV   Úmarket_responserk   Úprice_textsrw   r@   r'   r§   r(   rœ   V  sŠ   €ü
ü €ý÷ü€þz*VoiceAssistantAgent.handle_process_commandc              	   Ã   sŽ   �|j  d¡}|st| j|jddidd�S |jr|j d¡nd}d}|r1t |¡}|r1| dd¡}t| j|jd	d
| j |d¡› �id|jd�S )z3Generate text-to-speech audio (mock implementation)Útextr,   z%No text provided for speech synthesisr-   r2   NrD   rE   r)   z.Text-to-speech synthesis would happen here in r•   Útts_responser6   )	r0   r8   r   r9   r.   r7   r   rH   rž   )r$   r)   rÊ   r?   rE   r7   r'   r'   r(   r�   ¶  s.   €ü
ÿùz)VoiceAssistantAgent.handle_text_to_speech)
rJ   rK   rL   rM   r   r   r   rœ   r�   rN   r'   r'   r%   r(   r’   G  s
    `r’   c                       rO   )ÚTranslatorAgentzCAgent specializing in language translation for multilingual supportc                    s.   t ƒ  tj¡ |  d| j¡ ddddœ| _d S )NÚ	translater•   r–   r—   r˜   )r   r   r   Ú
TRANSLATORr    Úhandle_translaterž   r#   r%   r'   r(   r   Ù  s   ýzTranslatorAgent.__init__r)   r*   c              
   Ã   s†  �z–|j  d¡}|j  dd¡}|j  d¡}|s$t| j|jddidd�W S || jvr9t| j|jdd|› �idd�W S z2| j |d	¡}| j |d
¡}d|› d|› d|› �}t|ƒI dH }|}	t| j|jd|	id|jd�W W S  ty— }
 z t	 
d|
› �¡ t| j|jddt|
ƒ› �idd�W  Y d}
~
W S d}
~
ww  tyÂ }
 zt	 
d|
› �¡ t| j|jddt|
ƒ› �idd�W  Y d}
~
S d}
~
ww )z Translate text between languagesrÊ   Útarget_languagerD   Úsource_languager,   z No text provided for translationr-   zUnsupported target language: zthe source languager•   z"Translate the following text from z to zu.
                Only return the translated text, nothing else.
                
                Text to translate: NÚtranslated_textÚtranslation_resultr6   zError in translation: )r0   r8   r   r9   r.   rž   r   r7   r<   r=   r,   r>   )r$   r)   rÊ   rÐ   rÑ   Úsource_lang_nameÚtarget_lang_namerI   r4   rÒ   r@   r'   r'   r(   rÏ   ä  sl   €ü
üý
ûü€þ	ü€þz TranslatorAgent.handle_translate)	rJ   rK   rL   rM   r   r   r   rÏ   rN   r'   r'   r%   r(   rÌ   Ö  s    rÌ   c                  C   sT   t ƒ } t | ¡ tƒ }t |¡ tƒ }t |¡ tƒ }t |¡ tƒ }t |¡ tS )z.Initialize and register all specialized agents)r   r   Úregister_agentrP   r[   r’   rÌ   )Údisease_agentÚyield_agentÚmarket_agentÚvoice_agentÚtranslator_agentr'   r'   r(   Úinit_agents%  s   




rÜ   ).rM   rm   Útypingr   r   r   r   r   r   ÚloggingÚjsonÚioÚPILr   r	   r
   r�   Úapp.core.multi_agentr   r   r   r   r   Úapp.core.ai_servicesr   r   r   r   r   Úapp.services.market_scraperr   r   Úapp.core.configr   ÚsettingsÚbasicConfigÚINFOÚ	getLoggerrJ   r=   r   rP   r[   r’   rÌ   rÜ   r'   r'   r'   r(   Ú<module>   s0     
^3  O