ó
    Ð]jµv  ã                  óR  • S SK Jr  S SKrS SKrS SKJrJrJ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  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  S SKJr  S SKJ r   SSK!J"r"J#r#  SSK$J%r%J&r&J'r'J(r(J)r)J*r*J+r+J,r,J-r-J.r.J/r/J0r0J1r1J2r2J3r3J4r4J5r5J6r6J7r7J8r8J9r9J:r:J;r;J<r<J=r=J>r>J?r?J@r@JArAJBrB  SSKCJDrDJErE  SSKFJGrG  \(       a  S SKHJIrI  S SKJJKrK  SSKLJ r   SrMS4S jrNS5S jrOSS.     S6S jjrP    S7S jrQS8S jrRS9S jrS      S:S  jrTS;S! jrU S<     S=S" jjrVS>S# jrW        S?S$ jrXS@S% jrY " S& S'\E5      rZ " S( S)\E5      r[ S S*K\J]r]   " S+ S,\E5      r^SAS- jr`\"SS.       SBS. jj5       raSCS/ jrb\"SDS0 j5       rc\"SES1 j5       rdSFS2 jreSGS3 jrfg! \_ a    \Zr^ NHf = f)Hé    )ÚannotationsN)ÚTYPE_CHECKINGÚAnyÚcast)ÚLegacyAPIResponse)ÚResponseStreamState)ÚChatCompletion)ÚChatCompletionChunk)ÚChatCompletionMessage)Ú%ChatCompletionMessageFunctionToolCall)Ú
