Skip to content

[BUG] DeepSeek 等非多模态模型生成笔记失败的解决办法:Failed to deserialize the JSON body #282

@Newbee-ontheway

Description

@Newbee-ontheway

[文本由claude 4.6 thinking撰写]

问题描述

使用 DeepSeek(deepseek-chat)模型生成笔记时,即使不开启「视频理解」功能,后端仍以 OpenAI 多模态格式(content 为数组)发送请求:

[{"type": "text", "text": "..."}]

而 DeepSeek 的 deepseek-chat 模型不支持多模态格式,只接受纯文本:

"这是纯文本内容"

导致 DeepSeek 返回 Failed to deserialize the JSON body / invalid_request_error,后续 asdict() 被错误调用在 dict 上(非 dataclass),最终前端收到 null → 报 Cannot destructure property 'status' of 'G.data' as it is null。

影响范围

所有使用 非多模态模型 的用户(DeepSeek、部分 OpenAI 模型等)在不开启视频理解时都会触发此问题。

修复方案

文件: app/gpt/universal_gpt.py → create_messages() 方法
修改前 (约第43行):

# ⛳ 组装 content 数组,支持 text + image_url 混合
content = [{"type": "text", "text": content_text}]
video_img_urls = kwargs.get('video_img_urls', [])
for url in video_img_urls:
    content.append({
        "type": "image_url",
        "image_url": {"url": url, "detail": "auto"}
    })
# ✅ 正确格式:整体包在一个 message 里,role + content array
messages = [{"role": "user", "content": content}]

修改后:

# ⛳ 兼容非多模态模型(如 DeepSeek)
video_img_urls = kwargs.get('video_img_urls', [])
if video_img_urls:
    # 多模态格式:text + image_url
    content = [{"type": "text", "text": content_text}]
    for url in video_img_urls:
        content.append({
            "type": "image_url",
            "image_url": {"url": url, "detail": "auto"}
        })
else:
    # 纯文本格式:兼容所有模型
    content = content_text
messages = [{"role": "user", "content": content}]

修改理由: OpenAI 规范中,content 字段可以是 string(纯文本)或 array(多模态)。没有图片时使用 string 格式,所有 OpenAI 兼容 API 都能正确解析。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions