
    Ng5m                       d dl mZ d dlZd dlZd dlm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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mZ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& erd dl'Z'd dl(m)Z) d dl*m+Z+  G d de          Z, G d de          Z-d#dZ.d$dZ/d%dZ0d&dZ1eee-         e,ed         ed          f         Z2 G d! d"eee2f                   Z3dS )'    )annotationsN)JSONDecodeError)sleep)
TYPE_CHECKINGAnyCallableDictListOptionalSequenceTupleTypeUnion)AgentActionAgentFinish)CallbackManager)dumpd)RunnableConfigRunnableSerializableensure_config)BaseTool)convert_to_openai_tool)	BaseModelFieldmodel_validator)Self)ThreadMessage)RequiredActionFunctionToolCallc                  @    e Zd ZU dZded<   ded<   ed	d            ZdS )
OpenAIAssistantFinishzuAgentFinish with run and thread metadata.

    Parameters:
        run_id: Run id.
        thread_id: Thread id.
    strrun_id	thread_idreturnboolc                    dS z]Check if the class is serializable by LangChain.

        Returns:
            False
        F clss    b/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain/agents/openai_assistant/base.pyis_lc_serializablez(OpenAIAssistantFinish.is_lc_serializable0   	     u    Nr$   r%   __name__
__module____qualname____doc____annotations__classmethodr,   r(   r.   r+   r    r    %   sR           KKKNNN   [  r.   r    c                  J    e Zd ZU dZded<   ded<   ded<   ed
d            Zd	S )OpenAIAssistantActionzAgentAction with info needed to submit custom tool output to existing run.

    Parameters:
        tool_call_id: Tool call id.
        run_id: Run id.
        thread_id: Thread id
    r!   tool_call_idr"   r#   r$   r%   c                    dS r'   r(   r)   s    r+   r,   z(OpenAIAssistantAction.is_lc_serializableG   r-   r.   Nr/   r0   r(   r.   r+   r8   r8   :   s^           KKKNNN   [  r.   r8   r$   openai.OpenAIc                     	 dd l }  | j                    S # t          $ r}t          d          |d }~wt          $ r}t          d          |d }~ww xY wNr   zBUnable to import openai, please install with `pip install openai`.zuPlease make sure you are using a v1.1-compatible version of openai. You can install with `pip install "openai>=1.1"`.)openaiOpenAIImportErrorAttributeErrorr>   es     r+   _get_openai_clientrD   Q   s    v}   P
 
	    <
 
 	    
A/AAAopenai.AsyncOpenAIc                     	 dd l }  | j                    S # t          $ r}t          d          |d }~wt          $ r}t          d          |d }~ww xY wr=   )r>   AsyncOpenAIr@   rA   rB   s     r+   _get_openai_async_clientrI   a   s    !v!###   P
 
	    <
 
 	rE   tool:Union[Dict[str, Any], Type[BaseModel], Callable, BaseTool]r%   c                L    d}t          | t                    od| v o	| d         |v S )z<Determine if tool corresponds to OpenAI Assistants built-in.)code_interpreter	retrievaltype)
isinstancedict)rJ   assistants_builtin_toolss     r+   _is_assistants_builtin_toolrS   q   s;      A4 	7t^	7&\55r.   Dict[str, Any]c                B    t          |           r| S t          |           S )zConvert a raw function/class to an OpenAI tool.

    Note that OpenAI assistants supports several built-in tools,
    such as "code_interpreter" and "retrieval."
    )rS   r   )rJ   s    r+   _get_assistants_toolrV   }   s'     #4(( ,%d+++r.   r   r   c                  D   e Zd ZU dZ ee          Zded<   	 dZded<   	 ded<   	 d	Z	d
