Ë
    uPêj-6  ã                   óP  — U d Z ddlZddlZddlZddlZddlZddlZddlZddlm	Z	m
Z
mZ ddlmZmZmZmZmZmZ ddlZddlZddlmZmZmZmZ ddlmZmZmZ ddlmZ ddlmZ  ddlm!Z! dd	l"m#Z# erdd
l$m%Z% ddl&Z&ddl'm(Z( ddl)m*Z* ddl+m,Z,m-Z-m.Z. de/de0e1df   fd„Z2 e2e«      Z3ee0e1df      e4d<    e2e«      Z5ee0e1df      e4d<    G d„ de*«      Z6dejn                  ejp                  z  de9e1ef   de9e1ef   fd„Z:dZ;ee1   e4d<   dejx                  de=fd„Z>de1de?defd„Z@de1defd„ZAd ede
e   fd!„ZBd ede	e   fd"„ZCdejx                  dee1eDf   d#e=de0ejŠ                  ee
e   z  e	e   z  f   fd$„ZF G d%„ d&«      ZG G d'„ d(e«      ZH	 	 	 d-d)e1dz  d*e1dz  d+e1dz  deHfd,„ZIy).z3
Common helpers / utils across al OpenAI endpoints
é    N)ÚAsyncIteratorÚIteratorÚMapping)ÚTYPE_CHECKINGÚAnyÚFinalÚLiteralÚ
NamedTupleÚOptional)ÚAsyncAzureOpenAIÚAsyncOpenAIÚAzureOpenAIÚOpenAI)ÚChatCompletionÚChatCompletionChunkÚChatCompletionMessage)ÚChoice)ÚChoiceDelta)ÚCompletionUsage)ÚClientSession)Útoken_counter)ÚBaseLLMException)Ú_DEFAULT_TTL_FOR_HTTPX_CLIENTSÚAsyncHTTPHandlerÚget_ssl_configurationÚclsÚreturn.c                 ót   — t        d„ t        j                  | j                  «      j                  D «       «      S )zAExtract __init__ parameter names (excluding 'self') from a class.c              3   ó,   K  — | ]  }|d k7  sŒ	|–— Œ y­w)ÚselfN© )Ú.0Úps     úe/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/llms/openai/common_utils.pyú	<genexpr>z*_get_client_init_params.<locals>.<genexpr>'   s   è ø€ ÒV�qÈ!ÈvË+”ÑVùs   ‚
�)ÚtupleÚinspectÚ	signatureÚ__init__Ú
parameters)r   s    r$   Ú_get_client_init_paramsr+   %   s(   € äÑVœG×-Ñ-¨c¯l©lÓ;×FÑFÔVÓVÐVó    Ú_OPENAI_INIT_PARAMSÚ_AZURE_OPENAI_INIT_PARAMSc                   óœ   ‡ — e Zd Z	 	 	 	 d	dededej                  dz  dej                  dz  deej                  z  dz  dedz  fˆ fd„Z
ˆ xZS )
ÚOpenAIErrorNÚstatus_codeÚmessageÚrequestÚresponseÚheadersÚbodyc                 óV  •— || _         || _        || _        |r|| _        nt	        j
                  dd¬«      | _        |r|| _        n&t	        j                  || j                  ¬«      | _        t        ‰| �%  || j                  | j                  | j                  | j                  |¬«       y )NÚPOSTúhttps://api.openai.com/v1)ÚmethodÚurl)r1   r3   )r1   r2   r5   r3   r4   r6   )
