
    g@                       d dl mZ d dlZd dlZd dlmZmZmZ d dl	m
Z
 d dlmZmZ d dlmZmZmZ d dlmZmZ d dlZd dl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! 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.m/Z/ e G d de*             Z0e G d de(             Z1e G d de,             Z2e G d de+             Z3ejh                  ejj                  z   ejl                  z   Z7 G d d      Z8y)    )annotationsN)AsyncIteratorIterableIterator)asynccontextmanager)	dataclassfield)datedatetime	timedelta)AnyLiteral)assert_never   )_utils)ModelMessageModelRequestModelResponseModelResponsePartRetryPromptPartTextPartToolCallPartToolReturnPart)Usage)ModelSettings)ToolDefinition   )
AgentModelEitherStreamedResponseModelStreamStructuredResponseStreamTextResponse)_estimate_string_usage_estimate_usagec                      e Zd ZU dZdZdZded<   	 dZded<   	 dZd	ed
<   	 dZ	ded<   	  e
dd      Zded<   	  e
dd      Zded<   	  e
dd      Zded<   	 	 	 	 	 	 	 	 	 ddZddZy)	TestModelag  A model specifically for testing purposes.

    This will (by default) call all tools in the agent, then return a tool response if possible,
    otherwise a plain response.

    How useful this model is will vary significantly.

    Apart from `__init__` derived by the `dataclass` decorator, all methods are private or match those
    of the base class.
    Fallzlist[str] | Literal['all']
call_toolsNz
str | Nonecustom_result_textz
Any | Nonecustom_result_argsr   intseed)defaultinitzlist[ToolDefinition] | Noneagent_model_function_toolszbool | Noneagent_model_allow_text_resultagent_model_result_toolsc               j  K   || _         || _        || _        | j                  dk(  r|D cg c]  }|j                  |f }}nK|D ci c]  }|j                  | c}fd| j                  D        }|D cg c]  }|j                  |f }}| j
                  =|sJ d       | j                  J d       t        j                  | j
                        }n| j                  `|J d       |d   }	|	j                  x}
r#t        j                  |
| j                  i      }nit        j                  | j                        }nH|rt        j                  d       }n/|rt        j                  d       }nt        j                  d       }t        |||| j                        S c c}w c c}w c c}w w)	Nr'   c              3  (   K   | ]	  }|     y wN ).0namefunction_tools_lookups     L/var/www/openai/venv/lib/python3.12/site-packages/pydantic_ai/models/test.py	<genexpr>z(TestModel.agent_model.<locals>.<genexpr>]   s     U_T248_s   z<Plain response not allowed, but `custom_result_text` is set.z>Cannot set both `custom_result_text` and `custom_result_args`.)leftz:No result tools provided, but `custom_result_args` is set.r   )right)r/   r0   r1   r(   r7   r)   r*   r   Eitherouter_typed_dict_keyTestAgentModelr,   )selffunction_toolsallow_text_resultresult_toolsr
tool_callsttools_to_callresultresult_toolkr8   s              @r9   agent_modelzTestModel.agent_modelN   s     +9'->*(4%??e#/=>~!1661+~J>8F$G1QVVQY$G!UT__UM/<=}!1661+}J="".$d&dd$**2t4tt2<BMMtOfOf<gF$$0+i-ii+&q/K444q4a1H1H-IJT-D-DE]]-F]].F]]-Fj&,		JJ3 ?$G=s)   )F3F$F3F)F38F.D&F3c                     y)Nz
test-modelr5   r@   s    r9   r7   zTestModel.nameu   s        )rA   list[ToolDefinition]rB   boolrC   rO   returnr   rQ   str)__name__
__module____qualname____doc____test__r(   __annotations__r)   r*   r,   r	   r/   r0   r1   rK   r7   r5   rN   r9   r&   r&   &   s    	 H-2J*2F%)
):%)
)?D#M*>CDW\>] ;] 27t%1P!;P =B$UZ<[9[
%K -%K  	%K
 +%K 
%KNrN   r&   c                      e Zd ZU dZdZded<   ded<   ded<   d	ed
<   	 	 	 	 	 	 ddZe	 	 	 	 	 	 dd       ZddZ	ddZ
y)r?   z4Implementation of `AgentModel` for testing purposes.Fz list[tuple[str, ToolDefinition]]rE   z%_utils.Either[str | None, Any | None]rH   rO   rC   r+   r,   c                T   K   | j                  ||      }t        g ||      }||fS wr4   )_requestr$   )r@   messagesmodel_settingsmodel_responseusages        r9   requestzTestAgentModel.request   s8      x@ ;( ;N ;<u$$s   &(c                 K   | j                  ||      }t        |      }g }g }|j                  D ][  }t        |t              r|j                  |j                         /t        |t              r|j                  |       Qt        |       ] |rt        dj                  |      |       y t        ||       y w)Nz

)r\   r$   parts
isinstancer   appendcontentr   r   TestStreamTextResponsejoinTestStreamStructuredResponse)r@   r]   r^   msgr`   textsrE   items           r9   request_streamzTestAgentModel.request_stream   s      mmHn5) )+
IID$)T\\*D,/!!$'T"  (U);UCC.sE::s   B=B?c                ^    t        |j                  | j                        j                         S r4   )_JsonSchemaTestDataparameters_json_schemar,   generate)r@   tool_defs     r9   gen_tool_argszTestAgentModel.gen_tool_args   s"    "8#B#BDIINWWYYrN   c                z   | j                   r^t        d |D              sLt        | j                   D cg c]*  \  }}t        j                  || j                  |            , c}}      S |r|d   }t        |t              sJ d       |j                  D ch c]  }t        |t              s|j                  ! }}|r| j                   D cg c].  \  }}||v r%t        j                  || j                  |            0 }}}| j                  rd|j                  | j                  D 	cg c]?  }	|	j                  |v r/t        j                  |	j                  | j                  |	            A c}	       t        |      S | j                  j                  x}
r|
j                   i }|D ]N  }t        |t              s|j                  D ],  }t        |t"              s|j$                  ||j                  <   . P |r6t        j&                  t)        j*                  |      j-                               S t        j&                  d      S t        j&                  |
j                         S | j                  sJ d       | j                  j.                  }| j                  | j0                  t3        | j                        z     }|+t        t        j                  |j                  |      g      S | j                  |      }t        t        j                  |j                  |      g      S c c}}w c c}w c c}}w c c}	w )Nc              3  <   K   | ]  }t        |t                y wr4   )rd   r   )r6   ms     r9   r:   z*TestAgentModel._request.<locals>.<genexpr>   s     &VXz!]'CXs   )rc   z-Expected last message to be a `ModelRequest`.zsuccess (no tool calls)zNo result tools provided)rE   anyr   r   from_raw_argsrs   rd   r   rc   r   	tool_namerC   extendr7   rH   r;   valuer   rf   	from_textpydantic_coreto_jsondecoder<   r,   len)r@   r]   r^   r7   argslast_messagepnew_retry_namesretry_partstoolresponse_textoutputmessagepartr*   rI   response_argss                    r9   r\   zTestAgentModel._request   s   ??3&VX&V#V dhdsdstdsV`VZ\`|11$8J8J48PQdst  #B<LlL9j;jj9 5A4F4Fi4Fq*UVXgJhq{{4FOi
 '+oo8&5
