o
    
۾iz                     @   s   d dl Z d dlZd dlZd dlmZ d dlmZ d dlZd dl	m
Z
mZ d dlmZmZmZmZmZmZ d dlmZ d dlmZ d dlmZ eeZG d	d
 d
eZdS )    N)Sequence)Any)ChatCompletionRequestChatCompletionToolsParam)DeltaFunctionCallDeltaMessageDeltaToolCallExtractedToolCallInformationFunctionCallToolCall)init_logger)TokenizerLike)
ToolParserc                       s   e Zd ZdZdZdef fddZdefddZd	d
 Z	dede
e dB dedB fddZdede
e fddZdededefddZdedededee dee dee dededB fddZ  ZS )SeedOssToolParserz<seed:tool_call>z</seed:tool_call>	tokenizerc                    s<  t  | |   g | _| j| _| j| _d| _d| _	d| _
d| _d| _d| _d| _d| _d| _|   | j| j| _| j| j| _| j| j| _| jd u sV| jd u rZtd	t| j}t| j}t| d
| tj| _t| d
| d| dtj| _tdtj| _tdtj| _t d| j!j" d S )Nz
<function=z</function>z<parameter=z</parameter>z<seed:think>z</seed:think>Fr   zSSeed_Oss XML parser: tokenizer did not include <seed:tool_call> or its closing tag.z(.*?)|z(.*?)$z*<function=(.*?)</function>|<function=(.*)$z.<parameter=(.*?)</parameter>|<parameter=(.*?)$z*vLLM Seed-Oss XML tool parser loaded (%s).)#super__init___reset_streaming_stateprev_tool_call_arrTOOL_CALL_STARTtool_call_start_tokenTOOL_CALL_ENDtool_call_end_tokentool_call_prefixfunction_end_tokenparameter_prefixparameter_end_tokenthink_start_tokenthink_end_tokenis_tool_call_startedis_thinking_endfailed_countvocabgettool_call_start_token_idtool_call_end_token_idthink_end_token_idRuntimeErrorreescapecompileDOTALLtool_call_complete_regextool_call_regextool_call_function_regextool_call_parameter_regexloggerinfo	__class____name__)selfr   tool_start_retool_end_rer3    Z/home/ubuntu/.local/lib/python3.10/site-packages/vllm/tool_parsers/seed_oss_tool_parser.pyr   '   sN   zSeedOssToolParser.__init__returnc                 C   s   dt  jdd  S )zGenerate a unique tool call ID.call_N   )uuiduuid4hexr5   r9   r9   r:   _generate_tool_call_id[   s   z(SeedOssToolParser._generate_tool_call_idc                 C   sR   d| _ d| _d| _d| _d| _d| _d| _d| _d| _d| _	d| _
d| _d| _dS )zReset all streaming state.r   FN )current_tool_indexr    header_sentcurrent_tool_idcurrent_function_namecurrent_param_namecurrent_param_valueparam_countin_paramin_functionaccumulated_textjson_startedjson_closedrA   r9   r9   r:   r   _   s   
z(SeedOssToolParser._reset_streaming_statefunction_call_strtoolsNc              
      s  dt dtf fdd}dt dt dtdt dtf
dd	}|d
}|d | }||}||d d  }i }	| j|D ]B}
|
d rC|
d n|
d }|d
}|d | }t ||d d  }|drg|dd  }|drr|d d }||||||	|< q9tdt	|t
j|	ddddS )N	func_namer;   c                    s    d u ri S  D ]H}t |drt |drt |jdsq|jdkrP|jj| krPt |jds0i   S |jj}t|trCd|v rC|d   S t|trL|  S i   S qtd|  i S )Ntypefunctionname
parameters
propertiesz+Tool '%s' is not defined in the tools list.)	hasattrrU   rT   rV   rW   
isinstancedictr1   warning)rS   configparamsrR   r9   r:   get_arguments_configr   s*   


