
    .`iS                         d dl Z d dlm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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  ee          Z G d de          ZdS )    N)Sequence)Allow)make_tool_call_id)ChatCompletionRequest)DeltaFunctionCallDeltaMessageDeltaToolCallExtractedToolCallInformationFunctionCallToolCall)init_logger)TokenizerLike)MistralTokenizer)
ToolParserc                        e Zd Zdef fdZdefdZdedef fdZdedede	fd	Z
d
edededee         dee         dee         dededz  fdZ xZS )Hermes2ProToolParser	tokenizerc                     t                                          |           t          |t                    r&t                              d           |j         _        d _        g  _	        d _
        g  _        d _        d _        t          j        dt          j                   _        t          j        dt          j                   _         j        st'          d           j                             j        d	           _         j                             j        d	           _         fd
 j        D              _         fd j        D              _        d _        d S )Nz4Detected Mistral tokenizer when using a Hermes modelFz<tool_call>z</tool_call>z,<tool_call>(.*?)</tool_call>|<tool_call>(.*)z <scratch_pad>(.*?)</scratch_pad>zUThe model tokenizer must be passed to the ToolParser constructor during construction.)add_special_tokensc                 F    g | ]}j                             |g          S  model_tokenizerdecode.0token_idselfs     x/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/vllm/tool_parsers/hermes_tool_parser.py
<listcomp>z1Hermes2ProToolParser.__init__.<locals>.<listcomp>F   s<     ,
 ,
 ,
  ''
33,
 ,
 ,
    c                 F    g | ]}j                             |g          S r   r   r   s     r    r!   z1Hermes2ProToolParser.__init__.<locals>.<listcomp>K   s<     *
 *
 *
  ''
33*
 *
 *
r"    )super__init__
isinstancer   loggererrorr   r   current_tool_name_sentprev_tool_call_arrcurrent_tool_idstreamed_args_for_tooltool_call_start_tokentool_call_end_tokenrecompileDOTALLtool_call_regexscratch_pad_regex
ValueErrorencodetool_call_start_token_idstool_call_end_token_idstool_call_start_token_arraytool_call_end_token_arraybuffered_delta_text)r   r   	__class__s   ` r    r&   zHermes2ProToolParser.__init__"   s   ###i!122 	7LLOPPP#,#6D ,1#.0$&  	# +8"(6 !z;RY 
  
 "$/"
 "
 # 	3   *.)=)D)D&5 *E *
 *
& (,';'B'B$ (C (
 (
$,
 ,
 ,
 ,
 :,
 ,
 ,
(
*
 *
 *
 *
 8*
 *
 *
&
 $&   r"   
delta_textc                     || j         v s	|| j        v rF|| j         d         k    s|| j        d         k    r| j        }d| _        ||z   S | j        |z   | _        dS | j        r| j        }d| _        ||z   S |S )Nr   r$   )r9   r:   r;   )r   r=   buffered_texts      r    tool_call_delta_bufferz+Hermes2ProToolParser.tool_call_delta_bufferW   s     $:::T;;; d>rBBB!?!CCC $ 8+-($z11+/+Cj+P(r' " $ 8+-($z11!!r"   requestreturnc                 |    t                                          |          }|j        r|j        dk    rd|_        |S )NnoneF)r%   adjust_requesttoolstool_choiceskip_special_tokens)r   rA   r<   s     r    rE   z#Hermes2ProToolParser.adjust_requests   s@    ''((11= 	0W0F:: +0G'r"   model_outputc                    | j         |vrt          dg |          S 	 | j                            |          }d |D             }d |D             }|d |                    | j                            }t          d||r|nd           S # t
          $ r/ t                              d           t          dg |          cY S w xY w)NF)tools_called
tool_callscontentc                 b    g | ],}t          j        |d          r|d          n|d                   -S )r      )jsonloads)r   matchs     r    r!   z;Hermes2ProToolParser.extract_tool_calls.<locals>.<listcomp>   sG     & & & J58AuQxxqBB& & &r"   c                     g | ]B}t          d t          |d         t          j        |d         d                              CS )functionname	argumentsFensure_ascii)rU   rV   )typerT   )r   r   rP   dumps)r   function_calls     r    r!   z;Hermes2ProToolParser.extract_tool_calls.<locals>.<listcomp>   st        & '!-!.v!6&*j -k :' ' '" " "	 	 	  r"   Tz,Error in extracting tool call from response.)r.   r
   r3   findallfind	Exceptionr(   	exception)r   rI   rA   function_call_tuplesraw_function_callsrL   rM   s          r    extract_tool_callsz'Hermes2ProToolParser.extract_tool_calls|   s3    %\99/"r<   
