
    .`ia                        d dl Z d dlZd dlZ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 d dlmZ d d	l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! d dl"m#Z# d dl$m%Z% d dl&m'Z'm(Z(m)Z) d dl*m+Z+ d dl,m-Z-m.Z.m/Z/ d dl0m1Z1 d dl2m3Z3 d dl4m5Z5 d dl6m7Z7 d dl8m9Z9 d dl:m;Z; d dl<m=Z= erd dl>m?Z?  ej@        eA          ZBddddZCdeDd eDfd!ZE G d" d#          ZF G d$ d%e          ZGd&ed'ejH        d eIe         fd(ZJ G d) d*eG          ZK G d+ d,eG          ZL G d- d.eG          ZM G d/ d0eM          ZNdS )1    N)ABCabstractmethod)Callable)AsyncExitStackreplace)TYPE_CHECKINGUnion)"ResponseFunctionToolCallOutputItem)Mcp)AuthorMessageRoleStreamStateTextContent)envs)ChatTemplateContentFormatOption)
MCP_PREFIX)Tool)
ToolServer)FunctionCall)get_encoding#get_streamable_parser_for_assistantrender_for_completion)'get_responses_parser_for_simple_context)ResponseInputOutputItemResponseRawMessageAndTokenResponsesRequest)construct_tool_dicts)RequestOutput)ReasoningParser)RendererLike)TokenizerLike)
ToolParser)random_uuid)ClientSessionweb_search_previewcode_interpreter	container)browserpythonr)   	tool_namereturnc                     | t           vrAd                    t                                                     }t          d|  d|           t           |          S )Nz, zBuilt-in tool name 'z+' not defined in mapping. Available tools: )_TOOL_NAME_TO_TYPE_MAPjoinkeys
ValueError)r,   available_toolss     }/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/vllm/entrypoints/openai/responses/context.py_map_tool_name_to_tool_typer5   B   si    ...))$:$?$?$A$ABB29 2 2 /2 2
 
 	
 "),,    c                   H    e Zd ZdZ	 	 	 	 ddededededdf
d	Zdd
ZddZdS )TurnMetricszATracks token and toolcall details for a single conversation turn.r   input_tokensoutput_tokenscached_input_tokenstool_output_tokensr-   Nc                 >    || _         || _        || _        || _        d S Nr9   r:   r;   r<   )selfr9   r:   r;   r<   s        r4   __init__zTurnMetrics.__init__O   s*     )*#6 "4r6   c                 >    d| _         d| _        d| _        d| _        dS )zReset counters for a new turn.r   Nr?   r@   s    r4   resetzTurnMetrics.reset[   s(    #$ "#r6   c                 N    t          | j        | j        | j        | j                  S )z*Create a copy of this turn's token counts.)r8   r9   r:   r;   r<   rC   s    r4   copyzTurnMetrics.copyb   s,    $#	
 
 	
r6   )r   r   r   r   r-   N)r-   r8   )__name__
__module____qualname____doc__intrA   rD   rF    r6   r4   r8   r8   L   s        KK #$"#
5 
5
5 
5 !	
5
  
5 

5 
5 
5 
5$ $ $ $
 
 
 
 
 
r6   r8   c                      e Zd Zededdfd            Zedd            Zedee         fd            Z	ede
fd            Zedee         fd            Zed	edz  d
ededeeef         ddf
d            Zedd            ZdS )ConversationContextoutputr-   Nc                     d S r>   rM   r@   rP   s     r4   append_outputz!ConversationContext.append_outputm       r6   c                     d S r>   rM   rR   s     r4   append_tool_outputz&ConversationContext.append_tool_outputq   rT   r6   c                 
   K   d S r>   rM   rC   s    r4   	call_toolzConversationContext.call_toolu   s      r6   c                     d S r>   rM   rC   s    r4   need_builtin_tool_callz*ConversationContext.need_builtin_tool_cally   rT   r6   c                     d S r>   rM   rC   s    r4   r   z)ConversationContext.render_for_completion}   rT   r6   tool_server
exit_stack
request_id	mcp_toolsc                 
   K   d S r>   rM   r@   r\   r]   r^   r_   s        r4   init_tool_sessionsz&ConversationContext.init_tool_sessions   s       	r6   c                 $   K   t          d          NzShould not be called.NotImplementedErrorrC   s    r4   cleanup_sessionz#ConversationContext.cleanup_session   s      !"9:::r6   rG   )rH   rI   rJ   r   r    rS   rV   listr   rX   boolrZ   rL   r   r   r   strdictr   rb   rg   rM   r6   r4   rO   rO   l   sZ       M d    ^    ^ g    ^     ^ tCy    ^ $& # 	
 S> 
   ^ ; ; ; ^; ; ;r6   rO   last_msgec                     dt          |           d}t          |          }t          t          j        | j                  }t          ||gt          j        | j                  gS )z:
    Creates an error message when json parse failed.
    z&Error parsing tool arguments as JSON: zE. Please ensure the tool call arguments are valid JSON and try again.textrolenameauthorcontent	recipientchannel)	rj   r   r   r   TOOLrw   r   	ASSISTANTrx   )rl   rm   	error_msgrv   ru   s        r4   !_create_json_parse_error_messagesr|      s    	NQ 	N 	N 	N  y)))G);<<<FIn$		
 	
 	
 r6   c            
           e Zd ZdZd ZddZededz  fd            ZddZ	de
fdZdee         fd	Zdee         fd
Zdedz  dededeeef         ddf
dZddZdS )SimpleContextz3This is a context that cannot handle MCP tool callsc                     d | _         d| _        g | _        g | _        d| _        d| _        d| _        d| _        g | _        g | _	        g | _
        d S N r   )last_output_accumulated_text_accumulated_token_ids_accumulated_logprobsnum_prompt_tokensnum_output_tokensnum_cached_tokensnum_reasoning_tokensall_turn_metricsinput_messagesoutput_messagesrC   s    r4   rA   zSimpleContext.__init__   sb     ')13#+-"!"!"!"$%! "@BACr6   r-   Nc                    || _         t          |t                    st          d          t	          |j        pg           | _        |j        pd| _        | xj        t	          |j	        d         j
        pg           z  c_        |j	        d         }| xj        |j        z  c_        | j                            |j
                   |j        | j                            |j                   t	          | j                  dk    r;|j        pd}|j        pg }| j                            t)          ||                     | j                            t)          |j        |j
                             d S )Nz*SimpleContext only supports RequestOutput.r   r   messagetokens)r   
isinstancer    r2   lenprompt_token_idsr   r   r   outputs	token_idsr   rp   r   extendlogprobsr   r   promptappendr   r   )r@   rP   delta_outputoutput_promptoutput_prompt_token_idss        r4   rS   zSimpleContext.append_output   s   !&-00 	KIJJJ!$V%<%B!C!C!'!9!>Q#fnQ&7&A&GR"H"HH ~a(,"33#**<+ABBB ,&--l.CDDDt"##q(("M/RM&,&=&C#&&*)2     	##&$)#-  	
 	
 	
 	
 	
r6   c                    | j         | j         j        rt          | j         t                    sJ t	          j        | j                   }d | j         j        D             |_        | j        |j        d         _        t          | j                  |j        d         _	        | j
        r| j
        |j        d         _        |S | j         S )z?Return the final output, with complete text/token_ids/logprobs.Nc                 ,    g | ]}t          |          S rM   r   ).0items     r4   
<listcomp>z.SimpleContext.final_output.<locals>.<listcomp>   s    #W#W#WdGDMM#W#W#Wr6   r   )r   r   r   r    rF   r   rp   tupler   r   r   r   )r@   final_outputs     r4   r   zSimpleContext.final_output   s     'D,<,D'd.>>>>>9T%566L#W#Wd>N>V#W#W#WL +/+AL #(05d6Q0R0RL #-) N373M$Q'0r6   c                      t          d          rd   re   rR   s     r4   rV   z SimpleContext.append_tool_output       !"9:::r6   c                     dS )NFrM   rC   s    r4   rZ   z$SimpleContext.need_builtin_tool_call   s    ur6   c                 $   K   t          d          rd   re   rC   s    r4   rX   zSimpleContext.call_tool         !"9:::r6   c                      t          d          rd   re   rC   s    r4   r   z#SimpleContext.render_for_completion   r   r6   r\   r]   r^   r_   c                 
   K   d S r>   rM   ra   s        r4   rb   z SimpleContext.init_tool_sessions   s       	r6   c                 $   K   t          d          rd   re   rC   s    r4   rg   zSimpleContext.cleanup_session   r   r6   rG   )rH   rI   rJ   rK   rA   rS   propertyr    r   rV   ri   rZ   rh   r   rX   rL   r   r   r   rj   rk   r   rb   rg   rM   r6   r4   r~   r~      s>       ==D D D&
 
 
 
>  md2       X ; ; ; ;    ;g ; ; ; ;;tCy ; ; ; ;$& # 	
 S> 
   ; ; ; ; ; ;r6   r~   c                      e Zd Zdee         dedeegef         dz  de	dee
         dz  deegef         dz  de
dz  d	efd
ZdeddfdZdee         ddfdZdefdZdedef         dedee         fdZdedef         dedee         fdZdedef         dedee         fdZdee         fdZd Zdedz  dede
dee
ef         fdZ ddZ!dS )ParsableContextresponse_messagesrendererreasoning_parser_clsNrequestr3   tool_parser_clschat_templatechat_template_content_formatc                   d| _         d| _        d| _        d| _        g | _        |t          d          |                                }	t          |	||||          | _        || _	        || _
        || _        |	| _        |pg | _        i | _        t                      | _        t#          |j        |j                  | _        || _        || _        g | _        g | _        d S )Nr   z&reasoning_parser_cls must be provided.)	tokenizerr   r   r   r   )r   r   r   r   r   r2   get_tokenizerr   parserr   r   r   r   r3   _tool_sessionssetcalled_toolsr   toolstool_choice
tool_dictsr   r   r   r   )
r@   r   r   r   r   r3   r   r   r   r   s
             r4   rA   zParsableContext.__init__  s     "#!"!"$%!35'EFFF**,,	=!5/+
 
 
  / ".4"?A&)ee.w}g>QRR*,H)@BACr6   rP   r-   c                    t          |j        pg           | _        |j        pd| _        | xj        t          |j        d         j        pg           z  c_        | j                            |j        d                    | j	        j
        r|j        pd}|j        pg }t          | j                  dk    r*| j                            t          ||                     n)| j                            t          ||                     | j                            t          |j        d         j        |j        d         j                             d S d S )Nr   r   r   )r   r   r   r   r   r   r   r   processr   enable_response_messagesr   r   r   r   r   rp   )r@   rP   r   r   s       r4   rS   zParsableContext.append_output3  s{   !$V%<%B!C!C!'!9!>Q#fnQ&7&A&GR"H"HHFN1-... <0 	"M/RM&,&=&C#4&''1,,#**. -6      $++. -6      ''*"N1-2!>!,6      #	 	r6   c                 D    | j         j                            |           d S r>   )r   r   r   rR   s     r4   rV   z"ParsableContext.append_tool_outputR  s!    %,,V44444r6   c                     | j         j        d         }|j        dk    r%|j        dv s|j                            d          rdS dS )z2Return true if the last message is a MCP tool callfunction_call)r(   r+   r'   r)   TF)r   r   typers   
startswith)r@   last_messages     r4   rZ   z&ParsableContext.need_builtin_tool_callU  s[    {4R8//  %   "--k::	
 tur6   tool_sessionr&   rl   c                   K   | j                             d           t          |t                    r|                    |            d {V S t          j        |j                  }d|d         i}|                    d|           d {V }|j	        d         j
        }t          dt                       ddt                       |d          }|gS )	Nr+   coder   mcpo_function_call_outputcall_	completedidr   call_idrP   status)r   addr   r   get_result_parsable_contextjsonloads	argumentsrX   rv   rp   r   r%   )r@   r   rl   argsparamresult
result_strr   s           r4   call_python_toolz ParsableContext.call_python_toolc  s       	h'''lD)) 	H%AA$GGGGGGGGGz(,--DL
 $--h>>>>>>>>^A&+
4&{}}&&'+KMM++
 
 
 yr6   c                 8  K   | j                             d           t          |t                    r|                    |            d {V S t
          j        rG	 t          j        |j	                  }nE# t          j
        $ r}t          ||          cY d }~S d }~ww xY wt          j        |j	                  }|                    d|           d {V }|j        d         j        }t          dt!                       ddt!                       |d          }|gS )	Nr*   searchr   fco_r   r   r   r   r   r   r   r   r   r   $VLLM_TOOL_JSON_ERROR_AUTOMATIC_RETRYr   r   r   JSONDecodeErrorr|   rX   rv   rp   r   r%   r@   r   rl   r   rm   r   r   r   s           r4   call_search_toolz ParsableContext.call_search_toolz  sQ      	i(((lD)) 	H%AA$GGGGGGGGG4 	2Fz("455' F F F81EEEEEEEEF :h011D#--h========^A&+
4%kmm%%'+KMM++
 
 
 y   A4 4BBBBc                 8  K   | j                             d           t          |t                    r|                    |            d{V S t
          j        rG	 t          j        |j	                  }nE# t          j
        $ r}t          ||          cY d}~S d}~ww xY wt          j        |j	                  }|                    d|           d{V }|j        d         j        }t          dt!                       ddt!                       |d	          }|gS )
  
        Call container tool. Expect this to be run in a stateful docker
        with command line terminal.
        The official container tool would at least
        expect the following format:
        - for tool name: exec
            - args:
                {
                    "cmd":List[str] "command to execute",
                    "workdir":optional[str] "current working directory",
                    "env":optional[object/dict] "environment variables",
                    "session_name":optional[str] "session name",
                    "timeout":optional[int] "timeout in seconds",
                    "user":optional[str] "user name",
                }
        r)   Nexecr   r   r   r   r   r   r   r   s           r4   call_container_toolz#ParsableContext.call_container_tool  sQ     & 	k***lD)) 	H%AA$GGGGGGGGG4 	2Fz("455' F F F81EEEEEEEEF :h011D#--fd;;;;;;;;^A&+
4%kmm%%'+KMM++
 
 
 yr   c                   K   | j         j        sg S | j         j        d         }t           t                       |_        || j         j        d<   |j        dk    r'|                     | j        d         |           d {V S |j        dk    r'|                     | j        d         |           d {V S |j        	                    d          r'| 
                    | j        d         |           d {V S g S )Nr   r(   r+   r'   r*   r)   )r   r   r   r%   r   rs   r   r   r   r   r   )r@   rl   s     r4   rX   zParsableContext.call_tool  s*     {, 	I;04#4[]]44,4%b)=.....t/B8/LhWWWWWWWWW]222..t/B9/MxXXXXXXXXX]%%k22 	11#K0(         	r6   c                      t          d          rd   re   rC   s    r4   r   z%ParsableContext.render_for_completion  r   r6   r\   r]   r^   r_   c                 &  K   |r| j         D ]}|| j        v rt          |          }||v r||         j        nd }|                    |                    |||                     d {V }|| j        |<   |                    | j                   d S d S r>   r3   r   r5   headersenter_async_contextnew_sessionpush_async_exitrg   	r@   r\   r]   r^   r_   r,   	tool_typer   r   s	            r4   rb   z"ParsableContext.init_tool_sessions  s        	A!1 A A	 3337	BB	4=4J4JIi(00PT  &0%C%C++Iz7KK& &             2>#I.**4+?@@@@	A 	AA Ar6   c                 `    K   d t          j         fd j        D               d{V  dS )(Can be used as coro to used in __aexit__c                   K   t          | t                    spt                              d| j                   t          j        t                    5  |                     di            d {V  d d d            d S # 1 swxY w Y   d S d S NzCleaning up tool session for %srg   	r   r   loggerinfo_client_info
contextlibsuppress	ExceptionrX   r   s    r4   cleanup_tool_sessionz=ParsableContext.cleanup_session.<locals>.cleanup_tool_session        lD11 H5|7P    (33 H H&001BBGGGGGGGGGH H H H H H H H H H H H H H H H H H	H H   A;;A?A?c              3   D   K   | ]} j         |                   V  d S r>   r   r   toolr  r@   s     r4   	<genexpr>z2ParsableContext.cleanup_session.<locals>.<genexpr>  J         %$T%8%>??     r6   Nasynciogatherr   r@   r   kwargsr  s   `  @r4   rg   zParsableContext.cleanup_session        	H 	H 	H n     -  
 	
 	
 	
 	
 	
 	
 	
 	
 	
r6   rG   )"rH   rI   rJ   rh   r   r"   r   r#   r!   r   rj   r$   r   rA   r    rS   rV   ri   rZ   r
   r   r   r   r   r   r   rX   r   r   r   rk   r   rb   rg   rM   r6   r4   r   r     sf       -D   78-D 	-D
 ''GH4O-D "-D cT)-D "=/:"=>E-D Tz-D 'F-D -D -D -D^M d    >5.E)F 54 5 5 5 5    !/4"78DP	%	&   .!/4"78DP	%	&   4)!/4"78)DK)	g) ) ) )V&=!>    "; ; ;A$&A #A 	A
 S>A A A A,
 
 
 
 
 
r6   r   c            
          e Zd Zdedee         fdZd ZdeddfdZdee	         ddfd	Z
deddfd
ZdedefdZedefd            ZdefdZdee	         fdZdee         fdZdedef         de	dee	         fdZdedef         de	dee	         fdZdedz  dededeeef         fdZdedef         de	dee	         fdZddZdS )HarmonyContextmessagesr3   c                 H   || _         d | _        || _        i | _        t	                      | _        t                      | _        t          |          | _	        d| _
        d| _        d| _        d| _        d| _        t                      | _        g | _        d| _        d| _        d S )Nr   T)	_messagesfinish_reasonr3   r   r   r   r   r   r   num_init_messagesr   r   r   r   num_tool_output_tokensr8   current_turn_metricsr   is_first_turnfirst_tok_of_message)r@   r  r3   s      r4   rA   zHarmonyContext.__init__  s    
 ")-.?A&)ee9;;!$X!"!"!"$%!&'# %0MM!35!$(!!!r6   c                 F    | j         j        dv r| xj        dz  c_        d S d S )N>   analysis
commentary   )r   current_channelr   rC   s    r4   _update_num_reasoning_tokensz+HarmonyContext._update_num_reasoning_tokens  s6    ;&*DDD%%*%%%% EDr6   rP   r-   Nc                    |j         d         j        }t                      | _        |D ]0}| j                            |           |                                  1|                     |           |                     |           | j        	                    | j
                                                   | j
                                         | j        j        }|j         d         j        | _        | j                            |           d S )Nr   )r   r   r   r   r   r!  _update_prefill_token_usage_update_decode_token_usager   r   r  rF   rD   r  r  r  r   )r@   rP   output_token_idstoken_idoutput_msgss        r4   rS   zHarmonyContext.append_output  s    !>!,69;;( 	0 	0HK)))--////((000''///$$T%>%C%C%E%EFFF!''))) k*#^A.<k*****r6   c                 >    |}| j                             |           d S r>   )r  r   )r@   rP   r'  s      r4   rV   z!HarmonyContext.append_tool_output0  s#    k*****r6   c                    |j         t          |j                   }nd}t                              d           || j        _        | xj        |z  c_        | j        rd| _        n| j        d         }| j        j        |j        z
  |j	        z
  }|dk     r4t                              d|| j        j        |j        |j	                   d}| xj
        |z  c_
        || j        _        |j        }|| xj        |z  c_        || j        _        dS dS )a  Update token usage statistics for the prefill phase of generation.

        The prefill phase processes the input prompt tokens. This method:
        1. Counts the prompt tokens for this turn
        2. Calculates tool output tokens for multi-turn conversations
        3. Updates cached token counts
        4. Tracks state for next turn calculations

        Tool output tokens are calculated as:
        current_prompt_tokens - last_turn_prompt_tokens -
        last_turn_output_tokens
        This represents tokens added between turns (typically tool responses).

        Args:
            output: The RequestOutput containing prompt token information
        Nr   z4RequestOutput appended contains no prompt_token_ids.Fr   zsNegative tool output tokens calculated: %d (current_input=%d, previous_input=%d, previous_output=%d). Setting to 0.)r   r   r   errorr  r9   r   r  r   r:   r  r<   r   r;   )r@   rP   this_turn_input_tokensprevious_turnthis_turn_tool_tokensnum_cached_tokens         r4   r#  z*HarmonyContext._update_prefill_token_usage4  sR   " ".%()@%A%A""%&"LLOPPP 2H!."88  	Q!&D 1"5M
 )6,--. " %q((9 *-:!.!/   )*%''+@@'';PD%8 "3'""&66""<LD%999 ('r6   c                     d}|j         rF|j         D ]}|t          |j                  z  }| xj        |z  c_        | j        xj        |z  c_        |S )ay  Update token usage statistics for the decode phase of generation.

        The decode phase processes the generated output tokens. This method:
        1. Counts output tokens from all completion outputs
        2. Updates the total output token count
        3. Tracks tokens generated in the current turn

        In streaming mode, this is called for each token generated.
        In non-streaming mode, this is called once with all output tokens.

        Args:
            output: The RequestOutput containing generated token information

        Returns:
            int: Number of output tokens processed in this call
        r   )r   r   r   r   r  r:   )r@   rP   updated_output_token_countcompletion_outputs       r4   r$  z)HarmonyContext._update_decode_token_usaget  sv    " &'"> 	R%+^ O O!*c2C2M.N.NN**""&@@""%337QQ33))r6   c                     | j         S r>   r  rC   s    r4   r  zHarmonyContext.messages  
    ~r6   c                     | j         d         }|j        }|d uo>|                    d          p)|                    d          p|                    d          S )Nr   browser.r+   
container.)r  rw   r   r@   rl   rw   s      r4   rZ   z%HarmonyContext.need_builtin_tool_call  se    =$&	$ 
  ,, 2##H--2##L11	
r6   c                   K   | j         sg S | j         d         }|j        }||                    d          r'|                     | j        d         |           d {V S |                    d          r'|                     | j        d         |           d {V S |                    d          r'|                     | j        d         |           d {V S t          d          )Nr   r6  r*   r+   r7  r)   zNo tool call found)r  rw   r   r   r   r   r   r2   r8  s      r4   rX   zHarmonyContext.call_tool  sO     } 	I=$&	 ##J// !22'	2H         %%h// !22'18         %%l33 !55'4h         -...r6   c                 *    t          | j                  S r>   )r   r  rC   s    r4   r   z$HarmonyContext.render_for_completion  s    $T]333r6   r   r&   rl   c                   K   | j                             d           t          |t                    r|                    |            d {V S |j                            d          d         }t          j        rR	 t          j
        |j        d         j                  }nP# t          j        $ r}t          ||          cY d }~S d }~ww xY wt          j
        |j        d         j                  }|                    ||           d {V }|j        d         j        }t!          |          }t#          t$          j        |j                  }	t)          |	|gt$          j        |j                  gS )Nr*   .r  r   ro   rq   rt   r   r   r   r   
get_resultrw   splitr   r   r   r   rv   rp   r   r|   rX   r   r   r   ry   r   rz   rx   
r@   r   rl   r,   r   rm   r   r   rv   ru   s
             r4   r   zHarmonyContext.call_search_tool  s      	i(((lD)) 	7%00666666666&,,S11!4	4 	8Fz("21"5":;;' F F F81EEEEEEEEF :h.q1677D#--i>>>>>>>>^A&+
:...TYX-?@@@ 	. (	  
 	
s   :$B C.C=CCc                   K   | j                             d           t          |t                    r|                    |            d {V S d|j        d         j        i}|                    d|           d {V }|j        d         j        }t          |          }t          t          j        d          }t          ||g|j        t          j                  gS )Nr+   r   r   ro   rq   )ru   rv   rx   rw   )r   r   r   r   r>  rv   rp   rX   r   r   r   ry   r   rx   rz   )r@   r   rl   r   r   r   rv   ru   s           r4   r   zHarmonyContext.call_python_tool  s       	h'''lD)) 	7%00666666666H$Q',
 $--h>>>>>>>>^A&+
:...TYX666  	 (.	  
 	
r6   r\   r]   r^   r_   c                 $  K   |r| j         D ]}|| j        vrvt          |          }||v r||         j        nd }|                    |                    |||                     d {V }|| j        |<   |                    | j                   d S d S r>   r   r   s	            r4   rb   z!HarmonyContext.init_tool_sessions  s        	E!1 
E 
E	D$777 ;I F FI8AY8N8N	),44TX  *4)G)G#//	:wOO* * $ $ $ $ $ $L 6BD'	2..t/CDDD	E 	E
E 
Er6   c                   K   | j                             d           t          |t                    r|                    |            d{V S |j                            d          d                             d          d         }t          j        rR	 t          j
        |j        d         j                  }nP# t          j        $ r}t          ||          cY d}~S d}~ww xY wt          j
        |j        d         j                  }|                    ||           d{V }|j        d         j        }t!          |          }t#          t$          j        |j                  }	t)          |	|gt$          j        |j        	          gS )
r   r)   Nr<  r   r   ro   rq   rt   r=  r@  s
             r4   r   z"HarmonyContext.call_container_tool  s     & 	k***lD)) 	7%00666666666&,,S11!4::3??B	4 	8Fz("21"5":;;' F F F81EEEEEEEEF :h.q1677D#--i>>>>>>>>^A&+
:...TYX-?@@@ 	. (	  
 	
s   $B8 8C!CC!C!c                 `    K   d t          j         fd j        D               d{V  dS )r   c                   K   t          | t                    spt                              d| j                   t          j        t                    5  |                     di            d {V  d d d            d S # 1 swxY w Y   d S d S r   r   r  s    r4   r  z<HarmonyContext.cleanup_session.<locals>.cleanup_tool_session'  r  r  c              3   D   K   | ]} j         |                   V  d S r>   r  r  s     r4   r	  z1HarmonyContext.cleanup_session.<locals>.<genexpr>0  r
  r6   Nr  r  s   `  @r4   rg   zHarmonyContext.cleanup_session$  r  r6   rG   )rH   rI   rJ   rh   rj   rA   r!  r    rS   r   rV   r#  rL   r$  r   r  ri   rZ   rX   r   r
   r   r   r   r   r   rk   r   rb   r   rg   rM   r6   r4   r  r    sr       )) c) ) ) )4+ + +
+M +d + + + +(+g +4 + + + +>M- >MD >M >M >M >M@* *3 * * * *4 $    X
 
 
 
 
/g / / / /(4tCy 4 4 4 4
!/4"78
DK
	g
 
 
 
6
!/4"78
DK
	g
 
 
 
0E$&E #E 	E
 S>E E E E()
!/4"78)
DK)
	g)
 )
 )
 )
V
 
 
 
 
 
r6   r  c                        e Zd Z fdZedefd            ZdeddfdZdee	         ddfdZ
defdZdefd	Zdee         f fd
Z xZS )StreamingHarmonyContextc                      t                      j        |i | d | _        t                      | _        t                      | _        d | _        d| _        d | _	        d S )NT)
superrA   r   r   r   r   encodinglast_tokr  last_content_delta)r@   r   r  	__class__s      r4   rA   z StreamingHarmonyContext.__init__8  s\    $)&)))9;;$$(!"&r6   r-   c                     | j         S r>   r3  rC   s    r4   r  z StreamingHarmonyContext.messagesB  r4  r6   rP   Nc                    d | _         | j        r|                     |           |j        | _        d}|j        d         j        D ]-}| j                            |           || j        j         pdz  }.|r|| _         |                     |           |j        rJ| j	        
                    | j                                                   | j                                         |                                  || _        t!          | j                  | j        z
  t!          | j        j                  k     rH| j                            | j        j        t!          | j                  | j        z
  d                     d S d S r   )rN  r  r#  finishedr   r   r   r   r$  r   r   r  rF   rD   r!  rM  r   r  r  r  r   )r@   rP   last_delta_texttoks       r4   rS   z%StreamingHarmonyContext.append_outputF  s    #'$ 	5,,V444
 %+O!>!$. 	D 	DCK$$$t{=CCOO 	6&5D#''/// ? 	.!(()B)G)G)I)IJJJ%++---))+++t~!77#dk>R:S:SSSN!!$S%8%84;Q%Q%S%ST     TSr6   c                 ,   t          |          dk    s
J d            |d         }|j        j        t          j        k    r|j        d|_        | j                            |          }|D ]}| j        	                    |           |d         | _
        d S )Nr  z&Tool output should be a single messager   	assistantr   )r   ru   rr   r   ry   rw   rL  renderr   r   rM  )r@   rP   msgtoksrT  s        r4   rV   z*StreamingHarmonyContext.append_tool_outpute  s    6{{a!IQi :?di''CM,A'CM}##C(( 	% 	%CK$$$$Rr6   c                 6    | j         j        t          j        k    S r>   )r   stater   EXPECT_STARTrC   s    r4   is_expecting_startz*StreamingHarmonyContext.is_expecting_starts  s    { K$<<<r6   c                 B    | j         | j                                        v S r>   )rM  rL  !stop_tokens_for_assistant_actionsrC   s    r4   is_assistant_action_turnz0StreamingHarmonyContext.is_assistant_action_turnv  s    } O O Q QQQr6   c                 ,   t                                                      }d}g }||         | j        k    r1|                    ||                    |dz  }||         | j        k    1t	          |          D ]}| j                            |           |S )Nr   r  )rK  r   rM  r   reversedr   r   )r@   rendered_tokenslast_n
to_processrT  rO  s        r4   r   z-StreamingHarmonyContext.render_for_completiony  s      ''7799
f%66of5666aKF f%66 J'' 	% 	%CK$$$$r6   )rH   rI   rJ   rA   r   rh   r  r    rS   r   rV   ri   r]  r`  rL   r   __classcell__)rO  s   @r4   rI  rI  7  s       ' ' ' ' ' $    XM d    >!g !4 ! ! ! !=D = = = =R$ R R R RtCy          r6   rI  )Or  r   rF   r   loggingabcr   r   collections.abcr   r   dataclassesr   typingr	   r
   >openai.types.responses.response_function_tool_call_output_itemr   openai.types.responses.toolr   openai_harmonyr   r   r   r   r   vllmr   vllm.entrypoints.chat_utilsr   vllm.entrypoints.constantsr   vllm.entrypoints.mcp.toolr    vllm.entrypoints.mcp.tool_serverr   'vllm.entrypoints.openai.engine.protocolr   ,vllm.entrypoints.openai.parser.harmony_utilsr   r   r   /vllm.entrypoints.openai.parser.responses_parserr   *vllm.entrypoints.openai.responses.protocolr   r   r   'vllm.entrypoints.openai.responses.utilsr   vllm.outputsr    $vllm.reasoning.abs_reasoning_parsersr!   vllm.renderersr"   vllm.tokenizersr#   &vllm.tool_parsers.abstract_tool_parserr$   
vllm.utilsr%   
mcp.clientr&   	getLoggerrH   r   r/   rj   r5   r8   rO   r   rh   r|   r~   r   r  rI  rM   r6   r4   <module>r     sI           # # # # # # # # $ $ $ $ $ $ % % % % % %       ' ' ' ' ' ' ' '      , + + + + + J J J J J J J J J J J J J J            2 1 1 1 1 1 * * * * * * 7 7 7 7 7 7              
              
 I H H H H H & & & & & & @ @ @ @ @ @ ' ' ' ' ' ' ) ) ) ) ) ) = = = = = = " " " " " " )((((((		8	$	$ $   -3 -3 - - - -
 
 
 
 
 
 
 
@!; !; !; !; !;# !; !; !;H.	']   ,Z; Z; Z; Z; Z;' Z; Z; Z;zv
 v
 v
 v
 v
) v
 v
 v
rx
 x
 x
 x
 x
( x
 x
 x
v	P P P P Pn P P P P Pr6   