
    *"hjO                       d Z ddlmZ ddlZddlmZmZ ddlmZm	Z	 ddd	d
dZ
i ddddddddddddddddddddddddddddd d!d"d!d#d$i d%d$d&d$d'd(d)d(d*d(d+d,d-d,d.d,d/d0d1d0d2d0d3d4d5d6d7d8d9d8d:d;d<d;i d=d;d>d?d@d?dAd?dBdCdDdCdEdCdFdGdHdGdIdGdJdGdKdGdLdGdMdNdOdNdPdNdQdRi dSdTdUdVdWdVdXdVdYdZd[dZd\dZd]d^d_d^d`d^dadbdcdbdddbdedfdgdfdhdfdidjdjdjdjdjdjdkZh dlZh dmZd?dChZdydzdnZd{doZd|dpZd}dqZd~drZddsZddtZdduZddvZ	 dy	 	 	 	 	 	 	 ddwZ	 dy	 	 	 	 	 	 	 ddxZy)z?Anthropic Messages compatibility for Claude Code style clients.    )annotationsN)AnyAsyncIterator   )json_dumps_tool_argsjson_loads_tool_inputend_turn
max_tokenstool_usestop_sequence)stoplength
tool_callscontent_filteragentAgentask_user_questionAskUserQuestionzask-user-questionaskuserquestionbashBashcron_create
CronCreatezcron-create
croncreatecron_delete
CronDeletezcron-delete
crondelete	cron_listCronListz	cron-listcronlisteditEdit	edit_fileenter_plan_modeEnterPlanModezenter-plan-modeenterplanmodeenter_worktreeEnterWorktreezenter-worktreeenterworktreeexit_plan_modeExitPlanModezexit-plan-modeexitplanmodeexit_worktreeExitWorktreezexit-worktreeexitworktreeglobGlobgrepGreplistLSls
multi_edit	MultiEditz
multi-edit	multieditnotebook_editNotebookEditznotebook-editnotebookeditnotebook_readNotebookReadznotebook-readnotebookreadreadRead	read_filez	read-file	file_readz	file-readreadfileschedule_wakeupScheduleWakeupzschedule-wakeupschedulewakeupskillSkilltaskTasktask_output
TaskOutputztask-output
taskoutput	task_stopTaskStopz	task-stoptaskstop
todo_write	TodoWritez
todo-write	todowrite	web_fetchWebFetchz	web-fetchwebfetch
web_search	WebSearchz
web-search	websearchwriteWrite)
write_filez
write-file
file_writez
file-write	writefile>   r"   rA   r\   r8   >   r5   r1   r3   c                   t        | xs d      }||S ||v r|S |D ci c]  }|j                         | }}|j                  |j                               }|r|S t        j                  |j                               }||v r|S |S c c}w )Nunknown_tool)strlowerget_CLAUDE_TOOL_NAME_ALIASES)name
tool_namesraw	tool_namelower_tool_namesexact_case_matchaliass          A/root/.hermes/SkillClaw/skillclaw/protocols/anthropic_messages.py_normalize_tool_use_namern   a   s    
d$n
%C

j
FPQ	)94QQ'++CIIK8%))#))+6E
J Rs   Bc                f   t        |      }t        |      }| dk(  rd|vrd|v r|j                  d      |d<   | t        v rd|vrdD ]  }||v s||   |d<    n | t        v r(d|v r$|j                  dd       |j                  dd       | t        v rd|vrd	D ]  }||v s||   |d<    n | t        v r(d|v r$|j                  dd       |j                  dd       | t
        v rd
|vrdD ]  }||v s||   |d
<    n | t
        v r:d
