§
    è˜ºh;  ã                  ó†  — d dl m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 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mZmZ d dl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'ee
e&         e%e
d         e
d         f         Z( G d„ dee	e(f         ¦  «        Z)dS )é    )ÚannotationsN)ÚJSONDecodeError)Úsleep)ÚTYPE_CHECKINGÚAnyÚDictÚListÚOptionalÚSequenceÚTupleÚUnion)Úformat_tool_to_openai_tool)ÚAgentActionÚAgentFinish)Údumpd)ÚField)ÚRunnableConfigÚRunnableSerializableÚensure_config)ÚBaseTool)ÚCallbackManager)ÚThreadMessage)ÚRequiredActionFunctionToolCallc                  ó@   — e Zd ZU dZded<   ded<   ed	d„¦   «         ZdS )
ÚOpenAIAssistantFinishz)AgentFinish with run and thread metadata.ÚstrÚrun_idÚ	thread_idÚreturnÚboolc                ó   — dS ©NF© ©Úclss    ún/var/www/html/services/rag-service/venv/lib/python3.11/site-packages/langchain/agents/openai_assistant/base.pyÚis_lc_serializablez(OpenAIAssistantFinish.is_lc_serializable   ó   € àˆuó    N©r   r    ©Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__Úclassmethodr'   r#   r)   r&   r   r      sL   € € € € € € Ø3Ð3à€K€K�KØ€N€N�Nàðð ð ñ „[ðð ð 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 )ÚOpenAIAssistantActionzJAgentAction with info needed to submit custom tool output to existing run.r   Útool_call_idr   r   r   r    c                ó   — dS r"   r#   r$   s    r&   r'   z(OpenAIAssistantAction.is_lc_serializable+   r(   r)   Nr*   r+   r#   r)   r&   r3   r3   $   sX   € € € € € € ØTÐTàÐÐÑØ€K€K�KØ€N€N�Nàðð ð ñ „[ðð ð r)   r3   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)r8   Úes     r&   Ú_get_openai_clientr=   0   s‰   € ðØˆˆˆàˆvŒ}‰ŒÐøÝð ð ð ÝØPñ
ô 
àð	øøøøõ ð ð ð Ýð<ñ
ô 
ð ð	øøøøðøøøs   ‚ •
AŸ/¯A¼AÁAr   r   c                  ó¶   — e Zd ZU dZ ee¬¦  «        Zded<   	 ded<   	 dZded	<   	 d
Z	ded<   	 e
ddœd*d„¦   «         Z	 d+d,d„Zd-d!„Zd.d"„Zd/d$„Zd0d&„Zd1d)„ZdS )2Ú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_factoryr6   Úclientr   Úassistant_idg     @�@ÚfloatÚcheck_every_msFr    Úas_agentN)rA   ÚnameÚinstructionsÚtoolsúSequence[Union[BaseTool, dict]]ÚmodelúOptional[openai.OpenAI]Úkwargsr   r   c               ó
  — |pt          ¦   «         }g }|D ]=}t          |t          ¦  «        r|nt          |¦  «        }	|                     |	¦  «         Œ>|j        j                             ||||¬¦  «        }
 | dd|
j        i|¤Ž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 client. Will create default client if not specified.

        Returns:
            OpenAIAssistantRunnable configured to run using the created assistant.
        )rF   rG   rH   rJ   rB   r#   )	r=   Ú
