§
    ™ŠtjÂ"  ã                  ó„  — U d Z ddlmZ ddlZddlZddl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mZ ddlZddlZddlmZ erdd	lmZ d
Z ed e¦   «         ¦  «        Zefd9d„Zd:d„Zd;d„Z ej        d¦  «        Zd<d„Zd=d„Z d>d"„Z!d?d%„Z"d@d)„Z#dAd-„Z$dBd/„Z%g Z&d0e'd1<   dCd4„Z( ej)        d5¬6¦  «        dDd8„¦   «         Z*dS )Ez4Shared utility functions for async and sync clients.é    )ÚannotationsN)ÚMapping)Útzinfo)ÚTYPE_CHECKINGÚAnyÚcast)ÚquoteÚurlparse)ÚRunCreateMetadata)ÚZoneInfo)ú	x-api-keyÚapi_keyú
str | NoneÚreturnc                óú   — t          | t          ¦  «        r| S | t          u rZdD ]W}t          j        |› d�¦  «        x}r<|                     ¦   «                              d¦  «                             d¦  «        c S ŒXdS )aò  Get the API key from the environment.
    Precedence:
        1. explicit string argument
        2. LANGGRAPH_API_KEY (if api_key not provided)
        3. LANGSMITH_API_KEY (if api_key not provided)
        4. LANGCHAIN_API_KEY (if api_key not provided)

    Args:
        api_key: The API key to use. Can be:
            - A string: use this exact API key
            - None: explicitly skip loading from environment
            - NOT_PROVIDED (default): auto-load from environment variables
    )Ú	LANGGRAPHÚ	LANGSMITHÚ	LANGCHAINÚ_API_KEYú"ú'N)Ú
isinstanceÚstrÚNOT_PROVIDEDÚosÚgetenvÚstrip)r   ÚprefixÚenvs      ú]/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langgraph_sdk/_shared/utilities.pyÚ_get_api_keyr!      s‘   € õ �'�3ÑÔð ØˆØ•,ÐÐà=ð 	9ð 	9ˆFÝ”i 6Ð 3Ð 3Ð 3Ñ4Ô4Ð4ˆsð 9Ø—y’y‘{”{×(Ò(¨Ñ-Ô-×3Ò3°CÑ8Ô8Ð8Ð8Ð8ð9ð ˆ4ó    Úcustom_headersúMapping[str, str] | Noneúdict[str, str]c                ó¢   — |pi }t           D ]}||v rt          d|› d�¦  «        ‚Œddt          j        › �i|¥}t	          | ¦  «        }|r||d<   |S )z1Combine api_key and custom user-provided headers.zCannot set reserved header 'r   z
User-Agentzlanggraph-sdk-py/r   )ÚRESERVED_HEADERSÚ
ValueErrorÚlanggraph_sdkÚ__version__r!   )r   r#   ÚheaderÚheadersÚresolved_api_keys        r    Ú_get_headersr.   3   s’   € ð
 $Ð) r€NÝ"ð Gð GˆØ�^Ð#Ð#ÝÐE¸FÐEÐEÐEÑFÔFÐFð $ð 	ÐE­-Ô*CÐEÐEðà
