§
    šŠtj½  ã                   ó–  — d Z ddlmZmZ ddlmZmZmZmZmZ ddl	Z	ddl
mZ ddlmZmZmZmZ  G d„ d¦  «        Z	 dd	lmZmZmZmZmZ nR# e$ rJ d
edef         dedededef         fd„Zdeddfd„Zdededdfd„Zdd ed¦  «        fdedededdfd„ZY nw xY wde	j        de fd„Z! G d„ de¦  «        Z"dZ# G d „ d!e¦  «        Z$dS )"z.Util that invokes the Passio Nutrition AI API.é    )ÚdatetimeÚ	timedelta)ÚAnyÚCallableÚDictÚOptionalÚfinalN)Úget_from_dict_or_env)Ú	BaseModelÚ
ConfigDictÚFieldÚmodel_validatorc                   óJ   — e Zd ZdZedd„¦   «         Zededdfd„¦   «         ZdS )ÚNoDiskStoragez!Mixin to prevent storing on disk.ÚreturnNc                 ó    — t          d¦  «        ‚©NzDo not store on disk.©ÚAttributeError©Úselfs    úo/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langchain_community/utilities/passio_nutrition_ai.pyÚ__getstate__zNoDiskStorage.__getstate__   ó   € åÐ4Ñ5Ô5Ð5ó    Ústatec                 ó    — t          d¦  «        ‚r   r   )r   r   s     r   Ú__setstate__zNoDiskStorage.__setstate__   r   r   ©r   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r	   r   r   r   © r   r   r   r      sf   € € € € € Ø+Ð+à
ð6ð 6ð 6ñ „Uð6ð ð6 #ð 6¨$ð 6ð 6ð 6ñ „Uð6ð 6ð 6r   r   )ÚretryÚretry_if_resultÚstop_after_attemptÚwait_exponentialÚwait_randomÚf.ÚargsÚkwargsr   c                 ó   — | S ©Nr$   )r*   r+   r,   s      r   Úretry_fallbackr/   !   s	   € ð ˆr   Únc                 ó   — d S r.   r$   )r0   s    r   Ústop_after_attempt_fallbackr2   &   ó   € Øˆtr   ÚaÚbc                 ó   — d S r.   r$   )r4   r5   s     r   Úwait_random_fallbackr7   )   r3   r   é   ÚinfÚ
multiplierÚminÚmaxc                 ó   — d S r.   r$   ©r:   r;   r<   s      r   Úwait_exponential_fallbackr?   ,   s	   € ð ˆtr   Úrspc                 ó2   — t          | ¦  «        o| j        dv S )z&Check if a HTTP response is retryable.)i˜  i©  i­  iô  iö  i÷  iø  )ÚboolÚstatus_code)r@   s    r   Úis_http_retryablerD   2   s   € å�‰9Œ9ÐO˜œÐ,OÐOÐOr   c            
       óþ   — e Zd ZU dZee         ed<   defd„Ze	de
fd„¦   «         Zdefd„Z e ee¦  «         ed¦  «         ed	d
¦  «         eddd¬¦  «        z   ¬¦  «        dedej        fd„¦   «         Zdd„ZdS )ÚManagedPassioLifeAuthz)Manage the token for the NutritionAI API.Ú_access_token_expiryÚsubscription_keyc                 óL   — || _         d | _        d | _        d | _        d | _        d S r.   )rH   Ú_last_tokenrG   Ú_access_tokenÚ_customer_id©r   rH   s     r   Ú__init__zManagedPassioLifeAuth.__init__<   s0   € Ø 0ˆÔØˆÔØ$(ˆÔ!Ø!ˆÔØ ˆÔÐÐr   r   c                 óv   — |                       ¦   «         s|                      ¦   «          d| j        › �| j        dœS )NzBearer )ÚAuthorizationz	Passio-ID)Úis_valid_nowÚrefresh_access_tokenrK   rL   r   s    r   ÚheaderszManagedPassioLifeAuth.headersC   sK   € à× Ò Ñ"Ô"ð 	(Ø×%Ò%Ñ'Ô'Ð'à; tÔ'9Ð;Ð;ØÔ*ð
ð 
ð 	
r   c                 óp   — | j         d uo-| j        d uo$| j        d uo| j        t          j        ¦   «         k    S r.   )rK   rL   rG   r   Únowr   s    r   rQ   z"ManagedPassioLifeAuth.is_valid_nowL   sJ   € àÔ dÐ*ð ;ØÔ!¨Ð-ð;àÔ)°Ð5ð;ð Ô)­H¬L©N¬NÒ:ð		
r   é   r   ç333333Ó?r8   çš™™™™™¹?é   r>   ©r%   ÚstopÚwaitc                 ó0   — t          j        d|› �¦  «        S )Nz;https://api.passiolife.com/v2/token-cache/napi/oauth/token/)ÚrequestsÚgetrM   s     r   Ú	_http_getzManagedPassioLifeAuth._http_getT   s$   € õ Œ|Ø\ÐJZÐ\Ð\ñ
ô 
ð 	
r   Nc                 óF  — |                       | j        ¦  «        }|st          d¦  «        ‚|                     ¦   «         x| _        }|d         | _        |d         | _        t          j        ¦   «         t          |d         ¬¦  «        z   t          d¬¦  «        z
  | _
        dS )z1Refresh the access token for the NutritionAI API.zCould not get access tokenÚcustomer_idÚaccess_tokenÚ
