fix: add final empty-content guard in message() pipeline#34272
Open
Oxygen56 wants to merge 2 commits into
Open
fix: add final empty-content guard in message() pipeline#34272Oxygen56 wants to merge 2 commits into
Oxygen56 wants to merge 2 commits into
Conversation
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
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:
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. |
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 free
to 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 #23260
Closes #26320
Type of change
What does this PR do?
Adds a provider-agnostic empty-content guard at the end of the
message()function inpackages/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.tscovering: 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
Re-creation of #33647 and #33706, both closed by bot timer rather than content issues.