azosi · 2026.7.22 04:33 · 조회 1

Kimi K2.7 Code Quickstart

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


Kimi K2.7 Code 모델 개요

Kimi K2.7 Code는 Kimi의 코딩 특화 모델입니다. 긴 컨텍스트에서도 명령을 더 안정적으로 따르며, 코딩 작업의 성공률이 더 높습니다. 외부 벤치마크 평가에 따르면, Kimi K2.7 Code는 K2.6 대비 지시 준수율과 장기 코딩 성능을 크게 개선하면서도 과도한 사고(overthinking) 경향은 평균 30% 감소시켰습니다.

Kimi K2.7 Code HighSpeed (kimi-k2.7-code-highspeed) 는 K2.7 Code의 고속 버전으로, 동일한 모델이지만 단문 시나리오에서 약 180 tokens/s, 최대 260 tokens/s 의 출력 속도를 제공해 더 빠른 코딩 경험을 제공합니다. (현재 리소스가 제한적이어서 고속 모델의 경험이 약간 변동될 수 있으며, 점진적으로 리소스를 늘려가고 있습니다.)

장기 코딩 능력의 도약

외부 벤치마크 평가에서 Kimi K2.7 Code는 K2.6 대비 지시 준수율과 장기 코딩 성능을 크게 개선하면서 과도한 사고 경향은 평균 30% 감소.

kimi-k2.7

향상된 에이전틱(Agentic) 능력

K2.6 대비 에이전틱 능력이 10% 향상.

kimi-k2.7 agentic

초장문 컨텍스트 지원

  • kimi-k2.7-code, kimi-k2.7-code-highspeed, kimi-k2.6, kimi-k2.5 모델 모두 256K 컨텍스트 윈도우 제공.

Long-Thinking (장기 사고) 능력

  • Kimi K2.7 Code는 여전히 강력한 추론 능력을 갖추고 있으며, 다단계 도구 호출과 추론을 지원 — 복잡한 논리적 추론, 수학 문제, 코드 작성 등에서 탁월.
  • K2.7 Code는 비사고(non-thinking) 모드를 지원하지 않습니다.

사용 예제

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 — OpenAI SDK v1.10.0이 설치되어 Python 환경에서 사용되고 있음을 의미

빠른 시작

멀티모달 도구 능력 예제

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

먼저 샘플 비디오를 로컬 머신에 다운로드하세요 (예: ~/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.7-code",
            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.7 Code 참고.


요청 본문 파라미터 차이

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

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

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

필드필수설명타입
max_tokens선택chat completion이 생성할 최대 토큰 수int기본 32k (32768)
thinking선택신규! 이 요청에서 사고 모드 활성화 여부object기본 {"type": "enabled"}. K2.7 Code는 사고 모드 비활성화 시 에러 발생
temperature선택샘플링 temperaturefloatK2.7 Code는 고정값 1.0 사용. 다른 값 입력 시 에러
top_p선택샘플링 방법floatK2.7 Code는 고정값 0.95 사용. 다른 값 입력 시 에러
n선택입력 메시지당 생성할 결과 수intK2.7 Code는 고정값 1 사용. 다른 값 입력 시 에러
presence_penalty선택텍스트에 새 토큰이 등장했는지 기반 페널티floatK2.7 Code는 고정값 0.0 사용. 다른 값 입력 시 에러
frequency_penalty선택토큰의 기존 등장 빈도 기반 페널티floatK2.7 Code는 고정값 0.0 사용. 다른 값 입력 시 에러

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

도구 사용 시 모델 성능을 위해 다음 제약을 지켜주세요.

  • tool_choice"auto" 또는 "none"만 설정 가능 (기본 "auto") — 사고 콘텐츠와 명시된 tool_choice 간 충돌 방지. 다른 값 입력 시 에러
  • 다단계 도구 호출 중에는 현재 턴 도구 호출의 assistant 메시지에 포함된 reasoning_content를 컨텍스트에 반드시 유지 — 그렇지 않으면 에러 발생

Model Pricing

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


더 알아보기


변경 이력

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

댓글

아직 댓글이 없습니다.

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