Ë
    A²Xj ã                  óº  — U d dl mZ d dlZd dlZd dlZd dlmZmZm	Z	m
Z
mZmZmZmZmZmZmZ d dl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 dd
lm Z m!Z! ddl"m#Z#m$Z$m%Z% ddl&m'Z' ddl(m)Z)m*Z*m+Z+ ddl,m-Z- ddl.m/Z/ ddl0m1Z1 ddl2m3Z3 ddl4m5Z5 ddl6m7Z7 ddgZ8 ejr                  d«      Z:de;d<   dZ<dZ=de;d<   	  G d„ d«      Z> edd¬ «      Z?d!e;d"<    ed#d$¬ «      Z@d%e;d&<    G d'„ de*«      ZA G d(„ d)e«      ZB G d*„ d+e«      ZC G d,„ d-e«      ZD G d.„ d/e«      ZE G d0„ d1«      ZFdTd2„ZGdUd3„ZH G d4„ d5«      ZIdVd6„ZJdWd7„ZK G d8„ d9«      ZLdXd:„ZMdYd;„ZNdZd<„ZOd[d=„ZPd\d>„ZQd\d?„ZRd]d@„ZSd^dA„ZTd_dB„ZUd`dC„ZVdadD„ZWdbdE„ZXdcdF„ZYdddG„ZZdedH„Z[dedI„Z\dfdJ„Z]dgdK„Z^dhdL„Z_	 	 	 	 	 	 	 	 didM„Z`djdN„Za	 	 	 	 	 	 dkdO„Zb G dP„ dQejÆ                  «      Zd G dR„ dSejÊ                  «      Zfy)lé    )ÚannotationsN)ÚAnyÚDictÚListÚCallableÚIterableÚIteratorÚOptionalÚ	GeneratorÚAsyncIteratorÚAsyncGeneratorÚcast)ÚTokenÚ
ContextVar)ÚLiteralÚoverrideé   )Úis_dict)Ú	BaseModel)Ú
APIRequest)ÚAPIResponseÚAsyncAPIResponse)ÚStreamÚAsyncStreamÚServerSentEvent)ÚAnthropicError)ÚCallNextÚ
MiddlewareÚAsyncCallNext)Úmerge_headers)ÚMessageé   )Úhelper_header)ÚBetaMessage)ÚAnthropicBetaParam)ÚBetaFallbackParamÚBetaFallbackStateÚBetaRefusalFallbackMiddlewarezanthropic.lib.middlewarezlogging.LoggerÚlogz/v1/messages)zfallback-credit-2026-06-01útuple[AnthropicBetaParam, ...]ÚDEFAULT_BETASc                  ó6   — e Zd ZU dZded<   	 dd„Zd	d„Zd
d„Zy)r'   u{  Tracks which fallback a sequence of requests is pinned to.

    Create one and enter it (`with state:` â€” the same context manager works for
    both clients) around every request that should share the pin â€” the turns of
    one conversation, or any wider scope the stickiness should apply to;
    `BetaRefusalFallbackMiddleware` mutates it in place when a model refuses.
    z
int | NoneÚindexc                ó   — d | _         y ©N)r-   ©Úselfs    úi/var/www/html/content_generation/venv/lib/python3.12/site-packages/anthropic/lib/middleware/_fallbacks.pyÚ__init__zBetaFallbackState.__init__D   s	   € Øˆ�
ó    c                óˆ   — t         j                  | «      }t        j                  g t        j                  «       ¢|‘­«       | S r/   )Ú_fallback_stateÚsetÚ_fallback_state_tokensÚget)r1   Útokens     r2   Ú	__enter__zBetaFallbackState.__enter__G   s:   € Ü×#Ñ# DÓ)ˆÜ×"Ñ"Ð#IÔ%;×%?Ñ%?Ó%AÐ#IÀ5Ñ#IÔJØˆr4   c                óŒ   — t         j                  «       }t         j                  |d d «       t        j	                  |d   «       y )Néÿÿÿÿ)r8   r9   r7   r6   Úreset)r1   Úexc_infoÚtokenss      r2   Ú__exit__zBetaFallbackState.__exit__L   s6   € Ü'×+Ñ+Ó-ˆÜ×"Ñ" 6¨#¨2 ;Ô/Ü×Ñ˜f R™jÕ)r4   N©ÚreturnÚNone)rC   r'   )r?   ÚobjectrC   rD   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r3   r;   rA   © r4   r2   r'   r'   4   s#   … ñð Óðóóô
*r4   Úanthropic_beta_fallback_state)Údefaultz$ContextVar[BetaFallbackState | None]r6   Ú$anthropic_beta_fallback_state_tokensrK   z7ContextVar[tuple[Token[BetaFallbackState | None], ...]]r8   c                  óô   — e Zd ZdZddœ	 	 	 	 	 dd„Zedd„«       Ze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)r(   uÈ  Middleware that retries refused beta `/v1/messages` requests down a
    fallback chain, reproducing the server-side `fallbacks` wire shape
    client-side.

    Only `client.beta.messages` requests are handled â€” refusals minted by the
    first-party `client.messages` surface carry no `fallback_credit_token`, so
    those requests pass through untouched.

    Non-streaming: when a response comes back with `stop_reason: "refusal"`, the
    request is retried with each entry of `fallbacks` merged over the original
    params â€” passing along the refusal's `fallback_credit_token` when it minted
    one â€” until a model accepts or the chain is exhausted. A `fallback` seam
    block per model boundary is prepended to the served message's content â€”
    the same block shape the streaming splice emits. The served hop's `usage`
    is left verbatim (streaming rewrites it to per-hop `usage.iterations`).

    Streaming: when the stream ends in `stop_reason: "refusal"`, a second
    request is issued to the fallback model. It carries the refusal's
    `fallback_credit_token`, plus the refused model's partial output as a
    trailing assistant prefill when the refusal grants one
    (`fallback_has_prefill_claim`). The fallback's events are then spliced onto
    the still-open stream, so the client sees one continuous message in the
    server-side `fallbacks` wire shape: a `fallback` content block at each
    model boundary, monotonic block indices, and per-hop `usage.iterations` on
    the final `message_delta`. A refusal before any output streamed retries
    even without a credit token, and the serving hop's `message_start` opens
    the wire carrying the primary's message id.

    The fallback-credit beta the credit tokens require is sent by default on
    every request the middleware handles; the `betas` option controls this.

    In both modes a fallback that itself refuses with a fresh credit token
    continues down the chain. A streaming fallback whose appended prefill the
    server rejects (HTTP 400 body mismatch) is retried once without it; a
    fallback whose request fails outright is skipped â€” its token was never
    redeemed, so it carries to the next entry. When every remaining entry fails
    over HTTP, the suppressed refusal is replayed to the client with
    `recommended_model` stamped from the final failure (the failed model for
    capacity errors, `null` otherwise). A refusal surfaced to the client rather
    than retried is reported through the `anthropic.lib.middleware` logger.

    To keep later requests on the model that accepted, run them inside a shared
    `BetaFallbackState` context; requests sharing that state start directly at
    the pinned fallback. Reuse one state across whatever scope the pin should
    apply to â€” typically a conversation. The state is the only pin: `fallback`
    seam blocks replayed in the request history are stripped from the outgoing
    request (an assistant turn left empty by the strip is dropped whole), never
    read back as a pin.

    ```py
    client = Anthropic(middleware=[BetaRefusalFallbackMiddleware([{"model": "claude-opus-4-8"}])])

    state = BetaFallbackState()
    with state:
        message = client.beta.messages.create(**params)
    ```
    N)Úbetasc               ób   — t        |«      | _        |€t        n
t        |«      | _        d| _        y)ué  
        Args:
            fallbacks: The fallback chain, tried in order. An empty chain disables
                the middleware.

            betas: Betas added to the `anthropic-beta` header of every `/v1/messages`
                request this middleware handles â€” the original request included, since
                refusals only carry a `fallback_credit_token` when the beta is enabled.
                Defaults to `("fallback-credit-2026-06-01",)`; pass `()` to send none.
        NF)ÚtupleÚ
_fallbacksr+   Ú_betasÚ_warned_missing_state)r1   Ú	fallbacksrP   s      r2   r3   z&BetaRefusalFallbackMiddleware.__init__™   s)   € ô    	Ó*ˆŒØ', }•m¼%À»,ˆŒØ%*ˆÕ"r4   c           	     ó|  — | j                  |«      }|€ ||«      S t        j                  «       }| j                  |«      }| j	                  |«      }t        || j                  «      }t        |«      }|dk(  r|ni |¥| j                  |   ¥}|j                  |¬«      } ||«      }	|	j                  j                  s|	S |j                  r6|dz   }
|
t        | j                  «      k\  r|	S | j                  |||	||
|¬«      S |}|	}t        |j                  d«      xs d«      }g }|t        | j                  «      dz
  k  �r"|j                  j                  �r|j!                  «       }t#        |t$        t&        f«      r|j(                  dk7  rnÕ|dz  } ||«       t+        |«      }t-        |«      } ||j                  t/        || j                  |   |«      ¬«      «      }|j                  j                  r9t        | j                  |   d   «      }|j1                  t3        |||«      «       |}|t        | j                  «      dz
  k  r|j                  j                  r�Œ|rW|j                  j                  rA|j!                  «       }t#        |t$        t&        f«      r|j(                  dk7  rt5        ||«      S |S ©Nr=   ©Úbodyé   ©ÚrequestrZ   ÚresponseÚ	call_nextÚ	first_hopÚpinÚmodelÚ Úrefusal)Ú_applicable_bodyr6   r9   Ú_start_indexÚ	_make_pinÚ_with_middleware_headersrT   Ú_strip_seam_blocksrS   ÚcopyÚhttp_responseÚ
