Ling-3.2-flash 接入实操:图文视频混输、双协议差异与六个必踩的关卡
蚂蚁百灵 11 月 6 日发布 Ling-3.2-flash,560B 总参数 / 25B 激活 / 1M 上下文,原生接受文本、图像与视频输入,同时提供 OpenAI 与 Anthropic 两套兼容协议。本文只讲一件事:从零拼出一个能跑的请求,逐层把图片、视频、长上下文、工具调用加进去,每一层会遇到什么限制。
所有命令与字段均依据官方文档整理,未在本文环境实际发起调用。Key 全部为占位符,接入前建议在测试环境先跑一遍第十一节的探测脚本。
一、从一个必然失败的请求说起
按 OpenAI 生态的习惯写法,把一张公网图片塞进 image_url,这是最常见的第一行代码:
{
"model": "Ling-3.2-flash",
"messages": [{
"role": "user",
"content": [
{"type": "image_url", "image_url": {"url": "https://example.com/a.png"}},
{"type": "text", "text": "描述这张图"}
]
}]
}
这个请求跑不通。官方多模态文档写得很明确:图片、视频、音频输入一律只接受 Base64 编码,不走公网 URL(Inputs are passed via Base64 encoding only)。image_url 这个字段名保留了下来,但 url 的值必须是 data:{MIME_TYPE};base64,<原始 Base64 串>。
这类"字段名看着像 OpenAI、取值规则却不是 OpenAI"的地方,在这次接入里不止一处。下面按一个请求从外到内的装配顺序,逐关拆开。
二、开工前的三项确认
动笔写代码前,有三件事必须先定,否则后面每一层都会返工。第一节是引子,从第三节起按第 1 关到第 6 关逐层装配。
第一,这一代是 API-only,权重尚未开放。 官方模型文档只标注 Ling-3.0-flash-VL 已在 Hugging Face 与 ModelScope 开源、Ling-3.0-tiny “will be open-sourced in the near future”,对 Ling-3.2-flash 没有给出开源说明。媒体口径是"权重将在近期开放"【交叉】。所以本次能做的是调 API,不是本地部署。
第二,模型 ID 大小写敏感,写成 ling-3.2-flash 不在选项列表里。 官方给出的可选项是:
| 模型 ID | 上下文 | 总参数 / 激活 | 图像 | 视频 | 音频 |
|---|---|---|---|---|---|
Ling-3.2-flash |
1M | 560B / 25B | 支持 | 支持 | — |
Ling-3.1-flash |
1M | 560B / 25B | 未提及 | 未提及 | — |
Ling-3.0-flash-VL |
256K | 124B / 5.5B | 支持 | 支持 | — |
Ling-3.0-flash |
256K(可扩展至 1M) | 124B / 5.1B | 未提及 | 未提及 | — |
Ling-3.0-tiny |
未给数值 | 7.9B / 1.3B | 未提及 | 未提及 | — |
Ming-3.0-audio-flash |
— | — | — | — | 支持 |
AntAngelMed |
— | — | — | — | — |
表中"未提及"是文档没有声明支持,不等于确认不支持。另外
Ling-3.0-flash-VL的 42 层混合架构(KDA 与 Gated MLA 按 5:1 交替)、任意分辨率视觉编码器、VideoRoPE 这些描述都属于 3.0-flash-VL,不要套到 3.2-flash 头上。
第三,两个协议是两个地址,不是同一个地址的两种参数。
| 协议 | 请求地址 |
|---|---|
| OpenAI Chat Completions | POST https://api.ant-ling.com/v1/chat/completions |
| Anthropic Messages | POST https://api.ant-ling.com/anthropic/v1/messages |
三、第 1 关:认证 header 的"恰好一个"
OpenAI 协议只用一种:
Authorization: Bearer <YOUR_API_KEY>
Content-Type: application/json
Anthropic 协议给了两种,但文档原文是 “either Authorization or x-api-key can be used — exactly one is required”:
# 方案 A
Authorization: Bearer <YOUR_API_KEY>
# 方案 B
x-api-key: <YOUR_API_KEY>
"恰好一个"意味着两个都传不符合规范。 用 Anthropic 官方 SDK 时,SDK 默认会同时塞 x-api-key 和 anthropic-version;如果又手动在 default_headers 里补了 Authorization,就变成两个认证头。接之前先确认 SDK 实际发出的 header,不要叠加。
Key 的获取入口是 API Console 的 Create Token(https://chat.ant-ling.com/open)。文档示例里出现的 sk-studio-xx 是占位格式,不是可直接抄的 Key。
四、第 2 关:最小可跑请求与 90 秒超时
先用纯文本把链路打通。这是官方流式示例的原文形态:
curl --request POST \
--url https://api.ant-ling.com/v1/chat/completions \
--header 'Authorization: Bearer <YOUR_API_KEY>' \
--header 'Content-Type: application/json' \
--data '{
"model": "Ling-3.2-flash",
"stream": true,
"messages": [
{"role": "user", "content": "用三句话说明 MoE 的路由机制"}
]
}'
用 OpenAI SDK 时把 base_url 指过去即可:
from openai import OpenAI
client = OpenAI(
base_url="https://api.ant-ling.com/v1",
api_key="YOUR_API_KEY",
)
resp = client.chat.completions.create(
model="Ling-3.2-flash",
messages=[{"role": "user", "content": "用三句话说明 MoE 的路由机制"}],
stream=True,
)
for chunk in resp:
if not chunk.choices:
continue
print(chunk.choices[0].delta.content or "", end="", flush=True)
这一关有三个必须知道的默认值:
| 项 | 默认值 | 影响 |
|---|---|---|
stream |
false |
非流式调用超时 90 秒。长任务、多模态任务必须开 stream: true,否则容易在生成中途被断掉 |
thinking.type |
enabled |
深度思考默认开启,只有 enabled / disabled 两档;要低延迟就显式传 {"type": "disabled"} |
temperature / top_p |
均为 1 |
temperature 取值 [0.0, 1.0],top_p 取值 (0.0, 1.0] |
thinking 是对象不是字符串,写法是:
{"thinking": {"type": "disabled"}}
这一点和 11 月初那批国产模型 API 的 reasoning_effort 七种档位完全不同:这里只有开/关两档,没有 low、medium、max,也没有 no_think。把别家的档位串直接搬过来会报参数错误。
一处文档口径差异:模型选型页没有给 Ling-3.2-flash 标注 thinking 开关,但 OpenAI 与 Anthropic 两份 API 参考都明确写 thinking 支持 3.0 / 3.1 / 3.2 系列。【官方,两页表述不一致】按 API 参考为准,并在自己环境里验证一次生效与否。
五、第 3 关:图片只能走 Base64
content 从字符串变成数组,图片块用 image_url,url 必须是 data URI:
curl --location --request POST 'https://api.ant-ling.com/v1/chat/completions' \
--header 'Authorization: Bearer <YOUR_API_KEY>' \
--header 'Content-Type: application/json' \
--data-raw '{
"model": "Ling-3.2-flash",
"stream": true,
"messages": [{
"role": "user",
"content": [
{"type": "image_url", "image_url": {"url": "data:image/png;base64,<BASE64>"}},
{"type": "text", "text": "描述这张图里的表格结构"}
]
}]
}'
Python 侧构造这个块:
import base64
from pathlib import Path
def image_block(path: str, mime: str = "image/png") -> dict:
raw = Path(path).read_bytes()
b64 = base64.b64encode(raw).decode("ascii")
return {
"type": "image_url",
"image_url": {"url": f"data:{mime};base64,{b64}"},
}
content = [image_block("./table.png"), {"type": "text", "text": "描述这张图里的表格结构"}]
这一关的硬限制(全部来自官方文档,照录):
| 限制项 | 数值 |
|---|---|
| 图片格式 | JPEG、PNG |
| 单图尺寸 | 不超过 16384 × 784 像素 |
| 单图 Base64 串 | 不超过 32 MiB |
| 单次请求图片数 | 最多 40 张 |
| 最大请求体 | 32 MiB |
| 输入方式 | 仅 Base64,不支持公网 URL |
有三处容易踩:
- Base64 会膨胀约 1/3。 请求体上限是 32 MiB 的编码后体积,对应原始二进制约 24 MiB【推算:32 × 3/4 ≈ 24】。多图叠加时注意总量,不是"每张都不超 32 MiB 就行",40 张图同时达到单张上限是不可能的。
image_url.detail不被支持。 官方文档把它列在Unsupported Properties里,并说明推理引擎按default处理。OpenAI 生态里常用的detail: "high"传了不会生效,别指望用它调分辨率。- 官方多模态示例的
model写的是Ling-3.0-flash-VL。 示例代码不能直接整段复制,要改成Ling-3.2-flash。这一步漏了不会报错,只是调到了另一个模型上。
六、第 4 关:视频的 30 秒与 32 帧
视频块换成 video_url,结构和图片同形:
{
"type": "video_url",
"video_url": {"url": "data:video/mp4;base64,<BASE64_VIDEO>"}
}
完整请求:
curl --location --request POST 'https://api.ant-ling.com/v1/chat/completions' \
--header 'Authorization: Bearer <YOUR_API_KEY>' \
--header 'Content-Type: application/json' \
--data-raw '{
"model": "Ling-3.2-flash",
"stream": true,
"messages": [{
"role": "user",
"content": [
{"type": "video_url", "video_url": {"url": "data:video/mp4;base64,<BASE64_VIDEO>"}},
{"type": "text", "text": "按时间顺序列出画面里出现的操作步骤"}
]
}]
}'
| 限制项 | 数值 |
|---|---|
| 视频格式 | MP4、MOV、WMV |
| 时长 | ≤ 30s |
| 单视频 Base64 串 | ≤ 32 MiB |
| 单次请求视频数 | 1 个 |
| 抽帧 | 固定 2fps,每个视频最多 32 帧 |
| 输入方式 | 仅 Base64 |
这里有一处值得单独算的覆盖问题:30 秒 × 2fps = 60 帧,而上限是 32 帧。 如果按固定的 2fps 从头顺序抽帧,32 帧只能覆盖前 16 秒;要覆盖满 30 秒,实际采样率得降到约 1.07fps,与"固定 2fps"的表述不一致【推算,基于官方两个数字相除】。
官方文档没有说明超限后是截断尾部、均匀重采样,还是直接拒绝【未披露】。稳妥做法是:把要分析的片段控制在 16 秒以内,或者按关键片段切开分多次请求,不要默认 30 秒视频的尾部内容一定被看到。这个边界对"长视频分析"这类宣传场景影响很直接。
七、第 5 关:切到 Anthropic 协议要改的五处
Anthropic 协议不是"换个 URL 就行",请求体有五处结构性差异。
curl --request POST \
--url https://api.ant-ling.com/anthropic/v1/messages \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Content-Type: application/json' \
--data '{
"model": "Ling-3.2-flash",
"max_tokens": 32000,
"stream": true,
"system": [{"type": "text", "text": "输出使用简体中文,先给结论"}],
"messages": [
{"role": "user", "content": "对比两套协议的请求体差异"}
]
}'
差异一:系统提示词的位置。 OpenAI 协议里 system 是 messages 里的一条(role: system);Anthropic 协议里 messages.role 的可选项只有 user 和 assistant,系统提示必须放顶层 system 数组,元素形如 {"type": "text", "text": "..."}。把 role: system 塞进 Anthropic 的 messages 不在选项内。
差异二:输出长度参数名。
| 协议 | 参数 | 默认 |
|---|---|---|
| Anthropic | max_tokens |
32000 |
| OpenAI | 请求体参数表中未列出 max_tokens / max_completion_tokens |
未给 |
| OpenAI 多模态示例里实际出现 | max_completion_tokens: 102400 |
— |
这是官方文档自身的一处不一致:OpenAI 参考页的完整参数表没有这两个字段,但多模态教程的示例里用了 max_completion_tokens。【官方,两页表述不一致】不要在 OpenAI 协议下依赖 max_tokens 生效;先在探测脚本里发一次带该字段的请求,看是否被静默忽略。
差异三:图片内容块的形状。 Anthropic 协议用 image + source,不是 image_url:
{
"type": "image",
"source": {
"type": "base64",
"media_type": "image/png",
"data": "<BASE64_不带前缀>"
}
}
注意 data 字段是不带 data:image/png;base64, 前缀的纯 Base64 串,与 OpenAI 协议里带 data URI 的 url 正好相反。这是切换协议时最容易照抄错的一处。
差异四:能力矩阵不同。 官方多模态文档写明:
| 模型 | OpenAI 协议 | Anthropic 协议 |
|---|---|---|
Ling-3.2-flash |
文本 + 图像 + 视频 | 文本 + 图像 + 视频 |
Ling-3.0-flash-VL |
文本 + 图像 + 视频 | 文本 + 图像(无视频) |
Ming-3.0-audio-flash |
文本 + 音频 | 不在该协议的模型选项里 |
也就是说,音频只能走 OpenAI 协议;Ling-3.0-flash-VL 的视频输入在 Anthropic 协议下没有声明支持。Anthropic 参考页的 model 选项列表是 6 个,比 OpenAI 页的 7 个少了 Ming-3.0-audio-flash,两页能互相对上。
差异五:工具与联网参数。 OpenAI 协议有 enable_search / search_options.forced_search、tools;Anthropic 协议有 tools / tool_choice / stop_sequences,但没有 enable_search。
// OpenAI 协议:强制联网搜索
{
"model": "Ling-3.2-flash",
"enable_search": true,
"search_options": {"forced_search": true},
"messages": [{"role": "user", "content": "查一下今天蚂蚁百灵的更新"}]
}
// Anthropic 协议:工具策略
{
"model": "Ling-3.2-flash",
"tool_choice": {"type": "auto"},
"tools": [{
"name": "get_weather",
"description": "查询城市天气",
"input_schema": {
"type": "object",
"properties": {"city": {"type": "string"}},
"required": ["city"]
}
}],
"messages": [{"role": "user", "content": "广州今天天气"}]
}
enable_search 官方注明会增加 Token 消耗,按需开启;tool_choice 的四档是 auto(模型决定)/ any(必须调用)/ tool(指定工具)/ none(禁用)。
八、第 6 关:流式响应怎么拼
两套协议的 SSE 格式完全不同,拼接逻辑不能共用。
OpenAI 协议:每行 data: {...},文本在 choices[0].delta.content,choices 可能是空数组,最后一个 choices: [] 的 chunk 才带 usage。
def consume_openai_sse(resp):
text_parts, usage = [], None
for chunk in resp:
if not chunk.choices:
if getattr(chunk, "usage", None):
usage = chunk.usage
continue
text_parts.append(chunk.choices[0].delta.content or "")
return "".join(text_parts), usage
官方流式示例里第一个 chunk 的 content 就是空字符串,中间 chunk 也可能为空;不做 or "" 兜底会拼出 None。usage 不要从中间 chunk 取——示例里中间那些都是 null,只有末尾 choices: [] 的那条才有数值,再后面还有一条 metadata: {} 的收尾 chunk。
Anthropic 协议:event: 与 data: 成对出现,文本在 content_block_delta 的 delta.text,usage 在 message_delta 里,以 message_stop 结束。
def consume_anthropic_sse(lines):
text_parts, usage = [], None
event = None
for line in lines:
if line.startswith("event:"):
event = line[6:].strip()
elif line.startswith("data:"):
import json
d = json.loads(line[5:].strip())
if event == "content_block_delta":
text_parts.append(d.get("delta", {}).get("text", ""))
elif event == "message_delta":
usage = d.get("usage")
elif event == "message_stop":
break
return "".join(text_parts), usage
| 维度 | OpenAI 协议 | Anthropic 协议 |
|---|---|---|
| 事件格式 | data: 单行 |
event: + data: 成对 |
| 文本路径 | choices[0].delta.content |
delta.text(content_block_delta) |
usage 位置 |
末尾 choices: [] 的 chunk |
message_delta 事件 |
| 结束标志 | finish_reason: "stop" |
event: message_stop |
| 空增量 | 首 chunk 的 content 为 "" |
content_block_start 的 text 为 "" |
九、1M 上下文不是"一次塞满"
Ling-3.2-flash 的上下文窗口标称 1M,官方描述是"支持长文档与长视频分析",并称"信息位于头部、中部或尾部都能稳定召回"。但文档没有给出最大输出长度、也没有给出 1M 下的 token 计费与限流规则【未披露】。
实操上要注意三点:
- 输入侧硬限制仍然存在。 图片最多 40 张 / 请求、视频 1 个 / 请求且 ≤30 秒、请求体 ≤32 MiB。1M 是上下文窗口,不是放宽这些输入约束。长视频要靠分段多次请求再汇总,不是把 2 小时视频塞进一次调用。
- 长文本与多模态混输时,
content必须是数组。 官方文档messages.content的类型标为string,但多模态教程全部用数组形式的内容块。【官方,两页表述不一致】纯文本用字符串没问题;一旦混入image_url/video_url,整条content就要改成块数组,文本也改成{"type": "text", "text": "..."},不能混着写。 - 先开流式。 长上下文任务生成时间容易超过非流式的 90 秒上限,
stream: true是必需项而非优化项。
十、双协议完整对照表
| 对照项 | OpenAI Chat Completions | Anthropic Messages |
|---|---|---|
| 地址 | /v1/chat/completions |
/anthropic/v1/messages |
| 认证 | Authorization: Bearer |
Authorization 或 x-api-key,恰好一个 |
| 系统提示 | messages 内 role: system |
顶层 system 数组;messages.role 无 system |
| 输出长度 | 参数表未列;示例用 max_completion_tokens |
max_tokens,默认 32000 |
| 图片块 | image_url.url = data URI |
image.source = {type, media_type, data},data 无前缀 |
| 视频 | video_url(3.2-flash) |
3.2-flash 支持;3.0-flash-VL 未声明 |
| 音频 | audio_url(Ming-3.0-audio-flash) |
该模型不在选项列表 |
| 思考开关 | thinking: {"type": "enabled"|"disabled"} |
同左 |
| 工具 | tools(OpenAI function 形状) |
tools + tool_choice + stop_sequences |
| 联网搜索 | enable_search + search_options |
无对应字段 |
| 流式 | data: 单行,usage 在末尾空 choices chunk |
event:+data:,usage 在 message_delta |
| 非流式超时 | 90 秒 | 90 秒 |
| 模型选项数 | 7 个 | 6 个 |
选择判据:已有 OpenAI SDK 代码、要传视频或音频、要联网搜索 → 走 OpenAI 协议;已有 Anthropic SDK / Claude Code 类工具链、要用 tool_choice 精细控制、要用 stop_sequences → 走 Anthropic 协议。两套协议的模型 ID 相同,Key 也通用,迁移成本主要在请求体形状。
十一、可复现的探测脚本
下面这段脚本不依赖任何第三方 SDK,只发最小请求,逐项验证环境是否通、协议是否认、参数是否生效。把 YOUR_API_KEY 换掉即可运行。
import json, os, urllib.request, urllib.error
KEY = os.environ.get("ANT_LING_KEY", "YOUR_API_KEY")
OPENAI_URL = "https://api.ant-ling.com/v1/chat/completions"
ANTHROPIC_URL = "https://api.ant-ling.com/anthropic/v1/messages"
def post(url, payload, use_x_api_key=False):
headers = {"Content-Type": "application/json"}
if use_x_api_key:
headers["x-api-key"] = KEY
else:
headers["Authorization"] = f"Bearer {KEY}"
req = urllib.request.Request(
url, data=json.dumps(payload).encode("utf-8"),
headers=headers, method="POST")
try:
with urllib.request.urlopen(req, timeout=30) as r:
return r.status, r.read().decode("utf-8")[:400]
except urllib.error.HTTPError as e:
return e.code, e.read().decode("utf-8")[:400]
except Exception as e:
return "ERR", str(e)
cases = [
("OpenAI 纯文本", OPENAI_URL,
{"model": "Ling-3.2-flash", "stream": False,
"messages": [{"role": "user", "content": "回复 OK 两个字符"}]}, False),
("OpenAI 关闭思考", OPENAI_URL,
{"model": "Ling-3.2-flash", "stream": False, "thinking": {"type": "disabled"},
"messages": [{"role": "user", "content": "回复 OK"}]}, False),
("OpenAI max_completion_tokens 是否被接受", OPENAI_URL,
{"model": "Ling-3.2-flash", "stream": False, "max_completion_tokens": 64,
"messages": [{"role": "user", "content": "回复 OK"}]}, False),
("Anthropic Bearer", ANTHROPIC_URL,
{"model": "Ling-3.2-flash", "stream": False, "max_tokens": 64,
"messages": [{"role": "user", "content": "回复 OK"}]}, False),
("Anthropic x-api-key", ANTHROPIC_URL,
{"model": "Ling-3.2-flash", "stream": False, "max_tokens": 64,
"messages": [{"role": "user", "content": "回复 OK"}]}, True),
]
for name, url, payload, xk in cases:
code, body = post(url, payload, xk)
print(f"{name:38s} -> {code} {body[:120]}")
脚本的用途是验证参数是否被接受,不是测速度或跑分。三个需要特别看的返回:
- 第 3 项若返回 200 且响应里出现输出长度被限制的效果,说明
max_completion_tokens在 OpenAI 协议下生效;若字段被静默忽略,不会报错,只能靠对比输出长度判断。 - 第 4、5 项应都返回 200,用来确认两种认证头都可用;再手动加一个"两个都传"的用例,观察服务端是否拒绝,验证"恰好一个"这条约束的实际行为。
- 若第 1 项就返回 401,先查 Key 前缀与控制台 Token 是否一致,不要急着改请求体。
脚本的局限:它只用纯文本,不覆盖 Base64 图片/视频的体积与格式校验;未知参数是否被静默忽略也因模型实现而异,探测结果只能说明当前版本的行为,不能当作长期契约。官方在仓库里用全大写标注过兼容层可能变化,升级后建议重跑。
十二、排查清单
| 现象 | 原因 | 处理 |
|---|---|---|
| 401 / 鉴权失败 | Key 不对,或 Anthropic 协议同时传了两个认证头 | 只保留 Authorization 或 x-api-key 其一 |
| 图片请求报参数错 | image_url.url 用了公网 URL |
改成 data:image/png;base64,<纯Base64> |
| 图片内容被忽略 | 整段示例照抄,model 还是 Ling-3.0-flash-VL |
改成 Ling-3.2-flash |
detail: "high" 没效果 |
该属性在 Unsupported Properties 列表 |
去掉,按引擎默认处理 |
| 请求体过大 | Base64 膨胀约 1/3,且总量上限 32 MiB | 压缩或降分辨率后重新编码,控制在约 24 MiB 原始体积内 |
| 视频尾部内容没被提到 | 2fps × 30s = 60 帧 > 32 帧上限 | 切到 16 秒以内,或按关键片段分多次请求 |
| 长任务中途断开 | 非流式 90 秒超时 | 一律加 stream: true |
拼接结果里出现 None |
空 delta.content / 空 choices 未兜底 |
用 or "" 并跳过 choices: [] |
| 拿不到 token 用量 | 从中间 chunk 取 usage |
OpenAI 取末尾空 choices chunk;Anthropic 取 message_delta |
max_tokens 不生效 |
OpenAI 协议参数表未列该字段 | 改用示例里的 max_completion_tokens 并先探测 |
传 reasoning_effort 报 400 |
本系列用 thinking 对象,没有 reasoning_effort |
改成 {"thinking": {"type": "disabled"}} |
role: system 不生效 |
在 Anthropic 协议里用了 OpenAI 写法 | 移到顶层 system 数组 |
十三、边界与未披露清单
以下项目在官方模型文档与 API 参考中均没有给出数值或条款,任何具体说法都只能标为外部口径,接入时不要假设:
| 项目 | 状态 |
|---|---|
| 定价 | 模型文档全页无价格数字;媒体口径为输入 $0.30 / 百万 token、输出 $0.90 / 百万 token【交叉】 |
| 前两周免费 | 媒体口径,官方文档未列免费期起止【交叉】 |
| 最大输出长度 | 模型文档未提供;Anthropic 参考页给 max_tokens 默认 32000,OpenAI 参考页参数表未列 |
| 限流(QPS / RPM / TPM / 并发) | 未提供 |
Ling-3.2-flash 权重开放时间 |
媒体称"近期"【交叉】,官方文档未承诺 |
| 30 秒视频超出 32 帧后的处理方式 | 未披露(截断 / 均匀重采样 / 拒绝,三种都可能) |
| 1M 上下文下的 token 计费与精度衰减曲线 | 未提供 |
| 评测分数 | 三家基准分数与 DesignArena 1238 Elo 均为官方发布自测口径【官方,自报】,待独立复现 |
另外两处官方文档内部不一致,本文按 API 参考页优先、并建议自行探测:
messages.content类型标为string,但多模态教程全用块数组。- OpenAI 参考页参数表没有输出长度字段,多模态示例却用
max_completion_tokens。
这两处属于文档维护滞后,不是模型缺陷,但照着抄会写出跑不通的代码。
十四、结论:三个可直接落地的判断
第一,图片与视频一律先转 Base64,不要试公网 URL。 这是与 OpenAI 生态差别最大、也最容易在第一行代码上就失败的一处。
第二,切协议时改的是请求体形状,不只是 URL。 系统提示位置、输出长度参数名、图片块的 data 是否带前缀、模型选项列表,四项都要跟着改;音频和 Ling-3.0-flash-VL 的视频在 Anthropic 协议下没有声明支持。
第三,长任务默认开流式。 非流式 90 秒超时是硬约束,1M 上下文、多图、长生成任务都在这条线之外。
这套接入的价值在于同一个模型 ID、同一把 Key、两套生态工具链可以直接复用:OpenAI SDK 与 Anthropic SDK 都不用改代码结构,只要换 base_url 与请求体形状。对已经有一套 Claude / OpenAI 工具链、想切到国产多模态模型的团队,迁移成本主要在本文第七节那张对照表,而不在模型本身。
- 点赞
- 收藏
- 关注作者
评论(0)