o
    }!gx                     @   s  d Z ddlZddlZddlZddlZddlmZ ddlmZm	Z	m
Z
mZmZmZmZmZ ddlZddlmZ ddlmZmZmZ ddlmZmZmZ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&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l0m1Z1 ddl2m3Z3m4Z4 ddl5m6Z6 ddl7m8Z8 ddl9m:Z:m;Z;m<Z< ddl=m>Z> ddl?m@Z@ ddlAmBZB ddlCmDZD eEeFZGeGHejI e-eFZJdZK		d(de:de	deeL deMde;f
dd ZNd!eDfd"d#ZOd!eDde	fd$d%ZPG d&d' d'eZQdS ))zOpenAI agent worker.    N)partial)AnyDictListCallableOptionalUnioncastget_args)resolve_tool_choice)build_error_tool_outputbuild_missing_tool_messageget_function_by_name)BaseAgentWorkerTaskTaskStepTaskStepOutput)add_user_step_to_memory)MessageRole)CallbackManagerCBEventTypeEventPayloadtrace_method)AGENT_CHAT_RESPONSE_TYPEAgentChatResponseChatResponseModeStreamingAgentChatResponse)ChatMessageChatResponse)get_dispatcher)AgentToolCallEvent)LLM)
BaseMemoryChatMemoryBuffer)ObjectRetriever)Settings)BaseTool
ToolOutputadapt_to_async_tool)ToolMetadata)Thread)OpenAI)OpenAIToolCall   Ftool
input_dicterror_messageraise_errorreturnc              
   C   sb   z| di |W S  t y0 } z|r |pd|}t|| jjd|i|dW  Y d}~S d}~ww )zTCall tool with error handling.

    Input is a dictionary with args and kwargs

    zError: kwargs)content	tool_name	raw_input
raw_outputN )	Exceptionr'   metadataname)r.   r/   r0   r1   er8   r8   _/mnt/skqttb/ctump_chatbot/chatbot/lib/python3.10/site-packages/llama_index/agent/openai/step.pycall_tool_with_error_handling9   s   r>   	tool_callc              
   C   sJ   zt | jjW S  t jy$ } ztd| jj d| jj dd }~ww )NError in calling tool -: The input json block is malformed:
```json

```)jsonloadsfunction	argumentsJSONDecodeError
ValueErrorr;   )r?   r<   r8   r8   r=   default_tool_call_parserR   s   rI   c              
   C   s   | j j}t| dkri S zt|} t| ts(td| j j	 d| j j d| W S  tj
yd } z-d}t||}|rQ|d}|d}||iW  Y d}~S td| j j	 d| j j dd}~ww )	zParse tool calls that are not standard json.

    Also parses tool calls of the following forms:
    variable = \"\"\"Some long text\"\"\"
    variable = "Some long text"'
    variable = '''Some long text'''
    variable = 'Some long text'
    r   r@   rA   rB   z0([a-zA-Z_][a-zA-Z_0-9]*)\s*=\s*["\']+(.*?)["\']+      N)rE   rF   lenstriprC   rD   
isinstancedictrH   r;   rG   researchgroup)r?   arguments_strr<   patternmatchvariable_namer4   r8   r8   r=   advanced_tool_call_parser[   s,   	



rW   c                   @   s  e Zd ZdZdedddfdee dedee de	de
d	ee d
eee  deeegef  fddZeddddeddddf	deee  d
eee  dee de	de
d	ee dee deee  deeegef  dedd fddZdedee fddZdedeee  fddZ	dPdedee deeef deeef fddZdededefddZded ede fd!d"Z!ded ede fd#d$Z"ded%e#d ede$fd&d'Z%ded%e#d ede$fd(d)Z&dee d*ed+e'd,ee( de	f
d-d.Z)dee d*ed+e'd,ee( de	f
d/d0Z*dedede+fd1d2Z,d3eee  d4e
de	fd5d6Z-d7edee fd8d9Z.e#j/dfd:e+ded%e#deeef de0f
d;d<Z1e#j/dfd:e+ded%e#deeef de0f
d=d>Z2e3d?d:e+dedede0fd@dAZ4e3d?d:e+dedede0fdBdCZ5e3d?d:e+dedede0fdDdEZ6e3d?d:e+dedede0fdFdGZ7dededdfdHdIZ8dededdfdJdKZ9dededee+ fdLdMZ:d	eddfdNdOZ;dS )QOpenAIAgentWorkerzOpenAI Agent agent worker.FNtoolsllmprefix_messagesverbosemax_function_callscallback_managertool_retrievertool_call_parserc	           	         s   || _ || _|| _|| _|p| j j| _|pt| _tdkr&|d ur&tdtdkr5fdd| _	d S |d urIt
tt |  fdd| _	d S dd | _	d S )Nr   z,Cannot specify both tools and tool_retrieverc                    s    S Nr8   _)rY   r8   r=   <lambda>       z,OpenAIAgentWorker.__init__.<locals>.<lambda>c                    s
     | S ra   )retrievemessage)tool_retriever_cr8   r=   rd      s   
 c                 S   s   g S ra   r8   rb   r8   r8   r=   rd      re   )_llm_verbose_max_function_callsr[   r^   rI   r`   rL   rH   
_get_toolsr	   r$   r&   )	selfrY   rZ   r[   r\   r]   r^   r_   r`   r8   )ri   rY   r=   __init__   s   
zOpenAIAgentWorker.__init__system_promptr3   r2   c
              
   K   s   |pg }|pt j}t|tstd|dur||_|jjs&td|j d|dur9|dur2tdt	|ddg}|p<g }| ||||||||	dS )	zCreate an OpenAIAgent from a list of tools.

        Similar to `from_defaults` in other classes, this method will
        infer defaults for a variety of parameters, including the LLM,
        if they are not specified.

        zllm must be a OpenAI instanceNzModel name z( does not support function calling API. z5Cannot specify both system_prompt and prefix_messagessystem)r4   role)rY   r_   rZ   r[   r\   r]   r^   r`   )
r%   rZ   rN   r+   rH   r^   r:   is_function_calling_modelmodelr   )clsrY   r_   rZ   r\   r]   r^   rp   r[   r`   r3   r8   r8   r=   
from_tools   s6   