is_successÚstreamÚlenÚ_splice_fallback_streamÚstrÚparseÚ
isinstancer!   r$   Ústop_reasonÚ_credit_tokenÚ_refusal_categoryÚ_merged_bodyÚappendÚ_seam_blockÚ_prepend_seam_blocks©r1   r]   r_   rZ   ÚstateÚstart_indexra   Úinitial_bodyÚinitial_requestr^   r`   r-   ÚresÚ
from_modelÚseamsÚmessager:   ÚcategoryÚto_modelÚserveds                       r2   Úhandlez$BetaRefusalFallbackMiddleware.handle­   sŒ  € à×$Ñ$ WÓ-ˆØˆ<Ù˜WÓ%Ð%ä×#Ñ#Ó%ˆØ×'Ñ'¨Ó.ˆØ�n‰n˜UÓ#ˆô +¨7°D·K±KÓ@ˆô
 " $Ó'ˆØ*¨bÒ0‘tÐ6^¸Ð6^ÀÇÁÐQ\ÑA]Ð6^ˆØ!Ÿ,™,¨L˜,Ó9ˆá˜_Ó-ˆØ×%Ñ%×0Ò0ØˆOà�>Š>Ø# a™ˆIð œC §¡Ó0Ò0Ø�Ø×/Ñ/Ø'Ø!Ø!Ø#Ø#Øð 0ó ð ð ˆØˆÜ˜×)Ñ)¨'Ó2Ò8°bÓ9ˆ
Ø&(ˆØ”c˜$Ÿ/™/Ó*¨QÑ.Ó.°3×3DÑ3D×3OÓ3OØ—i‘i“kˆGÜ˜g¬´Ð'=Ô>À'×BUÑBUÐYbÒBbØà�Q‰JˆEÙ�ŒJÜ! 'Ó*ˆEÜ(¨Ó1ˆHÙ˜GŸL™L¬l¸4ÀÇÁÐQVÑAWÐY^Ó._˜LÓ`ÓaˆCØ× Ñ ×+Ò+Ü˜tŸ™¨uÑ5°gÑ>Ó?�Ø—‘œ[¨°X¸xÓHÔIØ%�
ð ”c˜$Ÿ/™/Ó*¨QÑ.Ò.°3×3DÑ3D×3OÔ3Oñ �S×&Ñ&×1Ò1Ø—Y‘Y“[ˆFÜ˜&¤7¬KÐ"8Ô9¸f×>PÑ>PÐT]Ò>]ô ,¨C°Ó7Ð7Øˆ
r4   c           	   ƒ  óî  K  — | j                  |«      }|€ ||«      ƒ d {  –—† S t        j                  «       }| j                  |«      }| j	                  |«      }t        || j                  «      }t        |«      }|dk(  r|ni |¥| j                  |   ¥}|j                  |¬«      } ||«      ƒ d {  –—† }	|	j                  j                  s|	S |j                  r6|dz   }
|
t        | j                  «      k\  r|	S | j                  |||	||
|¬«      S |}|	}t        |j                  d«      xs d«      }g }|t        | j                  «      dz
  k  �r2|j                  j                  �r|j!                  «       ƒ d {  –—† }t#        |t$        t&        f«      r|j(                  dk7  rnÝ|dz  } ||«       t+        |«      }t-        |«      } ||j                  t/        || j                  |   |«      ¬«      «      ƒ d {  –—† }|j                  j                  r9t        | j                  |   d   «      }|j1                  t3        |||«      «       |}|t        | j                  «      dz
  k  r|j                  j                  r�Œ|r_|j                  j                  rI|j!                  «       ƒ d {  –—† }t#        |t$        t&        f«      r|j(                  dk7  rt5        ||«      S |S 7 �ŒÇ7 �Œ77 �Œq7 Œò7 ŒB­wrX   )re   r6   r9   rf   rg   rh   rT   ri   rS   rj   rk   rl   rm   rn   Ú_splice_fallback_stream_asyncrp   rq   rr   r!   r$   rs   rt   ru   rv   rw   rx   Ú_prepend_seam_blocks_asyncrz   s                       r2   Úhandle_asyncz*BetaRefusalFallbackMiddleware.handle_asyncñ   s¾  è ø€ à×$Ñ$ WÓ-ˆØˆ<Ù" 7Ó+×+Ð+ä×#Ñ#Ó%ˆØ×'Ñ'¨Ó.ˆØ�n‰n˜UÓ#ˆô +¨7°D·K±KÓ@ˆô
 " $Ó'ˆØ*¨bÒ0‘tÐ6^¸Ð6^ÀÇÁÐQ\ÑA]Ð6^ˆØ!Ÿ,™,¨L˜,Ó9ˆá" ?Ó3×3ˆØ×%Ñ%×0Ò0ØˆOà�>Š>Ø# a™ˆIð œC §¡Ó0Ò0Ø�Ø×5Ñ5Ø'Ø!Ø!Ø#Ø#Øð 6ó ð ð ˆØˆÜ˜×)Ñ)¨'Ó2Ò8°bÓ9ˆ
Ø&(ˆØ”c˜$Ÿ/™/Ó*¨QÑ.Ó.°3×3DÑ3D×3OÓ3OØŸI™I›K×'ˆGÜ˜g¬´Ð'=Ô>À'×BUÑBUÐYbÒBbØà�Q‰JˆEÙ�ŒJÜ! 'Ó*ˆEÜ(¨Ó1ˆHÙ! '§,¡,´LÀÀtÇÁÐW\ÑG]Ð_dÓ4e ,Ó"fÓg×gˆCØ× Ñ ×+Ò+Ü˜tŸ™¨uÑ5°gÑ>Ó?�Ø—‘œ[¨°X¸xÓHÔIØ%�
ð ”c˜$Ÿ/™/Ó*¨QÑ.Ò.°3×3DÑ3D×3OÔ3Oñ �S×&Ñ&×1Ò1ØŸ9™9›;×&ˆFÜ˜&¤7¬KÐ"8Ô9¸f×>PÑ>PÐT]Ò>]ô 2°#°uÓ=Ð=Øˆ
ð} ,ùð" 4ùð0 (ùð høð 'úsa   ‚K5¡K(¢BK5Â4K+Â5CK5Å=K.Å>B K5Ç>K1Ç?BK5Ê+K5Ê0K3Ê18K5Ë+K5Ë.K5Ë1K5Ë3K5c                ó`  — t        |j                  «      }t        j                  |j                  «      }| j
                  rP|j                  j                  «       dk7  s3|j                  t        k7  s |j                  j                  d«      dk7  s|€y|j                  d«      �t        d«      ‚|S )zMThe request's JSON body when this middleware applies to it, `None` otherwise.ÚpostÚbetaÚtrueNrV   az  Sending the `fallbacks:` request param is not supported when using the `BetaRefusalFallbackMiddleware`. You should either remove the middleware and send `fallbacks:` with the `server-side-fallback-2026-06-01` beta header to let the API handle refusal fallbacks, or omit the `fallbacks:` param if you'd like `BetaRefusalFallbackMiddleware` to handle fallbacks on the client side.)Ú_as_dictÚjsonÚhttpxÚURLÚurlrS   ÚmethodÚlowerÚpathÚ_MESSAGES_PATHÚparamsr9   r   )r1   r]   rZ   r“   s       r2   re   z.BetaRefusalFallbackMiddleware._applicable_body5  s“   € ä˜Ÿ™Ó%ˆÜ�i‰i˜Ÿ™Ó$ˆð —’ð �~‰~×#Ñ#Ó%¨Ò/Ø�x‰xœ>Ò)Ø�z‰z�~‰~˜fÓ%¨Ò/Øˆ|àØ�8‰8�KÓ Ð,Ü ð0óð ð ˆr4   c                óÆ   — |�|j                   €y|j                   }d|cxk  rt        | j                  «      k  s'n t        d|› dt        | j                  «      › d�«      ‚|S )zÍThe chain entry this request starts at (-1 = the original params).

        Only an explicit `BetaFallbackState` pin moves the start; without one
        the request starts at the original params.
        r=   zBetaFallbackState.index z! is out of bounds for a chain of z? fallback(s); was the state shared with a different middleware?)r-   rn   rS   r   )r1   r{   r|   s      r2   rf   z*BetaRefusalFallbackMiddleware._start_indexO  sk   € ð ˆ=˜EŸK™KÐ/ØØ—k‘kˆØ�[Ô7¤3 t§¡Ó#7Ô7Ü Ø*¨;¨-Ð7XÜ�t—‘Ó'Ð(Ð(gðióð ð Ðr4   c                ó   ‡ ‡— dˆ ˆfd„}|S )zUPin requests sharing the state to the entry being tried (or warn that there is none).c                ól   •— ‰�| ‰_         y ‰j                  sd‰_        t        j                  d«       y y )NTzôanthropic-sdk: BetaRefusalFallbackMiddleware fell back without an active BetaFallbackState; follow-up requests will retry models that already refused. Run them inside a shared `with BetaFallbackState():` block to pin them to the accepted model.)r-   rU   r)   Úwarning)r-   r1   r{   s    €€r2   ra   z4BetaRefusalFallbackMiddleware._make_pin.<locals>.pinb  s7   ø€ ØÐ Ø#�•Ø×/Ò/Ø-1�Ô*Ü—‘ð&õð 0r4   )r-   ÚintrC   rD   rK   )r1   r{   ra   s   `` r2   rg   z'BetaRefusalFallbackMiddleware._make_pin_  s   ù€ ö
	ð ˆ
r4   c          	     óò   — | j                  ||||||¬«      }t        t        |j                  t	        |«      «      |j
                  |j                  d|j                  |j                  |j                  ¬«      S )aH  Wrap the refusable stream in a response whose body passes events through
        until a retryable refusal, then splices the fallback chain's events on.

        Closing the returned response (or the `Stream` parsed from it) tears down
        whichever stream is being read and abandons any in-flight fallback request.
        r\   T©ÚrawÚcast_toÚclientrm   Ú
