DeepSeek Harness 多模态
DeepSeek 上线了实验性质的多模态视觉理解模型 DeepSeek-V4-Flash-Vision-Exp,并同步开放多模态 API 服务与免费的 Files API。
使用前安装最新版本:
npm install -g @deepseek-ai/dsh@latest
更新到最新版后,可以看到模型已经有了 DeepSeek-V4-Flash-Vision-Exp:

切换到视觉模型,然后我们可以直接推动图片或者 ppt 文件到文档中,让它看看图片中的内容( 测试图片下载):

什么是多模态
要理解多模态,先要理解"模态"(modality)这个词,模态指的是信息的不同表现形式:文字是一种模态,图片、音频、视频各自也是不同的模态。
| 模态 | 常见形式 | 对应的 AI 能力 |
|---|---|---|
| 文本 | 文章、代码、对话 | 大语言模型(LLM) |
| 图像 | 照片、截图、设计稿、图表 | 视觉理解模型 |
| 音频 | 语音、音乐 | 语音识别与生成模型 |
| 视频 | 短片、录屏、监控画面 | 视频理解模型 |
过去的大语言模型只处理文本一种模态,你发给它的所有内容都必须先变成文字。
多模态模型则可以同时接收图片和文字,把它们统一转换成 token 序列后一起处理。
关键在于:图片并不是被模型"直接看到"的,而是先由视觉编码器切成小块(patch)并转成向量,再与文本 token 拼成同一个序列。
图片也会消耗 token,一张图片最多占 384 tokens,这正是后文多模态计费规则的来源。
对 Agent 来说,多模态带来的是质变,而不是锦上添花。
| 对比项 | 纯文本模型 | 多模态模型 |
|---|---|---|
| 输入形式 | 只有文字 | 文字与图片混合 |
| 排查代码报错 | 需要用户把报错手动抄成文字 | 直接发送报错截图 |
| 还原设计稿 | 无法参考视觉稿 | 对照设计稿直接写页面 |
| 分析数据图表 | 读不到图片里的图 | 看图直接给结论 |
V4-Flash-Vision-Exp:多模态视觉模型上线
DeepSeek-V4-Flash-Vision-Exp 是一个实验性质的多模态视觉理解模型,现已上线 DeepSeek API 平台。
用户通过设置 model='deepseek-v4-flash-vision-exp' 即可访问该模型。
它的能力定位可以用一句话概括:文本能力不缩水,视觉能力大跃升。
在纯文本能力(Agent、推理、世界知识等)方面,它与 DeepSeek-V4-Flash 正式版持平。
在需要视觉理解的 Agent Benchmark 上,它相比 DeepSeek-V4-Flash 实现了大幅跃升,多模态 Agent 能力已接近 Opus-4.8。
| 能力维度 | DeepSeek-V4-Flash | DeepSeek-V4-Flash-Vision-Exp |
|---|---|---|
| 纯文本 Agent 任务 | 正式版基准 | 与正式版持平 |
| 推理与世界知识 | 正式版基准 | 与正式版持平 |
| 视觉理解 Agent 任务 | 不支持,测评中忽略多模态元素 | 大幅跃升,接近 Opus-4.8 |
| 模型定位 | 正式版 | 实验版 |
测评口径说明:对于公开基准测试集中的 Code Agent 文本任务,DeepSeek 系列模型使用 DeepSeek Harness 极简模式作为框架进行测试,使用 max 档位,temperature=1.0,topp=0.95。
在 ApexBench 与 Agents' Last Exam 测评中,文本模型 DeepSeek-V4-Flash 会忽略其中的多模态元素。
多模态 API 快速开始
多模态 API 支持 Chat Completions、Messages、Responses 三种格式调用,可以方便地接入各类 Agent 工具。
三种格式的能力一致,按你熟悉的接口风格选择即可。
| 调用格式 | 接口风格 | 适合谁用 |
|---|---|---|
| Chat Completions | OpenAI 经典对话接口 | 已有 OpenAI SDK 代码的开发者 |
| Messages | Anthropic Messages 接口,base_url 为 https://api.deepseek.com/anthropic | 已有 Anthropic 风格代码或工具链的开发者 |
| Responses | OpenAI 新版 Responses 接口 | 使用新版 SDK、偏好简洁输入结构的开发者 |
三种格式都支持图文混合输入,图片有 base64 内联、外部 URL、Files API 三种传入方式。
| 传入方式 | 请求体大小 | 是否需要图床 | 适用场景 |
|---|---|---|---|
| base64 内联 | 大 | 不需要 | 本地图片、一次性小图 |
| 外部 URL | 小 | 需要 | 图片已部署在可公开访问的服务器 |
| Files API | 小 | 不需要 | 同一张图片多次使用、高频批量任务 |
方式一:base64 内联
本地图片编码成 base64 字符串后,以 data URL 的形式直接写进请求体。
实例
# 依赖:pip install openai
import base64
from openai import OpenAI
# DeepSeek 端点兼容 OpenAI SDK,改 base_url 即可切换
client = OpenAI(
api_key="sk-你的密钥", # 必填:替换为你自己的 DeepSeek API 密钥
base_url="https://api.deepseek.com" # 必填:DeepSeek 官方端点
)
# 读入本地图片,编码成 base64 字符串
with open("runoob-logo.png", "rb") as f:
b64 = base64.b64encode(f.read()).decode("utf-8")
response = client.chat.completions.create(
model="deepseek-v4-flash-vision-exp", # 必填:多模态视觉理解模型
messages=[
{
"role": "user",
"content": [
# 文本与图片按数组顺序混排,模型按顺序理解
{"type": "text", "text": "图片里的文字是什么?"},
{
"type": "image_url",
# base64 内联:data:图片格式;base64,编码内容
"image_url": {"url": f"data:image/png;base64,{b64}"}
}
]
}
],
stream=False # 可选:是否流式输出,默认 False
)
print(response.choices[0].message.content)
运行输出:
图片中的文字是 "RUNOOB"。
方式二:外部 URL
图片部署在可公开访问的服务器上,请求里只传一个 URL 字符串,请求体很小。
实例
curl https://api.deepseek.com/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${DEEPSEEK_API_KEY}" \
-d '{
"model": "deepseek-v4-flash-vision-exp",
"messages": [
{
"role": "user",
"content": [
{"type": "text", "text": "用一段话总结这张图表的趋势"},
{"type": "image_url", "image_url": {"url": "https://static.runoob.com/images/chart-demo.png"}}
]
}
]
}'
URL 必须是平台可访问的公网地址,内网地址与本地回环地址都无法被拉取。
base64 与 URL 两种方式都可以在 image_url 里加一个可选的 detail 字段,控制图片的解析精度。
| detail 取值 | 行为 | 适用场景 |
|---|---|---|
| low | 缩放到 512×512 再解析,token 消耗少 | 只需要看个大概:判断图片类型、找主体 |
| high | 等价于 original | 需要看清细节 |
| original | 保留原图精度解析 | 读文字、看小图标、分析图表 |
| auto | 当前等价于 original | 默认值,不传 detail 时的行为 |
批量跑截图类任务时把 detail 设为 low,是控制多模态成本最直接的手段。
Messages 与 Responses 格式
已有 Anthropic 或新版 OpenAI 风格代码的,几乎可以无缝切换到 DeepSeek 多模态。
Messages 格式使用 image 内容块,图片通过 source 字段传入。
实例
# 端点走 DeepSeek 的 Anthropic 兼容路径 /anthropic,头字段也与 Anthropic 一致
curl https://api.deepseek.com/anthropic/v1/messages \
-H "Content-Type: application/json" \
-H "x-api-key: ${DEEPSEEK_API_KEY}" \
-d '{
"model": "deepseek-v4-flash-vision-exp",
"max_tokens": 1024,
"messages": [
{
"role": "user",
"content": [
{
"type": "image",
"source": {
"type": "url",
"url": "https://static.runoob.com/images/code-screenshot.png"
}
},
{"type": "text", "text": "这段代码运行会报错,问题出在第几行?"}
]
}
]
}'
Responses 格式使用 input 数组,文本用 input_text,图片用 input_image。
实例
# client 的创建方式与上文 base64 示例相同
response = client.responses.create(
model="deepseek-v4-flash-vision-exp", # 必填:多模态视觉理解模型
input=[
{
"role": "user",
"content": [
# 文本用 input_text,图片用 input_image
{"type": "input_text", "text": "把截图里的表格整理成 Markdown"},
{
"type": "input_image",
"image_url": "https://static.runoob.com/images/table.png"
}
]
}
]
)
# Responses 格式直接取 output_text 即可
print(response.output_text)
Files API:先上传,后引用
Files API 现已开放,该 API 不收费。
用户可以先把图片上传到平台,之后在请求中通过 file_id 引用。
这样做有两个直接好处:请求里不再携带大段 base64,节省请求带宽;同一张图片在多个请求中无需重复上传。
第一步,上传图片并拿到 file_id。
实例
# 上传本身免费,不产生任何费用
curl https://api.deepseek.com/files \
-H "Authorization: Bearer ${DEEPSEEK_API_KEY}" \
-F "purpose=user_data" \
-F "file=@runoob-chart.png"
上传成功后,平台返回文件的元信息。
实例
"id": "file-api-qw3x8v2m6n",
"object": "file",
"filename": "runoob-chart.png",
"purpose": "user_data",
"bytes": 154320,
"created_at": 1787300000,
"expires_at": 1789900000
}
| 字段 | 说明 |
|---|---|
| id | 文件标识,file-api- 开头,后续请求通过它引用图片 |
| filename | 上传时的原始文件名 |
| purpose | 文件用途,当前仅支持 user_data |
| bytes | 文件大小,单位字节 |
| created_at | 上传时间,Unix 时间戳 |
| expires_at | 过期时间,可选,仅在上传时设置了有效期才返回 |
上传时还可以用 expires_after 参数指定有效期,取值 1 小时到 30 天,不传则永久有效。
第二步,在多模态请求中用 file_id 引用这张图片。
{
"model": "deepseek-v4-flash-vision-exp",
"messages": [
{
"role": "user",
"content": [
{"type": "text", "text": "这个图表的整体趋势是什么?"},
{"type": "file", "file_id": "file-api-qw3x8v2m6n"}
]
}
]
}
什么时候用 Files API?
同一张图片要在多个请求里反复使用时(比如批量跑同一批截图的 Agent 任务),先上传一次、处处引用,比每次都传 base64 更省带宽也更快。
file 块还支持 file_data 直接内联 base64(与 file_id 互斥,可搭配 filename 字段),适合偶尔绕过上传步骤的场景。
经 Anthropic 兼容的 Messages 端点引用 file_id 时,需要额外带上请求头 anthropic-beta: files-api-2025-04-14。
计费说明与注意事项
多模态请求按 token 计费,图片会被转换成 token 后参与计费。
| 计费项 | 规则 |
|---|---|
| 图片计费 | 图片转换成 token 后按 token 计费 |
| 单张图片上限 | 最多占 384 tokens |
| 价格 | 与 DeepSeek-V4-Flash 模型一致 |
| Files API | 免费 |
图片 token 会占用上下文窗口,多图任务要留意总消耗:10 张图片最多可能占用 3840 tokens。
图片在进入模型前会被自动缩放:小于约 384×384 的图片会被放大,更大的图片会被缩小到约相当于 800×800 的总像素。
因此 token 消耗只与缩放后的尺寸相关,2000×2000 与 5000×5000 的图片消耗相同;多图请求中每张图片独立按同一规则计算。
base64 会让请求体明显变大,大图或高频调用建议改用外部 URL 或 Files API。
多模态请求还有一些硬性限制,超出会直接返回 400 错误。
| 限制项 | 规则 |
|---|---|
| 图片格式 | JPEG、PNG、GIF、WebP,按文件实际内容判断,不看扩展名 |
| 外部 URL 长度 | 不超过 8192 字符,且图片须能在 60 秒内下载完成 |
| 请求体大小 | 不超过 48 MiB |
| 单张图片大小 | base64 与 URL 方式最大 32 MiB,Files API 最大 64 MiB |
| 单请求图片数量 | 最多 600 张 |
| 图片最大边长 | 8192 像素;请求含 15 张及以上图片时降为 4096 像素 |
| 图片位置 | 只能放在 user 消息里,system 与 assistant 消息带图会报错 |
V4-Flash-Vision-Exp 是实验性质的模型,能力与服务规格可能随版本迭代调整,关键生产链路建议同时评估正式版模型。
更完整的使用说明可参考官方 API 文档:API 指南 - 图像理解、API 指南 - Files API。
总结
V4-Flash-Vision-Exp 用"文本不缩水、视觉大跃升"的定位,把多模态能力带进了 DeepSeek 的 Agent 生态。
对开发者来说,上手成本很低:换一个 model 名称,就能让 DeepSeek Harness 里的 Agent 看懂截图、设计稿与图表。
建议先用官方三个实例找感觉,再把自己的业务图片接进来,跑通第一个"看图干活"的 Agent 任务。
