
    g=                    ,   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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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, ddlm-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3 	 d dl4m5Z5m6Z6m7Z7 d dl8m9Z9 d dl:m;Z;m<Z< d dl=m>Z> ed   ZA	  e	d       G d de/             ZBe	 G d de-             ZCe	 G d  d!e1             ZDe	 G d" d#e0             ZEd&d$ZFd'd%ZGy# e?$ rZ@ e?d      e@dZ@[@ww xY w)(    )annotations)AsyncIteratorIterable)asynccontextmanager)	dataclassfield)datetimetimezone)chain)Literaloverload)AsyncClient)assert_never   )UnexpectedModelBehavior_utilsresult)guard_tool_call_id)
ModelMessageModelRequestModelResponseModelResponsePartRetryPromptPartSystemPromptPartTextPartToolCallPartToolReturnPartUserPromptPart)Usage)ModelSettings)ToolDefinition   )
AgentModelEitherStreamedResponseModelStreamStructuredResponseStreamTextResponsecached_async_http_clientcheck_allow_model_requests)	NOT_GIVEN	AsyncGroqAsyncStream)chat)ChatCompletionChatCompletionChunk)ChoiceDeltaToolCallu}   Please install `groq` to use the Groq model, you can use the `groq` optional group — `pip install 'pydantic-ai-slim[groq]'`N)zllama-3.3-70b-versatilezllama-3.1-70b-versatilez%llama3-groq-70b-8192-tool-use-previewz$llama3-groq-8b-8192-tool-use-previewzllama-3.1-70b-specdeczllama-3.1-8b-instantzllama-3.2-1b-previewzllama-3.2-3b-previewzllama-3.2-11b-vision-previewzllama-3.2-90b-vision-previewzllama3-70b-8192zllama3-8b-8192zmixtral-8x7b-32768zgemma2-9b-itzgemma-7b-itF)initc                      e Zd ZU dZded<    ed      Zded<   dddd		 	 	 	 	 	 	 dd
Z	 	 	 	 	 	 	 	 ddZddZ	e
dd       Zy)	GroqModelzA model that uses the Groq API.

    Internally, this uses the [Groq Python client](https://github.com/groq/groq-python) to interact with the API.

    Apart from `__init__`, all methods are private or match those of the base class.
    GroqModelName
model_nameF)reprr+   clientN)api_keygroq_clienthttp_clientc                   || _         ||J d       |J d       || _        y|t        ||      | _        yt        |t                     | _        y)a  Initialize a Groq model.

        Args:
            model_name: The name of the Groq model to use. List of model names available
                [here](https://console.groq.com/docs/models).
            api_key: The API key to use for authentication, if not provided, the `GROQ_API_KEY` environment variable
                will be used if available.
            groq_client: An existing
                [`AsyncGroq`](https://github.com/groq/groq-python?tab=readme-ov-file#async-usage)
                client to use, if provided, `api_key` and `http_client` must be `None`.
            http_client: An existing `httpx.AsyncClient` to use for making HTTP requests.
        Nz3Cannot provide both `groq_client` and `http_client`z/Cannot provide both `groq_client` and `api_key`)r8   r:   )r5   r7   r+   r(   )selfr5   r8   r9   r:   s        L/var/www/openai/venv/lib/python3.12/site-packages/pydantic_ai/models/groq.py__init__zGroqModel.__init__V   s`    ( %"&](]]&?U$UU?%DK$#GMDK#GAYA[\DK    c                  K   t                |D cg c]  }| j                  |       }}|r"||D cg c]  }| j                  |       c}z  }t        | j                  | j                  ||      S c c}w c c}w wN)r)   _map_tool_definitionGroqAgentModelr7   r5   )r<   function_toolsallow_text_resultresult_toolsrtoolss         r=   agent_modelzGroqModel.agent_modelt   s~      	#$7EF~!**1-~FLILqd//2LIIEKKOO	
 	
 GIs   A;A1	A;A6
1A;c                     d| j                    S )Nzgroq:)r5   r<   s    r=   namezGroqModel.name   s    t'((r?   c                P    d| j                   | j                  | j                  ddS )Nfunction)rL   description
parameters)typerN   )rL   rO   parameters_json_schema)fs    r=   rB   zGroqModel._map_tool_definition   s-      }}66
 	
r?   )r5   r4   r8   
str | Noner9   zAsyncGroq | Noner:   zAsyncHTTPClient | None)rD   list[ToolDefinition]rE   boolrF   rU   returnr#   )rW   str)rS   r!   rW   zchat.ChatCompletionToolParam)__name__
__module____qualname____doc____annotations__r   r7   r>   rI   rL   staticmethodrB    r?   r=   r3   r3   J   s     5)FI) #(,.2]!] 	]
 &] ,]<
 -
  	

 +
 

$) 
 
r?   r3   c                     e Zd ZU dZded<   ded<   ded<   ded	<   	 	 	 	 	 	 dd
Ze	 	 	 	 	 	 dd       Ze	 	 	 	 	 	 	 	 dd       Z	e	 	 	 	 	 	 	 	 dd       Z		 	 	 	 	 	 	 	 ddZ	e
dd       Ze
dd       Zedd       Zedd       Zy)rC   z/Implementation of `AgentModel` for Groq models.r+   r7   rX   r5   rV   rE   z"list[chat.ChatCompletionToolParam]rH   c                |   K   | j                  |d|       d {   }| j                  |      t        |      fS 7  w)NF)_completions_create_process_response
_map_usager<   messagesmodel_settingsresponses       r=   requestzGroqAgentModel.request   s@      11(E>RR%%h/H1EEE Ss   <:!<c                  K   | j                  |d|       d {   }|4 d {    | j                  |       d {    d d d       d {    y 7 <7 37 7 # 1 d {  7  sw Y   y xY ww)NT)rb   _process_streamed_responsere   s       r=   request_streamzGroqAgentModel.request_stream   s\      11(D.QQ877AAA 88 RA 888sd   A3A
A3AA3AAAA3AA3A3AA3A0$A'%A0,A3c                   K   y wrA   r_   r<   rf   streamrg   s       r=   rb   z"GroqAgentModel._completions_create         	   c                   K   y wrA   r_   rn   s       r=   rb   z"GroqAgentModel._completions_create   rp   rq   c                2   K    j                   sd }n j                  sd}nd}t        t         fd|D               }|xs i } j                  j
                  j                  j                  t         j                        |d j                   rdnt         j                   xs t        |xs t        ||j                  dt              |j                  dt              |j                  dt              |j                  d	t              
       d {   S 7 w)Nrequiredautoc              3  @   K   | ]  }j                  |        y wrA   )_map_message).0mr<   s     r=   	<genexpr>z5GroqAgentModel._completions_create.<locals>.<genexpr>   s     $L8aT%6%6q%98s   r"   T
max_tokenstemperaturetop_ptimeout)modelrf   nparallel_tool_callsrH   tool_choicero   r{   r|   r}   r~   )rH   rE   listr   r7   r-   completionscreaterX   r5   r*   get)r<   rf   ro   rg   r   groq_messagess   `     r=   rb   z"GroqAgentModel._completions_create   s      zzFJK''$K KU$L8$LMN'-2[[%%1188doo&"(,

	**)	#0y%)),	B&**=)D $$Wi8"&&y)< 9 
 
 	
 