ð€Gõ $ GÑ,Ô,ÐØð 0Ø/ˆ�Ñà€Nr"   Úobjr   c                óþ  — t          | t          ¦  «        }t          | d¦  «        r?t          | j        ¦  «        r+|rt          d| ›d| ›�¦  «        ‚|                      ¦   «         S t          | d¦  «        r?t          | j        ¦  «        r+|rt          d| ›d| ›�¦  «        ‚|                      ¦   «         S t          | t          t          f¦  «        rt          | ¦  «        S t          dt          | ¦  «        › d�¦  «        ‚)NÚ
model_dumpz#Cannot JSON-serialize type object: zI. Did you mean to pass an instance of the object instead?
Received type: ÚdictzObject of type z is not JSON serializable)
r   ÚtypeÚhasattrÚcallabler1   Ú	TypeErrorr2   ÚsetÚ	frozensetÚlist)r/   Úis_classs     r    Ú_orjson_defaultr;   H   s1  € Ý˜#�tÑ$Ô$€HÝˆs�LÑ!Ô!ð P¥h¨s¬~Ñ&>Ô&>ð PØð 	Ýð,°cð ,ð ,Ø$'ð,ð ,ñô ð ð �~Š~ÑÔÐÝ	��fÑ	Ô	ð 
P¥(¨3¬8Ñ"4Ô"4ð 
PØð 	Ýð,°cð ,ð ,Ø$'ð,ð ,ñô ð ð �xŠx‰zŒzÐÝ	�C�#�yÐ)Ñ	*Ô	*ð PÝ�C‰yŒyÐåÐN­$¨s©)¬)ÐNÐNÐNÑOÔOÐOr"   z5(\/threads\/(?P<thread_id>.+))?\/runs\/(?P<run_id>.+)Úresponseúhttpx.ResponseúRunCreateMetadata | Nonec                óè   — | j                              d¦  «        x}rUt                               |¦  «        x}r9t	          |                     d¦  «        |                     d¦  «        pd¬¦  «        S dS )z/Extract run metadata from the response headers.zContent-LocationÚrun_idÚ	thread_idN)r@   rA   )r,   ÚgetÚ_RUN_METADATA_PATTERNÚsearchr   Úgroup)r<   Úcontent_locationÚmatchs      r    Ú_get_run_metadata_from_responserH   d   sƒ   € ð %Ô,×0Ò0Ð1CÑDÔDÐDÐð 
Ý&×-Ò-Ð.>Ñ?Ô?Ð?ˆð
õ !Ø—;’;˜xÑ(Ô(Ø—k’k +Ñ.Ô.Ð6°$ð
ñ 
ô 
ð 	
ð
 ˆ4r"   Úeventr   Údataúdict[str, Any] | Nonec                ó  — | dk    rdS |                       d¦  «        }|d         }t          |¦  «        dk    r
|dd…         ng }|||dœ}|dk    r/t          |t          ¦  «        r|                     dg ¦  «        |d	<   ng |d	<   |S )
z}Convert an SSE event+data pair into a v2 stream part dict.

    Returns None for ``end`` events (signals end of stream).
    ÚendNú|r   é   )r3   ÚnsrJ   ÚvaluesÚ__interrupt__Ú
