
    1Rj                    *   S r SSKJr  SSKrSSKrSSKJr  SSKJr  SSK	J
r
  SSKJr  SSKJrJr  SS	KJr  \" S
S9 " S S5      5       rSS jrSS jr   S       SS jjrSSS jjrSS jr   S         SS jjr  S       SS jjrg)z4OpenAI client for Agents (chat and JSON extraction).    )annotationsN)Iterator)	dataclass)Any)Session)load_backend_envsettings)CustomerModelT)frozenc                  >    \ rS rSr% S\S'   S\S'   S\S'   S\S'   Srg	)
OpenAIUsage   intprompt_tokenscompletion_tokenstotal_tokensstrmodel N)__name__
__module____qualname____firstlineno____annotations____static_attributes__r       TC:\Users\jesus\Desktop\proyecto_pie360\backend\app\backend\services\agents_openai.pyr   r      s    Jr   r   c                     [        5         [        R                  " S5      =(       d    [        R                  =(       d    SR                  5       $ )NOPENAI_API_KEY )r   osgetenvr	   openai_api_keystripr   r   r   _global_openai_api_keyr%      s1    II&'H8+B+BHbOOQQr   c                >   U b  U(       a  U R                  [        R                  5      R                  [        R                  [        U5      :H  5      R                  5       nU(       a-  US   b  US   =(       d    SR                  5       OSnU(       a  U$ [        5       $ )zBPrefer the customer's key; fall back to the global OPENAI_API_KEY.r   r    )	queryr
   r#   filteridr   firstr$   r%   )dbcustomer_idrowcustomer_keys       r   resolve_openai_api_keyr/      sy    	~+HH]112VM$$K(889UW 	
 58V5GCFLb//1RL##!##r   c                t    Ub"  [        [        U5      R                  5       5      $ [        [        X5      5      $ N)boolr   r$   r/   )r+   r,   api_keys      r   openai_api_key_configuredr4   -   s3    
 CL&&())&r788r   c                    SSK Jn  U =(       d    SR                  5       =(       d
    [        5       nU(       d  [	        S5      eU" US9$ )Nr   )OpenAIr    z0OPENAI_API_KEY is not configured on the backend.)r3   )openair6   r$   r%   
ValueError)r3   r6   keys      r   _clientr:   7   s:    =b


!
=%;%=CKLL#r   c                    U c  g [        [        U SS5      =(       d    S5      n[        [        U SS5      =(       d    S5      n[        [        U SS5      =(       d    X#-   5      n[        UUUUS9$ )Nr   r   r   r   )r   r   r   r   )r   getattrr   )usager   prompt
completiontotals        r   _usage_from_responserA   @   so    }38q9FWU$7;@qAJ~q1Jf6IKE$	 r   c              #  "  #    [        U5      nU=(       d    SR                  5       =(       d    [        R                  nUR                  R
                  R                  UU SSS0S9nU H  nUbP  [        USS 5      (       a>  [        UR                  U5      nU(       a!  UR                  5         UR                  U5        UR                  (       d  Mi  UR                  S   R                  R                  =(       d    Sn	U	(       d  M  U	v   M     g 7f)Nr    Tinclude_usage)r   messagesstreamstream_optionsr=   r   )r:   r$   r	   agents_modelchatcompletionscreater<   rA   r=   clearappendchoicesdeltacontent)
rD   	usage_outr3   r   client
model_namerE   chunkparsedrN   s
             r   stream_chat_completionrU   N   s      WF+2$$&?(*?*?J[[$$++'.	 , F  WUGT%B%B)%++zBF!  (}}a &&..4"5K s   D D	Dc                   [        U5      nU=(       d    SR                  5       =(       d    [        R                  nUR                  R
                  R                  UU SS0S9nUR                  S   R                  R                  =(       d    Sn [        R                  " U5      n[        U[        5      (       d  [        S5      eU[!        UR"                  U5      4$ ! [        R                   a  n[        S5      UeS nAff = f)	Nr    typejson_object)r   rD   response_formatr   z{}z$The model did not return valid JSON.z.The model returned JSON that is not an object.)r:   r$   r	   rG   rH   rI   rJ   rM   messagerO   jsonloadsJSONDecodeErrorr8   
isinstancedictrA   r=   )	rD   r3   r   rQ   rR   responserawrT   excs	            r   json_chat_completionrc   i   s    
 WF+2$$&?(*?*?J{{&&--/ . H
 

1

%
%
-
-
5CJC fd##IJJ'
CCC	  J?@cIJs   C D2C>>D)returnr   )r+   Session | Noner,   
int | Nonerd   r   )NNN)r+   re   r,   rf   r3   
str | Nonerd   r2   r1   )r3   rg   )r=   r   r   r   rd   zOpenAIUsage | None)
rD   list[dict[str, str]]rP   zlist[OpenAIUsage] | Noner3   rg   r   rg   rd   zIterator[str])NN)rD   rh   r3   rg   r   rg   rd   z)tuple[dict[str, Any], OpenAIUsage | None])__doc__
__future__r   r[   r!   collections.abcr   dataclassesr   typingr   sqlalchemy.ormr   app.backend.core.configr   r	   app.backend.db.modelsr
   r   r%   r/   r4   r:   rA   rU   rc   r   r   r   <module>rq      s    : "  	 $ !  " > / $  R
$  "999 9 
	9  +/	"'  	
 : D"DD D /	Dr   