
    hhL~                     T   d dl Z d dlZd dlZd dlmZ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mZ d dlmZ d dlmZ d dlmZ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,m-Z- d dl.m/Z/m0Z0m1Z1 d dl2m3Z3m4Z4m5Z5 d dl6m7Z7 d dl8m9Z9 d dl:m;Z;m<Z< d dl=m>Z> d dl?m@Z@ dZAddddddddZBde	deCfdZDd eEd!eEdeEfd"ZF	 d/d#eee	                  dee         fd$ZGd%e	de"fd&ZH G d' d(e          ZI G d) d*eI          ZJ G d+ d,eI          ZK G d- d.ee>          ZLdS )0    N)ABCabstractmethod)
itemgetter)AnyCallableDictIteratorListLiteralMappingOptionalSequenceTypeUnion)CallbackManagerForLLMRun)LanguageModelInput)BaseChatModelgenerate_from_stream)	AIMessageAIMessageChunkBaseMessageChatMessageHumanMessageSystemMessageToolCallToolMessage)ToolCallChunk)JsonOutputParserPydanticOutputParser)OutputParserLike)JsonOutputKeyToolsParserPydanticToolsParser)ChatGenerationChatGenerationChunk
ChatResult)RunnableRunnableMapRunnablePassthrough)BaseTool)convert_to_openai_function)	BaseModel
ConfigDict)OCIGenAIBase)enforce_stop_tokenszocid1.generativeaiendpointstrfloatboolintr
   r   any)stringnumberbooleanintegerarrayobjectr3   objreturnc                 V    t          | t                    ot          | t                    S N)
isinstancetype
issubclassr+   )r:   s    n/var/www/FlaskApp/flask-venv/lib/python3.11/site-packages/langchain_community/chat_models/oci_generative_ai.py_is_pydantic_classrB   D   s!    c4  ?ZY%?%??    namedescriptionc                 f    t          j        d|  dd|          }t          j        dd|          }|S )z
    Removes the `{name}{signature} - ` prefix and Args: section from tool description.
    The signature is usually present for tools created with the @tool decorator,
    whereas the Args: section may be present in function doc blocks.
    ^z\(.*?\) -(?:> \w+? -)?  z(?s)(?:\n?\n\s*?)?Args:.*$)resub)rD   rE   s     rA   '_remove_signature_from_tool_descriptionrK   H   s=     &;d;;;RMMK&6KHHKrC   
tool_callsc                     | sg S g }| D ]X}|                     t          j                    j        dd         |j        t          j        |j                  ddd           Y|S )zW
    Formats a OCI GenAI API response into the tool call format used in Langchain.
    NrD   	argumentsfunctionidrP   r?   )appenduuiduuid4hexrD   jsondumps
