
    dh                        S r SSKJrJr  SSKJrJrJrJrJr  SSK	r	SSK
Jr  SSKJrJrJrJr   " S S5      r SS	KJrJrJrJrJr  S\	R>                  S\ 4S jr! " S S\5      r"Sr# " S  S!\5      r$g! \ aF    S
\S\4   S\S\S\S\4   4S jrS\SS4S jrS\S\SS4S jrSS\" S5      4S\S\S\SS4S jjr Nwf = f)"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                   H    \ rS rSrSr\S	S j5       r\S\SS4S j5       rSr	g)
NoDiskStorage   z!Mixin to prevent storing on disk.returnNc                     [        S5      eNzDo not store on disk.AttributeErrorselfs    i/var/www/html/shao/venv/lib/python3.13/site-packages/langchain_community/utilities/passio_nutrition_ai.py__getstate__NoDiskStorage.__getstate__       455    statec                     [        S5      er   r   )r   r   s     r   __setstate__NoDiskStorage.__setstate__   r   r    r   N)
__name__
__module____qualname____firstlineno____doc__r	   r   r   r    __static_attributes__r"   r   r   r   r      s9    +
6 6 6# 6$ 6 6r   r   )retryretry_if_resultstop_after_attemptwait_exponentialwait_randomf.argskwargsr   c                     U $ Nr"   )r/   r0   r1   s      r   retry_fallbackr4   !   s	     r   nc                     g r3   r"   )r5   s    r   stop_after_attempt_fallbackr7   &       r   abc                     g r3   r"   )r9   r:   s     r   wait_random_fallbackr<   )   r8   r      inf
multiplierminmaxc                     g r3   r"   r?   r@   rA   s      r   wait_exponential_fallbackrD   ,   s     r   rspc                 D    [        U 5      =(       a    U R                  S;   $ )z&Check if a HTTP response is retryable.)i  i  i  i  i  i  i  )boolstatus_code)rE   s    r   is_http_retryablerI   2   s    9O,OOOr   c                       \ rS rSr% Sr\\   \S'   S\4S jr	\
S\4S j5       rS\4S jr\" \" \5      \" S	5      \" S
S5      \" SSSS9-   S9S\S\R,                  4S j5       rSS jrSrg)ManagedPassioLifeAuth7   z)Manage the token for the NutritionAI API._access_token_expirysubscription_keyc                 H    Xl         S U l        S U l        S U l        S U l        g r3   )rN   _last_tokenrM   _access_token_customer_idr   rN   s     r   __init__ManagedPassioLifeAuth.__init__<   s(     0$(!! r   r   c                     U R                  5       (       d  U R                  5         SU R                   3U R                  S.$ )NzBearer )Authorizationz	Passio-ID)is_valid_nowrefresh_access_tokenrQ   rR   r   s    r   headersManagedPassioLifeAuth.headersC   sA      ""%%'&t'9'9&:;**
 	
r   c                     U R                   S L=(       aL    U R                  S L=(       a7    U R                  S L=(       a"    U R                  [        R                  " 5       :  $ r3   )rQ   rR   rM   r   nowr   s    r   rX   "ManagedPassioLifeAuth.is_valid_nowL   sV    d* ;!!-;))5; ))HLLN:		
r      r   333333?r=   皙?   rC   r*   stopwaitc                 4    [         R                  " SU 35      $ )Nz;https://api.passiolife.com/v2/token-cache/napi/oauth/token/)requestsgetrS   s     r   	_http_getManagedPassioLifeAuth._http_getT   s!     ||IJZI[\
 	
r   Nc                    U R                  U R                  5      nU(       d  [        S5      eUR                  5       =U l        nUS   U l        US   U l        [        R                  " 5       [        US   S9-   [        SS9-
  U l
        g)z1Refresh the access token for the NutritionAI API.zCould not get access tokencustomer_idaccess_token
expires_in)seconds   N)ri   rN   
ValueErrorjsonrP   rR   rQ   r   r]   r   rM   )r   rE   tokens      r   rY   *ManagedPassioLifeAuth.refresh_access_token^   s    nnT2239::#&88:-5!-0">2LLNl 345"# 	!r   )rQ   rM   rR   rP   rN   r#   )r$   r%   r&   r'   r(   r   r   __annotations__strrT   propertydictrZ   rG   rX   r*   r+   rI   r,   r.   r-   rg   Responseri   rY   r)   r"   r   r   rK   rK   7   s    3"8,,! ! 
 
 

d 
 /0"C #3qcq#QQ

# 
(2C2C 




r   rK   z@https://api.passiolife.com/v2/products/napi/food/search/advancedc                   4   \ rS rSr% Sr\\S'   \" \S9r	\\S'   \" \
S9r\
\S'   \\S'   \" S	S
S9r\" \" \5      \" S5      \" SS5      \" SSSS9-   S9S\
S\R,                  4S j5       rS\S\
4S jr\" SS9\S\S\4S j5       5       rS\S\\   4S jrSr g )!NutritionAIAPIs   z(Wrapper for the Passio Nutrition AI API.nutritionai_subscription_key)defaultnutritionai_api_url)default_factorymore_kwargsauth_Tforbid)arbitrary_types_allowedextrar_   r   r`   r=   ra   rb   rC   rc   paramsr   c                 j    [         R                  " U R                  U R                  R                  US9$ )N)rZ   r   )rg   rh   r   r   rZ   )r   r   s     r   ri   NutritionAIAPI._http_get   s.     ||$$JJ&&
 	
r   search_termc                     U R                  SU0U R                  E5      nU(       d  [        S5      eUR                  5         UR	                  5       $ )z0Call the NutritionAI API and return the results.termz%Could not get NutritionAI API results)ri   r   rq   raise_for_statusrr   )r   r   rE   s      r   _api_call_results NutritionAIAPI._api_call_results   sG    nnfkFT5E5EFGDEExxzr   before)modevaluesc                 p    [        USS5      nX!S'   [        USS[        5      nX1S'   [        U5      US'   U$ )z9Validate that api key and endpoint exists in environment.r}   NUTRITIONAI_SUBSCRIPTION_KEYr   NUTRITIONAI_API_URLr   )r
   DEFAULT_NUTRITIONAI_API_URLrK   )clsr   r}   r   s       r   validate_environment#NutritionAIAPI.validate_environment   sZ     (<24R(
$ 2N-.2!!'	
 )<$%/0LMwr   queryc                 V    U R                  U5      nU(       a  [        U5      S:  a  gU$ )z4Run query through NutrtitionAI API and parse result.r=   N)r   len)r   r   resultss      r   runNutritionAIAPI.run   s(    ((/s7|a'r   r"   N)!r$   r%   r&   r'   r(   rv   ru   r   r   r   rx   r   rK   r   model_configr*   r+   rI   r,   r.   r-   rg   ry   ri   r   r   classmethodr   r   r   r   r   r)   r"   r   r   r{   r{   s   s    2"%%$-HIId3K3   $L
 /0"C #3qcq#QQ

 
):): 


S T  (#$ 3   $$ $ r   r{   )%r(   r   r   typingr   r   r   r   r	   rg   langchain_core.utilsr
   pydanticr   r   r   r   r   tenacityr*   r+   r,   r-   r.   ImportErrorr4   intr7   floatr<   rD   ry   rG   rI   rK   r   r{   r"   r   r   <module>r      s   4 ( 7 7  5 B B	6 	6 4P8,, P P
3
M 3
p G 
:Y :i  CH&)58	#s(	
s t  % D  AE%L$)49	s   A4 4A	C ?C 