ed<   	 dZ
ded<   	  ed          d7d            Zeddd8d            Z	 d9d:d"Zedd#d;d%            Z	 d9d:d&Zd<d)Zd=d*Zd>d,Zd?d.Zd@d1Zd<d2Zd=d3Zd>d4Zd?d5Zd@d6ZdS )AOpenAIAssistantRunnablea  Run an OpenAI Assistant.

    Example using OpenAI tools:
        .. code-block:: python

            from langchain_experimental.openai_assistant import OpenAIAssistantRunnable

            interpreter_assistant = OpenAIAssistantRunnable.create_assistant(
                name="langchain assistant",
                instructions="You are a personal math tutor. Write and run code to answer math questions.",
                tools=[{"type": "code_interpreter"}],
                model="gpt-4-1106-preview"
            )
            output = interpreter_assistant.invoke({"content": "What's 10 - 4 raised to the 2.7"})

    Example using custom tools and AgentExecutor:
        .. code-block:: python

            from langchain_experimental.openai_assistant import OpenAIAssistantRunnable
            from langchain.agents import AgentExecutor
            from langchain.tools import E2BDataAnalysisTool


            tools = [E2BDataAnalysisTool(api_key="...")]
            agent = OpenAIAssistantRunnable.create_assistant(
                name="langchain assistant e2b tool",
                instructions="You are a personal math tutor. Write and run code to answer math questions.",
                tools=tools,
                model="gpt-4-1106-preview",
                as_agent=True
            )

            agent_executor = AgentExecutor(agent=agent, tools=tools)
            agent_executor.invoke({"content": "What's 10 - 4 raised to the 2.7"})


    Example using custom tools and custom execution:
        .. code-block:: python

            from langchain_experimental.openai_assistant import OpenAIAssistantRunnable
            from langchain.agents import AgentExecutor
            from langchain_core.agents import AgentFinish
            from langchain.tools import E2BDataAnalysisTool


            tools = [E2BDataAnalysisTool(api_key="...")]
            agent = OpenAIAssistantRunnable.create_assistant(
                name="langchain assistant e2b tool",
                instructions="You are a personal math tutor. Write and run code to answer math questions.",
                tools=tools,
                model="gpt-4-1106-preview",
                as_agent=True
            )

            def execute_agent(agent, tools, input):
                tool_map = {tool.name: tool for tool in tools}
                response = agent.invoke(input)
                while not isinstance(response, AgentFinish):
                    tool_outputs = []
                    for action in response:
                        tool_output = tool_map[action.tool].invoke(action.tool_input)
                        tool_outputs.append({"output": tool_output, "tool_call_id": action.tool_call_id})
                    response = agent.invoke(
                        {
                            "tool_outputs": tool_outputs,
                            "run_id": action.run_id,
                            "thread_id": action.thread_id
                        }
                    )

                return response

            response = execute_agent(agent, tools, {"content": "What's 10 - 4 raised to the 2.7"})
            next_response = execute_agent(agent, tools, {"content": "now add 17.241", "thread_id": response.thread_id})

    )default_factoryr   clientNasync_clientr!   assistant_idg     @@floatcheck_every_msFr%   as_agentafter)moder$   r   c                `    | j         &dd l}| j        j        } |j        |          | _         | S )Nr   )api_key)r[   r>   rZ   rc   rH   )selfr>   rc   s      r+   validate_async_clientz-OpenAIAssistantRunnable.validate_async_client   s;    $MMMk)G 2 27 C C CDr.   )rZ   nameinstructionstoolsSequence[Union[BaseTool, dict]]model2Optional[Union[openai.OpenAI, openai.AzureOpenAI]]kwargsc                   |pt                      }|j        j                            ||d |D             |          } | d|j        |d|S )a*  Create an OpenAI Assistant and instantiate the Runnable.

        Args:
            name: Assistant name.
            instructions: Assistant instructions.
            tools: Assistant tools. Can be passed in OpenAI format or as BaseTools.
            model: Assistant model to use.
            client: OpenAI or AzureOpenAI client.
                Will create a default OpenAI client if not specified.
            kwargs: Additional arguments.

        Returns:
            OpenAIAssistantRunnable configured to run using the created assistant.
        c                ,    g | ]}t          |          S r(   rV   .0rJ   s     r+   
<listcomp>z<OpenAIAssistantRunnable.create_assistant.<locals>.<listcomp>  s!    @@@$'--@@@r.   rf   rg   rh   rj   )r\   rZ   r(   )rD   beta
assistantscreateid)r*   rf   rg   rh   rj   rZ   rl   	assistants           r+   create_assistantz(OpenAIAssistantRunnable.create_assistant   so    2 /-//K*11%@@%@@@	 2 
 
	 sF	VFFvFFFr.   inputrQ   configOptional[RunnableConfig]
OutputTypec                $   t          |          }t          j        |                    d          |                    d          |                    d                    }|                    t          |           ||                    d          p|                                           }	 | j        rR|                    d          r=|                     |d                   } | j	        j
        j        j        j        di |}nd|vrMd	|d
         |                    d          dg|                    d          d}|                     ||          }nd|vrb| j	        j
        j        j                            |d         |d
         d	|                    d                    }	|                     |          }n! | j	        j
        j        j        j        di |}|                     |j        |j                  }n)# t*          $ r}
|                    |
           |
d}
~
ww xY w	 |                     |          }|                    |           |S # t*          $ r0}
|                    |
|                                           |
d}
~
ww xY w)a  Invoke assistant.

        Args:
            input: Runnable input dict that can have:
                content: User message when starting a new run.
                thread_id: Existing thread to use.
                run_id: Existing run to use. Should only be supplied when providing
                    the tool output for a required action after an initial invocation.
                message_metadata: Metadata to associate with new message.
                thread_metadata: Metadata to associate with new thread. Only relevant
                    when new thread being created.
                instructions: Additional run instructions.
                model: Override Assistant model for this run.
                tools: Override Assistant tools for this run.
                run_metadata: Metadata to associate with new run.
            config: Runnable config. Defaults to None.

        Return:
            If self.as_agent, will return
                Union[List[OpenAIAssistantAction], OpenAIAssistantFinish].
                Otherwise, will return OpenAI types
                Union[List[ThreadMessage], List[RequiredActionFunctionToolCall]].
        	callbackstagsmetadatainheritable_callbacksinheritable_tagsinheritable_metadatarun_namerf   intermediate_stepsr#   usercontentmessage_metadataroler   r   thread_metadatamessagesr   r"   r   r   r   Nr   r(   )r   r   	configuregeton_chain_startr   get_namer_   _parse_intermediate_stepsrZ   rt   threadsrunssubmit_tool_outputs_create_thread_and_runr   rv   _create_run_wait_for_runrw   r#   BaseExceptionon_chain_error_get_responseon_chain_endrQ   rd   rz   r{   rl   callback_managerrun_managertool_outputsrunthread_rC   responses               r+   invokezOpenAIAssistantRunnable.invoke  s   6 v&&*4"(**["9"9#ZZ//!'J!7!7
 
 

 '55$KKVZZ
%;%;%Nt}} 6 
 
$	} Q+?!@!@ Q#==./    Hdk&.3GWW,WWE)) %+',Y'7(-		2D(E(E ! !&		*; < <	 	 11%@@&&K$,5<<+&!),"YY'9::	 =   &&u-- Hdk&.3GPP%PP$$SVS];;CC 	 	 	&&q)))G		))#..H
 $$X...O  	 	 	&&q388::&>>>G	s1   -EG? ?
H%	H  H%)I 
J+J

J)r[   <Optional[Union[openai.AsyncOpenAI, openai.AsyncAzureOpenAI]]c                  K   |pt                      }d |D             }|j        j                            ||||           d{V } | d|j        |d|S )a	  Async create an AsyncOpenAI Assistant and instantiate the Runnable.

        Args:
            name: Assistant name.
            instructions: Assistant instructions.
            tools: Assistant tools. Can be passed in OpenAI format or as BaseTools.
            model: Assistant model to use.
            async_client: AsyncOpenAI client.
                Will create default async_client if not specified.

        Returns:
            AsyncOpenAIAssistantRunnable configured to run using the created assistant.
        c                ,    g | ]}t          |          S r(   ro   rp   s     r+   rr   z=OpenAIAssistantRunnable.acreate_assistant.<locals>.<listcomp>  s!    EEEt,T22EEEr.   rs   N)r\   r[   r(   )rI   rt   ru   rv   rw   )	r*   rf   rg   rh   rj   r[   rl   openai_toolsrx   s	            r+   acreate_assistantz)OpenAIAssistantRunnable.acreate_assistanti  s      4 $A'?'A'AEEuEEE&+6==%	 > 
 
 
 
 
 
 
 
	 sR	<RR6RRRr.   c                f  K   |pi }t          j        |                    d          |                    d          |                    d                    }|                    t	          |           ||                    d          p|                                           }	 | j        r^|                    d          rI|                     |d                    d{V } | j        j	        j
        j        j        di | d{V }nd	|vrSd
|d         |                    d          dg|                    d          d}|                     ||           d{V }nd|vrn| j        j	        j
        j                            |d	         |d         d
|                    d                     d{V }	|                     |           d{V }n' | j        j	        j
        j        j        di | d{V }|                     |j        |j                   d{V }n)# t(          $ r}
|                    |
           |
d}
~
ww xY w	 |                     |          }|                    |           |S # t(          $ r0}
|                    |
|                                           |
d}
~
ww xY w)a  Async invoke assistant.

        Args:
            input: Runnable input dict that can have:
                content: User message when starting a new run.
                thread_id: Existing thread to use.
                run_id: Existing run to use. Should only be supplied when providing
                    the tool output for a required action after an initial invocation.
                message_metadata: Metadata to associate with a new message.
                thread_metadata: Metadata to associate with new thread. Only relevant
                    when a new thread is created.
                instructions: Additional run instructions.
                model: Override Assistant model for this run.
                tools: Override Assistant tools for this run.
                run_metadata: Metadata to associate with new run.
            config: Runnable config. Defaults to None.
            kwargs: Additional arguments.

        Return:
            If self.as_agent, will return
                Union[List[OpenAIAssistantAction], OpenAIAssistantFinish].
                Otherwise, will return OpenAI types
                Union[List[ThreadMessage], List[RequiredActionFunctionToolCall]].
        r   r   r   r   r   r   r   Nr#   r   r   r   r   r   r   r"   r   r   r(   )r   r   r   r   r   r   r_   _aparse_intermediate_stepsr[   rt   r   r   r   _acreate_thread_and_runr   rv   _acreate_run_await_for_runrw   r#   r   r   r   r   rQ   r   s               r+   ainvokezOpenAIAssistantRunnable.ainvoke  s     8 2*4"(**["9"9#ZZ//!'J!7!7
 
 

 '55$KKVZZ
%;%;%Nt}} 6 
 
(	} "+?!@!@ "%)%D%D./& &             TD-2:?S  "        E)) %+',Y'7(-		2D(E(E ! !&		*; < <	 	 !88GGGGGGGG&&+08AHH+&!),"YY'9::	 I         !--e44444444 TD-2:?S          ++CFCMBBBBBBBBCC 	 	 	&&q)))G		))#..H
 $$X...O  	 	 	&&q388::&>>>G	s1   $E;H   
I*II
I6 6
J0 +J++J0r   'List[Tuple[OpenAIAssistantAction, str]]c                    |d         \  }}|                      |j        |j                  }t                      |j        rd |j        j        j        D             fd|D             }||j        |j        d}|S )Nc                    h | ]	}|j         
S r(   rw   rq   tcs     r+   	<setcomp>zDOpenAIAssistantRunnable._parse_intermediate_steps.<locals>.<setcomp>  '     & & && & &r.   c                V    g | ]%\  }}|j         v t          |          |j         d &S )outputr9   r9   r!   rq   actionr   required_tool_call_idss      r+   rr   zEOpenAIAssistantRunnable._parse_intermediate_steps.<locals>.<listcomp>  G     
 
 
"&<<< 6{{F4GHH<<<r.   r   r"   r#   r   r"   r#   setrequired_actionr   
tool_callsrd   r   last_actionlast_outputr   r   r   r   s          @r+   r   z1OpenAIAssistantRunnable._parse_intermediate_steps  s     $6b#9 [  !3[5JKK!$ 	& & # 3 G R& & &"
 
 
 
"4
 
 
 )!($.
 

 #"r.   c                    d |                                 D             } | j        j        j        j        j        |d         fd| j        i|S )Nc                "    i | ]\  }}|d v 	||S )rg   rj   rh   run_metadatar(   rq   kvs      r+   
<dictcomp>z7OpenAIAssistantRunnable._create_run.<locals>.<dictcomp>  4     
 
 
1FFF qFFFr.   r#   r\   )itemsrZ   rt   r   r   rv   r\   rd   rz   paramss      r+   r   z#OpenAIAssistantRunnable._create_run  sn    
 

 
 

 4t{',3+
 
*
 
 
 	
r.   r   c                    d |                                 D             } | j        j        j        j        d| j        |d|}|S )Nc                "    i | ]\  }}|d v 	||S r   r(   r   s      r+   r   zBOpenAIAssistantRunnable._create_thread_and_run.<locals>.<dictcomp>  r   r.   r\   r   r(   )r   rZ   rt   r   create_and_runr\   rd   rz   r   r   r   s        r+   r   z.OpenAIAssistantRunnable._create_thread_and_run  sj    
 

 
 

 6dk&5 
*
 
 
 

 
r.   r   c                   j         dk    r3dd lt          j        j                            d          d                   }t          j        j                            d          d                   }|dk    p|dk    o|dk    | j        j        j        j	        
                    j        d          }fd|D             }| j        s|S d	 |D             }t          fd
|D                       rd                    d |D                       }t          |j        j        ddj        j                  S j         dk    r| j        sj        j        j        S g }j        j        j        D ]}|j        }		 t+          j        |	j        d          }
n2# t0          $ r%}t3          d|	j         d|	j                   |d }~ww xY wt7          |
          dk    rd|
v r|
d         }
|                    t;          |	j        |
|j        dj        j                             |S t+          j                                        d          }t3          dj          d| d          )N	completedr   .      ascorderc                4    g | ]}|j         j        k    |S r(   r"   rw   rq   msgr   s     r+   rr   z9OpenAIAssistantRunnable._get_response.<locals>.<listcomp>"  '    LLLCszSV7K7KC7K7K7Kr.   c                &    g | ]}|j         D ]}|S r(   r   rq   r   msg_contents      r+   rr   z9OpenAIAssistantRunnable._get_response.<locals>.<listcomp>%  ;        #s{ 8C   r.   c              3     K   | ]N}r$t          |j        j        j        j                  n#t          |j        j        j        j                  V  Od S NrP   typesrt   r   TextContentBlockMessageContentTextrq   r   r>   version_gte_1_14s     r+   	<genexpr>z8OpenAIAssistantRunnable._get_response.<locals>.<genexpr>(  u       	 	  (Jw(9(A(RSSS#!2!:!M 		 	 	 	 	 	r.   
c              3  .   K   | ]}|j         j        V  d S r   textvaluerq   r   s     r+   r   z8OpenAIAssistantRunnable._get_response.<locals>.<genexpr>2  '      "L"L'7<#5"L"L"L"L"L"Lr.   r   r#   r"    return_valueslogr"   r#   requires_actionFstrict*Received invalid JSON function arguments:  for function __arg1rJ   
tool_inputr9   r  r"   r#      indentUnexpected run status: . Full run info:

)) statusr>   intversionVERSIONsplitrZ   rt   r   r   listr#   r_   alljoinr    rw   r   r   r   functionjsonloads	argumentsr   
ValueErrorrf   lenappendr8   dumpsrQ   rd   r   major_versionminor_versionr   new_messagesansweractions	tool_callr  argsrC   run_infor>   r   s    `           @@r+   r   z%OpenAIAssistantRunnable._get_response  s(    :$$MMM 6 < <S A A! DEEM 6 < <S A A! DEEM - 1  ":}':  {'/8==U >  H MLLL8LLLL= $## '3  F  	 	 	 	 	  &	 	 	 	 	 
M "L"LV"L"L"LLL($!$!f 
 v-	 	 	 	 Z,,,= J*>IIG 0DO  	$-:h&8GGGDD&   $M#-M M=E]M M  
 t99>>h$&6&6>D)%]#'%.\"v"%-  	 	 	 	 Nz#((**Q777HU#*UU(UUU  s   F