stream_clsÚoptionsÚretries_taken)
Ú_spliced_framesr   Ú_spliced_http_responserk   Ú_FrameByteStreamÚ_cast_toÚ_clientÚ_stream_clsÚ_optionsr¥   ©r1   r]   rZ   r^   r_   r`   ra   Úframess           r2   ro   z5BetaRefusalFallbackMiddleware._splice_fallback_streamp  s�   € ð  ×%Ñ%ØØØØØØð &ó 
ˆô Ü& x×'=Ñ'=Ô?OÐPVÓ?WÓXØ×%Ñ%Ø×#Ñ#ØØ×+Ñ+Ø×%Ñ%Ø"×0Ñ0ô
ð 	
r4   c          	     óò   — | j                  ||||||¬«      }t        t        |j                  t	        |«      «      |j
                  |j                  d|j                  |j                  |j                  ¬«      S )Nr\   TrŸ   )
Ú_spliced_frames_asyncr   r§   rk   Ú_AsyncFrameByteStreamr©   rª   r«   r¬   r¥   r­   s           r2   rˆ   z;BetaRefusalFallbackMiddleware._splice_fallback_stream_async’  s�   € ð ×+Ñ+ØØØØØØð ,ó 
ˆô  Ü& x×'=Ñ'=Ô?TÐU[Ó?\Ó]Ø×%Ñ%Ø×#Ñ#ØØ×+Ñ+Ø×%Ñ%Ø"×0Ñ0ô
ð 	
r4   c          
   #  ó,  K  — | j                   }|j                  }	 |j                  }	t        ddd dd g ¬«      }
t        |	|
«      E d {  –—† }|j                  €	 |�|j                  «        y y |	j                  «        d }t        j                  ||«      }t        |t        |«      «      D �]w  }||   }t        |d   «      }|dz   t        |«      k  } ||«       |j                  «       }d }d }t        d«      D �]  }|j                  |j                  ||«      ¬«      }	  ||«      }|j                  j$                  r|j                  } n¸t'        |j                  «      }|j                  j                  «        |dk(  r?|j(                  dk(  r0|r.t        j+                  dt-        |«      «       |j.                  }d }ŒÆt        j!                  d||j(                  t-        |«      «       t#        ||j(                  ¬
«      } n |�3|r�Œ`|j1                  |«      D ]  }|–— Œ  |�|j                  «        y y |€J ‚|j                  }|j3                  |«       t        |j4                  |t7        |j8                  |¬«      |j:                  |j<                  |j?                  «       ¬«      }
t        ||
«      E d {  –—† }|j@                  r|jC                  «        |j                  € |�|j                  «        y y |j                  «        d }|jE                  |||«       �Œz 	 |�|j                  «        y y 7 �Œó# t        $ r0}t        j!                  d	||«       t#        |d ¬
«      }Y d }~ �Œmd }~ww xY w7 Œ½# |�|j                  «        w w xY w­w©Nr   TF)Ú
index_baseÚhas_nextÚspliceÚ	wire_openÚ
primary_idÚseam_framesrb   r[   r"   rY   zOanthropic-sdk: BetaRefusalFallbackMiddleware: fallback request to %s failed: %s)rb   Ústatusi�  z�anthropic-sdk: BetaRefusalFallbackMiddleware: fallback request with the partial output appended was rejected (HTTP 400: %s); retrying without itzXanthropic-sdk: BetaRefusalFallbackMiddleware: fallback request to %s failed: HTTP %s: %s)Ú
iterationsrb   )#rS   rk   Ú
_HopReaderÚ
_drive_hopÚrefusedÚcloseÚ_ChainStateÚbeginÚrangern   rp   Úcontinuationrj   Úhop_bodyÚ	Exceptionr)   ÚerrorÚ_HopFailurerl   Ú
_read_jsonÚstatus_coderœ   Ú_json_dumpsÚbaseÚterminal_failure_framesÚ
queue_seamÚ
next_indexÚ_SpliceInfor»   r·   r¸   Úpending_seam_framesÚopenedÚmark_openedÚabsorb_refusal)r1   r]   rZ   r^   r_   r`   ra   rV   ÚcurrentÚstream_aÚreaderÚoutcomeÚchainÚhopÚentryrb   rµ   rÃ   Úres_bÚfailureÚattemptÚhop_requestÚerrÚerr_bodyÚframeÚhop_responses                             r2   r¦   z-BetaRefusalFallbackMiddleware._spliced_framesÊ  sŠ  è ø€ ð —O‘Oˆ	à)1×)?Ñ)?ˆðk	 à×-Ñ-ˆHÜØàØØØØôˆFô ",¨H°fÓ!=×=ˆGØ�‰Ð&Øðx Ð"Ø—‘•ð #ðw �N‰NÔØˆGô  ×%Ñ% d¨GÓ4ˆEä˜Y¬¨I«×7�Ø! #™�Ü˜E '™NÓ+�Ø ™7¤S¨£^Ñ3�Ù�C”ð  %×1Ñ1Ó3�Ø15�Ø.2�Ü$ QŸx�GØ")§,¡,°E·N±NÀ5È,Ó4W ,Ó"X�Kð	Ù )¨+Ó 6˜ð ×*Ñ*×5Ò5Ø"'×"5Ñ"5˜ÙÜ)¨%×*=Ñ*=Ó>�HØ×'Ñ'×-Ñ-Ô/Ø !’|¨×(9Ñ(9¸SÒ(@Á\ÜŸ™ðgä'¨Ó1ôð
 (-§z¡z˜Ø $˜Ø Ü—I‘IØrØØ×)Ñ)Ü# HÓ-ô	ô *°¸e×>OÑ>OÔP�GÙðC  (ðF Ð&áÙ ð "'×!>Ñ!>¸wÖ!G˜Ø#›ð "Hàð6 Ð"Ø—‘•ð #ð1 Ð(Ð(Ð(Ø$×2Ñ2�Ø× Ñ  Ô'Ü#Ø$×/Ñ/Ø%Ü&°%×2BÑ2BÈ%ÔPØ#Ÿo™oØ$×/Ñ/Ø %× 9Ñ 9Ó ;ô�ô &0°¸fÓ%E×E�Ø—>’>Ø×%Ñ%Ô'Ø—?‘?Ð*Øð Ð"Ø—‘•ð #ð ×"Ñ"Ô$Ø�ð
 ×$Ñ$ W¨e°\ÖBñg 8ðj Ð"Ø—‘•ð #ð} >úô8 %ò ÜŸ	™	ØmØ!Øôô
 #.°EÀ$Ô"G˜Þûðúðj Fùð Ð"Ø—‘•ð #üs‹   ‚Nœ,M< ÁL;Á	M< ÁNÁ.B2M< Ä!L>Ä)C=M< È&NÈ:BM< Ê<M:Ê=-M< Ë*NË>(M< Ì'NÌ;M< Ì>	M7Í$M2Í+M< Í2M7Í7M< Í<NÎNc          
    ó@  K  — | j                   }|j                  }	 |j                  }	t        ddd dd g ¬«      }
t        |	|
«      2 3 d {  –—† }|­–— Œ7 Œ
6 |
j	                  «       }|j
                  €	 |�|j                  «       ƒ d {  –—†7   y y |	j                  «       ƒ d {  –—†7   d }t        j                  ||«      }t        |t        |«      «      D �]  }||   }t        |d   «      }|dz   t        |«      k  } ||«       |j                  «       }d }d }t        d«      D �]_  }|j                  |j                  ||«      ¬«      }	  ||«      ƒ d {  –—†7  }n;# t        $ r/}t         j#                  d	||«       t%        |d ¬
«      }Y d }~ n÷d }~ww xY w|j                  j&                  r|j                  } nËt)        |j                  «      ƒ d {  –—†7  }|j                  j                  «       ƒ d {  –—†7   |dk(  r@|j*                  dk(  r1|r/t         j-                  dt/        |«      «       |j0                  }d }�Œt         j#                  d||j*                  t/        |«      «       t%        ||j*                  ¬
«      } n |�=|r�Œ¸|j3                  |«      D ]  }|­–— Œ	  |�|j                  «       ƒ d {  –—†7   y y |€J ‚|j                  }|j5                  |«       t        |j6                  |t9        |j:                  |¬«      |j<                  |j>                  |jA                  «       ¬«      }
t        ||
«      2 3 d {  –—†7  }|­–— Œ6 |
j	                  «       }|jB                  r|jE                  «        |j
                  € |�|j                  «       ƒ d {  –—†7   y y |j                  «       ƒ d {  –—†7   d }|jG                  |||«       �Œ 	 |�|j                  «       ƒ d {  –—†7   y y # |�|j                  «       ƒ d {  –—†7   w w xY w­wr³   )$rS   rk   r¼   Ú_drive_hop_asyncÚfinishr¾   ÚacloserÀ   rÁ   rÂ   rn   rp   rÃ   rj   rÄ   rÅ   r)   rÆ   rÇ   rl   Ú_read_json_asyncrÉ   rœ   rÊ   rË   rÌ   rÍ   rÎ   rÏ   r»   r·   r¸   rÐ   rÑ   rÒ   rÓ   )r1   r]   rZ   r^   r_   r`   ra   rV   rÔ   rÕ   rÖ   rá   r×   rØ   rÙ   rÚ   rb   rµ   rÃ   rÛ   rÜ   rÝ   rÞ   rß   rà   râ   s                             r2   r°   z3BetaRefusalFallbackMiddleware._spliced_frames_asyncE  sé  è ø€ ð —O‘Oˆ	à)1×)?Ñ)?ˆðb	'à×-Ñ-ˆHÜØàØØØØôˆFô  0°¸&ÔA÷ �eØ”ðøÐAà—m‘m“oˆGØ�‰Ð&Øðb Ð"Ø—n‘nÓ&×&Ò&ð #ða —/‘/Ó#×#Ñ#ØˆGä×%Ñ% d¨GÓ4ˆEä˜Y¬¨I«×7�Ø! #™�Ü˜E '™NÓ+�Ø ™7¤S¨£^Ñ3�Ù�C”à$×1Ñ1Ó3�Ø6:�Ø.2�Ü$ QŸx�GØ")§,¡,°E·N±NÀ5È,Ó4W ,Ó"X�Kð	Ù&/°Ó&<× <Ð <™øÜ$ò ÜŸ	™	ØmØ!Øôô
 #.°EÀ$Ô"G˜Ýûðúð ×*Ñ*×5Ò5Ø"'×"5Ñ"5˜ÙÜ%5°e×6IÑ6IÓ%J×JÐJ�HØ×-Ñ-×4Ñ4Ó6×6Ñ6Ø !’|¨×(9Ñ(9¸SÒ(@Á\ÜŸ™ðgä'¨Ó1ôð
 (-§z¡z˜Ø $˜Ù Ü—I‘IØrØØ×)Ñ)Ü# HÓ-ô	ô *°¸e×>OÑ>OÔP�GÙðC  (ðF Ð&áÙ Ø!&×!>Ñ!>¸wÖ!G˜Ø#œð "Hàð2 Ð"Ø—n‘nÓ&×&Ò&ð #ð/ Ð(Ð(Ð(Ø$×2Ñ2�Ø× Ñ  Ô'Ü#Ø$×/Ñ/Ø%Ü&°%×2BÑ2BÈ%ÔPØ#Ÿo™oØ$×/Ñ/Ø %× 9Ñ 9Ó ;ô�ô $4°LÀ&Ô#I÷  ð  ˜%Ø”Kð $Jà Ÿ-™-›/�Ø—>’>Ø×%Ñ%Ô'Ø—?‘?Ð*Øð Ð"Ø—n‘nÓ&×&Ò&ð #ð #×)Ñ)Ó+×+Ñ+Ø�à×$Ñ$ W¨e°\ÖBñS 8ðV Ð"Ø—n‘nÓ&×&Ò&ð #øˆwÐ"Ø—n‘nÓ&×&Ò&ð #üs"  ‚Pœ)O= ÁAÁ	AÁ
