
    _j                        S SK r S SKJrJrJrJr  S SKJr  S SKJ	r	  S SK
Jr  \(       a  S SKJrJr  S\\   4S jrS\\   4S	 jrSS
\4S jjr " S S\5      r\\\	   \\\4   4   r " S S\5      rSSS\\\4   4S jrS\4S jrg)    N)TYPE_CHECKINGAnyOptionalUnion)ChatCompletion)	BaseModel)GenerateJsonSchema)ResultWithTextSearchResponsereturnc                 >   U R                   S   R                  R                  (       au  U R                   S   R                  R                   HN  nUR                  R                  S:X  d  M  [
        R                  " UR                  R                  5      S   nUs  $    g)z+Extract query from completion if it exists.r   searchqueryN)choicesmessage
tool_callsfunctionnamejsonloads	arguments)
completion	tool_callr   s      A/home/rurouni/.local/lib/python3.13/site-packages/exa_py/utils.pymaybe_get_queryr      s{    !$$//#++A.66AAI!!&&(2

9#5#5#?#?@I B     c                     U R                   S   R                  nUR                  (       d   S5       eU Vs/ s H  oDR                  S5      S:X  a  M  UPM     nnUR	                  USSUR                  S   R
                  US./5        U$ s  snf )zaAdd assistant message and exa result to messages list. Also remove previous exa call and results.r   z&Must use this with a tool call requestroler   toolr   )r   r   tool_call_idcontent)r   r   r   getextendid)r   messages
exa_resultassistant_messager   s        r   add_message_to_messagesr(      s    "**1-55''Q)QQ'  ('GF0Cz0Qx   OO  1 < <Q ? B B%		

 O!s   BBmax_lenc                     U R                    Vs/ s H0  nSUR                   SUR                   SUR                  SU  S3PM2     nnSR	                  U5      $ s  snf )z(Format exa result for pasting into chat.zUrl: z
Title: 
N)resultsurltitletextjoin)r&   r)   resultstrs       r   format_exa_resultr3   .   sh     !(((F 

|9V\\N"V[['5J4K2N(  
 99S>s   7Ac                   d   ^  \ rS rSrSr  S	S\S   4U 4S jjjr\S\S   S\4S j5       r	Sr
U =r$ )
ExaOpenAICompletion8   z"Exa wrapper for OpenAI completion.r&   zSearchResponse[ResultWithText]c	           
      8   > [         T	U ]  UUUUUUUS9  Xl        g )Nr$   r   createdmodelobjectsystem_fingerprintusage)super__init__r&   )
selfr&   r$   r   r9   r:   r;   r<   r=   	__class__s
            r   r?   ExaOpenAICompletion.__init__;   s3     	1 	 	
 %r   r   c                     U " UUR                   UR                  UR                  UR                  UR                  UR
                  UR                  S9$ )N)r&   r$   r   r9   r:   r;   r<   r=   r8   )clsr&   r   s      r   from_completion#ExaOpenAICompletion.from_completionQ   sQ     !}}&&&&""$$)<<""	
 		
r   )r&   )NN)__name__
__module____qualname____firstlineno____doc__r   r?   classmethodr   rE   __static_attributes____classcell__rA   s   @r   r5   r5   8   sR    ,  %=>% %, 
=>
 #
 
r   r5   c                   6   ^  \ rS rSrSrSU 4S jjrS rSrU =r$ )InlineJsonSchemaGeneratorf   zXCustom JSON schema generator that inlines all schemas without creating $defs references.c                 t   > [         TU ]  X5      nSU;   a!  US   nU R                  X45      nSU;   a  US	 U$ U$ )zDGenerate JSON schema normally, then post-process to inline all refs.z$defs)r>   generate_inline_refs)r@   schemamoder1   definitionsinlined_resultrA   s         r   rT   "InlineJsonSchemaGenerator.generatei   sR     !&/ f /K!..vCN.("7+!!r   c           	         [        U[        5      (       a  SU;   aJ  [        U5      S:X  a;  US   nUR                  S5      (       a  USS nXB;   a  U R	                  X$   U5      $ U$ UR                  5        VVs0 s H  u  pVXPR	                  Xb5      _M     snn$ [        U[        5      (       a!  U Vs/ s H  opR	                  Xr5      PM     sn$ U$ s  snnf s  snf )z5Recursively replace all $ref with actual definitions.z$ref   z#/$defs/   N)
isinstancedictlen
startswithrU   itemslist)r@   objrX   ref_pathdef_namekeyvalueitems           r   rU   &InlineJsonSchemaGenerator._inline_refsy   s    c4  }SQv;&&z22'|H.#001FTT

 '*iik&1
 **5>>&1  T""EHIST%%d8SII J Js   9C3C )
validation)	rG   rH   rI   rJ   rK   rT   rU   rM   rN   rO   s   @r   rQ   rQ   f   s    b  r   rQ   schema_inputJSONSchemaInputc                     [        U [        5      (       a*  [        U [        5      (       a  U R	                  SS[
        S9$ [        U [        5      (       a  U $ [        S[        U 5       S35      e)zConvert various schema input types to JSON Schema dict.

Args:
    schema_input: Either a Pydantic BaseModel class or a dict containing JSON Schema

Returns:
    dict: JSON Schema representation (fully inlined without $defs)
Fserialization)by_aliasrW   schema_generatorzUnsupported schema type: z#. Expected BaseModel class or dict.)r^   type
issubclassr   model_json_schemarQ   r_   
ValueError)rm   s    r   _convert_schema_inputrw      ss     ,%%*\9*M*M-- 6 . 
 	

 
L$	'	''\(:';;^_
 	
r   c                  4     SSK n SSKnUR                  R                  UR                  R                  [        5      5      nUR                  R                  U5      nUR                  R                  US5      nUR                  R                  U5      (       aI  [        US5       nU R                  U5      nUR                  S0 5      R                  SS5      sSSS5        $  g! [         a    SSKn  Nf = f! , (       d  f       g= f! [         a     gf = f)z,Get the package version from pyproject.toml.r   Nzpyproject.tomlrbprojectversionunknown)tomllibImportErrortomliospathdirnameabspath__file__r0   existsopenloadr"   	Exception)r}   r   current_dirproject_rootpyproject_pathfdatas          r   _get_package_versionr      s    	$ 	ggoobggooh&?@ww{3l4DE77>>.))nd+q||Axx	2.229iH ,+ * !  	$#	$ ,+   sM   C% BD
 &3C9	D
 %C63D
 5C66D
 9
DD
 D
 

DD))r   typingr   r   r   r   openai.types.chatr   pydanticr   pydantic.json_schemar	   
exa_py.apir
   r   r2   r   rc   r_   r(   intr3   r5   rs   rn   rQ   rw   r   rk   r   r   <module>r      s     6 6 ,  398C= d 03 (
. (
V Yc3h78) 2 )X
(9 
d38n 
0c r   