parameters)rL   formatted_tool_calls	tool_calls      rA   _format_oci_tool_callsr\   S   s      	 

 

	##jll&qqq)%N!%I,@!A!A  # 		
 		
 		
 		
  rC   r[   c                 z    t          j                    j        dd         }t          | j        | j        |          S )zCConvert a OCI GenAI tool call into langchain_core.messages.ToolCallN)rD   argsrR   )rT   rU   rV   r   rD   rY   )r[   _ids     rA   #_convert_oci_tool_call_to_langchainr`   k   s3    
*,,
111
Ci.BsKKKKrC   c            	          e Zd Zeedefd                        Zededefd            Zede	defd            Z
ede	defd            Zedede	eef         fd            Zede	de	eef         fd	            Zed
edefd            Zededede	eef         fd            Zedeee	eef         ee         eef                  de	eef         fd            ZdS )Providerr;   c                     d S r=    selfs    rA   stop_sequence_keyzProvider.stop_sequence_keyr   s    (+rC   responsec                     d S r=   rd   rf   rh   s     rA   chat_response_to_textzProvider.chat_response_to_textv   s    ;>3rC   
event_datac                     d S r=   rd   rf   rl   s     rA   chat_stream_to_textzProvider.chat_stream_to_texty       <?CrC   c                     d S r=   rd   rn   s     rA   is_chat_stream_endzProvider.is_chat_stream_end|   rp   rC   c                     d S r=   rd   rj   s     rA   chat_generation_infozProvider.chat_generation_info   s    EHSrC   c                     d S r=   rd   rn   s     rA   chat_stream_generation_infoz$Provider.chat_stream_generation_info   s    ORsrC   messagec                     d S r=   rd   rf   rw   s     rA   get_rolezProvider.get_role   s    58SrC   messageskwargsc                     d S r=   rd   )rf   r{   r|   s      rA   messages_to_oci_paramszProvider.messages_to_oci_params   s	     rC   toolc                     d S r=   rd   rf   r   s     rA   convert_to_oci_toolzProvider.convert_to_oci_tool   s	     rC   N)__name__
__module____qualname__propertyr   r/   rg   r   rk   r   ro   r1   rr   rt   rv   r   rz   r~   r   r   r+   r   r)   r   rd   rC   rA   rb   rb   q   s       +3+++ ^ X+>c>c>>> ^>?d?s??? ^??T?d??? ^?HSHT#s(^HHH ^HRdRtCH~RRR ^R88888 ^8'*	c3h   ^ E$sCx.$y/8XMNO 
c3h   ^  rC   rb   c                   2   e Zd ZU dZeed<   ddZdedefdZde	defd	Z
de	defd
Zdede	eef         fdZde	de	eef         fdZdedefdZdee         dede	eef         fdZdeee	eef         ee         eef                  de	eef         fdZdS )CohereProviderstop_sequencesrg   r;   Nc                     ddl m} |j        | _        |j        | _        |j        | _        |j        | _	        |j
        | _        |j        |j        |j        |j        d| _        |j        j        | _        d S )Nr   models)USERCHATBOTSYSTEMTOOL)oci.generative_ai_inferencer   CohereChatRequestoci_chat_request
CohereTooloci_toolCohereParameterDefinitionoci_tool_paramCohereToolResultoci_tool_resultCohereToolCalloci_tool_callCohereUserMessageCohereChatBotMessageCohereSystemMessageCohereToolMessageoci_chat_messageBaseChatRequestAPI_FORMAT_COHEREchat_api_formatrf   r   s     rA   __init__zCohereProvider.__init__   s    666666 & 8)$>%6#2,20,	!
 !
  &5GrC   rh   c                 $    |j         j        j        S r=   )datachat_responsetextrj   s     rA   rk   z$CohereProvider.chat_response_to_text   s    }*//rC   rl   c                 2    d|v rd|v sd|v rdS |d         S dS )Nr   finishReason	toolCallsrH   rd   rn   s     rA   ro   z"CohereProvider.chat_stream_to_text   s7    Z++{j/H/Hr!&))2rC   c                 
    d|v S )Nr   rd   rn   s     rA   rr   z!CohereProvider.is_chat_stream_end   s    ++rC   c                    |j         j        j        |j         j        j        |j         j        j        |j         j        j        |j         j        j        d}|j         j        j        r!t          |j         j        j                  |d<   |S )N)	documents	citationssearch_queriesis_search_requiredfinish_reasonrL   )	r   r   r   r   r   r   r   rL   r\   )rf   rh   generation_infos      rA   rt   z#CohereProvider.chat_generation_info   s    !4>!4>&m9H"*-"="P%]8F+
 +
 =&1 	 -C+6- -OL) rC   c           	         |                     d          |                     d          |                     d          d}d|v rng |d<   |d         D ]`}|d                             t          j                    j        d d          |d         t          j        |d                   d	d
d           ad |                                D             }|S )Nr   r   r   )r   r   r   r   rL   rD   rY   rN   rP   rQ   c                     i | ]
\  }}|||S r=   rd   .0kvs      rA   
<dictcomp>z>CohereProvider.chat_stream_generation_info.<locals>.<dictcomp>   s    UUUDAqq}1a}}}rC   )getrS   rT   rU   rV   rW   rX   items)rf   rl   r   r[   s       rA   rv   z*CohereProvider.chat_stream_generation_info   s    #44#44'^^N;;+
 +

 *$$,.OL)'4 
 
	-44"jll.qqq1$-f$5)-Il4K)L)L% % !+ 	 	 	 	 VUO,A,A,C,CUUUrC   rw   c                     t          |t                    rdS t          |t                    rdS t          |t                    rdS t          |t                    rdS t          d|           )Nr   r   r   r   Got unknown type )r>   r   r   r   r   
ValueErrorry   s     rA   rz   zCohereProvider.get_role   su    g|,, 		<6++ 	<9// 	<8-- 	<6:::;;;rC   r{   r|   c                     |                     d          pd}g }|d d         D ]}                     |          dk    s                     |          dk    rC|                      j                             |                   |j                             xt          |t                    rt|j        r|r|j        r fd|j        D             nd }|j        r|j        nd}|                      j                             |                   ||	                     g }|d d d         D ].}	|                    |	           t          |	t                    r n/|d d d         }g }
|D ]}	t          |	t                    r|	}d
 |D             }|r|d         }|j        D ]s}|d         |j
        k    r`                                 }                     |d         |d                   |_        d|j        ig|_        |
                    |           t|
