
    Ng                     z    d Z ddlZddl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  G d d	e          ZdS )
zPromptLayer wrapper.    N)AnyDictListOptional)AsyncCallbackManagerForLLMRunCallbackManagerForLLMRun)BaseMessage)
ChatResult)
ChatOpenAIc                       e Zd ZU dZeee                  ed<   dZee	         ed<   e
de	fd            Z	 	 	 ddee         d	eee                  d
ee         dee	         dedef fdZ	 	 	 ddee         d	eee                  d
ee         dee	         dedef fdZedefd            Zedeeef         f fd            Z xZS )PromptLayerChatOpenAIad  `PromptLayer` and `OpenAI` Chat large language models API.

    To use, you should have the ``openai`` and ``promptlayer`` python
    package installed, and the environment variable ``OPENAI_API_KEY``
    and ``PROMPTLAYER_API_KEY`` set with your openAI API key and
    promptlayer key respectively.

    All parameters that can be passed to the OpenAI LLM can also
    be passed here. The PromptLayerChatOpenAI adds to optional

    parameters:
        ``pl_tags``: List of strings to tag the request with.
        ``return_pl_id``: If True, the PromptLayer request ID will be
            returned in the ``generation_info`` field of the
            ``Generation`` object.

    Example:
        .. code-block:: python

            from langchain_community.chat_models import PromptLayerChatOpenAI
            openai = PromptLayerChatOpenAI(model="gpt-3.5-turbo")
    pl_tagsFreturn_pl_idreturnc                     dS )NF )clss    n/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/chat_models/promptlayer_openai.pyis_lc_serializablez(PromptLayerChatOpenAI.is_lc_serializable+   s    u    Nmessagesstoprun_managerstreamkwargsc                    ddl m}m} t          j                                                                        } t                      j        |||fd|i|}	t          j                                                                        }
t                                          ||          \  }}t          |	j
                  D ]\  }}t                                          |j        g|          \  }}i ||} |dd||| j        |||
 |            | j        
  
        }| j        r2|j        t          |j        t                     si |_        ||j        d<   |	S )	zJCall ChatOpenAI generate and then call PromptLayer API to log the request.r   )get_api_keypromptlayer_api_requestr   zlangchain.PromptLayerChatOpenAI	langchainr   Npl_request_id)promptlayer.utilsr   r   datetimenow	timestampsuper	_generate_create_message_dicts	enumerategenerationsmessager   r   generation_info
isinstancedict)selfr   r   r   r   r   r   r   request_start_timegenerated_responsesrequest_end_timemessage_dictsparamsi
generationresponse_dictr!   	__class__s                    r   r'   zPromptLayerChatOpenAI._generate/   s    	KJJJJJJJ%.2244>>@@/egg/dK
 
06
:@
 
 $,0022<<>> % = =h M Mv&':'FGG 	L 	LMAz$)GG$A$A#$d% %!M6 *)&)F331" !.  M   L-5Z.> >5 24J.>K
*?;""r   c                   K   ddl m}m} t          j                                                                        } t                      j        |||fd|i| d{V }	t          j                                                                        }
t                                          ||          \  }}t          |	j
                  D ]\  }}t                                          |j        g|          \  }}i ||} |dd||| j        |||
 |            | j        
  
         d{V }| j        r2|j        t          |j        t                     si |_        ||j        d<   |	S )	z;Call ChatOpenAI agenerate and then call PromptLayer to log.r   )r   promptlayer_api_request_asyncr   Nz%langchain.PromptLayerChatOpenAI.asyncr   r    r!   )r"   r   r:   r#   r$   r%   r&   
_agenerater(   r)   r*   r+   r   r   r,   r-   r.   )r/   r   r   r   r   r   r   r:   r0   r1   r2   r3   r4   r5   r6   r7   r!   r8   s                    r   r;   z PromptLayerChatOpenAI._agenerateY   s      	QPPPPPPP%.2244>>@@$6EGG$6dK%
 %
06%
:@%
 %
 
 
 
 
 
 
 $,0022<<>> % = =h M Mv&':'FGG 	L 	LMAz$)GG$A$A#$d% %!M6 *)&)F"?"?7" !.# # #      M   L-5Z.> >5 24J.>K
*?;""r   c                     dS )Nzpromptlayer-openai-chatr   )r/   s    r   	_llm_typezPromptLayerChatOpenAI._llm_type   s    ((r   c                 L    i t                      j        | j        | j        dS )N)r   r   )r&   _identifying_paramsr   r   )r/   r8   s    r   r?   z)PromptLayerChatOpenAI._identifying_params   s6    
gg)
| -
 
 
 	
r   )NNN)__name__
__module____qualname____doc__r   r   str__annotations__r   boolclassmethodr   r	   r   r   r
   r'   r   r;   propertyr=   r   r?   __classcell__)r8   s   @r   r   r      s         . d3i    #(L(4.(((4    [ %):>!%(# (#{#(# tCy!(# 67	(#
 (# (# 
(# (# (# (# (# (#Z %)?C!%(# (#{#(# tCy!(# ;<	(#
 (# (# 
(# (# (# (# (# (#T )3 ) ) ) X) 
T#s(^ 
 
 
 
 
 X
 
 
 
 
r   r   )rC   r#   typingr   r   r   r   langchain_core.callbacksr   r   langchain_core.messagesr	   langchain_core.outputsr
   langchain_community.chat_modelsr   r   r   r   r   <module>rO      s       , , , , , , , , , , , ,        0 / / / / / - - - - - - 6 6 6 6 6 6}
 }
 }
 }
 }
J }
 }
 }
 }
 }
r   