
    ihu                       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Z0	 	 	 	 ddZ1eee-   e,ed   ed   f   Z2 G d deee2f         Z3y)     )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                  8    e Zd ZU dZded<   ded<   edd       Zy)OpenAIAssistantFinishzuAgentFinish with run and thread metadata.

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

        Returns:
            False
        F clss    d/var/www/html/dev/engine/venv/lib/python3.12/site-packages/langchain/agents/openai_assistant/base.pyis_lc_serializablez(OpenAIAssistantFinish.is_lc_serializable0            Nreturnbool__name__
__module____qualname____doc____annotations__classmethodr*   r&   r,   r)   r    r    %   s%     KN r,   r    c                  B    e Zd ZU dZded<   ded<   ded<   edd       Zy)	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#   c                     yr%   r&   r'   s    r)   r*   z(OpenAIAssistantAction.is_lc_serializableG   r+   r,   Nr-   r0   r&   r,   r)   r8   r8   :   s+     KN r,   r8   c                     	 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_clientrC   Q   s]    v}} P
	  <
 	    	A	,A	AA	c                     	 dd l }  | j                         S # t        $ r}t        d      |d }~wt        $ r}t        d      |d }~ww xY wr<   )r=   AsyncOpenAIr?   r@   rA   s     r)   _get_openai_async_clientrG   a   s`    !v!!## P
	  <
 	rD   c                D    d}t        | t              xr d| v xr | d   |v S )z<Determine if tool corresponds to OpenAI Assistants built-in.)code_interpreter	retrievaltype)
isinstancedict)toolassistants_builtin_toolss     r)   _is_assistants_builtin_toolrP   q   s8      A4 	7t^	7&\55r,   c                2    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."
    )rP   r   )rN   s    r)   _get_assistants_toolrR   }   s     #4(%d++r,   r   r   c                     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      d"d       Zedd	 	 	 	 	 	 	 	 	 	 	 	 	 d#d       Z	 d$	 	 	 	 	 	 	 d%dZedd	 	 	 	 	 	 	 	 	 	 	 	 	 d&d       Z	 d$	 	 	 	 	 	 	 d%dZ	 	 	 	 d'dZd(dZd)dZd*dZd+dZ	 	 	 	 d'dZd(dZd)dZd*d Zd+d!Zy),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)modec                    | j                   2dd l}| j                  j                  } |j                  |      | _         | S )Nr   )api_key)rW   r=   rV   r_   rF   )selfr=   r_   s      r)   validate_async_clientz-OpenAIAssistantRunnable.validate_async_client   s:    $kk))G 2 2 27 CDr,   )rV   c          
         |xs
 t               }|j                  j                  j                  |||D cg c]  }t	        |       c}|      } | d|j
                  |d|S c c}w )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.
        nameinstructionstoolsmodel)rX   rV   r&   )rC   beta
assistantscreaterR   id)	r(   rd   re   rf   rg   rV   kwargsrN   	assistants	            r)   create_assistantz(OpenAIAssistantRunnable.create_assistant   so    2 /-/KK**11%:?@$'-@	 2 
	 F	VFvFF As   A$c                   t        |      }t        j                  |j                  d      |j                  d      |j                  d            }|j	                  t        |       ||j                  d      xs | j                               }	 | j                  r`|j                  d      rO| j                  |d         } | j                  j                  j                  j                  j                  di |}nd|vr>d	|d
   |j                  d      dg|j                  d      d}| j                  ||      }nd|vrd| j                  j                  j                  j                  j!                  |d   |d
   d	|j                  d            }	| j#                  |      }n: | j                  j                  j                  j                  j                  di |}| j%                  |j&                  |j(                        }	 | j/                  |      }|j1                  |       |S # t*        $ r}
|j-                  |
       |
d}
~
ww xY w# t*        $ r(}
|j-                  |
|j3                                |
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.
                parallel_tool_calls: Allow Assistant to set parallel_tool_calls
                    for this run.
                top_p: Override Assistant top_p for this run.
                temperature: Override Assistant temperature for this run.
                max_completion_tokens: Allow setting max_completion_tokens for this run.
                max_prompt_tokens: Allow setting max_prompt_tokens 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rd   intermediate_stepsr#   usercontentmessage_metadataroler{   rr   thread_metadatamessagesrr   r"   r{   r~   rr   Nrr   r&   )r   r   	configuregeton_chain_startr   get_namer[   _parse_intermediate_stepsrV   rh   threadsrunssubmit_tool_outputs_create_thread_and_runr   rj   _create_run_wait_for_runrk   r#   BaseExceptionon_chain_error_get_responseon_chain_endrM   r`   inputconfigrl   callback_managerrun_managertool_outputsrunthread_rB   responses               r)   invokezOpenAIAssistantRunnable.invoke  sZ   B v&*44"(**["9#ZZ/!'J!7

 '55$KVZZ
