Chuỗi định danh mô hình (model string) là hằng số nguy hiểm nhất trong cơ sở mã của bạn. Các nhóm thường coi nó như một nhãn dán, nhưng thực tế nó quyết định checkpoint nào sẽ phản hồi, chi phí cho mỗi lần gọi là bao nhiêu và liệu yêu cầu có thành công hay không. Do đó, việc ngừng hỗ trợ và lập phiên bản mô hình AI phải thuộc về quy trình phát hành của bạn, chứ không phải là quyết định chỉ thực hiện một lần khi ra mắt. Hướng dẫn này sử dụng API mô hình công khai của TokenLab, được quan sát vào ngày 03/10/2026, để chỉ ra những gì bạn có thể tự động kiểm tra, những gì bạn phải xác minh ở nơi khác và những việc cần làm khi một ID ngừng hoạt động.
Những điểm chính cần lưu ý
- Dữ liệu vòng đời nằm trên đối tượng mô hình. Hãy đọc
tokenlab.lifecycletừ Get a Model (quan sát ngày 03/10/2026) thay vì sao chép ngày tháng từ các bài đăng trên blog. - Tất cả năm mô hình chúng tôi đã kiểm tra vào ngày 03/10/2026 đều ở trạng thái
active, không có ngày ngừng hỗ trợ hoặc ngày nghỉ hưu. Bằng chứng của chúng tôi không chứa mô hình nào thực sự đã bị ngừng hỗ trợ, vì vậy quy trình xử lý lỗi dưới đây là hành vi đã được ghi lại, không phải là sự cố chúng tôi đã chứng kiến. - Một mô hình bị thiếu sẽ trả về
model_not_found, nhưng trạng thái khác nhau tùy theo endpoint. Hãy phân nhánh dựa trêncode, đừng bao giờ chỉ dựa vào trạng thái. - Ghim các ID chính xác và giữ chúng trong một lớp cấu hình duy nhất. TokenLab cho biết họ không tự động thay thế mô hình mà bạn gửi.
- Phương án dự phòng (fallback) phải là một lựa chọn đã được kiểm thử và phê duyệt trước. Khả năng, định dạng yêu cầu, giới hạn và giá cả đều khác nhau giữa các mô hình.
Nơi hiển thị thông tin ngừng hỗ trợ và lập phiên bản mô hình AI trong API
Tài liệu tham khảo Get a Model (quan sát ngày 03/10/2026) cho biết trường lifecycle bao gồm tính khả dụng, ngày phát hành, ngày ngừng hỗ trợ và mô hình thay thế. Tài liệu tham khảo List Models (quan sát ngày 03/10/2026) bổ sung tokenlab.lifecycle, tokenlab.aliases, tokenlab.commercial và tokenlab.badges vào mỗi mục trong danh sách. Trang tương tự liệt kê tokenlab.accepted_request_formats và các giới hạn token, những thông tin quan trọng cho bất kỳ sự thay đổi nào.
Đây là những gì chúng tôi đọc được từ API mô hình trực tiếp cho claude-sonnet-5 vào ngày 03/10/2026. Đây là bản tóm tắt các giá trị đã quan sát được. Bằng chứng của chúng tôi ghi lại các giá trị, không phải tên khóa lồng nhau thô, vì vậy hãy xác nhận các khóa chính xác so với phản hồi trực tiếp.
GET https://api.tokenlab.sh/v1/models/claude-sonnet-5
category: chat
lifecycle stage: active
released: 2026-06-30
replacement model: None
deprecated_at: None
retired_at: None
max input tokens: 1000000
max output tokens: 128000
accepted formats: anthropic_messages, openai_chat_completions
Ánh xạ năm khái niệm vòng đời vào các trường đó như sau:
| Khái niệm | Trường trong phản hồi đã quan sát | Giá trị cho claude-sonnet-5 |
|---|---|---|
| Giai đoạn | lifecycle stage | active |
| Phát hành | released | 2026-06-30 |
| Ngừng hỗ trợ | deprecated_at |
None |
| Nghỉ hưu | retired_at |
None |
| Thay thế | replacement model | None |
Một giá trị trống không phải lúc nào cũng báo hiệu vấn đề. Đối với glm-5.2 và gpt-5.5, API trực tiếp (quan sát ngày 03/10/2026) hiển thị released là None trong khi giai đoạn là active. Một bài kiểm tra sẽ thất bại nếu deprecated_at được thiết lập, retired_at được thiết lập hoặc giai đoạn không phải là active. Nó không nên thất bại khi thiếu ngày phát hành.
Chúng tôi cũng đã đọc deepseek-v4-pro và deepseek-v4-flash (cả hai đều phát hành ngày 24/04/2026, đều đang hoạt động, không có thay thế). Điều đó tạo ra năm mô hình không có tín hiệu ngừng hỗ trợ. Trường thay thế của một mô hình đã ngừng hỗ trợ là giá trị duy nhất chúng tôi không thể quan sát thấy được điền.
Tập lệnh thất bại khi một phụ thuộc gặp sự cố
Bài kiểm tra dưới đây chỉ sử dụng endpoint GET /v1/models/{model} đã được ghi lại, không cần API key vì danh mục là công khai. Nó sẽ thất bại nếu thiếu ID, deprecated_at hoặc retired_at được thiết lập, giai đoạn không phải là active hoặc định dạng yêu cầu mà mô hình không còn chấp nhận.
#!/usr/bin/env python3
"""Thất bại khi ID mô hình mà chúng ta phụ thuộc bị thiếu, ngừng hỗ trợ hoặc nghỉ hưu."""
import json
import sys
import urllib.error
import urllib.request
BASE = "https://api.tokenlab.sh/v1/models/"
# ID mô hình -> định dạng yêu cầu mà mã của chúng ta thực sự gửi
DEPENDENCIES = {
"gpt-5.5": "openai_chat_completions",
"claude-sonnet-5": "anthropic_messages",
"deepseek-v4-pro": "openai_chat_completions",
}
def fetch(model_id):
req = urllib.request.Request(BASE + model_id, headers={"Accept": "application/json"})
try:
with urllib.request.urlopen(req, timeout=15) as resp:
return resp.status, json.load(resp)
except urllib.error.HTTPError as exc:
try:
body = json.load(exc)
except ValueError:
body = {}
return exc.code, body
def check(model_id, fmt):
try:
status, body = fetch(model_id)
except urllib.error.URLError as exc:
return [f"không thể xác minh: {exc.reason}"], {}, []
if status in (400, 404):
return [f"thiếu: HTTP {status}"], {}, []
if status != 200:
return [f"không thể xác minh: HTTP {status}"], {}, []
info = body.get("tokenlab", {})
life = info.get("lifecycle") or {}
problems = []
if not life:
problems.append("không trả về khối vòng đời")
stage = life.get("stage") # xác nhận khóa chính xác so với phản hồi trực tiếp
if stage not in (None, "active"):
problems.append(f"stage={stage}")
for key in ("deprecated_at", "retired_at"):
if life.get(key):
problems.append(f"{key}={life[key]}")
if fmt not in info.get("accepted_request_formats", []):
problems.append(f"định dạng {fmt} không được chấp nhận")
return problems, life, info.get("aliases", [])
def main():
failed = False
for model_id, fmt in DEPENDENCIES.items():
problems, life, aliases = check(model_id, fmt)
if problems:
failed = True
print(f"FAIL {model_id}: {'; '.join(problems)}")
if life:
print(f" lifecycle: {json.dumps(life)}")
else:
print(f"ok {model_id} aliases={aliases}")
sys.exit(1 if failed else 0)
if __name__ == "__main__":
main()
Hãy chạy nó trong CI và theo lịch trình hàng đêm, vì một mô hình có thể thay đổi trạng thái mà không cần bạn phải commit mã. Hãy tưởng tượng một công việc hàng đêm thoát với mã 1 vào thứ Ba trong khi lần triển khai cuối cùng của bạn là một tuần trước. Đó chính là vấn đề: lỗi xuất hiện trong đường ống (pipeline), không phải trong cửa sổ trò chuyện của khách hàng. Tập lệnh in toàn bộ khối vòng đời khi thất bại để con người có thể thấy giá trị thay thế mà không cần đoán tên khóa.
Những gì một mô hình đã nghỉ hưu hoặc không xác định trả về
Bằng chứng ghi lại các mô hình không xác định và không khả dụng, không phải là phản hồi "đã nghỉ hưu" được dán nhãn riêng. Do đó, chúng tôi coi việc nghỉ hưu là cùng một nhóm lỗi cho đến khi bạn xác minh ngược lại. Đây là những gì tài liệu nói, tất cả đều được quan sát vào ngày 03/10/2026:
| Nơi | Phản hồi | Nguồn |
|---|---|---|
GET /v1/models/{model} |
404 model_not_found |
Get a Model |
| Yêu cầu trò chuyện với mô hình bị viết sai hoặc không khả dụng | 400 model_not_found, tùy chọn với did_you_mean, suggestions, hint |
Các lỗi tác nhân có thể xử lý |
| Thao tác không có nguồn cung trong tầng Giao hàng đã chọn | 503 all_channels_failed hoặc 503 delivery_tier_unavailable, retryable: false |
Các lỗi tác nhân có thể xử lý |
| Key thiếu quyền cho mô hình | 403 model_not_allowed |
Xử lý lỗi API |
Các mã trạng thái không thống nhất giữa các endpoint, vì vậy một bản sửa lỗi quan trọng: mã dự phòng của bài viết nguồn của chúng tôi coi 404 và 410 là "định danh đã mất." Điều đó sai đối với các yêu cầu trò chuyện. Phản hồi trò chuyện được ghi lại là 400, và hướng dẫn lỗi cho biết hãy xử lý lỗi theo trạng thái HTTP và code. Hãy tập trung logic của bạn vào code == "model_not_found".
Ví dụ, tài liệu cho thấy một ID bị viết sai trả về did_you_mean: "gpt-5.6-terra". Client của bạn nên phản ứng theo thứ tự này:
- Không lặp lại yêu cầu mà không thay đổi. Hướng dẫn lỗi đánh dấu
400,403và404là không thể lặp lại. - Coi
did_you_meanlà một gợi ý. Chỉ chuyển đổi nếu sản phẩm của bạn đã có quyền thay đổi mô hình. - Nếu phần thân 503 nói
retryable: false, hãy ngừng thử lại. Tài liệu nói rằng các tên tương tự không chứng minh được tính khả dụng. - Lưu Request ID từ các tiêu đề phản hồi cùng với mô hình và ID công việc của riêng bạn.
- Cảnh báo cho con người. Một ID đã ghim bị biến mất là một sự kiện phát hành, không phải là lỗi tạm thời.
Ghim một ID chính xác hoặc theo một bí danh (alias)
Hướng dẫn thực tiễn tốt nhất (quan sát ngày 03/10/2026) cho biết hãy giữ ID mô hình rõ ràng trong mỗi yêu cầu và không tự động chuyển đổi mô hình. Nó cảnh báo rằng một sự thay thế có thể làm thay đổi chất lượng, giá cả, độ dài ngữ cảnh, công cụ hoặc hỗ trợ phương tiện. Hướng dẫn lỗi nói thêm rằng TokenLab không tự động thay thế mô hình mà bạn gửi.
| Chiến lược | Hành vi | Rủi ro chính |
|---|---|---|
Ghim một ID chính xác như gpt-5.5 |
Bạn nhận được mô hình đó, hoặc một lỗi | Lỗi nghiêm trọng nếu ID bị xóa |
| Theo một bí danh | Tên có thể trỏ đến một nơi mới theo thời gian | Hành vi và chi phí có thể thay đổi mà không cần thay đổi mã |
| Tên định tuyến nội bộ trong cấu hình của bạn | Mã của bạn yêu cầu primary_chat; cấu hình ánh xạ nó đến một ID chính xác |
Bạn sở hữu và kiểm tra việc ánh xạ |
Về bí danh, chúng tôi đã tìm thấy một khoảng trống. Tài liệu tham khảo List Models nói rằng tokenlab.aliases tồn tại trên mỗi mục. Không có trích đoạn trực tiếp nào trong số năm trích đoạn chúng tôi có (claude-sonnet-5, deepseek-v4-pro, deepseek-v4-flash, glm-5.2, gpt-5.5) hiển thị giá trị bí danh. Chúng tôi không thể cho bạn biết những mô hình đó có bí danh nào ngày hôm nay. Tập lệnh ở trên in aliases cho mỗi phụ thuộc, vì vậy hãy chạy nó và đọc kết quả đầu ra.
Hai sự thật nữa về danh mục sẽ hữu ích. Danh mục ngày 02/10/2026 liệt kê các phiên bản là các ID chính xác riêng biệt, ví dụ claude-sonnet-4-6, claude-sonnet-5 và claude-sonnet-5-5. Việc được liệt kê cạnh nhau không làm cho cái này trở thành người kế nhiệm của cái kia. Giá trị replacement là nơi duy nhất mối quan hệ đó nên xuất phát từ đó. Một ID, grok-voice-latest, có "latest" trong tên của nó. Chúng tôi không có bằng chứng về việc nó kế thừa cái gì, vì vậy hãy kiểm tra trang mô hình của nó trước khi tin tưởng nó. Các ID có tiền tố kiểu Marketplace không phải là bí danh của TokenLab. Hướng dẫn di chuyển cho biết các ID TokenLab không mang tiền tố nhà cung cấp OpenRouter, và nó gợi ý giữ bí danh LiteLLM của riêng bạn tách biệt với ID TokenLab.
Mẫu dự phòng cho một mô hình đã ghim bị biến mất
Hãy coi phương án dự phòng là một mô hình đã ghim thứ hai mà bạn đã kiểm tra trước. Chọn nó cho mỗi vị trí gọi, ghi lại mô hình nào đã phục vụ mỗi câu trả lời và xác minh nó bằng cùng một tập lệnh hàng đêm. So sánh hai mô hình trước khi bạn ghép chúng lại:
| Mô hình (API trực tiếp, quan sát 03/10/2026) | Đầu vào / đầu ra trên 1 triệu token | Tối đa token đầu vào / đầu ra | Định dạng yêu cầu | Khả năng được liệt kê |
|---|---|---|---|---|
gpt-5.5 |
$1.50 / $9.00 | 1,000,000 / 128,000 | openai_chat_completions, openai_responses |
coding, json-mode, prompt-cache, reasoning, tool-use, vision |
claude-sonnet-5 |
$0.90 / $4.50 | 1,000,000 / 128,000 | anthropic_messages, openai_chat_completions |
json-mode, prompt-cache, reasoning, tool-use, vision |
deepseek-v4-pro |
$0.66 / $1.98 ngoài giờ cao điểm; $1.32 / $3.96 cao điểm | 1,000,000 / 384,000 | anthropic_messages, openai_chat_completions, openai_responses |
json-mode, prompt-cache, tool-use |
Giá cả cho cả ba đã được cập nhật lần cuối vào 02/10/2026T16:53:30.068Z. Sự khác biệt rất quan trọng. claude-sonnet-5 không chấp nhận openai_responses, vì vậy một người gọi dựa trên Responses không thể dự phòng sang nó. deepseek-v4-pro không liệt kê vision hay reasoning, vì vậy một yêu cầu có hình ảnh sẽ bị hỏng ở đó. Các khung giờ cao điểm của DeepSeek chạy từ 09:00-12:00 và 14:00-18:00 giờ Bắc Kinh.
Đây là ước tính chi phí với cách tính được hiển thị. Giả sử tải hàng ngày là 10 triệu token đầu vào và 2 triệu token đầu ra, đây là con số minh họa của chúng tôi, không phải phép đo:
gpt-5.5: 10 × $1.50 + 2 × $9.00 = $15 + $18 = $33 mỗi ngày.claude-sonnet-5: 10 × $0.90 + 2 × $4.50 = $9 + $9 = $18 mỗi ngày.deepseek-v4-prongoài giờ cao điểm: 10 × $0.66 + 2 × $1.98 = $6.60 + $3.96 = $10.56 mỗi ngày.deepseek-v4-procao điểm: 10 × $1.32 + 2 × $3.96 = $13.20 + $7.92 = $21.12 mỗi ngày.
Đây là các ước tính, và đầu vào được lưu vào bộ nhớ đệm (cached) có giá khác. Mã dưới đây chỉ dự phòng khi gặp các lỗi mà việc thử lại không thể khắc phục. Một lỗi 429 hoặc 5xx có thể thử lại nên tuân theo các quy tắc thử lại thông thường.
import logging
import os
import openai
log = logging.getLogger("model-routing")
client = openai.OpenAI(
api_key=os.environ["TOKENLAB_API_KEY"],
base_url="https://api.tokenlab.sh/v1",
timeout=30.0,
max_retries=0, # chúng tôi quyết định những gì an toàn để lặp lại
)
ROUTES = {
"primary_chat": {"model": "gpt-5.5", "fallback": "claude-sonnet-5"},
"coding_agent": {"model": "claude-sonnet-5", "fallback": "deepseek-v4-pro"},
}
def _error(exc):
body = exc.body if isinstance(exc.body, dict) else {}
err = body.get("error", body)
return err if isinstance(err, dict) else {}
def _chat(model_id, text):
resp = client.chat.completions.create(
model=model_id,
messages=[{"role": "user", "content": text}],
)
return resp.choices[0].message.content
def call_model(route, text):
"""Trả về (model_đã_trả_lời, text). Ghi lại mô hình với kết quả."""
cfg = ROUTES[route]
try:
return cfg["model"], _chat(cfg["model"], text)
except openai.APIStatusError as exc:
err = _error(exc)
code = err.get("code")
gone = code == "model_not_found"
no_supply = (
code in ("all_channels_failed", "delivery_tier_unavailable")
and err.get("retryable") is False
)
if not (gone or no_supply):
raise # 401/402/403/429 và những lỗi tương tự cần một bản sửa lỗi khác
log.warning("mô hình đã ghim %s không khả dụng (%s); đang sử dụng %s",
cfg["model"], code, cfg["fallback"])
return cfg["fallback"], _chat(cfg["fallback"], text)
Phương án dự phòng chỉ nhảy một lần và không bao giờ liên kết chuỗi. Nếu phương án dự phòng cũng thất bại, hãy đưa ra lỗi và thông báo cho ai đó. Một chuỗi thay thế âm thầm là vấn đề trôi dạt (drift) dưới một cái tên khác.
Danh sách kiểm tra phát hành cho việc ngừng hỗ trợ và lập phiên bản mô hình AI
Chạy danh sách này trước khi thay đổi ID mô hình sản xuất. Nó phản ánh hướng dẫn thực tiễn tốt nhất (quan sát ngày 03/10/2026) và bổ sung các kiểm tra vòng đời.
- Liệt kê mọi ID mô hình trong sản xuất và đặt tên cho vị trí gọi sử dụng từng ID. Một lớp cấu hình nên trả lời điều này trong vài giây.
- Chạy tập lệnh vòng đời so với ID hiện tại và ID ứng viên. Đọc
deprecated_at,retired_at, giai đoạn và thay thế. - Xác nhận ứng viên chấp nhận định dạng yêu cầu mà mã của bạn gửi, sử dụng
accepted_request_formatstừ Get a Model. - So sánh tối đa token đầu vào và đầu ra so với yêu cầu thực tế dài nhất của bạn và giới hạn đầu ra của bạn.
- So sánh các khả năng. Xác nhận vision, tool-use, json-mode và reasoning nơi sản phẩm của bạn phụ thuộc vào chúng.
- Tính toán lại chi phí từ giá hiện tại, với cách tính được hiển thị. Đối với DeepSeek, hãy tách biệt cao điểm và ngoài giờ cao điểm.
- Phát lại các yêu cầu đại diện với ID ứng viên và định dạng chính xác mà bạn sẽ phát hành. Bao gồm một trường hợp thất bại, chẳng hạn như một ID không xác định.
- Xác minh đường dẫn lỗi. Client của bạn nên phân nhánh trên
code, giữ Request ID và không thử lại400,403hoặc404. - Phát hành thay đổi dưới dạng chỉnh sửa cấu hình với ID cũ được giữ làm giá trị khôi phục đã được ghi lại.
- Kiểm tra xem mọi bản ghi phản hồi đều lưu trữ mô hình thực sự phục vụ nó.
- Chạy lại tập lệnh hàng đêm sau khi phát hành. Xác nhận ID dự phòng cũng vượt qua.
Nơi tài liệu im lặng, danh sách kiểm tra là biện pháp bảo vệ. Họ không đưa ra thời gian thông báo ngừng hỗ trợ và không có kênh thông báo. Xác minh các thông báo của nhà cung cấp một cách riêng biệt và kiểm tra trang của chính mô hình đó để biết bất kỳ ghi chú vòng đời nào.
Câu hỏi thường gặp
Làm thế nào để biết liệu một mô hình TokenLab có bị ngừng hỗ trợ hoặc nghỉ hưu hay không?
Gọi GET /v1/models/{model} và đọc tokenlab.lifecycle. Kiểm tra giai đoạn, deprecated_at, retired_at và mô hình thay thế. Tính đến ngày 03/10/2026, năm mô hình chúng tôi đọc đều ở trạng thái active mà không có ngày nào được thiết lập. Hãy thăm dò lại, vì giá trị chỉ phản ánh thời điểm bạn hỏi.
Một ID mô hình không xác định trả về trạng thái HTTP nào?
Nó phụ thuộc vào endpoint. Get a Model trả về 404 model_not_found, trong khi một yêu cầu trò chuyện với mô hình xấu trả về 400 model_not_found. Một mô hình không có nguồn cung trong tầng Giao hàng đã chọn trả về 503. Hãy phân nhánh dựa trên trường code.
Tôi có nên thử lại lỗi model_not_found không?
Không. Việc lặp lại cùng một yêu cầu sẽ không thay đổi kết quả. Kiểm tra did_you_mean và suggestions nếu có, nhưng chỉ chuyển đổi mô hình khi sản phẩm của bạn đã có quyền thay đổi. Nếu không, hãy sử dụng phương án dự phòng đã được phê duyệt trước và cảnh báo cho nhóm của bạn.
TokenLab có chuyển yêu cầu của tôi sang mô hình khác nếu mô hình của tôi biến mất không?
Tài liệu nói rằng nó không tự động thay thế mô hình mà bạn gửi. Hãy gửi một ID rõ ràng và tự xử lý lỗi. Phương án dự phòng của bạn phải là một giá trị cấu hình đã được kiểm thử, không phải là một giả định về nền tảng.
So sánh các ID, giới hạn và giá cả hiện tại trong danh mục mô hình trước khi thay đổi mô hình tiếp theo của bạn.
Nguồn
Giá quan sát ngày 2026-10-03
- TokenLab Docs: List ModelsQuan sát ngày 2026-10-03
- TokenLab Docs: Get a ModelQuan sát ngày 2026-10-03
- TokenLab Docs: Build a reliable TokenLab integrationQuan sát ngày 2026-10-03
- TokenLab Docs: Handle API errorsQuan sát ngày 2026-10-03
- TokenLab Docs: Errors agents can act onQuan sát ngày 2026-10-03
- TokenLab Docs: Migration GuidesQuan sát ngày 2026-10-03
- TokenLab live model API: claude-sonnet-5Quan sát ngày 2026-10-03
- TokenLab live model API: deepseek-v4-proQuan sát ngày 2026-10-03