interrupts)ÚsplitÚlenr   r2   Úpop)rI   rJ   ÚpartsÚ
event_typerP   Úresults         r    Ú_sse_to_v2_dictrZ   s   sž   € ð
 �‚~€~ØˆtØ�KŠK˜ÑÔ€EØ�q”€JÝ˜%‘j”j 1’n�nˆˆqˆrˆrŒˆ¨"€BØ&0¸ÀDÐIÐI€FØ�XÒÐ¥*¨Tµ4Ñ"8Ô"8ÐØ#Ÿxšx¨¸Ñ<Ô<ˆˆ|ÑÐà!ˆˆ|ÑØ€Mr"   Útzústr | tzinfo | ZoneInfo | Nonec                óN  — | �t          | t          ¦  «        r| S t          | t          ¦  «        rTt          | dd¦  «        }t          |t          ¦  «        r|S |                      d¦  «        }|�|S t          d| ›d�¦  «        ‚t          dt          | ¦  «        j        › �¦  «        ‚)a—  Convert a timezone argument to an IANA timezone string.

    Accepts:
        - A string (returned as-is, assumed to be an IANA timezone name)
        - A ``datetime.tzinfo`` instance (e.g. ``zoneinfo.ZoneInfo("America/New_York")``,
          ``datetime.timezone.utc``). The ``key`` attribute is used if available,
          otherwise ``tzname(None)`` is used.
        - ``None`` (returned as ``None``)
    NÚkeyz$Cannot determine timezone name from zL. Use a zoneinfo.ZoneInfo instance or pass a string like 'America/New_York'.z9Expected str, datetime.tzinfo, or None for timezone, got )	r   r   r   ÚgetattrÚtznamer(   r6   r3   Ú__name__)r[   r^   Únames      r    Ú_resolve_timezonerc   …   sÄ   € ð 
€z•Z ¥CÑ(Ô(€zØˆ	Ý�"•fÑÔð 
å�b˜% Ñ&Ô&ˆÝ�c�3ÑÔð 	ØˆJà�yŠy˜‰ŒˆØÐØˆKÝðY°2ð Yð Yð Yñ
ô 
ð 	
õ ØWÅDÈÁHÄHÔDUÐWÐWñô ð r"   ÚschemeÚintc                ó   — | dk    rdndS )NÚhttpsi»  éP   © )rd   s    r    Ú_default_portrj   £   s   € Ø˜GÒ#Ð#ˆ3ˆ3¨Ð+r"   Úbase_urlú	httpx.URLÚlocationc                óR  — t          |¦  «        }|j        s	|j        s|S t          | j        ¦  «        }|t          | j        ¦  «        | j        pt          |¦  «        f}|j        |j        pd|j        pt          |j        ¦  «        f}||k    rt          d|›d|› d|› �¦  «        ‚|S )zæValidate that a reconnect Location URL is same-origin as the base URL.

    Raises ValueError if the Location header points to a different origin
    (scheme + host + port), which would leak credentials to an external server.
    Ú z4Refusing to follow cross-origin reconnect Location: z	 (origin z!) does not match base URL origin )	r
   rd   Únetlocr   ÚhostÚportrj   Úhostnamer(   )rk   rm   ÚparsedÚbase_schemeÚbase_originÚ
loc_origins         r    Ú_validate_reconnect_locationrx   §   så   € õ �hÑÔ€FàŒ=ð  ¤ð Øˆå�h”oÑ&Ô&€KàÝˆHŒMÑÔØŒÐ3� {Ñ3Ô3ð€Kð 	ŒØŒÐ˜2ØŒÐ3•} V¤]Ñ3Ô3ð€Jð
 �jÒ Ð ÝðRÀ8ð Rð RØ!ðRð RØDOðRð Rñ
ô 
ð 	
ð €Or"   ÚdúMapping[str, Any]údict[str, Any]c                ó>   — d„ |                       ¦   «         D ¦   «         S )Nc                ó   — i | ]
\  }}|®||“ŒS ©Nri   )Ú.0ÚkÚvs      r    ú
<dictcomp>z"_provided_vals.<locals>.<dictcomp>Æ   s   € Ð8Ð8Ð8‘T�Q˜¨!¨-ˆAˆq¨-¨-¨-r"   )Úitems)ry   s    r    Ú_provided_valsr„   Å   s   € Ø8Ð8˜QŸWšW™YœYÐ8Ñ8Ô8Ð8r"   Úvaluec                ó  — | €t          d¦  «        ‚t          | t          t          f¦  «        rt          d¦  «        ‚t	          t          | ¦  «        d¬¦  «        }|r+t          d„ |D ¦   «         ¦  «        rdt          |¦  «        z  }|S )ay  Encode a value for safe interpolation into a request path segment.

    Path segments are encoded with ``safe=""`` so that ``/`` and other reserved
    characters are escaped. Standalone dot-segments (``.`` and ``..``) are also
    encoded because some URL-handling stacks (including ``httpx``) collapse
    them client-side as relative-path traversal before transmission. The value
    is coerced to ``str`` so callers can pass ``uuid.UUID`` and similar types
    directly without changing call sites.

    A properly formed identifier (for example, a standard UUID, which contains
    no dots or reserved characters) round-trips through this function
    unchanged.

    Raises:
        TypeError: If `value` is `None` or a `bytes`/`bytearray` instance.
            Coercing those would produce misleading paths (e.g. `/threads/None`),
            so surface the caller bug instead.
    Nzpath parameter must not be Nonez9path parameter must not be bytes; pass a str or uuid.UUIDro   )Úsafec              3  ó"   K  — | ]
}|d k    V — ŒdS )ú.Nri   )r   Úcs     r    ú	<genexpr>z$_quote_path_param.<locals>.<genexpr>å   s&   è è € Ð/Ð/ 1�a˜3’hÐ/Ð/Ð/Ð/Ð/Ð/r"   z%2E)r6   r   ÚbytesÚ	bytearrayr	   r   ÚallrU   )r…   Úquoteds     r    Ú_quote_path_paramr�   É   s”   € ð& €}ÝÐ9Ñ:Ô:Ð:Ý�%�%¥Ð+Ñ,Ô,ð UÝÐSÑTÔTÐTÝ•3�u‘:”: BÐ'Ñ'Ô'€Fð
 ð %•#Ð/Ð/¨Ð/Ñ/Ô/Ñ/Ô/ð %Ø�˜V™œÑ$ˆØ€Mr"   zlist[httpx.ASGITransport]Ú_registered_transportsÚappÚNonec                ó(   — t           D ]	}| |_        Œ