%;%Nt}} 6 
$	}}+?!@#==./  Hdkk&&..33GGW,WE) %+',Y'7(-		2D(E! !&		*; <	 11%@&KK$$,,55<<+&!),"YY'9:	 =  &&u- Hdkk&&..33GGP%P$$SVVS]];C	))#.H
 $$X.O  	&&q)G	
  	&&q388:&>G	s1   E6H+ I +	I4II	J #I;;J )rW   c                  K   |xs
 t               }|D cg c]  }t        |       }}|j                  j                  j	                  ||||       d{   }	 | d|	j
                  |d|S c c}w 7 w)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.
        rc   N)rX   rW   r&   )rG   rR   rh   ri   rj   rk   )
r(   rd   re   rf   rg   rW   rl   rN   openai_toolsrm   s
             r)   acreate_assistantz)OpenAIAssistantRunnable.acreate_assistanto  s     4 $A'?'A?DEt,T2EE&++66==%	 > 
 
	 R	<R6RR F
s   A6A/.A6A4A6c                  K   |xs i }t        j                  |j                  d      |j                  d      |j                  d            }|j                  t	        |       ||j                  d      xs | j                               }	 | j                  rq|j                  d      r`| j                  |d          d{   } | j                  j                  j                  j                  j                  di | d{   }nd	|vrFd
|d   |j                  d      dg|j                  d      d}| j                  ||       d{   }nd|vrt| j                  j                  j                  j                  j                  |d	   |d   d
|j                  d             d{   }	| j!                  |       d{   }nB | j                  j                  j                  j                  j                  di | d{   }| j#                  |j$                  |j&                         d{   }	 | j-                  |      }|j/                  |       |S 7 7 a7 7 7 7 d7 8# t(        $ r}
|j+                  |
       |
d}
~
ww xY w# t(        $ r(}
|j+                  |
|j1                                |
d}
~
ww xY w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: Overrides the instructions of the assistant.
                additional_instructions: Appends additional instructions.
                model: Override Assistant model for this run.
                tools: Override Assistant tools for this run.
                parallel_tool_calls: Allow Assistant to set parallel_tool_calls
                    for this run.
                top_p: Override Assistant top_p for this run.
                temperature: Override Assistant temperature for this run.
                max_completion_tokens: Allow setting max_completion_tokens for this run.
                max_prompt_tokens: Allow setting max_prompt_tokens 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]].
        rp   rq   rr   rs   rw   rx   ry   Nr#   rz   r{   r|   r}   r   r   r"   r   r   r&   )r   r   r   r   r   r   r[   _aparse_intermediate_stepsrW   rh   r   r   r   _acreate_thread_and_runr   rj   _acreate_run_await_for_runrk   r#   r   r   r   r   rM   r   s               r)   ainvokezOpenAIAssistantRunnable.ainvoke  s    F 2*44"(**["9#ZZ/!'J!7

 '55$KVZZ
%;%Nt}} 6 
(	}}+?!@%)%D%D./&   TD--22::??SS "  E) %+',Y'7(-		2D(E! !&		*; <	 !88GG&++0088AAHH+&!),"YY'9:	 I   !--e44 TD--22::??SS   ++CFFCMMBBC	))#.H
 $$X.O[  H 5 C 	&&q)G	
  	&&q388:&>G	s   B
K
4I2 I!AI2 I$A
I2 I'AI2 -I*.I2 I,AI2 	I.
-I2 7I08I2 =J K
!I2 $I2 'I2 *I2 ,I2 .I2 0I2 2	J;JJK
	K#KKK
c                   |d   \  }}| j                  |j                  |j                        }t               }|j                  r7|j                  j
                  j                  D ch c]  }|j                   }}|D cg c]+  \  }}|j                  |v rt        |      |j                  d- }	}}|	|j                  |j                  d}
|
S c c}w c c}}w N)outputr9   )r   r"   r#   
r   r"   r#   setrequired_actionr   
tool_callsrk   r9   r!   r`   ry   last_actionlast_outputr   required_tool_call_idstcactionr   r   r   s              r)   r   z1OpenAIAssistantRunnable._parse_intermediate_steps  s     $6b#9 [  !3!3[5J5JK!$ # 3 3 G G R R&&" &
 #5
""&<< 6{F4G4GH
 
 )!(($..

 #"&
s   'C0Cc                    |j                         D ci c]  \  }}|dv r|| }}} | j                  j                  j                  j                  j
                  |d   fd| j                  i|S c c}}w N)
