+
    WiM                        R t ^ RIHt ^ RIt^ RIHtHtHtHtH	t	H
t
 ^ RIt^ RIt^ RIHtHt ^RIHtHtHtHtHtHtHtHtHt R R ltR R	 ltR
 R ltR R ltR R ltR R ltR R lt R# )zUtilities for the Research API.)annotationsN)AnyAsyncGeneratorDict	GeneratorOptionalType)	BaseModelValidationError)	ResearchEventResearchDefinitionEventResearchOutputEventResearchPlanDefinitionEventResearchPlanOperationEventResearchPlanOutputEventResearchTaskDefinitionEventResearchTaskOperationEventResearchTaskOutputEventc                    V ^8  d   QhRRRR/# )   schemar   returnbool )formats   "T/home/ubuntu/hermes-agent/venv/lib/python3.14/site-packages/exa_py/research/utils.py__annotate__r       s      c d     c                     \        V \        4      ;'       d    \        V \        4      #   \        \
        3 d     R# i ; i)zCheck if the given schema is a Pydantic model class.

Args:
    schema: The schema to check.

Returns:
    True if schema is a Pydantic model class, False otherwise.
F)
isinstancetype
issubclassr	   	TypeErrorAttributeError)r   s   &r   is_pydantic_modelr$       s:    &$'IIJvy,II~& s   * * ??c                    V ^8  d   QhRRRR/# )r   modelzType[BaseModel]r   Dict[str, Any]r   )r   s   "r   r   r   /   s     ( (? (~ (r   c                    ^ RI Hp V! V 4      # )zConvert a Pydantic model to JSON Schema.

Args:
    model: The Pydantic model class.

Returns:
    JSON Schema dictionary with all references inlined.
)_convert_schema_input)exa_py.utilsr)   )r&   r)   s   & r   pydantic_to_json_schemar+   /   s     3 !''r   c                    V ^8  d   QhRRRR/# )r   linestrr   zOptional[tuple[str, str]]r   )r   s   "r   r   r   ?   s     ( ( (!: (r   c                    V '       d   V P                  4       '       g   R# RV 9  d   R# V P                  R4      w  rpVP                  4       VP                  4       3# )zParse a single SSE line.

Args:
    line: The SSE line to parse.

Returns:
    Tuple of (field, value) or None if not a valid SSE line.
N:)strip	partition)r-   field_values   &   r   parse_sse_liner6   ?   sG     tzz||
$nnS)OEe;;=%++-''r   c                    V ^8  d   QhRRRR/# )r   event_linesz	list[str]r   zOptional[Dict[str, Any]]r   )r   s   "r   r   r   R   s     ! !Y !3K !r   c                <   RpRpV  FG  p\        V4      pV'       g   K  Vw  rVVR8X  d   TpK'  VR8X  g   K0   \        P                  ! V4      pKI  	  V'       d%   V'       d   \	        V\
        4      '       d   WR&   V# R#   \        P                   d    Tp K  i ; i)zParse SSE event lines into a raw event dictionary.

Args:
    event_lines: List of lines that make up an SSE event.

Returns:
    Parsed event data or None if invalid.
Neventdata	eventType)r6   jsonloadsJSONDecodeErrorr   dict)r8   
event_name
event_datar-   parsedr3   r5   s   &      r   parse_sse_event_rawrD   R   s     JJ%GJf_#!ZZ.
  jj$''&0{# '' #"
#s   B  BBc                    V ^8  d   QhRRRR/# )r   	raw_eventr'   r   zOptional[ResearchEvent]r   )r   s   "r   r   r   v   s     ! !N !7N !r   c                   V P                  R4      pV'       g   R# R\        R\        R\        R\        R\
        R\        R	\        R
\        /pVP                  V4      pV'       g   R#  VP                  V 4      #   \         d     R# i ; i)zParse a raw event dictionary into a typed ResearchEvent.

Args:
    raw_event: Raw event dictionary with eventType field.

Returns:
    Typed ResearchEvent or None if parsing fails.
r<   Nzresearch-definitionzresearch-outputzplan-definitionzplan-operationzplan-outputztask-definitionztask-operationztask-output)getr   r   r   r   r   r   r   r   model_validater
   )rF   
event_typeevent_modelsmodel_classs   &   r   parse_research_eventrM   v   s     {+J 	6.64.64.	L "":.K)))44 s   *A; ;B
	B
c                    V ^8  d   QhRRRR/# )r   responsezrequests.Responser   z$Generator[ResearchEvent, None, None]r   )r   s   "r   r   r      s     ! !!)!r   c              #    "   . pV P                  4        F}  pV'       g9   V'       d/   \        V4      pV'       d   \        V4      pV'       d   Vx  . pKA  KC  \        V\        4      '       d   VP                  R4      MTpVP                  V4       K  	  V'       d1   \        V4      pV'       d   \        V4      pV'       d   Vx  R# R# R# R# 5i)zStream SSE events from a requests Response.

Args:
    response: The streaming response object.

Yields:
    Parsed ResearchEvent objects.
zutf-8N)
iter_linesrD   rM   r   bytesdecodeappend)rO   r8   r-   rF   r:   decoded_lines   &     r   stream_sse_eventsrV      s      K##%/<	0;E#   4>dE3J3J4;;w/PTL|, & '4	(3E   s   %CA5C2Cc                    V ^8  d   QhRRRR/# )r   rO   zhttpx.Responser   z#AsyncGenerator[ResearchEvent, None]r   )r   s   "r   r   r      s         ( r   c               f  "   . pV P                  4         Rj  xL
  pV'       g:   V'       d0   \        V4      pV'       d   \        V4      pV'       d   V5x  . pKI  KK  VP                  V4       K^   LYDZT'       d2   \        T4      pT'       d   \        T4      pT'       d   T5x  R# R# R# R# 5i)zStream SSE events from an httpx Response.

Args:
    response: The async streaming response object.

Yields:
    Parsed ResearchEvent objects.
N)aiter_linesrD   rM   rT   )rO   r8   r-   rF   r:   s   &    r   async_stream_sse_eventsrZ      s      K**, % %d/<	0;E#   t$%, '4	(3E   s1   B1A5A3A5B1AB13A55B1>3B1)!__doc__
__future__r   r=   typingr   r   r   r   r   r   httpxrequestspydanticr	   r
   modelsr   r   r   r   r   r   r   r   r   r$   r+   r6   rD   rM   rV   rZ   r   r   r   <module>rb      sX    % "     /
 
 
( (&!H!H!H r   