d S r~   )r‘   r’   )r’   Ú	transports     r    Úconfigure_loopback_transportsr–   î   s$   € Ý+ð ð ˆ	Øˆ	Œˆðð r"   rO   )Úmaxsizeútype[httpx.ASGITransport]c                 óV   — 	 ddl m}  | j        S # t          $ r t          j        cY S w xY w)Nr   ©Úasgi_transport)Úlanggraph_apir›   ÚASGITransportÚImportErrorÚhttpxrš   s    r    Úget_asgi_transportr    ó   sL   € ð#Ø0Ð0Ð0Ð0Ð0Ð0àÔ+Ð+øÝð #ð #ð #åÔ"Ð"Ð"Ð"ð#øøøs   ‚ �(§()r   r   r   r   )r   r   r#   r$   r   r%   )r/   r   r   r   )r<   r=   r   r>   )rI   r   rJ   r   r   rK   )r[   r\   r   r   )rd   r   r   re   )rk   rl   rm   r   r   r   )ry   rz   r   r{   )r…   r   r   r   )r’   r   r   r“   )r   r˜   )+Ú__doc__Ú
__future__r   Ú	functoolsr   ÚreÚcollections.abcr   Údatetimer   Útypingr   r   r   Úurllib.parser	   r
   rŸ   r)   Úlanggraph_sdk.schemar   Úzoneinfor   r'   Úobjectr   r!   r.   r;   ÚcompilerC   rH   rZ   rc   rj   rx   r„   r�   r‘   Ú__annotations__r–   Ú	lru_cacher    ri   r"   r    ú<module>r¯      sI  ðØ :Ð :Ð :à "Ð "Ð "Ð "Ð "Ð "à Ð Ð Ð Ø 	€	€	€	Ø 	€	€	€	Ø #Ð #Ð #Ð #Ð #Ð #Ø Ð Ð Ð Ð Ð Ø +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ø (Ð (Ð (Ð (Ð (Ð (Ð (Ð (à €€€à Ð Ð Ð Ø 2Ð 2Ð 2Ð 2Ð 2Ð 2àð "Ø!Ð!Ð!Ð!Ð!Ð!à!Ð àˆt�D˜&˜&™(œ(Ñ#Ô#€ð (4ð ð ð ð ð ð2ð ð ð ð*Pð Pð Pð Pð. #˜œ
Ø<ñô Ð ð
ð ð ð ðð ð ð ð$ð ð ð ð<,ð ,ð ,ð ,ðð ð ð ð<9ð 9ð 9ð 9ðð ð ð ðB 57Ð Ð 6Ð 6Ð 6Ñ 6ðð ð ð ð
 €Ô˜QÐÑÔð#ð #ð #ñ  Ôð#ð #ð #r"   