Appearance
Kimi k2.6 是 Kimi 最新视觉旗舰模型,支持图片和视频理解,通过 image_url 和 video_url 类型传入多模态内容。本文提供 base64 上传和文件引用两种方式的完整示例,以及分辨率、大小限制等最佳实践。
使用 Kimi 视觉模型
支持的模型
| 模型 | 图片 | 视频 |
|---|---|---|
| kimi-k2.6 | ✅ | ✅ |
| kimi-k2.5 | ✅ | ✅ |
| moonshot-v1-128k-vision-preview | ✅ | ❌ |
| moonshot-v1-32k-vision-preview | ✅ | ❌ |
| moonshot-v1-8k-vision-preview | ✅ | ❌ |
图片理解(base64 方式)
python
import os
import base64
from openai import OpenAI
client = OpenAI(
api_key=os.environ.get("MOONSHOT_API_KEY"),
base_url="https://api.moonshot.cn/v1",
)
image_path = "image.png"
with open(image_path, "rb") as f:
image_data = f.read()
ext = os.path.splitext(image_path)[1].lstrip(".")
image_url = f"data:image/{ext};base64,{base64.b64encode(image_data).decode('utf-8')}"
completion = client.chat.completions.create(
model="kimi-k2.6",
messages=[
{"role": "system", "content": "你是 Kimi。"},
{
"role": "user",
"content": [
{"type": "image_url", "image_url": {"url": image_url}},
{"type": "text", "text": "请描述图片的内容。"},
],
},
],
)
print(completion.choices[0].message.content)踩坑:
content必须是数组(array[object]),不能将数组 JSON 序列化后当字符串传入,否则会报token limit exceeded。
视频理解(文件上传方式)
视频较大,推荐先上传再通过 file_id 引用:
python
import os
from pathlib import Path
from openai import OpenAI
client = OpenAI(
api_key=os.environ.get("MOONSHOT_API_KEY"),
base_url="https://api.moonshot.cn/v1",
)
file_object = client.files.create(
file=Path("video.mp4"),
purpose="video"
)
completion = client.chat.completions.create(
model="kimi-k2.6",
messages=[
{"role": "system", "content": "你是 Kimi。"},
{
"role": "user",
"content": [
{"type": "video_url", "video_url": {"url": f"ms://{file_object.id}"}},
{"type": "text", "text": "请描述这个视频的内容。"},
],
},
],
)
print(completion.choices[0].message.content)文件 ID 引用格式:ms://<file_id>(ms = Moonshot Storage)。
支持的文件格式
| 类型 | 支持格式 | 推荐分辨率 |
|---|---|---|
| 图片 | PNG、JPEG、WebP、GIF | 不超过 4K (4096×2160) |
| 视频 | MP4、MPEG、MOV、AVI、WebM、WMV、3GPP 等 | 不超过 2K (2048×1080) |
更高分辨率不会提升理解效果,只会增加 token 消耗和处理时间。
base64 vs 文件上传
| 场景 | 推荐方式 |
|---|---|
| 小图片(< 5MB),一次性使用 | base64 |
| 大视频(> 50MB) | 必须文件上传 |
| 同一资源多次引用 | 文件上传(节省带宽) |
| 请求体超过 100MB | 必须文件上传 |
限制:不支持直接传 HTTP URL 格式的图片,必须用 base64 或文件上传。
Token 计算
图片/视频动态计算 token,可用 token 预估接口 提前估算:分辨率越高、视频时长越长,消耗越多。
常见问题
Q: 为什么传图片后报 "Your request exceeded model token limit"?
A: 最常见原因是将 content 数组序列化成字符串传入(格式错误)。确保 content 是 JSON 数组而非字符串。
Q: 图片数量有限制吗?
A: 没有数量限制,但整个请求体大小不能超过 100MB。
Q: moonshot-v1-vision 系列和 kimi-k2.6 视觉能力有什么区别?
A: kimi-k2.6 额外支持视频输入和 Thinking 模式,综合能力更强;moonshot-v1 视觉系列更稳定,参数控制更灵活(可自定义 temperature 等)。
kimi-k2.6 支持图片和视频输入。发送图片可用 base64 编码直接嵌入消息,也可先上传文件再用 ms://<file-id> 引用。消息格式必须是内容数组,而非字符串。本文覆盖图片和视频的完整示例。
使用 Kimi 视觉模型
支持的输入格式
| 类型 | 支持格式 |
|---|---|
| 图片 | PNG、JPEG、WebP、GIF |
| 视频 | MP4、MPEG、MOV、AVI、FLV、WebM |
请求体大小限制:100MB(包含图片/视频数据)
与 OpenAI Vision 对比:接口格式基本一致,Kimi 的 image_url 支持两种方式——base64 直传和
ms://文件引用。OpenAI 也支持 URL 方式,但 Kimi 目前暂不支持直接用外部 URL 传图片。
通过 base64 发送图片
typescript
import OpenAI from "openai";
import fs from "fs";
const client = new OpenAI({
apiKey: process.env.MOONSHOT_API_KEY,
baseURL: "https://api.moonshot.cn/v1",
});
// 读取图片并转为 base64
const imageBuffer = fs.readFileSync("screenshot.png");
const base64Image = imageBuffer.toString("base64");
const mimeType = "image/png"; // image/jpeg, image/webp, image/gif
const completion = await client.chat.completions.create({
model: "kimi-k2.6",
messages: [
{
role: "user",
// 注意:含图片时,content 必须是数组,不能是字符串
content: [
{
type: "image_url",
image_url: {
url: `data:${mimeType};base64,${base64Image}`,
},
},
{
type: "text",
text: "请描述这张图片的内容。",
},
],
},
],
});
console.log(completion.choices[0].message.content);python
import base64
from openai import OpenAI
client = OpenAI(
api_key="MOONSHOT_API_KEY",
base_url="https://api.moonshot.cn/v1",
)
with open("screenshot.png", "rb") as f:
base64_image = base64.b64encode(f.read()).decode("utf-8")
completion = client.chat.completions.create(
model="kimi-k2.6",
messages=[
{
"role": "user",
"content": [
{
"type": "image_url",
"image_url": {
"url": f"data:image/png;base64,{base64_image}",
},
},
{
"type": "text",
"text": "请描述这张图片的内容。",
},
],
},
],
)
print(completion.choices[0].message.content)通过文件上传发送大图片
对于大文件(尤其是视频),建议先上传后引用,避免 base64 撑大请求体:
typescript
import fs from "fs";
// 1. 上传图片文件
const fileObject = await client.files.create({
file: fs.createReadStream("large-image.jpg"),
purpose: "file-extract",
});
// 2. 用 ms:// 协议引用
const completion = await client.chat.completions.create({
model: "kimi-k2.6",
messages: [
{
role: "user",
content: [
{
type: "image_url",
image_url: {
url: `ms://${fileObject.id}`, // 通过文件 ID 引用
},
},
{
type: "text",
text: "这张图片里有什么?",
},
],
},
],
});视频理解
视频的处理方式与图片类似:
typescript
const videoFile = await client.files.create({
file: fs.createReadStream("demo.mp4"),
purpose: "file-extract",
});
const completion = await client.chat.completions.create({
model: "kimi-k2.6",
messages: [
{
role: "user",
content: [
{
type: "video_url",
video_url: {
url: `ms://${videoFile.id}`,
},
},
{
type: "text",
text: "请总结这段视频的主要内容。",
},
],
},
],
});多图对话
在一条消息中发送多张图片,或跨轮次引用图片:
typescript
const completion = await client.chat.completions.create({
model: "kimi-k2.6",
messages: [
{
role: "user",
content: [
{ type: "image_url", image_url: { url: `data:image/png;base64,${image1}` } },
{ type: "image_url", image_url: { url: `data:image/png;base64,${image2}` } },
{ type: "text", text: "对比这两张图片,找出不同之处。" },
],
},
],
});注意事项
content必须是数组,不能是字符串(即使只有文字也要用数组格式,但纯文本消息用字符串更简洁)temperature、top_p、n等参数请使用默认值,部分视觉请求不支持修改这些参数- 更高分辨率不一定提升理解效果,反而增加 token 消耗
常见问题
Q: Kimi 视觉模型支持 URL 图片吗(直接传图片网址)?
A: 目前暂不支持直接用外部 HTTP/HTTPS URL 传图片,需要先下载图片后用 base64 传入,或上传到 Files API 后用 ms:// 引用。
Q: 视频有时长限制吗?
A: 有文件大小限制(请求体 100MB 以内),超大视频建议先压缩。具体时长限制以控制台文档为准。
Q: base64 图片会消耗很多 token 吗?
A: 图片本身不按 base64 字符数计费,但视觉理解会额外消耗 token(取决于图片内容的复杂度)。对于频繁请求的场景,上传到 Files API 并复用 file_id 可以节省重复编码的开销。