Skip to content

[Bugfix] [Frontend] Cleanup gpt-oss non-streaming chat tool calls#25514

Merged
mgoin merged 2 commits intovllm-project:mainfrom
bbrowning:gpt-oss-tool-calling-chat
Sep 24, 2025
Merged

[Bugfix] [Frontend] Cleanup gpt-oss non-streaming chat tool calls#25514
mgoin merged 2 commits intovllm-project:mainfrom
bbrowning:gpt-oss-tool-calling-chat

Conversation

@bbrowning
Copy link
Contributor

@bbrowning bbrowning commented Sep 23, 2025

Purpose

This fixes an issue identified in #22337 that was not entirely fixed by #22386 around tool call parsing in gpt-oss models in the non-streaming case and the model output returned to the user.

The main change here is to remove the parsed tool call out of the ChatCompletion message content, so that the generated tool call only shows up in its parsed form as an entry in tool_calls instead of in both tool_calls and content.

A small related change is to ensure we're not sending newline characters in the JSON arguments string of the parsed tool call, since we don't do this for other tool calls.

Together these should get non-streaming tool calls via the Chat Completions API working for gpt-oss models for typical use-cases. There may still be some edge cases the openai_tool_parser.py and/or serving_chat.py code need to handle, but this at least closes some known gaps.

Test Plan

A couple of tests were tweaked here to test for both of these fixes. I ensured the tests failed before my fixes, and that they now pass with the fixes.

Here's how I ran the changed tests:

pytest -sv tests/tool_use/test_openai_tool_parser.py
pytest -sv tests/entrypoints/openai/test_serving_chat.py

I also manually ran the example shown in #22337, copied here for completeness sake:

from openai import OpenAI

client = OpenAI(
    base_url="http://localhost:8000/v1",
    api_key="fake"
)
tools = [
    {
        "type": "function",
        "function": {
            "name": "get_weather",
            "description": "Get current weather in a given city",
            "parameters": {
                "type": "object",
                "properties": {"city": {"type": "string"}},
                "required": ["city"]
            },
        },
    }
]
response = client.chat.completions.create(
    model="openai/gpt-oss-120b",
    messages=[{"role": "user", "content": "What's the weather in Berlin right now?"}],
    tools=tools,
    tool_choice="required"
)

print(response.choices[0].message)

This example was run from a recent main of vLLM with my changes from this PR, as below:

vllm serve openai/gpt-oss-120b \
  --async-scheduling \
  --tensor-parallel-size 4 \
  --enable-auto-tool-choice \
  --tool-call-parser openai

Test Result

All tests in the test commands described above passed.

In addition, I ran this manual test taken from #22337 and it now turns the expected content:

ChatCompletionMessage(content=None, refusal=None, role='assistant', annotations=None, audio=None, function_call=None, tool_calls=[ChatCompletionMessageFunctionToolCall(id='chatcmpl-tool-7567964c8f8447e89e64b23eecbc7931', function=Function(arguments='{"city": "Berlin"}', name='get_weather'), type='function')], reasoning_content='User asks for current weather in Berlin. We have a function get_weather. Use it.')

For reference, here is the old (ie wrong) results from before my change:

ChatCompletionMessage(content='{\n "city": "Berlin"\n}', refusal=None, role='assistant', annotations=None, audio=None, function_call=None, tool_calls=[ChatCompletionMessageFunctionToolCall(id='chatcmpl-tool-f229827765c04578ad151be5fb69c79c', function=Function(arguments='{\n "city": "Berlin"\n}', name='get_weather'), type='function')], reasoning_content='User asks for current weather in Berlin. We have a function get_weather. We need to call it with city "Berlin".')

Note that the wrong content includes the function call within the content parameter, which it should not. And see it also includes newline characters within the JSON arguments string, which may be ok but is not consistent with the JSON strings we return from other tool call parsers that don't include any newlines.

This fixes an issue identified in vllm-project#22337 that was not entirely fixed
by vllm-project#22386 around tool call parsing in gpt-oss models in the
non-streaming case and the model output returned to the user.

The main change here is to remove the parsed tool call out of the
ChatCompletion message `content`, so that the generated tool call only
shows up in its parsed form as an entry in `tool_calls` instead of in
both `tool_calls` and `content`.

