
    yjL4                        d dl m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mZmZmZ d dlmZ  G d	 d
          ZdS )    )annotationsN)AsyncIterator)Any)	TextBlockThinkingBlockToolUseBlock)	BaseModelValidationError)CompletionResultStreamChunkToolCallResult)repair_response_model_jsonc            
          e Zd ZdZd1dZdddddddddd	d2d!Zdddddddddd	d3d#Zd4d)Zed5d*            Z	ed6d,            Z
ed7d-            Zed8d/            Zed9d0            ZdS ):AnthropicBackendz3Provider backend wrapping the native Anthropic SDK.clientr   returnNonec                    || _         d S )N)_client)selfr   s     B/DATA/AppData/hermes/projects/honcho/src/llm/backends/anthropic.py__init__zAnthropicBackend.__init__   s    "    N)	temperaturestoptoolstool_choiceresponse_formatthinking_budget_tokensthinking_effortmax_output_tokensextra_paramsmodelstrmessageslist[dict[str, Any]]
max_tokensintr   float | Noner   list[str] | Noner   list[dict[str, Any]] | Noner   str | dict[str, Any] | Noner   'type[BaseModel] | dict[str, Any] | Noner   
int | Noner    
str | Noner!   r"   dict[str, Any] | Noner   c               6  K   ~|
t          d          |                     |          \  }}|||d}|||d<   |r||d<   |rdd                    |          ddid	g|d
<   |r!||d<   |                     |          }|||d<   |	rd|	d|d<   |rdD ]}||v r||         ||<   t	          |p|                     |                    o|	 o|                     |          }|r|d         r}|r\t          |t                    rGt          j
        |                                d          }|                     |d         d|            |d                             ddd           nf|rdt          |t                    rO|d         rGt          j
        |                                d          }|                     |d         d|             | j        j        j        di | d {V }|                     |t          |t                    r|nd ||          S )NVAnthropic backend does not support thinking_effort; use thinking_budget_tokens insteadr#   r'   r%   r   stop_sequencestext

type	ephemeralr7   r5   cache_controlsystemr   r   enabledr7   budget_tokensthinkingtop_ptop_kr%      indent0

Respond with valid JSON matching this schema:
	assistant{rolecontent)responser   prefilled_json
model_name )
ValueError_extract_systemjoin_convert_tool_choicebool
_json_mode_supports_assistant_prefill
isinstancer7   jsondumpsmodel_json_schema_append_text_to_last_messageappendr   r%   create_normalize_response)r   r#   r%   r'   r   r   r   r   r   r   r    r!   r"   request_messagessystem_messagesparamsconverted_tool_choicekeyuse_json_prefillschema_jsonrL   s                        r   completezAnthropicBackend.complete   s       &h   -1,@,@,J,J)/$("
 "
 "$/F=! 	,'+F#$ 	 #"KK88&,k%:  F8  	>#F7O$($=$=k$J$J!$0(=}%! 	!!7" "F:  	4) 4 4,&&".s"3F3K ADOOL$A$ABB 8**80077 	
  	z 2 	 :ot#D#D "j)J)J)L)LUVWWW11:&W+WW   :%%{s&K&KLLLL	 *?D A A	FLZFX	 *_%F%F%H%HQRSSSK--z"SkSS  
 6.5??????????''/400OO+ ( 
 
 	
r   AsyncIterator[StreamChunk]c          	    ~  K   |                      |          }~|
t          d          |                     |          \  }}|||d}|||d<   |r||d<   |r!||d<   |                     |          }|||d<   |rdd                    |          d	d
idg|d<   |rdD ]}||v r||         ||<   t          |p|          o|	 o|                     |          }|r|d         r}|r\t          |t                    rGt          j
        |                                d          }|                     |d         d|            |d                             ddd           nf|rdt          |t                    rO|d         rGt          j
        |                                d          }|                     |d         d|            |	rd|	d|d<    | j        j        j        di |4 d {V }|2 3 d {V }|j        dk    rLt#          |d          r<t#          |j        d          r't'          t)          |j        dd                    W V  _6 |                                 d {V }|j        r|j        j        nd }t'          d|j        |          W V  d d d           d {V  d S # 1 d {V swxY w Y   d S )Nr2   r3   r   r4   r   r   r5   r6   r7   r8   r9   r;   r@   r%   rC   rD   rF   rG   rH   rI   r<   r=   r?   content_block_deltadelta )rK   T)is_donefinish_reasonoutput_tokensrO   )rU   rP   rQ   rS   rR   rT   rV   rW   r7   rX   rY   rZ   r[   r\   r   r%   streamhasattrrj   r   getattrget_final_messageusagern   stop_reason)r   r#   r%   r'   r   r   r   r   r   r   r    r!   r"   is_json_moder_   r`   ra   rb   rc   rd   re   ro   chunkfinal_messagern   s                            r   ro   zAnthropicBackend.streamm   s}       |44&h   -1,@,@,J,J)/$("
 "

 "$/F=! 	,'+F#$ 	>#F7O$($=$=k$J$J!$0(=}% 	 #"KK88&,k%:  F8  	4) 4 4,&&".s"3F3K0L11 8**80077 	
  	z 2 	 :ot#D#D "j)J)J)L)LUVWWW11:&W+WW   :%%{s&K&KLLLL	 *?D A A	FLZFX	 *_%F%F%H%HQRSSSK--z"SkSS   " 	!!7" "F:
 04<(/99&99 	 	 	 	 	 	 	V% P P P P P P PeJ"777w// 8V44 8 &gek62.N.NOOOOOOO  & #)":":"<"<<<<<<<M5B5HR#11d  +7+      	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   -J,0I6B#J,,
J69J6rL   type[BaseModel] | NonerM   rT   rN   c                  g }g }g }g }|j         D ]}	t          |	t                    r|                    |	j                   2t          |	t
                    r>|                    |	j                   |                    d|	j        |	j        d           t          |	t                    rA|                    t          |	j
        |	j        t          |	j                                       |j        }