sd }
|
rdn|d         j        }|||
 j        d}d |                                D             S )Nis_force_single_stepFr   r   rw   c                 V    g | ]%}                     |d          |d                   &S )rD   r^   rD   rY   )r   )r   tcrf   s     rA   
<listcomp>z9CohereProvider.messages_to_oci_params.<locals>.<listcomp>   sD        **6
r&z*RR  rC    )rw   rL   c                 J    g | ] }t          |t                    |j        |!S rd   )r>   r   rL   )r   rw   s     rA   r   z9CohereProvider.messages_to_oci_params.<locals>.<listcomp>  sF     $ $ $!'955$ ;B:L$$ $ $rC   rR   rD   r^   r   outputrH   )rw   chat_historytool_results
api_formatc                     i | ]
\  }}|||S r=   rd   r   s      rA   r   z9CohereProvider.messages_to_oci_params.<locals>.<dictcomp>2  s    EEEAq}1}}}rC   )r   rz   rS   r   contentr>   r   rL   r   r   tool_call_idr   r   calloutputsr   r   )rf   r{   r|   r   oci_chat_historymsgrL   msg_contentcurrent_chat_turn_messagesrw   oci_tool_resultstool_messageprevious_ai_msgsprevious_ai_msglc_tool_calltool_resultmessage_str
oci_paramss   `                 rA   r~   z%CohereProvider.messages_to_oci_params   s)     &zz*@AAJUCRC= 	 	C}}S!!V++t}}S/A/AX/M/M ''=D)$--*<*<=ckRRR    C++ > &:  ~	    "%.   
   .1[Ackkc ''=D)$--*<*<= +
     &(""~ 	 	G&--g666'<00 %?"%E"351 	A 	AG';// A&$ $#=$ $ $ 
 $ 
A&6r&:O(7(B A A'-1JJJ*.*>*>*@*@K/3/A/A%1&%9+7+? 0B 0 0K, 5=l>R3S2TK/,33K@@@ 	$#,Fbb(2,2F #,,.	
 

 FE!1!1!3!3EEEErC   r   c           	      J    t          t                    rX                     j        t	          j        j                   fdj                                        D                       S t          t                    rt          fddD                       st          d                                                   d                              d           fd                    d	i                                           D                       S t          t                    rt          t                    st                    rt!                    }|                    d
i                               d	i           }                     |                    d          |                    d|                    d                     fd|                                D                       S t          dt                     d          )za
        Convert a BaseTool instance, JSON schema dict, or BaseModel type to a OCI tool.
        c                     i | ]y\  }}|                     d |v r|                    d           ndt                              |                    d          |                    dd                    d|v          zS )rE   rH   r?   r3   defaultrE   r?   is_requiredr   r   JSON_TO_PYTHON_TYPESr   p_namep_defrf   s      rA   r   z6CohereProvider.convert_to_oci_tool.<locals>.<dictcomp>A  s     ' ' ' & D//(E11 %*IIm$<$<$<155!IIf--uyy/G/G  %.U$: 0  ' ' 'rC   )rD   rE   parameter_definitionsc              3       K   | ]}|v V  	d S r=   rd   )r   r   r   s     rA   	<genexpr>z5CohereProvider.convert_to_oci_tool.<locals>.<genexpr>O  s'      QQQqDyQQQQQQrC   )titlerE   
propertieszjUnsupported dict type. Tool must be passed in as a BaseTool instance, JSON schema dict, or BaseModel type.r   rE   c                     i | ]s\  }}|                     |                    d           t                              |                    d          |                    dd                    d|v          tS )rE   r?   r3   r   r   r   r   s      rA   r   z6CohereProvider.convert_to_oci_tool.<locals>.<dictcomp>V  s     	' 	' 	' & D//$)IIm$<$<155!IIf--uyy/G/G  %.U$: 0  	' 	' 	'rC   r   rY   rD   c                    i | ]\  }}|                     |                    d           t                              |                    d          |                    dd                    |                    dg           v           S )rE   r?   r3   requiredr   r   )r   r   r   rY   rf   s      rA   r   z6CohereProvider.convert_to_oci_tool.<locals>.<dictcomp>k  s     	' 	' 	' & D//$)IIm$<$<155!IIf--uyy/G/G  %+jnnZ.L.L$L 0  	' 	' 	'rC   zUnsupported tool type zU. Tool must be passed in as a BaseTool instance, JSON schema dict, or BaseModel type.)r>   r)   r   rD   rK   rE   r^   r   dictallr   r   r?   r@   r+   callabler*   )rf   r   as_json_schema_functionr   rY   s   ``  @rA   r   z"CohereProvider.convert_to_oci_tool4  s|    dH%% >	==YCIt/ ' ' ' ' *.):):' ' ' !   $ d## +	QQQQ*PQQQQQ   A   ==XXg&& HH]33	' 	' 	' 	' *.,)C)C)I)I)K)K	' 	' 	' !    t$$ 	D))D)D 	RV 	&@&F&F#044\2FFJ#b99J==,0088377!+//77 	' 	' 	' 	' 	' *4)9)9););	' 	' 	' !   $  Kd  K  K  K  rC   r;   N)r   r   r   rg   r/   __annotations__r   r   rk   r   ro   r1   rr   rt   rv   r   rz   r   r   r~   r   r   r+   r   r)   r   rd   rC   rA   r   r      s        -s---H H H H 0c 0c 0 0 0 0d s    ,T ,d , , , ,S T#s(^    "d tCH~    0
< 
< 
< 
< 
< 
<GF -GF9<GF	c3hGF GF GF GFREE$sCx.$y/8XMNOE 
c3hE E E E E ErC   r   c                   z   e Zd ZU dZeed<   ddZdedefdZde	defd	Z
de	defd
Zdede	eef         fdZde	de	eef         fdZdedefdZdee         dede	eef         fdZdeeeeee	f                  f         dee         fdZdeee	eef         ee         eef                  de	eef         fdZdS )MetaProviderstoprg   r;   Nc                     ddl m} |j        | _        |j        |j        |j        d| _        |j        | _	        |j
        | _        |j        | _        |j        | _        |j        j        | _        d S )Nr   r   )r   r   	ASSISTANT)r   r   GenericChatRequestr   UserMessager   AssistantMessager   ChatContentoci_chat_message_contentTextContentoci_chat_message_text_contentImageContentoci_chat_message_image_contentImageUrloci_chat_message_image_urlr   API_FORMAT_GENERICr   r   s     rA   r   zMetaProvider.__init__  s    666666 & 9&*0!
 !

 )/(:%-3-?*.4.A+*0/'%5HrC   rh   c                 Z    |j         j        j        d         j        j        d         j        S )Nr   )r   r   choicesrw   r   r   rj   s     rA   rk   z"MetaProvider.chat_response_to_text  s#    }*215=EaHMMrC   rl   c                 6    |d         d         d         d         S )Nrw   r   r   r   rd   rn   s     rA   ro   z MetaProvider.chat_stream_to_text  s    )$Y/26::rC   c                 
    d|vS )Nrw   rd   rn   s     rA   rr   zMetaProvider.is_chat_stream_end  s    
**rC   c                 x    |j         j        j        d         j        t	          |j         j        j                  dS )Nr   )r   time_created)r   r   r
  r   r/   r  rj   s     rA   rt   z!MetaProvider.chat_generation_info  s7    %]8@CQ ; HII
 
 	
rC   c                     d|d         iS )Nr   r   rd   rn   s     rA   rv   z(MetaProvider.chat_stream_generation_info  s    Z7
 	
rC   rw   c                     t          |t                    rdS t          |t                    rdS t          |t                    rdS t	          d|           )Nr   r   r   r   )r>   r   r   r   r   ry   s     rA   rz   zMetaProvider.get_role  s^    g|,, 	<6++ 	<;// 	<8:::;;;rC   r{   r|   c                     g }|D ][}|                      |j                  } | j        |                     |                   |          }|                    |           \|| j        ddS )aB  Convert LangChain messages to OCI chat parameters.

        Args:
            messages: List of LangChain BaseMessage objects
            **kwargs: Additional keyword arguments

        Returns:
            Dict containing OCI chat parameters

        Raises:
            ValueError: If message content is invalid
        r   r   )r{   r   top_k)_process_message_contentr   r   rz   rS   r   )rf   r{   r|   oci_messagesrw   r   oci_messages          rA   r~   z#MetaProvider.messages_to_oci_params  s      	- 	-G33GODDGG$/g0F0FGPWXXXK,,,, %.
 
 	
rC   r   c           	         t          |t                    r|                     |          gS t          |t                    st	          d          g }|D ]2}t          |t                    r*|                    |                     |                     Bt          |t                    st	          dt          |                     d|vrt	          d          |d         dk    rJ|                    |                     | 	                    |d         d                   	                     |d         d
k    r1|                    |                     |d
                              t	          d|d                    |S )a	  Process message content into OCI chat content format.

        Args:
            content: Message content as string or list

        Returns:
            List of OCI chat content objects

        Raises:
            ValueError: If content format is invalid
        )r   z,Message content must be str or list of itemsz(Content items must be str or dict, got: r?   z&Dict content item must have a type key	image_urlurl)r  )r  r   zUnsupported content type: )
r>   r/   r  listr   rS   r   r?   r  r  )rf   r   processed_contentitems       rA   r  z%MetaProvider._process_message_content  s    gs## 	F66G6DDEE'4(( 	MKLLL 	N 	ND$$$ !(()K)KQU)K)V)VWWWdD))  KtDzzKK   T!! !IJJJF|{**!((77"&"A"A $[ 1% 8 #B # # 8      f''!((66DL6II    !!Ld6l!L!LMMM  rC   r   c                      t          d          )Nz#Tools not supported for Meta models)NotImplementedErrorr   s     rA   r   z MetaProvider.convert_to_oci_tool  s     ""GHHHrC   r   )r   r   r   rg   r/   r   r   r   rk   r   ro   r1   rr   rt   rv   r   rz   r
   r~   r   r  r   r+   r   r)   r   rd   rC   rA   r   r   |  s        #s###I I I INc Nc N N N N;d ;s ; ; ; ;+T +d + + + +
S 
T#s(^ 
 
 
 

d 
tCH~ 
 
 
 

	< 	< 	< 	< 	< 	<
[)
58
	c3h
 
 
 
81!S$uS$Y'7"8891!	c1! 1! 1! 1!fIE$sCx.$y/8XMNOI 
c3hI I I I I IrC   r   c                   v    e Zd ZdZ edd          Zedefd            Zede	ee
f         fd            Zede
fd            Zd	ee         d
eee                  dede
deee
f         f
dZdeeeee
f         ee         eef                  de
deeef         f fdZ	 dddddeeeee         f                  ded         dede
deeeeef         f         f
dZ	 	 dd	ee         d
eee                  dee         de
def
dZ 	 	 dd	ee         d
eee                  dee         de
de!e"         f
dZ# xZ$S )ChatOCIGenAIu	  ChatOCIGenAI chat model integration.

    Setup:
      Install ``langchain-community`` and the ``oci`` sdk.

      .. code-block:: bash

          pip install -U langchain-community oci

    Key init args — completion params:
        model_id: str
            Id of the OCIGenAI chat model to use, e.g., cohere.command-r-16k.
        is_stream: bool
            Whether to stream back partial progress
        model_kwargs: Optional[Dict]
            Keyword arguments to pass to the specific model used, e.g., temperature, max_tokens.

    Key init args — client params:
        service_endpoint: str
            The endpoint URL for the OCIGenAI service, e.g., https://inference.generativeai.us-chicago-1.oci.oraclecloud.com.
        compartment_id: str
            The compartment OCID.
        auth_type: str
            The authentication type to use, e.g., API_KEY (default), SECURITY_TOKEN, INSTANCE_PRINCIPAL, RESOURCE_PRINCIPAL.
        auth_profile: Optional[str]
            The name of the profile in ~/.oci/config, if not specified , DEFAULT will be used.
        auth_file_location: Optional[str]
            Path to the config file, If not specified, ~/.oci/config will be used.
        provider: str
            Provider name of the model. Default to None, will try to be derived from the model_id otherwise, requires user input.
    See full list of supported init args and their descriptions in the params section.

    Instantiate:
        .. code-block:: python

            from langchain_community.chat_models import ChatOCIGenAI

            chat = ChatOCIGenAI(
                model_id="cohere.command-r-16k",
                service_endpoint="https://inference.generativeai.us-chicago-1.oci.oraclecloud.com",
                compartment_id="MY_OCID",
                model_kwargs={"temperature": 0.7, "max_tokens": 500},
            )

    Invoke:
        .. code-block:: python
            messages = [
                SystemMessage(content="your are an AI assistant."),
                AIMessage(content="Hi there human!"),
                HumanMessage(content="tell me a joke."),
            ]
            response = chat.invoke(messages)

    Stream:
        .. code-block:: python

        for r in chat.stream(messages):
            print(r.content, end="", flush=True)

    Response metadata
        .. code-block:: python

        response = chat.invoke(messages)
        print(response.response_metadata)

    forbidT)extraarbitrary_types_allowedr;   c                     dS )zReturn type of llm.oci_generative_ai_chatrd   re   s    rA   	_llm_typezChatOCIGenAI._llm_typeL  s
     ('rC   c                 <    t                      t                      dS )zGet the provider map)coheremeta)r   r   re   s    rA   _provider_mapzChatOCIGenAI._provider_mapQ  s#     %&& NN
 
 	
rC   c                 8    |                      | j                  S )z Get the internal provider object)provider_map)_get_providerr*  re   s    rA   	_providerzChatOCIGenAI._providerY  s     !!t/A!BBBrC   r{   r   streamr|   c           	          	 ddl m} n"# t          $ r}t          d          |d }~ww xY w | j        j        |fi |}||d<   | j        pi }|||| j        j        <   i |||}	| j        st          d          | j        
                    t                    r|                    | j                  }
n|                    | j                  }
|                    | j        |
 | j        j        d	i |	          }|S )
Nr   r   zYCould not import oci python package. Please make sure you have the oci package installed.	is_streamzModel ID is required to chat)endpoint_id)model_id)compartment_idserving_modechat_requestrd   )r   r   ImportErrorModuleNotFoundErrorr.  r~   model_kwargsrg   r3  r   
startswithCUSTOM_ENDPOINT_PREFIXDedicatedServingModeOnDemandServingModeChatDetailsr4  r   )rf   r{   r   r/  r|   r   exr   _model_kwargschat_paramsr5  requests               rA   _prepare_requestzChatOCIGenAI._prepare_request^  s]   	::::::: 	 	 	%G  	 ;T^:8NNvNN
"(
;)/R>BM$.:;??&?J?} 	=;<<<=##$:;; 	N!664=6QQLL!55t}5MML$$.%88GG;GG % 
 
 s   	 
(#(toolsc                 X      fd|D             } t                      j        dd|i|S )Nc                 D    g | ]}j                             |          S rd   )r.  r   )r   r   rf   s     rA   r   z+ChatOCIGenAI.bind_tools.<locals>.<listcomp>  s)    VVV4>==dCCVVVrC   rD  rd   )superbind)rf   rD  r|   formatted_tools	__class__s   `   rA   
bind_toolszChatOCIGenAI.bind_tools  sB    
 WVVVPUVVVuww|<</<V<<<rC   Nfunction_callingF)methodinclude_rawschemarM  )rL  	json_moderN  c                   |rt          d|           t          |          }|dk    ro|t          d           | j        |gfi |}t          | j                            |          d          }|rt          |gd          }ndt          |d          }nR|d	k    r9|                     d
