
    .`iJ(                         d dl Z d dlm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mZmZ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)
ToolParser)consume_spacefind_common_prefixis_complete_jsonpartial_json_loadsc                        e Zd ZdZ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 )GraniteToolParserz
    Tool call parser for the granite 3.0 models. Intended
    for use with the examples/tool_chat_template_granite.jinja
    template.

    Used when --enable-auto-tool-choice --tool-call-parser granite
    are all set
    	tokenizerc                 f    t                                          |           d| _        d| _        d S )Nz<|tool_call|>z<tool_call>)super__init__	bot_token
bot_string)selfr   	__class__s     y/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/vllm/tool_parsers/granite_tool_parser.pyr   zGraniteToolParser.__init__/   s-    ###('    model_outputrequestreturnc                    |                                                     | j                                      | j                                                  }|r|d         dk    rt          dg |          S 	 t          j        |          }t          |t                    st          dt          |                     t                              dt          |                     d |D             }t          d|d           S # t          $ r7}t                              d	|           t          dg |          cY d }~S d }~ww xY w)
Nr   [F)tools_called
tool_callscontentzExpected dict or list, got zExtracted %d tool callsc                     g | ]B}t          d t          |d         t          j        |d         d                              CS )functionname	argumentsFensure_ascii)r*   r+   )typer)   )r   r   jsondumps).0function_calls     r   
<listcomp>z8GraniteToolParser.extract_tool_calls.<locals>.<listcomp>K   st        " #)*62"&*)+6U# # #  	 	 	  r   Tz.Error in extracting tool call from response %s)stripremoveprefixr   r   lstripr
   r/   loads
isinstancelist	Exceptionr.   loggerdebuglenerror)r   r    r!   strippedraw_function_callsr&   es          r   extract_tool_callsz$GraniteToolParser.extract_tool_calls6   s      \$.))\$/**VXX	 	  	8A;#--/"r<    	!%H!5!50$77 L$7I2J2JLL   LL2C8J4K4KLLL  &8  J 0!%     	 	 	LLI1MMM/"r<        	s   8BD 
E,E<EEprevious_textcurrent_text
delta_textprevious_token_idscurrent_token_idsdelta_token_idsNc           
      &
   t          d|          }||d                              | j                  r%t          |t          | j                  z   |          }||d                              | j                  r%t          |t          | j                  z   |          }|r|t          |          k    s||         dk    rt          |          S | j        rt          j        nt          j        t          j	         z  }		 d }
d }	 t          ||d          |	          \  }}t          |          t          u r|}
nt          |          S dgt          |          z  }t          ||||z                      sd|d<   n:# t          j        j        j        $ r t$                              d           Y d S w xY w|
sd S |
| j                 }d }t          |
          | j        dz   k    r7| j        dk    r|                    d	          }|rt-          j        |d
          }t          | j        | j                           }||d          }t$                              d|           t          t3          | j        t5          |                              d                    g          }| j        | j        xx         |z  cc<   t          |
          dz
  | _        d| _        | j                            d           t$                              d| j                   |S | j        su|                    d          }|r\t          t3          | j        dt;                      t5          |                              d                    g          }d| _        n'|                    d	          }|rt          | j        | j                           }t-          j        |d
          }| j        | j                                     d	          }d }|| j                 r||d          }n8|r6t-          j        |d
          }||k    rt?          ||          }||d          }|at          t3          | j        t5          |                              d                    g          }| j        | j        xx         |z  cc<   |
| _        |S # t@          $ r@}t$          !                    d|           t$                              d           Y d }~d S d }~ww xY w)Nr   r$   )r'   TFz(not enough tokens to parse into JSON yet   r+   r,   zgot arguments diff: %s)r+   )exclude_none)indexr)   )r&    zstarting on new tool %dr*   r)   )r*   )rM   r.   idr)   z.Error trying to handle streaming tool call: %sz=Skipping chunk as a result of tool streaming extraction error)"r   
startswithr   r=   r   r   current_tool_name_sentr   ALLSTRr   r.   r9   r   partial_json_parsercore
exceptionsMalformedJSONr;   r<   current_tool_idgetr/   r0   streamed_args_for_toolr	   r   
model_dumpappendr   prev_tool_call_arrr   r:   r>   )r   rC   rD   rE   rF   rG   rH   r!   	start_idxflagstool_call_arris_completer&   end_idxcurrent_tool_calldeltacur_argumentscur_args_jsonsentargument_difffunction_nameprev_argumentsprev_args_jsonprefixrA   s                            r   extract_tool_calls_streamingz.GraniteToolParser.extract_tool_calls_streaminge   s    "!\22		

#..t~>> 	U%i#dn2E2E&E|TTI	

#..t?? 	V%i#do2F2F&FUUI	4C----I&#--
3333 "8T		ei59*>T	 MK&8 ,e' '#
G 
##t++$.MM'
;;;;#fs:6'YWAT5T(UVV ,&+KO&+6D   GHHHtt ! t '4D4H&IE =!!D$81$<<<
 '1,,$5$9$9+$F$FM$ (,
=u(U(U(U"4#>t?S#TUU(5dee(<%=}MMM , -*.*>->2?.& .& .&&0jdj&C&C	!" !" !"(	! 	! 	! 3D4HIII)III
 (+='9'9A'=$.3++22266668LMMM 0 3 1 5 5f = =  7()&*&:%/#4#6#6):)6*" *" *"",*$*"?"?  	$  E 37D/
 !2 5 5k B B  t:4;OPQQD$(J}5$Q$Q$QM%)%<T=Q%R%V%V#& &N %)M"4#78 :(5dee(<' :)-NQV)W)W)W(N::%7%V%VF,2455MM$0 , -*.*>->2?.& .& .&&0jdj&C&C	!" !" !"(	! 	! 	! 3D4HIII)III '4D#L 	 	 	LLI1MMMLLO   44444	sQ   >S AE: 2E: 9S :3F1-S 0F11S 8E!S F+S 
T5TT)__name__
__module____qualname____doc__r   r   strr   r
   rB   r   intr   rm   __classcell__)r   s   @r   r   r   %   s         (- ( ( ( ( ( (--*?-	%- - - -^ZZ Z 	Z
 %SMZ $C=Z "#Z 'Z 
	Z Z Z Z Z Z Z Zr   r   )r/   collections.abcr   rT    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.tool_parsers.abstract_tool_parserr   vllm.tool_parsers.utilsr   r   r   r   rn   r;   r    r   r   <module>r      s    $ $ $ $ $ $     2 2 2 2 2 2 9 9 9 9 9 9                     $ # # # # # ) ) ) ) ) )                 
X		Z Z Z Z Z
 Z Z Z Z Zr   