
    3fiU$                     <   d dl 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 d dlZd dlmZmZmZmZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
l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/m0Z0 d dl1m2Z2 d dl3m4Z4 d dl5m6Z6 d dl7m8Z8 d dl9m:Z:m;Z;  e jx                  e jz                  dd        e j|                  e?      Z@dedeAfdZBdee    deeeCef      fdZDdej                  dee"   fdZF edd d!"       G d# d$e             ZGy)%    N)
itemgetter)
AnyCallableDictListLiteralOptionalSequenceTypeUnioncast)uuid4)	AIMessageChatGeneration
ChatResultHumanMessage)
deprecated)CallbackManagerForLLMRun)LanguageModelInput)BaseChatModel)AIMessageChunkBaseMessageSystemMessageToolCallToolMessage)	tool_call)JsonOutputParserPydanticOutputParser)OutputParserLike)JsonOutputKeyToolsParserPydanticToolsParser)RunnableRunnablePassthrough)RunnableMap)BaseTool)convert_to_openai_tool)is_basemodel_subclass)	BaseModelFieldz)%(asctime)s - %(levelname)s - %(message)sz%Y-%m-%d %H:%M:%S)levelformatdatefmtobjreturnc                 <    t        | t              xr t        |       S N)
isinstancetyper'   )r-   s    r/var/www/auto_recruiter/arenv/lib/python3.12/site-packages/langchain_community/chat_models/cloudflare_workersai.py_is_pydantic_classr4   8   s    c4 ?%:3%??    messagesc                    g }| D ]  }dt        |j                  t              r|j                  ndd}t        |t              rd|d<   nt        |t              r9d|d<   |j
                  rb|j
                  D cg c]  }|d   |d   d }}||d	<   n:t        |t              rd
|d<   n$t        |t              rd|d<   |j                  |d<   |j                  |        |S c c}w )z;Convert LangChain messages to Cloudflare Workers AI format. )rolecontentuserr9   	assistantnameargs)r=   	arguments
tool_callssystemtooltool_call_id)
r1   r:   strr   r   r@   r   r   rC   append)r6   cloudflare_messagesmessagemsgr   r@   s         r3   (_convert_messages_to_cloudflare_messagesrI   <   s     ( *4W__c*JwPR
 g|, CK+%CK!! &-%7%7! 'v.Yv=NO
  %/L!/"CK- CK$$ 
 	""3'9(< !s   8C!responsec           	          g }d| j                         d   v rO| j                         d   d   D ]6  }|j                  t        t        t	                     |d   |d                8 |S )z$Get tool calls from ollama response.r@   resultr=   r?   )idr=   r>   )jsonrE   r   rD   r   )rJ   r@   tcs      r3   _get_tool_calls_from_responserP   c   sn    Jx}}x00--/(+L9 	B57|FK	 r5   z0.3.23z1.0z,langchain_cloudflare.ChatCloudflareWorkersAI)sinceremovalalternative_importc                       e Zd ZU dZ ed      Zeed<    ed      Zeed<    ed      Z	eed<   dZ
eed<   dZeed<   d	Zeed
<   dZeed<   deddf fdZ	 	 d dee   deee      dee   dedef
dZdeeeeef   eedef   ef      dedeeef   f fdZddddeeee    f   de!dee"d      dedeeeee f   f   f
dZ#e$defd       Z% xZ&S )!ChatCloudflareWorkersAIz+Custom chat model for Cloudflare Workers AI.
account_id	api_tokenmodelr8   
ai_gatewayurlz-https://api.cloudflare.com/client/v4/accountsbase_urlz$https://gateway.ai.cloudflare.com/v1gateway_urlkwargsr.   Nc                    t        |   di | | j                  r;| j                   d| j                   d| j                   d| j
                   | _        y| j                   d| j                   d| j
                   | _        y)z&Initialize with necessary credentials./z/workers-ai/run/z/ai/run/N )super__init__rY   r\   rV   rX   rZ   r[   )selfr]   	__class__s     r3   rb   z ChatCloudflareWorkersAI.__init__   s|    "6"??##$Adoo%6a??##3DJJ<A H
 --$//):(4::,ODHr5   r6   stoprun_managerc                 F   t        |      }dd| j                   i}dj                  d |D              }|d|v r|d   ndd|j                         D 	ci c]  \  }}	|dvs||	 c}	}}
|
d   t	        |
d   t
              s	|
d   g|
d<   t        j                  d	|
        t        j                  | j                  ||

      }t        |      }t        t        |j                               t        t         |            }t#        |      }t%        |g      S c c}	}w )z3Generate a response based on the messages provided.AuthorizationzBearer 
