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

장기 코딩 능력의 도약
- 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
빠른 시작
- Playground에서 시도: Dev Workbench의 인터랙티브 환경에서 비즈니스 시나리오 모델 성능 테스트
- API Key 신청: API 호출로 즉시 테스트
이미지 이해 코드 예제
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 | 선택 | 샘플링 temperature | float | k2.6/k2.5는 사고 모드에서 고정값 1.0, 비사고 모드에서 고정값 0.6. 다른 값 입력 시 에러 |
top_p | 선택 | 샘플링 방법 | float | k2.6/k2.5는 고정값 0.95 사용. 다른 값 입력 시 에러 |
n | 선택 | 입력 메시지당 생성할 결과 수 | int | k2.6/k2.5는 고정값 1 사용. 다른 값 입력 시 에러 |
presence_penalty | 선택 | 텍스트에 새 토큰이 등장했는지 기반 페널티 | float | k2.6/k2.5는 고정값 0.0 사용. 다른 값 입력 시 에러 |
frequency_penalty | 선택 | 토큰의 기존 등장 빈도 기반 페널티 | float | k2.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 참고.
더 알아보기
- K2.6 벤치마크 테스트: benchmark best practice
- K2.6의 가장 자세한 API 사용 예제: Vision Input
- Claude Code에서 Kimi K2 사용
- Thinking Mode 설정과 사용
⚠️ 웹 검색(
web_search)은 현재 업데이트 중입니다. 가까운 시일 내 이 기능 사용은 권장하지 않습니다. 본 문서는 일부 구버전이며, 후속 업데이트를 따라가 주세요.
- 웹 검색은 Kimi API가 제공하는 강력한 공식 도구입니다. 사용법은 Web Search와 공식 도구들 참고.
- 전체 모델 가격: 여기, Billing & Rate Limit 상세, Web Search 가격
변경 이력
| 날짜 | 변경 |
|---|---|
| 2026-07-22 | 초판 작성 (공식 Kimi K2.6 가이드 한글화) |
| 2026-07-22 | 제목에 "Kimi" 접두사 추가, 본문 H1 중복 제거 |
댓글
아직 댓글이 없습니다.
댓글을 작성하려면 로그인이 필요합니다.