G) G		Gr"   r#   c                    d}|rO| j         j        j        j                            ||          }|j        dv }|rt          | j        dz             |O|S NT)r#   )in_progressqueuedi  )rZ   rt   r   r   retriever  r   r^   rd   r"   r#   r1  r   s        r+   r   z%OpenAIAssistantRunnable._wait_for_run]  sn     	2+"*/8898UUC*(AAK 2d)D0111	  	2
 
r.   c                
  K   |d         \  }}|                      |j        |j                   d {V }t                      |j        rd |j        j        j        D             fd|D             }||j        |j        d}|S )Nr   c                    h | ]	}|j         
S r(   r   r   s     r+   r   zEOpenAIAssistantRunnable._aparse_intermediate_steps.<locals>.<setcomp>m  r   r.   c                V    g | ]%\  }}|j         v t          |          |j         d &S r   r   r   s      r+   rr   zFOpenAIAssistantRunnable._aparse_intermediate_steps.<locals>.<listcomp>p  r   r.   r   r   r   s          @r+   r   z2OpenAIAssistantRunnable._aparse_intermediate_stepsf  s       $6b#9 [&&{'9;;PQQQQQQQQ!$ 	& & # 3 G R& & &"
 
 
 
"4
 
 
 )!($.
 

 #"r.   c                   K   d |                                 D             } | j        j        j        j        j        |d         fd| j        i| d {V S )Nc                "    i | ]\  }}|d v 	||S r   r(   r   s      r+   r   z8OpenAIAssistantRunnable._acreate_run.<locals>.<dictcomp>}  r   r.   r#   r\   )r   r[   rt   r   r   rv   r\   r   s      r+   r   z$OpenAIAssistantRunnable._acreate_run|  s      
 

 
 

 @T&+38?+
 
*
 
 
 
 
 
 
 
 
 	
r.   c                   K   d |                                 D             } | j        j        j        j        d| j        |d| d {V }|S )Nc                "    i | ]\  }}|d v 	||S r   r(   r   s      r+   r   zCOpenAIAssistantRunnable._acreate_thread_and_run.<locals>.<dictcomp>  r   r.   r   r(   )r   r[   rt   r   r   r\   r   s        r+   r   z/OpenAIAssistantRunnable._acreate_thread_and_run  s      
 

 
 

 BD%*2A 