expires_in)Úsecondsé   N)r`   rH   Ú
ValueErrorÚjsonrJ   rL   rK   r   rU   r   rG   )r   r@   Útokens      r   rR   z*ManagedPassioLifeAuth.refresh_access_token^   sž   € à�nŠn˜TÔ2Ñ3Ô3ˆØð 	;ÝÐ9Ñ:Ô:Ð:Ø#&§8¢8¡:¤:Ð-ˆÔ˜5Ø! -Ô0ˆÔØ" >Ô2ˆÔåŒL‰NŒNÝ  lÔ 3Ð4Ñ4Ô4ñ5å Ð"Ñ"Ô"ñ#ð 	Ô!Ð!Ð!r   r   )r    r!   r"   r#   r   r   Ú__annotations__ÚstrrN   ÚpropertyÚdictrS   rB   rQ   r%   r&   rD   r'   r)   r(   r^   ÚResponser`   rR   r$   r   r   rF   rF   7   s&  € € € € € € Ø3Ð3à" 8Ô,Ð,Ð,Ñ,ð!¨ð !ð !ð !ð !ð ð
˜ð 
ð 
ð 
ñ „Xð
ð
˜dð 
ð 
ð 
ð 
ð €UØˆoÐ/Ñ0Ô0ØÐ Ñ"Ô"Øˆ[˜˜CÑ Ô Ð#3Ð#3¸qÀcÈqÐ#QÑ#QÔ#QÑQðñ ô ð

¨#ð 
°(Ô2Cð 
ð 
ð 
ñô ð

ð

ð 
ð 
ð 
ð 
ð 
r   rF   z@https://api.passiolife.com/v2/products/napi/food/search/advancedc            
       óŽ  — e Zd ZU dZeed<    ee¬¦  «        Zeed<    ee	¬¦  «        Z
e	ed<   eed<    edd	¬
¦  «        Z e ee¦  «         ed¦  «         edd¦  «         eddd¬¦  «        z   ¬¦  «        de	dej        fd„¦   «         Zdede	fd„Z ed¬¦  «        ededefd„¦   «         ¦   «         Zdedee         fd„ZdS )ÚNutritionAIAPIz(Wrapper for the Passio Nutrition AI API.Únutritionai_subscription_key)ÚdefaultÚnutritionai_api_url)Údefault_factoryÚmore_kwargsÚauth_TÚforbid)Úarbitrary_types_allowedÚextrarV   r   rW   r8   rX   rY   r>   rZ   Úparamsr   c                 óN   — t          j        | j        | j        j        |¬¦  «        S )N)rS   rz   )r^   r_   rs   rv   rS   )r   rz   s     r   r`   zNutritionAIAPI._http_get€   s.   € õ Œ|ØÔ$Ø”JÔ&Øð
ñ 
ô 
ð 	
r   Úsearch_termc                 ó°   — |                       d|i| j        ¥¦  «        }|st          d¦  «        ‚|                     ¦   «          |                     ¦   «         S )z0Call the NutritionAI API and return the results.Útermz%Could not get NutritionAI API results)r`   ru   rg   Úraise_for_statusrh   )r   r|   r@   s      r   Ú_api_call_resultsz NutritionAIAPI._api_call_resultsŒ   sX   € à�nŠn˜f kÐF°TÔ5EÐFÑGÔGˆØð 	FÝÐDÑEÔEÐEØ×ÒÑÔÐØ�xŠx‰zŒzÐr   Úbefore)ÚmodeÚvaluesc                 óŽ   — t          |dd¦  «        }||d<   t          |ddt          ¦  «        }||d<   t          |¦  «        |d<   |S )z9Validate that api key and endpoint exists in environment.rq   ÚNUTRITIONAI_SUBSCRIPTION_KEYrs   ÚNUTRITIONAI_API_URLrv   )r
   ÚDEFAULT_NUTRITIONAI_API_URLrF   )Úclsrƒ   rq   rs   s       r   Úvalidate_environmentz#NutritionAIAPI.validate_environment”   sk   € õ (<ØÐ2Ð4Rñ(