d. !..tT5G5G5MN&5  8 $$&& )-(9(9(9#yyO; )66tyy$BTBTUYBZ[(9 %;77 KK,,,=,""*)+'G!'<8$+MMD)$?9=t~~ 6 %2  (
 (22=3H3H3P3W3W3YZZ(223LMM$..}/B/BCC$$@&@@$!%!2!2++DIID<M<M8N,NOK!-$L,F,F{GWGWYk,l+mnn $ 2 2; ?$L,F,F{GWGWYf,g+hiig u j8s   /L'
L-.L-3L2*AL8N)r]   list[ModelMessage]r^   ModelSettings | NonerQ   ztuple[ModelResponse, Usage])r]   r   r^   r   rQ   z%AsyncIterator[EitherStreamedResponse])rr   r   rQ   r   )r]   r   r^   r   rQ   r   )rT   rU   rV   rW   rX   rY   ra   r   rm   rs   r\   r5   rN   r9   r?   r?   y   sx    > H0011&&
I%*%<P%	$% ;*;<P;	.; ;,Z7jrN   r?   c                      e Zd ZU dZded<   ded<    ed      Zded	<    eej                  
      Z	ded<    ee
d      Zded<   d ZddZddddZddZddZy)rg   z'A text response that streams test data.rS   _textr   _usageF)r.   zIterator[str]_iterdefault_factoryr   
_timestampr   r.   z	list[str]_bufferc                h   | j                   j                  d      ^ }}|D cg c]  }| d	 }}|j                  |       t        |      dk(  rNt        | j                         dkD  r6t        | j                         dz  }| j                   d | | j                   |d  g}t	        |      | _        y c c}w )N r   r   )r   splitre   r   iterr   )r@   words	last_wordwordmids        r9   __post_init__z$TestStreamTextResponse.__post_init__   s     JJ,,S1	(-.D6.Yu:?s4::2djj/Q&CZZ%tzz#$'78E%[
 /s   B/c                   K   t        j                  | j                        }t        |      }| xj                  t        ||      z  c_        | j                  j                  |       y w)N)response_tokenstotal_tokens)r   
