
    Rj                        S r SSKJr  SSKrSSKJrJr  SSKJr  SSKrSSK	J
r
Jr  SrSrSS	 jrSS
 jrSS jrSSS jjrSSS.       SS jjrg)zEOpenAI Organization Costs API (Admin key) for monthly reconciliation.    )annotationsN)datetimetimezone)Any)load_backend_envsettingsz,https://api.openai.com/v1/organization/costsopenai_reconciliationc                     [        5         [        R                  " S5      =(       d    [        R                  =(       d    SR                  5       $ )NOPENAI_ADMIN_KEY )r   osgetenvr   openai_admin_keystrip     ZC:\Users\jesus\Desktop\proyecto_pie360\backend\app\backend\services\agents_openai_costs.py
_admin_keyr      s1    II()LX-F-FL"SSUUr   c                 (    [        [        5       5      $ N)boolr   r   r   r   openai_admin_key_configuredr      s    
r   c                    [        5       n U (       d  [        S5      eSU  3SSS.n[        R                  " S5      =(       d    [        R
                  =(       d    SR                  5       nU(       a  X!S'   [        R                  " S5      =(       d    [        R                  =(       d    SR                  5       nU(       a  X1S	'   U$ )
Nz{OPENAI_ADMIN_KEY is not configured. Create an Admin API key in https://platform.openai.com/settings/organization/admin-keyszBearer zapplication/json)AuthorizationzContent-TypeAcceptOPENAI_ORG_IDr   zOpenAI-OrganizationOPENAI_PROJECT_IDzOpenAI-Project)r   
ValueErrorr   r   r   openai_org_idr   openai_project_id)keyheadersorg_id
project_ids       r   _admin_headersr%      s    
,CK
 	

 #3%*$G
 ii(HH,B,BHbOOQF)/%&))/0TH4N4NTRT[[]J$. !Nr   c                   U c%  [         R                  " [        R                  5      n O,U R                  b  U R                  [        R                  5      n [        U R                  U R                  S5      nU R                  S:X  a  [        U R                  S-   SS5      nX4$ [        U R                  U R                  S-   S5      nX4$ )zDReturn [month_start, next_month_start) in UTC (naive UTC datetimes).      )r   nowr   utctzinfo
astimezoneyearmonth)r)   startends      r   month_bounds_utcr1   /   s    
{ll8<<(		nnX\\*SXXsyy!,E
yyBsxx!|Q* : sxxQ2:r   )r0   r$   c                   [        5       n[        U R                  [        R                  S9R                  5       5      nUSSS.nUb7  [        UR                  [        R                  S9R                  5       5      US'   U=(       d    SR                  5       =(       dM    [        R                  " S5      =(       d    [        R                  =(       d    SR                  5       =(       d    SnU(       a  S	US
'   SnSn [        U5      n	U(       a  XS'   [        R                  " [        X9SS9n
U
R                  S:w  a(  [!        SU
R                   SU
R"                  SS  35      eU
R%                  5       nUR                  S5      =(       d    /  H  nUR                  S5      =(       d    /  H  nU(       a)  UR                  S	5      nU(       a  ['        U5      U:w  a  M3  UR                  S5      =(       d    0 n['        UR                  S5      =(       d    S5      R)                  5       nU(       a  US:w  a  M  U[+        UR                  S5      =(       d    S5      -  nM     M     UR                  S5      nU(       d  OGM  [-        US5      $ )z
Sum USD costs from GET /v1/organization/costs for [start, end).

Requires OPENAI_ADMIN_KEY. Optional project filter via OPENAI_PROJECT_ID
or the project_id argument (filters results when present).
)r+   1d   )
start_timebucket_widthlimitNend_timer   r   r$   group_byg        page<   )r"   paramstimeout   zOpenAI Costs API error z: i  dataresultsamountcurrencyusdvaluer   	next_page   )r%   intreplacer   r*   	timestampr   r   r   r   r    dictrequestsget	COSTS_URLstatus_codeRuntimeErrortextjsonstrlowerfloatround)r/   r0   r$   r"   start_tsr<   filter_projecttotalpage_cursorpage_paramsresppayloadbucketresultridrA   rB   s                    r   fetch_organization_costs_usdr`   =   s#    G5===5??ABHF
  HLL!A!K!K!MNz 
	r  " 	II)*Nh.H.HNBUUW	 
 )zE"K
6l"-||IwTVWs")$*:*:);2diio=NO  ))+kk&)/R/F **Y/525! **\2Cs3x>9 H-3vzz*5>?EEGE 1vzz'27a88 6 0 kk+./ 0 ?r   )returnrR   )ra   r   )ra   zdict[str, str]r   )r)   datetime | Nonera   ztuple[datetime, datetime])r/   r   r0   rb   r$   z
str | Nonera   rT   )__doc__
__future__r   r   r   r   typingr   rK   app.backend.core.configr   r   rM   REQUEST_KIND_RECONCILIATIONr   r   r%   r1   r`   r   r   r   <module>rh      sm    K " 	 '   >:	5 V
*"  !	88 
8 	8
 8r   