re   rg   rf   additional_instructionsparallel_tool_callstop_ptemperaturemax_completion_tokensmax_prompt_tokensrun_metadatar#   rX   )itemsrV   rh   r   r   rj   rX   r`   r   kvparamss        r)   r   z#OpenAIAssistantRunnable._create_run  s     
1 qD
 
" 4t{{'',,33+
**
 
 	
#
s   A2c                    |j                         D ci c]  \  }}|dv r|| }}} | j                  j                  j                  j                  d| j
                  |d|}|S c c}}w N)	re   rg   rf   r   r   r   r   r   r   )rX   r   r&   )r   rV   rh   r   create_and_runrX   r`   r   r   r   r   r   r   s          r)   r   z.OpenAIAssistantRunnable._create_thread_and_run  s     
1
 qD
 
  6dkk&&55 
**
 

 
+
s   A'c                   |j                   dk(  rdd lt        j                  j                  j                  d      d         }t        j                  j                  j                  d      d         }|dkD  xs |dk(  xr |dk\  | j                  j                  j                  j                  j                  |j                  d      }|D cg c]  }|j                  |j                  k(  s|  }}| j                  s|S |D cg c]  }|j                  D ]  }|  }}}t!        fd|D              rd	j#                  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/        j0                  |j2                  d      }t;        |      dk(  r	d|v r|d   }|	j=                  t?        |j8                  ||
j                  d|j                  |j                                |	S t/        j@                  |jC                         d      }t7        d|j                    d| d      c c}w c c}}w # t4        $ r+}t7        d|j2                   d|j8                         |d }~ww xY w)N	completedr   .      ascorderc              3     K   | ]n  }r4t        |j                  j                  j                  j                        n3t        |j                  j                  j                  j
                         p y wNrL   typesrh   r   TextContentBlockMessageContentText.0r{   r=   version_gte_1_14s     r)   	<genexpr>z8OpenAIAssistantRunnable._get_response.<locals>.<genexpr>L  f      
  ( w(9(9(A(A(R(RS#))11DD
   A4A7
c              3  H   K   | ]  }|j                   j                    y wr   textvaluer   r{   s     r)   r   z8OpenAIAssistantRunnable._get_response.<locals>.<genexpr>W       "L'7<<#5#5"L    "r   r#   r"    return_valueslogr"   r#   requires_actionFstrict*Received invalid JSON function arguments:  for function __arg1rN   
tool_inputr9   r   r"   r#      indentUnexpected run status: . Full run info:

))"statusr=   intversionVERSIONsplitrV   rh   r   r   listr#   r"   rk   r[   r{   alljoinr    r   r   r   functionjsonloads	argumentsr   
ValueErrorrd   lenappendr8   dumpsrM   r`   r   major_versionminor_versionr   msgnew_messagesmsg_contentansweractions	tool_callr   argsrB   run_infor=   r   s                  @@r)   r   z%OpenAIAssistantRunnable._get_response7  s    ::$ 6 6 < <S A! DEM 6 6 < <S A! DEM - 1  ":}':  {{''//88==U > H ,4LCszzSVV7KCLLL==##'3 #s{{8CF   
  &
 
 "LV"LL($!$!ff
 vv--	 	 ZZ,,==**>>IIIG 00DDOO 	$--::h&8&8GD t9>h$&6>D)%]]#'%.\\"vv"%--	* Nzz#((*Q7H)#**5I(STU q MB ' $D#--.nX]]OM s*   K4KK	?!K	L&K>>Lc                    d}|rf| j                   j                  j                  j                  j	                  ||      }|j
                  dv }|rt        | j                  dz         |rfS NT)r#   )in_progressqueuedi  )rV   rh   r   r   retriever   r   rZ   r`   r"   r#   r  r   s        r)   r   z%OpenAIAssistantRunnable._wait_for_run  sf    ++""**//8898UC**(AAKd))D01	 
 
r,   c                  K   |d   \  }}| j                  |j                  |j                        }t               }|j                  r7|j                  j
                  j                  D ch c]  }|j                   }}|D cg c]+  \  }}|j                  |v rt        |      |j                  d- }	}}|	|j                  |j                  d}
|
S c c}w c c}}w wr   r   r   s              r)   r   z2OpenAIAssistantRunnable._aparse_intermediate_steps  s      $6b#9 [  !3!3[5J5JK!$ # 3 3 G G R R&&" &
 #5
""&<< 6{F4G4GH
 
 )!(($..

 #"&
s   A'C)C<C0C3*Cc                  K   |j                         D ci c]  \  }}|dv r|| }}} | j                  j                  j                  j                  j
                  |d   fd| j                  i| d {   S c c}}w 7 
wr   )r   rW   rh   r   r   rj   rX   r   s        r)   r   z$OpenAIAssistantRunnable._acreate_run  s      
1 qD
 