r1   r2   r5   r3   ÚhttpxÚRequestr4   ÚResponseÚsuperr)   )r    r1   r2   r3   r4   r5   r6   Ú	__class__s          €r$   r)   zOpenAIError.__init__/   sŒ   ø€ ð 'ˆÔØˆŒØˆŒÙØ"ˆD�Lä Ÿ=™=°Ð<WÔXˆDŒLÙØ$ˆD�Mä!ŸN™N°{ÈDÏLÉLÔYˆDŒMÜ‰ÑØ#Ø—L‘LØ—L‘LØ—L‘LØ—]‘]Øð 	õ 	
r,   )NNNN)Ú__name__Ú
__module__Ú__qualname__ÚintÚstrr<   r=   r>   ÚdictÚHeadersr)   Ú__classcell__)r@   s   @r$   r0   r0   .   sy   ø„ ð
 )-Ø*.Ø/3Ø ñ
àð
ð ð
ð —‘ Ñ%ð	
ð
 —.‘. 4Ñ'ð
ð ˜Ÿ™Ñ%¨Ñ,ð
ð �T‰k÷
ñ 
r,   r0   ÚeÚdatac                 ób  — g }t        | t        j                  «      r/| j                  j	                  «       }|j                  di «      }|}n| j                  }|��	t        |t        «      rù|j                  d«      rè|j                  di «      }t        |t        «      r	 t	        j                  |«      }|j                  d«      }t        |t        «      r�t        |«      dkD  r�t        |d   t        «      rn|D ]i  }|j                  d«      sŒt        |j                  d«      t        «      sŒ5t        |j                  d«      «      dk(  sŒS|j                  |d   d   «       Œk |j                  «       D �	�
ci c]  \  }	}
|	|vsŒ|	|
“Œ }}	}
|S # t        j                  $ r d|i}Y Œów xY wc c}
}	w )a{  
    Helper function to read OpenAI UnprocessableEntityError and drop the params that raised an error from the error message.

    Args:
    e (UnprocessableEntityError): The UnprocessableEntityError exception
    data (Dict[str, Any]): The original data dictionary containing all parameters

    Returns:
    Dict[str, Any]: A new dictionary with invalid parameters removed
    Úerrorr2   Údetailr   Úlocé   é   )Ú
isinstancer<   ÚHTTPStatusErrorr4   ÚjsonÚgetr6   rF   rE   ÚloadsÚJSONDecodeErrorÚlistÚlenÚappendÚitems)rI   rJ   Úinvalid_paramsÚ
error_jsonÚerror_messageÚ
error_bodyr2   rM   Ú
error_dictÚkÚvÚnew_datas               r$   Ú+drop_params_from_unprocessable_entity_errorrc   O   st  € ð (*€NÜ�!”U×*Ñ*Ô+ØŸJ™JŸO™OÓ-ˆ
Ø)Ÿ~™~¨g°rÓ:ˆØ"‰
à—V‘Vˆ
ØÑ¤*¨Z¼Ô">À:Ç>Á>ÐR[ÔC\Ø—.‘. ¨BÓ/ˆÜ�gœsÔ#ð.ÜŸ*™* WÓ-�ð  Ÿ™ HÓ-ˆä�fœdÔ#¬¨F«°aª¼JÀvÈaÁyÔRVÔ<WØ$ò @�
à—N‘N 5Õ)Ü" :§>¡>°%Ó#8¼$Õ?Ü˜JŸN™N¨5Ó1Ó2°aÓ7à"×)Ñ)¨*°UÑ*;¸AÑ*>Õ?ð@ð )-¯
©
«×P¡  1¸ÀÒ8O�q˜!‘tÐP€HÑPà€Oøô ×'Ñ'ò .Ø# WÐ-’ð.üó Qs   ÂF Å7F+ÆF+ÆF(Æ'F(zQcould not finish the message because max_tokens or model output limit was reachedÚ _OUTPUT_TOKEN_LIMIT_ERROR_MARKERc                 óB   — t         | j                  j                  «       v S )aR  
    True when OpenAI/Azure rejected a chat request because the output budget could not fit a single visible token.

    GPT-5.x turns that case into a 400 while returning a length-truncated 200 for marginally larger budgets, so the
    match has to stay pinned to the full provider sentence to avoid swallowing genuine bad requests.
    )rd   r2   Úlower)rI   s    r$   Úis_output_token_limit_errorrg   €   s   € ô ,¨q¯y©y¯©Ó/@Ð@Ð@r,   ÚmodelÚprompt_tokensc                 óÌ   — t        dt        j                  «       › �t        ddt	        dd¬«      ¬«      ft        t        j                  «       «      | dt        d||¬	«      ¬
