+
    ~jM                      a  0 t $ ^ RIHt ^ RIt^ RIt^ RIHt ^ RIHtH	t	H
t
 ^ RIt^ RIt^ RIHtHtHtHtHtHt ^ RIHt ^ RIHt ^ RIHt ^ R	IHt ^R
IHt ^RIHtH t H!t! ^RIH"t"H#t$ ^RI%H&t& ^RI'H(t( ^RI)H*t* ^RI+H,t,H-t-H.t.H/t/ ^RI#H0t0 ^RI1H2t2H3t3H4t4H5t5H6t6 ]7! ]Pp                  ! R^ 4      4      t90 R0mt:R];R&   0 R1mt<R];R&   R]:R]:R]:R]:R]<R]<R]</t=R];R&   R R!0t>R];R"&   R2R# R$ llt?]	R3,          t@]	R4,          tA]	R%,          tB]	R5,          tC]	R6,          tD]@]A,          ]B,          ]C,          ]D,          tE]	R7,          tF ! R& R']R(R)7      tG] ! R* R+4      4       tH ! R, R-]P                  4      tI ! R. R/]P                  4      tJR# )8    )annotationsN)	dataclass)AnyLiteralcast)ChatCompletionChunkChatCompletionMessageParam$ChatCompletionPredictionContentParam#ChatCompletionToolChoiceOptionParamChatCompletionToolParamcompletion_create_params)Choice)ReasoningEffort)Metadata)	TypedDict)llm)APIConnectionErrorAPIStatusErrorAPITimeoutError)
ToolChoiceutils)ChatContext)Tool)logger)DEFAULT_API_CONNECT_OPTIONS	NOT_GIVENAPIConnectOptions
NotGivenOr)is_given)HEADER_INFERENCE_PRIORITYHEADER_INFERENCE_PROVIDERcreate_access_tokenget_default_inference_urlget_inference_headersLK_OPENAI_DEBUGzset[str]_REASONING_UNSUPPORTED_PARAMS!_XAI_REASONING_UNSUPPORTED_PARAMSo1o3o4zgpt-5zgrok-4-1-fast-reasoningzgrok-4.20-0309-reasoningzgrok-4.20-multi-agentzdict[str, set[str]]_UNSUPPORTED_PARAMSzgpt-5.2zgpt-5.4,_REASONING_EFFORT_TOOL_INCOMPATIBLE_PREFIXESc               (    V ^8  d   QhRRRRRRRR/# )   modelstrparamsdict[str, Any]toolszlist[Any] | Nonereturn )formats   "q/Users/mitch_tango/dev/rabbit-r1-livekit/agent/.venv/lib/python3.14/site-packages/livekit/agents/inference/llm.py__annotate__r8   M   s,      &/?    c                  a RV 9   d   V P                  R4      R,          MT o\        P                  4        FI  w  r4SP                  V4      '       g   K  VP                  4        UUu/ uF  w  rVWT9  g   K  WVbK  	  ppp M	  V'       du   \        ;QJ d#    V3R l\
         4       F  '       g   K   RM	  RM! V3R l\
         4       4      '       d-   VP                  4        UUu/ uF  w  rVVR8w  g   K  WVbK  	  pppV# u uppi u uppi )zRemove parameters that are not supported by the given model.

Strips any provider prefix (e.g. ``openai/o3-pro`` -> ``o3-pro``) before
matching against known model prefixes.
/c              3  F   <"   T F  pSP                  V4      x  K  	  R # 5iN)
startswith).0p
model_names   & r7   	<genexpr>*drop_unsupported_params.<locals>.<genexpr>Z   s#      *VQ
a  *Vs   !TFreasoning_effort)splitr+   itemsr>   anyr,   )r/   r1   r3   prefixunsupportedkvrA   s   &&&    @r7   drop_unsupported_paramsrM   M   s     *-S!"%5J288:  (('-||~N~tq9Mdad~FN  ;  *V *V   $*<<>M>41Q:L5L$!$>MM O
 Ns   (
D7D'D7Dzmoonshotai/kimi-k2-instructc                     ] tR t^t$ R]R&   R]R&   R]R&   R]R&   R]R	&   R
]R&   R]R&   R]R&   R]R&   R]R&   R]R&   R]R&   R]R&   R]R&   R]R&   R]R&   R]R&   R]R&   R]R &   R]R!&   R]R"&   R]R#&   R]R$&   R%]R&&   R']R(&   R)]R*&   R+tR,# )-ChatCompletionOptionszfloat | Nonefrequency_penaltyzdict[str, int] | None
logit_biaszbool | Nonelogprobsz
int | Nonemax_completion_tokens
max_tokenszMetadata | Nonemetadataz%list[Literal['text', 'audio']] | None
modalitiesnboolparallel_tool_callsz+ChatCompletionPredictionContentParam | None
predictionpresence_penaltyr0   prompt_cache_keyz"Literal['in_memory', '24h'] | Noneprompt_cache_retentionzReasoningEffort | NonerD   safety_identifierseedz>Literal['auto', 'default', 'flex', 'scale', 'priority'] | Noneservice_tierzstr | None | list[str] | Nonestopstoretemperaturetop_logprobstop_puserz'Literal['low', 'medium', 'high'] | None	verbosityz)completion_create_params.WebSearchOptionsweb_search_optionsr   tool_choicer5   N__name__
__module____qualname____firstlineno____annotations____static_attributes__r5   r9   r7   rO   rO      s    ##%%%%55M;;"">>,,
PP
''
I66AA r9   rO   F)totalc                  ^    ] tR t^t$ R]R&   R]R&   R]R&   R]R&   R]R&   R	]R
&   R]R&   RtR# )_LLMOptionsLLMModels | strr/   
str | Noneproviderr0   base_urlapi_key
api_secretInferenceClass | Noneinference_classz&ChatCompletionOptions | dict[str, Any]extra_kwargsr5   Nrj   r5   r9   r7   rs   rs      s)    MLO**88r9   rs   c                     a  ] tR t^tRRRRRRRRRRRR/R V 3R	 llltR
 R lt]R R l4       tR]R]/R R llt	]
