fix: add final empty-content guard in message() pipeline#33706
Open
Oxygen56 wants to merge 2 commits into
Open
fix: add final empty-content guard in message() pipeline#33706Oxygen56 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
|
This PR doesn't fully meet our contributing guidelines and PR template. What needs to be fixed:
Please edit this PR description to address the above within 2 hours, or it will be automatically closed. If you believe this was flagged incorrectly, please let a maintainer know. |
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 that permanently break the active session (e.g. DeepSeek returns
400 Bad Request: messages.N: all messages must have non-empty content).The fix is a single O(n) filter (~15 lines) placed at the end of
message(), provider-agnostic by design, catching all current and future empty-content sources (unsupportedParts, normalizeMessages, interleaved reasoning filter, etc.).How did you verify your code works?
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 models)Screenshots / recordings
N/A (not a UI change)
Checklist
Re-creation of #33647 which was closed by bot timer