
    h                     x   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 de	j>                  de fdZ! G d de      Z"dZ# G d  d!e      Z$y# e$ rA 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 pw xY w)"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                   <    e Zd ZdZedd       Zededdfd       Zy)NoDiskStoragez!Mixin to prevent storing on disk.returnNc                     t        d      NzDo not store on disk.AttributeErrorselfs    o/var/www/html/eduruby.in/venv/lib/python3.12/site-packages/langchain_community/utilities/passio_nutrition_ai.py__getstate__zNoDiskStorage.__getstate__       4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      s9    +
6 6 6# 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                      y r.   r$   )r0   s    r   stop_after_attempt_fallbackr2   &       r   abc                      y r.   r$   )r4   r5   s     r   wait_random_fallbackr7   )   r3   r      inf
multiplierminmaxc                      y r.   r$   r:   r;   r<   s      r   wait_exponential_fallbackr?   ,   s     r   rspc                 8    t        |       xr | 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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y)ManagedPassioLifeAuthz)Manage the token for the NutritionAI API._access_token_expirysubscription_keyc                 J    || _         d | _        d | _        d | _        d | _        y r.   )rH   _last_tokenrG   _access_token_customer_idr   rH   s     r   __init__zManagedPassioLifeAuth.__init__<   s*     0$(!! r   r   c                 z    | j                         s| j                          d| j                   | j                  dS )NzBearer )Authorizationz	Passio-ID)is_valid_nowrefresh_access_tokenrK   rL   r   s    r   headerszManagedPassioLifeAuth.headersC   s>      "%%'&t'9'9&:;**
 	
r   c                     | j                   d uxrA | j                  d uxr1 | j                  d uxr! | j                  t        j                         kD  S r.   )rK   rL   rG   r   nowr   s    r   rQ   z"ManagedPassioLifeAuth.is_valid_nowL   sV    d* ;!!-;))5; ))HLLN:		
r      r   333333?r8   皙?   r>   r%   stopwaitc                 2    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!     ||IJZI[\
 	
r   Nc                    | j                  | j                        }|st        d      |j                         x| _        }|d   | _        |d   | _        t        j                         t        |d         z   t        d      z
  | _
        y)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239::#&88:-5!-0">2LLNl 3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"8,,! ! 
 
 

d 
 /0"C #3qcq#QQ

# 
(2C2C 




r   rF   z@https://api.passiolife.com/v2/products/napi/food/search/advancedc            
       H   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y)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.     ||$$JJ&&
 	
r   search_termc                     | j                  d|i| j                        }|st        d      |j                          |j	                         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   sG    nnfkFT5E5EFGDEExxzr   before)modevaluesc                 t    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   s^     (<24R(
$ 2N-.2!!'	
 )<$%/0LMwr   queryc                 J    | j                  |      }|rt        |      dk  ry|S )z4Run query through NutrtitionAI API and parse result.r8   N)r   len)r   r   resultss      r   runzNutritionAIAPI.run   s(    ((/s7|a'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"%%$-HIId3K3   $L
 /0"C #3qcq#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 ( 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   A3 3AB98B9