s   DDDDc                6   t        j                  | j                  t        j                        }| j
                  d   }g }|j                  j                  .|j                  t        |j                  j                               |j                  j                  s|j                  j                  D ]Z  }|j                  t        j                  |j                  j                  |j                  j                  |j                                \ t#        ||      S )zAProcess a non-streamed response, and prepare a message to return.tzr   	timestamp)r	   fromtimestampcreatedr
   utcchoicesmessagecontentappendr   
tool_callsr   from_raw_argsrN   rL   	argumentsidr   )rh   r   choiceitemscs        r=   rc   z GroqAgentModel._process_response   s     **8+;+;M	!!!$)+>>!!-LL&.."8"89:>>$$0^^..\77

I]I]_`_c_cde /Ui88r?   c                .  K   d}t               }	 	 | j                          d{   }|xs/ t	        j
                  |j                  t        j                        }|t        |      z  }|j                  rz|j                  d   j                  }|j                  t        |j                  | ||      S |j                  1t        | |j                  D ci c]  }|j                   | c}||      S 7 # t        $ r}t        d      |d}~ww xY wc c}w w)zHProcess a streamed response, and prepare a streaming response to return.Nz5Streamed response ended without content or tool callsr   r   )r   	__anext__StopAsyncIterationr   r	   r   r   r
   r   rd   r   deltar   GroqStreamTextResponser   GroqStreamStructuredResponseindex)rh   r   start_usagechunker   r   s          r=   rk   z)GroqAgentModel._process_streamed_response   s
     &*	gn&0022 "[X%;%;EMMhll%[I:e,,K}}a(..==,1%--9Vabb%%17 -2-=-=>-=!-=>!#	  2% n-.eflmmn ?sD   DC3 C1C3 B*DD
'
D1C3 3	D<DDDc              #    K   t        |t              r| j                  |      E d{    yt        |t              rg }g }|j                  D ]d  }t        |t
              r|j                  |j                         /t        |t              r|j                  t        |             Zt        |       f t        j                  d      }|rdj                  |      |d<   |r||d<   | yt        |       y7 Эw)zOJust maps a `pydantic_ai.Message` to a `groq.types.ChatCompletionMessageParam`.N	assistant)rolez

r   r   )
isinstancer   _map_user_messager   partsr   r   r   r   _map_tool_callr   r-   #ChatCompletionAssistantMessageParamjoin)clsr   textsr   itemmessage_params         r=   rw   zGroqAgentModel._map_message   s      g|,,,W555/!EHJJdH-LL.l3%%nT&:; & & !DD+VM ,2;;u+=i(.8l+!) 6s   %C:C8CC:c              #  z  K   |j                   D ]'  }t        |t              r$t        j                  d|j
                         8t        |t              r$t        j                  d|j
                         lt        |t              r4t        j                  dt        |d      |j                                t        |t              s|j                  (t        j                  d|j                                t        j                  dt        |d      |j                                * y w)Nsystem)r   r   usertoolGroqtmodel_source)r   tool_call_idr   )r   r   r   r-    ChatCompletionSystemMessageParamr   r   ChatCompletionUserMessageParamr   ChatCompletionToolMessageParam_guard_tool_call_idmodel_response_strr   	tool_namemodel_response)r   r   parts      r=   r   z GroqAgentModel._map_user_message  s     MMD$ 01;;SWS_S_``D.199vt||\\D.199!4t&!Q 335 
 D/2>>)==6SWSfSfShii==#%84f%U $ 3 3 5  "s   CD;A+D;N)rf   list[ModelMessage]rg   ModelSettings | NonerW   z"tuple[ModelResponse, result.Usage])rf   r   rg   r   rW   z%AsyncIterator[EitherStreamedResponse])rf   r   ro   zLiteral[True]rg   r   rW    AsyncStream[ChatCompletionChunk])rf   r   ro   zLiteral[False]rg   r   rW   chat.ChatCompletion)rf   r   ro   rV   rg   r   rW   z6chat.ChatCompletion | AsyncStream[ChatCompletionChunk])rh   r   rW   r   )rh   r   rW   r$   )r   r   rW   )Iterable[chat.ChatCompletionMessageParam])r   r   rW   r   )rY   rZ   r[   r\   r]   ri   r   rl   r   rb   r^   rc   rk   classmethodrw   r   r_   r?   r=   rC   rC      sK   9O--F*F<PF	+F B*B<PB	.B B *4ASg	) 
 *4BTh	 

*
48
J^
	?
: 
9 
9  4 " "2  r?   rC   c                  ~    e Zd ZU dZded<   ded<   ded<   ded	<    eed
      Zded<   ddZd
dddZ	ddZ
ddZy)r   z7Implementation of `StreamTextResponse` for Groq models.rT   _firstr   	_responser	   
_timestampresult.Usage_usageF)default_factoryr1   z	list[str]_bufferc                  K   | j                   -| j                  j                  | j                          d | _         y | j                  j	                          d {   }t        |      | _        	 |j                  d   }|j                   |j                  j                  
J d|       |j                  j                  0| j                  j                  |j                  j                         y y 7 # t        $ r t               w xY ww)Nr   z,Expected delta with content, invalid chunk: )r   r   r   r   r   rd   r   r   
IndexErrorr   finish_reasonr   r   )r<   r   r   s      r=   r   z GroqStreamTextResponse.__anext__9  s     ;;"LL,DKnn..00 '	']]1%F
 '<<''3m7cdicl5mm3<<+LL 4 45 , 1
  	'$&&	's+   AD
C1D
/C3 >A4D
3DD
finalc             #  l   K   | j                   E d {    | j                   j                          y 7 wrA   )r   clear)r<   r   s     r=   r   zGroqStreamTextResponse.getM  s(     << 	 s   42 4c                    | j                   S rA   r   rK   s    r=   usagezGroqStreamTextResponse.usageQ      {{r?   c                    | j                   S rA   r   rK   s    r=   r   z GroqStreamTextResponse.timestampT      r?   NrW   None)r   rV   rW   zIterable[str]rW   r   rW   r	   )rY   rZ   r[   r\   r]   r   r   r   r   r   r   r   r_   r?   r=   r   r   /  sG    A//t%@GY@6( $) r?   r   c                  `    e Zd ZU dZded<   ded<   ded<   ded	<   dd
ZddddZddZddZy)r   z=Implementation of `StreamStructuredResponse` for Groq models.r   r   zdict[int, ChoiceDeltaToolCall]_delta_tool_callsr	   r   r   r   c                ~  K   | j                   j                          d {   }t        |      | _        	 |j                  d   }|j                  
t               |j                  j                  
J d|       |j                  j                  xs g D ]	  }| j                  j                  |j                        x}r|j                  |j                  |_        I|j                  Vt        j                   |j                  j"                  |j                  j"                        |j                  _        t        j                   |j                  j$                  |j                  j$                        |j                  _        || j                  |j                  <    y 7 # t
        $ r t               w xY ww)Nr   z9Expected tool calls, got content instead, invalid chunk: )r   r   rd   r   r   r   r   r   r   r   r   r   r   r   rN   r   add_optionalrL   r   )r<   r   r   newcurrents        r=   r   z&GroqStreamStructuredResponse.__anext__a  sn    nn..00 '	']]1%F +$&&||##+r/hinhq-rr+<<**0b0C0044SYY??w?##+'*||G$\\-,2,?,?@P@P@U@UWZWcWcWhWh,iG$$)171D1DWEUEUE_E_adamamawaw1xG$$.47&&syy1 1 1
  	'$&&	's.   F=F#F=F& B%F=+B9F=&F::F=Fr   c               L   g }| j                   j                         D ]o  }|j                  x}s|j                  |j                  ,|j                  t        j                  |j                  |j                  |j                               q t        || j                        S )Nr   )r   valuesrN   rL   r   r   r   r   r   r   r   )r<   r   r   r   rS   s        r=   r   z GroqStreamStructuredResponse.gety  s}    )+''..0AJJq66%!++*ALL!;!;AFFAKKQRQUQU!VW 1
 Udoo>>r?   c                    | j                   S rA   r   rK   s    r=   r   z"GroqStreamStructuredResponse.usage  r   r?   c                    | j                   S rA   r   rK   s    r=   r   z&GroqStreamStructuredResponse.timestamp  r   r?   Nr   )r   rV   rW   r   r   r   )	rY   rZ   r[   r\   r]   r   r   r   r   r_   r?   r=   r   r   X  s6    G//5580 $) ?r?   r   c                ~    t        j                  t        | d      d| j                  | j	                         d      S )Nr   r   rN   )rL   r   )r   rQ   rN   )r-   "ChatCompletionMessageToolCallParamr   r   args_as_json_str)r   s    r=   r   r     s7    228++A4F4F4HI r?   c                   d }t        | t              r| j                  }n"| j                  | j                  j                  }|t	        j
                         S t	        j
                  |j                  |j                  |j                        S )N)request_tokensresponse_tokenstotal_tokens)	r   r.   r   x_groqr   r   prompt_tokenscompletion_tokensr   )
completionr   s     r=   rd   rd     sv    E*n-  				&!!''}||~<<**//'' r?   )r   r   rW   z'chat.ChatCompletionMessageToolCallParam)r   z$ChatCompletionChunk | ChatCompletionrW   r   )H
__future__r   _annotationscollections.abcr   r   
contextlibr   dataclassesr   r   r	   r
   	itertoolsr   typingr   r   httpxr   AsyncHTTPClienttyping_extensionsr    r   r   r   r   r   rf   r   r   r   r   r   r   r   r   r   r   r   settingsr    rH   r!   r#   r$   r%   r&   r'   r(   r)   groqr*   r+   r,   
groq.typesr-   groq.types.chatr.   r/   %groq.types.chat.chat_completion_chunkr0   ImportError_import_errorr4   r3   rC   r   r   r   rd   r_   r?   r=   <module>r
     s.   2 3 * ( '  $ 0 * 6 6 >    $ "  	66CI " G
 G
 G
T VZ V Vr %/ % %P -#; - -`I  
	[ s   D   D	DD