o
    iN>                     @  s  d dl mZ d dlZd dlZd dlmZ d dl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mZmZ d dlmZ d dlmZ d dlmZ d d	lmZ d
dlmZ d
dlmZmZm Z  d
dlm!Z!m"Z# d
dl$m%Z% d
dl&m'Z' d
dl(m)Z) d
dl*m+Z+m,Z,m-Z-m.Z. d
dl"m/Z/ ddl0m1Z1 e2e3dd Z4ed Z5ed Z6ed Z7ed Z8e5e6B e7B e8B Z9G dd deddZ:dZ;eG dd  d Z<G d!d" d"ej=Z=G d#d$ d$ej>Z>dS )%    )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   )create_access_tokenLK_OPENAI_DEBUG)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-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-litezgoogle/gemini-2.0-flashzgoogle/gemini-2.0-flash-litezmoonshotai/kimi-k2-instruct)zdeepseek-ai/deepseek-v3zdeepseek-ai/deepseek-v3.2c                   @  s   e Zd ZU ded< ded< ded< ded< ded	< d
ed< ded< ded< ded< ded< ded< ded< ded< ded< ded< ded< ded< ded< ded< ded < ded!< ded"< d#ed$< d%ed&< d'ed(< d)S )*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_penaltystrprompt_cache_keyzReasoningEffort | Nonereasoning_effort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_choiceN__name__
__module____qualname____annotations__ rD   rD   ^/var/www/html/livekit_bhavya/venv/lib/python3.10/site-packages/livekit/agents/inference/llm.pyr#   H   s4   
 r#   F)totalz&https://agent-gateway.livekit.cloud/v1c                   @  s>   e Zd ZU ded< ded< ded< ded< ded< d	ed
< dS )_LLMOptionsLLMModels | strmodel
str | Noneproviderr0   base_urlapi_key
api_secretz&ChatCompletionOptions | dict[str, Any]extra_kwargsNr?   rD   rD   rD   rE   rG   k   s   
 rG   c                      sz   e Zd Zddddddd* fddZd+ddZed,ddZed-ddZed-ddZ	de
eeeedd.d(d)Z  ZS )/LLMN)rK   rL   rM   rN   rO   rI   rH   rK   rJ   rL   rM   rN   rO   -ChatCompletionOptions | dict[str, Any] | NonereturnNonec          
        s   t    |r	|ntjdt}|r|n	tdtdd}|s$td|r(|n	tdtdd}	|	s8tdt|||||	|pAi d	| _	t
jt| j	j| j	j| j	jtjtjd
dddddtjdddddd| _d S )NLIVEKIT_INFERENCE_URL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)rI   rK   rL   rM   rN   rO   g      .@g      @)connectreadwritepoolT2   x   )max_connectionsmax_keepalive_connectionskeepalive_expiry)timeoutfollow_redirectslimits)rM   rL   http_client)super__init__osenvirongetDEFAULT_BASE_URLgetenv
ValueErrorrG   _optsopenaiAsyncClientr!   rM   rN   rL   httpxTimeoutLimits_client)
selfrI   rK   rL   rM   rN   rO   lk_base_url
lk_api_keylk_api_secret	__class__rD   rE   rh   v   sL   

zLLM.__init__c                   s   | j  I d H  d S )N)ru   closerv   rD   rD   rE   aclose   s   z
LLM.acloser0   c                 C  s   | |S )z)Create a LLM instance from a model stringrD   )clsrI   rD   rD   rE   from_model_string      zLLM.from_model_stringc                 C  s   | j jS )z)Get the model name for this LLM instance.)ro   rI   r}   rD   rD   rE   rI      r   z	LLM.modelc                 C  s   dS )NlivekitrD   r}   rD   rD   rE   rK      s   zLLM.provider)toolsconn_optionsr-   r>   response_formatrO   chat_ctxr   r   list[Tool] | Noner   r   r-   NotGivenOr[bool]r>   NotGivenOr[ToolChoice]r   UNotGivenOr[completion_create_params.ResponseFormat | type[llm_utils.ResponseFormatT]]NotGivenOr[dict[str, Any]]	LLMStreamc                C  s
  i }t |r|| t |r|n| jjdt}t |r!||d< | jjdt}	t |r/|n|	}t |rTt|trJdd|d d id}
|
|d< n
|dv rT|}
|
|d< t |r_t	||d< || jj t
| jj| jj| j_t| | jj| jjd| j||pg ||d		S )
Nr-   r>   functionname)typer   )autorequirednoner   T)rI   rK   strict_tool_schemaclientr   r   r   rO   )r   updatero   rO   rk   r   
isinstancedict	llm_utilsto_openai_response_formatr!   rM   rN   ru   r   rI   rK   )rv   r   r   r   r-   r>   r   rO   extraextra_tool_choiceoai_tool_choicerD   rD   rE   chat   sF   


