[PR #21941] [CLOSED] fix: add synthetic tool responses for orphaned tool calls #26353

Closed
opened 2026-04-20 06:27:07 -05:00 by GiteaMirror · 0 comments
Owner

📋 Pull Request Information

Original PR: https://github.com/open-webui/open-webui/pull/21941
Author: @maxkuminov
Created: 2/27/2026
Status: Closed

Base: devHead: fix/orphaned-tool-calls


📝 Commits (10+)

📊 Changes

2 files changed (+123 additions, -0 deletions)

View changed files

backend/open_webui/test/test_convert_output.py (+106 -0)
📝 backend/open_webui/utils/misc.py (+17 -0)

📄 Description

Pull Request Checklist

  • Target branch: dev
  • Description: See below
  • Testing: All 5 new unit tests pass; manual verification confirms orphaned tool calls no longer break conversations
  • Code review: Self-reviewed
  • Title Prefix: fix:

Changelog Entry

Description

When a native function call (e.g., web search) times out or fails without producing a function_call_output, convert_output_to_messages() emits an assistant message with tool_calls but no following tool role message. All providers (OpenAI, Azure, Google) reject this as invalid, returning "Provider returned error" for every subsequent message in that chat — permanently breaking the conversation.

This is a minimal, targeted fix: after the final flush_pending() call in convert_output_to_messages(), check if the last message is an assistant with tool_calls and append synthetic tool role messages so the conversation remains valid.

Fixed

  • Orphaned tool calls (function_call without matching function_call_output) no longer corrupt conversation history. Synthetic tool responses with [Tool execution did not return a result] are appended so providers accept the message sequence.

Fixes #14577, #12135, #18121, #9435

Additional Information

Files changed:

  • backend/open_webui/utils/misc.py — 11-line addition after flush_pending() in convert_output_to_messages()
  • backend/open_webui/test/test_convert_output.py — 5 new test cases

Test plan:

  • Normal flow (function_call + function_call_output) — no change in behavior
  • Orphaned function_call at end — synthetic tool response added
  • Multiple orphaned tool calls — all get synthetic responses
  • Empty output list — returns empty
  • Output with only messages (no tool calls) — no change

Contributor License Agreement

By submitting this pull request, I confirm that I have read and fully agree to the Contributor License Agreement (CLA), and I am providing my contributions under its terms.


🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.

## 📋 Pull Request Information **Original PR:** https://github.com/open-webui/open-webui/pull/21941 **Author:** [@maxkuminov](https://github.com/maxkuminov) **Created:** 2/27/2026 **Status:** ❌ Closed **Base:** `dev` ← **Head:** `fix/orphaned-tool-calls` --- ### 📝 Commits (10+) - [`fe6783c`](https://github.com/open-webui/open-webui/commit/fe6783c16699911c7be17392596d579333fb110c) Merge pull request #19030 from open-webui/dev - [`fc05e0a`](https://github.com/open-webui/open-webui/commit/fc05e0a6c5d39da60b603b4d520f800d6e36f748) Merge pull request #19405 from open-webui/dev - [`e3faec6`](https://github.com/open-webui/open-webui/commit/e3faec62c58e3a83d89aa3df539feacefa125e0c) Merge pull request #19416 from open-webui/dev - [`9899293`](https://github.com/open-webui/open-webui/commit/9899293f050ad50ae12024cbebee7e018acd851e) Merge pull request #19448 from open-webui/dev - [`140605e`](https://github.com/open-webui/open-webui/commit/140605e660b8186a7d5c79fb3be6ffb147a2f498) Merge pull request #19462 from open-webui/dev - [`6f1486f`](https://github.com/open-webui/open-webui/commit/6f1486ffd0cb288d0e21f41845361924e0d742b3) Merge pull request #19466 from open-webui/dev - [`d95f533`](https://github.com/open-webui/open-webui/commit/d95f533214e3fe5beb5e41ec1f349940bc4c7043) Merge pull request #19729 from open-webui/dev - [`a727153`](https://github.com/open-webui/open-webui/commit/a7271532f8a38da46785afcaa7e65f9a45e7d753) 0.6.43 (#20093) - [`6adde20`](https://github.com/open-webui/open-webui/commit/6adde203cd292a9e3af9c64a2ae36b603fed096a) Merge pull request #20394 from open-webui/dev - [`f9b0534`](https://github.com/open-webui/open-webui/commit/f9b0534e0c442631d1cb7205169588b9b6204179) Merge pull request #20522 from open-webui/dev ### 📊 Changes **2 files changed** (+123 additions, -0 deletions) <details> <summary>View changed files</summary> ➕ `backend/open_webui/test/test_convert_output.py` (+106 -0) 📝 `backend/open_webui/utils/misc.py` (+17 -0) </details> ### 📄 Description # Pull Request Checklist - [x] **Target branch:** `dev` - [x] **Description:** See below - [x] **Testing:** All 5 new unit tests pass; manual verification confirms orphaned tool calls no longer break conversations - [x] **Code review:** Self-reviewed - [x] **Title Prefix:** `fix:` # Changelog Entry ### Description When a native function call (e.g., web search) times out or fails without producing a `function_call_output`, `convert_output_to_messages()` emits an assistant message with `tool_calls` but no following `tool` role message. All providers (OpenAI, Azure, Google) reject this as invalid, returning "Provider returned error" for **every subsequent message** in that chat — permanently breaking the conversation. This is a minimal, targeted fix: after the final `flush_pending()` call in `convert_output_to_messages()`, check if the last message is an assistant with `tool_calls` and append synthetic `tool` role messages so the conversation remains valid. ### Fixed - Orphaned tool calls (function_call without matching function_call_output) no longer corrupt conversation history. Synthetic tool responses with `[Tool execution did not return a result]` are appended so providers accept the message sequence. Fixes #14577, #12135, #18121, #9435 ### Additional Information **Files changed:** - `backend/open_webui/utils/misc.py` — 11-line addition after `flush_pending()` in `convert_output_to_messages()` - `backend/open_webui/test/test_convert_output.py` — 5 new test cases **Test plan:** - [x] Normal flow (function_call + function_call_output) — no change in behavior - [x] Orphaned function_call at end — synthetic tool response added - [x] Multiple orphaned tool calls — all get synthetic responses - [x] Empty output list — returns empty - [x] Output with only messages (no tool calls) — no change ### Contributor License Agreement By submitting this pull request, I confirm that I have read and fully agree to the [Contributor License Agreement (CLA)](https://github.com/open-webui/open-webui/blob/main/CONTRIBUTOR_LICENSE_AGREEMENT), and I am providing my contributions under its terms. --- <sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
GiteaMirror added the pull-request label 2026-04-20 06:27:07 -05:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: github-starred/open-webui#26353