Skip to content

fix(session): keep AI SDK tool result names - #32909

Open
cyq1017 wants to merge 1 commit into
anomalyco:devfrom
cyq1017:codex/opencode-31646-ai-sdk-tool-name
Open

fix(session): keep AI SDK tool result names#32909
cyq1017 wants to merge 1 commit into
anomalyco:devfrom
cyq1017:codex/opencode-31646-ai-sdk-tool-name

Conversation

@cyq1017

Copy link
Copy Markdown

Issue for this PR

Closes#31646

Type of change

  • Bug fix
  • New feature
  • Refactor / code improvement
  • Documentation

What does this PR do?

When the AI SDK emits a tool-result event after the local tool-call name cache misses, opencode currently labels the result as unknown. The event still carries toolName, so this uses that value before falling back to unknown.

This keeps the tool result paired with the real tool name and avoids feeding an unknown tool result back into the session history.

How did you verify your code works?

  • bun test test/session/llm-ai-sdk.test.ts
  • bun test test/session/llm.test.ts
  • bun test test/session/processor-effect.test.ts
  • bun prettier --check packages/opencode/src/session/llm/ai-sdk.ts packages/opencode/test/session/llm-ai-sdk.test.ts
  • git diff --check

I 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/enterprise files before this change. This PR only changes the AI SDK adapter and its focused test.

Screenshots / recordings

N/A

Checklist

  • I have tested my changes locally
  • I have not included unrelated changes in this PR

@cyq1017
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.
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.
@dylanetaft

Copy link
Copy Markdown

Would be cool to see this fixed!

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Agent repeatedly tries to call non-existent unknown tool and gets stuck in failure loop

2 participants

@cyq1017@dylanetaft