«      S )Nú	chatcmpl-r   ÚlengthÚ	assistantÚ ©ÚroleÚcontent)ÚindexÚfinish_reasonr2   zchat.completion)Úcompletion_tokensri   Útotal_tokens)ÚidÚchoicesÚcreatedrh   ÚobjectÚusage)r   ÚuuidÚuuid4r   r   rD   Útimer   )rh   ri   s     r$   Ú_output_token_limit_completionr~   Š   s_   € ÜØ”t—z‘z“|�nÐ%äØØ&Ü-°;ÈÔKôð
ô ”D—I‘I“KÓ ØØ Ü°ÀÐ]jÔkôð r,   c                 ó²   — t        dt        j                  «       › �t        ddt	        dd¬«      ¬«      ft        t        j                  «       «      | d¬	«      S )
Nrk   r   rl   rm   rn   ro   )rr   rs   Údeltazchat.completion.chunk)rv   rw   rx   rh   ry   )r   r{   r|   ÚChunkChoicer   rD   r}   )rh   s    r$   Ú_output_token_limit_chunkr‚   ›   sR   € ÜØ”t—z‘z“|�nÐ%äØØ&Ü! {¸BÔ?ôð
ô ”D—I‘I“KÓ ØØ&ôð r,   Úchunkc              #   ó   K  — | –— y ­w©Nr!   ©rƒ   s    r$   Ú
_iter_oncer‡   «   s   è ø€ Ø
ƒKùs   ‚c                ó   K  — | ­–— y ­wr…   r!   r†   s    r$   Ú_aiter_oncer‰   ¯   s   è ø€ Ø
„Kùs   ‚	Úis_asyncc                 ór  — t        |j                  dd«      «      }|j                  d«      }t        |t        «      rt	        ||¬«      nd}|j                  d«      s"| j
                  j                  t        ||«      fS t        |«      }| j
                  j                  |rt        |«      fS t        |«      fS )aR  Synthesize the length-truncated response the provider itself returns for slightly larger output budgets.

    The provider billed the prompt it processed but sends no usage object with the 400, so the prompt is estimated
    the way every other usage-less path estimates it: reporting zero would spend input tokens against no budget.
    rh   rn   Úmessages)rh   rŒ   r   Ústream)rE   rT   rQ   rW   r   r4   r5   r~   r‚   r‰   r‡   )rI   rJ   rŠ   rh   rŒ   ri   rƒ   s          r$   Ú!build_output_token_limit_responserŽ   ³   s�   € ô ˜DŸH™H W¨bÓ1Ó2€EØ—h‘h˜zÓ*€HÜLVÐW_ÔaeÔLfœ=¨u¸xÕHÐlm€MØ�8‰8�HÔØ�z‰z×!Ñ!Ô#AÀ%ÈÓ#WÐWÐWÜ,¨UÓ3€EØ�:‰:×Ñ±h¤¨EÓ 2ÐVÐVÄJÈuÓDUÐVÐVr,   c            
       ó”  — e Zd ZdZededed   deez  e	z  e
z  dz  fd„«       Zedej                  ej                  z  dz  defd	„«       Ze	 dd
eez  e	z  e
z  ded   dedefd„«       Zededed   defd„«       Zeded   deedf   fd„«       Ze	 dded   dej                  dz  fd„«       Zedej                  dz  fd„«       Zy)ÚBaseOpenAILLMzb
    Base class for OpenAI LLMs for getting their httpx clients and SSL verification settings
    Úclient_initialization_paramsÚclient_type)ÚopenaiÚazurer   Nc                 ór   — t         j                  | |¬«      }t        j                  j	                  |«      }|S )zbRetrieves the OpenAI client from the in-memory cache based on the client initialization parameters©r‘   r’   )r�   Úget_openai_client_cache_keyÚlitellmÚin_memory_llm_clients_cacheÚ	get_cache)r‘   r’   Ú
