U
    h/                     @  s  d dl mZ d dlZd dl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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d	d
dddZG dd deZG dd deZG dd deZ G dd deZ!G dd deZ"dddddZ#ddddd Z$d!d"d#d$d%Z%d&d	dd'd(d)Z&d&d	d*d'd+d,Z'G d-d. d.Z(d/d0d1d2d3Z)d4d5d6d7d8Z*G d9d: d:Z+G d;d< d<Z,e, Z-dS )>    )annotationsN)	AnyAsyncIteratorDictIterableListMappingSequenceUnionoverload)ChatSession)		AIMessageAIMessageChunkBaseMessageBaseMessageChunkChatMessageFunctionMessageHumanMessageSystemMessageToolMessage)	BaseModel)LiteralzAsyncIterator[Any]intzAsyncIterator[tuple[int, Any]])iterablestartreturnc                 C s.   |}| 2 z3 dH W }||fV  |d7 }q6 dS )z$Async version of enumerate function.N    )r   r   ixr   r   G/tmp/pip-unpacked-wheel-9gdii04g/langchain_community/adapters/openai.py
aenumerate    s    
r!   c                   @  s    e Zd ZdZdddddZdS )IndexableBaseModelzDAllows a BaseModel to return its fields by string variable indexing.strr   )itemr   c                 C  s
   t | |S N)getattr)selfr$   r   r   r    __getitem__-   s    zIndexableBaseModel.__getitem__N)__name__
__module____qualname____doc__r(   r   r   r   r    r"   *   s   r"   c                   @  s   e Zd ZU dZded< dS )ChoicezChoice.dictmessageNr)   r*   r+   r,   __annotations__r   r   r   r    r-   1   s   
r-   c                   @  s   e Zd ZU dZded< dS )ChatCompletionszChat completions.zList[Choice]choicesNr0   r   r   r   r    r2   7   s   
r2   c                   @  s   e Zd ZU dZded< dS )ChoiceChunkzChoice chunk.r.   deltaNr0   r   r   r   r    r4   =   s   
r4   c                   @  s   e Zd ZU dZded< dS )ChatCompletionChunkzChat completion chunk.zList[ChoiceChunk]r3   Nr0   r   r   r   r    r6   C   s   
r6   zMapping[str, Any]r   )_dictr   c                 C  s  |  d}|dkr$t|  dddS |dkr||  ddp:d}i }|  d }rZt||d< |  d }rp||d< t||d	S |d
krt|  dddS |dkrt|  dd|  ddS |dkri }d| kr| d |d< t|  dd|  d|dS t|  dd|dS dS )zConvert a dictionary to a LangChain message.

    Args:
        _dict: The dictionary.

    Returns:
        The LangChain message.
    roleusercontent )r:   	assistantfunction_call
tool_calls)r:   additional_kwargssystemfunctionname)r:   rB   tooltool_call_id)r:   rD   r?   )r:   r8   N)getr   r.   r   r   r   r   r   )r7   r8   r:   r?   r=   r>   r   r   r    convert_dict_to_messageI   s2    	

rF   r.   )r/   r   c                 C  s  t | tr| j| jd}nt | tr2d| jd}nt | trd| jd}d| jkrt| jd |d< |d dkrtd|d< d| jkr| jd |d< |d dkrd|d< n^t | trd	| jd}nFt | trd
| j| j	d}n*t | t
rd| j| jd}ntd|  d| jkr| jd |d< |S )zConvert a LangChain message to a dictionary.

    Args:
        message: The LangChain message.

    Returns:
        The dictionary.
    )r8   r:   r9   r<   r=   r:   r;   Nr>   r@   rA   )r8   r:   rB   rC   )r8   r:   rD   zGot unknown type rB   )
isinstancer   r8   r:   r   r   r?   r   r   rB   r   rD   	TypeError)r/   Zmessage_dictr   r   r    convert_message_to_dictp   s<    









rI   Sequence[Dict[str, Any]]zList[BaseMessage])messagesr   c                 C  s   dd | D S )zConvert dictionaries representing OpenAI messages to LangChain format.

    Args:
        messages: List of dictionaries representing OpenAI messages

    Returns:
        List of LangChain BaseMessage objects.
    c                 S  s   g | ]}t |qS r   )rF   .0mr   r   r    
<listcomp>   s     z+convert_openai_messages.<locals>.<listcomp>r   )rK   r   r   r    convert_openai_messages   s    	rP   r   )chunkr   r   c                 C  sz   i }t | trT|dkrd|d< d| jkrH| jd |d< |dkrRd |d< qf| j|d< ntdt|  |ddikrvi }|S )Nr   r<   r8   r=   r:   z%Got unexpected streaming chunk type: r;   )rG   r   r?   r:   
ValueErrortyperQ   r   r7   r   r   r    _convert_message_chunk   s    


