블로그로 돌아가기

시작하기가이드

OpenRouter에서 CheapTokens로 전환: base_url, 키, 모델 id

OpenAI SDK(Python 및 JavaScript)에서 base_url, API 키, 모델 id를 바꾸고 첫 요청을 보내 제대로 됐는지 확인하세요.

작성자: CheapTokens Team 게시됨읽는 시간 4분

커버: base_url, 키, 모델 id를 바꿔 OpenAI SDK 앱을 OpenRouter에서 CheapTokens로 전환
이 페이지의 내용
  1. 실제로 바뀌는 것
  2. 전환 후 코드
  3. 제대로 됐는지 확인
  4. 어떤 모델이 무엇을 대체하나
  5. 같은 트래픽의 비용
  6. 안 될 때
  7. 배포 전에

앱이 이미 OpenAI SDK를 통해 OpenRouter를 호출하고 있고, 이제 CheapTokens를 호출하길 원합니다. 값 세 개 — base_url, API 키, model id — 를 바꾸고 선택적 헤더 두 개를 삭제하면 됩니다. 나머지 코드는 그대로 둡니다.

아래에는 Python, JavaScript, curl의 정확한 코드 라인, 전환이 제대로 됐는지 빠르게 확인하는 방법, 어떤 모델이 어떤 작업에 맞는지 정리한 표가 있습니다. CheapTokens에 요청을 보낸 적이 없다면 첫 API 요청 가이드에서 계정과 키를 다루고, 문서에 전체 레퍼런스가 있습니다.

실제로 바뀌는 것#

OpenRouter의 퀵스타트(2026년 10월 27일 확인)는 OpenAI 클라이언트를 base URL https://openrouter.ai/api/v1로 설정하고 모델을 provider/model-name 형식으로 지정합니다. CheapTokens는 https://api.cheaptokens.dev/v1에서 동일한 OpenAI Chat Completions 형식을 사용합니다. 따라서 클라이언트 클래스, chat.completions.create, 응답을 읽는 방식은 바뀌지 않습니다.

전후 비교: OpenRouter에서 CheapTokens로 전환할 때 바뀌는 세 가지 값
교체할 세 가지 값. 키는 환경 변수로 표시하며 코드에는 절대 넣지 않습니다.

줄마다 한 번씩 교체하면 됩니다:

  • base URL — OpenRouter 주소 대신 https://api.cheaptokens.dev/v1;
  • API 키 — CheapTokens 계정의 키를 환경 변수에서 읽습니다;
  • 모델 id — 전체 CheapTokens id, 예를 들어 deepseek-ai/DeepSeek-V4-Flash-0731. id는 CheapTokens 문서에서 가져오세요. 제공자마다 같은 모델을 다르게 부르며, 가격표의 짧은 id는 허용되지 않습니다.

그리고 하나 삭제합니다. OpenRouter의 HTTP-Referer와 X-OpenRouter-Title 헤더는 선택 사항이며 OpenRouter 리더보드에만 쓰입니다. default_headers / defaultHeaders에서 제거하세요. 여기서는 필요 없습니다.

전환 후 코드#

같은 요청을 세 가지 런타임으로 보여줍니다. 앱에서 쓰는 것을 고르세요.

전환 후 코드

Python

python
import os
from openai import OpenAI

client = OpenAI(
    base_url='https://api.cheaptokens.dev/v1',
    api_key=os.environ['CHEAPTOKENS_API_KEY'],
)

resp = client.chat.completions.create(
    model='deepseek-ai/DeepSeek-V4-Flash-0731',
    messages=[{'role': 'user', 'content': 'Reply with one word: ready'}],
    max_tokens=20,
)
print(resp.choices[0].message.content)

JavaScript

javascript
import OpenAI from 'openai';

const client = new OpenAI({
  baseURL: 'https://api.cheaptokens.dev/v1',
  apiKey: process.env.CHEAPTOKENS_API_KEY,
});

const resp = await client.chat.completions.create({
  model: 'deepseek-ai/DeepSeek-V4-Flash-0731',
  messages: [{ role: 'user', content: 'Reply with one word: ready' }],
  max_tokens: 20,
});
console.log(resp.choices[0].message.content);

curl

bash
curl https://api.cheaptokens.dev/v1/chat/completions \
  -H "Authorization: Bearer $CHEAPTOKENS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "deepseek-ai/DeepSeek-V4-Flash-0731", "messages": [{"role": "user", "content": "Reply with one word: ready"}], "max_tokens": 20}'

실행하기 전에 한 가지 더. 요청에 OpenRouter 전용 필드 — 라우팅이나 폴백 목록, 제공자 설정, ~alias 모델 id — 가 있다면 그것들은 OpenRouter에 속합니다. 요청은 표준 Chat Completions 필드로 유지하세요: model, messages, temperature, max_tokens, stream.

제대로 됐는지 확인#