R R l4       t]
R R l4       tRRR]R]R]R]R]R]/R R lltRtV ;t# )LLMrv   Nrw   rx   ry   r{   r|   c               8    V ^8  d   QhRRRRRRRRRRRR	R
RRR/# )r.   r/   rt   rv   ru   rw   rx   ry   r{   rz   r|   z-ChatCompletionOptions | dict[str, Any] | Noner4   Noner5   )r6   s   "r7   r8   LLM.__annotate__   s[     6
 6
6
 	6

 6
 6
 6
 /6
 D6
 
6
r9   c               	  < \         SV `  4        V'       d   TM	\        4       pV'       d   TM+\        P                  ! R \        P                  ! RR4      4      p	V	'       g   \        R4      hV'       d   TM+\        P                  ! R\        P                  ! RR4      4      p
V
'       g   \        R4      h\        TTTT	T
TT;'       g    / R7      V n        \        P                  ! \        V P                  P                  V P                  P                  4      V P                  P                  \        P                  ! \        P                  ! RR	R	R	R
7      R\        P                   ! ^2^2^xR7      R7      R7      V n        R# )LIVEKIT_INFERENCE_API_KEYLIVEKIT_API_KEY zUapi_key is required, either as argument or set LIVEKIT_API_KEY environmental variableLIVEKIT_INFERENCE_API_SECRETLIVEKIT_API_SECRETz[api_secret is required, either as argument or set LIVEKIT_API_SECRET environmental variable)r/   rv   rw   rx   ry   r{   r|   g      .@g      @)connectreadwritepoolT)max_connectionsmax_keepalive_connectionskeepalive_expiry)timeoutfollow_redirectslimits)rx   rw   http_clientN)super__init__r#   osgetenv
ValueErrorrs   _optsopenaiAsyncClientr"   rx   ry   rw   httpxTimeoutLimits_client)selfr/   rv   rw   rx   ry   r{   r|   lk_base_url
lk_api_keylk_api_secret	__class__s   &&$$$$$$   r7   r   LLM.__init__   s>    	"*h0I0K  6		BSUW8XY 	
 g   9299EY[];^_ 	
 m  ! $+%++

 ))'

(:(:DJJ<Q<QRZZ(())dCcR!%||$&"WZ

r9   c                   V ^8  d   QhRR/# r.   r4   r   r5   )r6   s   "r7   r8   r      s     # #d #r9   c                	V   "   V P                   P                  4       G R j  xL
  R #  L5ir=   )r   closer   s   &r7   aclose
LLM.aclose   s     ll  """s   )')c                    V ^8  d   QhRRRR/# )r.   r/   r0   r4   r~   r5   )r6   s   "r7   r8   r      s      c c r9   c                    V ! V4      # )z)Create a LLM instance from a model stringr5   )clsr/   s   &&r7   from_model_stringLLM.from_model_string   s     5zr9   r/   c               $    V ^8  d   QhRRRRRR/# )r.   r/   zNotGivenOr[LLMModels | str]r|   z2NotGivenOr[ChatCompletionOptions | dict[str, Any]]r4   r   r5   )r6   s   "r7   r8   r      s+     9 9 +9 I	9
 
9r9   c                   \        V4      '       d   WP                  n        \        V4      '       d   \        V4      V P                  n        R# R# )u  Update LLM configuration options.

Each option is read on the next ``chat()`` call, so a swap
takes effect on the agent's next turn without recreating the
LLM. ``extra_kwargs`` *replaces* the persistent kwargs dict
rather than merging — pass ``{}`` to clear it.
N)r   r   r/   dictr|   )r   r/   r|   s   &$$r7   update_optionsLLM.update_options   s8     E??$JJL!!&*<&8DJJ# "r9   c                   V ^8  d   QhRR/# r.   r4   r0   r5   )r6   s   "r7   r8   r     s        s  r9   c                .    V P                   P                  # )z)Get the model name for this LLM instance.)r   r/   r   s   &r7   r/   	LLM.model  s     zzr9   c                   V ^8  d   QhRR/# r   r5   )r6   s   "r7   r8   r     s      # r9   c                	    R # )livekitr5   r   s   &r7   rv   LLM.provider  s    r9   r3   conn_optionsrY   ri   response_formatc               <    V ^8  d   QhRRRRRRRRR	R
RRRRRRRR/	# )r.   chat_ctxr   r3   zlist[Tool] | Noner   r   rY   zNotGivenOr[bool]ri   zNotGivenOr[ToolChoice]r   zUNotGivenOr[completion_create_params.ResponseFormat | type[llm_utils.ResponseFormatT]]r{   zNotGivenOr[InferenceClass]r|   zNotGivenOr[dict[str, Any]]r4   	LLMStreamr5   )r6   s   "r7   r8   r     sf     =
 =
 =
 !	=

 (=
 .=
 ,=

=
 4=
 1=
 
=
r9   c               	"   / p	\        V4      '       d   V	P                  V4       \        V4      '       d   TM)V P                  P                  P	                  R \
        4      p\        V4      '       d   WIR &   V P                  P                  P	                  R\
        4      p
\        V4      '       d   TMT
p\        V4      '       d?   \        V\        4      '       d   RRRRVR,          R,          //pWR&   MVR9   d   TpWR&   \        V4      '       d   \        P                  ! V4      V	R&   V	P                  V P                  P                  4       \        V4      '       d   TMV P                  P                  p\        V P                  P                  V P                  P                  4      V P                  n        \        T V P                  P                   V P                  P"                  TRV P                  TT;'       g    . VV	R7
      # )	rY   ri   typefunctionnamer   T)	r/   rv   r{   strict_tool_schemaclientr   r3   r   r|   )autorequirednone)r   updater   r|   getr   
isinstancer   	llm_utilsto_openai_response_formatr{   r"   rx   ry   r   r   r/   rv   )r   r   r3   r   rY   ri   r   r{   r|   extraextra_tool_choiceoai_tool_choiceeffective_inference_classs   &$$$$$$$$    r7   chatLLM.chat  s    L!!LL& +,,  ((,,-BIN 	
 '((+>'( JJ3377yQ%-k%:%:k@QK  +t,,JZ)@)H I# (7m$ <<"-'6m$O$$'0'J'J?'[E#$TZZ,,-  (88Odjj>X>X 	"  34::3E3EtzzG\G\]**""ZZ((5#<<++2%
 	
r9   )r   r   )rk   rl   rm   rn   r   r   classmethodr   r   r   propertyr/   rv   r   r   rp   __classcell__r   s   @r7   r~   r~      s    6
  $	6

  $6
 #6
 "&6
 266
 GK6
 6
p#  9 .79 LU	9$      =
 $(	=

 +F=
 1:=
 /8=
 =
 7@=
 4==
 =
r9   r~   c                  V   a  ] tR tRtRRRRRR/R V 3R llltR	 R
 ltR R ltRtV ;t# )r   iX  rv   Nr{   provider_fmtr   c               H    V ^8  d   QhRRRRRRRRR	R
RRRRRRRRRRRRRR/# )r.   llm_vzLLM | llm.LLMr/   rt   rv   ru   r{   rz   r   rX   r   zopenai.AsyncClientr   zllm.ChatContextr3   z
list[Tool]r   r   r|   r2   r   r0   r4   r   r5   )r6   s   "r7   r8   LLMStream.__annotate__Y  s     0 00 	0
 0 /0 !0 #0 "0 0 (0 %0 0 
0r9   c       
        	   < \         SV `  WWR 7       W n        W0n        W@n        Wn        WPn        W`n        Wn        \        W*VR7      V n
        \        P                  ! V4      V n        R# ))r   r3   r   )r3   N)r   r   _model	_provider_inference_class_provider_fmt_strict_tool_schemar   _llmrM   _extra_kwargsr   ToolContext	_tool_ctx)r   r   r/   rv   r{   r   r   r   r3   r   r|   r   r   s   &&$$$$$$$$$$r7   r   LLMStream.__init__Y  s]     	Z! /)#5 	4UPUV/r9   c                   V ^8  d   QhRR/# r   r5   )r6   s   "r7   r8   r   s  s     TA TAD TAr9   c                		  "   R V n         R V n        R V n        R V n        R V n        R V n        Rp V P                  P                  V P                  R7      w  r#\        \        \        ,          V P                  P                  RV P                  R7      4      p\        '       d?   V P                   P#                  R\$        4      p\&        P(                  ! RRVRVRV/R	7       V P*                  '       g   V P                   P-                  RR 4       V P                   P/                  R
/ 4      pVP1                  \3        4       4       V P4                  '       d   V P4                  V\6        &   V P8                  '       d   V P8                  V\:        &   V P<                  P>                  P@                  PB                  ! RR\        \        \D        ,          V4      RT;'       g    \F        PH                  RV PJ                  RRR/RRR\L        PN                  ! V PP                  PR                  4      /V P                   B G R j  xL
 ;V n         p\T        PV                  ! 4       pT;_uu_4       GR j  xL
  V  R j  xL
  p	V	PX                   FB  p
V P[                  V	P\                  W4      pVf   K%  RpV P^                  Pa                  V4       KD  	  V	Pb                  f   Kl  RpV	Pb                  Pd                  pV'       d   VPf                  M^ p\h        Pj                  ! V	P\                  \h        Pl                  ! V	Pb                  Pn                  V	Pb                  Pp                  T;'       g    ^ V	Pb                  Pr                  \u        V	RR 4      R7      R7      pV P^                  Pa                  V4       EKD   ELz ELN ELFEDHR R R 4      GR j  xL 
  R #   + GR j  xL 
 '       g   i     R # ; i  \F        Pv                   d    \w        TR7      R h\F        Px                   d?   p\y        TPz                  TP|                  TP~                  TP                  TR7      R hR p?i\         d   p\        TR7      ThR p?ii ; i5i)NT)r6   r   )strictri   zchat.completions.createfnc_ctxr   )r   extra_headersmessagesr3   r/   stream_optionsinclude_usagestreamr   Fr`   )completion_tokensprompt_tokensprompt_cached_tokenstotal_tokensr`   )idusage)	retryable)status_code
request_idbodyr   r5   )C_oai_stream_tool_call_id	_fnc_name_fnc_raw_arguments_tool_extra_tool_index	_chat_ctxto_provider_formatr   r   listr   r   parse_function_toolsr   lk_oai_debugr   r   r   r   debug_toolspop
setdefaultr   r$   r   r!   r   r    r   r   completionscreater	   r   omitr   r   r   _conn_optionsr   asyncioEventchoices_parse_choicer   	_event_chsend_nowaitr   prompt_tokens_detailscached_tokensr   	ChatChunkCompletionUsager   r   r   getattrr   r   messager   r   r   	Exceptionr   )r   r   r   _tool_schemasri   r   r   thinkingchunkchoice
chat_chunktokens_detailsr  usage_chunkes   &               r7   _runLLMStream._runs  s     LP)-%).226'+	I	A..;;4CUCU;VKH,-33HTE]E]3^L |"0044]IN-!<%{"H ;;;""&&}d; ..99/2NM  !6!89~~~;?>>78$$$;?;P;P78.2ll.?.?.K.K.R.R /d#=>I/"11fkk/ kk/ !06	/
 / d&8&8&@&@A/ $$/ ) Dv }}Hvv#) @ @%"'--%)%7%7&%S
%1(-I NN66zB	 #0 {{.$)	).)J)JHV(D(D\]&)mm$xx"%"5"527++2O2O.3kk.G.G5B5G5Ga-2[[-E-E-4UND-Q#	' 22;?C) @6 vvvvv0 %% 	A!I6D@$$ 	 		MM<<VV#   	A$y9q@	As   -RCO2 4BO2 <A"O2 AO2 =N7>.O2 ,N:-O2 0O3O 7N=
8O ;.O.,OO?A+O+AO7O2 :O2 =O  OO2 OO2 RO/	O
O/	'O/	)O2 -R/O2 24R'R(9Q!!R.R/Q<<RRc               (    V ^8  d   QhRRRRRRRR/# )	r.   r   r0   r"  r   r   zasyncio.Eventr4   zllm.ChatChunk | Noner5   )r6   s   "r7   r8   r     s2     U
 U
U
%U
1>U
	U
r9   c                	*   VP                   pVf   R # VP                  '       Ed   VP                   EF  pVP                  '       g   K  R pV P                  '       d   VP                  '       d   VP
                  V P                  8w  d   \        P                  ! T\        P                  ! RVP                  \        P                  ! V P                  ;'       g    RV P                  ;'       g    RV P                  ;'       g    RV P                  R7      .R7      R7      pR ;V n        ;V n        V n        R V n        VP                  P                  '       dv   VP
                  V n        VP                  V n        VP                  P                  V n        VP                  P                   ;'       g    RV n        \#        VRR 4      V n        MIVP                  P                   '       d.   V ;P                  VP                  P                   ,          un        Vf   EK  Vu # 	  VP$                  R	9   d   V P                  '       d   \#        VRR 4      p\        P                  ! T\        P                  ! RVP                  T\        P                  ! V P                  ;'       g    RV P                  ;'       g    RV P                  ;'       g    RV P                  R7      .R7      R7      pR ;V n        ;V n        V n        R V n        V# \&        P(                  ! VP                  V4      Vn
        \#        VRR 4      pVP                  '       g   V'       g   R # \        P                  ! V\        P                  ! VP                  RVR7      R7      # )
N	assistantr   )	argumentsr   call_idr   )rolecontent
tool_calls)r   deltaextra_content)r.  r/  r   r0  )r/  r.  r   )r0  ra   )r1  r0  r   r   r   indexr  r   r  ChoiceDeltar/  FunctionToolCallr  r   r  r   r,  r  finish_reasonr   strip_thinking_tokens)	r   r   r"  r   r1  tool
call_chunkfinish_extradelta_extras	   &&&&     r7   r  LLMStream._parse_choice  s     =((}}}!
%%%$'''djjDDTDT6T!$!oo!,$)MM # 4 4.2.E.E.K.K)-)=)=2,0,>,>,D,D"*.*:*:	!"("J UYXD&X$:Q'+D$==%%%'+zzD$)-D&%)]]%7%7DN.2mm.E.E.K.KD+'.t_d'KD$]],,,++t}}/F/FF+)%%G )J #99d>P>P>P"5/4@Loo$!MM&,,&*&=&=&C&C!%!5!52$($6$6$<$<""&"2"2	 	J  MQPDP$2I#D!77xP e_d;}}}[}}// !
 	
r9   )r   r   r   r  r   r   r   r   r   r   r   r   r   r  r  )	rk   rl   rm   rn   r   r'  r  rp   r   r   s   @r7   r   r   X  s?    0
  $0 260 %0 04TAlU
 U
r9   r   >   rW   re   rR   rQ   rc   rd   r[   rP   >   ra   r[   rP   r=   )zopenai/gpt-4ozopenai/gpt-4o-minizopenai/gpt-4.1zopenai/gpt-4.1-minizopenai/gpt-4.1-nanozopenai/gpt-5zopenai/gpt-5-minizopenai/gpt-5-nanozopenai/gpt-5.1zopenai/gpt-5.1-chat-latestzopenai/gpt-5.2zopenai/gpt-5.2-chat-latestzopenai/gpt-5.3-chat-latestzopenai/gpt-5.4zopenai/gpt-5.4-minizopenai/gpt-oss-120b)zgoogle/gemini-3-prozgoogle/gemini-3-flashzgoogle/gemini-2.5-prozgoogle/gemini-2.5-flashzgoogle/gemini-2.5-flash-lite)zdeepseek-ai/deepseek-v3zdeepseek-ai/deepseek-v3.2)zxai/grok-4-1-fast-non-reasoningzxai/grok-4-1-fast-reasoningz xai/grok-4.20-0309-non-reasoningzxai/grok-4.20-0309-reasoningzxai/grok-4.20-multi-agent-0309)prioritystandard)K__conditional_annotations__
__future__r   r  r   dataclassesr   typingr   r   r   r   r   openai.types.chatr   r	   r
   r   r   r   'openai.types.chat.chat_completion_chunkr   $openai.types.shared.reasoning_effortr   openai.types.shared_paramsr   typing_extensionsr   r   r   _exceptionsr   r   r   r   r   r   llm.chat_contextr   llm.tool_contextr   logr   typesr   r   r   r   r   _utilsr    r!   r"   r#   r$   intr   r  r&   ro   r'   r+   r,   rM   OpenAIModelsGoogleModels
KimiModelsDeepSeekModels	XAIModels	LLMModelsInferenceClassrO   rs   r~   r   )r?  s   @r7   <module>rV     s   " "  	 ! % %    ; @ / '  M M 0 * #  Y Y   299.23	+ x 	/ !8  	
'
'
'*@ A>, (  ;DY9O ,h O( & $ 23
!
 &	 <'*4~E	Q	/0IU B 9 9 9Y
#'' Y
xF
 F
r9   