|
rt          |
dd          pdnd}|
rt          |
dd          pdnd}|
r|
j        nd}||z   |z   }d                    |          }|rd                    |          nd }|}||rd| n|}	 |r*t%          j        |          }|                    |          }n|                    |          }n3# t$          j        t.          t0          f$ r t3          |||          }Y nw xY wt5          |||
r|
j        nd|||j        pd	||||

  
        S )Nr?   )r7   r?   	signature)idnameinputcache_creation_input_tokensr   cache_read_input_tokens
rH   r   )
rK   input_tokensrn   r~   r   rm   
tool_callsthinking_contentthinking_blocksraw_response)rK   rW   r   r\   r5   r   r?   rz   r   r   r{   r|   dictr}   rs   rq   r   rR   rX   loadsmodel_validatemodel_validate_jsonJSONDecodeErrorr
   rP   r   r   rn   rt   )r   rL   r   rM   rN   text_blocksthinking_text_blocksthinking_full_blocksr   blockrs   cache_creation_tokenscache_read_tokensuncached_tokenstotal_input_tokenstext_contentr   rK   raw_contentparsed_jsons                       r   r^   z$AnthropicBackend._normalize_response   s    "$*,57+-
% 	 	E%++ ""5:....E=11 $++EN;;;$++ *$)N%*_     E<00 !!" 8"Z"5;//     EJQGE8!<<APQ 	 BGMGE4a88=AA 	 16<%,,1,/DDGXXyy--/CMDII*+++ 	 $&1?Q-|---\K! O"&*["9"9K-<<[IIGG-AA+NNG(/:F   4#   +16=%--A(=$5".8&!-0!
 
 
 	
s   0AF2 2-G"!G"c                .    |                      d           S )N)zclaude-opus-4zclaude-sonnet-4zclaude-haiku-4)
startswith)r#   s    r   rV   z,AnthropicBackend._supports_assistant_prefill  s&     ##
 
 
 	
r   &tuple[list[dict[str, Any]], list[str]]c                $   g }g }| D ]}|                     d          dk    rDt          |                     d          t                    r|                    |d                    _|                    t	          j        |                     ||fS )NrJ   r;   rK   )getrW   r$   r\   copydeepcopy)r%   r`   non_system_messagesmessages       r   rQ   z AnthropicBackend._extract_system'  s     &(46 	C 	CG{{6""h..:I&&4 4.  &&wy'9::::#**4=+A+ABBBB"O33r   c                z    | d S t          | t                    r| S | dk    rddiS | dv rddiS | dk    rddiS d| dS )Nautor7   >   anyrequiredr   nonetool)r7   r|   )rW   r   )r   s    r   rS   z%AnthropicBackend._convert_tool_choice7  sw     4k4(( 	&  F##---E?"&  F##444r   suffixc                X   | d         }|                     d          }t          |t                    r
||z   |d<   dS t          |t                    rX|}t	          |          D ],}|                     d          dk    r|d         |z   |d<    dS -|                    d|d           dS dS )zGAppend text to the last message, handling both string and list content.rK   r7   r5   N)r7   r5   )r   rW   r$   listreversedr\   )r%   r   lastrK   blocksr   s         r   r[   z-AnthropicBackend._append_text_to_last_messageG  s    
 |((9%%gs## 		<%.DOOO&& 	<+2F!&))  99V$$..$)&MF$:E&MFF / MM66::;;;;;	< 	<r   c                J    t          | o|                     d                    S )N	json_mode)rT   r   )r"   s    r   rU   zAnthropicBackend._json_modeY  s#    LB\%5%5k%B%BCCCr   )r   r   r   r   )r#   r$   r%   r&   r'   r(   r   r)   r   r*   r   r+   r   r,   r   r-   r   r.   r    r/   r!   r.   r"   r0   r   r   )r#   r$   r%   r&   r'   r(   r   r)   r   r*   r   r+   r   r,   r   r-   r   r.   r    r/   r!   r.   r"   r0   r   rg   )
rL   r   r   rx   rM   rT   rN   r$   r   r   )r#   r$   r   rT   )r%   r&   r   r   )r   r,   r   r0   )r%   r&   r   r$   r   r   )r"   r0   r   rT   )__name__
__module____qualname____doc__r   rf   ro   r^   staticmethodrV   rQ   rS   r[   rU   rO   r   r   r   r      sq       ==# # # # %)!%-137CG-1&*(,.2V
 V
 V
 V
 V
 V
| %)!%-137CG-1&*(,.2^ ^ ^ ^ ^ ^@L
 L
 L
 L
\ 	
 	
 	
 \	
 4 4 4 \4 5 5 5 \5 < < < \<" D D D \D D Dr   r   )
__future__r   r   rX   collections.abcr   typingr   anthropic.typesr   r   r   pydanticr	   r
   src.llm.backendr   r   r   src.llm.structured_outputr   r   rO   r   r   <module>r      s    " " " " " "   ) ) ) ) ) )       B B B B B B B B B B / / / / / / / / I I I I I I I I I I @ @ @ @ @ @LD LD LD LD LD LD LD LD LD LDr   