&
 (,';'C'CL'Q'Q$& &!5& & &"  *<  
 ''V):):4;U)V)V'VW3!%)'.8GGD         !OPPP3!&2|     s   A)B 6C ?C previous_textcurrent_textprevious_token_idscurrent_token_idsdelta_token_idsNc           
      x   |                      |          }t          |          t          | j                  k    rH|t          | j                   d          | j        k    r"|d t          | j                            }||z   }t                              d|           t                              d|           | j        |vr*t                              d           t          |          S 	 |                    | j                  }|                    | j                  }	|                    | j                  }
|                    | j                  }d }d }|
|k    r9|	|k    r3| j        |vr*t                              d           t          |          S | j        |v rt                              d           ||z   }|	                    | j                  d         	                    | j                  d         
                                }|	                    | j                  d         
                                }|	                    | j                  d                                         }| j        rt          j        nt          j        t          j         z  }|
|k    r|
|k    rt          |          d	k    r!|	                    | j                  d         }nd }d }d }| xj        d	z  c_        d
| _        | j                            d           t                              d| j                   n|
|k    r*|
|k    r$|	                    | j                  d         }d }n|
|k    rA||	k    r:| j        t          | j                  dk    rt                              d           d S | j        | j                                     d          }|r|t*          u r(|                    d                              d          n|}d|vrd S |                    d          }|d |         dz   }t                              d|           | j        | j        xx         |z  cc<   t          t3          | j        t5          |                              d                    g          S nI|                    | j        d          }|                    | j        d          }t          g |          }|S 	 |rt;          j        |pd|          nd }t                              d|           nj# t:          j        j         j!        $ r t                              d           Y d S tD          j#        j$        $ r t                              d           Y d S w xY w| j        sy|d S |                    d          }|r\d| _        t          t3          | j        dtK                      t5          |                              d                     g          S d S ||t          |          nd }|S t                              d!| j                   t          | j                  | j        k    r| j                            i            | j        | j                                     d          }|                    d          }t                              d"|           t                              d#|           |s!|st                              d$|           d }n|s |rt          &                    d%           d }n|r_|s\|                    d          }tO          j(        d&tO          j)        |          z   d'z   |*                                tN          j+                  }|r|,                    d	          }ntE          j-        |d
(          }t                              d)||           ||vrd S |                    |          t          |          z   }|d |         }t                              d*|           t          t3          | j        t5          |                              d                    g          }| j        | j        xx         |z  cc<   n"|r|r	 tE          j        |           d}n# t\          $ r d
}Y nw xY wt_          |t*                    rat          |
                                          d	k    r<|
                                d         d+k    r|r|
                                d d         }t                              d,|           t          t3          | j        t5          |                              d                    g          }| j        | j        xx         |z  cc<   | j        t          | j                  d	z
  k    r|| j        | j        <   n| j                            |           |S # t\          $ r t          0                    d-           Y d S w xY w).Nzdelta_text: %szdelta_token_ids: %szNo tool call tokens found!)rM   z/Generating text content! skipping tool parsing.z!tool_call_end_token in delta_textr   r   rO   Fr$   zStarting on a new tool %sz/attempting to close tool call, but no tool callrV   zutf-8unicode_escapez"}z@Finishing tool and found diff that had not been streamed yet: %s)rV   T)exclude_none)indexrT   )rL   )rL   rM   z{}zParsed tool call %sz(not enough tokens to parse into JSON yetzunable to parse JSONrU   rT   )rU   )rk   rY   idrT   z,Trying to parse current tool call with ID %szdiffing old arguments: %szagainst new ones: %szSkipping text %s - no argumentszSshould be impossible to have arguments reset mid-call. skipping streaming anything.z\{"name":\s*"z"\s*,\s*"arguments":\s*(.*)rW   zfinding %s in %sz&First tokens in arguments received: %s}zgot diff %sz+Error trying to handle streaming tool call.)1r@   lenr;   r(   debugr.   r   countr/   splitrstriplstripr*   r   ALLSTRr,   r-   appendr+   getstrr6   r   rindexr	   r   
