블로그로 돌아가기

시작하기가이드

SDK 없이 requests로 CheapTokens에 첫 요청 보내기 (Python)

requests만 사용하는 20줄 Python 스크립트: 채팅 완성 한 번, 타임아웃, HTTP 오류 처리, 그리고 답변, finish_reason, usage 출력.

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

requests로 CheapTokens 채팅 완성 엔드포인트를 호출하는 Python 스크립트
이 페이지의 내용
  1. 전체 스크립트
  2. 각 줄이 하는 일
  3. 응답 읽기
  4. 작동하지 않을 때
  5. 한 번 호출 비용
  6. 다음 단계

OpenAI 호환 API와 통신하는 데 openai 패키지가 필요하지 않습니다. requests.post 호출 한 번, Bearer 키, JSON 본문이면 충분하며, 실제로 전송되는 내용을 정확히 확인할 수 있습니다. 이 가이드는 CheapTokens(https://api.cheaptokens.dev/v1/chat/completions)용 스크립트를 만들고, 마지막에 답변, finish_reason, 토큰 사용량을 출력하는 것으로 끝납니다.

requests만 설치된 잠긴 환경이거나, 작은 cron 작업에 SDK를 끌어들이고 싶지 않거나, SDK가 대신 무엇을 해주는지 이해하고 싶을 때 적합합니다. 첫 요청 가이드는 SDK, curl, Node 방식을 다루며, 이 글은 순수 Python 방식입니다.

전체 스크립트#

먼저 키를 환경 변수에 넣고(API 키를 안전하게 저장하는 방법 참고), 다음을 ask.py로 저장하세요:

python
import os
import requests

url = "https://api.cheaptokens.dev/v1/chat/completions"
headers = {"Authorization": f"Bearer {os.environ['CHEAPTOKENS_API_KEY']}"}
payload = {
    "model": "deepseek-ai/DeepSeek-V4-Flash-0731",
    "messages": [
        {"role": "user", "content": "Explain what a token is in two sentences."}
    ],
    "max_tokens": 200,
}

try:
    r = requests.post(url, headers=headers, json=payload, timeout=30)
    r.raise_for_status()
except requests.exceptions.Timeout:
    raise SystemExit("No reply within 30 seconds - try again or raise the timeout")
except requests.exceptions.HTTPError as e:
    raise SystemExit(f"HTTP {e.response.status_code}: {e.response.text}")

data = r.json()
choice = data["choices"][0]
print(choice["message"]["content"])
print("finish_reason:", choice["finish_reason"])
print("usage:", data["usage"])

python ask.py를 실행하세요. 모델 id는 전체 게이트웨이 id인 deepseek-ai/DeepSeek-V4-Flash-0731입니다. 무엇을 넣어야 할지 모르겠다면 GET /v1/models로 모델 목록 조회를 참고하세요. 다른 모델을 시도하려면 zai-org/GLM-5.3-Flash로 바꾸기만 하면 되고 다른 것은 바꾸지 마세요. 하나의 잔액으로 모든 모델을 사용할 수 있습니다.

하나의 요청 경로: 키, POST, raise_for_status, choices, usage
스크립트에서 출력된 답변까지의 하나의 요청

각 줄이 하는 일#

스크립트가 의존하는 다섯 가지 개념입니다. requests Quickstart(살아있는 문서, 2026년 11월 2일 확인)가 대부분을 설명하며, OpenAI의 Chat Completions 레퍼런스가 응답의 필드를 정의합니다.

플래시카드

스크립트의 다섯 가지

세 번째 항목을 많은 사람이 건너뜁니다. cron 작업에서 영원히 멈추는 스크립트는 30초 후에 크게 실패하는 스크립트보다 훨씬 나쁩니다.

응답 읽기#

성공 응답은 JSON입니다. Chat Completions 레퍼런스에 따르면 관심 있는 부분은 다음과 같습니다:

  • choices[0].message.content은 텍스트입니다. null일 수 있으므로 문자열 메서드를 무작정 호출하지 마세요.
  • choices[0].finish_reason은 모델이 멈춘 이유를 나타냅니다: stop(완료), length(max_tokens 한도로 중단), tool_calls, content_filter.
  • usage.prompt_tokens, usage.completion_tokens, usage.total_tokens은 과금 대상입니다: 입력, 출력, 그리고 그 합계.

응답의 형태는 다음과 같습니다(숫자는 자리 표시자입니다):

json
{
  "choices": [
    {
      "message": {"role": "assistant", "content": "A token is a small piece of text..."},
      "finish_reason": "stop"
    }
  ],
  "usage": {"prompt_tokens": 18, "completion_tokens": 52, "total_tokens": 70}
}
직접 해보기시도해 보세요: max_tokens를 5로 설정하고 스크립트를 다시 실행하세요. finish_reason은 무엇이라고 나오나요?정답 보기

length이라고 나옵니다: 모델이 max_tokens 한도로 중단되어 답변이 문장 중간에 끝납니다. 한도를 높이면 다시 stop이 나옵니다. 자세한 내용은 AI 답변이 잘렸나요? finish_reason "length" 해결을 참고하세요.

작동하지 않을 때#

스크립트는 대부분의 실패를 한 줄의 출력으로 바꿉니다. 각각이 보통 의미하는 바는 다음과 같습니다:

짝 맞추기

각 메시지를 일반적인 원인과 연결

  • HTTP 401키가 없거나, 잘못 입력되었거나, 보내려던 키가 아님
  • HTTP 404URL 경로 또는 모델 id가 잘못됨
  • requests.exceptions.Timeout타임아웃 내에 바이트가 도착하지 않음
  • KeyError: 'CHEAPTOKENS_API_KEY'이 터미널에 환경 변수가 설정되지 않음

실제 오류 본문과 키, 기본 URL, 모델 id의 단계별 확인은 API 401 또는 404 오류: 잘못된 키, 기본 URL 또는 모델 id를 참고하세요. 작은 함정 두 가지: KeyError: 'choices'이 보이면 오류 본문을 성공으로 파싱한 것이며, 이는 raise_for_status()를 건너뛰었다는 뜻입니다. 그리고 머신에 ~/.netrc 파일이 있으면 requests가 설정한 Authorization 헤더 대신 해당 자격 증명을 사용할 수 있습니다.

한 번 호출 비용#

위 응답의 자리 표시자 숫자(약 입력 18 토큰, 출력 52 토큰)로 DeepSeek-V4-Flash 한 번 호출 비용은 $0.0000055입니다. 체감하기 어려운 숫자이므로 규모를 키워 보겠습니다. 스크립트가 하루에 1,000개의 지원 티켓을 요약하고, 각각 약 800 토큰 입력, 300 토큰 출력이라고 가정해 봅시다:

모델 요청당 1,000회 요청 OpenRouter, 1,000회 요청
GLM-5.3-Flash $0.000028 $0.028 $0.0517
DeepSeek-V4-Flash $0.000042 $0.042 $0.098
MiniMax-M2.7 $0.000085 $0.085 $1.02

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

가격은 모델별로 고정되어 있으며 피크 시간이 없으므로 같은 스크립트는 새벽 3시와 정오에 동일한 비용이 듭니다. 현재 모델별 가격은 가격 페이지에 있고, 문서에 엔드포인트가 나열되어 있습니다.

다음 단계#

이것이 작동하면 일반적인 다음 단계는 여러 입력에 대한 루프, 429에 대한 재시도(429 Too Many Requests: 백오프를 사용한 재시도 참고), 또는 동일한 호출의 스트리밍입니다. HTTP를 직접 관리하고 싶지 않다면 SDK 방식은 base_url 한 번의 변경으로 전환할 수 있습니다.