Completion)ÚCreateEmbeddingResponse)ÚImagesResponse)ÚResponse)Úget_current_span)ÚLogfireSpané   )Úhandle_internal_errorsÚlog_internal_erroré   )ÚINPUT_MESSAGESÚOPERATION_NAMEÚOUTPUT_MESSAGESÚREQUEST_FREQUENCY_PENALTYÚREQUEST_MAX_TOKENSÚREQUEST_MODELÚREQUEST_PRESENCE_PENALTYÚREQUEST_SEEDÚREQUEST_STOP_SEQUENCESÚREQUEST_TEMPERATUREÚREQUEST_TOP_PÚRESPONSE_FINISH_REASONSÚRESPONSE_IDÚRESPONSE_MODELÚSYSTEM_INSTRUCTIONSÚTOOL_DEFINITIONSÚBlobPartÚChatMessageÚInputMessagesÚMessagePartÚOutputMessageÚOutputMessagesÚRoleÚSemconvVersionÚSystemInstructionsÚTextPartÚToolCallPartÚToolCallResponsePartÚUriPartÚprovider_attrs)ÚEndpointConfigÚStreamState)Úget_usage_attributes)ÚFinalRequestOptions)Ú	ResponseT)Úget_endpoint_configÚon_responseÚis_async_clientc                ó¼  • U R                  S5      =nb	  X![        '   OU R                  S5      =nb  X1[        '   U R                  S5      =nb  XA[        '   U R                  S5      =nb  XQ[        '   U R                  S5      =nbQ  [	        U[
        5      (       a  [        R                  " U/5      U[        '   O[        R                  " U5      U[        '   U R                  S5      =nb  Xq[        '   U R                  S5      =nb  X�[        '   U R                  S	5      =n	b  X‘[        '   U R                  S
5      =n
b  [        R                  " U
5      U[        '   gg)z?Extract request parameters from json_data and add to span_data.Ú
max_tokensNÚmax_output_tokensÚtemperatureÚtop_pÚstopÚseedÚfrequency_penaltyÚpresence_penaltyÚtools)Úgetr   r    r!   Ú
isinstanceÚstrÚjsonÚdumpsr   r   r   r   r&   )Ú	json_dataÚ	span_datar>   r?   r@   rA   rB   rC   rD   rE   rF   s              Úp/home/mande/repo/quber/.venv/lib/python3.13/site-packages/logfire/_internal/integrations/llm_providers/openai.pyÚ_extract_request_parametersrO   G   sI  € à—m‘m LÓ1Ð1ˆ
Ñ>Ø(2Ô$Ò%Ø(Ÿ}™}Ð-@ÓAÐ
AÐ
Ñ	NØ(9Ô$Ñ%à —}‘} ]Ó3Ð3ˆÑ@Ø)4Ô%Ñ&à—‘˜wÓ'Ð'ˆÑ4Ø#(”-Ñ à—‘˜fÓ%Ð%ˆÑ2Ü�dœC× Ñ Ü04·
²
¸D¸6Ó0BˆIÔ,Ò-ä04·
²
¸4Ó0@ˆIÔ,Ñ-à—‘˜fÓ%Ð%ˆÑ2Ø"&”,Ñà&Ÿ]™]Ð+>Ó?Ð?ÐÑLØ/@Ô+Ñ,à%ŸM™MÐ*<Ó=Ð=ÐÑJØ.>Ô*Ñ+à—‘˜wÓ'Ð'ˆÑ4Ü&*§j¢j°Ó&7ˆ	Ô"Ò#ð 5ó    c                ó$   ^•  " U4S jSU 5      nU$ )z-Create a version-aware stream state subclass.c                  ó   >• \ rS rSr Y rSrg)z3_versioned_stream_cls.<locals>.VersionedStreamStateéj   © N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú	_versionsÚ__static_attributes__)Úversionss   €rN   ÚVersionedStreamStateÚ3_versioned_stream_cls.<locals>.VersionedStreamStatej   s   ø† Ù‹	rP   r\   rT   )Úbase_clsr[   r\   s    ` rN   Ú_versioned_stream_clsr_   g   s   ø€ ÷˜xô ð  ÐrP   ©Úversionc               ó„  ^^^• [        U[        5      (       a  UO[        U15      nU R                  nU R                  n[        U[        5      (       d  0 n[        SU5      mTR                  S5      mSU;   a  TOST0mS#S$UUU4S jjjnUS:X  am  [        S5      (       a
  [        S0 S9$ U" S	5      nS
U;   a,  TR                  S/ 5      nU(       a  [        U5      nX†[        '   [        SU[        [        U5      S9$ US:X  aÚ  [        SS5      (       a
  [        S0 S9$ TR                  SS5      n	0 U" S	5      ESTU	S.0EnSU;   a-  [        TR                  S5      TR                  S5      5      US'   S
U;   aJ  [        TR                  S5      TR                  S5      5      u  p«U
(       a  X¦[        '   U(       a  X¶[        '   [        SU[        [         U5      S9$ US:X  a  [        SU" S5      [        ["        U5      S9$ US:X  a  [        SU" S5      S9$ US:X  a  [        SU" S 5      S9$ [        S!S"U0U" 5       ES9$ )%z<Returns the endpoint config for OpenAI depending on the url.údict[str, Any]Úmodelr   Ú c                ó|   >• ST0[        S5      EnT(       a	  TU[        '   U (       a  X[        '   [        TU5        U$ )NÚrequest_dataÚopenai)r4   r   r   rO   )Ú	operationÚattrsrL   rd   rg   s     €€€rN   Úcommon_attrsÚ)get_endpoint_config.<locals>.common_attrs   sE   ø€ à˜Lð!
ä˜XÓ&ð!
ˆö Ø#(ˆE”-Ñ ÞØ$-”.Ñ!Ü# I¨uÔ5ØˆrP   z/chat/completionsz-Chat completion with {gen_ai.request.model!r})Úmessage_templaterM   ÚchatÚlatestÚmessagesz,Chat Completion with {request_data[model]!r})rm   rM   Ústream_state_clsz
/responseszResponses APIz+Responses API with {gen_ai.request.model!r}ÚstreamFrg   )rd   rr   ÚinputÚinstructionsÚeventsz/completionsz'Completion with {request_data[model]!r}Útext_completionz/embeddingsz/Embedding Creation with {request_data[model]!r}Ú
embeddingsz/images/generationsz-Image Generation with {request_data[model]!r}Úimage_generationzOpenAI API call to {url!r}Úurl)re   )ri   rI   Úreturnrc   )rH   Ú	frozensetry   rL   Údictr   rG   Úis_current_agent_spanr5   Ú#convert_chat_completions_to_semconvr   r_   ÚOpenaiChatCompletionStreamStateÚinputs_to_eventsÚ#convert_responses_inputs_to_semconvr%   ÚOpenaiResponsesStreamStateÚOpenaiCompletionStreamState)Úoptionsra   r[   ry   Úraw_json_datark   rM   rp   Úinput_messagesrr   Úinput_messages_respÚsystem_instructionsrL   rd   rg   s               @@@rN   r:   r:   p   sp  ú€ ô 6@ÀÌ×5SÑ5S©'ÔYbÐdkÐclÓYm€HØ
�+‰+€Cà×%Ñ%€MÜ�m¤T×*Ñ*àˆÜÐ% }Ó5€IØ�M‰M˜'Ó"€EØ ! X£‘9°G¸UÐ3C€L÷
ó 
ð Ð!Ó!Ü Ð!P×QÑQÜ!°2ÀÑDÐDá  Ó(ˆ	à�xÓà-6¯]©]¸:ÀrÓ-JˆHÞÜ!DÀXÓ!N�Ø,:œ.Ñ)äØKØÜ2Ô3RÐT\Ó]ñ
ð 	
ð
 
�Ó	Ü  Ð2_×`Ñ`Ü!°2ÀÑDÐDà—‘˜x¨Ó/ˆØ`‘| FÓ+Ð`¨^ÀuÐX^Ñ=_Ñ`ˆ	Ø�‹=Ü"2°9·=±=ÀÓ3IÈ9Ï=É=ÐYgÓKhÓ"iˆI�hÑà�xÓä7ZØ—‘˜gÓ&¨	¯©°nÓ(Eó8Ñ4Ðö #Ø,?œ.Ñ)Þ"Ø1DÔ-Ñ.äØJØÜ2Ô3MÈxÓXñ
ð 	
ð
 
�Ó	ÜØFÙ"Ð#4Ó5Ü2Ô3NÐPXÓYñ
ð 	
ð
 
�Ó	ÜØNÙ" <Ó0ñ
ð 	
ð 
Ð%Ó	%ÜØLÙ"Ð#5Ó6ñ
ð 	
ô
 Ø9Ø˜cÐ4¡\£^Ð4ñ
ð 	
rP   c                ó‚  • / nU  GH5  nUR                  S5      =(       d    SnUR                  S5      nUR                  S5      nUR                  S5      n/ nUS:X  a"  U(       a  UR                  [        SUUS95        OˆUb  UR                  [	        U5      5        U(       ad  U H^  nUR                  S	0 5      n	UR                  [        UR                  S
S5      U	R                  SS5      U	R                  S5      S95        M`     UUS.n
UR                  S5      =n(       a  XºS'   UR                  U
5        GM8     U$ )aŽ  Convert OpenAI Chat Completions API messages format to OTel Gen AI Semantic Convention format.

Returns input_messages.

Note: For OpenAI Chat Completions API, system messages are part of the chat history
and should be recorded in gen_ai.input.messages, not gen_ai.system_instructions.
system_instructions is only used for dedicated instruction parameters (which don't
exist for chat completions).
ÚroleÚuserÚcontentÚtool_call_idÚ
tool_callsÚtoolÚtool_call_response©ÚtypeÚidÚresponseÚfunctionr“   re   ÚnameÚ	arguments©r�   r–   r—   ©rŠ   Úparts)rG   Úappendr2   ÚextendÚ_convert_content_part_or_partsÚmake_tool_call_part)rp   r†   ÚmsgrŠ   rŒ   r�   rŽ   rš   Útcr•   Úmessager–   s               rN   r~   r~   Ì   s6  € ð %'€NäˆØ—W‘W˜V“_×.¨ˆØ—'‘'˜)Ó$ˆØ—w‘w˜~Ó.ˆØ—W‘W˜\Ó*ˆ
ð $&ˆà�6‹>žlà�L‰LÜ$Ø-Ø#Ø$ñõð Ñ"Ø—‘Ô;¸GÓDÔEö Û$�BØ!Ÿv™v j°"Ó5�HØ—L‘LÜ+Ø)+¯©°°bÓ)9Ø!)§¡¨f°bÓ!9Ø&.§l¡l°;Ó&?ñöñ %ð Øñ 
ˆð —7‘7˜6“?Ð"ˆ4Õ"Ø"�F‰Oð 	×Ñ˜g×&ñ[ ð^ ÐrP   c                óÂ   • U (       d  / $ [        U [        5      (       a1  [        [        [           U 5       Vs/ s H  n[	        U5      PM     sn$ [	        U 5      /$ s  snf ©N)rH   Úlistr   r   Ú_convert_content_part)rŒ   Úparts     rN   r�   r�     sS   € ÞØˆ	ä�'œ4× Ñ Ü8<¼TÄ#¹YÈÔ8PÓQÒ8P°Ô% dÖ+Ñ8PÑQÐQä% gÓ.Ð/Ð/ùò Rs   ¸Ac                ó¦  • [        U [        5      (       d  [        S[        U 5      S9$ [	        SU 5      n U R                  SS5      nUS;   a  [        SU R                  SS5      S9$ US:X  a-  U R                  S0 5      R                  S	S5      n[        S
USS9$ US:X  a+  [        SU R                  S0 5      R                  SS5      SS9$ 0 U ESU0E$ )z0Convert a single content part to semconv format.Útext©r’   rŒ   rc   r’   Úunknown)r¨   Úoutput_textre   Ú	image_urlry   ÚuriÚimage)r’   r­   ÚmodalityÚinput_audioÚblobÚdataÚaudio)r’   rŒ   r¯   )rH   r|   r0   rI   r   rG   r3   r'   )r¦   Ú	part_typery   s      rN   r¥   r¥     sÜ   € ä�dœD×!Ñ!Ü˜V¬S°«YÑ7Ð7äÐ  $Ó'€DØ—‘˜ Ó+€IØÐ+Ó+Ü˜V¨T¯X©X°f¸bÓ-AÑBÐBØ	�kÓ	!Ø�h‰h�{ BÓ'×+Ñ+¨E°2Ó6ˆÜ˜E s°WÑ=Ð=Ø	�mÓ	#ÜØØ—H‘H˜]¨BÓ/×3Ñ3°F¸BÓ?Øñ
ð 	
ð +�$Ð*˜ 	Ñ*Ð*rP   c                óä  • / n[        U5      nU (       GaY  [        U [        5      (       a%  UR                  [	        S[        SU S9/S95        X#4$ U  GH  nUR                  SS5      UR                  S5      UR                  S5      pvnUS;   a,  U(       a%  [        U5      nUR                  [	        XXS95        Mi  US	:X  aT  UR                  [	        S
[        UR                  SS5      UR                  SS5      UR                  S5      S9/S95        MÃ  US:X  d  MË  S[        SUR                  SS5      UR                  S5      S9/S.n	SU;   a  US   U	S'   UR                  U	5        GM     X#4$ )zGConvert Responses API inputs to OTel Gen AI Semantic Convention format.r‹   r¨   r©   r™   rŠ   r’   rŒ   ©Nr¡   Úfunction_callÚ	assistantÚcall_idre   r–   r—   r˜   Úfunction_call_outputr�   r�   Úoutputr‘   )	r�   rH   rI   r›   r(   r0   rG   rž   r2   )
Úinputsrt   r†   rˆ   ÚinprŠ   ÚtyprŒ   rš   rŸ   s
             rN   r�   r�   -  ss  € ð %'€NÜ.LÈ\Ó.ZÐßÜ�fœc×"Ñ"Ø×!Ñ!¤+°6Ä(ÐPVÐ`fÑBgÐAhÑ"iÔjðD Ð.Ð.ôA �Ø%(§W¡W¨V°VÓ%<¸c¿g¹gÀf»oÈsÏwÉwÐW`ÓOa˜7�ØÐ+Ó+¶Ü/MÈgÓ/V�EØ"×)Ñ)¬+¸4Ñ*MÖNØ˜OÓ+Ø"×)Ñ)Ü#Ø!,ä 3Ø14·±¸ÀBÓ1GØ),¯©°¸Ó)<Ø.1¯g©g°kÓ.Bñ!"ð#ñ	öð Ð2Õ2à &ä0Ø%9Ø#&§7¡7¨9°bÓ#9Ø),¯©°Ó):ñð"ñ	(�Cð  “}Ø&)¨&¡k˜˜F™Ø"×)Ñ)¨#×.ñ? ð@ Ð.Ð.rP   c                 ó¼   • [        5       nUR                  5       =(       a<    [        USS 5      =n=(       a&    UR                  S:H  =(       a    [        USS 5      U ;   $ )NÚinstrumentation_scopezlogfire.openai_agentsr–   )r   Úis_recordingÚgetattrr–   )Ú
span_namesÚcurrent_spanrÀ   s      rN   r}   r}   Z  s`   € Ü#Ó%€Là×!Ñ!Ó#÷ 	>Ü&-¨lÐ<SÐUYÓ&ZÐZÐ"÷	>à!×&Ñ&Ð*AÑA÷	>ô �L &¨$Ó/°:Ñ=ð	rP   c           	     ór  • [        U R                  5      nU R                  (       av  U R                   Hf  n[        U[        5      (       d  M  UR                  [        UR                  UR                  R                  UR                  R                  S95        Mh     U R                  US.nU(       a  XS'   U$ )zRConvert an OpenAI ChatCompletionMessage to OTel Gen AI Semantic Convention format.r˜   r™   Úfinish_reason)r�   rŒ   rŽ   rH   r   r›   rž   r“   r•   r–   r—   rŠ   )r¡   rÆ   rš   r    Úresults        rN   Ú"convert_openai_response_to_semconvrÈ   d  s“   € ô
  >¸g¿o¹oÓN€Eà××Ø×$Ô$ˆBä˜"ÔC×DÓDØ—‘Ü'Ø%'§U¡UØŸ[™[×-Ñ-Ø"$§+¡+×"7Ñ"7ñöñ %ð —‘Øñ€Fö Ø"/ˆÑà€MrP   c                óª  • / nU R                    HÀ  nUR                  5       nUR                  S5      nUR                  S5      nUS;   a+  U(       a$  UR                  [	        S[        U5      S95        Mf  US:X  d  Mn  UR                  [	        S[        UR                  SS5      UR                  S	S5      UR                  S
5      S9/S95        MÂ     U$ )zHConvert Responses API outputs to OTel Gen AI Semantic Convention format.r’   rŒ   r¶   r¸   r™   r·   r¹   re   r–   r—   r˜   )r»   Ú
model_dumprG   r›   r+   r�   rž   )r”   Úoutput_messagesÚoutÚout_dictr¾   rŒ   s         rN   Ú$convert_responses_outputs_to_semconvrÎ   �  sÉ   € à&(€OØ�ŒˆØ—>‘>Ó#ˆØ�l‰l˜6Ó"ˆØ—,‘,˜yÓ)ˆàÐ#Ó#®Ø×"Ñ"ÜØ$Ü8¸ÓAñöð �OÕ#Ø×"Ñ"ÜØ$ä+Ø)1¯©°iÀÓ)DØ!)§¡¨f°bÓ!9Ø&.§l¡l°;Ó&?ñðñ	öñ ð2 ÐrP   c                óì   • [        U[        5      (       aC  [        R                  " [        R
                  5         [        R                  " U5      nSSS5        [        SU UUS9$ ! , (       d  f       N= f)z)Helper function to create a ToolCallPart.NÚ	tool_call)r’   r“   r–   r—   )rH   rI   Ú
contextlibÚsuppressrJ   ÚJSONDecodeErrorÚloadsr1   r˜   s      rN   rž   rž      sZ   € ô �)œS×!Ñ!Ü× Ò ¤×!5Ñ!5Õ6ÜŸ
š
 9Ó-ˆI÷ 7äØØØØñ	ð ÷ 7Õ6ús   ºA%Á%
A3c                óf   • U (       a*  U R                   (       a  U R                   S   R                  $ g )Nr   )Úchoicesr¨   )Úchunks    rN   Úcontent_from_completionsrØ   ±  s#   € Þ�——Ø�}‰}˜QÑ×$Ñ$Ð$ØrP   c                  óV   • \ rS rSr% \" S15      rS\S'   S rSS jrSS jr	SS jr
S	rg
)rƒ   i·  r   úfrozenset[SemconvVersion]rY   c                ó   • / U l         g r£   ©Ú_content©Úselfs    rN   Ú__init__Ú$OpenaiCompletionStreamState.__init__º  s	   € Ø#%ˆ�rP   c                ó`   • [        U5      nU(       a  U R                  R                  U5        g g r£   )rØ   rÝ   r›   )rß   r×   rŒ   s      rN   Úrecord_chunkÚ(OpenaiCompletionStreamState.record_chunk½  s&   € Ü*¨5Ó1ˆÞØ�M‰M× Ñ  Õ)ð rP   c                ód   • SR                  U R                  5      [        U R                  5      S.$ )Nre   ©Úcombined_chunk_contentÚchunk_count)ÚjoinrÝ   ÚlenrÞ   s    rN   Úget_response_dataÚ-OpenaiCompletionStreamState.get_response_dataÂ  s'   € Ø*,¯'©'°$·-±-Ó*@ÔQTÐUY×UbÑUbÓQcÑdÐdrP   c                óØ   • U R                   n[        S	0 UD6nSU;   a  U R                  5       US'   SU;   a3  SR                  U R                  5      nU(       a  SSUS./S./U[
        '   U$ )
Nr   Úresponse_dataro   re   r¸   r¨   r©   r™   rT   )rY   r|   rë   ré   rÝ   r   )rß   rM   r[   rÇ   Úcombined_contents        rN   Úget_attributesÚ*OpenaiCompletionStreamState.get_attributesÅ  sy   € Ø—>‘>ˆÜÑ"˜	Ñ"ˆØ�‹=Ø&*×&<Ñ&<Ó&>ˆF�?Ñ#Ø�xÓØ!Ÿw™w t§}¡}Ó5ÐÞð !,Ø+1Ð>NÑ"OÐ!Pñð+�”Ñ'ð ˆrP   rÜ   N)r×   r   rz   ÚNone©rz   r   ©rM   rc   rz   rc   ©rU   rV   rW   rX   r{   rY   Ú__annotations__rà   rã   rë   rð   rZ   rT   rP   rN   rƒ   rƒ   ·  s(   ‡ Ù+4°a°S«>€IÐ(Ó9ò&ô*ô
e÷rP   rƒ   c                  óV   • \ rS rSr% \" S15      rS\S'   S rSS jrSS jr	SS jr
S	rg
)r‚   iÖ  r   rÚ   rY   c                óZ   • [        [        R                  [        R                  S9U l        g )N)Úinput_toolsÚtext_format)r   rh   ÚomitÚ_staterÞ   s    rN   rà   Ú#OpenaiResponsesStreamState.__init__Ù  s   € Ü)´f·k±kÌvÏ{É{Ñ[ˆ�rP   c                ó:   • U R                   R                  U5        g r£   )rü   Úhandle_event©rß   r×   s     rN   rã   Ú'OpenaiResponsesStreamState.record_chunkÜ  s   € Ø�‰× Ñ  Õ'rP   c                ó2   • U R                   R                  nU$ r£   )rü   Ú_completed_response)rß   r”   s     rN   rë   Ú,OpenaiResponsesStreamState.get_response_dataß  s   € Ø—;‘;×2Ñ2ˆàˆrP   c                ó  • U R                   nU R                  5       nU(       ab  SU;   a  [        U5      nXA[        '   SU;   a)  UR	                  S5      =(       d    / [        U5      -   US'   UR                  [        U5      5        U$ )Nro   r   ru   )rY   rë   rÎ   r   rG   Úresponses_output_eventsÚupdateÚget_openai_usage_attributes)rß   rM   r[   r”   rË   s        rN   rð   Ú)OpenaiResponsesStreamState.get_attributesä  s{   € Ø—>‘>ˆØ×)Ñ)Ó+ˆÞØ˜8Ó#Ü"FÀxÓ"P�Ø-<œ/Ñ*Ø�H‹}Ø'0§}¡}°XÓ'>×'DÀ"ÔH_Ð`hÓHiÑ&i�	˜(Ñ#Ø×ÑÔ8¸ÓBÔCØÐrP   )rü   N)r×   r   rz   rò   ró   rô   rõ   rT   rP   rN   r‚   r‚   Ö  s(   ‡ Ù+4°a°S«>€IÐ(Ó9ò\ô(ô÷

rP   r‚   )ÚChatCompletionStreamStatec                  óV   • \ rS rSr% \" S15      rS\S'   S rSS jrSS jr	SS jr
S	rg
)r   iõ  r   rÚ   rY   c                ó"   • [        5       U l        g r£   )r
  Ú_stream_staterÞ   s    rN   rà   Ú(OpenaiChatCompletionStreamState.__init__ø  s   € Ü!:Ó!<ˆDÕrP   c                ó\   •  U R                   R                  U5        g ! [         a     g f = fr£   )r  Úhandle_chunkÚ	Exceptionr   s     rN   rã   Ú,OpenaiChatCompletionStreamState.record_chunkû  s-   € ðØ×"Ñ"×/Ñ/°Õ6øÜó Ùðús   ‚ ž
+ª+c                óÞ   •  U R                   R                  nUR                  (       a!  UR                  S   R                  nSUl        OS nX!R                  S.$ ! [         a    SSS.s $ f = f)Nre   r   ræ   r¸   ©r¡   Úusage)r  Úcurrent_completion_snapshotÚAssertionErrorrÖ   r¡   rŠ   r  )rß   Úfinal_completionr¡   s      rN   rë   Ú1OpenaiChatCompletionStreamState.get_response_data  sv   € ðHØ#'×#5Ñ#5×#QÑ#QÐ ð
  ×'×'Ø*×2Ñ2°1Ñ5×=Ñ=�Ø*�•à�Ø&×1GÑ1GÑHÐHøô "ó Hð 35ÀQÑGÒGðHús   ‚A ÁA,Á+A,c                óê  • U R                   n[        S0 UD6nSU;   a  U R                  5       US'   SU;   aj   U R                  R                  n/ nUR
                   H2  nUR                  [        UR                  UR                  5      5        M4     U(       a  XS[        '    U R                  R                  nUR                  [        U5      5        U$ ! [         a     N?f = f! [         a     U$ f = f)Nr   rî   ro   rT   )rY   r|   rë   r  r  rÖ   r›   rÈ   r¡   rÆ   r   r  r  r  )rß   rM   r[   rÇ   r  rË   Úchoices          rN   rð   Ú.OpenaiChatCompletionStreamState.get_attributes  sø   € Ø—~‘~ˆHÜÑ&˜IÑ&ˆFØ�H‹}Ø*.×*@Ñ*@Ó*B��Ñ'Ø˜8Ó#ð	BØ'+×'9Ñ'9×'UÑ'UÐ$ð 79�OØ"2×":Ô":˜Ø'×.Ñ.Ô/QÐRX×R`ÑR`Ðbh×bvÑbvÓ/wÖxñ #;æ&Ø2AœÑ/ðMØ#'×#5Ñ#5×#QÑ#QÐ ð —‘Ô9Ð:JÓKÔLØˆMøô &ó Ùðûô "ó Øð ˆMð	ús#   ¸C Â"C$ Ã
C!Ã C!Ã$
C2Ã1C2)r  N)r×   r
   rz   rò   ró   rô   rõ   rT   rP   rN   r   r   õ  s(   ‡ Ù/8¸!¸«~ˆ	Ð,Ó=ò	=ô	ô	I÷	rP   r   c           	     ó  • [        U SS5      nUc  0 $ [        US[        USS5      5      n[        US[        USS5      5      n[        U [        5      (       a  SnO[        U [        5      (       a  SnOS	n[	        XX#S
US9$ )uë   Extract usage attributes from any OpenAI response object.

Works for ChatCompletion, Response, CreateEmbeddingResponse â€”
both from non-streaming on_response() and streaming get_attributes().
Returns an empty dict when usage is None.
r  NÚprompt_tokensÚinput_tokensÚcompletion_tokensÚoutput_tokensÚ	responsesrw   rn   rh   )Úprovider_idÚ
api_flavor)rÂ   rH   r   r   r7   )r”   r  r  r!  r$  s        rN   r  r  +  sŽ   € ô �H˜g tÓ,€EØ�}Øˆ	Ü˜5 /´7¸5À.ÐRVÓ3WÓX€LÜ˜EÐ#6¼ÀÀÐX\Ó8]Ó^€MÜ�(œH×%Ñ%Ø ‰
Ü	�HÔ5×	6Ñ	6Ø!‰
àˆ
ÜØ˜À(ÐWañð rP   c               óx  • [        U[        5      (       a  UO[        U15      n[        U [        5      (       a$  [        U R	                  5       XS9  [        SU 5      $ [        [        U SS5      =n[        5      (       a  UR                  [        U5        [        U SS5      n[        U[        5      (       a  UR                  [        U5        [        U SS5      nUR                  [        U 5      5        [        U [        5      (       Ga  U R                  (       aô  SU;   a,  UR                  SU R                  S	   R                  US
.5        SU;   aZ  / nU R                   H2  nUR!                  [#        UR                  UR$                  5      5        M4     UR                  [&        U5        / n	U R                   H1  nUR$                  (       d  M  U	R!                  UR$                  5        M3     U	(       a  UR                  [(        U	5        U $ [        U [*        5      (       Ga  U R                  (       aÿ  U R                  S	   n
SU;   a*  UR                  SU
R$                  U
R,                  US.5        SU;   aX  / nU R                   H0  nUR!                  SSUR,                  S./UR$                  S.5        M2     UR                  [&        U5        / nU R                   H1  nUR$                  (       d  M  UR!                  UR$                  5        M3     U(       a  UR                  [(        U5        U $ [        U [.        5      (       a  SU;   a  UR                  SSU05        U $ [        U [0        5      (       a&  SU;   a  UR                  SSU R2                  05        U $ [        U [4        5      (       as  SU;   a!  [7        U 5      nUR                  [&        U5        SU;   aF   [8        R:                  " UR<                  S   5      nU[?        U 5      -  nUR                  SU5        U $ U $ ! [@         a     U $ f = f)z/Updates the span based on the type of response.r`   r9   rd   Nr“   r  r   rî   r   r  ro   )rÆ   r¨   r  r¸   r¨   r©   )rŠ   rš   rÆ   Úimagesru   )!rH   r{   r   r;   Úparser   rÂ   rI   Úset_attributer$   r#   Úset_attributesr  r	   rÖ   r¡   r›   rÈ   rÆ   r   r"   r   r¨   r   r   r²   r   rÎ   rJ   rÔ   Ú
attributesr  r  )r”   Úspanra   r[   Úresponse_modelÚresponse_idr  rË   r  Úfinish_reasonsÚfirst_choiceÚoutput_messages_completionÚfinish_reasons_completionÚresponse_output_messagesru   s                  rN   r;   r;   B  sÁ  € ô
 6@ÀÌ×5SÑ5S©'ÔYbÐdkÐclÓYm€Hä�(Ô-×.Ñ.Ü�H—N‘NÓ$ dÒ=Ü�K Ó*Ð*ä¤G¨H°g¸tÓ$DÐD�.Äc×JÑJØ×Ñœ>¨>Ô:ä˜( D¨$Ó/€KÜ�+œs×#Ñ#Ø×Ñœ;¨Ô4ä�H˜g tÓ,€EØ×ÑÔ3°HÓ=Ô>ä�(œN×+Ò+°×0@×0@Ø�‹=Ø×ÑØØ$×,Ñ,¨QÑ/×7Ñ7À%ÑHôð �xÓØ.0ˆOØ"×*Ô*�Ø×&Ñ&Ô'IÈ&Ï.É.ÐZ`×ZnÑZnÓ'oÖpñ +à×Ñœ°Ô@Ø$&ˆØ×&Ô&ˆFØ×#×#Ñ#Ø×%Ñ% f×&:Ñ&:Ö;ñ 'ö Ø×ÑÔ6¸ÔGðV €OôU 
�Hœj×	)Ò	)¨h×.>×.>Ø×'Ñ'¨Ñ*ˆØ�‹=Ø×ÑØØ".×"<Ñ"<Àl×FWÑFWÐbgÑhôð �xÓØ?AÐ&Ø"×*Ô*�Ø*×1Ñ1à +Ø+1¸f¿k¹kÑ"JÐ!KØ)/×)=Ñ)=ñöñ +ð ×ÑœÐ0JÔKØ/1Ð!Ø×&Ô&ˆFØ×#×#Ñ#Ø)×0Ñ0°×1EÑ1EÖFñ 'ö %Ø×ÑÔ6Ð8QÔRð& €Oô% 
�HÔ5×	6Ñ	6Ø�‹=Ø×Ñ˜°¸%Ð0@ÔAð  €Oô 
�Hœn×	-Ñ	-Ø�‹=Ø×Ñ˜°¸8¿=¹=Ð0IÔJð €Oô 
�Hœh×	'Ñ	'Ø�xÓÜ7[Ð\dÓ7eÐ$Ø×ÑœÐ0HÔIØ�‹=ð5ÜŸš D§O¡O°HÑ$=Ó>�ð Ô1°(Ó;Ñ;�Ø×"Ñ" 8¨VÔ4Ø€Oˆ8€Oøô ó Øð €Oðús   Ï$#P+ Ð+
P9Ð8P9c                ó–   • [        U [        R                  5      (       a  g[        U [        R                  5      (       d
   SU  35       eg)z3Returns whether or not the `client` class is async.Fz*Expected OpenAI or AsyncOpenAI type, got: T)Ú
issubclassrh   ÚOpenAIÚAsyncOpenAI)Úclients    rN   r<   r<   •  sA   € ä�&œ&Ÿ-™-×(Ñ(ØÜ�fœf×0Ñ0×1Ñ1ÐhÐ5_Ð`fÐ_gÐ3hÓhÐ1ØrP   c                ó¢   • / n0 nU(       a
  USUSS./-  nU (       a2  [        U [        5      (       a  SU S./n U  H  nU[        XC5      -  nM     U$ )zÁGenerate dictionaries in the style of OTel events from the inputs and instructions to the Responses API.

Note: This function is kept for backward compatibility with openai_agents integration.
zgen_ai.system.messageÚsystem©ú
event.namerŒ   rŠ   r‹   )rŠ   rŒ   )rH   rI   Úinput_to_events)r¼   rt   ru   Útool_call_id_to_namer½   s        rN   r€   r€   �  sl   € ð $&€FØ+-ÐÞØà5Ø'Ø ñð
ñ 	
ˆö Ü�fœc×"Ñ"Ø%°&Ñ9Ð:ˆFÛˆCØ”o cÓ@Ñ@ŠFñ à€MrP   c                óœ   • / nU R                    H9  n[        UR                  5       0 S9 H  nUR                  0 UESS0E5        M     M;     U$ )z±Generate dictionaries in the style of OTel events from the outputs of the Responses API.

Note: This function is kept for backward compatibility with openai_agents integration.
)r=  rŠ   r¸   )r»   r<  rÊ   r›   )r”   ru   rÌ   r¡   s       rN   r  r  µ  sU   € ð $&€FØ�ŒˆÜ&Ø�N‰NÓà!#ô
ˆGð
 �M‰MÐ:˜WÐ: f¨kÑ:Ö;ó
ñ ð €MrP   c                óˆ  •  / nU R                  S5      nU R                  S5      nU R                  S5      nU(       a³  US;   a­  U(       a¦  SU S3n[        U[        5      (       a  UR                  XeUS.5        U$ U Hl  n[        R
                  " [        5         US   S:X  a"  UR                  XgS	   US.5         S
S
S
5        MI   S
S
S
5        UR                  [        U5      5        Mn      U$ US:X  a2  U S   XS   '   UR                  SSU S   SU S   U S   S.S./S.5        U$ US:X  aB  UR                  SSU S   U S   UR                  U S   U R                  SS5      5      S.5        U$ UR                  [        U 5      5        U$ ! , (       d  f       NË= f! [         a    [        5         [        U 5      /s $ f = f)ay  Generate dictionaries in the style of OTel events from one input to the Responses API.

`tool_call_id_to_name` is a mapping from tool call IDs to function names.
It's populated when the input is a tool call and used later to
provide the function name in the event for tool call responses.

Note: This function is kept for backward compatibility with openai_agents integration.
rŠ   r’   rŒ   r¶   zgen_ai.z.messager:  r«   r¨   Nr·   r–   r¹   zgen_ai.assistant.messager¸   r•   r—   )r–   r—   )r“   r’   r•   )r;  rŠ   rŽ   rº   zgen_ai.tool.messager�   r»   rª   )r;  rŠ   r“   rŒ   r–   )
rG   rH   rI   r›   rÑ   rÒ   ÚKeyErrorÚunknown_eventr  r   )r½   r=  ru   rŠ   r¾   rŒ   Ú
event_nameÚcontent_items           rN   r<  r<  Æ  sâ  € ð.$Ø')ˆØŸ7™7 6›?ˆØ�g‰g�f‹oˆØ—'‘'˜)Ó$ˆÞ�CÐ,Ó,¶Ø" 4 &¨Ð1ˆJÜ˜'¤3×'Ñ'Ø—‘¨ZÐUYÑZÔ[ðF ˆóC %,�LÜ#×,Ò,¬XÕ6Ø'¨Ñ/°=Ó@Ø"ŸM™M¸Ð]cÑPdÐnrÑ*sÔtØ$÷ 7Ñ6Ø@÷ 7ð —M‘M¤-°Ó"=Ö>ò %,ðB ˆð7 �OÓ#Ø36°v±;Ð  Y¡Ñ0Ø�M‰Mà"<Ø'ð #& i¡.Ø$.Ø14°V±È3È{ÑK[Ñ(\ñð#ñ
ôð2 ˆð Ð*Ó*Ø�M‰Mà"7Ø"Ø˜i™.Ø" 8™}Ø0×4Ñ4°S¸±^ÀSÇWÁWÈVÐU^ÓE_Ó`ñôð ˆð �M‰Mœ-¨Ó,Ô-Øˆ÷A 7Õ6ûôB ó $ÜÔÜ˜cÓ"Ð#Ò#ð$úsI   ‚A9F Á<F Â"FÂ=
F Ã(F Ã17F Ä)AF Å1F Æ
F	ÆF Æ GÇ Gc                ód   • SU R                  S5      =(       d    SU R                  S5       S3U S.$ )Nzgen_ai.unknownrŠ   rª   r’   z

See JSON for details)r;  rŠ   rŒ   r²   )rG   )r½   s    rN   rA  rA     s6   € à&Ø—‘˜“×, 9Ø—g‘g˜f“oÐ&Ð&>Ð?Øñ	ð rP   )rL   rc   rM   rc   rz   rò   )r^   útype[StreamState]r[   rÚ   rz   rE  )r„   r8   ra   ú*SemconvVersion | frozenset[SemconvVersion]rz   r5   )rp   zlist[dict[str, Any]]rz   r)   )rŒ   Úobjectrz   zlist[MessagePart])r¦   rG  rz   r*   )r¼   ú!str | list[dict[str, Any]] | Nonert   ú
str | Nonerz   z(tuple[InputMessages, SystemInstructions])rÃ   rI   r£   )r¡   r   rÆ   rI  rz   r+   )r”   r   rz   r,   )r�   rI   r–   rI   r—   r   rz   r1   )r×   zCompletion | Nonerz   rI  )r”   r   rz   rc   )r”   r9   r+  r   ra   rF  rz   r9   )r7  z.type[openai.OpenAI] | type[openai.AsyncOpenAI])r¼   rH  rt   rI  )r”   r   )r½   rc   r=  zdict[str, str])r½   rc   )gÚ
__future__r   rÑ   rJ   Útypingr   r   r   rh   Úopenai._legacy_responser   Úopenai.lib.streaming.responsesr   Ú!openai.types.chat.chat_completionr	   Ú'openai.types.chat.chat_completion_chunkr
   Ú)openai.types.chat.chat_completion_messager   Ú<openai.types.chat.chat_completion_message_function_tool_callr   Úopenai.types.completionr   Ú&openai.types.create_embedding_responser   Úopenai.types.images_responser   Úopenai.types.responsesr   Úopentelemetry.tracer   Úlogfirer   Úutilsr   r   Úsemconvr   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   Útypesr5   r6   r  r7   Úopenai._modelsr8   Úopenai._typesr9   ÚmainÚ__all__rO   r_   r:   r~   r�   r¥   r�   r}   rÈ   rÎ   rž   rØ   rƒ   r‚   Ú&openai.lib.streaming.chat._completionsr
  r   ÚImportErrorr  r;   r<   r€   r  r<  rA  rT   rP   rN   Ú<module>ra     s  ðÝ "ã Û ß +Ñ +ã Ý 5Ý >Ý <Ý GÝ KÝ nÝ .Ý JÝ 7Ý +Ý 0å ç ?÷÷ ÷ ÷ ÷ ÷ ÷ ÷ ÷@ /Ý 'æÝ2Ý'å#ð€ô8ô@ ð \]ñY
Ø ðY
Ø.XðY
àõY
ðx=Ø"ð=àô=ô@0ô+ð.*/Ø-ð*/Ø=Gð*/à-ô*/ôZð !%ðØ"ðàðð õô:ð>Øðà
ðð ðð ô	ô"ô +ô ô> ô ð67BåPô0¨+ô 0ôlð. àefñOØðOØ*ðOØ8bðOàôOó ðOôdð óó ðð. óó ðô 7$õtøðs ó BØ&AÒ#ðBús   ÅF ÆF&Æ%F&