Quay lại blog

API & SDKHướng dẫn

LangChain ChatOpenAI với base_url tùy chỉnh: CheapTokens trong Python

Trỏ ChatOpenAI của LangChain tới CheapTokens: base_url, key và id model trong Python, rồi invoke, streaming và lượng token dùng mỗi lần gọi.

Bởi CheapTokens TeamĐã xuất bản Đã cập nhật 5 phút đọc

Code Python: ChatOpenAI với base_url trỏ tới CheapTokens API
Trên trang này
  1. Id model nào đi vào model
  2. Đặt base_url qua biến môi trường
  3. Streaming câu trả lời
  4. Đọc lượng token dùng mỗi lần gọi
  5. Một pipeline LangChain tốn bao nhiêu mỗi ngày
  6. Hướng dẫn này bao gồm những gì

Bạn đã có một chain LangChain gọi tới ChatOpenAI, và bạn muốn nó chạy trên một endpoint khác mà không phải viết lại. Bạn có thể: truyền ba đối số, base_url, api_key và model, và phần còn lại của chain giữ nguyên. CheapTokens nói giao thức OpenAI Chat Completions tại https://api.cheaptokens.dev/v1, nên ChatOpenAI dùng trực tiếp được với nó.

Các bước dưới đây theo tài liệu LangChain ChatOpenAI tính đến ngày 27 tháng 10 năm 2026. Trang không ghi ngày hay phiên bản, nên tôi không ghim bản phát hành langchain-openai ở đây: hãy cài bản mới nhất.

Từng bước một

Kết nối LangChain trong ba bước

Cài đặt

bash
pip install -U langchain-openai

Đặt key

Giữ key trong một biến môi trường, không để trong file:

bash
export CHEAPTOKENS_API_KEY="your-key"

Gọi model

python
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() trả về một message; .content là văn bản trả lời. Đó là toàn bộ phần kết nối. Lấy key và nạp số dư trong tài liệu CheapTokens.

Bốn bước: đặt base_url, đặt api_key, dùng id model đầy đủ, đọc usage_metadata
Bốn thứ cần đặt: base_url, api_key, id model đầy đủ, rồi đọc usage

Id model nào đi vào model#

Dùng id đầy đủ, kèm tiền tố nhà phát triển. Tên ngắn như deepseek-v4-flash là thứ bạn thấy trong bảng giá; API nhận deepseek-ai/DeepSeek-V4-Flash-0731. Các id từ danh sách model của CheapTokens:

  • deepseek-ai/DeepSeek-V4-Flash-0731: ngữ cảnh 380K, tối đa 32.768 token đầu ra mỗi câu trả lời. Mặc định tốt cho các chain có tài liệu dài và câu trả lời dài.
  • zai-org/GLM-5.3-Flash: ngữ cảnh 390K, tối đa 8.192 token đầu ra.
  • MiniMaxAI/MiniMax-M2.7: ngữ cảnh 180K, tối đa 8.192 token đầu ra.

Đổi model chỉ là sửa một dòng, vì model chỉ là một chuỗi:

python
llm = ChatOpenAI(
    model="zai-org/GLM-5.3-Flash",
    base_url="https://api.cheaptokens.dev/v1",
    api_key=os.environ["CHEAPTOKENS_API_KEY"],
)

Cả ba dùng chung một số dư, nên bạn có thể thử từng cái trên cùng một chain mà không cần mở gì mới. Giá hiện tại ở trang giá; với MiniMax-M2.7, đầu vào là $0.05 và đầu ra $0.15 trên 1M token.

Đặt base_url qua biến môi trường#

Chain của bạn gọi ChatOpenAI, thứ gửi request tới api.cheaptokens.dev/v1
Request đi đâu: chain, ChatOpenAI, CheapTokens API

Nếu bạn không muốn động vào code, LangChain đọc địa chỉ từ môi trường. Tài liệu nêu thứ tự ưu tiên:

  1. đối số base_url (hoặc openai_api_base) bạn truyền trong code;
  2. OPENAI_API_BASE, thứ LangChain đọc;
  3. OPENAI_BASE_URL, thứ SDK openai đọc.

