o
    پi:(                  
   @   s   d dl Z d dlZd dlZd dlZd dlZd dlmZmZmZ d dl	m
Z
 d dlmZ d dlmZ d dlmZmZ eeZdeded	ee
 d
efddZdededed	ee
 d
ef
ddZG dd deZdS )    N)AnyDictList)Tool)envs)BaseFormatDetector)StreamingParseResult_GetInfoFunc	func_name
param_nametoolsreturnc                 C   sF   |D ]}|j j| kr |j jdi }||v r || dd  S qdS )z$Get parameter type from tool schema.
propertiestypestring)functionname
parametersget)r
   r   r   toolprops r   Z/home/ubuntu/.local/lib/python3.10/site-packages/sglang/srt/function_call/mimo_detector.py_get_param_type   s   r   param_valuec              
   C   s  t | } |  dkrdS t|||}|dv r| S |ds7|ds7|ds7|ds7|ds7|d	rRzt| W S  ttfyQ   t	d
| || |  Y S w |ds\|drzt
| }|t| dkrl|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v s|ds|drzt| } | W S  tjttfy   t	d| || Y nw zt| } W | S  tttfy   t	d| || Y | S w )z
    Convert parameter value based on its type in the schema.
    Adapted from vllm-project/vllm (vllm/entrypoints/openai/tool_parsers/qwen3coder_tool_parser.py)
    nullN)r   strtextvarcharcharenumintinteger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` or `false`) in tool '%s', degenerating to false.r,   )objectarrayarrdictlistzvParsed value '%s' of parameter '%s' cannot be parsed with json.loads 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.)htmlunescapelowerr   
startswithr!   
ValueError	TypeErrorloggerwarningr(   jsonloadsJSONDecodeErrorastliteral_evalSyntaxError)r   r   r
   r   
param_typefloat_param_valuer   r   r   _convert_param_value(   s   

		
	
rC   c                       s   e Zd ZdZ fddZdedefddZdedee	 de
fd	d
Zdedee	 de
fddZdedee	 deeef fddZdefddZdefddZ  ZS )MiMoDetectorz
    Detector for MiMo function call format.

    Format:
        <tool_call>
        <function=execute_bash>
        <parameter=command>pwd && ls</parameter>
        </function>
        </tool_call>
    c                    sJ   t    d| _d| _tdtj| _tdtj| _tdtj| _	d S )Nz<tool_call>z</tool_call>z<tool_call>(.*?)</tool_call>z"<function=([^>]+)>(.*?)</function>z$<parameter=([^>]+)>(.*?)</parameter>)
super__init__	bot_token	eot_tokenrecompileDOTALLtool_call_regex
func_regexparam_regexself	__class__r   r   rF      s   

zMiMoDetector.__init__r   r   c                 C   s
   | j |v S N)rG   )rP   r   r   r   r   has_tool_call   s   
zMiMoDetector.has_tool_callr   c                 C   s   | | j}|dkrt|g dS |d| }| |}g }|}| j|D ]A}|d}	| |	|}
|
rb|
d}||vrYt	
d|  tj sY||||  7 }| }q%|| |
| | }q%t||dS )z#Parse complete text for tool calls.)normal_textcallsN   r   zUnknown function: )findrG   r   _get_tool_indicesrL   finditergroup_parse_tool_callr   r9   r:   r   SGLANG_FORWARD_UNKNOWN_TOOLSendextendparse_base_json)rP   r   r   idxrV   tool_indicesrW   last_endmatchtool_call_bodyparsedr
   r   r   r   detect_and_parse   s*   




zMiMoDetector.detect_and_parsenew_textc           	      C   s  |  j |7  _ | j }|| j}|dkr&| jdkrtddS d| _ t|dS || j|}|dkrC|d| }||d | _ t|dS | |d|t| j  |}|jr| jdkrdd| _g | _	dg| _
t| j	| jkrz| j	i  t| j	| jkslt| j
| jkr| j
d t| j
| jks|jd }|j|jrt|jni d| j	| j< |j| j
| j< | j|_|  jd7  _||t| j d | _ |S )zK
        Streaming parsing: buffer until complete tool call block.
        rU   r    )rV   N)r   	argumentsrX   )_bufferrY   rG   current_tool_idr   rH   rh   lenrW   prev_tool_call_arrstreamed_args_for_toolappendr   r   r;   r<   
tool_index)	rP   ri   r   current_textstartr_   rV   resultcallr   r   r   parse_streaming_increment   sD   





z&MiMoDetector.parse_streaming_incrementrf   c           
      C   sv   | j |}|s
dS |d }|d}i }| j|D ]}|d }|d}	t|	|||||< q||dS )z
        Parse content inside <tool_call>...</tool_call>.

        Structure:
            tool_call_body contains: <function=name>...params...</function>
        NrX      )r   r   )rM   searchr\   striprN   r[   rC   )
rP   rf   r   
func_matchr
   	func_bodyparamsparam_matchr   r   r   r   r   r]      s   




zMiMoDetector._parse_tool_callc                 C   s   dS )NFr   rO   r   r   r   supports_structural_tag     z$MiMoDetector.supports_structural_tagc                 C   s   t rS   )NotImplementedErrorrO   r   r   r   structure_info  r   zMiMoDetector.structure_info)__name__
__module____qualname____doc__rF   r   r*   rT   r   r   r   rh   rw   r   r   r]   r   r	   r   __classcell__r   r   rQ   r   rD      s*    
!
7

rD   )r>   r3   r;   loggingrI   typingr   r   r   &sglang.srt.entrypoints.openai.protocolr   sglang.srt.environr   -sglang.srt.function_call.base_format_detectorr   #sglang.srt.function_call.core_typesr   r	   	getLoggerr   r9   r   r   rC   rD   r   r   r   r   <module>   s0   


a