zOpenAIAgentWorker.from_toolstaskc                 C   s   | j |j  |jd   S )N
new_memory)r[   memorygetextra_stateget_all)rn   rw   r8   r8   r=   get_all_messages   s   z"OpenAIAgentWorker.get_all_messagesc                 C   s(   |j d  }|r|d jdd S d S )Nrx   
tool_calls)r{   r|   additional_kwargsrz   )rn   rw   chat_historyr8   r8   r=   get_latest_tool_calls   s   z'OpenAIAgentWorker.get_latest_tool_callsautoopenai_toolstool_choicec                 C   s(   d|  |i}|r|j|t|d |S )Nmessages)rY   r   )r}   updater   )rn   rw   r   r   llm_chat_kwargsr8   r8   r=   _get_llm_chat_kwargs   s   z&OpenAIAgentWorker._get_llm_chat_kwargschat_responsec                 C   s.   |j }|jd | tt|j|jd dS )Nrx   sources)responser   )rh   r{   putr   strr4   )rn   rw   r   
ai_messager8   r8   r=   _process_message   s
   z"OpenAIAgentWorker._process_messager   c                 K   sh   t | jjdi ||jd d}t|j|jd fdt| j|id}|  |j	
  |jr2|  |S )Nr   )chat_streamr   rx   on_stream_end_fn)targetargsr3   r8   )r   rj   stream_chatr{   r*   write_response_to_historyr   finalize_taskstart!is_function_not_none_thread_eventwaitis_functionjoin)rn   rw   r   chat_stream_responsethreadr8   r8   r=   _get_stream_ai_response   s   

z)OpenAIAgentWorker._get_stream_ai_responsec                    sh   t | jjdi |I d H |jd d}t|j|jd t| j|d|_	|
  |j I d H  |S )Nr   )achat_streamr   rx   )r   r8   )r   rj   astream_chatr{   asynciocreate_taskawrite_response_to_historyr   afinalize_taskawrite_response_to_history_task_ensure_async_setupis_function_false_eventr   )rn   rw   r   r   r8   r8   r=   _get_async_stream_ai_response  s   
z/OpenAIAgentWorker._get_async_stream_ai_responsemodec                 K   sH   |t jkr| jjdi |}| ||S |t jkr"| j|fi |S tNr8   )r   WAITrj   chatr   STREAMr   NotImplementedErrorrn   rw   r   r   r   r8   r8   r=   _get_agent_response&  s   

z%OpenAIAgentWorker._get_agent_responsec                    sV   |t jkr| jjdi |I d H }| ||S |t jkr)| j|fi |I d H S tr   )r   r   rj   achatr   r   r   r   r   r8   r8   r=   _get_async_agent_response1  s   

