Ë
    _|ïiÝ  ã                   ó<  — U d Z ddlZddlZddlmZmZmZ ddlZddlm	Z	 ddl
mZ ddlmZ daeej                     ed<   dZd	ej                  fd
„Z	 	 ddededededededededee   dee	   d	efd„Z	 	 ddededededededededee   dee	   d	eeef   fd„Zy)u†   
AI analysis service â€” wraps the Anthropic Claude API.
Builds an agronomic prompt from scenario data and returns a structured dict.
é    N)ÚAnyÚDictÚOptional)ÚGraftCombination)ÚPlant)ÚSoilProfileÚ_clientzclaude-sonnet-4-6Úreturnc                  ól   — t         €)t        j                  t        j                  d«      ¬«      a t         S )NÚANTHROPIC_API_KEY)Úapi_key)r	   Ú	anthropicÚ	AnthropicÚosÚgetenv© ó    úD/var/www/acinvestment.org/public_html/aci/backend/app/services/ai.pyÚ_get_clientr      s&   € ä€Ü×%Ñ%¬b¯i©iÐ8KÓ.LÔMˆÜ€Nr   ÚsoilÚ	applied_nÚ	applied_pÚ	applied_kÚirrigation_methodÚirrigation_frequency_daysÚseasonÚduration_daysÚplantÚgraftc
                 ó®  — g }
|	��|	j                   }|	j                  }|
dd|j                  › d|j                  › d�d|j                  › d|j
                  › d|j                  › d|j                  › d	�	d
|j                  j                  › d|j                  › d|j                  › �dt        j                  |j                  «      › �dt        j                  |j                  «      › �d|j                   › d�d|j                  › d|j                  › d�d|j                  › d|j
                  › d|j                  › d|j                  › d	�	d|j                  › d|j                  › �d|j"                  › d|j                   › d�dt        j                  |j                  «      › �d|	j$                  d›d�d|	j&                  › d|	j(                  › d�dt        j                  |	j*                  «      › �gz  }
|	j,                  �r!|
j/                  d|	j,                  › �«       �n|}|
dd|j                  › d|j                  › d|j0                  j                  › �d |j                  › d|j
                  › d|j                  › d|j                  › d	�	d!|j                  › d|j                  › �d"|j                  j                  › �d#|j"                  › d|j                   › d�d$t        j                  |j                  «      › �d%t        j                  |j                  «      › �gz  }