|v r6|j                  dd       |j                  dd       |j                  dd       | dk(  r)dD ]#  \  }}||v s||vs|j                  |      ||<   % n| dk(  rt        |j                  d      t              rwg }|d   D ]h  }t        |t              s|j                  |       %t        |      }	dD ]#  \  }}||	v s||	vs|	j                  |      |	|<   % |j                  |	       j ||d<   | dk(  r&|j                  d      dk(  r|j                  dd       |S )zBNormalize OpenAI-style tool arguments back to Claude Code schemas.r   commandcmd	file_path)pathfilers   Nrt   )rr   rt   notebook_path)rs   rr   rt   r"   ))	oldString
old_string)	newString
new_string)
replaceAllreplace_allr8   editsrA   pages )
r   dictpop_FILE_PATH_TOOLS_PATH_TOOLS_NOTEBOOK_PATH_TOOLS
isinstancerd   r4   append)
rf   valueparsed	sanitizedrl   srcdstr|   r!   items
             rm   _sanitize_tool_use_inputr   s   s   "5)FVIv~)94)9K(}}U3	)Ky$@% 	E	!)25)9	+&	
 K9$<fd#fd#{vY6* 	E	!$-e$4	&!	
 {v2k4(fd###y(H2 	E	!-6u-=	/*	
 ##9(Dfd#k4(fd#v~q 	4HCiCy$8!*s!3	#	4 
	IMM',BD!Ig& 	DdD)T":Du .S$;3d? $DI. LL	 #	'v~)--0B6gt$    c                   t        | t              r| S t        | t              rg }| D ]  }t        |t              rh|j	                  d      }t        |t              r|j                  |       Ft        |j	                  d      t              sf|j                  |d          {|~|j                  t        |              dj                  d |D              S | t        |       S dS )Ntextcontent c              3  &   K   | ]	  }|s|  y wN .0parts     rm   	<genexpr>z2_flatten_openai_message_content.<locals>.<genexpr>   s     7$7   r~   )r   rb   r4   r   rd   r   join)r   partsr   r   s       rm   _flatten_openai_message_contentr      s    '3'4  	(D$%xx'dC(LL& 3S9LLi1!SY'	( xx7777".3w<6B6r   c                   t        | j                  d      xs | j                  d      xs d      }t        | j                  d      xs | j                  d      xs d      }| j                  d      xs | j                  d      xs i }d}t        |t              rt        |j                  d      xs d      }t	        d||z
        }||d	}|r||d
<   |S )Nprompt_tokensinput_tokensr   completion_tokensoutput_tokensprompt_tokens_detailsinput_tokens_detailscached_tokens)r   r   cache_read_input_tokens)intrd   r   r   max)usager   r   detailsr   r   outs          rm   "_anthropic_usage_from_openai_usager      s    		/2Teii6OTSTUMEII&9:]eii>X]\]^ii/0[EII>T4U[Y[GM'4 GKK8=A>q--78L':K
LC)6%&Jr   c                    g g dfd | j                  d             dj                  d D              j                         }| j                  d      du r|rd| nd}|fS |srd	nd
}|fS )Nc                   t        | t              r| rj                  |        y t        | t              r| D ]
  } |        y t        | t              r| j                  d      }|dv r5| j                  d      }t        |t              r|rj                  |       y |dk(  rt        |       }|rj                  |       y d| v r | j                  d             y | j                  t        |              y y )Ntype>   r   
input_textoutput_textr   imager   )r   rb   r   r4   r   rd   _image_block_to_openai_part)r   r   
value_typer   
image_partcollectimage_parts
text_partss        rm   r   z/_tool_result_to_openai_content.<locals>.collect   s    eS!!!%(eT" eT"6*JBByy(dC(T%%d+W$8?
&&z2E!		),-c%j) r   r   r   c              3  &   K   | ]	  }|s|  y wr   r   r   s     rm   r   z1_tool_result_to_openai_content.<locals>.<genexpr>   s     8T4D8r   is_errorTzTool error: z
Tool errorz(image result attached)z(empty))r   r   returnNone)rd   r   strip)blockr   r   r   r   s     @@@rm   _tool_result_to_openai_contentr      s    J(*K*6 EIIi !888Z88>>@Dyy$(,dV$,  ,7(Yr   c                   t        | j                  d      t              r| j                  d      ni }|j                  d      dk(  rKt        |j                  d      xs d      }t        |j                  d      xs d      }|rdd	d
| d| idS |j                  d	      xs$ | j                  d	      xs | j                  d      }t        |t              r	|rdd	|idS y )Nsourcer   base64
media_typez	image/pngdatar~   	image_urlurlzdata:z;base64,)r   r   )r   rd   r   rb   )r   r   r   r   r   s        rm   r   r      s    $.uyy/BD$IUYYx rFzz&X%L1@[A
6::f%+,'uj\QYZ^Y_>`6abb
**U

Iuyy/
I599[3IC#s#5#,??r   c           
        g }t        | t              s|S | D ]  }t        |t              st        |j	                  d      xs d      j                         }|j                  d      s|dv rVt        |j	                  d      xs d      j                         }|s|j                  d|t        |j	                  d      xs d      |j	                  d      xs d	i d
