
    .`iJ&                         d dl Z d dlZd dl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 d dlmZmZ d dlmZ d d	l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          Z G d d          Z dS )    N)CallableSequence)cached_property)"ResponseFormatTextJSONSchemaConfig)ChatCompletionRequest)DeltaMessageExtractedToolCallInformation)ResponsesRequestResponseTextConfig)init_logger)StructuredOutputsParams)TokenizerLike)get_json_schema_from_tools)
is_list_of)import_from_pathc                       e Zd ZdZdefdZedeee	f         fd            Z
dede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dS )
ToolParserz
    Abstract ToolParser class that should not be used directly. Provided
    properties and methods should be used in
    derived classes.
    	tokenizerc                 L    g | _         d| _        d| _        g | _        || _        d S )NF)prev_tool_call_arrcurrent_tool_idcurrent_tool_name_sentstreamed_args_for_toolmodel_tokenizer)selfr   s     z/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/vllm/tool_parsers/abstract_tool_parser.py__init__zToolParser.__init__)   s0    .0$&,1#13#(    returnc                 4    | j                                         S N)r   	get_vocab)r   s    r   vocabzToolParser.vocab2   s     #--///r   requestc                 @   |j         s|S t          |j        |j                   }|wt          |t                    rt          |          |_        d|_        t          |t                    r1t                      |_
        t          d|ddd          |j
        _        |S )	zK
        Static method that used to adjust the request parameters.
        )tool_choicetoolsN)jsontool_calling_responsejson_schemaz Response format for tool callingT)nameschematypedescriptionstrict)r(   r   r'   
isinstancer   r   structured_outputsresponse_formatr
   r   textr   format)r   r%   json_schema_from_tools      r   adjust_requestzToolParser.adjust_request8   s     } 	N :+7=!
 !
 !
 !,'#899 / .E.. . .* +/''#344 133&H00& B' ' '# r   model_outputc                      t          d          )a,  
        Static method that should be implemented for extracting tool calls from
        a complete model-generated string.
        Used for non-streaming responses where we have the entire model response
        available before sending to the client.
        Static because it's stateless.
        z?AbstractToolParser.extract_tool_calls has not been implemented!NotImplementedError)r   r8   r%   s      r   extract_tool_callszToolParser.extract_tool_callsV   s     "M
 
 	
r   previous_textcurrent_text
delta_textprevious_token_idscurrent_token_idsdelta_token_idsNc                      t          d          )av  
        Instance method that should be implemented for extracting tool calls
        from an incomplete response; for use when handling tool calls and
        streaming. Has to be an instance method because  it requires state -
        the current tokens/diffs, but also the information about what has
        previously been parsed and extracted (see constructor)
        zIAbstractToolParser.extract_tool_calls_streaming has not been implemented!r:   )r   r=   r>   r?   r@   rA   rB   r%   s           r   extract_tool_calls_streamingz'ToolParser.extract_tool_calls_streamingd   s    " "W
 
 	
r   )__name__
__module____qualname____doc__r   r   r   dictstrintr$   r   r7   r	   r<   r   r   rD    r   r   r   r   "   s+        )- ) ) ) ) 0tCH~ 0 0 0 _0
&; @U    <

*?
	%
 
 
 


 
 	

 %SM
 $C=
 "#
 '
 
	
 
 
 
 
 
r   r   c                      e Zd ZU dZi Zeeee         f         e	d<   i Z
eeeeef         f         e	d<   ededee         fd            Zededee         fd            Ze	 	 dd
ee         deee         z  dz  deddfd            Zededededdfd            Ze	 	 	 ddeee         z  dz  ded
ee         dz  dee         eee         gee         f         z  fd            Zedee         fd            Zededdfd            ZdS )ToolParserManagerz
    Central registry for ToolParser implementations.

    Supports two modes:
      - Eager (immediate) registration via `register_module`
      - Lazy registration via `register_lazy_module`
    tool_parserslazy_parsersr,   r    c                     || j         v r| j         |         S || j        v r|                     |          S t          d| d          )z
        Retrieve a registered or lazily registered ToolParser class.

        If the parser is lazily registered,
        it will be imported and cached on first access.
        Raises KeyError if not found.
        zTool parser 'z' not found.)rO   rP   _load_lazy_parserKeyError)clsr,   s     r   get_tool_parserz!ToolParserManager.get_tool_parser   s\     3####D))3###((...9t999:::r   c                 8   | j         |         \  }}	 t          j        |          }t          ||          }t	          |t
                    st          | d| d          || j        |<   |S # t          $ r#}t          
                    d|||            d}~ww xY w)z+Import and register a lazily loaded parser.z in z is not a ToolParser subclass.z2Failed to import lazy tool parser '%s' from %s: %sN)rP   	importlibimport_modulegetattr
issubclassr   	TypeErrorrO   	Exceptionlogger	exception)rT   r,   module_path
class_namemod
parser_clses          r   rR   z#ToolParserManager._load_lazy_parser   s     #&"24"8Z	)+66C j11Jj*55 !RR{RRR   &0CT" 	 	 	D	   	s   AA, ,
B6BBNTmodulemodule_nameforcec                    t          |t                    st          dt          |                     ||j        }t          |t                    r|g}n't          |t                    r|}nt          d          |D ]=}|s/|| j        v r&| j        |         }t          | d|j
                   || j        |<   >dS )z(Register a ToolParser class immediately.z/module must be subclass of ToolParser, but got Nz,module_name must be str, list[str], or None.z is already registered at )rZ   r   r[   r.   rE   r1   rJ   r   rO   rS   rF   )rT   rd   re   rf   module_namesr,   existeds          r   _register_modulez"ToolParserManager._register_module   s     &*-- 	P$v,,PP    /Kk3'' 	L'=LLS)) 	L&LLJKKK  	, 	,D XTS%555*40$VV'BTVVWWW%+CT""		, 	,r   r_   r`   c                     ||f| j         |<   dS )a  
        Register a lazy module mapping.

        Example:
            ToolParserManager.register_lazy_module(
                name="kimi_k2",
                module_path="vllm.tool_parsers.kimi_k2_parser",
                class_name="KimiK2ToolParser",
            )
        N)rP   )rT   r,   r_   r`   s       r   register_lazy_modulez&ToolParserManager.register_lazy_module   s     #.z!:r   c                      t          |t                    st          dt          |                     |                     ||           |S dt          t
                   dt          t
                   f fd}|S )a)  
        Register module immediately or lazily (as a decorator).

        Usage:
            @ToolParserManager.register_module("kimi_k2")
            class KimiK2ToolParser(ToolParser):
                ...

        Or:
            ToolParserManager.register_module(module=SomeToolParser)
        z!force must be a boolean, but got N)rd   re   rf   objr    c                     | j         }| j        }t          t                    rg}nt	          t                    r}n|g}|D ]}||fj        |<   | S r"   )rF   rE   r1   rJ   r   rP   )rn   r_   r`   namesnrT   r,   s        r   
_decoratorz5ToolParserManager.register_module.<locals>._decorator   sz    .KJ$$$ %!js&;&;!# @ @'2J&? ##Jr   )r1   boolr[   r.   rj   r   )rT   r,   rf   rd   rr   s   ``   r   register_modulez!ToolParserManager.register_module   s    $ %&& 	OMUMMNNN   D NNNM	D, 	j1A 	 	 	 	 	 	 	" r   c                     t          t          | j                                                  t          | j                                                  z            S )z?Return names of all eagerly and lazily registered tool parsers.)sortedsetrO   keysrP   )rT   s    r   list_registeredz!ToolParserManager.list_registered  sE     c#*//1122S9I9N9N9P9P5Q5QQRRRr   plugin_pathc                    t           j                            t           j                            |                    d         }	 t	          ||           dS # t
          $ r  t                              d||           Y dS w xY w)z6Import a user-defined parser file from arbitrary path.r   z#Failed to load module '%s' from %s.N)ospathsplitextbasenamer   r\   r]   r^   )rT   rz   re   s      r   import_tool_parserz$ToolParserManager.import_tool_parser  s     g&&rw'7'7'D'DEEaH	[+66666 	 	 	5{K     	s   A &B ?B )NT)NTN)rE   rF   rG   rH   rO   rI   rJ   r.   r   __annotations__rP   tupleclassmethodrU   rR   listrs   rj   rl   r   rt   ry   r   rL   r   r   rN   rN   z   sV          13L$sD,,-222/1L$sE#s(O+,111;3 ;4
+; ; ; ; [;  S T*-=    [*  /3	, ,Z , 49_t+, 	,
 
, , , [,8 ; ;# ;3 ;SW ; ; ; [;  (,*.	+ +DIo$+ + Z 4'	+
 
j	Hd:&6%7j9I%IJ	J+ + + [+Z SS	 S S S [S 	S 	T 	 	 	 [	 	 	r   rN   )!rW   r|   collections.abcr   r   	functoolsr   >openai.types.responses.response_format_text_json_schema_configr   0vllm.entrypoints.openai.chat_completion.protocolr   'vllm.entrypoints.openai.engine.protocolr   r	   *vllm.entrypoints.openai.responses.protocolr
   r   vllm.loggerr   vllm.sampling_paramsr   vllm.tokenizersr   vllm.tool_parsers.utilsr   vllm.utils.collection_utilsr   vllm.utils.import_utilsr   rE   r]   r   rN   rL   r   r   <module>r      s       				 . . . . . . . . % % % % % %      S R R R R R               $ # # # # #      * ) ) ) ) ) > > > > > > 2 2 2 2 2 2 4 4 4 4 4 4	X		U
 U
 U
 U
 U
 U
 U
 U
p[ [ [ [ [ [ [ [ [ [r   