
    /j{W                       S SK Jr  S SKrS SKrS SKrS SKJr  S SKJr  S SK	J
r
JrJr  S SKrS SKrS SKrS SKJrJrJrJr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KJ r J!r!J"r"J#r#  S SK$J%r%  S SK&J'r'  S SK(J)r)J*r*J+r+J,r,J-r-J.r.J/r/J0r0J1r1  S SK2J3r3  S SK4J5r5  SSK6J7r7  SSK8J9r9  \S   r:Sr; " S S5      r<\ " S S5      5       r= " S S\R|                  5      r> " S S\R~                  5      r?g)    )annotationsN)AsyncGenerator)	dataclass)AnyLiteralcast)APIConnectionErrorAPIStatusErrorAPITimeoutErrorllmutils)drop_unsupported_params)
ToolChoice)ChatContextChatItem)Tool)DEFAULT_API_CONNECT_OPTIONS	NOT_GIVENAPIConnectOptions
NotGivenOr)is_given)	Reasoning)	ResponseCompletedEventResponseCreatedEventResponseErrorEventResponseFailedEventResponseInputParamResponseOutputItemDoneEventResponseTextDeltaEvent	ToolParamresponse_create_params)ResponseStreamEvent)ResponsesModel   )logger)_supports_reasoning_effort)autodefaultflexscalepriorityz!wss://api.openai.com/v1/responsesc                  d    \ rS rSr S
       SS jjrSS jrSS jrSS jrSS jrSS jr	S	r
