模型专属问题排查

本页汇总各模型在调用过程中常见的专属问题及解决方案。

Gemini:modalities 设为 image 时返回空响应但仍计费

问题现象:在请求体中设置 "modalities": ["image"] 时,可能返回的 choices 中没有内容(或 message 为空),但 usagecompletion_tokens 仍有数值(产生计费)。

核心原因modalities输出过滤器,只筛选指定类型的内容。如果模型因指令理解偏差或安全策略截断,只生成了文本而没有生成图片,接口过滤掉文本后返回的就是空响应;而模型生成这些文字所消耗的算力依然计费。

解决方案

  1. 优化 Prompt 指令:明确要求模型仅输出图像,禁止开场白与解释。
    • 错误示例:「请帮我画一个 Logo,并告诉我你的设计灵感。」
    • 正确示例:Generate a professional logo for a tech startup. Image only, no text explanation.
  2. 检查安全过滤:若 Prompt 触发安全审核,模型会返回一段拒绝文本,该文本会被 modalities 过滤掉而表现为空响应,请确保 Prompt 符合内容合规要求。
  3. 调试建议:开发阶段可暂时改为 "modalities": ["text", "image"],观察模型实际输出了什么,调整稳定后再去掉 "text"

Gemini:GCS 混合权限模式导致的访问差异(ACL vs IAM)

问题现象:使用 curl 或浏览器访问 GCS 文件成功,但 Vertex AI(代码 / 服务账号)访问报 403 Forbidden。

核心原因:存储桶配置了 uniform_bucket_level_access: false,存在两套并行的权限系统——curl 命中 ACL(文件设为 Public,通过),Vertex AI 命中 IAM(服务账号未授权,拒绝)。

sequenceDiagram
    autonumber
    participant U as Client (curl/Browser)
    participant V as Vertex AI (Service Account)
    participant G as GCS Bucket (Hybrid Mode)

    Note over G: ⚠️ 配置现状<br/>ACL: Public-Read (公开)<br/>IAM: Deny All (默认)

    U->>G: HTTP 请求 (Public URL)
    G->>G: 优先检查对象级 ACL
    Note right of G: ✅ ACL 允许 Public 读取
    G-->>U: 200 OK (成功)

    V->>G: API 调用 (Google SDK)
    G->>G: 强制检查 IAM 策略
    Note right of G: ❌ 服务账号无 IAM 角色 (忽略 ACL)
    G-->>V: 403 Forbidden (失败)

解决方案

方案操作适用场景
A. 补充 IAM 授权(立即生效)在 IAM 中为 Vertex AI 服务账号添加 Storage Object Viewer 角色。必须保留 ACL 功能,或不想更改存储桶级设置时。
B. 开启统一访问(推荐)将存储桶 uniform_bucket_level_access 更新为 true彻底禁用 ACL,所有权限统一由 IAM 管理,消除歧义。

可运行 gcloud storage buckets describe gs://xxx 查看 uniform_bucket_level_access 是否为 false,并确认 Vertex AI 使用的服务账号在存储桶的 IAM 权限列表中。

Gemini:Vertex AI 图片抓取失败(URL_REJECTED)

问题现象:调用 Vertex AI 多模态接口时报错 URL_REJECTED-REJECTED_FC_TOO_MANY_PENDINGURL_ERROR-ERROR_NOT_FOUND

核心原因跨区域回源超时。Vertex AI 的全球计算节点(如美洲)在请求 CDN 图片时,因该区域 CDN 未预热(Cold Cache),强制跨洋回源至国内源站,导致网络延迟过高或连接被阻断,最终触发获取内容失败。

解决方案

方案原理优缺点
A. 使用海外 OSS(推荐)将图片存储迁移至海外区域(如 AWS S3 US-East 或 GCS)。优点:物理距离近,访问稳定;缺点:需要数据迁移或双写。
B. Base64 传输客户端将图片转 Base64 编码直接发送,不传 URL。优点:彻底规避网络下载步骤;缺点:请求体增大约 33%。
C. CDN 强制预热提前在海外 CDN 节点触发预热。优点:无需改动架构;缺点:难以覆盖 Vertex 调度的所有边缘区域。

排查时确认:报错是否包含 REJECTED_FC_TOO_MANY_PENDINGFetchError、图片 URL 源站是否位于中国大陆、能否在该 URL 所在区域(如海外 VPS)成功下载。

Sora:视频生成触发合规拦截

问题现象:任务状态为 failed,错误代码 moderation_blocked,提示 Possible reasons: violence, sexual

核心原因语义误判。Prompt 中的物理动作描述(如「锁链」「拖拽」)被安全系统识别为暴力冲突或受限制等高风险特征,而非用户意图表达的神话 / 玄幻场景。

解决方案:语义降噪与重构

