
    .`i6                     \   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	 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  ee          Z G d	 d
e          Z G d de          Zde j        defdZde j         defdZ!de"de#e"e"f         dz  fdZ$de"dede%de"dedz  f
dZ&dS )    N)Sequence)Any)PreTrainedTokenizerBase)ChatCompletionRequest)DeltaFunctionCallDeltaMessageDeltaToolCallExtractedToolCallInformationFunctionCallToolCall)init_logger)
ToolParserc                       e Zd ZdS )_UnexpectedAstErrorN)__name__
__module____qualname__     w/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/vllm/tool_parsers/olmo3_tool_parser.pyr   r      s        Dr   r   c                        e Zd ZdZ ej        dej                  Zdef fdZ	e
defd            Zej        dedd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 )Olmo3PythonicToolParseray  
    Tool call parser for Olmo 3 models that produce tool calls as
    newline-separated pythonic strings.
    Used when --enable-auto-tool-choice --tool-call-parser pythonic are all set
    Code copied from pythonic_tool_parser.py and updated to handle
    - newline separated pythonic tool calls.
    - argument values being null/true/false instead of Pythonic literals.
    z\[([a-zA-Z]+\w*\(([a-zA-Z]+\w*=.*,\s*)*([a-zA-Z]+\w*=.*\s)?\),\s*)*([a-zA-Z]+\w*\(([a-zA-Z]+\w*=.*,\s*)*([a-zA-Z]+\w*=.*\s*)?\)\s*)+\]	tokenizerc                 J    t                                          |           d S N)super__init__)selfr   	__class__s     r   r   z Olmo3PythonicToolParser.__init__9   s!    #####r   returnc                     | j         S r   current_tool_id)r   s    r   current_tool_indexz*Olmo3PythonicToolParser.current_tool_index=   s    ##r   valueNc                     || _         d S r   r"   )r   r%   s     r   r$   z*Olmo3PythonicToolParser.current_tool_indexA   s    $r   model_outputrequestc                    |}t          j        d|t           j                  }|r'|                    d                                          }d                    d |                                D                       }d| d}d}	 | j                            |t          j
                  d	u}nE# t          $ r8 t                              d
           t                              d|           Y nw xY w|st          dg |          S 	 t!          j        |          }t%          |j        d         dd	          }t)          |t           j                  r?t-          d |j        D                       r!t          dd |j        D             d	          S t1          d          # t2          $ r/ t                              d           t          dg |          cY S w xY w)zH
        Extract the tool calls from a complete model response.
        z&<function_calls>(.*?)</function_calls>   , c                 ^    g | ]*}|                                 |                                 +S r   strip.0lines     r   
<listcomp>z>Olmo3PythonicToolParser.extract_tool_calls.<locals>.<listcomp>T   s-    PPPd4::<<PTZZ\\PPPr   []F)timeoutNz7Regex timeout occurred when matching tool call pattern.z3Regex timeout occurred when matching user input: %s)tools_called
tool_callscontentr   r%   c              3   J   K   | ]}t          |t          j                  V  d S r   
isinstanceastCallr0   es     r   	<genexpr>z=Olmo3PythonicToolParser.extract_tool_calls.<locals>.<genexpr>n   s?       4 4,-
1ch''4 4 4 4 4 4r   Tc                 ,    g | ]}t          |          S r   _handle_single_toolr>   s     r   r2   z>Olmo3PythonicToolParser.extract_tool_calls.<locals>.<listcomp>s   s0           ,A..     r   z,Tool output must be a list of function callsz,Error in extracting tool call from response.)researchDOTALLgroupr.   join
splitlinesTOOL_CALL_REGEXmatchenvs%VLLM_TOOL_PARSE_REGEX_TIMEOUT_SECONDSTimeoutErrorloggerwarningdebugr
   r<   parsegetattrbodyr;   Listalleltsr   	Exception	exception)r   r'   r(   original_model_outputrK   is_tool_call_patternmoduleparseds           r   extract_tool_callsz*Olmo3PythonicToolParser.extract_tool_callsE   sh    !-	5|RY
 
  	2 ;;q>>//11LyyPPl&=&=&?&?PPP
 
 +<***$	$** $*T +    !   	 	 	NNTUUULLE|    	 $ 	/"r;P   	Y|,,FV[^Wd;;F&#(++  4 4174 4 4 1 1  4!%   !'      !    *B    	 	 	KLLL/"r;P     	s+   (B/ /?C10C1	BF! F! !6GGprevious_textcurrent_text
delta_textprevious_token_idscurrent_token_idsdelta_token_idsc                    |                     d          st          |          S 	 |                     d          r|t          d          d          }|                    d          r|d t          d                    }t	          |          }|d S |\  }	}
d                    d |	                                D                       }	d|	 d}	t          j        |	          }t          |j
        d	         d
d           }t          |t          j                  rt          d |j        D                       st          d          d |j        D             }g }t!          |          D ]\  }}|| j        k     r|| _        t          | j                  |k    r| j                            d           |t          |          dz
  k     pd|
v}|r| xj        dz  c_        |s
|
d d         nd}|s|
d         dk    r|dz   }|                    dd          }t+          | j        |         |||          }|G|                    |           |j        +|j        j        | j        |xx         |j        j        z  cc<   |r| j        s
di ig| _        |rt          |          S |
s| j        d	k    rt          d          S d S # t4          $ r8 t6                              d           t6                              d           Y d S w xY w)N<)r8   z<function_calls>z</function_calls>r+   c                 ^    g | ]*}|                                 |                                 +S r   r-   r/   s     r   r2   zHOlmo3PythonicToolParser.extract_tool_calls_streaming.<locals>.<listcomp>   s-    RRR$TZZ\\RRRRr   r3   r4   r   r%   c              3   J   K   | ]}t          |t          j                  V  d S r   r:   r>   s     r   r@   zGOlmo3PythonicToolParser.extract_tool_calls_streaming.<locals>.<genexpr>   s?       ; ;,-
1ch''; ; ; ; ; ;r   z9Tool output must be a sequence of newline-separated callsc                 ,    g | ]}t          |          S r   rB   r>   s     r   r2   zHOlmo3PythonicToolParser.extract_tool_calls_streaming.<locals>.<listcomp>   s0        $A&&  r    r*   )}'"	arguments)r7   z+Error trying to handle streaming tool call.z=Skipping chunk as a result of tool streaming extraction error)
startswithr   lenendswith_make_valid_pythonrH   rI   r<   rR   rS   rT   r;   rU   rV   rW   r   	enumerater$   streamed_args_for_toolappendreplace_compute_tool_deltafunctionrp   prev_tool_call_arrr#   rX   rO   rY   rQ   )r   r_   r`   ra   rb   rc   rd   r(   valid_and_added_text
valid_text
added_textr\   r]   r7   tool_deltasindexnew_callnew_call_completewithheld_suffixdeltas                       r   extract_tool_calls_streamingz4Olmo3PythonicToolParser.extract_tool_calls_streaming   s    &&s++ 	4
3333S	&&'9:: G+C0B,C,C,E,EF$$%899 I+,Gs3F/G/G.G,GH#5l#C#C #+t%9"J
 RR**?*?*A*ARRR J +Z***JYz**FV[^Wd;;Ffch// s ; ;17; ; ; 8 8  *O     J
 K#,Z#8#8 W Wx4222*/'t233u<</66r:::$)C
OOa,?$?$X3jCX!$ 1++q0++9J"R*SbS//PR( <Z^s-B-B&5&;O #2"9"9#s"C"C+/6%  $&&u---2!N4@3E:::en>VV:::  >4#: >,7+<*=' #{;;;; D$81$<$< $B////t 	 	 	JKKKLLO   44	s   A*K HK #K >LL)r   r   r   __doc__rD   compilerF   rJ   r   r   propertyintr$   setterstrr   r
   r^   r   r   r   __classcell__)r   s   @r   r   r   #   sx          !bj 	R
	 O
$"9 $ $ $ $ $ $ $C $ $ $ X$ % % % % % %==*?=	%= = = =~bb b 	b
 %SMb $C=b "#b 'b 
	b b b b b b b br   r   valr    c                 &   t          | t          j                  r| j        S t          | t          j                  rQt          d | j        D                       st          d          d t          | j        | j	                  D             S t          | t          j
                  rd | j        D             S t          | t          j                  r2| j        dv r)| j        dk    rd S | j        dk    rdS | j        d	k    rd
S d S t          d          )Nc              3   J   K   | ]}t          |t          j                  V  d S r   )r;   r<   Constant)r0   ks     r   r@   z'_get_parameter_value.<locals>.<genexpr>   s.      AA1:a..AAAAAAr   z/Dict tool call arguments must have literal keysc                 >    i | ]\  }}|j         t          |          S r   )r%   _get_parameter_value)r0   r   vs      r   
<dictcomp>z(_get_parameter_value.<locals>.<dictcomp>   s9     
 
 
1 G)!,,
 
 
r   c                 ,    g | ]}t          |          S r   )r   )r0   r   s     r   r2   z(_get_parameter_value.<locals>.<listcomp>   s!    :::A$Q'':::r   )nulltruefalser   r   Tr   Fz$Tool call arguments must be literals)r;   r<   r   r%   DictrV   keysr   zipvaluesrU   rW   Nameid)r   s    r   r   r      s4   #s|$$ Jy	C	"	" JAAAAAAA 	Y%&WXXX
 