dd        |S )Nr   r~   rX   >   server_tool_useweb_search_tool_resultrf   functiondescriptioninput_schemaobject)r   
properties)rf   r   
parametersr   r   )r   r4   r   rb   rd   r   
startswithr   )tools	convertedr   	item_typerf   s        rm   _tools_to_openai_toolsr     s    &(IeT" 
$%(.B/557	 ->k1k488F#)r*002" #&txx'>'D"#E"&((>":"bx_a>b		

* r   c                
   t        | t              r	| dk(  rdS | S t        | t              s| S | j                  d      }|dk(  ry|dk(  ry|dk(  r5t        | j                  d      xs d      j	                         }|rdd|id	S | S )
Nanyrequiredr   autotoolrf   r~   r   r   )r   rb   r   rd   r   )tool_choicechoice_typerf   s      rm   _tool_choice_to_openair   !  s    +s#(E1zB{Bk4(//&)Kfef;??6*0b1779&VTNCCr   c                   t        | j                  dg             }| j                  d      }|rPt        |t              r|}n4t        |t               rdj	                  d |D              }nt        |      }d|dg|z   }g }|D ]i  }|j                  d      }|j                  d      }t        |t               s|j                  |       Hg }g }	g }
g }t        |      D ]f  \  }}t        |t              s|j                  d      }|d	k(  rK|j                  d	      }t        |t              sP|sS|j                  |       |	j                  d	|d
       y|dk(  r t        |      }|s|	j                  |       |dk(  rm|
j                  t        |j                  d      xs d|       dt        |j                  d      xs d      t        |j                  d            dd       |dk(  st        |      \  }}|j                  dt        |j                  d      xs d      |d       |	j                  |       i dj	                  |      j                         }t        d |	D              }|r|	n|}|dk(  r"i |d|i}|
r|
|d<   |j                  |       #|r.|j                  |       |s|	r|j                  i |d|i       S|j                  i |d|i       l | j                  dd      || j                  dd      d }t        | j                  d!            }|r||d!<   d"| v rt        | j                  d"            |d"<   d#D ]  }|| v s|d$k(  rd%n|}| |   ||<    |S )&zEConvert an Anthropic /v1/messages request body to OpenAI chat format.messagessystemr   c              3     K   | ]<  }t        |t              s|j                  d       dk(  s)|j                  dd       > yw)r   r   r~   N)r   r   rd   )r   blks     rm   r   z!to_openai_body.<locals>.<genexpr>;  s>      #(+C9NSVSZSZ[aSbflSl##s   AAA)roler   r   r   r   r   r   r   r   r   idtoolu_r   rf   ra   input)rf   	arguments)r   r   r   tool_resultr   tool_use_idr~   )r   tool_call_idr   c              3  D   K   | ]  }|j                  d       dk(    yw)r   r   N)rd   r   s     rm   r   z!to_openai_body.<locals>.<genexpr>r  s     RD(K7Rs    	assistantr   modelr
   i   )r   r   r
   r   r   )temperaturetop_pstop_sequencesstreamr   r   )r4   rd   r   rb   r   r   	enumerater   r   r   r   extendr   r   r   r   )bodyr   r   system_text
normalizedmsgr   r   r   content_partsr   tool_resultsidxr   
block_typer   r   	tool_texttool_images	has_imageopenai_contentassistant_msgopenai_bodyr   optkeys                             rm   to_openai_bodyr  2  s   %)$((:r*B%CHXXhFfc" K%(( #/5# K f+K%+>?(J')J <>wwv'')$'4(c" "
.0+-
-/#G, !	2JCeT*6*JV#yy(dC(T%%d+!((&$)GHw&8?
!((4z)!!!%))D/"CvcU^D *$'		&(9(K^$L)=eii>P)Q%	 },)G)N&	;## &(+EIIm,D,J(K#, $$[1C!	2F xx
#))+RMRR	FO]UY;4s4It4M.8l+m,l+}!!"DS"D)^"DE<S<)^<=y<>~ '2&hh|T2#K
 #488G#45E$G%;DHH]<S%TM"C )$;#33&C#CyK) r   c                   | j                  di g      d   }t        |j                  d      t              r|j                  di       ni }t        |j                  d            }|j                  d      }t        |t              r|ng }|j                  dd      }|rdnt
        j                  |d	      }	g }