A small related change is to ensure we're not sending newline
characters in the JSON arguments string of the parsed tool call, since
we don't do this for other tool calls.

Together these should get non-streaming tool calls via the Chat
Completions API working for gpt-oss models for typical
use-cases. There may still be some edge cases the
openai_tool_parser.py and/or serving_chat.py code need to handle, but
this at least closes some known gaps.

A couple of unit tests were tweaked here to test for both of these
fixes. I ensured the tests failed before my fixes, and that they now
pass with the fixes.

Signed-off-by: Ben Browning <bbrownin@redhat.com>
Copy link
Contributor

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

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

Code Review

This pull request effectively addresses a bug in non-streaming tool call parsing for gpt-oss models by ensuring tool call data is not duplicated in the content field and by normalizing the JSON in tool call arguments. The changes in the tests and application logic are sound. However, I've identified a critical issue in openai_tool_parser.py where the new JSON parsing logic could lead to server crashes due to unhandled exceptions for empty or invalid JSON content. I've provided a suggestion to make the implementation more robust.

This adds a few more edge case tests and more defensive checks in
openai_tool_parser.py to ensure we handle cases where the model may
produce invalid JSON or not JSON at all. This also adds a test to
verify we properly return the final content of the response if one was
supplied - that worked before, but there was no test to confirm
that. And, a few more tests for edges cases like no arguments or empty
arguments handling.

Signed-off-by: Ben Browning <bbrownin@redhat.com>
@bbrowning
Copy link
Contributor Author

I pushed an additional commit here to add more tests and checks of the openai tool parser, handling cases such as non-json content types, invalid json, empty arguments, no arguments, and tool_call responses that also return content via the final Harmony channel. This additional commit addresses all the useful issues raised by the Gemini code review bot.

Copy link
Collaborator

@aarnphm aarnphm 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 this fix

@github-project-automation github-project-automation bot moved this from To Triage to Ready in gpt-oss Issues & Enhancements Sep 23, 2025
@mgoin mgoin enabled auto-merge (squash) September 24, 2025 01:50
@github-actions github-actions bot added the ready ONLY add when PR is ready to merge/full CI is needed label Sep 24, 2025
@mgoin mgoin merged commit 5caaeb7 into vllm-project:main Sep 24, 2025
53 checks passed
@bbrowning bbrowning deleted the gpt-oss-tool-calling-chat branch September 24, 2025 11:48
FeiDaLI pushed a commit to FeiDaLI/vllm that referenced this pull request Sep 25, 2025
@alew3
Copy link

alew3 commented Sep 25, 2025

@bbrowning non streaming seems to be working great! But in streaming mode (not sure if this is suppose to fix it) tool calling doesn't work most of the time :-(

@bbrowning
Copy link
Contributor Author

@alew3 This PR did not change the streaming code, but I'm more than happy to take a look. Can you point me to an issue or open a new one with what you're seeing on the streaming side of things?

@PedroMiolaSilva
Copy link

PedroMiolaSilva commented Sep 26, 2025

Thanks for this, it is really helpful!! @bbrowning here an example :

The curl:

