Kimi K2 API 종료: K2.7 Code에서 K3.1 Pro로 이전
2026년 12월로 예정된 Kimi K2 종료 전에 K2.6과 K2.7 Code를 K3.1 Pro로 이전합니다. 가입 시점별 접근 조건의 차이를 확인하고 K2 매개변수를 교체합니다. 전체 도구 호출 이력을 보존하고 OpenCode와 Claude Code의 모델 별칭을 변경하며, 캐시 쓰기 비용과 토큰 사용량을 대조합니다. 실행 가능한 API 점검 코드와 회귀 테스트 항목을 제공합니다.
목차

Kimi K2가 종료될 예정인 2026년 12월 말 전에 kimi-k2.6과 kimi-k2.7-code 워크로드를 kimi-k3.1-pro로 이전합니다. 추론 강도와 생성 한도를 명시하고, 운영 트래픽을 전환하기 전에 도구 호출 이력과 캐시 요금을 확인합니다. 2026-11-05 기준으로 신규 계정에 대한 제한은 이미 시행 중입니다.
Kimi K2는 언제 종료되나요?
접근 조건을 충족한 기존 계정은 현재 K2를 계속 사용할 수 있습니다. 다만 해당 공지에는 정확한 종료 날짜와 시간이 공개되어 있지 않습니다.
요금 페이지의 공지에 따르면 2026년 10월 31일부터 새로 가입한 사용자는 K2를 사용할 수 없습니다. 모든 K2 모델은 2026년 12월 말까지 종료할 계획입니다.
현재 모델 목록은 가입 기준일을 조금 다르게 설명합니다. 11월 1일 전에 가입한 사용자는 kimi-k2.6, kimi-k2.7-code, kimi-k2.7-code-highspeed를 계속 사용할 수 있다고 명시합니다. 해당 모델들은 2026년 12월 말에 종료될 예정입니다.
해당 날짜 전후에 가입했다면 계정의 실제 접근 권한을 확인합니다. 두 문구만으로는 제한이 적용되는 정확한 시점을 확정할 수 없습니다. 새로 배포하는 서비스는 K3.1 Pro로 시작합니다.
모든 K2 접근 실패가 같은 오류를 반환한다고 가정하면 안 됩니다. 8월 변경 이력은 이미 종료된 kimi-k2.5와 moonshot-v1 모델에 대해 404 “model not found”를 확인해 줍니다. 이 설명은 향후 K2.6이나 K2.7 Code가 종료된 뒤 반환할 응답을 명시하지 않습니다.
트래픽 전환 전에 요청 규격을 변경합니다
요청 본문과 대화 저장 방식을 함께 수정합니다. Kimi의 현재 매개변수 비교 문서는 모델 이름만 바꿀 때 놓칠 수 있는 차이를 설명합니다.
| 설정 | kimi-k2.6 | kimi-k2.7-code | kimi-k3.1-pro |
|---|---|---|---|
| 추론 모드 | 기본 활성화, 비활성화 가능 | 항상 활성화 | 항상 활성화, K2의 thinking 객체 제거 |
reasoning_effort | 지원하지 않음 | 지원하지 않음 | 최상위 필드에 low, high, max 지정, 기본값은 max |
temperature | 추론 모드에서 1.0, 추론을 끄면 0.6으로 고정 | 1.0으로 고정 | 1.0으로 고정, 필드 생략 |
| 문서에 명시된 기본 생성 한도 | max_tokens: 32768 | max_tokens: 32768 | max_completion_tokens: 131072 |
K2.7 Code도 이미 추론 모드가 필수였으며 추론 내용을 보존했습니다. K2.6에서 추론 모드를 끄고 사용했다면 이 요구사항이 더 큰 변화가 됩니다.
K3.1 Pro 빠른 시작 안내는 top_p=0.95, n=1, presence_penalty=0, frequency_penalty=0도 고정값으로 명시합니다. 이 필드들과 temperature는 요청에서 생략합니다. 래퍼 라이브러리의 기본값도 확인합니다. 애플리케이션에서 설정하지 않은 샘플링 값을 클라이언트가 자동으로 넣을 수 있습니다.
새 Chat Completions 요청에는 max_completion_tokens를 사용합니다. API 참조 문서는 max_tokens를 더 이상 권장하지 않는 필드로 표시합니다. 필드가 제거되었다고 명시하지는 않습니다. K3.1 Pro에서 설정 가능한 최댓값은 1048576이며, 실제 생성량은 남아 있는 컨텍스트 공간의 제한을 받습니다.
생성 한도는 상한입니다. 모든 요청이 반드시 그만큼 토큰을 사용한다는 뜻은 아닙니다. 늘어난 기본값을 그대로 적용하기보다 작업에 맞게 한도를 정합니다.
연결 확인과 범위가 좁은 조회 작업에는 추론 강도를 low로 시작합니다. 일반적인 코딩 작업에는 high를 시도합니다. 회귀 테스트에서 추가 추론의 효과를 확인한 작업에는 max를 사용합니다. low는 추론 강도를 낮추지만 추론 모드를 끄지는 않습니다.
한도를 설정해 API와 도구 호출을 점검합니다
에이전트 설정의 문제를 분석하기 전에 API를 직접 호출해 확인합니다.
Global Kimi Open Platform에서 API 키를 생성합니다. 2026-11-05 기준 접근 조건에 따라 최소 $1의 충전이 정상적으로 완료되어야 합니다. https://api.moonshot.ai에 대응하는 플랫폼에서 발급한 키를 사용합니다. Kimi Code 계정 오류라면 별도의 Kimi Code 사용 한도 안내부터 확인합니다.
Bash에서 키가 화면에 표시되지 않도록 입력합니다:
read -rs MOONSHOT_API_KEY && export MOONSHOT_API_KEY
다음 Bash 명령은 Python 3의 표준 라이브러리를 사용합니다. 요금이 부과되는 요청을 두 번 보내고, 로컬 곱셈 함수를 실제로 실행합니다. 생성 한도 4096은 이 산술 점검용으로 정한 값이며, 일반적인 코딩 작업 전체에 적용할 한도는 아닙니다.
python3 - <<'PY'
import json
import os
import urllib.error
import urllib.request
tools = [{
"type": "function",
"function": {
"name": "multiply",
"description": "Multiply two integers.",
"parameters": {
"type": "object",
"properties": {
"a": {"type": "integer"},
"b": {"type": "integer"}
},
"required": ["a", "b"],
"additionalProperties": False
}
}
}]
def chat(messages, choice):
payload = {
"model": "kimi-k3.1-pro",
"messages": messages,
"reasoning_effort": "low",
"max_completion_tokens": 4096,
"tools": tools,
"tool_choice": choice
}
request = urllib.request.Request(
"https://api.moonshot.ai/v1/chat/completions",
data=json.dumps(payload).encode("utf-8"),
headers={
"Authorization": "Bearer " + os.environ["MOONSHOT_API_KEY"],
"Content-Type": "application/json"
},
method="POST"
)
try:
with urllib.request.urlopen(request, timeout=120) as response:
data = json.load(response)
except urllib.error.HTTPError as error:
raise SystemExit(f"HTTP {error.code}: check access and request parameters.")
if data.get("model") != "kimi-k3.1-pro":
raise RuntimeError("Unexpected response model.")
if data["choices"][0]["finish_reason"] == "length":
raise RuntimeError("Generation limit reached; do not accept this result.")
return data
messages = [{
"role": "user",
"content": "Use multiply to calculate 6 times 7, then report the result."
}]
first = chat(messages, "required")
assistant = first["choices"][0]["message"]
calls = assistant.get("tool_calls") or []
if not calls:
raise RuntimeError("Expected a tool call.")
messages.append(assistant)
for call in calls:
function = call["function"]
arguments = json.loads(function["arguments"])
if function["name"] != "multiply":
raise RuntimeError("Unexpected tool.")
if not isinstance(arguments, dict) or set(arguments) != {"a", "b"}:
raise RuntimeError("Unexpected arguments.")
if any(type(arguments[key]) is not int for key in ("a", "b")):
raise RuntimeError("Expected integer arguments.")
result = arguments["a"] * arguments["b"]
messages.append({
"role": "tool",
"tool_call_id": call["id"],
"content": json.dumps({"result": result})
})
final = chat(messages, "none")
choice = final["choices"][0]
answer = choice["message"].get("content") or ""
if choice["finish_reason"] != "stop" or not answer.strip():
raise RuntimeError("Expected a completed final answer.")
print(answer)
print(json.dumps({"first": first["usage"], "final": final["usage"]}))
PY
정상적으로 완료되면 42가 포함된 최종 답변과 두 요청의 사용량 객체가 차례로 출력되어야 합니다. 이 코드는 도구 호출 누락, 다른 모델의 응답, 잘못된 인수, 생성 한도에 걸린 응답, 미완료 최종 응답을 검사해 거부합니다.
messages.append(assistant)는 응답 메시지 전체를 보존합니다. 여기에는 reasoning_content와 tool_calls도 포함됩니다. 각 도구 결과에는 해당 호출과 일치하는 tool_call_id를 사용합니다. 운영 환경의 대화 저장소에도 이 이력 보존 규칙을 적용합니다.
예제는 두 단계를 확인하기 위해 도구 호출을 강제하거나 금지하는 설정을 명시적으로 사용합니다. 일반적인 에이전트 반복 처리에서는 모델이 추가 도구 호출 필요 여부를 결정하도록 auto를 사용할 수 있습니다.
요청이 실패하면 오류 참조 문서에서 다음으로 확인할 항목을 선택합니다:
401이면 키 발급 플랫폼과 요청 엔드포인트를 확인한 뒤 같은 점검을 다시 실행합니다.- 기존 애플리케이션에서
400이 발생하면 전송하는 JSON을 확인합니다. K2의thinking설정이나 고정 샘플링 값을 덮어쓰는 설정이 남아 있는지 점검합니다. 404이면 모델 ID와 계정의 접근 권한을 모두 확인합니다. 코드만으로는 오타가 원인이라고 단정할 수 없습니다.finish_reason="length"이면 답변을 미완료로 처리합니다. 결과를 채택하기 전에 작업, 추론 강도 또는 생성 한도를 조정합니다.
2026-11-05 기준 BetterToken 목록에도 kimi-k3.1-pro가 있습니다. 이 OpenAI 호환 API에는 https://www.bettertoken.ai/v1과 직접 발급한 BetterToken API 키를 사용합니다. 현재 요금과 요청 규격은 별도로 확인합니다. Moonshot의 캐시 규칙으로 이 게이트웨이의 동작을 판단할 수는 없습니다.
OpenCode와 Claude Code 설정을 변경합니다
K2를 선택할 수 있는 모든 경로에서 모델을 변경합니다. 백그라운드 작업과 하위 에이전트도 포함됩니다. 주 대화가 정상적으로 동작해도 이 경로들까지 검증된 것은 아닙니다.
OpenCode: Moonshot 프로바이더를 선택합니다
기본 제공되는 Moonshot AI 프로바이더를 사용하고 모델 목록을 갱신합니다. 프로바이더 ID는 moonshotai이며, 키는 MOONSHOT_API_KEY에서 읽습니다.
아래 명령은 OpenCode v1.19.5의 명령줄 인터페이스(CLI) 규격에 맞춘 예제입니다. 같은 Bash 세션에서 실행합니다:
opencode models moonshotai --refresh
opencode run --model moonshotai/kimi-k3.1-pro --variant high \
"Inspect the current project and identify the test command. Do not edit files."
갱신된 목록에는 moonshotai/kimi-k3.1-pro가 있어야 합니다. 두 번째 명령은 해당 프로바이더와 모델로 현재 프로젝트에 맞는 답변을 반환해야 합니다. 모델이 보이지 않으면 진행하기 전에 설치된 클라이언트 버전과 목록 갱신 여부를 확인합니다.
두 플래그는 CLI 참조 문서에 설명되어 있습니다. 모델 선택을 저장하려면 프로젝트의 opencode.json이나 전역 설정 파일 ~/.config/opencode/opencode.json에 "model": "moonshotai/kimi-k3.1-pro"를 지정합니다. 두 파일이 모두 있으면 설정 우선순위 규칙을 따릅니다.
명령의 high 설정은 해당 실행에 적용됩니다. 대화형 세션에서는 첫 프롬프트를 보내기 전에 /variants로 추론 강도를 선택합니다. 클라이언트도 함께 업그레이드한다면 저장소 수정 권한을 허용하기 전에 OpenCode 2 권한 변경 사항을 확인합니다.
Claude Code: 모든 모델 별칭을 변경합니다
Moonshot의 어댑터 경로를 사용하되, 설치된 클라이언트에서 호환성을 확인합니다. Moonshot은 Claude Code 호환 연결 경로를 안내합니다. Anthropic의 게이트웨이 문서는 Claude Code를 Claude 이외의 모델로 연결하는 경로를 지원하지 않는다고 설명합니다.
먼저 ~/.claude/settings.json과 프로젝트 설정을 확인합니다. env 블록에 남아 있는 이전 엔드포인트, 인증 정보, 모델, 추론 강도 값을 새 설정에 맞게 수정합니다. Moonshot은 설정 파일의 환경 변수 값이 터미널에서 내보낸 값을 덮어쓸 수 있다고 경고합니다.
현재 Moonshot 예제는 여전히 Haiku를 kimi-k2.7-code에 연결합니다. 아래 Bash 설정은 나열된 모든 모델 등급을 이전 대상 모델로 바꾸는 제안입니다:
unset ANTHROPIC_API_KEY
export ANTHROPIC_BASE_URL="https://api.moonshot.ai/anthropic"
export ANTHROPIC_AUTH_TOKEN="$MOONSHOT_API_KEY"
export ANTHROPIC_MODEL="kimi-k3.1-pro"
export ANTHROPIC_DEFAULT_OPUS_MODEL="$ANTHROPIC_MODEL"
export ANTHROPIC_DEFAULT_SONNET_MODEL="$ANTHROPIC_MODEL"
export ANTHROPIC_DEFAULT_HAIKU_MODEL="$ANTHROPIC_MODEL"
export ANTHROPIC_DEFAULT_FABLE_MODEL="$ANTHROPIC_MODEL"
export CLAUDE_CODE_SUBAGENT_MODEL="$ANTHROPIC_MODEL"
export CLAUDE_CODE_EFFORT_LEVEL="high"
claude --model kimi-k3.1-pro
위 API 점검에서 내보낸 키를 그대로 사용합니다. ANTHROPIC_SMALL_FAST_MODEL을 포함해 이전 K2 설정이 남아 있는지도 확인합니다.
/status를 실행해 기본 URL과 모델을 확인합니다. 이어서 간단한 답변을 요청하고, 로컬 파일을 읽는 작업도 요청합니다. 모델 설정 기능으로 실제 적용된 추론 강도를 확인합니다.
Claude Code는 Messages 프로토콜을 사용합니다. 다음 Kimi Messages 필드를 Chat Completions의 필드와 구분합니다:
| 목적 | Chat Completions | Kimi Messages |
|---|---|---|
| 추론 강도 | reasoning_effort | output_config.effort |
| 생성 한도 | max_completion_tokens | 필수 필드 max_tokens |
| 캐시 유효 기간 | prompt_cache_options.ttl | 최상위 객체의 cache_control.ttl |
Chat Completions에서 사용을 권장하지 않는다는 이유로 Messages의 max_tokens 필드 이름을 바꾸면 안 됩니다.
캐시 비용을 계산할 때 토큰을 중복 집계하지 않습니다
입력 토큰을 캐시 읽기, 캐시 쓰기, 캐시를 사용하지 않은 입력으로 나눕니다. K3.1 Pro에서는 캐시 쓰기에 별도 요금이 부과됩니다. 비용 계산에 이 요금도 포함합니다.
Chat Completions에서 다음 필드를 읽습니다:
- 전체 입력:
usage.prompt_tokens. - 캐시 읽기:
usage.prompt_tokens_details.cached_tokens. - 캐시 쓰기:
usage.prompt_tokens_details.cache_write_tokens. - 전체 출력:
usage.completion_tokens.
API 사용량 집계 규칙에 따르면 세 입력 범주는 서로 겹치지 않습니다. 출력 사용량에는 추론 토큰과 답변 토큰이 이미 포함되어 있습니다.
같은 통화로 표시된 1,000,000토큰당 요금을 사용합니다:
uncached = prompt_tokens - cached_tokens - cache_write_tokens
token_cost = (
uncached * miss_rate
+ cached_tokens * hit_rate
+ write_5m * write_5m_rate
+ write_1h * write_1h_rate
+ completion_tokens * output_rate
) / 1_000_000
여기서 write_5m + write_1h는 cache_write_tokens와 같아야 합니다. 단가는 현재 요금표에서 확인합니다. 이 계산은 토큰 요금의 추정치이므로 청구 내역과 대조합니다.
Kimi는 캐시 옵션을 생략하면 자동으로 5m 캐시를 사용합니다. 요청 간 간격이 더 길다면 "prompt_cache_options": {"mode": "implicit", "ttl": "1h"} 설정을 검토합니다.
캐시 안내에 따르면 기존 항목은 처음 설정된 유효 기간을 유지합니다. 1h를 보내도 아직 유효한 5m 항목의 유효 기간은 늘어나지 않습니다. 실제 쓰기 토큰 수는 응답 헤더 Msh-Usage-Cache-Write-Tokens-5m과 Msh-Usage-Cache-Write-Tokens-1h를 수집해 확인합니다.
실제 작업을 대표하는 프리픽스, 즉 입력의 앞부분을 고정하고 요청을 반복해 테스트합니다. 위 산술 점검은 캐시 효과를 확인하기에 너무 작을 수 있습니다. 토큰이 블록 하나를 채우지 못하면 캐시에 기록되지 않기 때문입니다. 테스트 중에는 추론 강도를 일정하게 유지합니다. 강도를 바꾸면 프리픽스 캐시 적중이 무효화됩니다.
스트리밍 애플리케이션에서는 stream_options.include_usage=true도 설정합니다. 스트리밍 안내에 따라 추론, 답변, 도구 호출의 조각을 합칩니다. choices 배열이 비어 있어도 마지막 사용량 청크를 읽습니다.
운영 전환 전에 회귀 테스트를 준비합니다
새 경로가 기존 인수 테스트를 통과한 뒤에만 소량의 트래픽을 전환합니다.
매번 같은 저장소 리비전, 프롬프트, 도구 정의, 테스트 명령을 사용해 비교합니다. low, high, max는 별도 세션에서 실행합니다. 완료한 작업의 품질, 전체 응답 시간, 입력 범주별 사용량, 전체 출력량, 재시도, 청구 비용을 기록합니다.
다음 사례를 회귀 테스트에 포함합니다:
- 이전 어시스턴트 응답에 의존하는 여러 차례의 대화 작업.
- 도구 호출 후 모델이 다시 응답하는 작업.
- JSON 인수가 여러 조각으로 나뉘어 전달되는 스트리밍 도구 호출.
- 설정한 생성 한도에 근접하는 작업.
- K2 별칭이 남아 있을 수 있는 백그라운드 작업이나 하위 에이전트 작업.
품질과 응답 시간 요구사항을 만족하는 가장 낮은 추론 강도를 선택합니다. high가 중요한 작업에 실패하고 max가 테스트에서 해당 작업을 안정적으로 완료한다면, 그 작업 유형에는 max를 유지합니다.
K2로 되돌리는 경로는 계정에 접근 권한이 남아 있는 동안만 유지합니다. 종료 예정 기간 전에 K2에 의존하지 않는 대체 경로를 테스트합니다. 예약 작업, 재시도 경로, 에이전트 설정에서 이전 K2 ID를 제거합니다.