o
    }!g.                     @   s~  d dl Z d dlmZmZmZ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 d d	lmZ d d
lmZ d dlmZ d dlmZm Z  d dl!m!Z! d dl"m#Z# e $e%Z&	d dee de'de	e(ee(ef f fddZ)de(de*deee( e*f fddZ+		d!dee dee de'de'de	eee f f
ddZ,e!dG dd dee Z-dS )"    N)	AnyDict	GeneratorListOptionalTupleTypeUnioncast)ValidationError)resolve_tool_choice)LLM)BaseLLMFunctionProgram)create_list_model)BasePromptTemplatePromptTemplate)Settings)Model)OpenAI)OpenAIToolCallto_openai_tool)
deprecated)parse_partial_jsonF
output_clsallow_multiplereturnc                 C   s   |rdS |   }t|d S )zDefault OpenAI tool to choose.autotitle)schemar   )r   r   r    r   a/mnt/skqttb/ctump_chatbot/chatbot/lib/python3.10/site-packages/llama_index/program/openai/base.py_default_tool_choice   s   r!   raw_str	start_idxc                 C   sr   | |d } d}t | D ](\}}|dkr|d7 }|dkr4|d8 }|dkr4| d|d  |d | f  S qd|fS )z1Extract JSON str from raw string and start index.Nr   {   }   )	enumerate)r"   r#   stack_counticr   r   r    _get_json_str    s    r,   
tool_callsverbosec           
      C   s   g }| D ]C}|j }|d usJ |jd usJ |jd usJ |r/|j}|j}td| d|  t|jtr<||j}	n||j}	||	 q|rL|S t	|dkrWt
d |d S )NzFunction call: z with args: r%   ziMultiple outputs found, returning first one. If you want to return all outputs, set output_multiple=True.r   )functionname	argumentsprint
isinstancedict	parse_obj	parse_rawappendlen_loggerwarning)
r-   r   r   r.   outputs	tool_callfunction_callr0   arguments_stroutputr   r   r    _parse_tool_calls/   s*   r@   z,Please use `FunctionCallingProgram` instead.c                   @   s  e Zd ZdZ		d"dee dededee	e
e	ef f deded	d
fddZe	
	
	
			
d#dee dee	 dee dee dededeee	e
e	ef f  ded	d fddZed	ee fddZed	efddZejded	d
fddZ	
d$dee
e	ef  deded	eeee f fddZ	
d$dee
e	ef  deded	eeee f fddZ	
d$dee
e	ef  deded	eed
d
f fddZ	
d$dee
e	ef  deded	eed
d
f fddZded	ee	 fd d!Zd
S )%OpenAIPydanticProgramzn
    An OpenAI-based function that returns a pydantic model.

    Note: this interface is not yet stable.
    Fr   llmprompttool_choicer   r.   r   Nc                 C   s(   || _ || _|| _|| _|| _|| _dS )zInit params.N)_output_cls_llm_prompt_verbose_allow_multiple_tool_choice)selfr   rB   rC   rD   r   r.   r   r   r    __init__\   s   

zOpenAIPydanticProgram.__init__prompt_template_strkwargsc           	      K   s   |pt j}t|tstdt| |jjs!td|jj d|d u r-|d u r-td|d ur9|d ur9td|d urAt	|}|pGt
||}| ||tt	||||dS )Nz6OpenAIPydanticProgram only supports OpenAI LLMs. Got: zModel name z( does not support function calling API. z2Must provide either prompt or prompt_template_str.)r   rB   rC   rD   r   r.   )r   rB   r3   r   
ValueErrortypemetadatais_function_calling_model
model_namer   r!   r
   )	clsr   rM   rC   rB   r.   r   rD   rN   r   r   r    from_defaultsm   s0   

z#OpenAIPydanticProgram.from_defaultsc                 C      | j S N)rE   rK   r   r   r    r         z OpenAIPydanticProgram.output_clsc                 C   rV   rW   rG   rX   r   r   r    rC      rY   zOpenAIPydanticProgram.promptc                 C   s
   || _ d S rW   rZ   )rK   rC   r   r   r    rC      s   