方案原理示例(高风险 → 安全)
A. 名词抽象化(推荐)将具象刑具/物理工具替换为魔法、科幻或抽象概念。锁链 → 法器、金光绳索、混元索;手铐 → 能量环、封印符文
B. 动词中性化将「施加外力/对抗」的动词替换为「引导/跟随」类动词。拖拽 → 引导、押解、凌空而行;强制 → 履行使命、神威显现
C. 风格显性化在 Prompt 开头明确标注非现实风格。添加标签:Chinese MythologyFantasyMagical RealismCGI effect

排查时确认:Prompt 是否包含「身体接触」与「限制自由」组合的词汇、是否使用带强烈主观情绪的动词(强迫、虐待、殴打)、玄幻场景是否忘记添加 Fantasy/Magic 等风格限定词。

Sora:输入图片尺寸不匹配

问题现象:调用编辑或图生视频接口时报错 Inpaint image must match the requested width and height

核心原因:请求参数中设定的 size 与上传参考图片的实际分辨率不一致。Sora 要求输入图片的像素尺寸必须严格等于请求参数中的 widthheight。例如上传 1024×1024 的图片却设置 size: 1280x720,会校验失败。

解决方案(二选一):

  • 以图片为准:先获取源图实际宽高,将请求中的 size 修改为对应数值。
  • 以需求为准:使用图像处理工具(Photoshop、PIL 等)将源图裁剪或缩放至目标分辨率后再上传。

警告

这里的匹配是像素级相等,不仅仅是长宽比相同。例如 1000x1000500x500 比例一样但数值不同,依然会报错。

Gemini 生图接口报错「没有图片」

信息

事前建议:如果你的请求体里可能出现纯聊天、追问式内容(而非明确的生图指令),推荐直接使用 /v1/chat/completions 接口。Gemini 生图模型是图文双模态的,Chat 接口对文本和图片输出都能正常承接,可从源头规避下面的报错。

问题现象:调用 Gemini 生图模型(如 gemini-3.1-flash-image-preview)时报错「响应中没有图片」,具体表现随接口而异:

接口类型接口报错表现
同步 Images 接口/v1/images/generations/v1/images/edits直接返回 4xx,message 为 There are no images in the model's response...
异步 Fal Queue 接口/queue/fal-ai/gemini-3.1-flash-image-preview任务状态变为失败,状态 / 结果查询的 detail 中返回 no image generated(若配置了 webhook,也会回调 error)

同步 Images 接口的报错示例:

{
  "error": {
    "message": "There are no images in the model's response. Please optimize your prompt to ensure a clear intention for generating images.",
    "type": "invalid_request_error"
  }
}

核心原因:Gemini 生图模型是图文双模态模型——它既能生成图片,也能只输出纯文本。而上述接口都是「图片专用」链路,只能处理图片输出、无法解析纯文本响应。当模型这次没有生成图片时,图片专用接口拿不到图片,就会报「没有图片」。典型触发场景:Prompt 生图意图不明确被当成普通对话,或模型认为信息不足而发起追问(最常见,例如「你要什么品种的狗?」)。

解决方案

  1. 切换到 Chat 接口(推荐):改用 /v1/chat/completionshttps://api.modelink.ai/v1/chat/completions)。该接口本身就是图文双模态返回,无论模型返回图片还是追问文本都能正常承接,无需额外声明输出类型:

    curl --location --request POST 'https://api.modelink.ai/v1/chat/completions' \
    --header 'Authorization: Bearer <token>' \
    --header 'Content-Type: application/json' \
    --data-raw '{
        "model": "gemini-3.1-flash-image-preview",
        "messages": [
            { "role": "user", "content": "生成一张金毛犬在草地上奔跑的照片" }
        ]
    }'

    模型正常生图时,图片以 Base64 data URI 形式放在 choices[].message.images 中返回;若模型这次只回了文本(如发起追问),则文本会正常出现在 choices[].message.content 中,不会再报错:

    {
      "choices": [
        {
          "message": {
            "role": "assistant",
            "content": "",
            "images": [
              {
                "type": "image_url",
                "image_url": { "url": "data:image/png;base64,iVBORw0KG..." },
                "index": 0
              }
            ]
          },
          "finish_reason": "stop"
        }
      ]
    }
  2. 优化 Prompt:如必须使用图片专用接口,强制要求模型直接输出图片,例如「生成一张金毛犬在草地上奔跑的照片,不要文字描述,直接输出图片。」

信息

如果使用 Vertex AI 原生协议,responseModalities: ["Image"] 的作用是结果过滤而非生成引导:若模型仅输出文本,过滤后 content 将为空且不含图片,且生成文本消耗的 Token 仍会计费。因此不建议依赖此参数——/v1/chat/completions 默认即返回图文双模态,是最稳妥的做法。

各接口的完整参数见 API Reference:Chat 接口 · GeminiGemini 3.0 Pro(异步)Gemini 3.1 Flash(异步)Gemini 3.1 Flash Lite(异步)