API & SDK가이드
커스텀 base_url을 사용하는 LangChain ChatOpenAI: Python에서 CheapTokens 사용하기
LangChain의 ChatOpenAI를 CheapTokens로 지정하기: Python에서 base_url, 키, 모델 id 설정 후 invoke, 스트리밍, 호출별 토큰 사용량 확인.

이 페이지의 내용
이미 ChatOpenAI와 통신하는 LangChain 체인이 있고, 이를 다시 작성하지 않고 다른 엔드포인트에서 실행하고 싶다고 가정해 보겠습니다. 방법은 간단합니다. base_url, api_key, model 세 인자를 전달하면 체인의 나머지는 그대로 유지됩니다. CheapTokens는 https:/에서 OpenAI Chat Completions 프로토콜을 사용하므로 ChatOpenAI가 그대로 작동합니다.
아래 단계는 2026년 10월 27일 기준으로 확인한 LangChain ChatOpenAI 문서를 따릅니다. 해당 페이지에는 날짜나 버전이 표시되어 있지 않으므로 여기서 langchain-openai 릴리스는 고정하지 않겠습니다. 최신 버전을 설치하세요.
단계별로
세 단계로 LangChain 연결하기
설치
pip install -U langchain-openai키 설정
키는 파일이 아니라 환경 변수에 보관하세요:
export CHEAPTOKENS_API_KEY="your-key"모델 호출
import os
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(
model="deepseek-ai/DeepSeek-V4-Flash-0731",
base_url="https://api.cheaptokens.dev/v1",
api_key=os.environ["CHEAPTOKENS_API_KEY"],
)
msg = llm.invoke("Explain what a token is in one sentence.")
print(msg.content)invoke()는 메시지를 반환하고, .content는 답변 텍스트입니다. 연결은 이게 전부입니다. 키를 발급받고 잔액을 충전하려면 CheapTokens 문서를 참고하세요.

model에 어떤 모델 id를 넣어야 할까#
개발자 접두사가 붙은 전체 id를 사용하세요. deepseek- 같은 짧은 이름은 가격표에서 보이는 것이고, API는 deepseek-를 받습니다. CheapTokens 모델 목록의 id는 다음과 같습니다:
deepseek-: 380K 컨텍스트, 답변당 최대 32,768 출력 토큰. 긴 문서와 긴 답변이 있는 체인에 적합한 기본값입니다.ai/ DeepSeek- V4- Flash- 0731 zai-: 390K 컨텍스트, 최대 8,192 출력 토큰.org/ GLM- 5. 3- Flash MiniMaxAI/: 180K 컨텍스트, 최대 8,192 출력 토큰.MiniMax- M2. 7
모델은 문자열일 뿐이므로 전환은 한 줄만 바꾸면 됩니다:
llm = ChatOpenAI(
model="zai-org/GLM-5.3-Flash",
base_url="https://api.cheaptokens.dev/v1",
api_key=os.environ["CHEAPTOKENS_API_KEY"],
)세 모델 모두 하나의 잔액을 공유하므로 새로 발급받지 않고도 같은 체인에서 각각 시험해 볼 수 있습니다. 현재 가격은 가격 페이지에 있으며, MiniMax-M2.7의 경우 1M 토큰당 입력 $0.05, 출력 $0.15입니다.
환경 변수로 base_url 설정하기#

