KO ▾
API 키 받기

Kimi Code API URL: OpenAI 클라이언트용 Base URL 설정

이 서비스에 필요한 Kimi Code API URL은 https://api.kimicode.cc/v1입니다. 이를 모든 OpenAI 클라이언트의 Base URL로 설정하고 키를 추가한 후, 모델 ID는 uncensored를 사용하세요.

업데이트됨

클라이언트 터미널과 API 서버를 연결하는 케이블로, Base URL 설정을 나타냅니다.

URL과 각 부분의 의미

kimi code api url을 찾고 계신다면, Kimi 자체 서비스의 주소를 찾고 계신 것일 수 있습니다. 해당 주소는 벤더의 문서를 사용하세요. 제가 이를 보증할 수는 없기 때문입니다. 이 사이트는 다른 서비스를 제공합니다: 독립적인 제공자가 운영하는 하나의 오픈 웨이트 모델 앞에 배치된 호스팅된 OpenAI 호환 API입니다. 해당 주소는 다음과 같습니다:

https://api.kimicode.cc/v1

이 문자열이 Base URL입니다. 모든 요청에서 공유되는 부분입니다. SDK가 나머지 경로를 추가합니다. chat.completions.create를 호출하면 OpenAI 라이브러리는 https://api.kimicode.cc/v1/chat/completions로 POST 요청을 보냅니다. 모델 목록은 https://api.kimicode.cc/v1/models에서 GET 요청으로 조회할 수 있습니다.

이 API가 제공하는 메서드는 두 가지뿐입니다: POST /v1/chat/completions과 GET /v1/models. 이미지, 오디오, 임베딩 엔드포인트를 기대했다면 존재하지 않습니다. 텍스트 전용 API입니다.

세 가지 설정만 중요하며 기존 OpenAI 코드에서 다른 변경사항은 필요 없습니다: Base URL, API 키, 그리고 모델 ID uncensored입니다.

Base URL이 유일한 설정인 이유

OpenAI 스타일 클라이언트는 하나의 아이디어를 기반으로 구축되었습니다: 요청 형식은 고정되어 있고 호스트는 설정 항목입니다. 라이브러리에는 원래 벤더를 가리키는 기본 호스트가 있습니다. 이를 다른 Base URL로 교체하면 동일한 요청 본문이 다른 곳으로 전송됩니다. 프롬프트, 메시지 배열, 응답 파싱에는 변경사항이 없습니다.

다른 OpenAI 호환 제공업체에서 마이그레이션하는 것이 보통 세 가지 수정으로 끝나는 이유입니다: Base URL, 키, 모델 이름입니다. choices, message, finish_reason, usage와 같은 응답의 필드명은 동일하므로 해당 필드를 읽는 코드는 계속 작동합니다.

이것이 사람들이 겪는 이상한 오류를 설명합니다. 도구가 "서버 URL"을 요청하고 호스트만 붙여넣으면 경로가 누락됩니다. 도구가 "전체 엔드포인트"를 요청하고 Base URL을 붙여넣으면 요청이 잘못된 곳으로 전송됩니다. 설정 화면이 명확하지 않으면 Base URL부터 시도하고 반환된 상태 코드를 확인하세요. 문서의 빠른 시작 가이드는 동일한 마이그레이션 과정을 다른 예제와 함께 설명합니다.

편집할 수 없는 도구를 위한 환경 변수

많은 명령줄 도구와 프레임워크는 생성자에 접근하지 않고 OpenAI 클라이언트를 구성합니다. 이러한 도구는 일반적으로 표준 환경 변수를 읽으므로 이를 설정하면 충분합니다:

export OPENAI_BASE_URL="https://api.kimicode.cc/v1"
export OPENAI_API_KEY="YOUR_KEY"

일부 오래된 도구는 OPENAI_API_BASE을 대신 확인하므로 첫 번째 이름을 무시하는 경우 두 번째 이름을 시도하세요. 설정 후 도구를 같은 셸 세션에서 시작해야 합니다. 다른 터미널 창에서 설정한 변수는 공유되지 않습니다.

도구에는 여전히 모델 이름이 필요합니다. 호스팅된 모델이 하드코딩되어 있다면 이를 설정하는 플래그나 구성 라인을 찾아서 uncensored를 사용하세요. 변경할 수 없다면 해당 도구는 적합하지 않으며, 위의 스크립트와 같은 작은 스크립트가 더 나은 선택입니다.

먼저 키를 얻으세요

요청은 Authorization: Bearer YOUR_KEY 형태의 헤더로 인증됩니다. 모든 공식 SDK는 api_key 인자에서 이 헤더를 자동으로 생성합니다. Google 또는 이메일과 비밀번호로 로그인한 후 키를 생성할 수 있습니다.

새 계정은 API 키 페이지에서 한 번의 클릭으로 $0.50의 무료 체험 크레딧을 받을 수 있습니다. 카드가 필요 없으며 7일 동안 유효합니다. 이는 아래 예제를 여러 번 실행하기에 충분합니다. 체험용 키는 동시 요청 2개, 분당 요청 60개로 제한되므로 예제를 하나씩 실행하세요.