rU   zDict[str, Any]c                 C  s   t | |}dd|igiS )Nr3   r5   )rU   rT   r   r   r    _convert_message_chunk_to_delta   s    
rV   c                	   @  s   e Zd ZdZeedddddddd	d
ddZeedddddddd
ddZeddddddddd
ddZeedddddddd	d
ddZeedddddddd
ddZeddddddddd
ddZdS )ChatCompletionzChat completion.
ChatOpenAIFproviderstreamrJ   r#   Literal[False]r   r.   rK   rZ   r[   kwargsr   c                K  s   d S r%   r   rK   rZ   r[   r^   r   r   r    create   s    zChatCompletion.createrZ   Literal[True]r   c                K  s   d S r%   r   r_   r   r   r    r`      s    boolzUnion[dict, Iterable]c          	      K  sb   t d}t||}|f |}t| }|sF||}ddt|igiS dd t||D S d S )Nlangchain.chat_modelsr3   r/   c                 s  s   | ]\}}t ||V  qd S r%   rV   rM   r   cr   r   r    	<genexpr>   s   z(ChatCompletion.create.<locals>.<genexpr>)	importlibimport_moduler&   rP   invokerI   	enumerater[   	rK   rZ   r[   r^   modelsZ	model_clsZmodel_configZconverted_messagesresultr   r   r    r`      s    



c                  s   d S r%   r   r_   r   r   r    acreate   s    zChatCompletion.acreater   c                  s   d S r%   r   r_   r   r   r    rp      s    zUnion[dict, AsyncIterator]c          	        sh   t d}t||}|f |}t| }|sL||I d H }ddt|igiS dd t||2 S d S )Nrd   r3   r/   c                 S s&   | z3 d H W \}}t ||V  q6 d S r%   re   rf   r   r   r    rh     s   z)ChatCompletion.acreate.<locals>.<genexpr>)ri   rj   r&   rP   ainvokerI   r!   astreamrm   r   r   r    rp     s    


Nr)   r*   r+   r,   r   staticmethodr`   rp   r   r   r   r    rW      s6   rW   r   rc   )sessionr   c                 C  s   t dd | d D S )z/Check if chat session has an assistant message.c                 S  s   g | ]}t |tqS r   )rG   r   rL   r   r   r    rO     s     z*_has_assistant_message.<locals>.<listcomp>rK   )any)ru   r   r   r    _has_assistant_message  s    rw   zIterable[ChatSession]zList[List[dict]])sessionsr   c                 C  s   dd | D S )zConvert messages to a list of lists of dictionaries for fine-tuning.

    Args:
        sessions: The chat sessions.

    Returns:
        The list of lists of dictionaries.
    c                 S  s&   g | ]}t |rd d |d D qS )c                 S  s   g | ]}t |qS r   )rI   )rM   sr   r   r    rO   -  s     z>convert_messages_for_finetuning.<locals>.<listcomp>.<listcomp>rK   )rw   )rM   ru   r   r   r    rO   ,  s   z3convert_messages_for_finetuning.<locals>.<listcomp>r   )rx   r   r   r    convert_messages_for_finetuning!  s    rz   c                	   @  s   e Zd ZdZeedddddddd	d
ddZeedddddddd
ddZeddddddddd
ddZeedddddddd	d
ddZeedddddddd
ddZeddddddddd
ddZdS )CompletionszCompletions.rX   FrY   rJ   r#   r\   r   r2   r]   c                K  s   d S r%   r   r_   r   r   r    r`   6  s    zCompletions.createra   rb   r   c                K  s   d S r%   r   r_   r   r   r    r`   @  s    rc   z Union[ChatCompletions, Iterable]c          	      K  sf   t d}t||}|f |}t| }|sJ||}ttt|dgdS dd t|	|D S d S )Nrd   r/   r3   c                 s  s*   | ]"\}}t tt||d gdV  qdS )r5   r}   Nr6   r4   rU   rf   r   r   r    rh   \  s   z%Completions.create.<locals>.<genexpr>)
ri   rj   r&   rP   rk   r2   r-   rI   rl   r[   rm   r   r   r    r`   J  s    



c                  s   d S r%   r   r_   r   r   r    rp   c  s    zCompletions.acreater   c                  s   d S r%   r   r_   r   r   r    rp   m  s    z%Union[ChatCompletions, AsyncIterator]c          	        sl   t d}t||}|f |}t| }|sP||I d H }ttt|dgdS dd t|	|2 S d S )Nrd   r|   r}   c                 S s4   | z*3 d H W \}}t tt||dgdV  q6 d S )Nr~   r}   r   rf   r   r   r    rh     s   z&Completions.acreate.<locals>.<genexpr>)
ri   rj   r&   rP   rq   r2   r-   rI   r!   rr   rm   r   r   r    rp   w  s    


Nrs   r   r   r   r    r{   3  s6   r{   c                   @  s   e Zd ZdZddddZdS )ChatzChat.None)r   c                 C  s   t  | _d S r%   )r{   Zcompletions)r'   r   r   r    __init__  s    zChat.__init__N)r)   r*   r+   r,   r   r   r   r   r    r     s   r   )r   ).
__future__r   ri   typingr   r   r   r   r   r   r	   r
   r   Zlangchain_core.chat_sessionsr   Zlangchain_core.messagesr   r   r   r   r   r   r   r   r   Zlangchain_core.pydantic_v1r   Ztyping_extensionsr   r!   r"   r-   r2   r4   r6   rF   rI   rP   rU   rV   rW   rw   rz   r{   r   Zchatr   r   r   r    <module>   s0   ,, 
'/V^