azosi · 2026.7.22 04:33 · 조회 1

Kimi K2.6 Quickstart

상위 문서: ← Kimi Get Started 출처: Kimi API Platform 공식 문서 — Kimi K2.6 한글화 (2026-07-22) 공급사: Moonshot AI (月之暗面)


Kimi K2.6 모델 개요

Kimi K2.6은 Kimi의 범용 모델로, 더 강하고 안정적인 장기 코드 작성 능력, 크게 향상된 지시 준수율과 자기 교정 능력, 더 복잡한 소프트웨어 엔지니어링 작업을 처리할 수 있는 능력을 갖추고 있습니다. 또한 에이전트의 자율 실행 능력이 크게 향상되었습니다. 텍스트, 이미지, 비디오 입력사고(thinking)·비사고 모드를 모두 지원하며, 대화와 에이전트 작업에 모두 사용 가능합니다. Tech Blog

kimi-k2.6

장기 코딩 능력의 도약

  • K2.6은 장기(long-horizon) 코딩 작업에서 도약을 이루었으며, Rust, Go, Python 같은 다양한 프로그래밍 언어와 프론트엔드 개발, DevOps, 성능 최적화 같은 작업 시나리오에서 더 안정적인 일반화를 보여줍니다.

초장문 컨텍스트 지원

  • kimi-k2.6, kimi-k2.5, kimi-k2-0905-preview, kimi-k2-turbo-preview, kimi-k2-thinking, kimi-k2-thinking-turbo 모델 모두 256K 컨텍스트 윈도우 제공.

Long-Thinking (장기 사고) 능력

  • Kimi K2.6은 여전히 강력한 추론 능력을 갖추고 있으며, 다단계 도구 호출과 추론을 지원 — 복잡한 논리적 추론, 수학 문제, 코드 작성 등에서 탁월.

사용 예제

OpenAI SDK 설치

Kimi API는 OpenAI의 API 포맷과 완전히 호환됩니다. OpenAI SDK를 다음과 같이 설치하세요:

pip install --upgrade 'openai>=1.0'

설치 확인

python -c 'import openai; print("version =", openai.__version__)'

# 출력 예: version = 1.10.0

빠른 시작

이미지 이해 코드 예제

import os
import base64
from openai import OpenAI

client = OpenAI(
    api_key=os.environ.get("MOONSHOT_API_KEY"),
    base_url="https://api.moonshot.ai/v1",
)

# 분석할 이미지 경로로 교체 (예: kimi.png)
image_path = "kimi.png"

with open(image_path, "rb") as f:
    image_data = f.read()

# 표준 라이브러리 base64.b64encode로 이미지를 base64로 인코딩
image_url = f"data:image/{os.path.splitext(image_path)[1].lstrip('.')};base64,{base64.b64encode(image_data).decode('utf-8')}"


completion = client.chat.completions.create(
    model="kimi-k2.6",
    messages=[
        {"role": "system", "content": "You are Kimi."},
        {
            "role": "user",
            # content가 str에서 여러 content part를 담은 list로 변경됨
            # Image (image_url)가 한 part, text가 다른 part
            "content": [
                {
                    "type": "image_url",  # <-- 이미지 업로드는 image_url 타입 사용, content는 base64 인코딩된 이미지 데이터
                    "image_url": {
                        "url": image_url,
                    },
                },
                {
                    "type": "text",
                    "text": "Please describe the content of the image.",  # <-- text 타입으로 텍스트 지시 제공
                },
            ],
        },
    ],
)

print(completion.choices[0].message.content)

코드가 에러 없이 실행되면 다음과 유사한 출력을 볼 수 있습니다:

[이미지 설명 출력]

비디오 이해 코드 예제

import os
import base64
from openai import OpenAI

client = OpenAI(
    api_key=os.environ.get("MOONSHOT_API_KEY"),
    base_url="https://api.moonshot.ai/v1",
)

# 분석할 비디오 경로로 교체 (예: kimi.mp4)
video_path = "kimi.mp4"

with open(video_path, "rb") as f:
    video_data = f.read()

# 비디오를 base64로 인코딩
video_url = f"data:video/{os.path.splitext(video_path)[1].lstrip('.')};base64,{base64.b64encode(video_data).decode('utf-8')}"


completion = client.chat.completions.create(
    model="kimi-k2.6",
    messages=[
        {"role": "system", "content": "You are Kimi."},
        {
            "role": "user",
            "content": [
                {
                    "type": "video_url",  # <-- 비디오 업로드는 video_url 타입 사용
                    "video_url": {
                        "url": video_url,
                    },
                },
                {
                    "type": "text",
                    "text": "Please describe the content of the video.",
                },
            ],
        },
    ],
)

print(completion.choices[0].message.content)

멀티모달 도구 능력 예제

Kimi K2.6 모델은 여러 능력을 결합합니다. 다음 예제는 K2.6의 시각 이해 + 도구 호출 능력을 보여줍니다.