c              3   t   K   | ]0  }d |d    d|d    d|v rd|d    ndz   d|v rd|d    ndz    2 y	w)
zrole: r9   z, content: r:   r@   z	, tools: r8   rC   z, tool_call_id: Nr`   ).0rH   s     r3   	<genexpr>z4ChatCloudflareWorkersAI._generate.<locals>.<genexpr>   ss      	
  S[MS^,<=2>#2E3|,-.2O "S( #3~#6"78	
s   68toolsN)promptrm   )rm   z)Sending prompt to Cloudflare Workers AI: )headersrN   )r:   r@   )rG   )generations)rI   rW   joinitemsr1   list_loggerinforequestspostrZ   rP   r   rD   rN   r   r   r   r   )rc   r6   re   rf   r]   formatted_messagesro   rn   keyvaluedatarJ   r@   
ai_messagechat_generations                  r3   	_generatez!ChatCloudflareWorkersAI._generate   s&    FhO"gdnn-=$>? 	
 *	
 	
 (/6(9VG_t
 -3LLNSjc5c>RsEzS
 =$ZWt-L!']ODM@GH==7F28<
(T.*5U

 )<&788 Ts   D"Drm   c                 `    |D cg c]  }t        |       }}t        |   dd|i|S c c}w )z'Bind tools for use in model generation.rm   r`   )r&   ra   bind)rc   rm   r]   rB   formatted_toolsrd   s        r3   
bind_toolsz"ChatCloudflareWorkersAI.bind_tools   s=     EJJD1$7JJw|</<V<< Ks   +Ffunction_calling)include_rawmethodschemar   r   )	json_moder   c                b   |j                  dd      }|rt        d|       t        |      }|dk(  rd}|dk(  rQ|t        d      t        |      d   d   }| j	                  |g|	      }|rt        |gd
      }	nOt        |d
      }	nA|dk(  r-| j                  ddi      }|rt        |      n	t               }	nt        d| d      |r^t        j                  t        d      |	z  d       }
t        j                  d       }|
j                  |gd      }t        |      |z  S ||	z  S )zGModel wrapper that returns outputs formatted to match the given schema.strictNzReceived unsupported arguments json_schemar   zJschema must be specified when method is 'function_calling'. Received None.functionr=   )tool_choiceT)rm   first_tool_only)key_namer   r   r2   json_object)response_format)pydantic_objectz\Unrecognized method argument. Expected one of 'function_calling' or 'json_mode'. Received: ''rawc                      y r0   r`   _s    r3   <lambda>z@ChatCloudflareWorkersAI.with_structured_output.<locals>.<lambda>       r5   )parsedparsing_errorc                      y r0   r`   r   s    r3   r   z@ChatCloudflareWorkersAI.with_structured_output.<locals>.<lambda>   r   r5   )r   r   )exception_key)r   )pop
ValueErrorr4   r&   r   r!   r    r   r   r   r#   assignr   with_fallbacksr$   )rc   r   r   r   r]   r   is_pydantic_schema	tool_namellmoutput_parserparser_assignparser_noneparser_with_fallbacks                r3   with_structured_outputz.ChatCloudflareWorkersAI.with_structured_output   s    JJx&>vhGHH/7]" (F''~ %  /v6zB6JI//6(	/BC!2E!($(3
 !9&! {"))V],C)DC & %V<%'  ++1(!5 
 /66!%(=8M .44NKK#0#?#?_ $@ $  3'*>>>&&r5   c                      y)z9Return the type of the LLM (for Langchain compatibility).zcloudflare-workers-air`   )rc   s    r3   	_llm_typez!ChatCloudflareWorkersAI._llm_type   s     'r5   )NN)'__name__
__module____qualname____doc__r)   rV   rD   __annotations__rW   rX   rY   rZ   r[   r\   r   rb   r   r   r	   r   r   r~   r
   r   r   r   r   r%   r"   r   r   r   r(   boolr   r   propertyr   __classcell__)rd   s   @r3   rU   rU   r   s    6CjJ 3ZIssE3JCMCHcC=K=	P 	P 	P %):>	)9{#)9 tCy!)9 67	)9
 )9 
)9V=d38ndHS#X4FPQR= = 
$i/	0	= "EW:'dDO+,:' 	:'
 !@AB:' :' 
$eD)O&<<	=:'x '3 ' 'r5   rU   )Hloggingoperatorr   typingr   r   r   r   r   r	   r
   r   r   r   uuidr   rv   langchain_classic.schemar   r   r   r   langchain_core._api.deprecationr   langchain_core.callbacksr   langchain_core.language_modelsr   *langchain_core.language_models.chat_modelsr   langchain_core.messagesr   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.runnablesr"   r#   langchain_core.runnables.baser$   langchain_core.toolsr%   %langchain_core.utils.function_callingr&   langchain_core.utils.pydanticr'   pydanticr(   r)   basicConfigINFO	getLoggerr   rt   r   r4   rD   rI   ResponserP   rU   r`   r5   r3   <module>r      s"         X X 6 = = D  3 @ C 5 ) H ? %   
,,6
 '

H
%@C @D @$;$	$sCx.$NH,=,= $x.  
E
I'm I'
I'r5   