fix: Gemini & Vertex empty content error - #1260
Conversation
WalkthroughThe update changes the logic in the Changes
Poem
📜 Recent review detailsConfiguration used: CodeRabbit UI 📒 Files selected for processing (1)
🔇 Additional comments (1)
✨ Finishing Touches
🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
SupportNeed help? Create a ticket on our support page for assistance with any issues or questions. Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
|
感谢大佬的帮助,也遇到类似问题 |
|
经过一天更广的用于多场景测试,确定parts相关问题已经修复,且多个复杂场景都使用正常。 |
…nt-error fix: Gemini & Vertex empty content error
PR 报告:修复 Gemini/Vertex 因消息内容为空导致的请求失败问题
一、问题描述
问题现象:
当 API 请求中
messages数组包含content字段为空的条目时,向 Gemini 及 Vertex 渠道发送的请求会失败,上游服务返回400 Bad Request错误。复现步骤:
上游错误响应 (Error Response):
{ "error": { "message": "Unable to submit request because it must include at least one parts field...", "code": 400 } }背景:
此问题在多个客户端(如 SillyTavern, Cherry Studio 等)中都有出现,推测可能与上游服务(Google)近期对 API 请求参数校验规则的调整有关(因为最近才收到比较多的反馈)。
二、根本原因分析
在请求转换过程中,项目将 OpenAI 格式的
messages转换为 Gemini 格式。当遇到content为空的message时,会生成一个parts字段为null的content对象。转换后错误的请求体片段:
{ "contents": [ { "role": "user", "parts": [{ "text": "hello" }] }, { "role": "user", "parts": null // 此处为问题根源 } ] }根据 Gemini API 的规范,
parts字段必须是一个包含至少一个有效元素的数组,null值或空数组均不被接受,从而导致请求校验失败。三、解决方案
在将消息转换为 Gemini 格式的
contents数组时,增加一道过滤逻辑:如果一个message对象转换后的parts数组为空,则直接跳过该消息,不将其添加到最终的contents数组中。代码实现:
在
relay/channel/gemini/relay-gemini.go文件约 377 行处,增加对parts数组长度的判断。此修改可以从根本上避免生成不符合上游规范的请求体。
四、测试与验证
已在本地环境完成以下场景的回归测试,确保修复方案的正确性,且未引入新的问题:
除了本地自测之外,也正在邀请我站内的用户进行更大范围的用户场景测试,也许1,2天后会更新多场景测试结果。此修复对于提升 Gemini 渠道的稳定性至关重要,建议合并。
Summary by CodeRabbit