di          }|rt          |          nt                      }nt          d| d          |rht          j        t          d          |z  d           }	t          j        d           }
|	                    |
gd          }t          |          |z  S ||z  S )a  Model wrapper that returns outputs formatted to match the given schema.

        Args:
            schema: The output schema as a dict or a Pydantic class. If a Pydantic class
                then the model output will be an object of that class. If a dict then
                the model output will be a dict. With a Pydantic class the returned
                attributes will be validated, whereas with a dict they will not be. If
                `method` is "function_calling" and `schema` is a dict, then the dict
                must match the OCI Generative AI function-calling spec.
            method:
                The method for steering model generation, either "function_calling"
                or "json_mode". If "function_calling" then the schema will be converted
                to an OCI function and the returned model will make use of the
                function-calling API. If "json_mode" then Cohere's JSON mode will be
                used. Note that if using "json_mode" then you must include instructions
                for formatting the output into the desired schema into the model call.
            include_raw:
                If False then only the parsed structured output is returned. If
                an error occurs during model output parsing it will be raised. If True
                then both the raw model response (a BaseMessage) and the parsed model
                response will be returned. If an error occurs during output parsing it
                will be caught and returned as well. The final output is always a dict
                with keys "raw", "parsed", and "parsing_error".

        Returns:
            A Runnable that takes any ChatModel input and returns as output:

                If include_raw is True then a dict with keys:
                    raw: BaseMessage
                    parsed: Optional[_DictOrPydantic]
                    parsing_error: Optional[BaseException]

                If include_raw is False then just _DictOrPydantic is returned,
                where _DictOrPydantic depends on the schema:

                If schema is a Pydantic class then _DictOrPydantic is the Pydantic
                    class.

                If schema is a dict then _DictOrPydantic is a dict.

        zReceived unsupported arguments rL  NzJschema must be specified when method is 'function_calling'. Received None.rD   T)rD  first_tool_only)key_namerR  rP  r?   json_object)response_format)pydantic_objectzTUnrecognized method argument. Expected `function_calling` or `json_mode`.Received: `z`.rawc                     d S r=   rd   _s    rA   <lambda>z5ChatOCIGenAI.with_structured_output.<locals>.<lambda>  s    RV rC   )parsedparsing_errorc                     d S r=   rd   rY  s    rA   r[  z5ChatOCIGenAI.with_structured_output.<locals>.<lambda>  s    d rC   )r\  r]  )exception_key)rW  )r   rB   rK  getattrr.  r   r"   r!   rH  r   r   r(   assignr   with_fallbacksr'   )rf   rO  rM  rN  r|   is_pydantic_schemallm	tool_nameoutput_parserparser_assignparser_noneparser_with_fallbacks               rA   with_structured_outputz#ChatOCIGenAI.with_structured_output  s   b  	IGvGGHHH/77'''~ %   "$/6(55f55C B B6 J JFSSI! 2E!($(3 3 3
 !9&! ! ! {""))V],C)DDC &($V<<<<%'' M )$) ) )  
  
	'/6!%((=8  M .4NNKKKK#0#?#?_ $@ $ $  3'''*>>>&&rC   run_managerc                 2   | j         r  | j        |f||d|}t          |          S  | j        |f|dd|}| j                            |          }| j                            |          }|t          ||          }| j        	                    |          }	|j
        j        |j
        j        |j        |j        d         d}