응답이 왔다고 충분한 증거는 아닙니다. 응답 옆에 세 가지를 출력하세요: 어떤 모델이 답했는지, 왜 멈췄는지, 토큰으로 얼마나 과금됐는지.

python
print(resp.model)
print(resp.choices[0].finish_reason)
print(resp.usage.prompt_tokens, resp.usage.completion_tokens)
터미널에서 환경 변수와 확인 스크립트 실행
키를 한 번 설정하고, 확인 스크립트를 실행해 model, finish_reason, usage를 읽습니다.

stop의 finish_reason는 모델이 스스로 끝냈다는 뜻입니다. length은 max_tokens가 응답을 잘랐다는 뜻입니다. usage은 입력과 출력 토큰을 따로 보여주며, 이 두 숫자가 청구서를 구성합니다 — OpenRouter에서 추적하던 것과 같은 두 숫자입니다.

직접 해보기해보기: max_tokens를 1로 설정하면 finish_reason은 무엇이라고 나올까요?정답 보기

length라고 나옵니다 — 응답이 max_tokens에 의해 잘렸습니다. 코드가 잘린 응답을 처리하는지 확인하는 좋은 테스트입니다.

어떤 모델이 무엇을 대체하나#

OpenRouter에서 쓰던 이름이 아니라 작업에 맞춰 모델을 고르세요. 아래 정보는 2026년 10월 27일 확인한 CheapTokens 가격표에서 가져왔습니다. 하나의 잔액으로 세 모델을 모두 쓸 수 있고 가격은 시간대에 따라 변하지 않습니다.

모델 model id 컨텍스트 최대 응답
DeepSeek-V4-Flash deepseek-ai/DeepSeek-V4-Flash-0731 380K 32,768 토큰
GLM-5.3-Flash zai-org/GLM-5.3-Flash 390K 8,192 토큰
MiniMax-M2.7 MiniMaxAI/MiniMax-M2.7 180K 8,192 토큰

어느 행이 자신의 것인지 모르겠다면 앱이 하는 일에서 시작하세요:

사례 선택하기

앱이 주로 하는 일은 무엇인가요?

짧고 빈번한 요청 — 분류, 추출, 지원 응답

zai-org/GLM-5.3-Flash을 시도하세요: 390K 컨텍스트, 최대 8,192 토큰 응답, 입력과 출력을 합친 총액이 OpenRouter보다 저렴합니다.

긴 응답, 코드, 에이전트 루프

deepseek-ai/DeepSeek-V4-Flash-0731를 시도하세요: 최대 32,768 토큰 응답, 380K 컨텍스트, 하루 중 어느 때든 동일한 가격.

현재 OpenRouter의 높은 요율을 내고 있는 꾸준한 워크로드

MiniMaxAI/MiniMax-M2.7를 시도하세요: 180K 컨텍스트, 최대 8,192 토큰 응답, 총액 기준으로 OpenRouter보다 저렴합니다.

같은 트래픽의 비용#

봇이 요청 1,000건을 보내고 각각 입력 약 500 토큰, 출력 300 토큰이라고 가정해 봅시다. 이는 가정일 뿐이니 usage의 실제 수치로 바꾸세요. 아래 표는 실시간입니다: 저희 가격과 OpenRouter 열은 현재 가격표에서 가져왔으며 입력과 출력을 합산한 값입니다.

모델 요청당 1,000회 요청 OpenRouter, 1,000회 요청
GLM-5.3-Flash $0.000022 $0.022 $0.0434
DeepSeek-V4-Flash $0.000038 $0.0375 $0.0708
MiniMax-M2.7 $0.00007 $0.07 $0.51

요청당 입력 500개 및 출력 300개 토큰입니다. 100만 토큰당 가격은 현재 기준이며 당사 요금제에 따라 함께 변경됩니다. OpenRouter 열은 동일한 작업량에 대한 참고 가격을 보여줍니다.

DeepSeek-V4-Flash에서는 그 1,000건의 요청이 $0.0375입니다. 전체 가격은 가격 페이지에 있고, 과금 대상에 대한 개념은 입력 vs 출력 토큰에 있습니다.

안 될 때#

전환 후에는 세 가지 오류가 대부분의 문제를 설명합니다. 메시지를 원인과 맞춰 보세요:

짝 맞추기

각 증상을 원인과 맞추기

  • 401 Unauthorized키가 없거나, 잘못 입력됐거나, 아직 OpenRouter 키입니다
  • 404 Not Foundbase URL 경로가 잘못됐거나 모델 id가 전체 CheapTokens id가 아닙니다
  • 응답이 문장 중간에 잘림max_tokens가 응답에 필요한 양보다 적습니다; finish_reason이 length입니다

401 및 404 문제 해결 문서에서 각각을 정확한 메시지와 함께 다루고, base_url이란 무엇인가에서 슬래시 하나가 잘못되면 경로가 왜 깨지는지 설명합니다.

배포 전에#

체크리스트

전환 체크리스트