Skip to content

[Frontend] OpenAI Responses API supports Tool/Function calling with streaming#29947

Merged
DarkLight1337 merged 12 commits intovllm-project:mainfrom
chaunceyjiang:func_call_streaming
Mar 12, 2026
Merged

[Frontend] OpenAI Responses API supports Tool/Function calling with streaming#29947
DarkLight1337 merged 12 commits intovllm-project:mainfrom
chaunceyjiang:func_call_streaming

Conversation

@chaunceyjiang
Copy link
Collaborator

@chaunceyjiang chaunceyjiang commented Dec 3, 2025

Purpose

OpenAI Responses API supports Tool/Function calling with streaming

Test Plan

from openai import OpenAI

TOKEN = "dummy"
base_url = "http://localhost:8000/v1"
client = OpenAI(base_url=base_url, api_key=TOKEN)
MODEL = ""
with client.responses.create(
    model=MODEL,
    input="What's the weather in Boston today?",
    tools=[
        {
            "type": "function",
            "name": "get_current_weather",
            "description": "Get the current weather in a given location",
            "parameters": {
                "type": "object",
                "properties": {
                    "location": {"type": "string", "description": "The city and state"},
                    "unit": {"type": "string", "enum": ["celsius", "fahrenheit"]},
                },
                "required": ["location", "unit"],
            },
        }
    ],
    stream=True,
) as stream:
    for event in stream:
        print(event)

Test Result

with out Reasoning

ResponseCreatedEvent(response=Response(id='resp_835d8223eda180e7', created_at=1773039905.0, error=None, incomplete_details=None, instructions=None, metadata=None, model='my-model', object='response', output=[], parallel_tool_calls=True, temperature=1.0, tool_choice='auto', tools=[FunctionTool(name='get_current_weather', parameters={'type': 'object', 'properties': {'location': {'type': 'string', 'description': 'The city and state'}, 'unit': {'type': 'string', 'enum': ['celsius', 'fahrenheit']}}, 'required': ['location', 'unit']}, strict=None, type='function', defer_loading=None, description='Get the current weather in a given location')], top_p=0.95, background=False, completed_at=None, conversation=None, max_output_tokens=261816, max_tool_calls=None, previous_response_id=None, prompt=None, prompt_cache_key=None, prompt_cache_retention=None, reasoning=None, safety_identifier=None, service_tier='auto', status='in_progress', text=None, top_logprobs=None, truncation='disabled', usage=None, user=None, input_messages=None, output_messages=None), sequence_number=0, type='response.created')
ResponseInProgressEvent(response=Response(id='resp_835d8223eda180e7', created_at=1773039905.0, error=None, incomplete_details=None, instructions=None, metadata=None, model='my-model', object='response', output=[], parallel_tool_calls=True, temperature=1.0, tool_choice='auto', tools=[FunctionTool(name='get_current_weather', parameters={'type': 'object', 'properties': {'location': {'type': 'string', 'description': 'The city and state'}, 'unit': {'type': 'string', 'enum': ['celsius', 'fahrenheit']}}, 'required': ['location', 'unit']}, strict=None, type='function', defer_loading=None, description='Get the current weather in a given location')], top_p=0.95, background=False, completed_at=None, conversation=None, max_output_tokens=261816, max_tool_calls=None, previous_response_id=None, prompt=None, prompt_cache_key=None, prompt_cache_retention=None, reasoning=None, safety_identifier=None, service_tier='auto', status='in_progress', text=None, top_logprobs=None, truncation='disabled', usage=None, user=None, input_messages=None, output_messages=None), sequence_number=1, type='response.in_progress')
ResponseOutputItemAddedEvent(item=ResponseOutputMessage(id='bb5e8602d5166eb0', content=[], role='assistant', status='in_progress', type='message', phase=None), output_index=0, sequence_number=2, type='response.output_item.added')
ResponseContentPartAddedEvent(content_index=0, item_id='bb5e8602d5166eb0', output_index=0, part=ResponseOutputText(annotations=[], text='', type='output_text', logprobs=[]), sequence_number=3, type='response.content_part.added')
ResponseTextDeltaEvent(content_index=0, delta='The', item_id='bb5e8602d5166eb0', logprobs=[], output_index=0, sequence_number=4, type='response.output_text.delta')
ResponseTextDeltaEvent(content_index=1, delta=' user is asking', item_id='bb5e8602d5166eb0', logprobs=[], output_index=0, sequence_number=5, type='response.output_text.delta')
ResponseTextDeltaEvent(content_index=2, delta=' about', item_id='bb5e8602d5166eb0', logprobs=[], output_index=0, sequence_number=6, type='response.output_text.delta')
ResponseTextDeltaEvent(content_index=3, delta=' the', item_id='bb5e8602d5166eb0', logprobs=[], output_index=0, sequence_number=7, type='response.output_text.delta')
ResponseTextDeltaEvent(content_index=4, delta=' weather', item_id='bb5e8602d5166eb0', logprobs=[], output_index=0, sequence_number=8, type='response.output_text.delta')
ResponseTextDeltaEvent(content_index=5, delta=' in', item_id='bb5e8602d5166eb0', logprobs=[], output_index=0, sequence_number=9, type='response.output_text.delta')
ResponseTextDeltaEvent(content_index=6, delta=' Boston', item_id='bb5e8602d5166eb0', logprobs=[], output_index=0, sequence_number=10, type='response.output_text.delta')
ResponseTextDeltaEvent(content_index=7, delta=' today', item_id='bb5e8602d5166eb0', logprobs=[], output_index=0, sequence_number=11, type='response.output_text.delta')
ResponseTextDeltaEvent(content_index=8, delta='.', item_id='bb5e8602d5166eb0', logprobs=[], output_index=0, sequence_number=12, type='response.output_text.delta')
ResponseTextDeltaEvent(content_index=9, delta=' I', item_id='bb5e8602d5166eb0', logprobs=[], output_index=0, sequence_number=13, type='response.output_text.delta')
ResponseTextDeltaEvent(content_index=10, delta=' have', item_id='bb5e8602d5166eb0', logprobs=[], output_index=0, sequence_number=14, type='response.output_text.delta')
ResponseTextDeltaEvent(content_index=11, delta=' access', item_id='bb5e8602d5166eb0', logprobs=[], output_index=0, sequence_number=15, type='response.output_text.delta')
ResponseTextDeltaEvent(content_index=12, delta=' to', item_id='bb5e8602d5166eb0', logprobs=[], output_index=0, sequence_number=16, type='response.output_text.delta')
ResponseTextDeltaEvent(content_index=13, delta=' a', item_id='bb5e8602d5166eb0', logprobs=[], output_index=0, sequence_number=17, type='response.output_text.delta')
ResponseTextDeltaEvent(content_index=14, delta=' get', item_id='bb5e8602d5166eb0', logprobs=[], output_index=0, sequence_number=18, type='response.output_text.delta')
ResponseTextDeltaEvent(content_index=15, delta='_current', item_id='bb5e8602d5166eb0', logprobs=[], output_index=0, sequence_number=19, type='response.output_text.delta')
ResponseTextDeltaEvent(content_index=16, delta='_weather', item_id='bb5e8602d5166eb0', logprobs=[], output_index=0, sequence_number=20, type='response.output_text.delta')
ResponseTextDeltaEvent(content_index=17, delta=' function', item_id='bb5e8602d5166eb0', logprobs=[], output_index=0, sequence_number=21, type='response.output_text.delta')
ResponseTextDeltaEvent(content_index=18, delta=' that', item_id='bb5e8602d5166eb0', logprobs=[], output_index=0, sequence_number=22, type='response.output_text.delta')
ResponseTextDeltaEvent(content_index=19, delta=' can', item_id='bb5e8602d5166eb0', logprobs=[], output_index=0, sequence_number=23, type='response.output_text.delta')
ResponseTextDeltaEvent(content_index=20, delta=' provide', item_id='bb5e8602d5166eb0', logprobs=[], output_index=0, sequence_number=24, type='response.output_text.delta')
ResponseTextDeltaEvent(content_index=21, delta=' this', item_id='bb5e8602d5166eb0', logprobs=[], output_index=0, sequence_number=25, type='response.output_text.delta')
ResponseTextDeltaEvent(content_index=22, delta=' information', item_id='bb5e8602d5166eb0', logprobs=[], output_index=0, sequence_number=26, type='response.output_text.delta')
ResponseTextDeltaEvent(content_index=23, delta='.', item_id='bb5e8602d5166eb0', logprobs=[], output_index=0, sequence_number=27, type='response.output_text.delta')
ResponseTextDeltaEvent(content_index=24, delta=' I', item_id='bb5e8602d5166eb0', logprobs=[], output_index=0, sequence_number=28, type='response.output_text.delta')
ResponseTextDeltaEvent(content_index=25, delta=' need', item_id='bb5e8602d5166eb0', logprobs=[], output_index=0, sequence_number=29, type='response.output_text.delta')
ResponseTextDeltaEvent(content_index=26, delta=' to', item_id='bb5e8602d5166eb0', logprobs=[], output_index=0, sequence_number=30, type='response.output_text.delta')
ResponseTextDeltaEvent(content_index=27, delta=' call', item_id='bb5e8602d5166eb0', logprobs=[], output_index=0, sequence_number=31, type='response.output_text.delta')
ResponseTextDeltaEvent(content_index=28, delta=' this', item_id='bb5e8602d5166eb0', logprobs=[], output_index=0, sequence_number=32, type='response.output_text.delta')
ResponseTextDeltaEvent(content_index=29, delta=' function', item_id='bb5e8602d5166eb0', logprobs=[], output_index=0, sequence_number=33, type='response.output_text.delta')
ResponseTextDeltaEvent(content_index=30, delta=' with', item_id='bb5e8602d5166eb0', logprobs=[], output_index=0, sequence_number=34, type='response.output_text.delta')
ResponseTextDeltaEvent(content_index=31, delta=' the', item_id='bb5e8602d5166eb0', logprobs=[], output_index=0, sequence_number=35, type='response.output_text.delta')
ResponseTextDeltaEvent(content_index=32, delta=' required', item_id='bb5e8602d5166eb0', logprobs=[], output_index=0, sequence_number=36, type='response.output_text.delta')
ResponseTextDeltaEvent(content_index=33, delta=' parameters', item_id='bb5e8602d5166eb0', logprobs=[], output_index=0, sequence_number=37, type='response.output_text.delta')
ResponseTextDeltaEvent(content_index=34, delta=':', item_id='bb5e8602d5166eb0', logprobs=[], output_index=0, sequence_number=38, type='response.output_text.delta')
ResponseTextDeltaEvent(content_index=35, delta='\n\n', item_id='bb5e8602d5166eb0', logprobs=[], output_index=0, sequence_number=39, type='response.output_text.delta')
ResponseTextDeltaEvent(content_index=36, delta='1', item_id='bb5e8602d5166eb0', logprobs=[], output_index=0, sequence_number=40, type='response.output_text.delta')
ResponseTextDeltaEvent(content_index=37, delta='.', item_id='bb5e8602d5166eb0', logprobs=[], output_index=0, sequence_number=41, type='response.output_text.delta')
ResponseTextDeltaEvent(content_index=38, delta=' location', item_id='bb5e8602d5166eb0', logprobs=[], output_index=0, sequence_number=42, type='response.output_text.delta')
ResponseTextDeltaEvent(content_index=39, delta=':', item_id='bb5e8602d5166eb0', logprobs=[], output_index=0, sequence_number=43, type='response.output_text.delta')
ResponseTextDeltaEvent(content_index=40, delta=' "', item_id='bb5e8602d5166eb0', logprobs=[], output_index=0, sequence_number=44, type='response.output_text.delta')
ResponseTextDeltaEvent(content_index=41, delta='Boston', item_id='bb5e8602d5166eb0', logprobs=[], output_index=0, sequence_number=45, type='response.output_text.delta')
..
...
....
..
ResponseTextDeltaEvent(content_index=102, delta='\n\n', item_id='bb5e8602d5166eb0', logprobs=[], output_index=0, sequence_number=106, type='response.output_text.delta')
ResponseTextDoneEvent(content_index=103, item_id='bb5e8602d5166eb0', logprobs=[], output_index=0, sequence_number=107, text='', type='response.output_text.done')
ResponseContentPartDoneEvent(content_index=103, item_id='bb5e8602d5166eb0', output_index=0, part=ResponseOutputText(annotations=[], text='', type='output_text', logprobs=[]), sequence_number=108, type='response.content_part.done')
ResponseOutputItemDoneEvent(item=ResponseOutputMessage(id='bb5e8602d5166eb0', content=[], role='assistant', status='completed', type='message', phase=None), output_index=0, sequence_number=109, type='response.output_item.done')
ResponseOutputItemAddedEvent(item=ResponseFunctionToolCall(arguments='', call_id='call_b727c44f9cc79cc8', name='get_current_weather', type='function_call', id='9c6a9d50fbbcf08e', namespace=None, status='in_progress'), output_index=1, sequence_number=110, type='response.output_item.added')
ResponseFunctionCallArgumentsDeltaEvent(delta='{', item_id='9c6a9d50fbbcf08e', output_index=1, sequence_number=111, type='response.function_call_arguments.delta')
ResponseFunctionCallArgumentsDeltaEvent(delta='"location": "Boston"', item_id='9c6a9d50fbbcf08e', output_index=1, sequence_number=112, type='response.function_call_arguments.delta')
ResponseFunctionCallArgumentsDeltaEvent(delta=', "unit": "fahrenheit"', item_id='9c6a9d50fbbcf08e', output_index=1, sequence_number=113, type='response.function_call_arguments.delta')
ResponseFunctionCallArgumentsDeltaEvent(delta='}', item_id='9c6a9d50fbbcf08e', output_index=1, sequence_number=114, type='response.function_call_arguments.delta')
ResponseFunctionCallArgumentsDoneEvent(arguments='{"location": "Boston", "unit": "fahrenheit"}', item_id='9c6a9d50fbbcf08e', name='get_current_weather', output_index=1, sequence_number=115, type='response.function_call_arguments.done')
ResponseOutputItemDoneEvent(item=ResponseFunctionToolCall(arguments='{"location": "Boston", "unit": "fahrenheit"}', call_id='call_b727c44f9cc79cc8', name='get_current_weather', type='function_call', id='9c6a9d50fbbcf08e', namespace=None, status='completed'), output_index=1, sequence_number=116, type='response.output_item.done')
ResponseCompletedEvent(response=Response(id='resp_835d8223eda180e7', created_at=1773039905.0, error=None, incomplete_details=None, instructions=None, metadata=None, model='my-model', object='response', output=[ResponseOutputMessage(id='msg_8cac189179cc74d8', content=[ResponseOutputText(annotations=[], text='The user is asking about the weather in Boston today. I have access to a get_current_weather function that can provide this information. I need to call this function with the required parameters:\n\n1. location: "Boston" (the user specified Boston)\n2. unit: I need to choose between "celsius" or "fahrenheit". Since the user didn\'t specify, I\'ll use Fahrenheit as it\'s commonly used in the US where Boston is located.\n\nLet me make the function call.\n</think>\n\n', type='output_text', logprobs=None)], role='assistant', status='completed', type='message', phase=None), ResponseFunctionToolCall(arguments='{"location": "Boston", "unit": "fahrenheit"}', call_id='chatcmpl-tool-9ed92698d29cd190', name='get_current_weather', type='function_call', id='fc_a1e7919c20bc1418', namespace=None, status='completed')], parallel_tool_calls=True, temperature=1.0, tool_choice='auto', tools=[FunctionTool(name='get_current_weather', parameters={'type': 'object', 'properties': {'location': {'type': 'string', 'description': 'The city and state'}, 'unit': {'type': 'string', 'enum': ['celsius', 'fahrenheit']}}, 'required': ['location', 'unit']}, strict=None, type='function', defer_loading=None, description='Get the current weather in a given location')], top_p=0.95, background=False, completed_at=None, conversation=None, max_output_tokens=261816, max_tool_calls=None, previous_response_id=None, prompt=None, prompt_cache_key=None, prompt_cache_retention=None, reasoning=None, safety_identifier=None, service_tier='auto', status='completed', text=None, top_logprobs=None, truncation='disabled', usage=ResponseUsage(input_tokens=328, input_tokens_details=InputTokensDetails(cached_tokens=0, input_tokens_per_turn=[], cached_tokens_per_turn=[]), output_tokens=145, output_tokens_details=OutputTokensDetails(reasoning_tokens=0, tool_output_tokens=0, output_tokens_per_turn=[], tool_output_tokens_per_turn=[]), total_tokens=473), user=None, input_messages=None, output_messages=None), sequence_number=117, type='response.completed')


