o
    -i>                     @   sf  U d dl Z d dlZd dlmZ d dlZdZdZee	d< dZ
ee	d< dZee	d	< d
Zee	d< dZee	d< dZee	d< dZee	d< dZee	d< dZdZee	d< dZee	d< dZdZee	d< dedefddZd d! Zd"d# Zd$d% Zd&eeef defd'd(Zd)ed*eeeeef f deeef fd+d,Zd-eeeeeeef B f  defd.d/Zd0eeeef  de fd1d2Z!d3e d0eeeef  d4edefd5d6Z"	dHd0eeeef  d7e dB deeeef  fd8d9Z#		:	:dId0eeeef  d4ed;eeeef  dB d<e$d=e$defd>d?Z%d3e d@edAee dee edeB f fdBdCZ&d3e d@efdDdEZ'd@ed4efdFdGZ(dS )J    N)Anya  ## Tools
You have access to a set of tools you can use to answer the user's question.
You can invoke functions by writing a "<{dsml_token}function_calls>" block like the following as part of your reply to the user:
<{dsml_token}function_calls>
<{dsml_token}invoke name="$FUNCTION_NAME">
<{dsml_token}parameter name="$PARAMETER_NAME" string="true|false">$PARAMETER_VALUE</{dsml_token}parameter>
...
</{dsml_token}invoke>
<{dsml_token}invoke name="$FUNCTION_NAME2">
...
</{dsml_token}invoke>
</{dsml_token}function_calls>
String and scalar parameters should be specified as is without any escaping or quotes, while lists and objects should use JSON format. The "string" attribute should be set to "true" for string type parameters and "false" for other types (numbers, booleans, arrays, objects).
If the thinking_mode is enabled, then after function results you should strongly consider outputting a thinking block. Here is an example:
<{dsml_token}function_calls>
...
</{dsml_token}function_calls>
<function_results>
...
</function_results>
{thinking_start_token}...thinking about results{thinking_end_token}
Here are the functions available in JSONSchema format:
<functions>
{tool_schemas}
</functions>
u   <｜begin▁of▁sentence｜>	bos_tokenu   <｜end▁of▁sentence｜>	eos_tokenz<think>thinking_start_tokenz</think>thinking_end_tokenu
   ｜DSML｜
dsml_tokenz	{content}system_msg_templateu&   <｜User｜>{content}<｜Assistant｜>user_msg_templateu;   {reasoning}{content}{tool_calls}<｜end▁of▁sentence｜>assistant_msg_templatez{reasoning_content}zX## Response Format:

You MUST strictly adhere to the following schema to reply:
{schema}response_format_templatezD<{dsml_token}invoke name="{name}">
{arguments}
</{dsml_token}invoke>tool_call_templatezG<{dsml_token}function_calls>
{tool_calls}
</{dsml_token}function_calls>z
<result>{content}</result>tool_output_templatevaluereturnc                 C   s2   zt j| ddW S  ty   t j| dd Y S w )NF)ensure_asciiT)jsondumps	Exception)r    r   b/home/ubuntu/veenaModal/venv/lib/python3.10/site-packages/vllm/tokenizers/deepseek_v32_encoding.pyto_json=   s
   r   c                 C      dd | D S )Nc                 S   s   g | ]}|d  qS )functionr   ).0toolr   r   r   
<listcomp>E       z,tools_from_openai_format.<locals>.<listcomp>r   )toolsr   r   r   tools_from_openai_formatD   s   r   c                 C   r   )Nc                 S   s&   g | ]}|d  d |d  d dqS )r   name	argumentsr   r    r   r   	tool_callr   r   r   r   I   s    

z1tool_calls_from_openai_format.<locals>.<listcomp>r   
tool_callsr   r   r   tool_calls_from_openai_formatH   s   r&   c                 C   r   )Nc                 S   s$   g | ]}d |d |d ddqS )r   r   r    r!   )typer   r   r"   r   r   r   r   S   s    z/tool_calls_to_openai_format.<locals>.<listcomp>r   r$   r   r   r   tool_calls_to_openai_formatR   s   r(   r#   c                 C   s   d}g }t | d trt| d }n| d }| D ]"\}}|jt|t |tr*dndt |tr2|nt|d}|| qd	|S )NzU<{dsml_token}parameter name="{key}" string="{is_str}">{value}</{dsml_token}parameter>r    truefalse)r   keyis_strr   
)

isinstancestrr   loadsitemsformatr   r   appendjoin)r#   p_dsml_templateP_dsml_strsr    kv
p_dsml_strr   r   r   encode_arguments_to_dsml_   s   
r:   	tool_name	tool_argsc                    sF   dt dt dt fdd dd fdd	| D  d
 }t| |dS )Nr+   r   stringc                 S   s"   |dkrt |}t |  d| S )Nr)   z: r   )r+   r   r=   r   r   r   _decode_valuew   s   z/decode_dsml_to_arguments.<locals>._decode_value{z, c                    s"   g | ]\}\}} |||d qS ))r=   r   )r   r7   r8   r,   r?   r   r   r      s   " z,decode_dsml_to_arguments.<locals>.<listcomp>}r!   )r/   r4   r1   dict)r;   r<   tool_args_jsonr   rA   r   decode_dsml_to_argumentst   s   rE   r   c                 C   s&   dd | D }t jd|tttdS )Nc                 S   s   g | ]}t |qS r   r>   )r   tr   r   r   r      r   z render_tools.<locals>.<listcomp>r-   )tool_schemasr   r   r   )TOOLS_SYSTEM_TEMPLATEr2   r4   r   r   r   )r   
tools_jsonr   r   r   render_tools   s   rJ   messagesc                 C   s>   d}t t| d ddD ]}| | ddv r|} |S q|S )N   role)user	developer)rangelenget)rK   last_user_indexidxr   r   r   find_last_user_index   s   rV   indexthinking_modec                 C   s  d|   krt |k sn td|  dt | |dvr%td| dd}||  }t|}|d}|d	}|d
}|d}	|d}
|dpQ|d}|dd}|r^t|}|
rdt|
}
|dkr|tj|pndd7 }|r||dt| 7 }|	r|dt	jt
|	d 7 }|S |dkr|std| d| d}|r|dt| 7 }|	r|dt	jt
|	d 7 }|d|7 }|tj|d7 }| |kr|dkr|t7 }|S |t7 }|S |dkr|tj|d7 }| |kr|dkr|t7 }|S |t7 }|S |dkr| d }|| }|dkr(|ddkr(|d8 }|| }|dkr(|ddks| dksD|dkr:|ddksDtd|  d| | | }|d}|rWt ||ks[td |dkrd|d!7 }|tj|d7 }|t |kr|d"7 }| |kr|dkr|dt 7 }|S |dt 7 }|S |dkr| }d}d}|
rd#d$ |
D }
|dtjtd%|
d& 7 }|pd}|dkr| |kr|s|
std'| d(| d)tj|pdd*t }|
s|r||7 }|S |tj|||d+7 }|S td,| )-Nr   zIndex z* out of range for messages list of length )chatthinkingzInvalid thinking_mode `` rN   contentr   response_formatr%   	reasoningreasoning_contentprefixFsystem)r]   z

)schemarP   zInvalid message for role `z`: z

# The user's message is: {}rZ   rO   r   rM   	assistantzInvalid messages at z:
z#No tool calls but found tool outputz