*
 
 
 
 
 
 
 
 
 

 
r.   c                  K   j         dk    r9dd lt          j        j                            d          d                   }t          j        j                            d          d                   }|dk    p|dk    o|dk    | j        j        j        j	        
                    j        d           d {V }fd|D             }| j        s|S d	 |D             }t          fd
|D                       rd                    d |D                       }t          |j        j        ddj        j                  S j         dk    r| j        sj        j        j        S g }j        j        j        D ]}|j        }		 t+          j        |	j        d          }
n2# t0          $ r%}t3          d|	j         d|	j                   |d }~ww xY wt7          |
          dk    rd|
v r|
d         }
|                    t;          |	j        |
|j        dj        j                             |S t+          j                                        d          }t3          dj          d| d          )Nr   r   r   r   r   r   r   c                4    g | ]}|j         j        k    |S r(   r   r   s     r+   rr   z:OpenAIAssistantRunnable._aget_response.<locals>.<listcomp>  r   r.   c                &    g | ]}|j         D ]}|S r(   r   r   s      r+   rr   z:OpenAIAssistantRunnable._aget_response.<locals>.<listcomp>  r   r.   c              3     K   | ]N}r$t          |j        j        j        j                  n#t          |j        j        j        j                  V  Od S r   r   r   s     r+   r   z9OpenAIAssistantRunnable._aget_response.<locals>.<genexpr>  r   r.   r   c              3  .   K   | ]}|j         j        V  d S r   r   r  s     r+   r   z9OpenAIAssistantRunnable._aget_response.<locals>.<genexpr>  r  r.   r  r  r  r  Fr	  r  r  r  r  r  r  r  r  r  ) r  r>   r  r  r  r  r[   rt   r   r   r  r#   r_   r  r  r    rw   r   r   r   r  r  r   r!  r   r"  rf   r#  r$  r8   r%  rQ   r&  s    `           @@r+   _aget_responsez&OpenAIAssistantRunnable._aget_response  sL      :$$MMM 6 < <S A A! DEEM 6 < <S A A! DEEM - 1  ":}':  ".3;DIIU J        H MLLL8LLLL= $## '3  F  	 	 	 	 	  &	 	 	 	 	 
M "L"LV"L"L"LLL($!$!f 
 v-	 	 	 	 Z,,,= J*>IIG 0DO  	$-:h&8GGGDD&   $M#-M M=E]M M  
 t99>>h$&6&6>D)%]#'%.\"v"%-  	 	 	 	 Nz#((**Q777HU#*UU(UUU  s   F''