z+OpenAIAgentWorker._get_async_agent_responser?   ry   r   c                 C   s   |j d usJ |jd usJ |jjd usJ |jjd usJ |j }|jj}|jj}t||}tt||r7|jnt	d|dd | j
jtjtj|tj|d urQ|jnt	d|did}		 | jp`t}
| jrrtd td| d|  d }z|
|}W n ty } z
t|}W Y d }~nd }~ww |d u rt|}|d ur| jrt| td	 t|tj||d
d}t|||}n"t|||d}| jrtd| td	 tt|tj||d
d}|	jtjt|id W d    n1 sw   Y  || || |d ur|jjo|j S dS )Nunknowndescriptionr;   rF   r.    payload=== Calling Function ===Calling function:  with args: ========================
r;   tool_call_idr4   rr   r   )r0   Got output: F) idrE   r;   rF   r   
dispatchereventr    r:   r)   r^   r   FUNCTION_CALLr   TOOLr`   rI   rk   printrH   r   r   r   r   r   r>   on_endFUNCTION_OUTPUTappendr   return_directis_error)rn   rY   r?   ry   r   function_idfunction_namefunction_args_strr.   r   r`   r0   argument_dictr<   function_messagetool_outputr8   r8   r=   _call_function<  s   





	
D

z OpenAIAgentWorker._call_functionc                    s2  |j d usJ |jd usJ |jjd usJ |jjd usJ |j }|jj}|jj}t||}tt||r8|jnt	d|dd | j
jtjtj|tj|d urR|jnt	d|did}		 | jpat}
| jrstd td| d|  d }z|
|}W n ty } z
t|}W Y d }~nd }~ww |d u rt|}|d ur| jrt| td	 t|tj||d
d}t|||}n*t|}|jdi |I d H }| jrtd| td	 tt|tj||d
d}|	jtjt|id W d    n1 sw   Y  || || |d ur|jjo|j  S dS )Nr   r   r   r   r   r   r   r   r   r   r   r   Fr8   )!r   rE   r;   rF   r   r   r   r    r:   r)   r^   r   r   r   r   r`   rI   rk   r   rH   r   r   r   r   r   r(   acallr   r   r   r   r   r   )rn   rY   r?   ry   r   r   r   r   r.   r   r`   r0   r   r<   r   r   
async_toolr8   r8   r=   _acall_function  s   





	
C

z!OpenAIAgentWorker._acall_functionc                 K   s>   g }t  }|d|d}|j| t|jtt |j	dS )zInitialize step from task.r   )r   n_function_callsrx   )task_idstep_idinput)
r#   from_defaultsr{   r   r   r   r   uuiduuid4r   )rn   rw   r3   r   rx   
task_stater8   r8   r=   initialize_step  s   
z!OpenAIAgentWorker.initialize_stepr   r   c                 C   s   || j krdS |sdS dS )NFT)rl   )rn   r   r   r8   r8   r=   _should_continue"  s
   
z"OpenAIAgentWorker._should_continuer   c                 C   s
   |  |S )z
Get tools.)rm   )rn   r   r8   r8   r=   	get_tools+  s   
zOpenAIAgentWorker.get_toolsstepc                 C   s  |j durt||jd | jd | |j }dd |D }| |||}| j|fd|i|}| |p5g }	g }
| |	|jd sFd}g }nvd	}|	D ]a}t	|t
tsWtd
|jdkr`td| |||jd |
}|jd |
d  |dvr{d}|jd  d7  < |rt|	dkrd}|
d j}tttj|dd}| ||}|tjk|_ nqJ|s|jtt ddgng }|
|_t||||dS )	Run step.Nrx   r\   c                 S      g | ]}|j  qS r8   r:   to_openai_tool.0r.   r8   r8   r=   
<listcomp>=      z/OpenAIAgentWorker._run_step.<locals>.<listcomp>r   r   TFInvalid tool_call objectrE   (Invalid tool type. Unsupported by OpenAIr   r~   r   noner   rJ   rr   r4   rg   r   r   output	task_stepis_last
next_steps) r   r   r{   rk   r   r   r   r   r   rN   r
   r,   rH   typer   r   rL   r4   r   r   r   	ASSISTANTr   r   r   is_dummy_streamget_next_stepr   r   r   r   r   )rn   r   rw   r   r   rY   r   r   agent_chat_responselatest_tool_callslatest_tool_outputsis_done	new_stepsr?   r   response_strr   r8   r8   r=   	_run_step/  s   