isinstanceÚdictr   ÚappendÚbetaÚ
assistantsÚcreateÚid)r%   rF   rG   rH   rJ   rA   rL   Úopenai_toolsÚtoolÚoai_toolÚ	assistants              r&   Úcreate_assistantz(OpenAIAssistantRunnable.create_assistantŸ   s°   € ð. Ð/Õ-Ñ/Ô/ˆØˆØð 	*ð 	*ˆDå" 4­Ñ.Ô.ÐT��Õ4NÈtÑ4TÔ4Tð ð ×Ò Ñ)Ô)Ð)Ð)Ø”KÔ*×1Ò1ØØ%ØØð	 2ñ 
ô 
ˆ	ð ˆsÐ7Ð7 	¤Ð7°Ð7Ð7Ð7r)   ÚinputrO   ÚconfigúOptional[RunnableConfig]Ú
OutputTypec           	     óR  — t          |¦  «        }t          j        |                     d¦  «        |                     d¦  «        |                     d¦  «        ¬¦  «        }|                     t          | ¦  «        ||                     d¦  «        ¬¦  «        }	 | j        rS|                     d¦  «        r>|                      |d         ¦  «        } | j        j	        j
        j        j        di |¤Ž}�nd|vrbd	|d
         |                     dg ¦  «        |                     d¦  «        dœg|                     d¦  «        dœ}|                      ||¦  «        }nœd|vrw| j        j	        j
        j                             |d         |d
         d	|                     dg ¦  «        |                     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.
                file_ids: File ids to include in new run. Used for retrieval.
                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:

        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Úfile_idsÚmessage_metadata)Úrolerh   ri   ra   Úthread_metadata)Úmessagesra   r   )rh   rk   ri   ra   N)ra   r#   )r   r   Ú	configureÚgetÚon_chain_startr   rE   Ú_parse_intermediate_stepsrA   rQ   ÚthreadsÚrunsÚsubmit_tool_outputsÚ_create_thread_and_runrm   rS   Ú_create_runÚ_wait_for_runrT   r   ÚBaseExceptionÚon_chain_errorÚ_get_responseÚon_chain_endrO   )ÚselfrZ   r[   Úcallback_managerÚrun_managerÚtool_outputsÚrunÚthreadÚ_r<   Úresponses              r&   ÚinvokezOpenAIAssistantRunnable.invokeÅ   sã  € õ8 ˜vÑ&Ô&ˆÝ*Ô4Ø"(§*¢*¨[Ñ"9Ô"9Ø#ŸZšZ¨Ñ/Ô/Ø!'§¢¨JÑ!7Ô!7ð
ñ 
ô 
Ðð
 '×5Ò5Ý�$‰KŒK˜ V§Z¢Z°
Ñ%;Ô%;ð 6ñ 
ô 
ˆð&	àŒ}ð  Q §¢Ð+?Ñ!@Ô!@ð  QØ#×=Ò=ØÐ.Ô/ñ ô  �ð H�d”kÔ&Ô.Ô3ÔGÐWÐWÈ,ÐWÐW�‘à EÐ)Ð)ð %+Ø',¨YÔ'7Ø(-¯	ª	°*¸bÑ(AÔ(AØ(-¯	ª	Ð2DÑ(EÔ(Eð	ð ð!ð !&§	¢	Ð*;Ñ <Ô <ð
ð 
�ð ×1Ò1°%¸Ñ@Ô@��à Ð&Ð&Ø”KÔ$Ô,Ô5×<Ò<Ø˜+Ô&Ø! )Ô,ØØ"ŸYšY z°2Ñ6Ô6Ø"ŸYšYÐ'9Ñ:Ô:ð =ñ ô �ð ×&Ò& uÑ-Ô-��ð H�d”kÔ&Ô.Ô3ÔGÐPÐPÈ%ÐPÐP�Ø×$Ò$ S¤V¨S¬]Ñ;Ô;ˆCˆCøÝð 	ð 	ð 	Ø×&Ò& qÑ)Ô)Ð)ØˆGøøøøð	øøøð	Ø×)Ò)¨#Ñ.Ô.ˆHð
 ×$Ò$ XÑ.Ô.Ð.ØˆOøõ ð 	ð 	ð 	Ø×&Ò& q°3·8²8±:´:Ð&Ñ>Ô>Ð>ØˆGøøøøð	øøøs1   ÂE<H È