ô (
Ð$ð 2NˆÐ-Ñ.å2ØØ!Ø!Ý'ñ	
ô 
Ðð )<ˆÐ$Ñ%å/Ð0LÑMÔMˆˆw‰Øˆr   Úqueryc                 ó^   — |                       |¦  «        }|rt          |¦  «        dk     rdS |S )z4Run query through NutrtitionAI API and parse result.r8   N)r€   Úlen)r   rŠ   Úresultss      r   ÚrunzNutritionAIAPI.run¨   s7   € à×(Ò(¨Ñ/Ô/ˆØð 	•s˜7‘|”| aÒ'Ð'Ø�4Øˆr   N)r    r!   r"   r#   rk   rj   r   r‡   rs   rm   ru   rF   r   Úmodel_configr%   r&   rD   r'   r)   r(   r^   rn   r`   r€   r   Úclassmethodr   r   r‰   r   rŽ   r$   r   r   rp   rp   s   s¢  € € € € € € Ø2Ð2à"%Ð%Ð%Ñ%Ø$˜uÐ-HÐIÑIÔIÐ˜ÐIÐIÑIØ˜¨dÐ3Ñ3Ô3€K�Ð3Ð3Ñ3Ø Ð Ð Ñ à�:Ø $Øðñ ô €Lð
 €UØˆoÐ/Ñ0Ô0ØÐ Ñ"Ô"Øˆ[˜˜CÑ Ô Ð#3Ð#3¸qÀcÈqÐ#QÑ#QÔ#QÑQðñ ô ð

 ð 
¨Ô):ð 
ð 
ð 
ñô ð

ð¨Sð °Tð ð ð ð ð €_˜(Ð#Ñ#Ô#Øð¨$ð °3ð ð ð ñ „[ñ $Ô#ðð$˜ð  ¨$¤ð ð ð ð ð ð r   rp   )%r#   r   r   Útypingr   r   r   r   r	   r^   Úlangchain_core.utilsr
   Úpydanticr   r   r   r   r   Útenacityr%   r&   r'   r(   r)   ÚImportErrorr/   Úintr2   Úfloatr7   r?   rn   rB   rD   rF   r‡   rp   r$   r   r   ú<module>r˜      s›  ðØ 4Ð 4à (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ø 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7à €€€Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5Ø BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ Bð	6ð 	6ð 	6ð 	6ð 	6ñ 	6ô 	6ð 	6ððð ð ð ð ð ð ð ð ð ð ð ð ð ð øð ð ð ð ðØ�C˜�HÔðØ&)ðØ58ðà	�#�s�(Ô	ðð ð ð ð
 sð ¨tð ð ð ð ð ð ¨%ð °Dð ð ð ð ð ¨A¸E¸EÀ%¹L¼Lðð ØðØ$)ðØ49ðà	ðð ð ð ð ð ðøøøð&P˜8Ô,ð P°ð Pð Pð Pð Pð
3
ð 3
ð 3
ð 3
ð 3
˜Mñ 3
ô 3
ð 3
ðp Gð ð
:ð :ð :ð :ð :�Yñ :ô :ð :ð :ð :s   ½A ÁABÂB