zHSeedOssToolParser._parse_xml_function_call.<locals>.get_arguments_configparam_value
param_nameparam_configc              
   S   s  |   dkrd S ||vr|i krtd|| | S t|| tr3d|| v r3t|| d    }nd}|dv r;| S |dsT|dsT|dsT|d	sT|d
rpzt| } W | S  t	t
fyo   td| || Y | S w |dsz|drzt| }|t| dkr|} W | S t|} W | S  t	t
fy   td| || Y | S w |dv r|   } | dvrtd| || | dkS |dks|drzt| } | W S  t	t
tjfy   td| || Y nw zt| } W | S  t	tfy   td| || Y | S w )NnullzoParsed parameter '%s' is not defined in the tool parameters for tool '%s', directly returning the string value.rT   string)re   strtextvarcharcharenumintuintlongshortunsignedz[Parsed value '%s' of parameter '%s' is not an integer in tool '%s', degenerating to string.numfloatr   zXParsed value '%s' of parameter '%s' is not a float in tool '%s', degenerating to string.)booleanboolbinary)truefalsezmParsed value '%s' of parameter '%s' is not a boolean (`true` of `false`) in tool '%s', degenerating to false.ru   objectr[   zpParsed value '%s' of parameter '%s' is not a valid JSON object in tool '%s', will try other methods to parse it.z}Parsed value '%s' of parameter '%s' cannot be converted via Python `ast.literal_eval()` in tool '%s', degenerating to string.)lowerr1   r\   rZ   r[   rf   strip
startswithrk   
ValueError	TypeErrorrq   jsonloadsJSONDecodeErrorastliteral_evalSyntaxError)ra   rb   rc   rS   
param_typefloat_param_valuer9   r9   r:   convert_param_value   s   
			
	zGSeedOssToolParser._parse_xml_function_call.<locals>.convert_param_value>   r   
