fix(openai): handle tool calls with empty/null arguments

When an LLM returns a tool call with no arguments (arguments=null in
the streaming chunks), the tool call is silently dropped because:

1. `tool_call.function.arguments` is None, so nothing is accumulated
   and `arguments` stays as "" (empty string)
2. `if function_name and arguments:` treats "" as falsy, skipping the
   entire tool call execution

OpenAI always sends arguments="{}" even for parameterless tools,
masking this bug. But vLLM, Ollama, and other OpenAI-compatible
providers may omit arguments entirely when the tool schema has no
required parameters, causing tool calls to be silently ignored.

Fix: check only `function_name` (not `arguments`) and default empty
arguments to "{}" so `json.loads` produces an empty dict. Apply the
same fallback for intermediate tool calls in multi-tool responses.
This commit is contained in:
Yavuz Alp Sencer ÖZTÜRK
2026-03-17 19:44:59 +03:00
parent 248419a7c4
commit 9a55eb67cf

View File

@@ -532,7 +532,7 @@ class BaseOpenAILLMService(LLMService):
tool_call = chunk.choices[0].delta.tool_calls[0]
if tool_call.index != func_idx:
functions_list.append(function_name)
arguments_list.append(arguments)
arguments_list.append(arguments or "{}")
tool_id_list.append(tool_call_id)
function_name = ""
arguments = ""
@@ -558,10 +558,10 @@ class BaseOpenAILLMService(LLMService):
# a registered handler. If so, run the registered callback, save the result to
# the context, and re-prompt to get a chat answer. If we don't have a registered
# handler, raise an exception.
if function_name and arguments:
if function_name:
# added to the list as last function name and arguments not added to the list
functions_list.append(function_name)
arguments_list.append(arguments)
arguments_list.append(arguments or "{}")
tool_id_list.append(tool_call_id)
function_calls = []