zLLM.chat)rI   rH   rK   rJ   rL   rJ   rM   rJ   rN   rJ   rO   rQ   rR   rS   rR   rS   )rI   r0   rR   rP   )rR   r0   )r   r   r   r   r   r   r-   r   r>   r   r   r   rO   r   rR   r   )r@   rA   rB   rh   r~   classmethodr   propertyrI   rK   r   r   r   __classcell__rD   rD   rz   rE   rP   u   s*    
8rP   c                      s:   e Zd Zdddd& fddZd'ddZd(d$d%Z  ZS ))r   Nrp   )rK   provider_fmtllm_vLLM | llm.LLMrI   rH   rK   rJ   r   r,   r   openai.AsyncClientr   llm.ChatContextr   
list[Tool]r   r   rO   dict[str, Any]r   r0   rR   rS   c       	           sN   t  j||||d || _|| _|
| _|| _|| _|| _|	| _t	
|| _d S )N)r   r   r   )rg   rh   _model	_provider_provider_fmt_strict_tool_schemaru   _llm_extra_kwargsr   ToolContext	_tool_ctx)rv   r   rI   rK   r   r   r   r   r   rO   r   rz   rD   rE   rh      s   zLLMStream.__init__c              
     sp  d | _ d | _d | _d | _d | _d | _d}z| jj| jd\}}t	t
t | jjd| jd}trB| jdt}tjd|||dd | jsL| jdd  | jr[| jd	i }| j|d
< | jjjjdt	t
t ||pktj| j ddidt!"| j#j$d| jI d H  | _ }t%& }|4 I d H ` |2 zO3 d H W }	|	j'D ]}
| (|	j)|
|}|d urd}| j*+| q|	j,d urd}|	j,j-}|r|j.nd}t/j0|	j)t/j1|	j,j2|	j,j3|pd|	j,j4dd}| j*+| q6 W d   I d H  W d S 1 I d H sw   Y  W d S  tj5y
   t5|dd  tj6y% } zt6|j7|j8|j9|j:|dd d }~w t;y7 } zt<|d|d }~ww )NT)formatrp   )strictr>   zchat.completions.create)fnc_ctxr>   r   )r   extra_headerszX-LiveKit-Inference-Providerinclude_usage)messagesr   rI   stream_optionsstreamrc   Fr   )completion_tokensprompt_tokensprompt_cached_tokenstotal_tokens)idusage)	retryable)status_code
request_idbodyr   rD   )=_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   rk   r   r   debug_toolspopr   
setdefaultru   r   completionscreater   rp   omitr   rr   rs   _conn_optionsrc   asyncioEventchoices_parse_choicer   	_event_chsend_nowaitr   prompt_tokens_detailscached_tokensr   	ChatChunkCompletionUsager   r   r   r   r   messager   r   r   	Exceptionr   )rv   r   r   _tool_schemasr>   headersr   thinkingchunkchoice
chat_chunktokens_detailsr   usage_chunkerD   rD   rE   _run  s   



	2zLLMStream._runr   r   r   r   asyncio.Eventllm.ChatChunk | Nonec                 C  s  |j }|d u r	d S |jr|jD ]u}|jsqd }| jrO|jrO|j| jkrOtj|tj	d|j
tj| jp1d| jp5d| jp9d| jdgdd}d  | _ | _| _d | _|jjro|j| _|j| _|jj| _|jjped| _t|dd | _n|jjr||  j|jj7  _|d ur|  S q|jdv r| jrtj|tj	d|j
tj| jpd| jpd| jpd| jdgdd}d  | _ | _| _d | _|S t|j
||_
t|dd }|j
s|sd S tj|tj	|j
d|ddS )	N	assistantrW   )	argumentsr   call_idr   )rolecontent
tool_calls)r   deltaextra_content)r   r6   )r   r   r   )r   r   r   r   r   indexr   r   r   ChoiceDeltar   FunctionToolCallr   r   r   r   r   getattrfinish_reasonr   strip_thinking_tokens)rv   r   r   r   r   tool
call_chunkdelta_extrarD   rD   rE   r   d  s   


zLLMStream._parse_choice)r   r   rI   rH   rK   rJ   r   r,   r   r   r   r   r   r   r   r   rO   r   r   r0   rR   rS   r   )r   r0   r   r   r   r   rR   r   )r@   rA   rB   rh   r   r   r   rD   rD   rz   rE   r      s    
Rr   )?
__future__r   r   ri   dataclassesr   typingr   r   r   rr   rp   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   rW   r   _exceptionsr   r   r   r   r   r   llm.chat_contextr   llm.tool_contextr   logr   typesr   r   r   r   r   _utilsr!   intrm   r   OpenAIModelsGoogleModels
KimiModelsDeepSeekModels	LLMModelsr#   rl   rG   rP   r   rD   rD   rD   rE   <module>   sP     
 	 