먼저 샘플 비디오를 로컬 머신에 다운로드하세요 (예: ~/Download/test_video.mp4).

샘플 비디오: https://mintcdn.com/moonshotai/AP772Is8kVTEjpLL/assets/pics/test_video.mp4

그다음 아래 코드를 실행하세요:

import base64
import json
import os
import subprocess
import tempfile
from pathlib import Path
from openai import OpenAI

tools = [{
    "type": "function",
    "function": {
        "name": "watch_video_clip",
        "description": "Watch a video file or a sub-clip of it. If start_time and end_time are not provided, the entire video will be returned.",
        "parameters": {
            "type": "object",
            "properties": {
                "path": {
                    "type": "string",
                    "description": "The path to the video file to watch"
                },
                "start_time": {
                    "type": "number",
                    "description": "The start time of the clip in seconds (optional, defaults to 0)"
                },
                "end_time": {
                    "type": "number",
                    "description": "The end time of the clip in seconds (optional, defaults to end of video)"
                }
            },
            "required": ["path"]
        }
    }
}]

def watch_video_clip(path: str, start_time: float | None = None, end_time: float | None = None) -> list[dict]:
    """Watch a video file or a sub-clip of it."""
    video_path = Path(path)
    if not video_path.exists():
        raise FileNotFoundError(f"Video file not found: {path}")

    if start_time is None and end_time is None:
        with open(path, "rb") as f:
            video_base64 = base64.b64encode(f.read()).decode("utf-8")
        return [
            {"type": "video_url", "video_url": {"url": f"data:video/mp4;base64,{video_base64}"}},
            {"type": "text", "text": f"Full video: {video_path.name}"}
        ]

    probe = subprocess.run(
        ["ffprobe", "-v", "quiet", "-print_format", "json", "-show_format", path],
        capture_output=True, text=True
    )
    duration = float(json.loads(probe.stdout)["format"]["duration"])

    start_time = start_time or 0
    end_time = end_time or duration
    clip_duration = end_time - start_time

    with tempfile.NamedTemporaryFile(suffix=".mp4", delete=False) as tmp:
        tmp_path = tmp.name

    try:
        subprocess.run([
            "ffmpeg", "-y", "-ss", str(start_time), "-i", path,
            "-t", str(clip_duration), "-c:v", "libx264", "-c:a", "aac",
            "-preset", "fast", "-crf", "23", "-movflags", "+faststart",
            "-loglevel", "error", tmp_path
        ], check=True)

        with open(tmp_path, "rb") as f:
            video_base64 = base64.b64encode(f.read()).decode("utf-8")

        return [
            {"type": "video_url", "video_url": {"url": f"data:video/mp4;base64,{video_base64}"}},
            {"type": "text", "text": f"Clip from {video_path.name}: {start_time}s - {end_time}s"}
        ]
    finally:
        if os.path.exists(tmp_path):
            os.unlink(tmp_path)

client = OpenAI(
    api_key=os.environ.get("MOONSHOT_API_KEY"),
    base_url="https://api.moonshot.ai/v1"
)

def agent_loop(user_message: str):
    """Simple agent loop with multimodal tool support."""
    messages = [
        {"role": "system", "content": "You are a video analysis assistant. Use watch_video_clip to examine specific portions of videos."},
        {"role": "user", "content": user_message}
    ]

    while True:
        response = client.chat.completions.create(
            model="kimi-k2.6",
            messages=messages,
            tools=tools,
            tool_choice="auto"
        )
        message = response.choices[0].message
        messages.append(message.model_dump())

        if not message.tool_calls:
            return message.content

        for tool_call in message.tool_calls:
            if tool_call.function.name == "watch_video_clip":
                args = json.loads(tool_call.function.arguments)
                result = watch_video_clip(
                    path=args["path"],
                    start_time=args.get("start_time"),
                    end_time=args.get("end_time")
                )
                messages.append({
                    "role": "tool",
                    "tool_call_id": tool_call.id,
                    "content": result
                })

# 사용 예
answer = agent_loop("Analyze what happens between seconds 8-13 in ~/Download/test_video.mp4")
print(answer)

Best Practices (모범 사례)

지원 형식

  • 이미지: png, jpeg, webp, gif
  • 비디오: mp4, mpeg, mov, avi, x-flv, mpg, webm, wmv, 3gpp

토큰 계산 및 과금

이미지와 비디오의 토큰 사용량은 동적으로 계산됩니다. 토큰 추정 API로 사전에 예상 토큰 소비량을 확인할 수 있습니다.

일반적으로 이미지 해상도가 높을수록 더 많은 토큰을 소비. 비디오는 키프레임 수와 해상도에 따라 토큰 수가 결정.

Vision 모델은 moonshot-v1 시리즈와 동일한 과금 방식 (처리된 총 토큰 수 기반). 자세한 정보는 아래 참고.

