Skip to content

fix(ai): drop empty unfinished reasoning items on replay - #53603

Merged
rekram1-node merged 2 commits into
v2from
stale-reasoning-item
Oct 7, 2026
Merged

rekram1-node merged 2 commits into
v2from
stale-reasoning-item

Conversation

@rekram1-node

Copy link
Copy Markdown
Collaborator

Fixes #48319

Summary

When a Responses stream starts a reasoning item (response.output_item.added), OpenCode immediately persists session.reasoning.started with text: "" and state: { itemId: "rs_...", reasoningEncryptedContent: null } (encrypted_content only arrives on response.output_item.done).

If the server process dies or restarts abruptly mid-stream before session.reasoning.ended / session.step.failed is written:

  1. to-llm-message.ts only checked message.error === undefined and therefore treated the uncompleted reasoning stub (time.completed === undefined) as having replayable providerMetadata.
  2. OpenResponses.lowerMessages emitted an empty shell { type: "reasoning", id: "rs_A:rs_B", summary: [], encrypted_content: null } with neither summary text nor encrypted_content, which Responses backends reject with 400 Referenced reasoning item 'rs_A:rs_B' was not found or has expired on every subsequent turn.

Changes

  • packages/core/src/session/runner/to-llm-message.ts: When an assistant message contains an uncompleted reasoning block (item.time !== undefined && item.time.completed === undefined), do not replay reasoning providerMetadata (state) and downgrade any non-empty partial summary text to "text", matching the existing message.error !== undefined path.
  • packages/ai/src/protocols/open-responses.ts: After folding reasoning summary parts by itemId in lowerMessages, drop reasoning items that have neither summary text nor non-empty encrypted_content.

@rekram1-node
rekram1-node merged commit 8b02c4e into v2 Oct 7, 2026
9 checks passed
@rekram1-node
rekram1-node deleted the stale-reasoning-item branch October 7, 2026 00:03
Sign up for free to 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.

1 participant