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.

Trên trang này
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:/, 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
pip install -U langchain-openaiĐặt key
Giữ key trong một biến môi trường, không để trong file:
export CHEAPTOKENS_API_KEY="your-key"Gọi model
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.

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- là thứ bạn thấy trong bảng giá; API nhận deepseek-. Các id từ danh sách model của CheapTokens:
deepseek-: 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.ai/ DeepSeek- V4- Flash- 0731 zai-: ngữ cảnh 390K, tối đa 8.192 token đầu ra.org/ GLM- 5. 3- Flash MiniMaxAI/: ngữ cảnh 180K, tối đa 8.192 token đầu ra.MiniMax- M2. 7
Đổi model chỉ là sửa một dòng, vì model chỉ là một chuỗi:
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#

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:
- đối số
base_url(hoặcopenai_api_base) bạn truyền trong code; OPENAI_API_BASE, thứ LangChain đọc;OPENAI_BASE_URL, thứ SDKopenaiđọ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:
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_: ChatOpenAI(.. 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:
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:
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ình | Mỗi ngày | Mỗi tháng |
|---|---|---|
| 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 |
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.