키를 소스 파일 대신 환경 변수에 저장하세요. 공개 저장소에 커밋된 키는 몇 시간 내에 누군가에 의해 발견되어 사용될 수 있으며, 해당 크레딧은 당신의 것입니다.

curl로 첫 번째 요청 보내기

curl은 모든 라이브러리를 제거하므로 URL이 작동하는지 확인하는 가장 빠른 방법입니다. 이 호출이 성공하면 이후 발생하는 모든 문제는 클라이언트 구성에 있습니다.

export KIMICODE_KEY="YOUR_KEY"

curl https://api.kimicode.cc/v1/models   -H "Authorization: Bearer $KIMICODE_KEY"

curl https://api.kimicode.cc/v1/chat/completions   -H "Authorization: Bearer $KIMICODE_KEY"   -H "Content-Type: application/json"   -d '{
    "model": "uncensored",
    "messages": [
      {"role": "user", "content": "Say hello in five words."}
    ]
  }'

첫 번째 호출은 uncensored를 포함하는 모델 목록을 반환합니다. 두 번째 호출은 표준 채팅 완료 객체를 반환합니다. curl -i로 응답 헤더를 확인하면 X-Request-Id, X-Balance-USD, X-RateLimit-Limit-Requests, X-RateLimit-Limit-Concurrency를 확인할 수 있습니다. 특정 호출에 대해 지원팀에 문의할 경우 요청 ID를 보관하세요.

OpenAI SDK를 사용한 Python

pip install openai로 라이브러리를 설치한 후 클라이언트 생성자의 두 인수를 변경하세요.

import os
from openai import OpenAI

client = OpenAI(
    base_url="https://api.kimicode.cc/v1",
    api_key=os.environ["KIMICODE_KEY"],
)

resp = client.chat.completions.create(
    model="uncensored",
    messages=[
        {"role": "system", "content": "You are a concise assistant."},
        {"role": "user", "content": "Explain what a base URL is in two sentences."},
    ],
    temperature=0.7,
)
print(resp.choices[0].message.content)
print(resp.usage)

temperature, top_p, stop, seed와 같은 매개변수 및 빈도/존재 패널티는 모델에 전달됩니다. max_tokens 값은 선택 사항입니다. 이 값을 지정하지 않으면 완료 텍스트가 100,000토큰 컨텍스트 창에서 남은 모든 부분을 사용할 수 있습니다. 이는 프롬프트와 완료 텍스트를 합친 것입니다.

인수를 전달하지 않으면 SDK는 두 가지 환경 변수도 읽습니다: OPENAI_BASE_URL과 OPENAI_API_KEY. 편집할 수 없는 도구에 유용합니다. 둘 다 설정하고 도구를 실행하면 이 API와 통신합니다.

Node, 스트리밍, JSON 모드

Node 설정은 Python과 동일합니다. npm install openai로 설치하세요.

import OpenAI from "openai";

const client = new OpenAI({
  baseURL: "https://api.kimicode.cc/v1",
  apiKey: process.env.KIMICODE_KEY,
});

// Streaming over SSE
const stream = await client.chat.completions.create({
  model: "uncensored",
  stream: true,
  messages: [{ role: "user", content: "Write a four-line poem about routers." }],
});
for await (const chunk of stream) {
  process.stdout.write(chunk.choices[0]?.delta?.content ?? "");
}

// JSON mode
const json = await client.chat.completions.create({
  model: "uncensored",
  response_format: { type: "json_object" },
  messages: [
    { role: "system", content: "Reply with a JSON object only." },
    { role: "user", content: "Give me keys name and port for a local dev server." },
  ],
});
console.log(JSON.parse(json.choices[0].message.content));

스트리밍은 서버 전송 이벤트를 사용하며 사용량은 스트림 종료 시 보고됩니다. 스트리밍 요청은 스트림이 끝날 때까지 동시 요청 슬롯을 유지하므로 스트림을 열지만 읽지 않는 클라이언트는 슬롯을 차단합니다. JSON 모드에서는 프롬프트에서 JSON 형식으로 답변하라고 모델에 지시해야 합니다. 플래그는 출력 형식을 제한하지만 명확한 지시가 더 나은 필드명을 제공합니다.

도구 호출

도구는 일반적인 OpenAI 형식을 사용합니다: tools 목록, 선택적 tool_choice, 그리고 role: "tool" 메시지로 반환되는 도구 결과입니다. 스트리밍 중에는 tool_calls가 청크에 걸쳐 분할되어 전달됩니다.

import json, os
from openai import OpenAI

client = OpenAI(base_url="https://api.kimicode.cc/v1", api_key=os.environ["KIMICODE_KEY"])

tools = [{
    "type": "function",
    "function": {
        "name": "get_port",
        "description": "Look up the port of a named local service",
        "parameters": {
            "type": "object",
            "properties": {"service": {"type": "string"}},
            "required": ["service"],
        },
    },
}]

messages = [{"role": "user", "content": "Which port does the api service use?"}]
first = client.chat.completions.create(model="uncensored", messages=messages, tools=tools)
call = first.choices[0].message.tool_calls[0]