|r|
j                  d
|d       t        |      D ]  \  }}t        |t              st        |j                  d      t              r|j                  d      ni }t        |j                  d      |      }|
j                  dt        |j                  d      xs d|       |t        ||j                  d            d        |
s|
j                  d
dd       | j                  di       }t        |t              r|ni }| j                  dd      dd||
|	dt        |      dS )zLConvert an OpenAI chat completion response to Anthropic /v1/messages format.choicesr   messager   r   finish_reasonr   r   r	   r   r   r   rf   r   call_r   r   r   rf   r   r~   r   msg_skillclawr   N)r   r   r   r   r   stop_reasonr   r   )rd   r   r   r   r4   _STOP_REASON_MAPr   r   rn   rb   r   r   )openai_respr   rg   choicer  content_textraw_tool_callsr   r  r  content_blocksr   	tool_callr   ri   r   s                   rm   from_openai_responser    s    __Y-a0F+5fjj6KT+RfjjB'XZG27;;y3IJL[[.N#-nd#CJJJ7M **0@0D0D]T^0_K+-Nv|DE#J/ 
Y)T*0:9==;TVZ0[9==,ac,X\\&-A:N	")--->5?!1)X\\+=VW		

 vr:;OOGR(Et,E"EoodO4!"3E:	 	r   c               j  K   | d   }t        |||      }|j                  dg       }|j                  d      xs d}|j                  di       }t        |t              r|ni }t	        |      }|j                  dd      }	d-d}
 |
d	d	|	d
dg |ddi |ddidd        |
dddi       t        |      D ]A  \  }}t        |t              r|j                  d      nd}|dk(  rt        |j                  d      t              r|j                  d      ni }t        j                  |dd      } |
dd|d|j                  dd|       |j                  dd      i dd       |r|dk7  r |
dd|d |d!d"        |
d#d#|d$       t        |t              rt        |j                  d%      xs d&      nd&} |
dd|d%d&d'd       |r |
dd|d(|d'd"        |
d#d#|d$       D  |
d)d)|dd*d|j                  dd      id+        |
d,dd,i       yw).zFYield Anthropic-format SSE events from an internal OpenAI chat result.responser   r  r	   r   r   r  c                >    d|  dt        j                  |d       dS )Nzevent: z
data: F)ensure_asciiz

)jsondumps)eventr   s     rm   ssez&stream_from_openai_result.<locals>.sse  s#    x

4e(L'MTRRr   message_startr  r   Nr   r   )r   r   r   r   r   r  r   r   )r   r  pingr   r   r   F),:)r  
separatorscontent_block_startr	  rf   ra   r
  )r   indexcontent_blockz{}content_block_deltainput_json_delta)r   partial_json)r   r#  deltacontent_block_stop)r   r#  r   r~   r   
text_deltamessage_delta)r  r   )r   r(  r   message_stop)r  rb   r   dict[str, Any]r   rb   )	r  rd   r   r   r   r   r  r  rb   )resultr   rg   payloadanthropic_payloadr  r  r   anthropic_usagemsg_idr  r#  r   r   	input_objr'  r   s                    rm   stream_from_openai_resultr4    s     Z G,WeZH&**9b9N#''6D*KKK$Et,E"E8?O[[/FS #!##!%@O@_a@		
   fvv&
''!.1 0Xu*4UD*AUYYv&t
#.879KT.R		'*XZI::iePZ[L%1" *#iieWo> %		&. A!#	&	   4) 5!&*<l![  *5ITY,Z[[/9%/Fs599V$*+B!-*0"!=
 	
 %1"&2DA  &1EPU(VWWa0Xd #%04H%':':?A'NO	
  nv~6
77s   H1H3r   )rf   r   rg   set[str] | Noner   rb   )rf   rb   r   r   r   r-  )r   r   r   rb   )r   r-  r   zdict[str, int])r   r-  r   z tuple[str, list[dict[str, Any]]])r   r-  r   zdict[str, Any] | None)r   r   r   zlist[dict[str, Any]])r   r   r   r   )r   r-  r   r-  )r  r-  r   rb   rg   r5  r   r-  )r.  r-  r   rb   rg   r5  r   zAsyncIterator[str])__doc__
__future__r   r  typingr   r   commonr   r   r  re   r   r   r   rn   r   r   r   r   r   r   r   r  r  r4  r   r   rm   <module>r:     s   E "  % ? %	 JWJ*J *J (	J
 FJ <J <J ,J <J <J ,J J J 
J FJ  !J" #J$ %J& _'J( o)J* o+J, _-J. n/J0 n1J2 N3J4 ^5J6 ^7J8 N9J: F;J< F=J> D?J@ 	$AJB +CJD +EJF GJH ^IJJ ^KJL NMJN ^OJP ^QJR NSJT FUJV WJX YJZ [J\ ]J^ _J` 'aJb 'cJd &eJf WgJh FiJj <kJl <mJn ,oJp qJr sJt 
uJv +wJx +yJz {J| }J~ J@ 
AJB +CJD +EJF GJH WIJJ SJ V : $&7 $:z7$%P
8"]F #',,,  , 	,d #'^8^8^8  ^8 	^8r   