AÁO= ÁAÁO= Á4PÂ	BÂ
PÂO= Â$B'Â%B'O= ÅEÅEÅEÅO= Å	FÅ($FÆO= ÆFÆ?O= ÇGÇ"O= Ç9G<Ç:B1O= Ê+PË KËPËA?O= ÍMÍMÍMÍAO= ÎPÎ&N)Î'PÎ.O= ÏOÏO= Ï PÏ5O8Ï6PÏ=PÐPÐPÐP)rV   zIterable[BetaFallbackParam]rP   z#Iterable[AnthropicBetaParam] | NonerC   rD   )r]   r   r_   r   rC   úAPIResponse[Any])r]   r   r_   r   rC   úAsyncAPIResponse[Any])r]   r   rC   údict[str, Any] | None)r{   úBetaFallbackState | NonerC   r�   )r{   rë   rC   úCallable[[int], None])r]   r   rZ   údict[str, Any]r^   rè   r_   r   r`   r�   ra   rì   rC   rè   )r]   r   rZ   rí   r^   ré   r_   r   r`   r�   ra   rì   rC   ré   )r]   r   rZ   rí   r^   rè   r_   r   r`   r�   ra   rì   rC   úGenerator[bytes, None, None])r]   r   rZ   rí   r^   ré   r_   r   r`   r�   ra   rì   rC   úAsyncGenerator[bytes, None])rF   rG   rH   rI   r3   r   r†   rŠ   re   rf   rg   ro   rˆ   r¦   r°   rK   r4   r2   r(   r(   ^   sª  „ ñ8ð| 6:ñ	+à.ð+ð 3ð	+ð
 
ó+ð( òAó ðAðF òAó ðAóFó4ó ð" 
ð ð 
ð ð	 
ð
 #ð 
ð ð 
ð ð 
ð #ð 
ð 
ó 
ðD
ð ð
ð ð	
ð
 (ð
ð !ð
ð ð
ð #ð
ð 
ó
ðpy ð ðy ð ð	y ð
 #ðy ð ðy ð ðy ð #ðy ð 
&óy ðvp'ð ðp'ð ð	p'ð
 (ðp'ð !ðp'ð ðp'ð #ðp'ð 
%ôp'r4   c                  óD   — e Zd ZU ded<   	 ded<   	 ded<   ded<   ded<   y	)
Ú_RefusalúOptional[str]r:   rƒ   ÚboolÚhas_prefill_claimúDict[str, Any]ÚusageÚeventN)rF   rG   rH   rJ   rK   r4   r2   rñ   rñ   »  s+   … ØÓØSàÓØSàÓØÓØÓð(r4   rñ   c                  ó&   — e Zd ZU dZded<   ded<   y)rÏ   z6Splice context for fallback hops; `None` for stream A.úList[Dict[str, Any]]r»   rp   rb   N©rF   rG   rH   rI   rJ   rK   r4   r2   rÏ   rÏ   É  s   … Ù@à$Ó$Ø„Jr4   rÏ   c                  ó&   — e Zd ZU dZded<   ded<   y)rÇ   z[A fallback hop whose request failed; stamps `recommended_model` when it
    ends the chain.rp   rb   zOptional[int]rº   Nrú   rK   r4   r2   rÇ   rÇ   Ð  s   … ñð ƒJØÓØRr4   rÇ   c                  ód   — e Zd ZU dZded<   	 ded<   	 ded<   	 ded	<   	 d
ed<   	 ded<   	 ded<   y)Ú_HopOutcomez*The outcome of consuming one hop's stream.zOptional[_Refusal]r¾   rò   rb   zOptional[Dict[str, Any]]Ústart_eventrù   Úblocksr�   rÎ   ró   rÑ   Úlast_fallback_toNrú   rK   r4   r2   rý   rý   Ù  sD   … Ù4àÓØEàÓØ:à)Ó)Ø0à Ó Ø\àƒOØ^àƒLØTà#Ó#ð3r4   rý   c                  ót   — e Zd ZU dZded<   	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd„Zedd„«       Zdd„Zdd„Z	dd„Z
dd	„Zy
)r¼   uÆ  Consumes one hop's SSE events, producing the frames to forward to the
    client while accumulating its content blocks.

    Events are held until the hop produces output (a content block or a
    terminal event), so a refusal that arrives before any output â€” a pre-stream
    decline â€” leaves no trace on the wire and chains silently. On open, stream
    A's held `message_start` is flushed in its original wire bytes; a spliced
    hop's is suppressed when the wire is already open, or emitted with its `id`
    rewritten to the primary's when this hop's start opens the wire. Queued
    seam frames for every hop reached so far are flushed right after.

    A spliced hop has its block indices shifted by `index_base` and its
    terminal message_delta's usage rewritten to the `usage.iterations` chain
    shape.

    A refusal that can be chained â€” an entry remains, and either a
    `fallback_credit_token` was minted or nothing has streamed yet â€” ends the
    hop early: open blocks are closed, the terminal message_delta +
    message_stop are suppressed, and the refusal is set on the outcome so the
    caller can issue the next hop. Any other refusal is logged and passes
    through to the client.
    z_HopOutcome | Noner×   c               óÚ   — t        |«      | _        || _        || _        || _        || _        || _        d | _        d | _        d | _	        d | _
        g | _        d| _        d | _        d | _        y )NF)Ú_BlockTrackerÚ_trackerÚ	_has_nextÚ_spliceÚ
_wire_openÚ_primary_idÚ_seam_framesÚ_modelÚ_start_usageÚ_start_eventÚ_held_startÚ_heldÚ_openedÚ_last_fallback_tor×   )r1   r´   rµ   r¶   r·   r¸   r¹   s          r2   r3   z_HopReader.__init__  sq   € ô & jÓ1ˆŒØ!ˆŒØˆŒØ#ˆŒØ%ˆÔØ'ˆÔØ"&ˆŒØ37ˆÔØ37ˆÔØ37ˆÔØ,.ˆŒ
ØˆŒØ-1ˆÔØˆ�r4   c                ó   — | j                   S r/   )r  r0   s    r2   rÑ   z_HopReader.opened'  ó   € à�|‰|Ðr4   c           	     óp
  — t        t        |j                  «      «      }|�|j                  d«      nd}| j                  }|dk(  rw|�ut        |j                  d«      «      }|�I|j                  d«      }t        |t        «      r|nd| _        t        |j                  d«      «      | _        || _	        || _
        g S |dk(  rÄ|�Â| j                  «       }t        |j                  d«      «      }|�Z|j                  d«      d	k(  rFt        |j                  d
«      «      }	|	�|	j                  d«      nd}
t        |
t        «      r|
| _        | j                  j                  |«       |�g |¢t        d|«      ‘S g |¢t!        |«      ‘S |dk(  rN|�L| j                  «       }| j                  j#                  |«       |�g |¢t        d|«      ‘S g |¢t!        |«      ‘S |dk(  rN|�L| j                  «       }| j                  j%                  |«       |�g |¢t        d|«      ‘S g |¢t!        |«      ‘S |dk(  �rÒ|��Ït        |j                  d«      «      xs i }|j                  d«      dk(  �rßt        |j                  d«      «      }|�|j                  d«      dk(  r|nd}|�|j                  d«      nd}t        |t        «      r|r|nd}| j&                   xr | j                  j)                  «        }| j*                  �r|€|�rt-        t        |j                  d«      «      | j                  «      }t/        | j                  j1                  «       «      }d| _
        | j2                  j5                  «        t7        t9        ||�|j                  d«      nd|duxr |j                  d«      du ||¬«      | j                  | j                  | j                  j)                  «       | j                  j:                  | j&                  | j                  ¬«      | _        |S |st>        jA                  d«       nt>        jA                  d«       | j                  «       }|�œ|j                  d«      dk(  r.t        |j                  d«      «      }|�|jC                  dd«       t        |j                  d«      «      xs i }g |jD                  ¢tG        ||jH                  «      ‘|d<   ||d<   g |¢t        d|«      ‘S g |¢t!        |«      ‘S | j&                  s| j2                  jK                  |«       g S t!        |«      gS )z:Process one event, returning the frames to forward for it.NÚtypeÚmessage_startr‚   rb   rö   Úcontent_block_startÚcontent_blockÚfallbackÚtoÚcontent_block_deltaÚcontent_block_stopÚmessage_deltaÚdeltars   rd   Ústop_detailsÚfallback_credit_tokenrƒ   Úfallback_has_prefill_claimT)r:   rƒ   rô   rö   r÷   ©r¾   rb   rþ   rÿ   rÎ   rÑ   r   zvanthropic-sdk: BetaRefusalFallbackMiddleware: refusal stop_details has no fallback_credit_token; surfacing the refusalzkanthropic-sdk: BetaRefusalFallbackMiddleware: refusal but no fallback entries remain; surfacing the refusalÚrecommended_modelr»   )&r�   Ú
_safe_jsonÚdatar9   r  rr   rp   r
  r  r  r  Ú_openr  r  ÚstartÚ_emitÚ_passthrough_sser  Ústopr  Úcontent_blocksr  Ú	_backfillÚlistÚclose_open_blocksr  Úclearrý   rñ   rÎ   r×   r)   rÆ   Ú
setdefaultr»   Ú_serving_iteration_entryrb   rw   )r1   Ússer÷   Ú
event_typer¶   r‚   rb   r®   r  r  r„   r  r  Údetailsr:   Ú
pre_streamrö   s                    r2   Úfeedz_HopReader.feed+  s  € äœ C§H¡HÓ-Ó.ˆØ*/Ð*;�U—Y‘Y˜vÔ&Àˆ
Ø—‘ˆà˜Ò(¨UÐ->Ü˜uŸy™y¨Ó3Ó4ˆGØÐ"ØŸ™ GÓ,�Ü'1°%¼Ô'=™eÀ4�”Ü$,¨W¯[©[¸Ó-AÓ$B�Ô!Ø %ˆDÔØ"ˆDÔØˆIØÐ0Ò0°UÐ5FØ—Z‘Z“\ˆFÜ$ U§Y¡Y¨Ó%?Ó@ˆMØÐ(¨]×->Ñ->¸vÓ-FÈ*Ò-TÜ˜m×/Ñ/°Ó5Ó6�Ø.0¨n˜2Ÿ6™6 'œ?À$�Ü˜h¬Ô,Ø-5�DÔ*Ø�M‰M×Ñ Ô&ð Ð%ð ?�&Ð>œ%Ð 5°uÓ=Ð>ðð 6�vÐ5Ô/°Ó4Ð5ðð
 Ð0Ò0°UÐ5FØ—Z‘Z“\ˆFØ�M‰M×Ñ Ô&ð Ð%ð ?�&Ð>œ%Ð 5°uÓ=Ð>ðð 6�vÐ5Ô/°Ó4Ð5ðð
 Ð/Ò/°EÐ4EØ—Z‘Z“\ˆFØ�M‰M×Ñ˜uÔ%ð Ð%ð >�&Ð=œ%Ð 4°eÓ<Ð=ðð 6�vÐ5Ô/°Ó4Ð5ðð
 ˜?Ó*¨uÑ/@Ü˜UŸY™Y wÓ/Ó0Ò6°BˆEØ�y‰y˜Ó'¨9Ó4Ü'¨¯	©	°.Ó(AÓB�Ø*6Ð*BÀ|×GWÑGWÐX^ÓG_ÐclÒGl™,Ðrv�Ø@GÐ@S˜Ÿ™Ð$;Ô<ÐY]�Ü!+¨E´3Ô!7¹E™Àt�Ø!%§¡Ð-ÒT°d·m±m×6RÑ6RÓ6TÐ2T�
ð —>“> uÐ'8ºJÜ%¤h¨u¯y©y¸Ó/AÓ&BÀD×DUÑDUÓV�EÜ! $§-¡-×"AÑ"AÓ"CÓD�Fð (,�DÔ$Ø—J‘J×$Ñ$Ô&Ü#.Ü (Ø"'Ø@GÐ@S W§[¡[°Ô%<ÐY]Ø.5¸TÐ.AÒ.wÀgÇkÁkÐRnÓFoÐswÐFwØ"'Ø"'ô!ð #Ÿk™kØ$(×$5Ñ$5Ø#Ÿ}™}×;Ñ;Ó=Ø#'§=¡=×#;Ñ#;Ø#Ÿ|™|Ø)-×)?Ñ)?ô$�D”Lð "�MÙÜ—I‘IðGõô
 —I‘Ið@ôð —Z‘Z“\ˆFØÐ!Ø—9‘9˜]Ó+¨yÒ8ô $,¨E¯I©I°nÓ,EÓ#F�LØ#Ð/Ø$×/Ñ/Ð0CÀTÔJô ! §¡¨7Ó!3Ó4Ò:¸�ð'Ø×&Ñ&ð'ä,¨U°F·L±LÓAð'��lÑ#ð "'��g‘Ø?˜Ð?¤ ¸Ó!>Ð?Ð?Ø3�VÐ3Ô-¨cÓ2Ð3Ð3à�|Š|à�J‰J×Ñ˜cÔ"ØˆIô ! Ó%Ð&Ð&r4   c                ó|  — | j                   rg S d| _         g }| j                  €1| j                  �®|j                  t	        | j                  «      «       n‰| j
                  s}| j                  �qt        j                  | j                  «      }t        |j                  d«      «      }|�| j                  �| j                  |d<   |j                  t        d|«      «       |j                  | j                  «       |j                  d„ | j                  D «       «       d| _        | j                  j!                  «        |S )z°Open the wire for this hop: its message_start (raw for stream A;
        suppressed or id-rewritten for a spliced hop), the queued seam frames,
        then anything else held.TNr‚   Úidr  c              3  ó2   K  — | ]  }t        |«      –— Œ y ­wr/   )r(  )Ú.0Úhelds     r2   Ú	<genexpr>z#_HopReader._open.<locals>.<genexpr>·  s   è ø€ ÐD¹°Ô& t×,¹ùó   ‚)r  r  r  rw   r(  r  r  Ú_copyÚdeepcopyr�   r9   r  r'  Úextendr	  r  r.  )r1   r®   rþ   r‚   s       r2   r%  z_HopReader._open¥  sû   € ð �<Š<ØˆIØˆŒØ ˆØ�<‰<ÐØ×ÑÐ+Ø—‘Ô.¨t×/?Ñ/?Ó@ÕAØ—’ T×%6Ñ%6Ð%BÜŸ.™.¨×):Ñ):Ó;ˆKÜ˜{Ÿ™¨yÓ9Ó:ˆGØÐ" t×'7Ñ'7Ð'CØ $× 0Ñ 0�˜‘Ø�M‰Mœ% °Ó=Ô>Ø�‰�d×'Ñ'Ô(Ø�‰ÑD¸¿ºÓDÔDØˆÔØ�
‰
×ÑÔØˆr4   c                óV   — | j                   €| j                  rg S | j                  «       S )zCFrames still owed when the stream ends without a chainable refusal.)r×   r  r%  r0   s    r2   Úfinish_framesz_HopReader.finish_frames¼  s#   € à�<‰<Ð# t§|¢|ØˆIØ�z‰z‹|Ðr4   c           	     óþ   — | j                   �| j                   S t        d| j                  | j                  | j                  j                  «       | j                  j                  | j                  | j                  ¬«      S )zCThe outcome once the hop's stream is fully consumed (or cut early).Nr!  )	r×   rý   r
  r  r  r*  rÎ   r  r  r0   s    r2   rå   z_HopReader.finishÂ  sc   € à�<‰<Ð#Ø—<‘<ÐÜØØ—+‘+Ø×)Ñ)Ø—=‘=×/Ñ/Ó1Ø—}‘}×/Ñ/Ø—<‘<Ø!×3Ñ3ô
ð 	
r4   N)r´   r�   rµ   ró   r¶   z_SpliceInfo | Noner·   ró   r¸   ú
str | Noner¹   úlist[bytes]rC   rD   )rC   ró   )r1  r   rC   rD  ©rC   rD  )rC   rý   )rF   rG   rH   rI   rJ   r3   ÚpropertyrÑ   r5  r%  rA  rå   rK   r4   r2   r¼   r¼   ó  s‡   … ñð.  ÓØUðð ðð ð	ð
 #ðð ðð ðð !ðð 
óð2 òó ðóx'ótó.ô
r4   r¼   c              #  óà   K  — t        j                  | «      D ]*  }|j                  |«      D ]  }|–— Œ |j                  €Œ* n |j	                  «       D ]  }|–— Œ |j                  «       S ­w)zKFeed one hop's SSE events through `reader`, yielding the frames to forward.)r   Ú
raw_eventsr5  r×   rA  rå   ©r^   rÖ   r1  rá   s       r2   r½   r½   Ñ  sf   è ø€ ä× Ñ  Ö*ˆØ—[‘[ Ö%ˆEØ‹Kð &à�>‰>Ñ%Ùð	 +ð
 ×%Ñ%Ö'ˆØ‹ð (à�=‰=‹?Ðùs   ‚?A.Á,A.c               óÖ   K  — t        j                  | «      2 3 d{  –—† }|j                  |«      D ]  }|­–— Œ	 |j                  €Œ1 |j	                  «       D ]  }|­–— Œ	 y7 ŒH6 Œ­w)u»   Feed one hop's SSE events through `reader`, yielding the frames to forward.

    The outcome is read from `reader.finish()` afterwards â€” async generators
    cannot return a value.
    N)r   rH  r5  r×   rA  rI  s       r2   rä   rä   Ý  sc   è ø€ ô !×+Ñ+¨HÔ5÷ ˆcØ—[‘[ Ö%ˆEØŒKð &à�>‰>Ñ%ØØ×%Ñ%Ö'ˆØŒñ (ðøÐ5ús+   ‚A)˜A'œA%�A' (A)Á	A)Á%A'Á'A)c                  óÜ   — e Zd ZU dZded<   	 ded<   	 ded<   	 ded	<   	 ded
<   ded<   ded<   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	d#d„Z
d$d„Zd%d„Zd&d„Zd'd„Zy)(rÀ   z9Bookkeeping shared across the hops of one spliced stream.r�   rÎ   ró   r·   rC  r¸   rp   Úprimary_modelr:   ú	List[Any]rË   Úpartialr€   rñ   Úlast_refusalzDict[str, Any] | NoneÚlast_start_eventrù   r»   c                ó    — || _         g | _        y r/   )Ú_bodyÚ_pending_seams)r1   rZ   s     r2   r3   z_ChainState.__init__  s   € ØˆŒ
Ø+-ˆÕr4   c                óÜ  — |j                   €J ‚ | |«      }t        |j                  d«      xs d«      |_        |j                  |_        |j
                  |_        t        |j                  xs i j                  d«      «      }|�|j                  d«      nd}t        |t        «      r|nd|_
        |j                   j                  |_        g |_        |j                   j                  rt        |j                  «      ng |_        |j"                  xs |j                  |_        |j                   |_        |j                  |_        t+        |j                   |j                  «      |_        |S )z3The chain state after stream A's chainable refusal.Nrb   rc   r‚   r7  )r¾   rp   r9   rL  rÎ   rÑ   r·   r�   rþ   rr   r¸   r:   rË   rô   Ú_to_prefill_blocksrÿ   rN  r   r€   rO  rP  Ú_declined_iteration_entriesr»   )ÚclsrZ   r×   rØ   Ústart_messageÚstart_ids         r2   rÁ   z_ChainState.begin  s&  € ð �‰Ð*Ð*Ð*Ù�D“	ˆÜ! $§(¡(¨7Ó"3Ò"9°rÓ:ˆÔØ"×-Ñ-ˆÔØ!Ÿ.™.ˆŒÜ  '×"5Ñ"5Ò";¸×!@Ñ!@ÀÓ!KÓLˆØ.;Ð.G�=×$Ñ$ TÔ*ÈTˆÜ'1°(¼CÔ'@™8ÀdˆÔØ—o‘o×+Ñ+ˆŒØˆŒ
Ø>E¿o¹o×>_Ò>_Ô*¨7¯>©>Ô:ÐegˆŒð #×3Ñ3ÒJ°u×7JÑ7JˆÔØ$Ÿ_™_ˆÔØ!(×!4Ñ!4ˆÔÜ6°w·±È×H[ÑH[Ó\ˆÔØˆr4   c                ó  — | j                   }| xj                   dz  c_         | j                  j                  t        dd|t	        | j
                  || j                  j                  «      dœ«      t        dd|dœ«      g«       || _        y)a  Queue the reached hop's `fallback` seam block at the next monotonic index.

        Queued seams are flushed by the hop reader once output reaches the wire,
        so a chain of pre-stream declines lines its seams up after the serving
        hop's message_start.
        r[   r  )r  r-   r  r  ©r  r-   N)rÎ   rS  r?  r'  rx   r€   rO  rƒ   )r1   r„   Ú