_cache_keyÚ_cached_clients       r$   Úget_cached_openai_clientz&BaseOpenAILLM.get_cached_openai_clientÉ   s>   € ô
 *×EÑEØ)EØ#ð Fó 
ˆ
ô !(× CÑ C× MÑ MÈjÓ YˆØÐr,   Úhttp_clientc                 óT   — | €y| t         j                  uxr | t         j                  uS )a"  Whether litellm may close an SDK client built around ``http_client``.

        ``_get_async_http_client`` / ``_get_sync_http_client`` hand back
        ``litellm.aclient_session`` / ``litellm.client_session`` when the caller
        configured one. The SDK's ``close()`` closes whatever http client it was
        given, so an SDK client wrapping one of those shared sessions must never be
        closed on eviction; the caller goes on using the session. ``None`` means the
        SDK built its own http client, which litellm does own.
        T)r˜   Úaclient_sessionÚclient_session)rž   s    r$   Úowns_wrapped_http_clientz&BaseOpenAILLM.owns_wrapped_http_clientÕ   s/   € ð ÐØØ¤'×"9Ñ"9Ð9Òg¸kÔQX×QgÑQgÐ>gÐgr,   Úopenai_clientÚlitellm_owned_clientc                 ó€   — t         j                  ||¬«      }t        j                  j	                  || t
        |¬«       y)a#  Stores the OpenAI client in the in-memory cache for _DEFAULT_TTL_FOR_HTTPX_CLIENTS SECONDS

        ``litellm_owned_client`` says litellm built this client, so the cache may close it once it
        is evicted. A client the caller supplied stays open, since litellm does not own it.
        r–   )ÚkeyÚvalueÚttlr¤   N)r�   r—   r˜   r™   Ú	set_cacher   )r£   r’   r‘   r¤   r›   s        r$   Úset_cached_openai_clientz&BaseOpenAILLM.set_cached_openai_clientä   sG   € ô *×EÑEØ)EØ#ð Fó 
ˆ
ô 	×+Ñ+×5Ñ5ØØÜ.Ø!5ð	 	6õ 	
r,   c                 ó”  — d}| j                  d«      �Ct        j                  | j                  dd«      j                  «       «      }|j	                  «       }d|› �d| j                  d«      › �g}d}t
        j                  |¬«      |z   }|D ]'  }|j                  |› d	| j                  |«      › �«       Œ) d