Kiểm tra nhanh

Bạn đặt base_url trong code và cũng export OPENAI_BASE_URL với một địa chỉ khác. ChatOpenAI dùng cái nào?

Hiện đáp án

Trả lời: Đối số base_url trong code

Đối số tường minh có ưu tiên cao nhất, rồi OPENAI_API_BASE, rồi OPENAI_BASE_URL. Một biến bị bỏ quên trong shell sẽ không chuyển hướng một lệnh gọi đặt base_url tường minh.

Một tác dụng phụ từ cùng trang tài liệu: khi OPENAI_BASE_URL được đặt, LangChain mặc định tắt stream_usage. Điều đó quan trọng ở hai mục tiếp theo.

Streaming câu trả lời#

Với một UI, bạn muốn có văn bản ngay khi nó đến. stream() trả về các chunk, và mỗi chunk có một phần .content:

python
for chunk in llm.stream("Write a three-line summary of how HTTP works."):
    print(chunk.content, end="", flush=True)

Thế là đủ cho một cửa sổ chat. Nếu bạn cũng muốn số token ở cuối luồng stream, truyền stream_usage=True: ChatOpenAI(..., stream_usage=True). Hướng dẫn này đếm token từ invoke(), như ở mục tiếp theo. Streaming trong SDK OpenAI thuần được đề cập ở Streaming responses in Python.

Đọc lượng token dùng mỗi lần gọi#

Mỗi message do invoke() trả về đều mang usage_metadata với số token mà lần gọi đã dùng:

python
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': ...}

Cộng dồn những con số này qua một pipeline là bạn có ngân sách cho mỗi lần chạy:

python
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"]

Đầu vào và đầu ra được tính giá riêng, nên hãy giữ cả hai con số. Lý do có sự tách biệt này nằm ở Input vs output tokens, và một bộ theo dõi đầy đủ có chốt dừng khi chạm ngân sách nằm ở Track AI agent token cost in Python.

Một pipeline LangChain tốn bao nhiêu mỗi ngày#

Giả sử bạn chạy một bot hỗ trợ với 2.000 ticket mỗi ngày. Mỗi lần gọi gửi ticket cộng một prompt, khoảng 3.000 token, và câu trả lời khoảng 500 token. Trên MiniMax-M2.7, một lần gọi như vậy tốn $0.00023. Kéo các thanh trượt về số của bạn; trang web sẽ tính tổng theo giá hiện tại:

Máy tính chi phí

Một ngày của bot hỗ trợ

Token đầu vào mỗi yêu cầu: 3.000 · Token đầu ra mỗi yêu cầu: 500 · Số yêu cầu mỗi ngày: 2.000

Mô hìnhMỗi ngàyMỗi tháng
GLM-5.3-Flash$0.16$4.80
DeepSeek-V4-Flash$0.19$5.70
MiniMax-M2.7$0.45$13.50

Máy tính hiển thị tổng theo ngày: trong kiểu gọi này, đầu vào chiếm phần lớn token và đầu ra là phần nhỏ hơn. Với CheapTokens, tổng cộng, tính cả đầu vào và đầu ra, thấp hơn của OpenRouter, và giá giữ nguyên ở mọi giờ: không có giá giờ cao điểm để phải tính toán.

Hướng dẫn này bao gồm những gì#

Ví dụ dùng chat completions thuần: invoke, stream và usage_metadata. ChatOpenAI theo đặc tả OpenAI, nên văn bản trả lời nằm ở .content. Theo tài liệu LangChain, nó chuyển sang Responses API khi bạn dùng các tool tích hợp sẵn hoặc tham số reasoning.

Nếu một lần gọi thất bại, nguyên nhân thường là một trong ba điều: thiếu /v1 trong base_url, dùng id model ngắn thay vì id đầy đủ, hoặc biến key chưa được export trong shell chạy Python. Danh sách các lỗi kết nối thường gặp cho thấy mỗi lỗi trông như thế nào.

Bước tiếp theo: chạy khối ba bước ở trên với chain của bạn, rồi thử cùng chain đó trên các endpoint tương thích OpenAI với một id model khác.