seam_indexs      r2   rÍ   z_ChainState.queue_seam#  s„   € ð —_‘_ˆ
Ø�Š˜1Ñ�Ø×Ñ×"Ñ"äØ)à 5Ø!+Ü)4°T·_±_ÀhÐPT×PaÑPa×PjÑPjÓ)kñóô Ð*Ð5IÐT^Ñ,_Ó`ð
ô	
ð #ˆ�r4   c                ó,   — t        | j                  «      S r/   )r,  rS  r0   s    r2   rÐ   z_ChainState.pending_seam_frames;  s   € Ü�D×'Ñ'Ó(Ð(r4   c                óF   — d| _         | j                  j                  «        y )NT)r·   rS  r.  r0   s    r2   rÒ   z_ChainState.mark_opened>  s   € ØˆŒØ×Ñ×!Ñ!Õ#r4   c                ó6   — g | j                   ¢| j                  ¢S r/   )rË   rN  r0   s    r2   rÃ   z_ChainState.continuationB  s   € Ø*�—‘Ð*˜TŸ\™\Ð*Ð*r4   c                ó  — i | j                   ¥|¥j                  «       D ��ci c]  \  }}|dk7  sŒ||“Œ }}}| j                  �| j                  |d<   |r/|j                  d«      }g t	        |t
        «      r|ng ¢d|dœ‘|d<   |S c c}}w )uz  The hop's request body: the refused request's, with the entry's
        overrides merged over it and extended by the continuation.

        The server-side `fallbacks` param is stripped â€” it is mutually exclusive
        with a credit-token retry. When the refusal granted no prefill claim the
        appended turn is omitted entirely and the same-body form is sent.
        rV   r  ÚmessagesÚ	assistant)ÚroleÚcontent)rR  Úitemsr:   r9   rr   r,  )r1   rÚ   rÃ   ÚkeyÚvaluerZ   ra  s          r2   rÄ   z_ChainState.hop_bodyE  s¦   € ð >UÀÇ
Á
Ð=TÈeÐ=T×=ZÑ=ZÔ=\ÔsÑ=\©z¨s°EÐ`cÐgrÓ`r  U¡
Ð=\ˆÑsØ�:‰:Ð!Ø,0¯J©JˆDÐ(Ñ)ÙØ—x‘x 
Ó+ˆHð Ü(¨´4Ô8‘(¸bð à$°Ñ>ð ˆD�Ñð ˆùó  ts
   ¢B°Bc                ó¤  — |j                   €J ‚|j                   j                  | _        || _        |j                   j                  rt	        |j
                  «      ng | _        | j                  j                  t        |j                   |«      «       |j                   | _
        |j                  �|j                  | _        |j                  | _        y)z7Fold a refused hop's outcome in, readying the next hop.N)r¾   r:   rË   rô   rU  rÿ   rN  r»   r?  rV  rO  rþ   rP  rÎ   )r1   r×   rb   rÃ   s       r2   rÓ   z_ChainState.absorb_refusalX  s›   € à�‰Ð*Ð*Ð*Ø—_‘_×*Ñ*ˆŒ
Ø ˆŒ	Ø=D¿_¹_×=^Ò=^Ô)¨'¯.©.Ô9ÐdfˆŒØ�‰×ÑÔ:¸7¿?¹?ÈEÓRÔSØ#ŸO™OˆÔØ×ÑÐ*Ø$+×$7Ñ$7ˆDÔ!Ø!×,Ñ,ˆ�r4   c                óL  — g }| j                   s}| j                  �qt        j                  | j                  «      }t	        |j                  d«      «      }|�| j                  �| j                  |d<   |j                  t        d|«      «       |j                  | j                  «       t        j                  | j                  j                  «      }t	        |j                  d«      «      }|�;t	        |j                  d«      «      }|�|j                  dv r|j                  nd|d<   t	        |j                  d	«      «      xs i }t        j                  | j                  «      |d
<   ||d	<   |j                  t        d|«      «       |j                  t        dddi«      «       |S )uS  Degrade to the suppressed refusal when every remaining entry failed
        over HTTP: replay its message_delta verbatim â€” `recommended_model`
        stamped from the final failure (the failed model for capacity errors,
        `null` otherwise) and `usage.iterations` carrying the recorded chain â€”
        then message_stop.
        Nr‚   r7  r  r  r  )i­  i  r"  rö   r»   r  Úmessage_stopr  )r·   rP  r=  r>  r�   r9   r¸   rw   r'  r?  rS  rO  r÷   rº   rb   r»   )	r1   rÜ   r®   rþ   r‚   r÷   r  r3  rö   s	            r2   rÌ   z#_ChainState.terminal_failure_framesd  sU  € ð !ˆØ�~Š~ $×"7Ñ"7Ð"CÜŸ.™.¨×)>Ñ)>Ó?ˆKÜ˜{Ÿ™¨yÓ9Ó:ˆGØÐ" t§¡Ð'BØ $§¡�˜‘Ø�M‰Mœ% °Ó=Ô>Ø�‰�d×)Ñ)Ô*ä—‘˜t×0Ñ0×6Ñ6Ó7ˆÜ˜Ÿ™ 7Ó+Ó,ˆØÐÜ˜uŸy™y¨Ó8Ó9ˆGØÐ"Ø@GÇÁÐR\Ñ@\¨w¯}ª}Ðbf�Ð+Ñ,Ü˜Ÿ™ 7Ó+Ó,Ò2°ˆÜ#Ÿn™n¨T¯_©_Ó=ˆˆlÑØˆˆg‰Ø�‰”e˜O¨UÓ3Ô4Ø�‰”e˜N¨V°^Ð,DÓEÔFØˆr4   N)rZ   rí   rC   rD   )rZ   rí   r×   rý   rC   rÀ   )r„   rp   rC   rD   rE  rB   )rC   ú	list[Any])rÚ   r&   rÃ   rk  rC   rí   )r×   rý   rb   rp   rÃ   rk  rC   rD   )rÜ   rÇ   rC   rD  )rF   rG   rH   rI   rJ   r3   ÚclassmethodrÁ   rÍ   rÐ   rÒ   rÃ   rÄ   rÓ   rÌ   rK   r4   r2   rÀ   rÀ   ì  s™   … ÙCàƒOØ;àƒOØ=àÓð2ð Óð;ð ÓØ
ƒOØÓØƒOØÓØ+Ó+Ø$Ó$ðIó.ð òó ðó,#ó0)ó$ó+óó&
-ôr4   rÀ   c                ód  — | j                   j                  d«      }t        |t        «      ri|rgd„ t	        d|«      D «       }|D �cg c]  }|€Œi |¥ddi¥‘Œ }}|r:t        |«      dk(  r*t        |d   j                  d«      t        «      s||d   d<   |S t        d|| j                   «      gS c c}w )	uS  The `usage.iterations` entries a declined hop contributes to the chain.

    The hop's refusal self-reports its iterations: adopt them, retyped to
    `message` (every one of them declined â€” a server-stitched envelope labels
    its last hop `fallback_message`). A single-entry self-report describes the
    hop itself and gains its model â€” `model_label`, the caller-spelled primary
    or the chain entry's id â€” when the wire didn't name one; a multi-entry
    self-report (a server-tool loop) is kept verbatim. Without a self-report,
    one entry is built from the refusal's usage.
    r»   c              3  ó2   K  — | ]  }t        |«      –— Œ y ­wr/   )r�   )r9  rÚ   s     r2   r;  z._declined_iteration_entries.<locals>.<genexpr>�  s   è ø€ ÐQÑ5P¨Eœ ŸÑ5Pùr<  rM  r  r‚   r[   r   rb   )rö   r9   rr   r,  r   rn   rp   Ú_to_iteration_usage)rd   Úmodel_labelÚreportedÚdict_entriesrÚ   Úentriess         r2   rV  rV  ‚  s²   € ð �}‰}× Ñ  Ó.€HÜ�(œDÔ!¡hÙQ´T¸+ÀxÔ5PÓQˆÙS_Ó(uÑS_È%ÐchÑctÐ)E¨EÐ)E°6¸9Ó)EÐS_ˆÐ(uÙÜ�7‹|˜qÒ ¬°G¸A±J·N±NÀ7Ó4KÌSÔ)QØ&1�˜‘
˜7Ñ#ØˆNÜ 	¨;¸¿¹ÓFÐGÐGùò )vs   ÁB-Á
B-c                óÎ   — | j                  d«      }t        |t        «      r8|r6t        t	        d|«      d   «      }|�i |¥d|j                  d«      xs |dœ¥S t        d|| «      S )z‡The serving hop's `fallback_message` completer entry: its own
    self-reported iteration relabeled, or one built from its delta usage.r»   rM  r=   Úfallback_messagerb   )r  rb   )r9   rr   r,  r�   r   ro  )Údelta_usagerb   rq  Úlasts       r2   r0  r0  ˜  sl   € ð �‰˜|Ó,€HÜ�(œDÔ!¡hÜœ˜[¨(Ó3°BÑ7Ó8ˆØÐØ\�dÐ\Ð$6ÀÇÁÈ'ÓARÒA[ÐV[Ò\Ð\ÜÐ1°5¸+ÓFÐFr4   c                  óP   — e Zd ZU dZded<   	 ddd„Zdd„Zdd„Zdd„Zdd„Z	dd	„Z
y
)r  a/  Block bookkeeping for one stream of the splice: accumulates each content
    block from its deltas (for the continuation prefill), shifts wire indices
    by `index_base` so they stay monotonic across hops, and tracks which blocks
    are still open so a refusal that cuts mid-block can close them.
    r�   rÎ   c                ó<   — || _         || _        g | _        g | _        y r/   )Ú_index_baserÎ   Ú_blocksr%  )r1   r´   s     r2   r3   z_BlockTracker.__init__­  s   € Ø%ˆÔØ$ˆŒà9;ˆŒà "ˆ�
r4   c                óL   — | j                   D ��cg c]  \  }}|‘Œ	 c}}S c c}}w )z/The accumulated content blocks, in start order.)r{  )r1   Ú_Úblocks      r2   r*  z_BlockTracker.content_blocksµ  s"   € à&*§l¢lÔ3¡l™(˜!˜U’ lÒ3Ð3ùÓ3s   � c                ój  — |j                  d«      }t        |t        «      syt        |j                  d«      «      }| j                  j                  ||�t        |«      ni f«       || j                  z   }||d<   | j                  j                  |«       t        | j                  |dz   «      | _
        y)z7Track a content_block_start, shifting `event["index"]`.r-   Nr  r[   )r9   rr   r�   r�   r{  rw   Údictrz  r%  ÚmaxrÎ   )r1   r÷   r-   r  Úshifteds        r2   r&  z_BlockTracker.start¹  s•   € à—	‘	˜'Ó"ˆÜ˜%¤Ô%ØÜ  §¡¨?Ó!;Ó<ˆØ�‰×Ñ˜U¸=Ð;T¤D¨Ô$7ÐZ\Ð]Ô^Ø˜$×*Ñ*Ñ*ˆØ ˆˆg‰Ø�
‰
×Ñ˜'Ô"Ü˜dŸo™o¨w¸©{Ó;ˆ�r4   c                óÒ   — |j                  d«      }t        |t        «      syt        |j                  d«      «      }|�t	        | j
                  ||«       || j                  z   |d<   y)zQApply a content_block_delta to its accumulating block, shifting `event["index"]`.r-   Nr  )r9   rr   r�   r�   Ú_apply_deltar{  rz  )r1   r÷   r-   r  s       r2   r  z_BlockTracker.deltaÅ  sZ   € à—	‘	˜'Ó"ˆÜ˜%¤Ô%ØÜ˜Ÿ™ 7Ó+Ó,ˆØÐÜ˜Ÿ™ u¨eÔ4Ø ×!1Ñ!1Ñ1ˆˆgŠr4   c                óþ   — |j                  d«      }t        |t        «      sy|| j                  z   }||d<   || j                  v r| j                  j                  |«       t        | j                  |dz   «      | _        y)z6Track a content_block_stop, shifting `event["index"]`.r-   Nr[   )r9   rr   r�   rz  r%  Úremover�  rÎ   )r1   r÷   r-   r‚  s       r2   r)  z_BlockTracker.stopÏ  sj   € à—	‘	˜'Ó"ˆÜ˜%¤Ô%ØØ˜$×*Ñ*Ñ*ˆØ ˆˆg‰Ø�d—j‘jÑ Ø�J‰J×Ñ˜gÔ&Ü˜dŸo™o¨w¸©{Ó;ˆ�r4   c              #  ó„   K  — | j                   D ]  }t        dd|dœ«      –— Œ | j                   j                  «        y­w)z4content_block_stop events for any blocks still open.r  r[  N)r%  r'  r.  )r1   r-   s     r2   r-  z_BlockTracker.close_open_blocksÚ  s9   è ø€ à—Z”ZˆEÜÐ,Ð7KÐV[Ñ.\Ó]Ó]ð  à�
‰
×ÑÕùs   ‚>A N)r   )r´   r�   rC   rD   )rC   úlist[dict[str, Any]])r÷   rí   rC   rD   ©rC   zIterator[bytes])rF   rG   rH   rI   rJ   r3   r*  r&  r  r)  r-  rK   r4   r2   r  r  £  s/   … ñð ƒOØ8ô#ó4ó
<ó2ó	<ôr4   r  c                óà  ‡— t        ˆfd„| D «       d«      }|€y|j                  d«      }|dk(  rAt        |j                  d«      xs d«      t        |j                  d«      xs d«      z   |d<   y|dk(  rAt        |j                  d«      xs d«      t        |j                  d	«      xs d«      z   |d<   y|d
k(  rS|j                  d«      }t        |t        «      sg }||d<   t        d|«      j                  |j                  d«      «       y|dk(  rAt        |j                  d«      xs d«      t        |j                  d«      xs d«      z   |d<   y|dk(  r|j                  d«      |d<   yy)zAApply a content_block_delta to the accumulating block at `index`.c              3  ó4   •K  — | ]  \  }}|‰k(  sŒ|–— Œ y ­wr/   rK   )r9  Úblock_indexr~  r-   s      €r2   r;  z_apply_delta.<locals>.<genexpr>æ  s   øè ø€ ÐQ±&Ñ.˜K¨¸KÈ5Ó<P”%±&ùs   ƒ‘Nr  Ú
text_deltaÚtextrc   Úinput_json_deltaÚ_partial_jsonÚpartial_jsonÚcitations_deltaÚ	citationsrM  ÚcitationÚthinking_deltaÚthinkingÚsignature_deltaÚ	signature)Únextr9   rp   rr   r,  r   rw   )rÿ   r-   r  r~  Ú
delta_typer“  s    `    r2   r„  r„  ä  sW  ø€ äÓQ±&ÓQÐSWÓX€EØ€}ØØ—‘˜6Ó"€JØ�\Ò!Ü˜EŸI™I fÓ-Ò3°Ó4´s¸5¿9¹9ÀVÓ;LÒ;RÐPRÓ7SÑSˆˆfŠØ	Ð)Ò	)Ü!$ U§Y¡Y¨Ó%?Ò%EÀ2Ó!FÌÈUÏYÉYÐWeÓMfÒMlÐjlÓImÑ!mˆˆoÒØ	Ð(Ò	(Ø—I‘I˜kÓ*ˆ	Ü˜)¤TÔ*ØˆIØ!*ˆE�+ÑÜˆ[˜)Ó$×+Ñ+¨E¯I©I°jÓ,AÕBØ	Ð'Ò	'Ü §	¡	¨*Ó 5Ò ;¸Ó<¼sÀ5Ç9Á9ÈZÓCXÒC^Ð\^Ó?_Ñ_ˆˆjÒØ	Ð(Ò	(Ø"ŸY™Y {Ó3ˆˆkÒð 
)r4   c                óð  — g }| D ]§  }|j                  d«      dk(  rŒ|j                  d«      }t        |t        «      s|j                  |«       ŒK|j	                  «       D ��ci c]  \  }}|dk7  sŒ||“Œ }}}t        |«      }|�|n|j                  d«      |d<   |j                  |«       Œ© |r?|d   j                  d«      dv r)|j                  «        |r|d   j                  d«      dv rŒ)|S c c}}w )uç  Convert a hop's accumulated response blocks to the appended assistant turn.

    A `fallback_has_prefill_claim` refusal guarantees the partial output is
    resendable, so the blocks go out near-verbatim. Three rewrites apply:
    `fallback` seam blocks (wire markers, not content) are dropped, tool inputs
    are reassembled from their accumulated `input_json_delta` JSON
    (content_block_start carries `input: {}`), and trailing thinking blocks are
    stripped â€” the server rejects an assistant turn whose final block is
    `thinking`, so a refusal that cut the stream mid-thought would otherwise
    400 the continuation. A partial that was nothing but thinking strips to
    empty, and the hop falls back to the same-body form.
    r  r  r�  Úinputr=   )r–  Úredacted_thinking)r9   rr   rp   rw   re  r#  Úpop)Úresponse_blocksÚoutr~  r‘  rf  rg  Úparseds          r2   rU  rU  ú  sî   € ð €CÛ ˆØ�9‰9�VÓ 
