open-webui/backend/open_webui/utils
Bugale Bugalit 29f757490e fix: don't drop a tool call whose id an earlier round already used
The tool loop builds `output` once per request but runs many rounds inside it,
and each round skips a function_call whose id appears anywhere in `output` -
including rounds already completed. Results are rebuilt per round and appended
regardless, so an id a later round reuses loses its call and keeps its result.

The turn then holds function_call_output items with no function_call, and the
next request fails at the provider with "tool message tool_call_id '...' does
not match any tool call in the preceding assistant messages". The malformed turn
is persisted, so retrying cannot succeed and every later message in that chat
fails the same way.

Renaming a reused id restores the pairing. Scoped to ids that are already
answered, so the case the dedup exists for - Responses API items already in
`output` and still awaiting a result - is untouched.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-09 17:55:32 +03:00
..
access_control perf: build debug log messages lazily so disabled debug logs cost nothing (#27834) 2026-07-31 19:09:01 -05:00
images perf: build debug log messages lazily so disabled debug logs cost nothing (#27834) 2026-07-31 19:09:01 -05:00
mcp refac 2026-06-29 11:56:00 -05:00
telemetry refac(telemetry): drop deprecated semconv SpanAttributes subclass (#25784) 2026-06-29 02:05:34 -05:00
actions.py fix: enforce action availability and model access on the chat action route (#27243) 2026-07-23 12:23:05 -04:00
anthropic.py refac 2026-07-31 17:41:14 -04:00
asgi_middleware.py fix: report sub-second timings in the X-Process-Time header (#27368) 2026-07-23 18:09:23 -05:00
audit.py perf: build debug log messages lazily so disabled debug logs cost nothing (#27834) 2026-07-31 19:09:01 -05:00
auth.py perf: build info log messages lazily so raising the log level actually saves work (#27837) 2026-08-02 15:39:10 -05:00
automations.py refac 2026-08-05 10:37:38 -05:00
calendar.py refac 2026-07-31 17:30:47 -04:00
channels.py refac 2026-03-17 17:58:01 -05:00
chat.py perf: build info log messages lazily so raising the log level actually saves work (#27837) 2026-08-02 15:39:10 -05:00
chat_fork.py refac 2026-07-23 02:54:56 -04:00
chat_id.py refac 2026-07-26 21:12:14 -04:00
chat_variables.py refac 2026-07-31 17:41:14 -04:00
code_interpreter.py refac 2026-07-31 17:41:14 -04:00
context_compaction.py refac 2026-07-31 17:41:14 -04:00
embeddings.py refac: modernize type annotations (PEP 604 / PEP 585) 2026-05-12 17:10:15 +09:00
files.py refac 2026-07-23 21:29:33 -04:00
filter.py perf: build debug log messages lazily so disabled debug logs cost nothing (#27834) 2026-07-31 19:09:01 -05:00
groups.py refac: modernize type annotations (PEP 604 / PEP 585) 2026-05-12 17:10:15 +09:00
headers.py chore: format 2026-07-27 00:12:47 -04:00
json_codec.py perf: take the orjson fast path for ensure_ascii=False callers (#27841) 2026-07-31 20:39:10 -05:00
json_response.py perf: optional orjson JSON codec behind ENABLE_ORJSON (#27583) 2026-07-27 03:45:37 -04:00
logger.py refac 2026-07-31 17:41:14 -04:00
memory.py perf: build debug log messages lazily so disabled debug logs cost nothing (#27834) 2026-07-31 19:09:01 -05:00
middleware.py fix: don't drop a tool call whose id an earlier round already used 2026-08-09 17:55:32 +03:00
misc.py perf: build info log messages lazily so raising the log level actually saves work (#27837) 2026-08-02 15:39:10 -05:00
model_ids.py refac 2026-07-26 23:09:22 -04:00
models.py perf: build info log messages lazily so raising the log level actually saves work (#27837) 2026-08-02 15:39:10 -05:00
notifications.py refac 2026-07-27 19:39:36 -04:00
oauth.py perf: build info log messages lazily so raising the log level actually saves work (#27837) 2026-08-02 15:39:10 -05:00
payload.py refac 2026-07-31 17:41:14 -04:00
pdf_generator.py refac: modernize type annotations (PEP 604 / PEP 585) 2026-05-12 17:10:15 +09:00
plugin.py perf: build info log messages lazily so raising the log level actually saves work (#27837) 2026-08-02 15:39:10 -05:00
rate_limit.py refac: modernize type annotations (PEP 604 / PEP 585) 2026-05-12 17:10:15 +09:00
redis.py fix: Set default Redis socket timeout to None (#27104) 2026-07-27 00:30:00 -04:00
response.py refac 2026-07-31 17:41:14 -04:00
sanitize.py refac 2026-03-17 17:58:01 -05:00
security_headers.py perf: stop recomputing static work in per-response ASGI middlewares (#27229) 2026-07-23 12:29:01 -04:00
session_pool.py refac 2026-07-27 04:17:00 -04:00
subagents.py refac 2026-07-31 17:41:14 -04:00
task.py refac 2026-06-19 00:16:06 +02:00
terminals.py refac 2026-07-10 18:32:21 -05:00
timers.py refac 2026-07-31 17:41:14 -04:00
tools.py perf: build debug log messages lazily so disabled debug logs cost nothing (#27834) 2026-07-31 19:09:01 -05:00
validate.py refac 2026-07-27 19:39:36 -04:00
valves.py refac 2026-07-31 17:41:14 -04:00
webhook.py perf: build debug log messages lazily so disabled debug logs cost nothing (#27834) 2026-07-31 19:09:01 -05:00