sync_anextr   r#   r   r   r   re   )r@   next_strr   s      r9   	__anext__z TestStreamTextResponse.__anext__   sK     $$TZZ00:u_?[[H%s   A'A)finalc             #  l   K   | j                   E d {    | j                   j                          y 7 wr4   )r   clearr@   r   s     r9   getzTestStreamTextResponse.get   s(     << 	 s   42 4c                    | j                   S r4   r   rM   s    r9   r`   zTestStreamTextResponse.usage       {{rN   c                    | j                   S r4   r   rM   s    r9   	timestampz TestStreamTextResponse.timestamp      rN   NrQ   None)r   rP   rQ   zIterable[str]rQ   r   rQ   r   )rT   rU   rV   rW   rY   r	   r   r   now_utcr   listr   r   r   r   r`   r   r5   rN   r9   rg   rg      s`    1JM e,E=, @J@t%@GY@!& $) rN   rg   c                      e Zd ZU dZded<   ded<    ed       Zded	<    eej                  d
      Z	ded<   ddZ
d
dddZddZddZy)ri   z-A structured response that streams test data.r   _structured_responser   r   c                     t        d g      S r4   )r   r5   rN   r9   <lambda>z%TestStreamStructuredResponse.<lambda>  s
    $v,rN   r   zIterator[None]r   Fr   r   r   c                H   K   t        j                  | j                        S wr4   )r   r   r   rM   s    r9   r   z&TestStreamStructuredResponse.__anext__  s       ,,s    "r   c                   | j                   S r4   )r   r   s     r9   r   z TestStreamStructuredResponse.get  s    (((rN   c                    | j                   S r4   r   rM   s    r9   r`   z"TestStreamStructuredResponse.usage  r   rN   c                    | j                   S r4   r   rM   s    r9   r   z&TestStreamStructuredResponse.timestamp  r   rN   Nr   )r   rP   rQ   r   r   r   )rT   rU   rV   rW   rY   r	   r   r   r   r   r   r   r`   r   r5   rN   r9   ri   ri     sN    7''M!2FGE>G eLJL- $) )rN   ri   c                  Z    e Zd ZdZdddZddZddZddZddZddZ	ddZ
dd	Zdd
Zy)ro   zrGenerate data that matches a JSON schema.

    This tries to generate the minimal viable data for the schema.
    c                N    || _         |j                  di       | _        || _        y )Nz$defs)schemar   defsr,   )r@   r   r,   s      r9   __init__z_JsonSchemaTestData.__init__$  s"    JJw+		rN   c                8    | j                  | j                        S )z"Generate data for the JSON schema.)_gen_anyr   rM   s    r9   rq   z_JsonSchemaTestData.generate)  s    }}T[[))rN   c                z   |j                  d      x}r|S |j                  d      x}r|| j                  t        |      z     S |j                  d      x}r|| j                  t        |      z     S |j                  d      x}r7t        j                  dd|      }| j
                  |   }| j                  |      S |j                  d      x}r*| j                  || j                  t        |      z           S |j                  d      }	|	| j                         S |	d
k(  r| j                  |      S |	dk(  r| j                  |      S |	dk(  r| j                  |      S |	dk(  rt        | j                  |            S |	dk(  r| j                         S |	dk(  r| j                  |      S |	dk(  ry	t        d|	 d      )z"Generate data for any JSON Schema.constenumexamplesz$refz
^#/\$defs/ anyOftypeNobjectstringintegernumberbooleanarraynullzUnknown type: z2, please submit a PR to extend JsonSchemaTestData!)r   r,   r   resubr   r   _char_object_gen_str_gen_int_genfloat	_bool_gen
_array_genNotImplementedError)
r@   r   r   r   r   refkeyjs_defany_oftype_s
             r9   r   z_JsonSchemaTestData._gen_any-  s   JJw''5'LZZ''T'		CI-..J//X/DIIH566JJv&&S&&&C0CYYs^F==((zz'**V*==		CK(?!@AA

6"=::<h##F++h==((i==((hv.//i>>##g??6**f_%ug=o&pqqrN   c                h   t        |j                  dg             }i }|j                  d      x}r1|j                         D ]  \  }}||v s| j                  |      ||<     |j                  d      x}r=d}||v r
|dz  }||v r
|du r| j	                         ||<   |S | j                  |      ||<   |S )z'Generate data for a JSON Schema object.required
propertiesadditionalPropertiesadditionalProperty_T)setr   itemsr   r   )	r@   r   r   datar   r   r|   addition_propsadd_prop_keys	            r9   r   z_JsonSchemaTestData._object_genQ  s    vzz*b12!L11:1(..0
U(? $e 4DI 1 $ZZ(>??>?/L$&# $&%%)ZZ\\"  &*]]>%B\"rN   c                ,   |j                  d      }|| j                         |z  S |j                  d      dk(  ry|j                  d      x}r7|dk(  r2t        ddd      t        | j                  	      z   j                         S | j                         S )
z,Generate a string from a JSON Schema string.	minLength	maxLengthr   r   formatr
   i  r   )days)r   r   r
   r   r,   	isoformat)r@   r   min_lenfmts       r9   r   z_JsonSchemaTestData._str_genf  s    **[)::<'))::k"a'**X&&3&f}T1a(9$))+DDOOQQzz|rN   c                <   |j                  d      }||j                  d      }||dz
  }|j                  d      }||j                  d      }||dz   }|||| j                  ||z
  z  z   S ||| j                  z   S ||| j                  z
  S | j                  S )z/Generate an integer from a JSON Schema integer.maximumexclusiveMaximumr   minimumexclusiveMinimum)r   r,   )r@   r   r   exc_maxr   exc_mins         r9   r   z_JsonSchemaTestData._int_genu  s    **Y'?jj!34G"!A+**Y'?jj!34G"!A+7#6TYY'G*;<<< TYY&& TYY&&99rN   c                2    t        | j                  dz        S )z.Generate a boolean from a JSON Schema boolean.r   )rP   r,   rM   s    r9   r   z_JsonSchemaTestData._bool_gen  s    DIIM""rN   c                   g }|j                  d      }|j                  d      x}r?|D ]:  }|j                  | j                  |             |s&| xj                  dz  c_        < |j                  di       }|j                  dd      }|t	        |      kD  rVt        |t	        |      z
        D ]:  }|j                  | j                  |             |s&| xj                  dz  c_        < |S |rX|j                  d      }	|	|	t	        |      kD  r7|j                  | j                  |             |r| xj                  dz  c_        |S )z+Generate an array from a JSON Schema array.uniqueItemsprefixItemsr   r   minItemsr   maxItems)r   re   r   r,   r   range)
r@   r   r   unique_itemsprefix_itemsrl   items_schema	min_itemsr   	max_itemss
             r9   r   z_JsonSchemaTestData._array_gen  s   zz-0!::m44<4$DMM$/0IINI %
 zz'2.JJz1-	s4y 9s4y01DMM,78IINI 2  

:.I ID	$9DMM,78IINIrN   c                    t        t              }d}| j                  |z  }|dkD  r|t        |dz
  |z     z  }||z  }|dkD  r|t        | j                  |z     z  }|S )zOGenerate a character on the same principle as Excel columns, e.g. a-z, aa-az...r   r   r   )r   _charsr,   )r@   charssrems       r9   r   z_JsonSchemaTestData._char  sn    Fii5 AgqE)**AEMC Ag 	
VDII%&&rN   N)r   )r   z_utils.ObjectJsonSchemar,   r+   )rQ   r   )r   dict[str, Any]rQ   r   )r   r  rQ   r  )r   r  rQ   rS   )r   r  rQ   r+   )rQ   rP   )r   r  rQ   z	list[Any]rR   )rT   rU   rV   rW   r   rq   r   r   r   r   r   r   r   r5   rN   r9   ro   ro     s6    

*"rH*.#6	rN   ro   )9
__future__r   _annotationsr   r   collections.abcr   r   r   
contextlibr   dataclassesr   r	   r   r
   r   typingr   r   r~   typing_extensionsr   r   r   r]   r   r   r   r   r   r   r   r   rH   r   settingsr   toolsr   r   r   r    r!   r"   functionr#   r$   r&   r?   rg   ri   ascii_lettersdigitspunctuationr  ro   r5   rN   r9   <module>r     s    2 	  = = * ( . .   * 	 	 	  $ "  > O O Od djZ dj djN  /    F #;  * 
			-0B0B	BV VrN   