curl -N -sS 'http://localhost:8000/v1/chat/completions' \
  -H 'Content-Type: application/json' \
  -d '{
  "model": "openai/gpt-oss-20b",
  "temperature": 0.1,
  "stream": true,
  "tool_choice": "auto",
  "tools": [
    {
      "type": "function",
      "function": {
        "name": "mcp__search_docs_and_site",
        "description": "This tool provides information and assistance related the documentation and website",
        "parameters": {
          "type": "object",
          "properties": {
          "query": {
               "type": "string",
               "description": "The query to be searched"
           }
          },
          "required": ["query"],
          "additionalProperties": true,
          "$schema": "http://json-schema.org/draft-07/schema#"
        }
      }
    },
    {
      "type": "function",
      "function": {
        "name": "mcp__search_code_samples",
        "description": "Performs a search to retrieve code libraries and code samples",
        "parameters": {
          "type": "object",
          "properties": {
          "query": {
               "type": "string",
               "description": "The query to be searched"
             }
          },
          "required": ["query"],
          "additionalProperties": true,
          "$schema": "http://json-schema.org/draft-07/schema#"
        }
      }
    },
    {
      "type": "function",
      "function": {
        "name": "mcp__search_cli_commands",
        "description": "This tool provides information and assistance related to Command Line Interface CLI.",
        "parameters": {
          "type": "object",
          "properties": {
          "query": {
               "type": "string",
               "description": "the query to be asked"
             }
          },
          "required": ["query"],
          "additionalProperties": true,
          "$schema": "http://json-schema.org/draft-07/schema#"
        }
      }
    },
    {
      "type": "function",
      "function": {
        "name": "mcp__search_api_commands",
        "description": "This tool provides information and assistance related to the most updated version of the API.",
        "parameters": {
          "type": "object",
          "properties": {
          "query": {
               "type": "string",
               "description": "The query to be searched"
            }
          },
          "required": ["query"],
          "additionalProperties": true,
          "$schema": "http://json-schema.org/draft-07/schema#"
        }
      }
    },
    {
      "type": "function",
      "function": {
        "name": "mcp__search_terraform",
        "description": "Performs a search to retrieve documents from terraform",
        "parameters": {
          "type": "object",
          "properties": {"query": {
               "type": "string",
               "description": "The query to be searched"
             }
          },
          "required": ["query"],
          "additionalProperties": true,
          "$schema": "http://json-schema.org/draft-07/schema#"
        }
      }
    },
    {
      "type": "function",
      "function": {
        "name": "mcp__create_rules",
        "description": "-> Performs a a search to retrieve documents specific to Rules",
        "parameters": {
          "type": "object",
          "properties": {
          "query": {
               "type": "string",
               "description": "The query to be searched"
             }
          },
          "required": ["query"],
          "additionalProperties": true,
          "$schema": "http://json-schema.org/draft-07/schema#"
        }
      }
    },
    {
      "type": "function",
      "function": {
        "name": "mcp__create_graphql_query",
        "description": "Performs a search to create graphql",
        "parameters": {
          "type": "object",
          "properties": {"query": {
               "type": "string",
               "description": "The query to be searched"
             }
          },
          "required": ["query"],
          "additionalProperties": true,
          "$schema": "http://json-schema.org/draft-07/schema#"
        }
      }
    },
    {
      "type": "function",
      "function": {
        "name": "mcp__deploy_static_site",
        "description": "Provides guides for deploying static sites",
        "parameters": {
          "type": "object",
          "properties": {
          "query": {
               "type": "string",
               "description": "The query to be searched"
             }
          },
          "required": ["query"],
          "additionalProperties": true,
          "$schema": "http://json-schema.org/draft-07/schema#"
        }
      }
    }
  ],
  "messages": [
    {
      "role": "system",
      "content": "You are a helpful assistant that have multiple tools"
    },
    {
      "role": "user",
      "content": "search in the website how to cook potatos"
    }
  ]
}'

The response:

data: {"id":"chatcmpl-beb39e7777184d59a9463d42e86d9ba2","object":"chat.completion.chunk","created":1758892077,"model":"openai/gpt-oss-20b","choices":[{"index":0,"delta":{"role":"assistant","content":""},"logprobs":null,"finish_reason":null}],"prompt_token_ids":null}

data: {"id":"chatcmpl-beb39e7777184d59a9463d42e86d9ba2","object":"chat.completion.chunk","created":1758892077,"model":"openai/gpt-oss-20b","choices":[{"index":0,"delta":{"reasoning_content":""},"logprobs":null,"finish_reason":null,"token_ids":null}]}

data: {"id":"chatcmpl-beb39e7777184d59a9463d42e86d9ba2","object":"chat.completion.chunk","created":1758892077,"model":"openai/gpt-oss-20b","choices":[{"index":0,"delta":{"reasoning_content":"We"},"logprobs":null,"finish_reason":null,"token_ids":null}]}

data: {"id":"chatcmpl-beb39e7777184d59a9463d42e86d9ba2","object":"chat.completion.chunk","created":1758892077,"model":"openai/gpt-oss-20b","choices":[{"index":0,"delta":{"reasoning_content":" need"},"logprobs":null,"finish_reason":null,"token_ids":null}]}

data: {"id":"chatcmpl-beb39e7777184d59a9463d42e86d9ba2","object":"chat.completion.chunk","created":1758892077,"model":"openai/gpt-oss-20b","choices":[{"index":0,"delta":{"reasoning_content":" to"},"logprobs":null,"finish_reason":null,"token_ids":null}]}

