
    Ng                        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    m/var/www/html/ai-engine/env/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    99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; )HLNN:		
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    nnT233 	;9:::#&88::-5!-0">2LNN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#3qcq#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    nnfkFT5EFGG 	FDEEExxzz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     (<24R(
 (
$ 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    ((// 	s7||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3K333    : $  L
 Uo/00""[C  #3#3qcq#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     AEE%LL $)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