with Reasoning

ResponseCreatedEvent(response=Response(id='resp_bfe01071df92be2e', created_at=1773040157.0, error=None, incomplete_details=None, instructions=None, metadata=None, model='my-model', object='response', output=[], parallel_tool_calls=True, temperature=1.0, tool_choice='auto', tools=[FunctionTool(name='get_current_weather', parameters={'type': 'object', 'properties': {'location': {'type': 'string', 'description': 'The city and state'}, 'unit': {'type': 'string', 'enum': ['celsius', 'fahrenheit']}}, 'required': ['location', 'unit']}, strict=None, type='function', defer_loading=None, description='Get the current weather in a given location')], top_p=0.95, background=False, completed_at=None, conversation=None, max_output_tokens=261816, max_tool_calls=None, previous_response_id=None, prompt=None, prompt_cache_key=None, prompt_cache_retention=None, reasoning=None, safety_identifier=None, service_tier='auto', status='in_progress', text=None, top_logprobs=None, truncation='disabled', usage=None, user=None, input_messages=None, output_messages=None), sequence_number=0, type='response.created')
ResponseInProgressEvent(response=Response(id='resp_bfe01071df92be2e', created_at=1773040157.0, error=None, incomplete_details=None, instructions=None, metadata=None, model='my-model', object='response', output=[], parallel_tool_calls=True, temperature=1.0, tool_choice='auto', tools=[FunctionTool(name='get_current_weather', parameters={'type': 'object', 'properties': {'location': {'type': 'string', 'description': 'The city and state'}, 'unit': {'type': 'string', 'enum': ['celsius', 'fahrenheit']}}, 'required': ['location', 'unit']}, strict=None, type='function', defer_loading=None, description='Get the current weather in a given location')], top_p=0.95, background=False, completed_at=None, conversation=None, max_output_tokens=261816, max_tool_calls=None, previous_response_id=None, prompt=None, prompt_cache_key=None, prompt_cache_retention=None, reasoning=None, safety_identifier=None, service_tier='auto', status='in_progress', text=None, top_logprobs=None, truncation='disabled', usage=None, user=None, input_messages=None, output_messages=None), sequence_number=1, type='response.in_progress')
ResponseOutputItemAddedEvent(item=ResponseReasoningItem(id='b335d5f68187864d', summary=[], type='reasoning', content=None, encrypted_content=None, status='in_progress'), output_index=0, sequence_number=2, type='response.output_item.added')
ResponseAudioDeltaEvent(delta=None, sequence_number=3, type='response.reasoning_part.added', content_index=0, item_id='b335d5f68187864d', output_index=0, part={'text': '', 'type': 'reasoning_text'})
ResponseReasoningTextDeltaEvent(content_index=0, delta='The', item_id='b335d5f68187864d', output_index=0, sequence_number=4, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=1, delta=' user is asking', item_id='b335d5f68187864d', output_index=0, sequence_number=5, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=2, delta=' about', item_id='b335d5f68187864d', output_index=0, sequence_number=6, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=3, delta=' the', item_id='b335d5f68187864d', output_index=0, sequence_number=7, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=4, delta=' weather', item_id='b335d5f68187864d', output_index=0, sequence_number=8, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=5, delta=' in', item_id='b335d5f68187864d', output_index=0, sequence_number=9, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=6, delta=' Boston', item_id='b335d5f68187864d', output_index=0, sequence_number=10, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=7, delta=' today', item_id='b335d5f68187864d', output_index=0, sequence_number=11, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=8, delta='.', item_id='b335d5f68187864d', output_index=0, sequence_number=12, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=9, delta=' I', item_id='b335d5f68187864d', output_index=0, sequence_number=13, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=10, delta=' have', item_id='b335d5f68187864d', output_index=0, sequence_number=14, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=11, delta=' access', item_id='b335d5f68187864d', output_index=0, sequence_number=15, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=12, delta=' to', item_id='b335d5f68187864d', output_index=0, sequence_number=16, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=13, delta=' a', item_id='b335d5f68187864d', output_index=0, sequence_number=17, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=14, delta=' get', item_id='b335d5f68187864d', output_index=0, sequence_number=18, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=15, delta='_current', item_id='b335d5f68187864d', output_index=0, sequence_number=19, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=16, delta='_weather', item_id='b335d5f68187864d', output_index=0, sequence_number=20, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=17, delta=' function', item_id='b335d5f68187864d', output_index=0, sequence_number=21, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=18, delta=' that', item_id='b335d5f68187864d', output_index=0, sequence_number=22, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=19, delta=' can', item_id='b335d5f68187864d', output_index=0, sequence_number=23, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=20, delta=' provide', item_id='b335d5f68187864d', output_index=0, sequence_number=24, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=21, delta=' this', item_id='b335d5f68187864d', output_index=0, sequence_number=25, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=22, delta=' information', item_id='b335d5f68187864d', output_index=0, sequence_number=26, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=23, delta='.', item_id='b335d5f68187864d', output_index=0, sequence_number=27, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=24, delta=' I', item_id='b335d5f68187864d', output_index=0, sequence_number=28, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=25, delta=' need', item_id='b335d5f68187864d', output_index=0, sequence_number=29, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=26, delta=' to', item_id='b335d5f68187864d', output_index=0, sequence_number=30, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=27, delta=' call', item_id='b335d5f68187864d', output_index=0, sequence_number=31, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=28, delta=' this', item_id='b335d5f68187864d', output_index=0, sequence_number=32, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=29, delta=' function', item_id='b335d5f68187864d', output_index=0, sequence_number=33, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=30, delta=' with', item_id='b335d5f68187864d', output_index=0, sequence_number=34, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=31, delta=' the', item_id='b335d5f68187864d', output_index=0, sequence_number=35, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=32, delta=' required', item_id='b335d5f68187864d', output_index=0, sequence_number=36, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=33, delta=' parameters', item_id='b335d5f68187864d', output_index=0, sequence_number=37, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=34, delta=':', item_id='b335d5f68187864d', output_index=0, sequence_number=38, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=35, delta='\n\n', item_id='b335d5f68187864d', output_index=0, sequence_number=39, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=36, delta='1', item_id='b335d5f68187864d', output_index=0, sequence_number=40, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=37, delta='.', item_id='b335d5f68187864d', output_index=0, sequence_number=41, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=38, delta=' location', item_id='b335d5f68187864d', output_index=0, sequence_number=42, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=39, delta=':', item_id='b335d5f68187864d', output_index=0, sequence_number=43, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=40, delta=' "', item_id='b335d5f68187864d', output_index=0, sequence_number=44, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=41, delta='Boston', item_id='b335d5f68187864d', output_index=0, sequence_number=45, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=42, delta='"', item_id='b335d5f68187864d', output_index=0, sequence_number=46, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=43, delta=' (', item_id='b335d5f68187864d', output_index=0, sequence_number=47, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=44, delta='the', item_id='b335d5f68187864d', output_index=0, sequence_number=48, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=45, delta=' user', item_id='b335d5f68187864d', output_index=0, sequence_number=49, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=46, delta=' specified', item_id='b335d5f68187864d', output_index=0, sequence_number=50, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=47, delta=' Boston', item_id='b335d5f68187864d', output_index=0, sequence_number=51, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=48, delta=')', item_id='b335d5f68187864d', output_index=0, sequence_number=52, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=49, delta='\n', item_id='b335d5f68187864d', output_index=0, sequence_number=53, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=50, delta='2', item_id='b335d5f68187864d', output_index=0, sequence_number=54, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=51, delta='.', item_id='b335d5f68187864d', output_index=0, sequence_number=55, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=52, delta=' unit', item_id='b335d5f68187864d', output_index=0, sequence_number=56, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=53, delta=':', item_id='b335d5f68187864d', output_index=0, sequence_number=57, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=54, delta=' I', item_id='b335d5f68187864d', output_index=0, sequence_number=58, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=55, delta=' need', item_id='b335d5f68187864d', output_index=0, sequence_number=59, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=56, delta=' to', item_id='b335d5f68187864d', output_index=0, sequence_number=60, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=57, delta=' choose', item_id='b335d5f68187864d', output_index=0, sequence_number=61, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=58, delta=' between', item_id='b335d5f68187864d', output_index=0, sequence_number=62, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=59, delta=' "', item_id='b335d5f68187864d', output_index=0, sequence_number=63, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=60, delta='c', item_id='b335d5f68187864d', output_index=0, sequence_number=64, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=61, delta='elsius', item_id='b335d5f68187864d', output_index=0, sequence_number=65, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=62, delta='"', item_id='b335d5f68187864d', output_index=0, sequence_number=66, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=63, delta=' or', item_id='b335d5f68187864d', output_index=0, sequence_number=67, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=64, delta=' "', item_id='b335d5f68187864d', output_index=0, sequence_number=68, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=65, delta='f', item_id='b335d5f68187864d', output_index=0, sequence_number=69, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=66, delta='ahrenheit', item_id='b335d5f68187864d', output_index=0, sequence_number=70, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=67, delta='".', item_id='b335d5f68187864d', output_index=0, sequence_number=71, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=68, delta=' Since', item_id='b335d5f68187864d', output_index=0, sequence_number=72, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=69, delta=' the', item_id='b335d5f68187864d', output_index=0, sequence_number=73, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=70, delta=' user', item_id='b335d5f68187864d', output_index=0, sequence_number=74, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=71, delta=' didn', item_id='b335d5f68187864d', output_index=0, sequence_number=75, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=72, delta="'t", item_id='b335d5f68187864d', output_index=0, sequence_number=76, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=73, delta=' specify', item_id='b335d5f68187864d', output_index=0, sequence_number=77, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=74, delta=',', item_id='b335d5f68187864d', output_index=0, sequence_number=78, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=75, delta=' I', item_id='b335d5f68187864d', output_index=0, sequence_number=79, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=76, delta="'ll", item_id='b335d5f68187864d', output_index=0, sequence_number=80, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=77, delta=' use', item_id='b335d5f68187864d', output_index=0, sequence_number=81, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=78, delta=' Fahrenheit', item_id='b335d5f68187864d', output_index=0, sequence_number=82, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=79, delta=' as', item_id='b335d5f68187864d', output_index=0, sequence_number=83, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=80, delta=' it', item_id='b335d5f68187864d', output_index=0, sequence_number=84, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=81, delta="'s", item_id='b335d5f68187864d', output_index=0, sequence_number=85, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=82, delta=' commonly', item_id='b335d5f68187864d', output_index=0, sequence_number=86, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=83, delta=' used', item_id='b335d5f68187864d', output_index=0, sequence_number=87, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=84, delta=' in', item_id='b335d5f68187864d', output_index=0, sequence_number=88, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=85, delta=' the', item_id='b335d5f68187864d', output_index=0, sequence_number=89, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=86, delta=' US', item_id='b335d5f68187864d', output_index=0, sequence_number=90, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=87, delta=' where', item_id='b335d5f68187864d', output_index=0, sequence_number=91, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=88, delta=' Boston', item_id='b335d5f68187864d', output_index=0, sequence_number=92, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=89, delta=' is', item_id='b335d5f68187864d', output_index=0, sequence_number=93, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=90, delta=' located', item_id='b335d5f68187864d', output_index=0, sequence_number=94, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=91, delta='.', item_id='b335d5f68187864d', output_index=0, sequence_number=95, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=92, delta='\n\n', item_id='b335d5f68187864d', output_index=0, sequence_number=96, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=93, delta='Let', item_id='b335d5f68187864d', output_index=0, sequence_number=97, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=94, delta=' me', item_id='b335d5f68187864d', output_index=0, sequence_number=98, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=95, delta=' make', item_id='b335d5f68187864d', output_index=0, sequence_number=99, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=96, delta=' the', item_id='b335d5f68187864d', output_index=0, sequence_number=100, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=97, delta=' function', item_id='b335d5f68187864d', output_index=0, sequence_number=101, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=98, delta=' call', item_id='b335d5f68187864d', output_index=0, sequence_number=102, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=99, delta='.', item_id='b335d5f68187864d', output_index=0, sequence_number=103, type='response.reasoning_text.delta')
ResponseReasoningTextDeltaEvent(content_index=100, delta='\n', item_id='b335d5f68187864d', output_index=0, sequence_number=104, type='response.reasoning_text.delta')
ResponseReasoningTextDoneEvent(content_index=101, item_id='b335d5f68187864d', output_index=0, sequence_number=105, text='The user is asking about the weather in Boston today. I have access to a get_current_weather function that can provide this information. I need to call this function with the required parameters:\n\n1. location: "Boston" (the user specified Boston)\n2. unit: I need to choose between "celsius" or "fahrenheit". Since the user didn\'t specify, I\'ll use Fahrenheit as it\'s commonly used in the US where Boston is located.\n\nLet me make the function call.\n', type='response.reasoning_text.done')
ResponseAudioDeltaEvent(delta=None, sequence_number=106, type='response.reasoning_part.done', content_index=101, item_id='b335d5f68187864d', output_index=0, part={'text': 'The user is asking about the weather in Boston today. I have access to a get_current_weather function that can provide this information. I need to call this function with the required parameters:\n\n1. location: "Boston" (the user specified Boston)\n2. unit: I need to choose between "celsius" or "fahrenheit". Since the user didn\'t specify, I\'ll use Fahrenheit as it\'s commonly used in the US where Boston is located.\n\nLet me make the function call.\n', 'type': 'reasoning_text'})
ResponseOutputItemDoneEvent(item=ResponseReasoningItem(id='b335d5f68187864d', summary=[], type='reasoning', content=[Content(text='The user is asking about the weather in Boston today. I have access to a get_current_weather function that can provide this information. I need to call this function with the required parameters:\n\n1. location: "Boston" (the user specified Boston)\n2. unit: I need to choose between "celsius" or "fahrenheit". Since the user didn\'t specify, I\'ll use Fahrenheit as it\'s commonly used in the US where Boston is located.\n\nLet me make the function call.\n', type='reasoning_text')], encrypted_content=None, status='completed'), output_index=0, sequence_number=107, type='response.output_item.done')
ResponseOutputItemAddedEvent(item=ResponseOutputMessage(id='e45cc605-f7d9-4a31-a682-62ed7e4325fa', content=[], role='assistant', status='in_progress', type='message', phase=None), output_index=1, sequence_number=108, type='response.output_item.added')
ResponseContentPartAddedEvent(content_index=0, item_id='e45cc605-f7d9-4a31-a682-62ed7e4325fa', output_index=1, part=ResponseOutputText(annotations=[], text='', type='output_text', logprobs=[]), sequence_number=109, type='response.content_part.added')
ResponseTextDeltaEvent(content_index=0, delta='\n\n', item_id='e45cc605-f7d9-4a31-a682-62ed7e4325fa', logprobs=[], output_index=1, sequence_number=110, type='response.output_text.delta')
ResponseTextDoneEvent(content_index=1, item_id='e45cc605-f7d9-4a31-a682-62ed7e4325fa', logprobs=[], output_index=1, sequence_number=111, text='', type='response.output_text.done')
ResponseContentPartDoneEvent(content_index=1, item_id='e45cc605-f7d9-4a31-a682-62ed7e4325fa', output_index=1, part=ResponseOutputText(annotations=[], text='', type='output_text', logprobs=[]), sequence_number=112, type='response.content_part.done')
ResponseOutputItemDoneEvent(item=ResponseOutputMessage(id='e45cc605-f7d9-4a31-a682-62ed7e4325fa', content=[], role='assistant', status='completed', type='message', phase=None), output_index=1, sequence_number=113, type='response.output_item.done')
ResponseOutputItemAddedEvent(item=ResponseFunctionToolCall(arguments='', call_id='call_8b819f461c2ee8df', name='get_current_weather', type='function_call', id='a0e853aed2ac1d33', namespace=None, status='in_progress'), output_index=2, sequence_number=114, type='response.output_item.added')
ResponseFunctionCallArgumentsDeltaEvent(delta='{', item_id='a0e853aed2ac1d33', output_index=2, sequence_number=115, type='response.function_call_arguments.delta')
ResponseFunctionCallArgumentsDeltaEvent(delta='"location": "Boston"', item_id='a0e853aed2ac1d33', output_index=2, sequence_number=116, type='response.function_call_arguments.delta')
ResponseFunctionCallArgumentsDeltaEvent(delta=', "unit": "fahrenheit"', item_id='a0e853aed2ac1d33', output_index=2, sequence_number=117, type='response.function_call_arguments.delta')
ResponseFunctionCallArgumentsDeltaEvent(delta='}', item_id='a0e853aed2ac1d33', output_index=2, sequence_number=118, type='response.function_call_arguments.delta')
ResponseFunctionCallArgumentsDoneEvent(arguments='{"location": "Boston", "unit": "fahrenheit"}', item_id='a0e853aed2ac1d33', name='get_current_weather', output_index=2, sequence_number=119, type='response.function_call_arguments.done')
ResponseOutputItemDoneEvent(item=ResponseFunctionToolCall(arguments='{"location": "Boston", "unit": "fahrenheit"}', call_id='call_8b819f461c2ee8df', name='get_current_weather', type='function_call', id='a0e853aed2ac1d33', namespace=None, status='completed'), output_index=2, sequence_number=120, type='response.output_item.done')
ResponseCompletedEvent(response=Response(id='resp_bfe01071df92be2e', created_at=1773040157.0, error=None, incomplete_details=None, instructions=None, metadata=None, model='my-model', object='response', output=[ResponseReasoningItem(id='rs_9ea78200cfdc514d', summary=[], type='reasoning', content=[Content(text='The user is asking about the weather in Boston today. I have access to a get_current_weather function that can provide this information. I need to call this function with the required parameters:\n\n1. location: "Boston" (the user specified Boston)\n2. unit: I need to choose between "celsius" or "fahrenheit". Since the user didn\'t specify, I\'ll use Fahrenheit as it\'s commonly used in the US where Boston is located.\n\nLet me make the function call.\n', type='reasoning_text')], encrypted_content=None, status=None), ResponseFunctionToolCall(arguments='{"location": "Boston", "unit": "fahrenheit"}', call_id='chatcmpl-tool-9f00491ccdf721f9', name='get_current_weather', type='function_call', id='fc_858120fa0e1f4104', namespace=None, status='completed')], parallel_tool_calls=True, temperature=1.0, tool_choice='auto', tools=[FunctionTool(name='get_current_weather', parameters={'type': 'object', 'properties': {'location': {'type': 'string', 'description': 'The city and state'}, 'unit': {'type': 'string', 'enum': ['celsius', 'fahrenheit']}}, 'required': ['location', 'unit']}, strict=None, type='function', defer_loading=None, description='Get the current weather in a given location')], top_p=0.95, background=False, completed_at=None, conversation=None, max_output_tokens=261816, max_tool_calls=None, previous_response_id=None, prompt=None, prompt_cache_key=None, prompt_cache_retention=None, reasoning=None, safety_identifier=None, service_tier='auto', status='completed', text=None, top_logprobs=None, truncation='disabled', usage=ResponseUsage(input_tokens=328, input_tokens_details=InputTokensDetails(cached_tokens=0, input_tokens_per_turn=[], cached_tokens_per_turn=[]), output_tokens=145, output_tokens_details=OutputTokensDetails(reasoning_tokens=0, tool_output_tokens=0, output_tokens_per_turn=[], tool_output_tokens_per_turn=[]), total_tokens=473), user=None, input_messages=None, output_messages=None), sequence_number=121, type='response.completed')