data: {"id":"chatcmpl-beb39e7777184d59a9463d42e86d9ba2","object":"chat.completion.chunk","created":1758892077,"model":"openai/gpt-oss-20b","choices":[{"index":0,"delta":{"reasoning_content":" use"},"logprobs":null,"finish_reason":null,"token_ids":null}]}

data: {"id":"chatcmpl-beb39e7777184d59a9463d42e86d9ba2","object":"chat.completion.chunk","created":1758892077,"model":"openai/gpt-oss-20b","choices":[{"index":0,"delta":{"reasoning_content":" the"},"logprobs":null,"finish_reason":null,"token_ids":null}]}

data: {"id":"chatcmpl-beb39e7777184d59a9463d42e86d9ba2","object":"chat.completion.chunk","created":1758892077,"model":"openai/gpt-oss-20b","choices":[{"index":0,"delta":{"reasoning_content":" tool"},"logprobs":null,"finish_reason":null,"token_ids":null}]}

data: {"id":"chatcmpl-beb39e7777184d59a9463d42e86d9ba2","object":"chat.completion.chunk","created":1758892077,"model":"openai/gpt-oss-20b","choices":[{"index":0,"delta":{"reasoning_content":" m"},"logprobs":null,"finish_reason":null,"token_ids":null}]}

data: {"id":"chatcmpl-beb39e7777184d59a9463d42e86d9ba2","object":"chat.completion.chunk","created":1758892077,"model":"openai/gpt-oss-20b","choices":[{"index":0,"delta":{"reasoning_content":"cp"},"logprobs":null,"finish_reason":null,"token_ids":null}]}

data: {"id":"chatcmpl-beb39e7777184d59a9463d42e86d9ba2","object":"chat.completion.chunk","created":1758892077,"model":"openai/gpt-oss-20b","choices":[{"index":0,"delta":{"reasoning_content":"__"},"logprobs":null,"finish_reason":null,"token_ids":null}]}

data: {"id":"chatcmpl-beb39e7777184d59a9463d42e86d9ba2","object":"chat.completion.chunk","created":1758892077,"model":"openai/gpt-oss-20b","choices":[{"index":0,"delta":{"reasoning_content":"search"},"logprobs":null,"finish_reason":null,"token_ids":null}]}

data: {"id":"chatcmpl-beb39e7777184d59a9463d42e86d9ba2","object":"chat.completion.chunk","created":1758892077,"model":"openai/gpt-oss-20b","choices":[{"index":0,"delta":{"reasoning_content":"_docs"},"logprobs":null,"finish_reason":null,"token_ids":null}]}

data: {"id":"chatcmpl-beb39e7777184d59a9463d42e86d9ba2","object":"chat.completion.chunk","created":1758892077,"model":"openai/gpt-oss-20b","choices":[{"index":0,"delta":{"reasoning_content":"_and"},"logprobs":null,"finish_reason":null,"token_ids":null}]}

data: {"id":"chatcmpl-beb39e7777184d59a9463d42e86d9ba2","object":"chat.completion.chunk","created":1758892077,"model":"openai/gpt-oss-20b","choices":[{"index":0,"delta":{"reasoning_content":"_site"},"logprobs":null,"finish_reason":null,"token_ids":null}]}

data: {"id":"chatcmpl-beb39e7777184d59a9463d42e86d9ba2","object":"chat.completion.chunk","created":1758892077,"model":"openai/gpt-oss-20b","choices":[{"index":0,"delta":{"reasoning_content":" with"},"logprobs":null,"finish_reason":null,"token_ids":null}]}

data: {"id":"chatcmpl-beb39e7777184d59a9463d42e86d9ba2","object":"chat.completion.chunk","created":1758892077,"model":"openai/gpt-oss-20b","choices":[{"index":0,"delta":{"reasoning_content":" query"},"logprobs":null,"finish_reason":null,"token_ids":null}]}

data: {"id":"chatcmpl-beb39e7777184d59a9463d42e86d9ba2","object":"chat.completion.chunk","created":1758892077,"model":"openai/gpt-oss-20b","choices":[{"index":0,"delta":{"reasoning_content":" \""},"logprobs":null,"finish_reason":null,"token_ids":null}]}