g)_ResponsesWebsocket3   Nc                   Xl         U=(       d    [        R                  U l        U(       a  UO[        U l        S U l        [        R                  [        R                     " U R                  U R                  SS9U l        g )Ni  )
connect_cbclose_cbmax_session_duration)_api_keyr   timeout_timeoutOPENAI_RESPONSES_WS_URL	_base_url_sessionr   ConnectionPoolaiohttpClientWebSocketResponse
_create_ws	_close_ws_pool)selfapi_keyr4   base_urls       U/app/agent/.venv/lib/python3.13/site-packages/livekit/plugins/openai/responses/llm.py__init___ResponsesWebsocket.__init__4   s]      F#>#F#F%-3J6:))'*I*IJ^^!%

    c                z    U R                   c#  [        R                  R                  5       U l         U R                   $ N)r8   r   http_contexthttp_sessionr?   s    rB   _ensure_http_session(_ResponsesWebsocket._ensure_http_sessionC   s,    == !..;;=DM}}rE   c                N  #     [         R                  " U R                  5       R                  U R                  SSU R
                   30S9U5      I S h  vN $  N! [        R                   a  n[        S5      UeS nAf[         R                   a  n[        S5      UeS nAff = f7f)NAuthorizationzBearer )headersz/failed to connect to OpenAI Responses WebSocketz2timed out connecting to OpenAI Responses WebSocket)
asynciowait_forrK   
ws_connectr7   r3   r:   ClientErrorr	   TimeoutError)r?   r4   es      rB   r<   _ResponsesWebsocket._create_wsH   s     	b ))))+66NN,.GH 7      "" 	_$%VW]^^## 	b$%YZ`aa	bsG   B%AA AA B%A B".A::B"BB""B%c                @   #    UR                  5       I S h  vN   g  N7frG   )close)r?   wss     rB   r=   _ResponsesWebsocket._close_wsV   s     hhjs   c                T   #    U R                   R                  5       I S h  vN   g  N7frG   )r>   acloserJ   s    rB   r\   _ResponsesWebsocket.acloseY   s     jj!!!s   (&(c           	      #    SS jn [         R                  " XS9nU R                  R                  U R                  S9 IS h  vN n UR                  U5      I S h  vN    UR                  5       I S h  vN nUR                  [        R                  R                  :X  aN  UR                  n[        U[        R                   5      (       a  UR"                  OSn[%        ['        U5      USS9UeUR                  [        R                  R(                  [        R                  R*                  [        R                  R,                  4;   a:  [%        S	UR                  =(       d    SS
UR                  < SUR.                  < 3S9eUR                  [        R                  R0                  :w  a  GMO  [         R2                  " UR                  5      n	U	7v   U	S   S;   a   S S S 5      IS h  vN   g GM  ! [         a  n[        SU 35      UeS nAff = f GN GN! [         a  n[        S5      UeS nAff = f GN NP! , IS h  vN  (       d  f       g = f7f)Nc                    [        U [        R                  5      (       a  U R                  SS9$ [	        S[        U 5       35      e)Njson)modezunexpected type )
isinstanceopenai	BaseModel
model_dump	TypeErrortype)os    rB   _default7_ResponsesWebsocket.generate_response.<locals>._default]   s=    !V--..|||00.tAwi899rE   )r(   zfailed to serialize request: )r4   z%failed to send request over WebSocketFstatus_code	retryablez9OpenAI Responses WebSocket connection closed unexpectedlyzraw_msg.data=z raw_msg.extra=)rm   bodyrg   )response.completedresponse.failederror)rh   objectreturnrs   )r`   dumpsrf   r	   r>   
connectionr5   send_str	Exceptionreceiverg   r:   	WSMsgTypeERRORdatarb   ClientResponseErrorstatusr
   strCLOSEDCLOSECLOSINGextraTEXTloads)
r?   msgri   r|   rU   rY   raw_msgexcrm   events
             rB   generate_response%_ResponsesWebsocket.generate_response\   s    	:
	Q::c4D ::(((??2Ykk$'''  "

,<<7#4#4#:#::!,,C0:3@[@[0\0\#**bdK(CkU <<%%,,%%++%%--$ 
 )S$+LL$6B -.>/?@ 
 <<7#4#4#9#99

7<<0=$VV= @??   	Q$'DQC%HIqP	Q @' Y()PQWXXY - @???s   IG5 'IHIH?
HHH#H?7H:8E)H?!I,H=-I2H?5
H?HHIH
H7&H22H77H?=I?IIII)r3   r7   r>   r8   r5   rG   )r@   
str | Noner4   zfloat | NonerA   r   rt   None)rt   zaiohttp.ClientSession)r4   floatrt   aiohttp.ClientWebSocketResponse)rY   r   rt   r   rt   r   )r   dictrt   zAsyncGenerator[dict, None])__name__
__module____qualname____firstlineno__rC   rK   r<   r=   r\   r   __static_attributes__ rE   rB   r-   r-   3   sD    QU
!
,8
DN
	

b")rE   r-   c                      \ rS rSr% S\S'   S\S'   S\S'   S\S	'   S
\S'   S\S'   S\S'   S\S'   S\S'   S\S'   S\S'   Srg)_LLMOptions   str | ResponsesModelmodelNotGivenOr[str]userNotGivenOr[float]temperatureNotGivenOr[bool]parallel_tool_calls<NotGivenOr[ToolChoice | Literal['auto', 'required', 'none']]tool_choicestoreNotGivenOr[Reasoning]	reasoningNotGivenOr[dict[str, str]]metadataNotGivenOr[ServiceTier]service_tierNotGivenOr[int]max_output_tokensbooluse_websocketr   N)r   r   r   r   __annotations__r   r   rE   rB   r   r      sD    
""))MM$$(())&&rE   r   c                     ^  \ rS rSrS\\SS\\\\\\\\\SS.                               SU 4S jjjrSS jr\SS j5       r\SS	 j5       r	S\
\\\S
.             SS jjrSS jrSrU =r$ )LLM   zgpt-4.1NT)r   r@   rA   clientr   r   r   r   r   r   r   r   r   r   r4   c                 > [         TU ]  5         [        U	5      (       d)  [        U5      (       a  US;   a
  [	        SS9n	O	[	        SS9n	Ub  U(       a  [
        R                  " S5        Sn[        UUUUU
UUU	UUUS9U l        X@l	        USL U l
        SU l        S	U l        SU l        S
U l        SU l        [         ["           " 5       U l        U(       au  [        U5      (       a  UO[&        R(                  R+                  S5      nU(       d  [-        S5      e[/        UUb  UR0                  OS[        U5      (       a  UOSS9U l        gU=(       d    [2        R4                  " [        U5      (       a  UOS[        U5      (       a  UOSS	[6        R4                  " U(       a  UO[6        R8                  " SSSSS9S[6        R:                  " SSSS9S9S9U l	        g)z
Create a new instance of OpenAI Responses LLM.

``api_key`` must be set to your OpenAI API key, either using the argument or by setting the
``OPENAI_API_KEY`` environmental variable.
)zgpt-5.1zgpt-5.2zgpt-5.4none)effortminimalNzDuse_websocket is ignored when a custom client is provided, disablingF)r   r   r   r   r   r   r   r   r   r   r   r    OPENAI_API_KEYzYOpenAI API key is required, either as argument or set OPENAI_API_KEY environment variable)r@   r4   rA   g      .@g      @)connectreadwritepoolT2   x   )max_connectionsmax_keepalive_connectionskeepalive_expiry)r4   follow_redirectslimits)r@   rA   max_retrieshttp_client)superrC   r   r&   r   r%   warningr   _opts_client_owns_client_ws_active_streams_parallel_generation_prev_resp_id_prev_chat_ctxsetr   _pending_tool_callsosenvironget
ValueErrorr-   r   rc   AsyncClienthttpxTimeoutLimits)r?   r   r@   rA   r   r   r   r   r   r   r   r   r   r   r   r4   resolved_api_key	__class__s                    rB   rC   LLM.__init__   s   2 		""'A%'H'H99%V4	%Y7	-NNab!M # 3#%/'

 "dN/3$%*/!26#&s8: *27*;*;wP`Aa# ;  +(+2+>D%-h%7%7TDH " V%7%7#+G#4#4$%-h%7%7T!-- $t#SsS%) <<(*24),
	&DLrE   c                  #    U R                   (       a"  U R                   R                  5       I S h  vN   U R                  (       a5  U R                  (       a#  U R                  R	                  5       I S h  vN   g g g  NK N	7frG   )r   r\   r   r   rX   rJ   s    rB   r\   
LLM.aclose   sU     88((//###,,$$&&& ". $&s"   /BA=AB5A?6B?Bc                .    U R                   R                  $ rG   )r   r   rJ   s    rB   r   	LLM.model   s    zzrE   c                $   U R                   R                  (       a9  U R                  b,  SSKJn  U" U R                  R
                  5      R                  $ U R                  b/  U R                  R
                  R                  R                  S5      $ g)Nr   )urlparsezutf-8r   )	r   r   r   urllib.parser   r7   netlocr   decode)r?   r   s     rB   providerLLM.provider   sd    ::##(<-DHH../666<<#<<))0077@@rE   )toolsconn_optionsr   r   extra_kwargsc               F   0 n[        U5      (       a  UR                  U5        [        U R                  R                  5      (       a  U R                  R                  US'   [        U R                  R                  5      (       a  U R                  R                  US'   [        U R                  R
                  5      (       a  U R                  R
                  US'   [        U R                  R                  5      (       a  U R                  R                  US'   [        U R                  R                  5      (       a  U R                  R                  US'   [        U R                  R                  5      (       a  U R                  R                  US'   [        U R                  R                  5      (       a  U R                  R                  US'   [        U5      (       a  UOU R                  R                  n[        U5      (       a  XGS'   [        U5      (       a  UOU R                  R                  n[        U5      (       a1  [        U[        5      (       a  S	US	   S
   S.nXS'   OUS;   a  UnXS'   Un	U R                  R                  SLa  U R                  S:X  a  U R                  b  U R                   (       a  [#        U R                  R$                  5      n
['        UR$                  S U
 S9R)                  U R                  5      (       aH  U R+                  UR$                  U
S  5      (       a%  ['        UR$                  U
S  S9n	U R                   US'   [-        U U R                  R.                  SU R0                  (       a  U R0                  OS U	U=(       d    / UUUS9	$ )Nr   r   r   r   r   r   r   r   functionname)rg   r   r   )r'   requiredr   Fr   )itemsprevious_response_idT)r   strict_tool_schemar   chat_ctxr   r   r   full_chat_ctx)r   updater   r   r   r   r   r   r   r   r   r   rb   r   r   r   r   lenr   r   is_equivalent_pending_tool_calls_completed	LLMStreamr   r   )r?   r   r   r   r   r   r   r   oai_tool_choiceinput_chat_ctxns              rB   chatLLM.chat  s    L!!LL&DJJ''(( $

 3 3E*DJJOO$$ JJOOE&MDJJ**++#'::#9#9E- DJJ$$%%!ZZ--E'NDJJ(())!%!5!5E+DJJ++,,$(JJ$;$;E.!DJJ0011)-)E)EE%& $,,?#@#@djjFdFd 	 '((+>'(%-k%:%:k

@V@VK  +t,,&'
3F;# (7m$ <<"-'6m$!JJE)$$)##/""D''--.A!34BB## 44X^^AB5GHH!,8>>!"3E!F040B0B,-**""##'<<4<<T#+2%"

 
	
rE   c                   ^ U R                   (       d  gU Vs1 s H   o"R                  S:X  d  M  UR                  iM"     snm[        U4S jU R                    5       5      $ s  snf )NTfunction_call_outputc              3  ,   >#    U  H	  oT;   v   M     g 7frG   r   ).0call_idcompleted_tool_callss     rB   	<genexpr>4LLM._pending_tool_calls_completed.<locals>.<genexpr>`  s     [BZw22BZs   )r   rg   r  all)r?   r   itemr  s      @rB   r   !LLM._pending_tool_calls_completedY  sY    '' &+ 
%*Tii;Q.QLDLLU 
 [$BZBZ[[[ 
s
   A!A!)	r   r   r   r   r   r   r   r   r   ) r   r   r@   r   rA   r   r   openai.AsyncClient | Noner   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r4   zhttpx.Timeout | Nonert   r   r   )rt   r   )r   r   r   zlist[Tool] | Noner   r   r   r   r   zNotGivenOr[ToolChoice]r   zNotGivenOr[dict[str, Any]]rt   r   )r   zlist[ChatItem]rt   r   )r   r   r   r   r   rC   r\   propertyr   r   r   r   r   r   __classcell__r   s   @rB   r   r      s    '0#,$-,0" ))209+4T]"+/809-6(,#Y $Y !	Y
 "Y *Y Y Y 'Y .Y )Y RY  Y -Y .Y  +!Y" &#Y$ 
%Y Yv'       $(*E09.73<P
 P
 !	P

 (P
 .P
 ,P
 1P
 
P
d\ \rE   r   c                     ^  \ rS rSr                    SU 4S jjrSS jrSS jrSS jrSS jrSS jr	SS jr
SS	 jrSS
 jrSS jr    SS jrSrU =r$ )r   ic  c                  > [         T
U ]  XXgS9  X l        X0l        SU l        SU l        [        [           " 5       U l        X@l	        Xl
        [        X(5      U l        U	R                  5       U l        g )N)r   r   r   r   F)r   rC   _model_strict_tool_schema_response_id_response_completedr   r   r   r   _llmr   _extra_kwargscopy_full_chat_ctx)r?   r   r   r   r   r   r   r   r   r   r   s             rB   rC   LLMStream.__init__d  sh     	uX#5 !#). #&s8: 	4UI+002rE   c                  #    U R                   R                  S:  a  SU R                   l        U R                   =R                  S-  sl         U R                  5       I S h  vN   U R                   =R                  S-  sl        U R                   R                  S:X  aP  U R                   R                  (       a4  SU R                   l        S U R                   l        SU R                   l        g g g  N! U R                   =R                  S-  sl        U R                   R                  S:X  aP  U R                   R                  (       a4  SU R                   l        S U R                   l        SU R                   l        f f f = f7f)Nr   T   r   F)r  r   r   	_run_implr   r   rJ   s    rB   _runLLMStream._run}  s    99$$q(-1DII*		!!Q&!	7.."""II%%*%yy((A-$))2P2P*,		'+/		(16		. 3Q- #II%%*%yy((A-$))2P2P*,		'+/		(16		. 3Q-s2   AF C2 !C0"C2 &B
F 0C2 2BE==F c                  #    SU l         U R                  R                  SS9u  p[        R                  " U R
                  5      U l        [        [        [           U R                  R                  SU R                  S95      nU R                  R                  R                  SLa  Sn U R                  R                  c  [!        S5      eSU R"                  UUS.U R$                  EnU R                  R                  R'                  U5        S h  vN nU R)                  U5      nU R+                  U5        SnM/  S U l        Sn [        [6        R8                  [:           U R<                  R>                  R@                  " SU R"                  U[        [B        [D        -  [6        RF                  -  U5      S[H        RJ                  " U RL                  RN                  5      S
.U R$                  D6I S h  vN 5      =U l        n	U	 IS h  vN   U	  S h  vN n
U R+                  U
5        SnM   GN
 U R                   (       d	  [-        SS	9eg ! [,        [.        [0        4 a    e [2         a  n[-        US	9UeS nAff = f N Nv Nm
 S S S 5      IS h  vN    g ! , IS h  vN  (       d  f       g = f! [6        R0                   a
    [1        US	9e[6        R.                   a:  n[/        URP                  URR                  URT                  URV                  US9eS nAf[,        [.        [0        4 a    e [2         a  n[-        US	9UeS nAff = f7f)NFzopenai.responses)format)strictTz%use_websocket is True but _ws is Nonezresponse.create)rg   r   inputr   )rn   )r   r   r"  streamr4   )rm   
request_idro   rn   r   ),r  	_chat_ctxto_provider_formatr   ToolContextr   	_tool_ctxr   listr    parse_function_toolsr  r  r   r   r   RuntimeErrorr  r  r   _parse_ws_event_process_eventr	   r
   r   rx   _oai_streamrc   AsyncStreamr"   r   	responsescreater   r   Omitr   r   _conn_optionsr4   messagerm   r$  ro   )r?   r   _tool_schemasrn   payload	raw_event	parsed_evrU   r#  r   s              rB   r  LLMStream._run_impl  s    #( nn77?Q7R4ONN//"4+C+C 0 
 99??((5IE99==(&'NOO .![[%)	
 (( (,yy}}'F'Fw'O &) $ 4 4Y ?I''	2 %I PTDIE,0&&':;,,0077 "kk*"3);#;fkk#I8T# %d.@.@.H.H I ,, 
- 
 6 "6'- *e++E2$)	?&'O
 //,t<< 0&H  E(9=1DE "*v "66666
 )) ;%	::(( $II ! ||'  'H  E(9=1DEs
  B&M	)A$I H0H-H0'I <	M	B,J0 2I=
3J0 I?	J0 JJJJJ-H00I M	I:+
I55I::M	=J0 ?J0 JJJ0 JJ0 M	J-JJ-)J0 ,M	-J0 00M 5L"M7
MMM	c                r   [        UR                  S5      [        5      (       a?  SUS   ;   a6  0 UESUS   R                  5        VVs0 s H  u  p#US:w  d  M  X#_M     snn0EnUR                  SS5      nUS:X  a*  [        R
                  " 0 UR                  S0 5      EUE5      $ US:X  a  [        R
                  " U5      $ US:X  a  [        R
                  " U5      $ US:X  a  [        R
                  " U5      $ US	:X  a  [        R
                  " U5      $ US
:X  a  [        R
                  " U5      $ g s  snnf )Nresponseprompt_cache_retentionrg   r   rr   zresponse.createdzresponse.output_item.donezresponse.output_text.deltarp   rq   )rb   r   r   r   r   model_validater   r   r   r   r   )r?   r   kv
event_types        rB   r,  LLMStream._parse_ws_event  s>   
 uyy,d33(E*,==%*:%6%<%<%>%>TQ!G_B_DAD%>E YYvr*
 %445X		'28N5XRW5XYY--'66u==66.==eDD77)88??//)88??,,&55e<<%s   D3
D3
c                   Uc  g S n[        U[        5      (       a  U R                  U5        [        U[        5      (       a  U R	                  U5        [        U[
        5      (       a  U R                  U5      n[        U[        5      (       a  U R                  U5      n[        U[        5      (       a  U R                  U5      n[        U[        5      (       a  U R                  U5        Ub  U R                  R                  U5        g g rG   )rb   r   _handle_errorr   _handle_response_createdr   _handle_output_items_doner   "_handle_response_output_text_deltar   _handle_response_completedr   _handle_response_failed	_event_chsend_nowaitr?   r   chunks      rB   r-  LLMStream._process_event  s    =e/00u%e122))%0e8992259Ee344;;EBEe34433E:Ee011((/NN&&u- rE   c                    Sn UR                   (       a  [        UR                   5      OSn[        UR                  USS9e! [         a     N!f = f)Nrk   Frl   )codeintr   r
   r4  )r?   r   
error_codes      rB   rD  LLMStream._handle_error  sJ    
	,1JJUZZBJ U]]
eTT  		s   (A 
AAc                j    UR                   R                  n[        U(       a  UR                  OSSSS9e)Nrq   rk   Frl   )r<  rr   r
   r4  )r?   r   errs      rB   rI  !LLMStream._handle_response_failed  s0    nn""CKK$5
 	
rE   c                :    UR                   R                  U l        g rG   )r<  idr  r?   r   s     rB   rE  "LLMStream._handle_response_created  s    !NN--rE   c                   SU l         U R                  U R                  l        U R                  U R                  l        U R                  U R                  l        S nUR                  R                  =n(       a  [        R                  " U R                  [        R                  " UR                  UR                  UR                  (       a  UR                  R                  OSUR                   [#        UR                  SS 5      S9S9nU$ )NTr   r   )completion_tokensprompt_tokensprompt_cached_tokenstotal_tokensr   )rX  usage)r  r  r  r   r  r   r   r<  r`  r   	ChatChunkCompletionUsageoutput_tokensinput_tokensinput_tokens_detailscached_tokensr_  getattr)r?   r   rM  r`  s       rB   rH  $LLMStream._handle_response_completed  s    #' #'#6#6		 "&"3"3		(,(@(@		%NN(((5(MM$$))&+&9&9"'"4"411 */)C)C)Q)Q!&!3!3!(!NE rE   c                   S nUR                   R                  S:X  a  [        R                  " U R                  [        R
                  " SS [        R                  " UR                   R                  UR                   R                  UR                   R                  S9/S9S9nU R                  R                  UR                   R                  5        U$ )Nfunction_call	assistant)	argumentsr   r  )rolecontent
tool_callsrX  delta)r	  rg   r   ra  r  ChoiceDeltaFunctionToolCallrl  r   r  r   addrL  s      rB   rF  #LLMStream._handle_output_items_done,  s    ::??o-MM$$oo$ ,,&+jj&:&:!&$)JJ$6$6 
E $$((););<rE   c                z    [         R                  " U R                  [         R                  " UR                  SS9S9$ )Nrk  )rn  rm  rp  )r   ra  r  rr  rq  rY  s     rB   rG  ,LLMStream._handle_response_output_text_delta@  s0     }}  //%++KH
 	
rE   )r   r  r  r  r  r.  r   r  r  r  r(  )r   r   r   r   r   r   r   r  r   llm.ChatContextr   z
list[Tool]r   r   r   zdict[str, Any]r   rx  rt   r   r   )r   r   rt   ResponseStreamEvent | None)r   ry  rt   r   )r   r   rt   r   )r   r   rt   r   )r   r   rt   r   )r   r   rt   llm.ChatChunk | None)r   r   rt   rz  )r   r   rt   rz  )r   r   r   r   rC   r  r  r,  r-  rD  rI  rE  rH  rF  rG  r   r  r  s   @rB   r   r   c  s    33 $	3
 !3 *3 "3 3 (3 %3 '3 
327FEP<.&U
.,(
+
	
 
rE   r   )@
__future__r   rP   r`   r   collections.abcr   dataclassesr   typingr   r   r   r:   r   rc   livekit.agentsr	   r
   r   r   r   livekit.agents.inference.llmr   livekit.agents.llmr   livekit.agents.llm.chat_contextr   r   livekit.agents.llm.tool_contextr   livekit.agents.typesr   r   r   r   livekit.agents.utilsr   openai.typesr   openai.types.responsesr   r   r   r   r   r   r   r    r!   ,openai.types.responses.response_stream_eventr"   openai.types.shared_paramsr#   logr%   modelsr&   ServiceTierr6   r-   r   r   r   r   rE   rB   <module>r     s    "   	 * ! % %    Z Z @ ) A  * "
 
 
 M 5  /DE= R Rj   I\#'' I\Xc
 c
rE   