Uh oh!
There was an error while loading. Please reload this page.
fix(session): keep AI SDK tool result names - #32909
Open
cyq1017 wants to merge 1 commit into
Open
Conversation
cyq1017
marked this pull request as ready for review
June 19, 2026 06:02
BernhardGruen added a commit
to BernhardGruen/opencode
that referenced
this pull request
Jun 23, 2026
…uter
## Problem
Qwen-Plus via OpenRouter sends spurious tool-input-delta and tool-input-end
events AFTER tool-result/tool-error for the same call ID, causing:
- Empty tool names ("") in UI
- SchemaError: Missing key at ["name"]
- Tool execution aborted (up to 15 per session)
- "✗ unknown Unknown failed" errors
## Root Cause
OpenRouter's proxy layer reorders events for streaming optimization.
The processor accepted spurious events and created phantom tool entries.
## Solution
Added guards in processor.ts to reject spurious events for already-completed
tool calls. This is the minimal, sufficient fix per YAGNI principle.
Added 3 integration tests to verify the guards work correctly.
## Files Changed
- packages/opencode/src/session/processor.ts: Added spurious event guards (+7 lines)
- packages/opencode/test/session/processor-effect.test.ts: Added integration tests (+179 lines)
- docs/bug-fix-qwen-spurious-tool-events.md: Bug documentation with A/B test evidence
## A/B Test Evidence
Tested with Qwen-Plus via OpenRouter (3 runs per config):
- Guards only: 0 errors (clean)
- Without guards: 12-15 errors per run
Related: Upstream PR anomalyco#32909 is insufficient without these processor guards.6 tasks
BernhardGruen added a commit
to BernhardGruen/opencode
that referenced
this pull request
Jun 24, 2026
…uter
## Problem
Qwen-Plus via OpenRouter sends spurious tool-input-delta and tool-input-end
events AFTER tool-result/tool-error for the same call ID, causing:
- Empty tool names ("") in UI
- SchemaError: Missing key at ["name"]
- Tool execution aborted (up to 15 per session)
- "✗ unknown Unknown failed" errors
## Root Cause
OpenRouter's proxy layer reorders events for streaming optimization.
The processor accepted spurious events and created phantom tool entries.
## Solution
Added guards in processor.ts to reject spurious events for already-completed
tool calls. This is the minimal, sufficient fix per YAGNI principle.
Added 3 integration tests to verify the guards work correctly.
## Files Changed
- packages/opencode/src/session/processor.ts: Added spurious event guards (+7 lines)
- packages/opencode/test/session/processor-effect.test.ts: Added integration tests (+179 lines)
- docs/bug-fix-qwen-spurious-tool-events.md: Bug documentation with A/B test evidence
## A/B Test Evidence
Tested with Qwen-Plus via OpenRouter (3 runs per config):
- Guards only: 0 errors (clean)
- Without guards: 12-15 errors per run
Related: Upstream PR anomalyco#32909 is insufficient without these processor guards.6 tasks
dylanetaft
commented
Jun 24, 2026
Would be cool to see this fixed! |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for freeto join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Issue for this PR
Closes#31646
Type of change
What does this PR do?
When the AI SDK emits a
tool-resultevent after the local tool-call name cache misses, opencode currently labels the result asunknown. The event still carriestoolName, so this uses that value before falling back tounknown.This keeps the tool result paired with the real tool name and avoids feeding an
unknowntool result back into the session history.How did you verify your code works?
bun test test/session/llm-ai-sdk.test.tsbun test test/session/llm.test.tsbun test test/session/processor-effect.test.tsbun prettier --check packages/opencode/src/session/llm/ai-sdk.ts packages/opencode/test/session/llm-ai-sdk.test.tsgit diff --checkI also ran the local path lint command; it exited 0 with existing warnings in
ai-sdk.ts.The pre-push hook runs full monorepo typecheck and currently fails in unrelated
packages/ui/packages/enterprisefiles before this change. This PR only changes the AI SDK adapter and its focused test.Screenshots / recordings
N/A
Checklist