data: {"id":"chatcmpl-beb39e7777184d59a9463d42e86d9ba2","object":"chat.completion.chunk","created":1758892077,"model":"openai/gpt-oss-20b","choices":[{"index":0,"delta":{"reasoning_content":"how"},"logprobs":null,"finish_reason":null,"token_ids":null}]}

data: {"id":"chatcmpl-beb39e7777184d59a9463d42e86d9ba2","object":"chat.completion.chunk","created":1758892077,"model":"openai/gpt-oss-20b","choices":[{"index":0,"delta":{"reasoning_content":" to"},"logprobs":null,"finish_reason":null,"token_ids":null}]}

data: {"id":"chatcmpl-beb39e7777184d59a9463d42e86d9ba2","object":"chat.completion.chunk","created":1758892077,"model":"openai/gpt-oss-20b","choices":[{"index":0,"delta":{"reasoning_content":" cook"},"logprobs":null,"finish_reason":null,"token_ids":null}]}

data: {"id":"chatcmpl-beb39e7777184d59a9463d42e86d9ba2","object":"chat.completion.chunk","created":1758892077,"model":"openai/gpt-oss-20b","choices":[{"index":0,"delta":{"reasoning_content":" pot"},"logprobs":null,"finish_reason":null,"token_ids":null}]}

data: {"id":"chatcmpl-beb39e7777184d59a9463d42e86d9ba2","object":"chat.completion.chunk","created":1758892077,"model":"openai/gpt-oss-20b","choices":[{"index":0,"delta":{"reasoning_content":"atos"},"logprobs":null,"finish_reason":null,"token_ids":null}]}

data: {"id":"chatcmpl-beb39e7777184d59a9463d42e86d9ba2","object":"chat.completion.chunk","created":1758892077,"model":"openai/gpt-oss-20b","choices":[{"index":0,"delta":{"reasoning_content":"\"."},"logprobs":null,"finish_reason":null,"token_ids":null}]}

data: {"id":"chatcmpl-beb39e7777184d59a9463d42e86d9ba2","object":"chat.completion.chunk","created":1758892077,"model":"openai/gpt-oss-20b","choices":[{"index":0,"delta":{"reasoning_content":""},"logprobs":null,"finish_reason":null,"token_ids":null}]}

data: {"id":"chatcmpl-beb39e7777184d59a9463d42e86d9ba2","object":"chat.completion.chunk","created":1758892077,"model":"openai/gpt-oss-20b","choices":[{"index":0,"delta":{"reasoning_content":"{\""},"logprobs":null,"finish_reason":null,"token_ids":null}]}

data: {"id":"chatcmpl-beb39e7777184d59a9463d42e86d9ba2","object":"chat.completion.chunk","created":1758892077,"model":"openai/gpt-oss-20b","choices":[{"index":0,"delta":{"reasoning_content":"query"},"logprobs":null,"finish_reason":null,"token_ids":null}]}

data: {"id":"chatcmpl-beb39e7777184d59a9463d42e86d9ba2","object":"chat.completion.chunk","created":1758892077,"model":"openai/gpt-oss-20b","choices":[{"index":0,"delta":{"reasoning_content":"\":\""},"logprobs":null,"finish_reason":null,"token_ids":null}]}

data: {"id":"chatcmpl-beb39e7777184d59a9463d42e86d9ba2","object":"chat.completion.chunk","created":1758892077,"model":"openai/gpt-oss-20b","choices":[{"index":0,"delta":{"reasoning_content":"how"},"logprobs":null,"finish_reason":null,"token_ids":null}]}

data: {"id":"chatcmpl-beb39e7777184d59a9463d42e86d9ba2","object":"chat.completion.chunk","created":1758892077,"model":"openai/gpt-oss-20b","choices":[{"index":0,"delta":{"reasoning_content":" to"},"logprobs":null,"finish_reason":null,"token_ids":null}]}

data: {"id":"chatcmpl-beb39e7777184d59a9463d42e86d9ba2","object":"chat.completion.chunk","created":1758892077,"model":"openai/gpt-oss-20b","choices":[{"index":0,"delta":{"reasoning_content":" cook"},"logprobs":null,"finish_reason":null,"token_ids":null}]}