j                  |«      }|S )zWCreates a cache key for the OpenAI client based on the client initialization parametersNÚapi_keyrn   zhashed_api_key=z	is_async=rŠ   )ÚtimeoutÚmax_retriesÚorganizationÚapi_base©r’   ú=ú,)	rT   ÚhashlibÚsha256ÚencodeÚ	hexdigestr�   Ú-get_openai_client_initialization_param_fieldsrY   Újoin)	r‘   r’   Úhashed_api_keyÚhash_objectÚ	key_partsÚLITELLM_CLIENT_SPECIFIC_PARAMSÚopenai_client_fieldsÚparamr›   s	            r$   r—   z)BaseOpenAILLM.get_openai_client_cache_keyû   sò   € ð ˆØ'×+Ñ+¨IÓ6ÐBÜ!(§¡Ð0L×0PÑ0PÐQZÐ\^Ó0_×0fÑ0fÓ0hÓ!iˆKà(×2Ñ2Ó4ˆNð ˜nÐ-Ð.ØÐ4×8Ñ8¸ÓDÐEÐFð
ˆ	ð
1
Ð&ô ×GÑGÐT_ÐGÓ`Ø,ñ-ð 	ð
 *ò 	SˆEØ×Ñ ˜w aÐ(D×(HÑ(HÈÓ(OÐ'PÐQÕRð	Sð  ŸH™H YÓ/ˆ
ØÐr,   .c                 ó$   — | dk(  rt         S t        S )zGReturns a tuple of fields that are used to initialize the OpenAI clientr“   )r-   r.   r±   s    r$   r¸   z;BaseOpenAILLM.get_openai_client_initialization_param_fields  s   € ð
 ˜(Ò"Ü&Ð&ä,Ð,r,   Úshared_sessionr   c           
      ór  — t         j                  �t         j                  S t        t         dd«      r!ddlm} t        j                   |«       ¬«      S t        «       }t        j                  |t        j                  t        |t        j                  «      r|nd t        |t        «      r|nd | ¬«      d¬«      S )	NÚnetwork_mockFr   ©ÚMockOpenAITransport©Ú	transport)Ússl_contextÚ
ssl_verifyrÁ   T)ÚverifyrÇ   Úfollow_redirects)r˜   r    ÚgetattrÚ(litellm.llms.custom_httpx.mock_transportrÅ   r<   ÚAsyncClientr   r   Ú_create_async_transportrQ   ÚsslÚ
SSLContextÚbool)rÁ   rÅ   Ú
ssl_configs      r$   Ú_get_async_http_clientz$BaseOpenAILLM._get_async_http_client%  s—   € ô ×"Ñ"Ð.Ü×*Ñ*Ð*ä”7˜N¨EÔ2ÝTä×$Ñ$Ñ/BÓ/DÔEÐEô 2Ó3ˆ
ä× Ñ ØÜ&×>Ñ>Ü+5°jÄ#Ç.Á.Ô+Q™ZÐW[Ü)3°JÄÔ)E™:È4Ø-ôð
 "ô
ð 	
r,   c                  óè   — t         j                  �t         j                  S t        t         dd«      r!ddlm}  t        j                   | «       ¬«      S t        «       }t        j                  |d¬«      S )NrÃ   Fr   rÄ   rÆ   T)rÊ   rË   )r˜   r¡   rÌ   rÍ   rÅ   r<   ÚClientr   )rÅ   rÓ   s     r$   Ú_get_sync_http_clientz#BaseOpenAILLM._get_sync_http_client>  s]   € ä×!Ñ!Ð-Ü×)Ñ)Ð)ä”7˜N¨EÔ2ÝTä—<‘<Ñ*=Ó*?Ô@Ð@ô 2Ó3ˆ
ä�|‰|ØØ!ô
ð 	
r,   )Fr…   )rA   rB   rC   Ú__doc__ÚstaticmethodrF   r	   r   r   r   r   r�   r<   rÖ   rÎ   rÒ   r¢   rª   rE   r—   r&   r¸   r   rÔ   r×   r!   r,   r$   r�   r�   Ä   s›  „ ñð ð	Ø&*ð	Ø9@ÐARÑ9Sð	à	�+Ñ	 Ñ	+Ð.>Ñ	>ÀÑ	Eò	ó ð	ð ðh¨e¯l©l¸U×=NÑ=NÑ.NÐQUÑ.Uð hÐZ^ò hó ðhð ð
 &+ñ	
Ø Ñ+¨kÑ9Ð<LÑLð
àÐ.Ñ/ð
ð '+ð
ð #ò	
ó ð
ð, ðÀ$ð ÐU\Ð]nÑUoð Ðtwò ó ðð> ð-ØÐ.Ñ/ð-à	ˆs�Cˆx‰ò-ó ð-ð à48ñ
Ø  Ñ1ð
à	×	Ñ	˜TÑ	!ò
ó ð
ð0 ð
 5§<¡<°$Ñ#6ò 
ó ñ
r,   r�   c                   ó8   — e Zd ZU eed<   edz  ed<   edz  ed<   y)ÚOpenAICredentialsr°   Nr¬   r¯   )rA   rB   rC   rE   Ú__annotations__r!   r,   r$   rÛ   rÛ   Q  s   … ØƒMØ�4‰ZÓØ˜‘*Ôr,   rÛ   r°   r¬   r¯   c                 ó„  — | xsB t         j                  xs0 t        j                  d«      xs t        j                  d«      xs d}|xs, t         j                  xs t        j                  dd«      xs d}|xs9 t         j
                  xs' t         j                  xs t        j                  d«      }t        |||¬«      S )zFResolve OpenAI credentials from params, litellm globals, and env vars.ÚOPENAI_BASE_URLÚOPENAI_API_BASEr9   ÚOPENAI_ORGANIZATIONNÚOPENAI_API_KEY)r°   r¬   r¯   )r˜   r°   ÚosÚgetenvr¯   r¬   Ú
openai_keyrÛ   )r°   r¬   r¯   Úresolved_api_baseÚresolved_organizationÚresolved_api_keys         r$   Úget_openai_credentialsrè   W  s·   € ð 	ò 	'Ü×Ñò	'ä�9‰9Ð&Ó'ò	'ô �9‰9Ð&Ó'ò	'ð 'ð ð )Òr¬G×,@Ñ,@ÒrÄBÇIÁIÐNcÐeiÓDjÒrÐnrÐØ%Òm¬¯©Òm¼G×<NÑ<NÒmÔRT×R[ÑR[Ð\lÓRmÐÜØ"Ø Ø*ôð r,   )NNN)JrØ   r´   r'   rS   râ   rÐ   r}   r{   Úcollections.abcr   r   r   Útypingr   r   r   r	   r
   r   r<   r“   r   r   r   r   Úopenai.types.chatr   r   r   Ú!openai.types.chat.chat_completionr   Ú'openai.types.chat.chat_completion_chunkr�   r   Úopenai.types.completion_usager   Úaiohttpr   r˜   Ú(litellm.litellm_core_utils.token_counterr   Ú)litellm.llms.base_llm.chat.transformationr   Ú&litellm.llms.custom_httpx.http_handlerr   r   r   Útyper&   rE   r+   r-   rÜ   r.   r0   ÚUnprocessableEntityErrorrR   rF   rc   rd   ÚBadRequestErrorrÒ   rg   rD   r~   r‚   r‡   r‰   ry   rG   rŽ   r�   rÛ   rè   r!   r,   r$   ú<module>rö      sX  ðòó Û Û Û 	Û 
Û Û ß <Ñ <ß K× Kã Û ß EÓ Eß XÑ XÝ 4Ý IÝ ?Ý 9áÝ%ã Ý BÝ F÷ñ ðW ð W¨%°°S°©/ó Wñ
 /FÀfÓ.MÐ �U˜5  c ™?Ñ+Ó MÙ4KÈKÓ4XÐ ˜5  s¨C x¡Ñ1Ó Xô
Ð"ô 
ðB)Ø×&Ñ&¨×)>Ñ)>Ñ>ð)à
ˆs�Cˆx‰.ð)ð 
ˆ#ˆsˆ(�^ó)ðZ Xð ! %¨¡*ó ð
A 6×#9Ñ#9ð A¸dó Að¨#ð ¸cð Ànó ð" Sð Ð-@ó ð Ð)ð ¨hÐ7JÑ.Kó ðÐ0ð °]ÐCVÑ5Wó ðWØ×ÑðWØ%,¨S°&¨[Ñ%9ðWØEIðWà
ˆ5�=‰=˜.¨8Ð4GÑ+HÑHÈ=ÐYlÑKmÑmÐmÑnóW÷"J
ñ J
ôZ˜
ô ð  ØØ#ñØ�D‰jðà�4‰Zðð ˜‘*ðð ô	r,   