G1 GGc                   K   d}|r`| j         j        j        j                            ||           d {V }|j        dv }|r"t          j        | j        dz             d {V  |`|S r0  )	r[   rt   r   r   r3  r  asyncior   r^   r4  s        r+   r   z&OpenAIAssistantRunnable._await_for_run  s       	@).6;DD) E        C *(AAK @mD$7$$>?????????  	@ 
r.   )r$   r   )rf   r!   rg   r!   rh   ri   rj   r!   rZ   rk   rl   r   r$   rX   r   )rz   rQ   r{   r|   rl   r   r$   r}   )rf   r!   rg   r!   rh   ri   rj   r!   r[   r   rl   r   r$   rX   )r   r   r$   rQ   )rz   rQ   r$   r   )rz   rQ   r   rQ   r$   r   )r   r   r$   r   )r"   r!   r#   r!   r$   r   )r1   r2   r3   r4   r   rD   rZ   r5   r[   r^   r_   r   re   r6   ry   r   r   r   r   r   r   r   r   r   r   r   rA  r   r(   r.   r+   rX   rX      sH        K KZ %(:;;;F;;;;'L-#N####;HF_'"""   #"  FJG G G G G [GD ?CP P P P Pd  !S !S !S !S !S [!SH ?CU U U U Un# # # #,

 

 

 

   H H H HT   # # # #,

 

 

 

   H H H HT	 	 	 	 	 	r.   rX   )r$   r;   )r$   rF   )rJ   rK   r$   r%   )rJ   rK   r$   rT   )4
__future__r   rC  r  r   timer   typingr   r   r   r	   r
   r   r   r   r   r   langchain_core.agentsr   r   langchain_core.callbacksr   langchain_core.loadr   langchain_core.runnablesr   r   r   langchain_core.toolsr   %langchain_core.utils.function_callingr   pydanticr   r   r   typing_extensionsr   r>   openai.types.beta.threadsr   <openai.types.beta.threads.required_action_function_tool_callr   r    r8   rD   rI   rS   rV   r}   rX   r(   r.   r+   <module>rQ     s   " " " " " "                                            ; : : : : : : : 4 4 4 4 4 4 % % % % % % X X X X X X X X X X ) ) ) ) ) ) H H H H H H 6 6 6 6 6 6 6 6 6 6 " " " " " " MMM777777     
    K   *    K   .        	 	 	 	, , , , 		)*,
U	 U	 U	 U	 U	243CD U	 U	 U	 U	 U	r.   