zOpenAIAgentWorker._run_stepc                    s  |j durt|jd jd j dd D }||}jfd|i|I dH }p9g }g  |jd sHd}	nvd	}	|D ]}
t	|
t
tsYtd
|
jdkrbtdqLtj fdd|D  I dH }t|D ]D\}}jd  |  |dvrd}jd  d7  < |rt|dkrd}	 | j}tttj|dd}|}|tjk|_ nqy|	s|jtt ddgng } |_ t!|||	|dS )r   Nrx   r   c                 S   r   r8   r   r   r8   r8   r=   r     r   z0OpenAIAgentWorker._arun_step.<locals>.<listcomp>r   r   TFr   rE   r   c                    s"   g | ]} |jd   qS )rx   )r   r{   )r   r?   r   rn   rw   rY   r8   r=   r     s    r   r   r   rJ   r   rg   r   r   )"r   r   r{   rk   r   r   r   r   r   rN   r
   r,   rH   r   r   gather	enumerater   rL   r4   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )rn   r   rw   r   r   r   r   r   r   r   r?   tool_resultsindexr   r  r   r   r8   r  r=   
_arun_step  s   






zOpenAIAgentWorker._arun_steprun_stepc                 K       | dd}| j||tj|dS )r   r   r   r   r   )rz   r  r   r   rn   r   rw   r3   r   r8   r8   r=   r	    s   
zOpenAIAgentWorker.run_stepc                    (   | dd}| j||tj|dI dH S )zRun step (async).r   r   r  N)rz   r  r   r   r  r8   r8   r=   	arun_step  
   
zOpenAIAgentWorker.arun_stepc                 K   r
  )zRun step (stream).r   r   r  )rz   r  r   r   r  r8   r8   r=   stream_step  s   
zOpenAIAgentWorker.stream_stepc                    r  )zRun step (async stream).r   r   r  N)rz   r  r   r   r  r8   r8   r=   astream_step  r  zOpenAIAgentWorker.astream_stepc                 K   s(   |j |jd   |jd   dS z1Finalize task, after all the steps are completed.rx   N)ry   put_messagesr{   r|   resetrn   rw   r3   r8   r8   r=   r     s   zOpenAIAgentWorker.finalize_taskc                    s4   |j d  }|j d   |j|I dH  dS r  )r{   r|   r  ry   aput_messages)rn   rw   r3   r   r8   r8   r=   r     s   z OpenAIAgentWorker.afinalize_taskc                 K   s   t d)zSUndo step from task.

        If this cannot be implemented, return None.

        zUndo is not yet implemented)r   r  r8   r8   r=   	undo_step   s   zOpenAIAgentWorker.undo_stepc                 C   s
   || _ dS )zSet callback manager.N)r^   )rn   r^   r8   r8   r=   set_callback_manager<  s   
z&OpenAIAgentWorker.set_callback_manager)r   )<__name__
__module____qualname____doc__DEFAULT_MAX_FUNCTION_CALLSr   r&   r+   r   boolintr   r   r$   r   r,   r   ro   classmethodr!   r   r   rv   r   r}   r   rO   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  r8   r8   r8   r=   rX   }   s   
	



	
6



	




j
i

	

`

a		rX   )NF)Rr  r   rC   loggingr   	functoolsr   typingr   r   r   r   r   r   r	   r
   rP   llama_index.agent.openai.utilsr   ,llama_index.core.agent.function_calling.stepr   r   r   llama_index.core.agent.typesr   r   r   r   llama_index.core.agent.utilsr    llama_index.core.base.llms.typesr   llama_index.core.callbacksr   r   r   r   "llama_index.core.chat_engine.typesr   r   r   r   r   r    llama_index.core.instrumentationr   -llama_index.core.instrumentation.events.agentr    llama_index.core.llms.llmr!   llama_index.core.memoryr"   r#   llama_index.core.objects.baser$   llama_index.core.settingsr%   llama_index.core.toolsr&   r'   r(   llama_index.core.tools.typesr)   llama_index.core.typesr*   llama_index.llms.openair+   llama_index.llms.openai.utilsr,   	getLoggerr  loggersetLevelWARNINGr   r  r   r  r>   rI   rW   rX   r8   r8   r8   r=   <module>   s^    (

	"