Skip to content

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 必须是数组,不能是字符串(即使只有文字也要用数组格式,但纯文本消息用字符串更简洁)
  • temperaturetop_pn 等参数请使用默认值,部分视觉请求不支持修改这些参数
  • 更高分辨率不一定提升理解效果,反而增加 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 可以节省重复编码的开销。