|
d&d'd| j                  › d(| j2                  j                  › d)| j4                  › �d*| j6                  › d+| j8                  › d,| j:                  › d-�d.| j<                  j                  › d/| j>                  j                  › �d0| j@                  › d1| jB                  › d2| jD                  › �d3| jF                  › d4| jH                  › d5�gz  }
| jJ                  r|
j/                  d6| jJ                  › �«       |
d&d7d8|› d1|› d2|› �d9|› d:|› d;�d<|› �d=|› d�gz  }
|
g d>¢z  }
d?jM                  |
«      S )@Nz## Graft Combinationz- Rootstock: z (ú)z  - Drought tolerance: z/10  |  Salinity: z/10  |  Heat: z/10  |  Cold: z/10z  - Root depth: z  |  pH range: u   â€“z  - Disease resistance: z   - Nutrient uptake efficiency: z  - Growth cycle: z daysz	- Scion: z  - pH range: z  - Yield potential: z kg/plant  |  Growth cycle: z- Graft compatibility score: z.2fz/1.0z- Vigor boost: zx  |  Yield modifier: Úxz- Stress tolerance overrides: z	- Notes: z## Plant (Ungrafted)z- Name: z)  |  Type: z- Drought tolerance: z- pH range: z- Root depth: z- Yield potential: z- Disease resistance: z- Nutrient uptake efficiency: Ú z## Soil Profilez  |  Type: z  |  Climate zone: z- pH: z  |  Organic matter: z%  |  Salinity: z dS/mz- Drainage: z  |  Water retention: z- Native NPK (ppm): N=z  P=z  K=z- Temperature range: u   Â°C â€“ u   Â°Cz- Description: z## Care Protocolz- Applied NPK (kg/ha): N=z- Irrigation: z every z day(s)z
- Season: z- Simulation duration: )r#   z## TaskzXYou are an expert agronomist specialising in grafting, soil science, and crop modelling.zCBased on the scenario above, provide a rigorous agronomic analysis.uY   Return ONLY a valid JSON object with this exact structure â€” no markdown, no commentary:r#   uÌ  {
  "predicted_yield": <float, kg per plant for the full duration>,
  "survival_probability": <float, 0.0â€“1.0>,
  "risk_factors": [<string>, ...],
  "recommended_adjustments": {
    "nitrogen": <float, optimal kg/ha>,
    "phosphorus": <float, optimal kg/ha>,
    "potassium": <float, optimal kg/ha>,
    "irrigation_notes": "<string>",
    "additional_notes": "<string>"
  },
  "growth_timeline": [
    {"week": <int>, "stage": "<string>", "expected_height_cm": <float>, "notes": "<string>"},
    ...
  ],
  "confidence_score": <float, 0.0â€“1.0>,
  "ai_analysis": "<agronomic reasoning, 2â€“3 paragraphs covering: graft/plant performance, soil compatibility, stress risks, NPK analysis, and overall prognosis>"
}ú
)'Ú	rootstockÚscionÚnameÚspeciesÚdrought_toleranceÚsalinity_toleranceÚheat_toleranceÚcold_toleranceÚroot_depth_categoryÚvalueÚoptimal_ph_minÚoptimal_ph_maxÚjsonÚdumpsÚdisease_resistanceÚnutrient_uptake_efficiencyÚgrowth_cycle_daysÚyield_potential_kg_per_plantÚcompatibility_scoreÚvigor_boostÚyield_modifierÚstress_tolerance_overrideÚnotesÚappendÚvariety_typeÚ	soil_typeÚclimate_zoneÚph_levelÚorganic_matter_percentÚsalinity_levelÚdrainage_rateÚwater_retentionÚnative_nitrogenÚnative_phosphorusÚnative_potassiumÚtemperature_range_minÚtemperature_range_maxÚdescriptionÚjoin)r   r   r   r   r   r   r   r   r   r   ÚlinesÚrsÚscÚps                 r   Ú_build_promptrP      s4  € ð €Eð ÑØ�_‰_ˆØ�[‰[ˆØØ"Ø˜BŸG™G˜9 B r§z¡z l°!Ð4Ø% b×&:Ñ&:Ð%;Ð;MÈb×NcÑNcÐMdÐdrÐsu÷  tEñ  tEð  sFð  FTð  UW÷  Ufñ  Ufð  Tgð  gjð  kØ˜r×5Ñ5×;Ñ;Ð<¸OÈB×L]ÑL]ÐK^Ð^aÐbd×bsÑbsÐatÐuØ&¤t§z¡z°"×2GÑ2GÓ'HÐ&IÐJØ.¬t¯z©z¸"×:WÑ:WÓ/XÐ.YÐZØ  ×!5Ñ!5Ð 6°eÐ<Ø˜Ÿ™�y  2§:¡: ,¨aÐ0Ø% b×&:Ñ&:Ð%;Ð;MÈb×NcÑNcÐMdÐdrÐsu÷  tEñ  tEð  sFð  FTð  UW÷  Ufñ  Ufð  Tgð  gjð  kØ˜R×.Ñ.Ð/¨s°2×3DÑ3DÐ2EÐFØ# B×$CÑ$CÐ#DÐD`Ðac×auÑauÐ`vÐv{Ð|Ø&¤t§z¡z°"×2GÑ2GÓ'HÐ&IÐJØ+¨E×,EÑ,EÀcÐ+JÈ$ÐOØ˜e×/Ñ/Ð0Ð0FÀu×G[ÑG[ÐF\Ð\]Ð^Ø,¬T¯Z©Z¸×8WÑ8WÓ-XÐ,YÐZð
ñ 	
ˆð" �;‹;Ø�L‰L˜9 U§[¡[ MÐ2Ö3àˆØØ"Ø�q—v‘v�h˜b §¡ ¨<¸¿¹×8LÑ8LÐ7MÐNØ# A×$7Ñ$7Ð#8Ð8JÈ1×K_ÑK_ÐJ`Ð`nÐop×oÑoð  oAð  AOð  PQ÷  P`ñ  P`ð  Oað  adð  eØ˜1×+Ñ+Ð,¨C°×0@Ñ0@Ð/AÐBØ˜Q×2Ñ2×8Ñ8Ð9Ð:Ø! !×"@Ñ"@Ð!AÐA]Ð^_×^qÑ^qÐ]rÐrwÐxØ$¤T§Z¡Z°×0DÑ0DÓ%EÐ$FÐGØ,¬T¯Z©Z¸×8TÑ8TÓ-UÐ,VÐWð	
ñ 		
ˆð 
Ø
ØØ
�4—9‘9�+˜[¨¯©×)=Ñ)=Ð(>Ð>QÐRV×RcÑRcÐQdÐeØ
�—‘�Ð4°T×5PÑ5PÐ4QÐQaÐbf×buÑbuÐavÐv{Ð|Ø
�t×)Ñ)×/Ñ/Ð0Ð0FÀt×G[ÑG[×GaÑGaÐFbÐcØ
  ×!5Ñ!5Ð 6°d¸4×;QÑ;QÐ:RÐRVÐW[×WlÑWlÐVmÐnØ
 × :Ñ :Ð;¸8ÀD×D^ÑD^ÐC_Ð_bÐcðñ €Eð ×ÒØ�‰� t×'7Ñ'7Ð&8Ð9Ô:ð 
Ø
ØØ
# I ;¨d°9°+¸TÀ)ÀÐMØ
Ð*Ð+¨7Ð3LÐ2MÈWÐUØ
�V�HÐØ
! - °Ð6ðñ €Eð 
ò ñ €Eð6 �9‰9�UÓÐr   c
                 óœ  — t        | |||||||||	¬«
      }
t        «       }|j                  j                  t        ddd|
dœg¬«      }|j
                  d   j                  j                  «       }|j                  d«      r:|j                  d«      d	   }|j                  d