" @T&&++3388??+
**
 
 
 	
#
"
s   BA<AB7B8Bc                   K   |j                         D ci c]  \  }}|dv r|| }}} | j                  j                  j                  j                  d| j
                  |d| d {   }|S c c}}w 7 wr   )r   rW   rh   r   r   rX   r   s          r)   r   z/OpenAIAssistantRunnable._acreate_thread_and_run  s      
1
 qD
 
  BD%%**22AA 
**
 
 

 
+
 
s   A9A1AA9*A7+A9c                *  K   |j                   dk(  rdd lt        j                  j                  j                  d      d         }t        j                  j                  j                  d      d         }|dkD  xs |dk(  xr |dk\  | j                  j                  j                  j                  j                  |j                  d       d {   }|D cg c]  }|j                  |j                  k(  s|  }}| j                  s|S |D cg c]  }|j                  D ]  }|  }}}t!        fd|D              rd	j#                  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/        j0                  |j2                  d      }t;        |      dk(  r	d|v r|d   }|	j=                  t?        |j8                  ||
j                  d|j                  |j                                |	S t/        j@                  |jC                         d      }t7        d|j                    d| d      7 c c}w c c}}w # t4        $ r+}t7        d|j2                   d|j8                         |d }~ww xY ww)Nr   r   r   r   r   r   r   c              3     K   | ]n  }r4t        |j                  j                  j                  j                        n3t        |j                  j                  j                  j
                         p y wr   r   r   s     r)   r   z9OpenAIAssistantRunnable._aget_response.<locals>.<genexpr>  r   r   r   c              3  H   K   | ]  }|j                   j                    y w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   rW   rh   r   r   r   r#   r"   rk   r[   r{   r   r   r    r   r   r   r   r   r   r  r   r  rd   r  r  r8   r  rM   r  s                  @@r)   _aget_responsez&OpenAIAssistantRunnable._aget_response  s     ::$ 6 6 < <S A! DEM 6 6 < <S A! DEM - 1  ":}':  "..33;;DDIIU J  H ,4LCszzSVV7KCLLL==##'3 #s{{8CF   
  &
 
 "LV"LL($!$!ff
 vv--	 	 ZZ,,==**>>IIIG 00DDOO 	$--::h&8&8GD t9>h$&6>D)%]]#'%.\\"vv"%--	* Nzz#((*Q7H)#**5I(STU w MB ' $D#--.nX]]OM s\   CLKLK>KLK1CL	!K*B%LL	L%&LLLc                  K   d}|r| j                   j                  j                  j                  j	                  ||       d {   }|j
                  dv }|r*t        j                  | j                  dz         d {    |rS 7 C7 wr  )	rW   rh   r   r   r  r   asyncior   rZ   r  s        r)   r   z&OpenAIAssistantRunnable._await_for_run  s     ))..66;;DD) E  C **(AAKmmD$7$7$$>???  

 @s*   ABB	9B?B BBB)r.   r   )rd   r!   re   r!   rf   Sequence[Union[BaseTool, dict]]rg   r!   rV   z2Optional[Union[openai.OpenAI, openai.AzureOpenAI]]rl   r   r.   rT   r   )r   rM   r   zOptional[RunnableConfig]rl   r   r.   
OutputType)rd   r!   re   r!   rf   r   rg   r!   rW   z<Optional[Union[openai.AsyncOpenAI, openai.AsyncAzureOpenAI]]rl   r   r.   rT   )ry   z'List[Tuple[OpenAIAssistantAction, str]]r.   rM   )r   rM   r.   r   )r   rM   r   rM   r.   r   )r   r   r.   r   )r"   r!   r#   r!   r.   r   )r1   r2   r3   r4   r   rC   rV   r5   rW   rZ   r[   r   ra   r6   rn   r   r   r   r   r   r   r   r   r   r   r   r  r   r&   r,   r)   rT   rT      s   KZ (:;FC;'L#-#NE#;HdF'" #  FJGG G /	G
 G CG G 
!G GD ?CVV#;VNQV	Vp  !S!S !S /	!S
 !S
!S !S 
!!S !SH ?C\\#;\NQ\	\|#"I#	#,
00IV#"I#	#,
00IV	r,   rT   )r.   zopenai.OpenAI)r.   zopenai.AsyncOpenAI)rN   :Union[Dict[str, Any], Type[BaseModel], Callable, BaseTool]r.   r/   )rN   r"  r.   zDict[str, Any])4
__future__r   r  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   rC   rG   rP   rR   r!  rT   r&   r,   r)   <module>r0     s    "        ; 4 % X X ) H 6 6 "7
K *K .  	
D			,
D,, 		)*,
R
243CD R
r,   