Essential Elements of an Effective PR Description Checklist
  • The purpose of the PR, such as "Fix some issue (link existing issues this PR will resolve)".
  • The test plan, such as providing test command.
  • The test results, such as pasting the results comparison before and after, or e2e results
  • (Optional) The necessary documentation update, such as updating supported_models.md and examples for a new model.
  • (Optional) Release notes update. If your change is user facing, please update the release notes draft in the Google Doc.

@loganlebanoff
Copy link

@chaunceyjiang just wondering if this PR will be merged in soon. I’m really looking forward to this feature! 🙂

@Dorsivan
Copy link

Dorsivan commented Jan 5, 2026

Can I help expedite this in some way?

@SaltFish11
Copy link

@chaunceyjiang hello, Could you please let me know roughly when this PR will be merged? I'm really looking forward to it.

@chaunceyjiang
Copy link
Collaborator Author

I’ll push this forward this week. @SaltFish11 @Dorsivan @loganlebanoff

@mergify
Copy link

mergify bot commented Jan 14, 2026

This pull request has merge conflicts that must be resolved before it can be
merged. Please rebase the PR, @chaunceyjiang.

https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/syncing-a-fork

@mergify mergify bot added the needs-rebase label Jan 14, 2026
@SaltFish11
Copy link

I rebased this PR on v0.14.0, but encountered errors when applying it to the actual production scenario. the event stype is not match to openai (https://platform.openai.com/docs/api-reference/responses-streaming)

test_responses_new_branch_debug_2.log

@albertogg99
Copy link

@chaunceyjiang hello, any update on this?

@mergify
Copy link

mergify bot commented Mar 9, 2026

Hi @chaunceyjiang, the pre-commit checks have failed. Please run:

uv pip install pre-commit
pre-commit install
pre-commit run --all-files

Then, commit the changes and push to your branch.

For future commits, pre-commit will run automatically on changed files before each commit.

Tip

Is mypy failing?
mypy is run differently in CI. If the failure is related to this check, please use the following command to run it locally:
# For mypy (substitute "3.10" with the failing version if needed)
pre-commit run --hook-stage manual mypy-3.10

@chaunceyjiang chaunceyjiang added the ready ONLY add when PR is ready to merge/full CI is needed label Mar 9, 2026

@pytest.mark.asyncio
@pytest.mark.parametrize("model_name", [MODEL_NAME])
async def test_function_calling_with_streaming_expected_arguments(
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: should we move all the logic of this file into tests/entrypoints/openai/responses/test_simple.py?

non blocking: technically this file should be called test_simple_context_function_call.py while we haven't merged parsableContext with simpleContext

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: should we move all the logic of this file into tests/entrypoints/openai/responses/test_simple.py?

non blocking: technically this file should be called test_simple_context_function_call.py while we haven't merged parsableContext with simpleContext

I agree. However, when I tried to move these tests there, I found that the vllm serve in test_simple.py does not enable tool-calling.

So I decided to keep them in this file for now. We can reorganize these tests during the next refactor. What do you think?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

sounds good to me!

delta_text = current_text
delta_token_ids = current_token_ids

delta_message = tool_parser.extract_tool_calls_streaming(
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

non blocking thought for the future: maybe I could try to move this logic into Parser() also. right now the streaming logic is such that a tool call can't be output before reasoning; maybe in the future models would want that with interleaved reasoning etc

Copy link
Contributor

@qandrew qandrew left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thanks for putting this together, it will be super helpful!! just some minor comments

…treaming

Signed-off-by: chaunceyjiang <chaunceyjiang@gmail.com>
…treaming

Signed-off-by: chaunceyjiang <chaunceyjiang@gmail.com>
…treaming

Signed-off-by: chaunceyjiang <chaunceyjiang@gmail.com>
…treaming

Signed-off-by: chaunceyjiang <chaunceyjiang@gmail.com>
…treaming

Signed-off-by: chaunceyjiang <chaunceyjiang@gmail.com>
…treaming

Signed-off-by: chaunceyjiang <chaunceyjiang@gmail.com>
…treaming

Signed-off-by: chaunceyjiang <chaunceyjiang@gmail.com>
…treaming

Signed-off-by: chaunceyjiang <chaunceyjiang@gmail.com>
…treaming

Signed-off-by: chaunceyjiang <chaunceyjiang@gmail.com>
…treaming

Signed-off-by: chaunceyjiang <chaunceyjiang@gmail.com>
…treaming

Signed-off-by: chaunceyjiang <chaunceyjiang@gmail.com>
…treaming

Signed-off-by: chaunceyjiang <chaunceyjiang@gmail.com>
Copy link
Contributor

@qandrew qandrew left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

cc @houseroad this lgtm

@chaunceyjiang
Copy link
Collaborator Author

@DarkLight1337 PTAL.

Copy link
Member

@DarkLight1337 DarkLight1337 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am not really that familiar with tool calling code but I don't see any immediate issues with this, so stamping.

@DarkLight1337 DarkLight1337 merged commit 9fe404e into vllm-project:main Mar 12, 2026
45 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

frontend ready ONLY add when PR is ready to merge/full CI is needed v1

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants