o
    پi                     @   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mZ d dl	m
Z
mZmZ eeZedejZedejZedejZed	ejZG d
d deZdS )    N)List)Tool)BaseFormatDetector)StreamingParseResultToolCallItem_GetInfoFuncz!function call<\|role_sep\|>\n(.*)z^(.*?)<\|message_sep\|>z"name"\s*:\s*"([^"]*)"z"arguments"\s*:\s*(.*)c                       s   e Zd Zd 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fddZdefddZ  ZS )GigaChat3DetectorreturnNc                    s,   t    d| _d| _d| _d| _g | _d S )NF )super__init__tool_startedtool_name_sentend_content_bufferprev_tool_call_arrself	__class__ _/home/ubuntu/.local/lib/python3.10/site-packages/sglang/srt/function_call/gigachat3_detector.pyr   &   s   

zGigaChat3Detector.__init__textc                 C   s   d|v S )z)Check if text contains a tool call markerzfunction call<|role_sep|>
r   )r   r   r   r   r   has_tool_call.   s   zGigaChat3Detector.has_tool_calltoolsc              
   C   sP  t d|  |}d}d}| dr|d|d }t|}|rlz%tj|	ddd}t
|tr=d|v r=d|v s@d}n	t
|d tsId}W n! tjyk } zt d	|  t|g d
W  Y d}~S d}~ww t|}|ry|	d}nd|v r|dd }n|}|st|g d
S |d }	|d }
|	|
d}| ||}t||d
S )z}
        Non-streaming parsing of complete model output.
        Extracts tool calls and content from the full text.
        z[GigaChat3] detect_and_parse: N</s>   Fstrictname	argumentsz[GigaChat3] JSON decode error: )normal_textcalls<|message_sep|>r   )r   r    )loggerdebugrstripendswithrfindREGEX_FUNCTION_CALLsearchjsonloadsgroup
isinstancedictJSONDecodeErrorwarningr   REGEX_CONTENT_PATTERNsplitparse_base_json)r   r   r   model_outputfunction_callcontentm_funce	m_contentr   argsmatch_resultr"   r   r   r   detect_and_parse2   sN   	


z"GigaChat3Detector.detect_and_parsenew_textc                 C   s  |st  S td| d |  j|7  _| j}|}d}d}d}t|}| js]t|}	|	r8|	d}d| _	nd|v rG|
dd }d| _	n| j	sL|}|rVd| _td |r]t |d	S |sbt  S |d }
t|
}|ru|d}t|
}|r|d }|d
r|dtd
  }|drz|dd  }tj|dd |}W n
 tjy   Y nw g }| js| ji  | js|st  S d| _|| jd d< td|  |td|dd t |dS |du rt  S | jd dd}|s|}n&||r|t|d }ntd|dd  d|dd  d t  S |s)t  S || jd d< ztj|dd}|| jd d< W n tjyR   i | jd d< Y nw td|dd  d |tdd|d t |dS )z
        Streaming parser for incremental text chunks.
        Maintains state across calls to build complete tool calls.
        z([GigaChat3] parse_streaming_increment: ''Nr   Tr#   r   z[GigaChat3] Tool call started)r!   r   }Fr   r   z[GigaChat3] Sending tool name: r
   )
tool_indexr   
parameters)r"   arguments_strz.[GigaChat3] Arguments overlap mismatch. prev='2   z
...' cur='z...'r    z![GigaChat3] Sending args delta: 'd   )r   r$   r%   r   r)   r*   r   r2   r-   r   r3   strip
NAME_REGEX
ARGS_REGEXr'   lenr+   r,   r0   r   appendr   r   get
startswithr1   )r   r>   r   current_text
delta_textr7   	func_namecur_argsr8   r:   	json_tail
name_match
args_match	candidater"   	prev_args
delta_args	args_dictr   r   r   parse_streaming_incrementc   s   	













z+GigaChat3Detector.parse_streaming_incrementc                 C   s   dS )z&GigaChat3 does not use structural tagsFr   r   r   r   r   supports_structural_tag   s   z)GigaChat3Detector.supports_structural_tagc                 C   s   t d)zNot applicable for GigaChat3z9GigaChat3Detector does not support structural_tag format.)NotImplementedErrorr   r   r   r   structure_info   s   z GigaChat3Detector.structure_info)r	   N)__name__
__module____qualname__r   strboolr   r   r   r   r=   rY   rZ   r   r\   __classcell__r   r   r   r   r   %   s&    
1
fr   )r+   loggingretypingr   &sglang.srt.entrypoints.openai.protocolr   -sglang.srt.function_call.base_format_detectorr   #sglang.srt.function_call.core_typesr   r   r   	getLoggerr]   r$   compileDOTALLr)   r2   rH   rI   r   r   r   r   r   <module>   s2    
