fix: add final empty-content guard in message() pipeline - #34272
fix: add final empty-content guard in message() pipeline#34272Oxygen56 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
|
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. |
|
Automated PR Cleanup Thank you for contributing to opencode. Due to the high volume of PRs from users and AI agents, we periodically close older PRs using automated criteria so maintainers can focus review time on the most active and community-supported contributions. This PR was closed because it matched the following cleanup criteria:
PRs created within the last month are not affected by this cleanup. If you believe this PR was closed incorrectly, or if you are still actively working on it, please leave a comment explaining why it should be reopened. A maintainer can review and reopen it if appropriate. Thanks again for taking the time to contribute. |
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.