코드를 건드리고 싶지 않다면 LangChain이 환경에서 주소를 읽도록 할 수 있습니다. 문서에 나온 우선순위는 다음과 같습니다:
- 코드에서 전달한
base_url(또는openai_api_base) 인자; - LangChain이 읽는
OPENAI_API_BASE; openaiSDK가 읽는OPENAI_BASE_URL.
빠른 확인
코드에서 base_url을 설정했는데 다른 주소로 OPENAI_BASE_URL도 export했습니다. ChatOpenAI는 어느 것을 사용할까요?
정답 보기
정답: 코드의 base_url 인자
명시적 인자가 가장 높은 우선순위를 가지며, 그다음이 OPENAI_API_BASE, 그다음이 OPENAI_BASE_URL입니다. 셸에 남아 있는 변수를 잊어도 base_url을 명시적으로 설정한 호출은 다른 곳으로 리다이렉트되지 않습니다.
같은 문서 페이지에서 나온 부수 효과 하나: OPENAI_BASE_URL가 설정되면 LangChain은 기본적으로 stream_usage를 끕니다. 이는 다음 두 섹션에서 중요합니다.
답변 스트리밍#
UI에서는 텍스트가 도착하는 대로 보여주고 싶을 것입니다. stream()는 청크를 생성하며, 각 청크에는 .content 조각이 있습니다:
for chunk in llm.stream("Write a three-line summary of how HTTP works."):
print(chunk.content, end="", flush=True)채팅 창에는 이 정도면 충분합니다. 스트림이 끝날 때 토큰 수도 알고 싶다면 stream_를 전달하세요: ChatOpenAI(.. 이 가이드에서는 다음 섹션처럼 invoke()에서 토큰을 계산합니다. 일반 OpenAI SDK에서의 스트리밍은 Python에서 응답 스트리밍하기에서 다룹니다.
호출별 토큰 사용량 읽기#
invoke()가 반환하는 모든 메시지에는 해당 호출에서 사용한 토큰이 담긴 usage_metadata가 함께 있습니다:
msg = llm.invoke("Summarize this ticket in one line: my invoice shows the wrong VAT number.")
print(msg.usage_metadata)
# {'input_tokens': ..., 'output_tokens': ..., 'total_tokens': ...}파이프라인 전체에서 이 값을 합산하면 실행별 예산을 알 수 있습니다:
total_in = total_out = 0
for ticket in tickets:
msg = llm.invoke(ticket)
total_in += msg.usage_metadata["input_tokens"]
total_out += msg.usage_metadata["output_tokens"]입력과 출력은 별도로 가격이 책정되므로 두 숫자를 모두 보관하세요. 이 구분이 존재하는 이유는 입력 토큰 vs 출력 토큰에 있고, 예산 도달 시 중단 가드가 있는 전체 추적기는 Python에서 AI 에이전트 토큰 비용 추적하기에 있습니다.
LangChain 파이프라인의 일일 비용#
하루에 2,000건의 티켓을 처리하는 지원 봇을 운영한다고 가정해 보겠습니다. 각 호출은 티켓과 프롬프트를 합쳐 약 3,000 토큰을 보내고, 답변은 약 500 토큰입니다. MiniMax-M2.7에서 이런 호출 한 번의 비용은 $0.00023입니다. 슬라이더를 자신의 숫자로 옮겨 보세요. 사이트가 현재 가격으로 합산합니다:
비용 계산기
지원 봇의 하루
요청당 입력 토큰: 3,000 · 요청당 출력 토큰: 500 · 일일 요청 수: 2,000
| 모델 | 일일 | 월간 |
|---|---|---|
| GLM-5.3-Flash$0.02$0.04 | $0.16 | $4.80 |
| DeepSeek-V4-Flash$0.015$0.10 | $0.19 | $5.70 |
| MiniMax-M2.7$0.05$0.15 | $0.45 | $13.50 |
계산기는 일일 합계를 보여줍니다. 이런 호출에서는 입력이 토큰의 대부분을 차지하고 출력은 작은 부분입니다. CheapTokens에서는 입력과 출력을 합친 총액이 OpenRouter보다 낮게 나오며, 가격은 시간대와 관계없이 동일합니다. 피크 시간 요금을 고려할 필요가 없습니다.
이 가이드가 다루는 범위#
예제는 일반 채팅 완성 기능을 사용합니다: invoke, stream, usage_metadata. ChatOpenAI는 OpenAI 사양을 따르므로 답변 텍스트는 .content에 있습니다. LangChain 문서에 따르면, 내장 도구나 reasoning 매개변수를 사용할 때는 Responses API로 전환됩니다.
호출이 실패하면 원인은 보통 세 가지 중 하나입니다: base_url에 /v1가 없음, 전체 id 대신 짧은 모델 id 사용, 또는 Python을 실행하는 셸에 키 변수가 export되지 않음. 일반적인 연결 오류 목록에서 각각이 어떻게 나타나는지 확인할 수 있습니다.
다음 단계: 위의 세 단계 블록을 자신의 체인으로 실행한 뒤, 같은 체인을 다른 모델 id로 OpenAI 호환 엔드포인트에서 시험해 보세요.