<function_results>z
</function_results>c                 S   s&   g | ]}t jt|d t|dqS )r   )r   r   r    )r   r2   r   rS   r:   r"   r   r   r   r     s    z"render_message.<locals>.<listcomp>r-   )r   r%   zThinkingMode: z8, invalid message without reasoning_content/tool_calls `z` after last user message)r`   )r_   r]   r%   zUnknown role: )rR   
ValueErrorrV   rS   r   r&   r   r2   rJ   r   r   r	   r   r   r   tool_calls_templater   r4   thinking_templater
   NotImplementedError)rW   rK   rX   promptmsglast_user_idxrN   r]   r   r^   r%   r`   	is_prefixcontent_developerprev_assistant_idxassistant_msgtool_call_orderassistant_tool_callsthinking_parttool_calls_contentsummary_contentr   r   r   render_message   s   





i
USMK




-+




ru   rk   c                 C   s   g }|d u r
t | n|}t| D ]1\}}|d}|dv s!||kr'|| q|dkrAt|}|dd  |dd  || q|S )NrN   )rO   rb   r   rd   r`   r_   )rV   	enumeraterS   r3   copypop)rK   rk   messages_wo_thinkingrU   rj   rN   msg_wo_thinkingr   r   r   drop_thinking_messages'  s   



r{   Tcontextdrop_thinkingadd_default_bos_tokenc                 C   sp   |r|ng }||  }|rt |dkrtnd}|dkr |r t|}tt | D ]}|t|t | ||d7 }q&|S )Nr   r\   rZ   )rX   )rR   r   r{   rQ   ru   )rK   rX   r|   r}   r~   full_messagesri   rU   r   r   r   encode_messages=  s   
r   textstopc                 C   sv   t |}d }|D ]}||| }|dkr||k r|}|}q|r.|| | }|t | ||fS || d  }t ||d fS )NrL   )rR   find)rW   r   r   min_posmatched_stopsposr]   r   r   r   _read_until_stopT  s   r   c                 C   s  g }d }dt  d}| t|k rt| |dt  d|g\} }}|dkr'td||kr,n|d u r4tdt| |dt  ddt  dg\} }}tjd	|tjd
}t|dkrZtd|d }i }	|dt  dkrt| |dt  dg\} }
}tjd|
tjd
}t|dkrtd|d \}}}||	v rtd||f|	|< t| |dt  ddt  dg\} }}|dkrtd|dt  dksht||	d}|| | t|k s| ||fS )Nz</zfunction_calls><invokez>
zTool call format errorzMissing special token	parameterz^\s*name="(.*?)">\n$)flagsrM   zTool name format errorr   /z,^ name="(.*?)" string="(true|false)">(.*?)<$zParameter format errorzDuplicate parameter name)r;   r<   )	r   rR   r   RuntimeErrorrefindallDOTALLrE   r3   )rW   r   r%   
stop_tokentool_calls_end_token_tool_name_contentp_tool_namer;   r<   param_contentparam_kv
param_namer=   param_valuer]   r#   r   r   r   parse_tool_callsh  s`   





4r   c                 C   s,  ddg }}}d\}}dt  d}|dkd}}	|r0t|| t|g\}}
}|
}|tkr0tdt|| t|g\}}
}|
}||krDd}	n|tkrLtd	|	rft|| \}}}t|| tg\}}}|rftd
t| |krr|td fv svtdttttt fD ]}||v s||v rtdq}d|||t	|dS )Nr\   )r   Nz

<function_callsrZ   FzInvalid thinking formatTzInvalid summary formatz#Unexpected content after tool callszUnexpected content at endz#Unexpected special token in contentrd   )rN   r]   r`   r_   r%   )
r   r   r   r   r   r   rR   r   r   r(   )r   rX   rt   r`   r%   rW   r   tool_calls_start_tokenis_thinkingis_tool_callingcontent_deltatool_ends_textsp_tokenr   r   r   "parse_message_from_completion_text  sR   



r   )N)NTT))rw   r   typingr   regexr   rH   r   r/   __annotations__r   r   r   r   r   r	   r
   rg   r   r   rf   r   r   r   r&   r(   rC   r:   tuplerE   listrJ   intrV   ru   r{   boolr   r   r   r   r   r   r   r   <module>   s   




*	
 


?