data: {"id":"chatcmpl-beb39e7777184d59a9463d42e86d9ba2","object":"chat.completion.chunk","created":1758892077,"model":"openai/gpt-oss-20b","choices":[{"index":0,"delta":{"reasoning_content":" pot"},"logprobs":null,"finish_reason":null,"token_ids":null}]}

data: {"id":"chatcmpl-beb39e7777184d59a9463d42e86d9ba2","object":"chat.completion.chunk","created":1758892077,"model":"openai/gpt-oss-20b","choices":[{"index":0,"delta":{"reasoning_content":"atos"},"logprobs":null,"finish_reason":null,"token_ids":null}]}

data: {"id":"chatcmpl-beb39e7777184d59a9463d42e86d9ba2","object":"chat.completion.chunk","created":1758892077,"model":"openai/gpt-oss-20b","choices":[{"index":0,"delta":{"reasoning_content":"\"}"},"logprobs":null,"finish_reason":null,"token_ids":null}]}

data: {"id":"chatcmpl-beb39e7777184d59a9463d42e86d9ba2","object":"chat.completion.chunk","created":1758892077,"model":"openai/gpt-oss-20b","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop","stop_reason":200012,"token_ids":null}]}

data: [DONE]

It is weird because sometimes it works and sometimes it don't, so I think there is something breaking the parse.

@bbrowning
Copy link
Contributor Author

@PedroMiolaSilva Thanks, looking into that. For me, your example consistently works fine with gpt-oss-120b but fails more often than not on gpt-oss-20b. On the surface, that makes me suspect the smaller model is outputting something wrong here in the 20b case, but will dig a bit further to identify exactly what's happening.

@bbrowning
Copy link
Contributor Author

Ok, the root of the issue is that with gpt-oss-20b it is sometimes emitting the tool call on the analysis Harmony channel instead of on the commentary channel. This rings a bell with some other bug reports / PRs I've seen, so will dig through to see if someone is already working on fixing this. If so, I'll link to that and if not will open something myself to fix this up.

@bbrowning
Copy link
Contributor Author

#24768 should fix this issue, or at least fixes it in my local testing. The root of the problem is in Chat Completions we are not properly enabling the commentary channel for the gpt-oss models when tool calls are passed. Because of that, sometimes the models (and especially 20b) output tool calls to the analysis channel. The fix in #24768 adjusts our system prompt generation to enable this commentary channel when a user passes in tool calls. The non-streaming parser is more lax about where it finds tool calls than the streaming parser, which is why this issue shows up more when using streaming tool calls.

@PedroMiolaSilva
Copy link

PedroMiolaSilva commented Sep 26, 2025

@bbrowning thanks a lot, will test it here also! Could you share your command so that I can try to reproduce?

@bbrowning
Copy link
Contributor Author

@PedroMiolaSilva Sure - I've been testing this with a very simple script like https://gist.github.com/bbrowning/f892ebd29ebb297643633de47e0c8197 that takes your provided tool definitions, messages, and request params and just sends those to a vLLM running locally. It then collects the streaming content, logging the reasoning content, regular content, and any tool calls (which I collect into a dict, so they output as a dict of function name and args string). When things fail, the tool call was missing or stuffed into the reasoning text. Here's an example of the valid output I look for:

Reasoning:
We need to use mcp__search_docs_and_site with query "how to cook potatoes".

Content:


Tool Calls:
{'mcp__search_docs_and_site': '{"query":"how to cook potatoes"}'}

@bbrowning bbrowning restored the gpt-oss-tool-calling-chat branch October 1, 2025 20:47
yewentao256 pushed a commit that referenced this pull request Oct 3, 2025
…5514)

Signed-off-by: Ben Browning <bbrownin@redhat.com>
Signed-off-by: yewentao256 <zhyanwentao@126.com>
choprahetarth pushed a commit to Tandemn-Labs/vllm that referenced this pull request Oct 11, 2025
lywa1998 pushed a commit to lywa1998/vllm that referenced this pull request Oct 20, 2025
rtourgeman pushed a commit to rtourgeman/vllm that referenced this pull request Nov 10, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

frontend gpt-oss Related to GPT-OSS models ready ONLY add when PR is ready to merge/full CI is needed tool-calling

Projects

Status: Done
Status: Done

Development

Successfully merging this pull request may close these issues.

5 participants