Skip to content

fix: add final empty-content guard in message() pipeline#34272

Open
Oxygen56 wants to merge 2 commits into
anomalyco:devfrom
Oxygen56:fix/empty-content-guard
Open

fix: add final empty-content guard in message() pipeline#34272
Oxygen56 wants to merge 2 commits into
anomalyco:devfrom
Oxygen56:fix/empty-content-guard

Conversation

@Oxygen56

Copy link
Copy Markdown

Issue for this PR

Closes #23260
Closes #26320

Type of change

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

What does this PR do?

Adds a provider-agnostic empty-content guard at the end of the message() function in packages/opencode/src/provider/transform.ts. The guard filters out messages with empty content (empty string, empty array, or all-empty text/reasoning parts) before they reach any provider API.

Previously only Anthropic and Bedrock had provider-specific guards; every other provider — including DeepSeek — could receive messages with empty content and fail with hard errors (e.g. DeepSeek: 400 Bad Request: messages.N: all messages must have non-empty content).

The fix is a single O(n) filter (~15 lines) at the end of message(), provider-agnostic by design.

How did you verify your code works?

Added 5 unit tests in packages/opencode/test/provider/transform.test.ts covering: empty string content, empty array content, all-empty text parts, mixed valid/invalid messages, and provider-agnostic behavior (verified with both DeepSeek and OpenAI model fixtures).

The DeepSeek reproduction case is documented in #23260 (comment)

Screenshots / recordings

N/A (not a UI change)

Checklist

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

Re-creation of #33647 and #33706, both closed by bot timer rather than content issues.

Oxygen56 added 2 commits June 24, 2026 19:13
Adds a provider-agnostic safety net at the end of the message()
function that filters out messages with empty string content or
empty array content before they reach any provider API.

Previously only Anthropic and Bedrock had local guards; providers
like DeepSeek would receive messages with empty content and fail
with "messages.N: all messages must have non-empty content".

Fixes anomalyco#23260
Covers empty string content, empty array content, all-empty text
parts, mixed valid/invalid messages, and provider-agnostic behavior.

Ref anomalyco#23260
@github-actions

Copy link
Copy Markdown
Contributor

The following comment was made by an LLM, it may be inaccurate:

Based on my search results, I found several related PRs that address similar issues with empty content handling in messages:

Related PRs:

  1. fix(provider): drop whitespace-only text blocks for Anthropic/Bedrock #31376 - fix(provider): drop whitespace-only text blocks for Anthropic/Bedrock - Similar provider-specific empty content filtering
  2. fix(session): skip empty text parts in assistant message replay #31045 - fix(session): skip empty text parts in assistant message replay - Handles empty text parts in messages
  3. refactor(provider): extract helpers from normalizeMessages #31599 - refactor(provider): extract helpers from normalizeMessages - Refactors message normalization logic
  4. fix: preserve thinking/redacted_thinking blocks in Anthropic message transforms #23755 - fix: preserve thinking/redacted_thinking blocks in Anthropic message transforms - Related to Anthropic message handling

These are contextually related but appear to address different aspects of message handling. The most relevant is #31376 which also filters empty/whitespace content, though it was provider-specific to Anthropic/Bedrock while PR #34272 extends this to be provider-agnostic.

No direct duplicate PRs found - PR #34272 appears to be a legitimate new approach to consolidate empty-content filtering across all providers at the pipeline level rather than provider-specific implementations.

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

Labels

None yet

Projects

None yet

1 participant