«      r|dd }|j                  «       }t        j                  |«      S )z,Call Claude and return parsed analysis dict.)
r   r   r   r   r   r   r   r   r   r   i   u€   You are an expert agronomist and plant scientist. You always respond with valid JSON only â€” no markdown fences, no extra text.Úuser)ÚroleÚcontent)ÚmodelÚ
max_tokensÚsystemÚmessagesr   z```é   r1   é   N)rP   r   rX   ÚcreateÚMODELrT   ÚtextÚstripÚ
startswithÚsplitr1   Úloads)r   r   r   r   r   r   r   r   r   r   ÚpromptÚclientÚmessageÚraws                 r   Úrun_analysisrf   ƒ   s×   € ô ØØØØØ+Ø";ØØ#ØØô€Fô ‹]€FØ�o‰o×$Ñ$ÜØð]ð "¨fÑ5Ð6ð %ó €Gð �/‰/˜!Ñ
×
!Ñ
!×
'Ñ
'Ó
)€Cð ‡~�~�eÔØ�i‰i˜Ó˜qÑ!ˆØ�>‰>˜&Ô!Ø�a�b�'ˆCØ�i‰i‹kˆä�:‰:�c‹?Ðr   )NN)Ú__doc__r1   r   Útypingr   r   r   r   Úapp.models.graft_combinationr   Úapp.models.plantr   Úapp.models.soil_profiler   r	   r   Ú__annotations__r\   r   ÚfloatÚstrÚintrP   rf   r   r   r   ú<module>rp      sg  ðòó Û 	ß &Ñ &ã å 9Ý "Ý /à)-€ˆ�)×%Ñ%Ñ	&Ó -à€ð�Y×(Ñ(ó ð  "Ø(,ñeØ
ðeàðeð ðeð ð	eð
 ðeð  #ðeð ðeð ðeð �E‰?ðeð Ð$Ñ%ðeð 	óeðb "Ø(,ñ.Ø
ð.àð.ð ð.ð ð	.ð
 ð.ð  #ð.ð ð.ð ð.ð �E‰?ð.ð Ð$Ñ%ð.ð 
ˆ#ˆsˆ(�^ô.r   