llm_kwargsargsc           
      O   s   |pi }| j di |}t| j|d}| jjdd| ji|}d|vr(| j|d< | jjd||gd|}|j}d|j	vrAt
d|j	d }	t|	| j| j| jdS )	NdescriptionrB   rD   messagestoolsr-   zDExpected tool_calls in ai_message.additional_kwargs, but none found.r   r   r.   r   )_description_evalr   rE   rG   format_messagesrF   rJ   chatmessageadditional_kwargsrO   r@   r   rI   rH   
rK   r[   r\   rN   r^   openai_fn_specr`   chat_responserf   r-   r   r   r    __call__   s0   


zOpenAIPydanticProgram.__call__c           
         s   |pi }| j di |}t| j|d}| jjdd| ji|}d|vr)| j|d< | jjd||gd|I d H }|j}d|j	vrEt
d|j	d }	t|	| j| j| jdS )	Nr]   rB   rD   r_   r-   zGExpected function call in ai_message.additional_kwargs, but none found.rb   r   )rc   r   rE   rG   rd   rF   rJ   achatrf   rg   rO   r@   r   rI   rH   rh   r   r   r    acall   s2   


zOpenAIPydanticProgram.acallc                 o   s"   |pi }| j jdd| ji|}| jdi |}t| j}t||d}d|vr.t||d< | jjd||gd|}d}	|D ]O}
|
j	j
}|d }t|dkrPq?|d d jj}|ddkrk|	dkrj|dd	 }	nq?t||	\}}	|d
ur|}| j|}| jrtd|   |V  q?d
S )zStreams a list of objects.rB   r]   rD   r_   r-   r   [r%   NzExtracted object: r   )rG   rd   rF   rc   r   rE   r   r!   stream_chatrf   rg   r8   r/   r1   findr,   r6   rH   r2   json)rK   r[   r\   rN   r`   r^   list_output_clsri   chat_response_genobj_start_idxstream_respr-   fn_argsnew_obj_json_strobj_json_strobjr   r   r    stream_list   sF   
z!OpenAIPydanticProgram.stream_listc              
   o   s    |pi }| j jdd| ji|}| jdi |}t| j|d}d|vr+t| j|d< | jjd||gd|}|D ]1}|jj	}|d }	t
|	dkrKq:|d d jj}
zt|
}| j|V  W q: ttfyk   Y q:w dS )	z(Streams the intermediate partial object.rB   r]   rD   r_   r-   r   Nr   )rG   rd   rF   rc   r   rE   r!   rp   rf   rg   r8   r/   r1   r   r5   r   rO   )rK   r[   r\   rN   r`   r^   ri   rt   partial_respr-   rw   partial_objectr   r   r    stream_partial_objects"  s4   z,OpenAIPydanticProgram.stream_partial_objectsc                 K   s8   | dd }| jjs|std| jjr|rtd|S )Nr^   zMust provide description for your Pydantic Model. Either provide a docstring or add `description=<your_description>` to the method. Required to convert Pydantic Model to OpenAI Function.z;Must provide either a docstring or a description, not both.)getrE   __doc__rO   )rK   rN   r^   r   r   r    rc   C  s   z'OpenAIPydanticProgram._description_evalFF)NNNFFNrW   )__name__
__module____qualname__r   r   r   r   r   r	   strr   r   boolrL   classmethodr   r   rU   propertyr   rC   setterr   rk   rm   r   r{   r~   rc   r   r   r   r    rA   T   s    
	
*
&
&
8
!rA   )Fr   ).loggingtypingr   r   r   r   r   r   r   r	   r
    llama_index.core.bridge.pydanticr   llama_index.agent.openai.utilsr   llama_index.core.llms.llmr   +llama_index.core.program.llm_prompt_programr   llama_index.core.program.utilsr   llama_index.core.prompts.baser   r   llama_index.core.settingsr   llama_index.core.typesr   llama_index.llms.openair   llama_index.llms.openai.utilsr   r   r    llama_index.program.openai.utilsr   	getLoggerr   r9   r   r   r!   intr,   r@   rA   r   r   r   r    <module>   sN    ,

"
%