messages.append(first.choices[0].message)
messages.append({
    "role": "tool",
    "tool_call_id": call.id,
    "content": json.dumps({"service": "api", "port": 8080}),
})
final = client.chat.completions.create(model="uncensored", messages=messages, tools=tools)
print(final.choices[0].message.content)

모델에서 반환된 인수를 신뢰할 수 없는 입력으로 취급하세요. 실행 전에 유효성을 검사하세요. 모델은 다른 모델과 마찬가지로 도구 호출을 건너뛰거나 잘못된 필드로 호출할 수 있으므로 루프에 대체 경로를 유지하세요.

URL 오류 발생 시

대부분의 실패는 짧은 목록에 해당합니다.

  • 404 Not Found. 경로가 잘못되었습니다. 일반적인 원인: Base URL이 https://api.kimicode.cc로 설정되어 있고 /v1이 누락되었거나, https://api.kimicode.cc/v1/chat/completions로 설정되어 클라이언트가 경로를 두 번 추가한 경우입니다. 위의 Base URL을 정확히 사용하세요.
  • 401 Unauthorized. 키가 누락되었거나 불필요한 공백이나 개행이 있거나 헤더가 Bearer 토큰이 아닙니다. 변수의 길이를 출력하여 확인하세요.
  • 코드 rate_limited가 포함된 429. 분당 제한을 초과했습니다: 일반 키는 분당 300회, 체험 키는 분당 60회입니다.
  • 코드 concurrency가 포함된 429. 동시 요청이 너무 많습니다: 일반 키는 8개, 체험 키는 2개입니다.
  • Retry-After: 5 헤더가 있는 429. 일시적 과부하입니다. 5초 후 다시 시도하세요.
  • 요청이 너무 큽니다. 본문 제한은 8 MB이며, 프롬프트와 완료 텍스트는 100,000토큰을 초과할 수 없습니다.

Retry-After를 준수하고 다른 두 코드에 대해 백오프하는 재시도 루프는 거의 모든 문제를 처리합니다. 호출당 비용은 적습니다. 요금 페이지에 토큰별 요금이 있으며, 문서 빠른 시작 가이드에는 다른 OpenAI 스타일 제공업체에서 마이그레이션하는 단계가 나와 있습니다.

재시도 및 프로덕션 관행

첫 번째 호출이 성공하면 배포 전에 재시도 래퍼를 추가하세요. Retry-After 헤더가 있는 경우 이를 준수하고, 그렇지 않은 경우 짧은 무작위 지연으로 백오프하세요.

import os, time, random
from openai import OpenAI, RateLimitError

client = OpenAI(base_url="https://api.kimicode.cc/v1", api_key=os.environ["KIMICODE_KEY"])

def ask(messages, tries=5):
    for attempt in range(tries):
        try:
            return client.chat.completions.create(model="uncensored", messages=messages)
        except RateLimitError as err:
            retry_after = 5
            if getattr(err, "response", None) is not None:
                retry_after = int(err.response.headers.get("retry-after", 5))
            time.sleep(retry_after + random.random())
    raise RuntimeError("still rate limited after retries")

자신의 동시 요청 수를 키에 맞게 제한하세요: 일반 키는 8개의 스레드 풀, 체험 키는 2개입니다. 이는 concurrency 오류를 사전에 방지하고, 각 호출에 몇 초 이상 걸릴 때 분당 300회 제한 내에서도 유지할 수 있게 합니다.

마지막으로, 토큰당 요금을 지불한다는 점을 기억하세요. 각 호출에 대한 usage 객체를 로깅하고 X-Balance-USD 헤더를 모니터링하세요. 입력 토큰 100만 개당 $0.15, 출력 토큰 100만 개당 $0.50이며, 일반적인 채팅 턴은 센트 단위의 일부 비용이지만 루프와 긴 이력이 누적되면 비용이 증가하며 로그에서 그 원인을 확인할 수 있습니다.

질문과 답변

이 API의 Base URL은 무엇인가요?

https://api.kimicode.cc/v1을 모든 OpenAI 호환 클라이언트의 Base URL로 설정하고 경로는 라이브러리에서 처리하세요.

어떤 모델 ID를 보내야 하나요?

모델 값으로 uncensored를 보내세요. 키로 GET /v1/models를 호출하여 확인할 수 있습니다.

공식 Kimi 엔드포인트에 이 사이트에서 발급한 API 키를 사용할 수 있나요?

아니요. 이 서비스는 자체 키와 단일 오픈 웨이트 모델을 사용하며, 공식 벤더의 API가 아닙니다. 키는 양방향으로 공유되지 않습니다.

채팅 완료 API에서 404 오류가 발생하는 이유는 무엇인가요?

Base URL에 /v1이 누락되었거나 이미 /chat/completions이 포함되어 있을 수 있습니다. https://api.kimicode.cc/v1를 그대로 사용하세요.

키 발급은 단 한 번의 절차로 끝납니다

계정을 생성하고 키를 복사한 후 기본 URL을 변경하세요. 설정은 이것으로 끝입니다.

API 키 받기