rC   rU   F)ensure_asciirV   	arguments)rT   rU   )rf   r[   r   indexr0   findallrz   endswithr   r
   r}   dumps)r5   rQ   rR   r`   r   	end_indexfunction_namerc   rW   
param_dictmatch
match_textidxrb   ra   r9   r_   r:   _parse_xml_function_callo   sF   

c



z*SeedOssToolParser._parse_xml_function_callmodel_outputc                 C   s^   | j |}dd |D }t|dkr|g}g }|D ]}|| j| qdd |D }|S )Nc                 S   $   g | ]}|d  r|d  n|d qS r   r   r9   .0r   r9   r9   r:   
<listcomp>      z9SeedOssToolParser._get_function_calls.<locals>.<listcomp>r   c                 S   r   r   r9   r   r9   r9   r:   r     r   )r.   r   lenextendr/   )r5   r   matched_rangesraw_tool_callsraw_function_calls	tool_callfunction_callsr9   r9   r:   _get_function_calls  s   z%SeedOssToolParser._get_function_callsrequestc                    sV  j |vrtdg |dS j|v r.j|v r.|jtj }||d  }|d | }nd}|}zc|}t|dkrFtdg |dW S  fdd|D }j  |D ]}|rhj	|j
j|j
jd qW|j}	|	dkru|	n|j }	||d |	  }
tt|dk||
r|
dW S d dW S  ty   td tdg |d Y S w )	NF)tools_called
tool_callscontentrD   r   c                    s   g | ]	} | jqS r9   )r   rR   )r   rQ   r   r5   r9   r:   r   :  s    z8SeedOssToolParser.extract_tool_calls.<locals>.<listcomp>r   z,Error in extracting tool call from response.)r   r	   r   r   findr   r   r   clearappendrU   rV   r   r   	Exceptionr1   	exception)r5   r   r   think_end_indexresult_contentthinking_contentr   r   r   tool_call_start_indexr   r9   r   r:   extract_tool_calls  sd   








z$SeedOssToolParser.extract_tool_callsprevious_textcurrent_text
delta_textprevious_token_idscurrent_token_idsdelta_token_idsc           .         s  |s?|r= j |vr=t j|}|dkr3t jdkr3| j| j }	|	dkr1tddS d S  j	s=|r=tddS d S |sE 
  | _ jrz jsz| j}
|
 jkrz  jd7  _d _d _d _d _ j| jkrxd _	d S  js j|v s j|v rd _ jst|dS  j	sψ j|v s j|v rd _	 j|v r|d | j }|rt|dS d S |  jr| dkrd S t|dS | j} j|krd S  j|v r| jt j nd}g }|}	 | j|}|dkrn|| |t j7 }q jt|krd S | j }| j|}|dkr.||d  }n|||t j  } js j|v r| jt j }|d|}|dkr|||  _   _d _d _t  fd	d
 jD }|s j jdd tt! j jt" jddddgdS d S  jr js j#|vrd _tt! jt"dddgdS  jsd _ jsB j$|v rBd _| jt j }| j$|}|dkr,||| }z1 %||r|j&nd }|rt' jD ]\}}|(d|j)j*kr|j)j+ j| d<  nqW n t,y+   t-j.ddd Y nw tt! jt"dddgd}d _d _|S | j/} j0s j|k rg }d}	 | j#|}|dkrdn|| |t j#7 }qWt| jkr| j }|t j# }||d  } d| v r| d}!| d |!  _1||! d }"||"d  }#|#2dr|#dd  }#|# j/}$|$dkr|#d |$ }%|%dr|%d d }% jdkrd j1 d t34|%dd  d }&nd j1 d t34|%dd  d }&  jd7  _tt! jt"|&ddgdS  j0r j/|v r| j/}'|d |' }( j5s>d|(v r>|(d})|(|)d d  }( j5sN|(2drN|(dd  }( j5|( }* j5rat34 j5dd nd}+t34|*dd },|,t|+d  }-d _0d _5tt! jt"|-d ddgdS |}( j5sd|(v r|(d})|(|)d d  }( j5s|(2dr|(dd  }(|(r j5rt34 j5dd nd}+  j5|(7  _5t34 j5dd },|,t|+d  }-|-rtt! jt"|-ddgdS d S )Nr   rD   )r   r   FTrC   r   c                 3   s     | ]}| d  jkV  qdS )rV   N)r$   rH   )r   toolrA   r9   r:   	<genexpr>  s
    
zASeedOssToolParser.extract_tool_calls_streaming.<locals>.<genexpr>z{}r   rU   )r   idrU   rT   )r   {)r   )r   rU   rV   r   z0Failed to parse tool arguments during streaming.)exc_info}r   "z": "z, ")6r&   r   r-   r   r   countr   r   r   r    r   rN   rP   rM   rE   rF   rK   rO   r!   r'   r   r%   r   rstripr   ry   r   r   r   rH   rB   rG   anyr   r   r   r   r   rR   	enumerater$   rU   rV   r   r   r1   r\   r   rL   rI   rz   r}   r   rJ   ).r5   r   r   r   r   r   r   r   complete_calls
open_calls	tool_endscontent_beforetool_starts_countr   tool_startsr   tool_start_idxtool_end_idx	tool_text
func_startfunc_endalready_addedfunc_content_endfunc_contentparsed_toolir   resultcomplete_paramsparam_starts	param_idxparam_start	remainingname_endvalue_start
value_textparam_end_idxra   json_fragmentend_idxvalue_chunkgt_idx
full_valueprev_escapedfull_escapeddelta_escapedr9   rA   r:   extract_tool_calls_streaming_  s  






























	


z.SeedOssToolParser.extract_tool_calls_streaming)r4   
__module____qualname__r   r   r   r   rf   rB   r   listr   r   r   r   r   r	   r   r   rk   r   r   __classcell__r9   r9   r8   r:   r   #   sN    4

 
G	r   )r   r}   r>   collections.abcr   typingr   regexr)   0vllm.entrypoints.openai.chat_completion.protocolr   r   'vllm.entrypoints.openai.engine.protocolr   r   r   r	   r
   r   vllm.loggerr   vllm.tokenizersr   &vllm.tool_parsers.abstract_tool_parserr   r4   r1   r   r9   r9   r9   r:   <module>   s    