CHcj11
 
 
 	
 
C	"	" J:::::: 
C	"	" Jsv1J'J'J6V4Vv4Vw5  ""HIIIr   callc           
      .   t          | j        t          j                  st	          d          | j        j        }i }| j        D ]}t          |j                  ||j	        <   t          dt          |t          j        |d                              S )NzInvalid tool call namerz   F)ensure_asciinamerp   )typerz   )r;   funcr<   r   r   r   keywordsr   r%   argr   r   jsondumps)r   function_namerp   keywords       r   rC   rC     s    di** <!":;;;ILMI= E E!5gm!D!D	'+$*YU*S*S*S
 
 
   r   textc                    g }t          |           D ]\  }}|dv r|                    |            |dk    r*|r|                                dk    rt          d          P|dk    r*|r|                                dk    rt          d          |dk    r*|r|                                d	k    rt          d
          |dv r[|r7|d         |k    r+|dk    r| |dz
           dk    r|                                 |r|d         dv r|                    |           |                                 } |                     d          s|                     d          rd S |r[|d         d	k    rO| d |                     d	                   }|                    d          }|                    d          }||k    rd S |r[|d         dk    rO| d |                     d                   }|                    d          }|                    d          }	||	k    rd S |                     d          r
| d d         } |r8|d         dk    r,|                     d          s|                     d          sd S d}
t          |          D ]=}|dk    r|
dz  }
|dk    r|
dz  }
|d	k    r|
dz  }
&|dk    r|
dz  }
2|dk    r|
dz  }
>| |
z   |
fS )N>   {(r3   r4   r3   zMismatched square bracketsrk   r   zMismatched parenthesesrm   r   zMismatched curly braces>   ro   rn   rl   r   r*   \=:,rj   rn   ro   )	ru   rw   popr   rstriprs   rfindcountreversed)r   bracket_stackr   chartrailing_dict_textnum_keys
num_valuestrailing_params_textnum_full_param_namesnum_full_param_valuesr~   s              r   rt   rt     s   M  + +t?""  &&&&S[[  HM$5$5$7$73$>$>)*FGGG %?S[[  DM$5$5$7$73$>$>)*BCCC %?S[[  EM$5$5$7$73$>$>)*CDDD %?Z 
+r!2d!:!:199eaiD!8!8!%%'''' +=#4
#B#B$$T***;;==D}}S T]]3//  t r*c11!"3DJJsOO"34%++C00'--c22
z!!4 r*c11#$5djjoo$56399#>> 4 : :3 ? ?#8884}}S CRCy"$$c"" %c"" % tJ'' 
 
3;;#JJS[[#JJS[[#JJS[[#JJS[[#J*j((r   previously_sent_argsr   r   r   c           	      X   |j         j        }|r/|                    |          sJ |d t          |                    }| s1t	          |j        d|t          |j         j        |                    S |t          |           d          }|r t	          d |t          |                    nd S )Nrz   r   )r   r   r   rz   )rp   )r   r   rz   )rz   rp   rs   rr   r	   r   r   r   )r   r   r   r   new_call_argsarg_diffs         r   ry   ry   W  s     %/M ?%%o66666%&=_)=)=(=&=> 	
{&&+'  	
 
 
 	
 S!566889H
 	5+<x+P+P+P	
 	
 	
 	
 r   )'r<   r   collections.abcr   typingr   regexrD   transformersr   	vllm.envsrL   0vllm.entrypoints.openai.chat_completion.protocolr   'vllm.entrypoints.openai.engine.protocolr   r   r	   r
   r   r   vllm.loggerr   &vllm.tool_parsers.abstract_tool_parserr   r   rO   rX   r   r   exprr   r=   rC   r   tuplert   r   ry   r   r   r   <module>r      sJ   


  $ $ $ $ $ $           0 0 0 0 0 0                           $ # # # # #      
X			 	 	 	 	) 	 	 	C C C C Cj C C CLJch J3 J J J J2ch 8    C)S C)U38_t%; C) C) C) C)L)1:=PST     r   