권장 해상도

  • 이미지: 4K (4096×2160) 이하
  • 비디오: FHD (1920×1080) 이하

파일 업로드 vs Base64

요청 본문 크기 제한 때문에, 매우 큰 비디오는 vision 기능을 활용하려면 반드시 파일 업로드 방식을 사용해야 합니다. 여러 번 참조될 이미지/비디오도 파일 업로드 권장. 제한은 File Upload 문서 참고.

  • 이미지 수량 제한: Vision 모델은 이미지 수에 제한이 없으나, 요청 본문 크기가 100M를 넘지 않아야 함
  • URL 형식 이미지: 지원하지 않음 — base64 인코딩된 콘텐츠만 지원

토큰 가격

토큰 가격 상세는 Model Pricing — K2.6 참고.


요청 본문 파라미터 차이

파라미터는 chat API 문서에 정리되어 있습니다. 단, 일부 파라미터의 동작이 k2.6 / k2.5 모델에서는 다를 수 있습니다.

권장: 기본값을 사용하고 수동으로 설정하지 마세요.

차이점은 아래와 같습니다.

필드필수설명타입
max_tokens선택chat completion이 생성할 최대 토큰 수int기본 32k (32768)
thinking선택신규! 사고 모드 활성화 여부object기본 {"type": "enabled"}. {"type": "enabled"} 또는 {"type": "disabled"} 중 하나만 가능
temperature선택샘플링 temperaturefloatk2.6/k2.5는 사고 모드에서 고정값 1.0, 비사고 모드에서 고정값 0.6. 다른 값 입력 시 에러
top_p선택샘플링 방법floatk2.6/k2.5는 고정값 0.95 사용. 다른 값 입력 시 에러
n선택입력 메시지당 생성할 결과 수intk2.6/k2.5는 고정값 1 사용. 다른 값 입력 시 에러
presence_penalty선택텍스트에 새 토큰이 등장했는지 기반 페널티floatk2.6/k2.5는 고정값 0.0 사용. 다른 값 입력 시 에러
frequency_penalty선택토큰의 기존 등장 빈도 기반 페널티floatk2.6/k2.5는 고정값 0.0 사용. 다른 값 입력 시 에러

Tool Use Compatibility (도구 사용 호환성)

도구 사용 시 thinking 파라미터가 {"type": "enabled"}로 설정된 경우, 모델 성능을 위해 다음 제약을 지켜주세요.

  • tool_choice"auto" 또는 "none"만 설정 가능 (기본 "auto") — 사고 콘텐츠와 명시된 tool_choice 간 충돌 방지. 다른 값 입력 시 에러
  • 다단계 도구 호출 중에는 현재 턴 도구 호출의 assistant 메시지에 포함된 reasoning_content를 컨텍스트에 반드시 유지 — 그렇지 않으면 에러
  • 공식 내장 $web_search 도구는 Kimi K2.6/K2.5 사고 모드와 일시적으로 호환되지 않음 — 사고 모드를 먼저 끄고 $web_search 도구 사용 가능

올바른 도구 호출 사용법은 Use Thinking Mode 참고.

사고 모드 비활성화 예제

kimi-k2.6, kimi-k2.5 모델은 요청 본문에 "thinking": {"type": "disabled"}를 지정해 사고를 끌 수 있습니다.

curl

curl https://api.moonshot.ai/v1/chat/completions \
    -H "Content-Type: application/json" \
    -H "Authorization: Bearer $MOONSHOT_API_KEY" \
    -d '{
        "model": "kimi-k2.6",
        "messages": [
            {"role": "user", "content": "hello"}
        ],
        "thinking": {"type": "disabled"}
   }'

Python

import os
import openai

client = openai.Client(
    base_url="https://api.moonshot.ai/v1",
    api_key=os.getenv("MOONSHOT_API_KEY"),
)

response = client.chat.completions.create(
    model="kimi-k2.6",
    messages=[
        {"role": "user", "content": "hello"}
    ],
    extra_body={
        "thinking": {"type": "disabled"}
    },  # extra_body 파라미터로 사고 비활성화
    max_tokens=1024*32
    # temperature 설정 불필요
)

print(response.choices[0].message.content)
print(response)

Model Pricing

토큰 가격 상세는 Model Pricing — K2.6 참고.


더 알아보기

⚠️ 웹 검색(web_search)은 현재 업데이트 중입니다. 가까운 시일 내 이 기능 사용은 권장하지 않습니다. 본 문서는 일부 구버전이며, 후속 업데이트를 따라가 주세요.


변경 이력

날짜변경
2026-07-22초판 작성 (공식 Kimi K2.6 가이드 한글화)
2026-07-22제목에 "Kimi" 접두사 추가, 본문 H1 중복 제거

댓글

아직 댓글이 없습니다.

댓글을 작성하려면 로그인이 필요합니다.