model_dumpreplacepartial_json_parserrQ   core
exceptionsMalformedJSONrP   decoderJSONDecodeErrorr   r)   r0   searchescapestripr2   grouprZ   r^   r'   r_   )r   rc   rd   r=   re   rf   rg   rA   prev_tool_start_countprev_tool_end_countcur_tool_start_countcur_tool_end_counttool_call_portiontext_portion	full_textflagsdeltadiffend_loctextcurrent_tool_callfunction_nameprev_argumentscur_argumentsrR   cur_arguments_jsonargs_delta_start_locarguments_deltais_complete_jsons                                r    extract_tool_calls_streamingz1Hermes2ProToolParser.extract_tool_calls_streaming   sj    00<<
 #d&>"?"???s4#;<<<>>?'( ( **JS1I-J-J,J*JKM(:5L%z222*O<<<%\99LL5666
3333a	 %2$7$78R$S$S!"/"5"5d6N"O"O#/#5#5d6P#Q#Q !-!3!3D4L!M!M $L %(:::'+===,J>>NOOO#J7777':55@AAA(:5	OOD$>??CU4344Q8VXX "
 (--d.FGGJQQSS
)//0HII"MTTVV "&!<XEII%)uyjBXE %'999(+@@@''!++(4(:(:4;U(V(V)%% )-% E# $$)$$.3++2226668$:NOOOO %'999(,AAA %1$6$6t7Q$R$RSU$V!# %(:::&*===*2c$:Q6R6RVW6W6WLL!RSSS4.t/CDHHUU   3;; G,,334DEEE! 
 :--#t(//55G%hwh/$6DLL0  
 /0DEEEMEEE')&*&:):T)J)J)J)U)U15 *V *" *"  $	 	 	 	!: "))$*DbII||D$<bAA$DAAA )'-.?.G4OOO "
 24EFFFF&+6D   GHHHtt</   3444tt .  $,4,=,A,A&,I,I   26D/')&*&:%/#4#6#6):)6*" *" *"",*$*"?"?  	$     4 !(
 $/ !4444 
 
 LL>@T   4*++t/CCC'..r222 "4T5IJNN N .11+>>MLL4nEEELL/??? ! ^P ^P>
KKK # XP~ XP=     OP~ OP !2 5 5f = =	$i../45 &++--I   W).Q&&)-MPU)V)V)V&/=OPPP %7774'9'@'@'L'LsP P ($
 #55J6J5J"KEWWW$%"&"6%6*9& & &(jdj;;	   	 	 	 +D,@AAA_TAAAA  P> P-J0111'+$$  - - -',$$$- z3//:J--//00A55"))++B/366( 7 ",!2!2!4!4SbS!9J]J777$%"&"6%6%L%L%L%W%W-1 &X & &   	 	 	 +D,@AAAZOAAA #s4+B'C'Ca'GGG@Q'(<=='../@AAAL 	 	 	JKKK44	s   -B*h Hh 3Ah Bh 1A	h <6T3 2h 33V&h )-Vh Vh (A2h h 5F?h 6B3h *c  h ch cE h $h98h9)__name__
__module____qualname__r   r&   rx   r@   r   rE   r
   rb   r   intr   r   __classcell__)r<   s   @r    r   r   !   sB       .&- .& .& .& .& .& .&j" " " " "8&; @U      22 '2 
&	2 2 2 2hAA A 	A
 %SMA $C=A "#A 'A 
	A A A A A A A Ar"   r   )rP   collections.abcr   r|   regexr0    partial_json_parser.core.optionsr   vllm.entrypoints.chat_utilsr   0vllm.entrypoints.openai.chat_completion.protocolr   'vllm.entrypoints.openai.engine.protocolr   r   r	   r
   r   r   vllm.loggerr   vllm.tokenizersr   vllm.tokenizers.mistralr   &vllm.tool_parsers.abstract_tool_parserr   r   r(   r   r   r"   r    <module>r      sq    $ $ $ $ $ $         2 2 2 2 2 2 9 9 9 9 9 9                     $ # # # # # ) ) ) ) ) ) 4 4 4 4 4 4      
X		P P P P P: P P P P Pr"   