Ò*ØØ—y‘y Ó1ˆÜ˜,¬Ô,Ø�J‰J�uÔØØ.3¯k©k¬mÔV©m¡
  U¸sÀoÓ?U��e‘¨mˆÑVÜ˜LÓ)ˆØ#)Ð#5™¸5¿9¹9ÀWÓ;Mˆˆg‰Ø�
‰
�5Õð !ñ �#�b‘'—+‘+˜fÓ%Ð)JÑJØ�‰Œ	ñ �#�b‘'—+‘+˜fÓ%Ð)JÒJà€Jùó Ws   Á#C2Á1C2c                óD  — | j                  d«      }t        |t        «      s| S d}g }t        d|«      D ]Ú  }t	        |«      }|�|j                  d«      nd}|�t        |t        «      s|j                  |«       ŒGt        d|«      }|D �cg c]$  }t        |«      r|j                  d«      dk(  rŒ#|‘Œ& }	}t        |	«      t        |«      k(  r|j                  |«       Œ«d}|	s|j                  d	«      d
k(  rŒÄ|j                  i |¥d|	i¥«       ŒÜ |s| S i | ¥d|i¥S c c}w )u  A copy of `body` with `{type: "fallback"}` seam blocks filtered out of the
    replayed message history; `body` itself when there are none.

    An assistant turn left with no content by the strip â€” a seam-only turn â€” is
    dropped whole; the server rejects empty-content turns.ra  FrM  Nrd  r  r  Trc  rb  )r9   rr   r,  r   r�   rw   r   rn   )
rZ   ra  ÚstrippedÚstripped_messagesr‚   Úmessage_dictrd  Úcontent_listr~  Úkepts
             r2   ri   ri     s3  € ð �x‰x˜
Ó#€HÜ�h¤Ô%ØˆØ€HØ#%ÐÜ˜ XÖ.ˆÜ Ó(ˆØ1=Ð1I�,×"Ñ" 9Ô-ÈtˆØÐ¤z°'¼4Ô'@Ø×$Ñ$ WÔ-ØÜ˜K¨Ó1ˆÙ#/Ól¡<˜%¼À¼È5Ï9É9ÐU[ÓK\Ð`jÓKj’ <ˆÐlÜˆt‹9œ˜LÓ)Ò)Ø×$Ñ$ WÔ-ØØˆÙ˜×(Ñ(¨Ó0°KÒ?ØØ× Ñ Ð!B LÐ!B°)¸TÑ!BÕCð /ñ ØˆØ2ˆdÐ2�JÐ 1Ñ2Ð2ùò ms   Â$DÂ0Dc           
     ó–  ‡— t        j                  | j                  j                  «       D ��ci c]  \  }}t	        |t
        «      sŒ||“Œ c}}«      j                  dd«      }|j                  d«      D �ch c]  }|j                  «       ’Œ c}Št        j                  ˆfd„|D «       «      }| j                  j                  «       D ��ci c]  \  }}|j                  «       dk7  sŒ||“Œ }}}|s|r!dj                  t        d|g|¢«      «      |d<   | j                  t        |t!        d«      «      ¬«      S c c}}w c c}w c c}}w )	zåA copy of `request` with `betas` appended to its `anthropic-beta` header
    (skipping values already present) and the middleware's helper-telemetry tag
    appended to `x-stainless-helper`. Single `request.copy()` for both.
    zanthropic-betarc   Ú,c              3  óP   •K  — | ]  }t        |«      ‰vsŒt        |«      –— Œ y ­wr/   )rp   )r9  r�   Úexistings     €r2   r;  z+_with_middleware_headers.<locals>.<genexpr>C  s!   øè ø€ ÐW±E¨D¼SÀ»YÈhÒ=Vœc $Ÿi±Eùs   ƒ&–&z, Nzfallback-refusal-middleware)Úheaders)r‘   ÚHeadersr¬  re  rr   rp   r9   ÚsplitÚstripr€  Úfromkeysr•   ÚjoinÚfilterrj   r    r#   )	r]   rP   ÚkÚvrÔ   rg  Ú	additionsr¬  r«  s	           @r2   rh   rh   :  s  ø€ ô �m‰m¨g¯o©o×.CÑ.CÔ.EÔ\Ñ.E¡d a¨ÌÐTUÔWZÕI[˜Q ™TÐ.EÒ\Ó]×aÑaÐbrÐtvÓw€GØ+2¯=©=¸Ô+=Ó>Ñ+= %�—‘•Ð+=Ñ>€HÜ—‘ÓW±EÓWÓW€IØ '§¡× 5Ñ 5Ô 7ÔYÑ 7™˜˜1¸1¿7¹7»9ÐHXÓ;Xˆq�!‰tÐ 7€GÑYÙ‘)Ø$(§I¡I¬f°T¸GÐ;PÀiÐ;PÓ.QÓ$RˆÐ Ñ!Ø�<‰<¤¨g´}ÐEbÓ7cÓ dˆ<ÓeÐeùó ]ùÚ>ùãYs   ®D:
ÁD:
Á7E ÃEÃ(Ec                óh   — t        | t        «      r"| j                  �| j                  j                  S y)zEThe refusal's minted credit token; only the beta surface carries one.N)rr   r$   r  r  ©r‚   s    r2   rt   rt   J  s,   € ä�'œ;Ô'¨G×,@Ñ,@Ð,LØ×#Ñ#×9Ñ9Ð9Ør4   c                óh   — t        | t        «      r"| j                  �| j                  j                  S y)zOThe policy category that caused the refusal; only the beta surface carries one.N)rr   r$   r  rƒ   r·  s    r2   ru   ru   Q  s,   € ä�'œ;Ô'¨G×,@Ñ,@Ð,LØ×#Ñ#×,Ñ,Ð,Ør4   c                ó   — dd| id|id|dœdœS )zBThe synthetic `fallback` content block marking one model boundary.r  rb   rd   )r  rƒ   )r  Úfromr  ÚtriggerrK   )r€   r„   rƒ   s      r2   rx   rx   X  s)   € ð Ø˜*Ð%Ø˜Ð!Ø%°8Ñ<ñ	ð r4   c           
     ó®  — t        t        | j                  j                  d«      «      «      }|�t	        |j                  d«      t        «      syt        i |¥dg |¢t        d|d   «      ¢i¥«      j                  d«      }| j                  j                  «       }dD ]
  }||v sŒ||= Œ t        j                  | j                  ||| j                  ¬«      S )zÙA copy of the served hop's response with `seams` prepended to its
    `content`, or `None` when the body isn't the expected message shape.

    The caller has already parsed the response, so its body is buffered.
    úutf-8Nrd  rM  ©zcontent-encodingzcontent-length)rÉ   r¬  rd  r]   )r�   r#  rd  Údecoderr   r9   r,  rÊ   r   Úencoder¬  rj   r‘   ÚResponserÉ   r]   )Úoriginalr�   r‚   rZ   r¬  Úheaders         r2   Ú_seamed_http_responserÄ  b  sÑ   € ô ”z (×"2Ñ"2×"9Ñ"9¸'Ó"BÓCÓD€GØ€œj¨¯©°YÓ)?ÄÔFØÜÐ_˜'Ð_ 9Ð.^°Ð.^¼¸[È'ÐR[ÑJ\Ó8]Ð.^Ñ_Ó`×gÑgÐhoÓp€DØ×Ñ×#Ñ#Ó%€GÛ8ˆØ�WÒØ˜‘ð 9ô �>‰>Ø×(Ñ(ØØØ× Ñ ô	ð r4   c           	     ó¾   — t        | j                  |«      }|€| S t        || j                  | j                  d| j
                  | j                  | j                  ¬«      S ©NFrŸ   )rÄ  rk   r   r©   rª   r«   r¬   r¥   ©r^   r�   r    s      r2   ry   ry   x  s^   € Ü
 × 6Ñ 6¸Ó
>€CØ
€{ØˆÜØØ×!Ñ!Ø×ÑØØ×'Ñ'Ø×!Ñ!Ø×,Ñ,ôð r4   c           	     ó¾   — t        | j                  |«      }|€| S t        || j                  | j                  d| j
                  | j                  | j                  ¬«      S rÆ  )rÄ  rk   r   r©   rª   r«   r¬   r¥   rÇ  s      r2   r‰   r‰   ‡  s^   € Ü
 × 6Ñ 6¸Ó