d|	v rd |j
        j        j        D             }ng }t#          ||	|	          }t%          t'          ||	
          g|
          S )a*  Call out to a OCIGenAI chat model.

        Args:
            messages: list of LangChain messages
            stop: Optional list of stop words to use.

        Returns:
            LangChain ChatResult

        Example:
            .. code-block:: python

               messages = [
                            HumanMessage(content="hello!"),
                            AIMessage(content="Hi there human!"),
                            HumanMessage(content="Meow!")
                          ]

               response = llm.invoke(messages)
        )r   rk  Fr   r/  Ncontent-length)r3  model_version
request_idrn  rL   c                 ,    g | ]}t          |          S rd   )r`   r   r[   s     rA   r   z*ChatOCIGenAI._generate.<locals>.<listcomp>!  s0        4I>>  rC   )r   additional_kwargsrL   rw   r   )generations
llm_output)r1  _streamr   rC  clientchatr.  rk   r.   rt   r   r3  ro  rp  headersr   rL   r   r%   r#   )rf   r{   r   rk  r|   stream_iterrB  rh   r   r   rv  rL   rw   s                rA   	_generatezChatOCIGenAI._generate  s|   6 > 	5&$,# @F K (444'$'TtETTVTT;##G,,.66x@@)'488G.==hGG !.%]8"-&./?@	
 

 ?** !)!<!G  JJ
 J-!
 
 

 wPPP "	
 
 
 	
rC   c              +     K    | j         |f|dd|}| j                            |          }|j                                        D ]}t          j        |j                  }| j                            |          sV| j        	                    |          }	t          t          |	                    }
|r|                    |	|
           |
V  | j                            |          }g }|                    d          x}r8| j        	                    |          }	 d |D             }n# t          $ r Y nw xY wd}t          |||	          }t          ||
          V   d S )NTrm  r  r   )chunkrL   c           
          g | ]m}t          |d                              d          |d                              d          |                    d          |                    d                    nS )rP   rD   rO   rR   index)rD   r^   rR   r  )r   r   rr  s     rA   r   z(ChatOCIGenAI._stream.<locals>.<listcomp>L  s     , , , !* *%.z%:%>%>v%F%F%.z%:%>%>{%K%K#,==#6#6&/mmG&<&<	  , , ,rC   rH   )r   rs  tool_call_chunksrt  )rC  rx  ry  r   eventsrW   loadsr.  rr   ro   r$   r   on_llm_new_tokenrv   r   KeyError)rf   r{   r   rk  r|   rB  rh   eventrl   deltar~  r   r  rL   r   rw   s                   rA   rw  zChatOCIGenAI._stream4  s      ($'StDSSFSS;##G,,]))++ #	 #	EEJ//J>44Z@@ !:::FF+N54Q4Q4QRRR E00e0DDD"&."L"LZ"X"X#% !0!4!4\!B!BB: !"n@@LLG, , .8, , ,(( $    !G(#&5%5  
 *#$3      A#	 #	s   !D..
D;:D;r=   )NN)%r   r   r   __doc__r,   model_configr   r/   r&  r   r   r*  r.  r
   r   r   r1   r   rC  r   r   r   r+   r   r)   r&   r   rK  r   rj  r   r%   r|  r	   r$   rw  __classcell__)rJ  s   @rA   r   r     s       A AF : $  L
 (3 ( ( ( X( 
wsCx0 
 
 
 X
 C3 C C C XC({#( tCy!( 	(
 ( 
c3h( ( ( (T=d38nd9oxQRS= = 
$k1	2	= = = = = = :>\' <N!\' \' \'tT)_456\' 78	\'
 \' \' 
$eD)O&<<	=\' \' \' \'B %):>	D
 D
{#D
 tCy!D
 67	D

 D
 
D
 D
 D
 D
R %):>	- -{#- tCy!- 67	-
 - 
%	&- - - - - - - -rC   r   r=   )MrW   rI   rT   abcr   r   operatorr   typingr   r   r   r	   r
   r   r   r   r   r   r   langchain_core.callbacksr   langchain_core.language_modelsr   *langchain_core.language_models.chat_modelsr   r   langchain_core.messagesr   r   r   r   r   r   r   r   langchain_core.messages.toolr   langchain_core.output_parsersr   r   "langchain_core.output_parsers.baser    *langchain_core.output_parsers.openai_toolsr!   r"   langchain_core.outputsr#   r$   r%   langchain_core.runnablesr&   r'   r(   langchain_core.toolsr)   %langchain_core.utils.function_callingr*   pydanticr+   r,   *langchain_community.llms.oci_generative_air-   langchain_community.llms.utilsr.   r;  r   r1   rB   r/   rK   r\   r`   rb   r   r   r   rd   rC   rA   <module>r     sM    				  # # # # # # # #                                > = = = = = = = = = = =       	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 7 6 6 6 6 6        @ ? ? ? ? ?        S R R R R R R R R R O O O O O O O O O O ) ) ) ) ) ) L L L L L L * * * * * * * * C C C C C C > > > > > >5    @C @D @ @ @ @# C C     '+   c# 	$Z       0L3 L8 L L L L         s      Fe e e e eX e e ePDI DI DI DI DI8 DI DI DIN^ ^ ^ ^ ^=, ^ ^ ^ ^ ^rC   