H<È H7È7H<É I, É,
J&É6+J!Ê!J&rf   ú'List[Tuple[OpenAIAssistantAction, str]]c                óÐ   ‡— |d         \  }}|                       |j        |j        ¦  «        }d„ |j        j        j        D ¦   «         Šˆfd„|D ¦   «         }||j        |j        dœ}|S )Néÿÿÿÿc                ó   — h | ]	}|j         ’Œ
S r#   )rT   )Ú.0Útcs     r&   ú	<setcomp>zDOpenAIAssistantRunnable._parse_intermediate_steps.<locals>.<setcomp>  s'   € ð "
ð "
ð "
ØˆBŒEð"
ð "
ð "
r)   c                óV   •— g | ]%\  }}|j         ‰v ¯t          |¦  «        |j         d œ‘Œ&S ))Úoutputr4   )r4   r   )r‰   Úactionr�   Úrequired_tool_call_idss      €r&   ú
<listcomp>zEOpenAIAssistantRunnable._parse_intermediate_steps.<locals>.<listcomp>"  sG   ø€ ð 
ð 
ð 
á�˜ØÔ"Ð&<Ð<Ð<õ ˜6‘{”{°FÔ4GÐHÐHà<Ð<Ð<r)   )r   r   r   )rw   r   r   Úrequired_actionrt   Ú
tool_calls)r|   rf   Úlast_actionÚlast_outputr€   r   rt   r�   s          @r&   rq   z1OpenAIAssistantRunnable._parse_intermediate_steps  s¥   ø€ ð $6°bÔ#9Ñ ˆ�[Ø× Ò  Ô!3°[Ô5JÑKÔKˆð"
ð "
ØÔ/ÔCÔNð"
ñ "
ô "
Ðð
ð 
ð 
ð 
à"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#   ©r‰   ÚkÚvs      r&   ú
<dictcomp>z7OpenAIAssistantRunnable._create_run.<locals>.<dictcomp>/  ó4   € ð 
ð 
ð 
á��1ØÐFÐFÐFð ˆqàFÐFÐFr)   r   rB   )ÚitemsrA   rQ   rr   rs   rS   rB   )r|   rZ   Úparamss      r&   rv   z#OpenAIAssistantRunnable._create_run.  sn   € ð
ð 
àŸš™œð
ñ 
ô 
ˆð
 4ˆtŒ{ÔÔ'Ô,Ô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)   )rB   r�   r#   )rž   rA   rQ   rr   Úcreate_and_runrB   )r|   rZ   r�   rŸ   r€   s        r&   ru   z.OpenAIAssistantRunnable._create_thread_and_run:  sj   € ð
ð 
àŸš™œð
ñ 
ô 
ˆð
 6ˆdŒkÔÔ&Ô5ð 
ØÔ*Øð
ð 
ð ð
ð 
ˆð
 ˆ
r)   r€   c                óò  ‡‡— ‰j         dk    r¼dd lŠ| 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# t(          $ r%}	t+          d|j        › d|j        › �¦  «        |	‚d }	~	ww xY wt/          |¦  «        dk    rd|v r|d         }|                     t3          |j        ||j        d‰j        ‰j        ¬¦  «        ¦  «         Œ´|S t#          j        ‰                     ¦   «         d¬¦  «        }
t+          d‰j         › d|
› d�¦  «        ‚)NÚ	completedr   Úasc)Úorderc                ó4   •— g | ]}|j         ‰j        k    ¯|‘ŒS r#   )r   rT   )r‰   Úmsgr€   s     €r&   r�   z9OpenAIAssistantRunnable._get_response.<locals>.<listcomp>P  s'   ø€ ÐLÐLÐL C°s´zÀSÄVÒ7KÐ7K˜CÐ7KÐ7KÐ7Kr)   c                ó&   — g | ]}|j         D ]}|‘ŒŒS r#   )rh   )r‰   r¨   Úmsg_contents      r&   r�   z9OpenAIAssistantRunnable._get_response.<locals>.<listcomp>S  s;   € ð ð ð Ø #ÀsÄ{ðð Ø8C�ðð ð ð r)   c              3  ó`   •K  — | ](}t          |‰j        j        j        j        ¦  «        V — Œ)d S ©N)rN   ÚtypesrQ   rr   ÚMessageContentText)r‰   rh   r8   s     €r&   ú	<genexpr>z8OpenAIAssistantRunnable._get_response.<locals>.<genexpr>V  sL   øè è € ð ð àõ ˜7 F¤LÔ$5Ô$=Ô$PÑQÔQðð ð ð ð ð r)   ú
c              3  ó.   K  — | ]}|j         j        V — Œd S r¬   )ÚtextÚvalue)r‰   rh   s     r&   r¯   z8OpenAIAssistantRunnable._get_response.<locals>.<genexpr>Z  s'   è è € Ð"LÐ"L¸' 7¤<Ô#5Ð"LÐ"LÐ"LÐ"LÐ"LÐ"Lr)   )r�   r   r   Ú )Úreturn_valuesÚlogr   r   Úrequires_actionF)Ústrictz*Received invalid JSON function arguments: z for function é   Ú__arg1)rV   Ú
tool_inputr4   r¶   r   r   é   )ÚindentzUnexpected run status: z. Full run info:

ú))Ústatusr8   rA   rQ   rr   rm   Úlistr   rE   ÚallÚjoinr   rT   r‘   rt   r’   ÚfunctionÚjsonÚloadsÚ	argumentsr   Ú
ValueErrorrF   ÚlenrP   r3   ÚdumpsrO   )r|   r€   rm   Únew_messagesÚanswerÚactionsÚ	tool_callrÃ   Úargsr<   Úrun_infor8   s    `         @r&   rz   z%OpenAIAssistantRunnable._get_responseG  s°  øø€ ð Œ:˜Ò$Ð$ØˆMˆMˆMà”{Ô'Ô/Ô8×=Ò=Ø” Uð >ñ ô ˆHð MÐLÐLÐL¨8ÐLÑLÔLˆLØ”=ð $Ø#Ð#ðð Ø'3ðñ ô ˆFõ ð ð ð ð à%ðñ ô ñ ô ð Mð ŸšÐ"LÐ"LÀVÐ"LÑ"LÔ"LÑLÔL�Ý(à$Ø!$¤Ø!œfðð ð
 Ø”vØœ-ð	ñ 	ô 	ð 	ð ŒZÐ,Ò,Ð,Ø”=ð JØÔ*Ô>ÔIÐIØˆGØ Ô0ÔDÔOð ð �	Ø$Ô-�ðÝœ: hÔ&8ÀÐGÑGÔG�D�DøÝ&ð ð ð Ý$ðMØ#Ô-ðMð MØ=E¼]ðMð Mñô ð ðøøøøðøøøõ
 �t‘9”9 ’>�> h°$Ð&6Ð&6Ø œ>�DØ—’Ý)Ø%œ]Ø#'Ø%.¤\ØØ"œvØ"%¤-ðñ ô ñ	ô 	ð 	ð 	ð ˆNå”z #§(¢(¡*¤*°QÐ7Ñ7Ô7ˆHÝØU¨#¬*ÐUÐUÈ(ÐUÐUÐUñô ð s   Ä
D&Ä&
EÄ0 EÅEr   r   c                ó¬   — d}|rO| j         j        j        j                             ||¬¦  «        }|j        dv }|rt          | j        dz  ¦  «         |°O|S )NT)r   )Úin_progressÚqueuediè  )rA   rQ   rr   rs   Úretriever¿   r   rD   )r|   r   r   rÑ   r€   s        r&   rw   z%OpenAIAssistantRunnable._wait_for_run…  sn   € ØˆØð 	2Ø”+Ô"Ô*Ô/×8Ò8¸È9Ð8ÑUÔUˆCØœ*Ð(AÐAˆKØð 2Ý�dÔ)¨DÑ0Ñ1Ô1Ð1ð	 ð 	2ð
 ˆ
r)   )rF   r   rG   r   rH   rI   rJ   r   rA   rK   rL   r   r   r?   r¬   )rZ   rO   r[   r\   r   r]   )rf   r…   r   rO   )rZ   rO   r   r   )rZ   rO   r�   rO   r   r   )r€   r   r   r   )r   r   r   r   r   r   )r,   r-   r.   r/   r   r=   rA   r0   rD   rE   r1   rY   r„   rq   rv   ru   rz   rw   r#   r)   r&   r?   r?   H   s6  € € € € € € ðKð KðZ "˜EÐ2DÐEÑEÔE€FÐEÐEÐEÑEØØÐÐÑØØ#€NÐ#Ð#Ð#Ñ#Ø;Ø€HÐÐÐÑØFàð +/ð#8ð #8ð #8ð #8ð #8ñ „[ð#8ðL ?CðSð Sð Sð Sð Sðj#ð #ð #ð #ð(

ð 

ð 

ð 

ðð ð ð ð<ð <ð <ð <ð|ð ð ð ð ð r)   r?   )r   r6   )*Ú
__future__r   rÄ   r   Útimer   Útypingr   r   r   r	   r
   r   r   r   Ú+langchain_community.tools.convert_to_openair   Úlangchain_core.agentsr   r   Úlangchain_core.loadr   Úlangchain_core.pydantic_v1r   Úlangchain_core.runnablesr   r   r   Úlangchain_core.toolsr   Úlangchain.callbacks.managerr   r8   Úopenai.types.beta.threadsr   Ú<openai.types.beta.threads.required_action_function_tool_callr   r   r3   r=   r]   r?   r#   r)   r&   ú<module>rà      s0  ðØ "Ð "Ð "Ð "Ð "Ð "à €€€Ø  Ð  Ð  Ð  Ð  Ð  Ø Ð Ð Ð Ð Ð Ø SÐ SÐ SÐ SÐ SÐ SÐ SÐ SÐ SÐ SÐ SÐ SÐ SÐ SÐ SÐ SÐ SÐ SÐ SÐ Sà RÐ RÐ RÐ RÐ RÐ RØ :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ø %Ð %Ð %Ð %Ð %Ð %Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ø XÐ XÐ XÐ XÐ XÐ XÐ XÐ XÐ XÐ XØ )Ð )Ð )Ð )Ð )Ð )à 7Ð 7Ð 7Ð 7Ð 7Ð 7àð Ø€M€M€MØ7Ð7Ð7Ð7Ð7Ð7ðð ð ð ð ð ð
ð ð ð ð ˜Kñ ô ð ð	ð 	ð 	ð 	ð 	˜Kñ 	ô 	ð 	ðð ð ð ð  ØÐ	ÔØØˆÔØÐ	)Ô*ð,ô€
ðDð Dð Dð Dð DÐ2°4¸Ð3CÔDñ Dô Dð Dð Dð Dr)   