>€CØ
€{ØˆÜØØ×!Ñ!Ø×ÑØØ×'Ñ'Ø×!Ñ!Ø×,Ñ,ôð r4   c                ó    — i | ¥|¥}|r||d<   |S )z�The non-streaming retry body: the fallback entry merged whole over the
    original params, plus the refusal's credit token when it minted one.r  rK   )rZ   r  Úcredit_tokenÚmergeds       r2   rv   rv   –  s&   € ð 2 Ð1¨Ð1€FÙØ*6ˆÐ&Ñ'Ø€Mr4   c                óL   — 	 t        j                  | «      S # t        $ r Y y w xY wr/   )r�   ÚloadsrÅ   )rŽ  s    r2   r#  r#  Ÿ  s(   € ðÜ�z‰z˜$ÓÐøÜò Ùðús   ‚ —	#¢#c                ó0   — t        j                  | d¬«      S )N)r©  Ú:)Ú
separators)r�   Údumps©rg  s    r2   rÊ   rÊ   ¦  s   € Ü�:‰:�e¨
Ô3Ð3r4   c                ó4   — t        | «      rt        d| «      S d S )Nrõ   )r   r   rÒ  s    r2   r�   r�   ª  s   € Ü,3°E¬NŒ4Ð  %Ó(ÐDÀÐDr4   c                óh   — 	 t        j                  | j                  «       «      S # t        $ r Y y w xY wr/   )r�   rÍ  ÚreadrÅ   ©r^   s    r2   rÈ   rÈ   ®  s.   € ðÜ�z‰z˜(Ÿ-™-›/Ó*Ð*øÜò Ùðús   ‚"% ¥	1°1c              ƒ  ó„   K  — 	 t        j                  | j                  «       ƒ d {  –—† «      S 7 Œ# t        $ r Y y w xY w­wr/   )r�   rÍ  ÚareadrÅ   rÖ  s    r2   rç   rç   µ  s8   è ø€ ðÜ�z‰z §¡Ó 0×0Ó1Ð1Ð0ùÜò Ùðüs,   ‚A „"1 ¦/§1 ®A ¯1 ±	=ºA ¼=½A c                óL   — t        | t        |«      ¬«      j                  d«      S )N©r÷   r$  r½  )Ú_serialize_sserÊ   rÀ  )r÷   Úpayloads     r2   r'  r'  ¼  s   € Ü ¬K¸Ó,@ÔA×HÑHÈÓQÐQr4   c                óÔ   — | j                   r-dj                  | j                   «      dz   j                  d«      S t        | j                  | j
                  ¬«      j                  d«      S )zËForward a decoded event in its original wire bytes, preserving SSE fields
    beyond `event:`/`data:` (`id:`, `retry:`, comment lines). Falls back to
    re-serializing for events with no raw lines.
    Ú
z

r½  rÚ  )r    r±  rÀ  rÛ  r÷   r$  )r1  s    r2   r(  r(  À  sN   € ð
 ‡w‚wØ—	‘	˜#Ÿ'™'Ó" VÑ+×3Ñ3°GÓ<Ð<Ü §	¡	°·±Ô9×@Ñ@ÀÓIÐIr4   c                ód   — d}| �	|d| › d�z  }|j                  d«      D ]  }|d|› d�z  }Œ |dz   S )zÞSerialize an event back to its SSE wire form (`event: ...\ndata: ...\n\n`).

    Multi-line `data` is emitted as one `data:` line per line, matching the
    spec. The inverse of the decoder behind `Stream.raw_events`.
    rc   zevent: rÞ  zdata: )r®  )r÷   r$  r   Úlines       r2   rÛ  rÛ  Ê  sR   € ð €CØÐØ�˜˜˜rÐ"Ñ"ˆØ—
‘
˜4Ö ˆØ�˜�v˜RÐ Ñ ‰ð !à�‰:Ðr4   c           	     óØ   — |xs i }| ||j                  d«      xs d|j                  d«      xs d|j                  d«      xs d|j                  d«      xs d|j                  d«      dœS )NÚinput_tokensr   Úoutput_tokensÚcache_read_input_tokensÚcache_creation_input_tokensÚcache_creation)r  rb   râ  rã  rä  rå  ræ  )r9   )r  rb   rö   Úus       r2   ro  ro  Ø  sp   € ð 	Š�€AàØØŸ™˜nÓ-Ò2°ØŸ™˜Ó/Ò4°1Ø#$§5¡5Ð)BÓ#CÒ#HÀqØ'(§u¡uÐ-JÓ'KÒ'PÈqØŸ%™%Ð 0Ó1ñð r4   c                ó�   — |xs i }i |¥| xs i ¥}|j                  «       D ]"  \  }}|�Œ	|j                  |«      €Œ||   ||<   Œ$ |S )z0Fill `None` fields on `primary` from `fallback`.)re  r9   )Úprimaryr  r   rf  rg  s        r2   r+  r+  ç  sY   € àŠ~˜2€HØ9˜XÐ9¨'ª-°RÐ9€CØ—i‘i–k‰
ˆˆUØ‰=˜XŸ\™\¨#Ó.Ñ:Ø ‘}ˆC�ŠHð "ð €Jr4   c                ó®   — | j                   j                  «       }dD ]
  }||v sŒ||= Œ t        j                  | j                  ||| j
                  ¬«      S )zÔA synthetic response standing in for `original`, with `stream` as its body.

    The spliced frames are emitted post-decode, so the original's
    content-encoding/length headers no longer describe the body.
    r¾  )rÉ   r¬  rm   r]   )r¬  rj   r‘   rÁ  rÉ   r]   )rÂ  rm   r¬  rÃ  s       r2   r§   r§   ñ  s\   € ð ×Ñ×#Ñ#Ó%€GÛ8ˆØ�WÒØ˜‘ð 9ô �>‰>Ø×(Ñ(ØØØ× Ñ ô	ð r4   c                  ó8   — e Zd Zdd„Zedd„«       Zedd„«       Zy)r¨   c                ó   — || _         y r/   ©Ú_frames©r1   r®   s     r2   r3   z_FrameByteStream.__init__  ó	   € Øˆ�r4   c                ó   — | j                   S r/   rí  r0   s    r2   Ú__iter__z_FrameByteStream.__iter__	  r  r4   c                ó8   — | j                   j                  «        y r/   )rî  r¿   r0   s    r2   r¿   z_FrameByteStream.close  s   € à�‰×ÑÕr4   N)r®   rî   rC   rD   r‰  rB   )rF   rG   rH   r3   r   rò  r¿   rK   r4   r2   r¨   r¨     s/   „ óð òó ðð òó ñr4   r¨   c                  ó8   — e Zd Zdd„Zedd„«       Zedd„«       Zy)r±   c                ó   — || _         y r/   rí  rï  s     r2   r3   z_AsyncFrameByteStream.__init__  rð  r4   c                ó   — | j                   S r/   rí  r0   s    r2   Ú	__aiter__z_AsyncFrameByteStream.__aiter__  r  r4   c              ƒ  óT   K  — | j                   j                  «       ƒ d {  –—†  y 7 Œ­wr/   )rî  ræ   r0   s    r2   ræ   z_AsyncFrameByteStream.aclose  s   è ø€ à�l‰l×!Ñ!Ó#×#Ò#ús   ‚( &¡(N)r®   rï   rC   rD   )rC   úAsyncIterator[bytes]rB   )rF   rG   rH   r3   r   r÷  ræ   rK   r4   r2   r±   r±     s/   „ óð òó ðð ò$ó ñ$r4   r±   )r^   úhttpx.ResponserÖ   r¼   rC   z#Generator[bytes, None, _HopOutcome])r^   rú  rÖ   r¼   rC   rù  )rd   rñ   rp  rp   rC   rˆ  )rv  rí   rb   rp   rC   rí   )rÿ   z list[tuple[int, dict[str, Any]]]r-   r�   r  rí   rC   rD   )rŸ  rˆ  rC   rk  )rZ   rí   rC   rí   )r]   r   rP   r*   rC   r   )r‚   zMessage | BetaMessagerC   rC  )r€   rp   r„   rp   rƒ   rC  rC   rí   )rÂ  rú  r�   rˆ  rC   zhttpx.Response | None)r^   rè   r�   rˆ  rC   rè   )r^   ré   r�   rˆ  rC   ré   )rZ   rí   r  r&   rÊ  rC  rC   rí   )rŽ  rp   rC   r   )rg  r   rC   rp   )rg  rE   rC   rê   )r^   rú  rC   r   )r÷   rp   rÜ  rí   rC   Úbytes)r1  r   rC   rû  )r÷   rC  r$  rp   rC   rp   )r  z&Literal['message', 'fallback_message']rb   rp   rö   rê   rC   rí   )ré  rê   r  rê   rC   rí   )rÂ  rú  rm   z,httpx.SyncByteStream | httpx.AsyncByteStreamrC   rú  )gÚ
__future__r   rj   r=  r�   ÚloggingÚtypingr   r   r   r   r   r	   r
   r   r   r   r   Úcontextvarsr   r   Útyping_extensionsr   r   r‘   Ú_utilsr   Ú_modelsr   Ú_requestr   Ú	_responser   r   Ú
_streamingr   r   r   Ú_exceptionsr   Ú_middlewarer   r   r   Ú_base_clientr    Útypes.messager!   Ú_stainless_helpersr#   Útypes.beta.beta_messager$   Útypes.anthropic_beta_paramr%   Útypes.beta.beta_fallback_paramr&   Ú__all__Ú	getLoggerr)   rJ   r—   r+   r'   r6   r8   r(   rñ   rÏ   rÇ   rý   r¼   r½   rä   rÀ   rV  r0  r  r„  rU  ri   rh   rt   ru   rx   rÄ  ry   r‰   rv   r#  rÊ   r�   rÈ   rç   r'  r(  rÛ  ro  r+  r§   ÚSyncByteStreamr¨   ÚAsyncByteStreamr±   rK   r4   r2   Ú<module>r     s"  ðÞ "ã Û Û ÷÷ ÷ ñ ÷ *ß /ã å Ý  Ý "ß 6ß >Ñ >Ý )ß >Ñ >Ý )Ý $Ý .Ý 2Ý <Ý ?ð Ø#ð€ð (�g×'Ñ'Ð(BÓC€€^Ó Cà€à0O€Ð-Ó OØ >÷*ñ *ñ< 9CÐCbÐlpÔ8q€Ð5Ó qñ S]Ø*°BôSÐ ÐOó ô
W	' Jô W	'ôz(ˆyô (ô�)ô ôS�)ô Sô3�)ô 3÷4[
ñ [
ó|	ó÷Sñ SólHó,G÷;ñ ;óB4ó,óB3ó>fó óóóó,óóóó4óEóóóRóJóðØ
0ðØ9<ðØEZðàóóðØðØ&Rðàóô(
�u×+Ñ+ô 
ô
$˜E×1Ñ1õ 
$r4   