
    _jM                        S r SSKJr  SSKrSSKJrJrJrJrJ	r	J
r
  SSKrSSKrSSKJrJr  SSKJrJrJrJrJrJrJrJrJr  SS jrSS	 jrSS
 jrSS jrSS jr    SS jr    SS jr g)zUtilities for the Research API.    )annotationsN)AnyAsyncGeneratorDict	GeneratorOptionalType)	BaseModelValidationError   )	ResearchEventResearchDefinitionEventResearchOutputEventResearchPlanDefinitionEventResearchPlanOperationEventResearchPlanOutputEventResearchTaskDefinitionEventResearchTaskOperationEventResearchTaskOutputEventc                ~     [        U [        5      =(       a    [        U [        5      $ ! [        [
        4 a     gf = f)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)schemas    J/home/rurouni/.local/lib/python3.13/site-packages/exa_py/research/utils.pyis_pydantic_modelr       s7    &$'IJvy,II~& s   &) <<c                    SSK Jn  U" U 5      $ )zConvert a Pydantic model to JSON Schema.

Args:
    model: The Pydantic model class.

Returns:
    JSON Schema dictionary with all references inlined.
r   )_convert_schema_input)exa_py.utilsr    )modelr    s     r   pydantic_to_json_schemar#   /   s     3 !''    c                    U (       a  U R                  5       (       d  gSU ;  a  gU R                  S5      u  pnUR                  5       UR                  5       4$ )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)linefield_values       r   parse_sse_liner-   ?   sG     tzz||
$nnS)OEe;;=%++-''r$   c                ,   SnSnU  HD  n[        U5      nU(       d  M  Uu  pVUS:X  a  UnM%  US:X  d  M-   [        R                  " U5      nMF     U(       a"  U(       a  [	        U[
        5      (       a  XS'   U$ g! [        R                   a    Un M  f = f)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)r-   jsonloadsJSONDecodeErrorr   dict)event_lines
event_name
event_datar)   parsedr*   r,   s          r   parse_sse_event_rawr:   R   s     JJ%GJf_#!ZZ.
  jj$''&0{# '' #"
#s   A99BBc           	         U R                  S5      nU(       d  g[        [        [        [        [
        [        [        [        S.nUR                  U5      nU(       d  g UR                  U 5      $ ! [         a     gf = f)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.
r1   N)z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   )	raw_event
event_typeevent_modelsmodel_classs       r   parse_research_eventrB   v   sy     {+J  7.64.64.	L "":.K)))44 s   A0 0
A=<A=c              #    #    / nU R                  5        Hx  nU(       d5  U(       a,  [        U5      nU(       a  [        U5      nU(       a  Uv   / nM=  M?  [        U[        5      (       a  UR                  S5      OUnUR                  U5        Mz     U(       a+  [        U5      nU(       a  [        U5      nU(       a  Uv   gggg7f)zStream SSE events from a requests Response.

Args:
    response: The streaming response object.

Yields:
    Parsed ResearchEvent objects.
zutf-8N)
iter_linesr:   rB   r   bytesdecodeappend)responser6   r)   r>   r/   decoded_lines         r   stream_sse_eventsrJ      s      K##%/<	0;E#   4>dE3J3J4;;w/PTL|, & '4	(3E   s   CCc               N  #    / nU R                  5         Sh  vN nU(       d6  U(       a-  [        U5      nU(       a  [        U5      nU(       a  U7v   / nMD  MF  UR                  U5        MY   NT
 U(       a,  [        U5      nU(       a  [        U5      nU(       a  U7v   gggg7f)zStream SSE events from an httpx Response.

Args:
    response: The async streaming response object.

Yields:
    Parsed ResearchEvent objects.
N)aiter_linesr:   rB   rG   )rH   r6   r)   r>   r/   s        r   async_stream_sse_eventsrM      s      K**, %d/<	0;E#   t$%, '4	(3E   s&   B%A0A.A0AB%.A005B%)r   r   returnbool)r"   zType[BaseModel]rN   Dict[str, Any])r)   strrN   zOptional[tuple[str, str]])r6   z	list[str]rN   zOptional[Dict[str, Any]])r>   rP   rN   zOptional[ResearchEvent])rH   zrequests.ResponserN   z$Generator[ResearchEvent, None, None])rH   zhttpx.ResponserN   z#AsyncGenerator[ResearchEvent, None])!__doc__
__future__r   r2   typingr   r   r   r   r   r	   httpxrequestspydanticr
   r   modelsr   r   r   r   r   r   r   r   r   r   r#   r-   r:   rB   rJ   rM    r$   r   <module>rZ      sx    % "     /
 
 
( (&!H!H!!)!H  ( r$   