Chuyển code OpenAI hiện có sang một AI API gateway trong 10 phút: đổi base_url, giữ nguyên logic
Nếu dự án của bạn đã dùng OpenAI SDK, rất có thể bạn đang gặp tình huống quen thuộc: phần chat chạy ổn, nhưng khi team muốn thêm tạo ảnh, tạo video hoặc thử một model khác, mỗi thứ lại kéo theo một nhà cung cấp mới, một SDK mới, một API key mới và thêm một hóa đơn nữa.
Trong bài này mình ghi lại cách mình chuyển một service Python đang dùng OpenAI SDK sang ToAPIs – một AI API gateway tương thích OpenAI, hỗ trợ các model văn bản, hình ảnh, video và âm thanh với một API key và thanh toán hợp nhất. Mục tiêu là thay đổi càng ít code càng tốt.
Bước 1: Xác định những chỗ khởi tạo client
Trong đa số project, client OpenAI được tạo ở một vài chỗ, thường là kiểu này:
from openai import OpenAI
client = OpenAI() # đọc OPENAI_API_KEY từ môi trường
Việc đầu tiên là gom việc khởi tạo về một module duy nhất. Nếu project của bạn đang tạo client rải rác ở nhiều file, hãy refactor trước – việc này có lợi kể cả khi bạn không đổi nhà cung cấp.
Bước 2: Trỏ client sang gateway
# ai_client.py
import os
from openai import OpenAI
BASE_URL = os.getenv("AI_BASE_URL", "https://toapis.com/v1")
client = OpenAI(
api_key=os.environ["TOAPIS_API_KEY"],
base_url=BASE_URL,
)
Lưu ý: người dùng ở Trung Quốc đại lục được hướng dẫn dùng tên miền toapis.cn. Vì BASE_URL được đọc từ biến môi trường, bạn có thể đổi giữa các môi trường mà không sửa code.
API key lấy sau khi đăng ký tại trang ToAPIs. Đặt nó vào biến môi trường:
export TOAPIS_API_KEY="key_cua_ban"
Bước 3: Đổi tên model, giữ nguyên lời gọi
Đoạn gọi chat completions gần như không đổi, chỉ cần dùng tên model có trên gateway:
from ai_client import client
def summarize(text: str) -> str:
resp = client.chat.completions.create(
model="gpt-5.6-terra",
messages=[
{"role": "system", "content": "Tóm tắt ngắn gọn bằng tiếng Việt."},
{"role": "user", "content": text},
],
)
return resp.choices[0].message.content
print(summarize("Viblo là cộng đồng chia sẻ kiến thức công nghệ..."))
Mẹo nhỏ: đừng hardcode tên model trong hàm. Đưa nó ra cấu hình:
import os
MODELS = {
"text": os.getenv("TEXT_MODEL", "gpt-5.6-terra"),
"image": os.getenv("IMAGE_MODEL", "gpt-image-2"),
"video": os.getenv("VIDEO_MODEL", "seedance-2"),
}
Khi muốn thử model khác, bạn chỉ cần đổi biến môi trường, xem trước kết quả trong Playground và tra danh sách model của ToAPIs.
Bước 4: Thêm tạo ảnh mà không cần SDK mới
Đây là lúc lợi ích thấy rõ nhất. Cùng một client, cùng một key:
from ai_client import client
result = client.images.generate(
model="gpt-image-2",
prompt="Ảnh minh họa phong cách flat: lập trình viên làm việc bên ly cà phê sữa đá",
)
first = result.data[0]
print(first.url or (first.b64_json or "")[:80])
Tùy model và tham số, dữ liệu trả về có thể là URL hoặc base64 – hãy kiểm tra tài liệu để xử lý đúng.
Bước 5: Video – gọi HTTP trực tiếp
Endpoint video là /v1/videos/generations. Vì đây thường là tác vụ chạy lâu, mình gọi bằng requests và in toàn bộ phản hồi ra trước:
import os
import requests
r = requests.post(
"https://toapis.com/v1/videos/generations",
headers={"Authorization": f"Bearer {os.environ['TOAPIS_API_KEY']}"},
json={"model": "seedance-2", "prompt": "Phố cổ Hội An về đêm, đèn lồng lung linh, máy quay lia chậm"},
timeout=60,
)
r.raise_for_status()
print(r.json())
Định dạng phản hồi và cách polling trạng thái tác vụ được mô tả trong tài liệu chính thức; mình khuyên đọc kỹ trước khi viết logic chờ kết quả, thay vì đoán tên field.
Checklist sau khi chuyển
- [ ] Tất cả client được tạo từ một module
- [ ]
TOAPIS_API_KEYnằm trong secret manager, không nằm trong repo - [ ] Tên model nằm trong cấu hình
- [ ] Có log request/response (ẩn dữ liệu nhạy cảm) để tự đối soát
- [ ] Đã chạy lại test tích hợp cho các luồng chat cũ
Kết luận
Với code đã viết theo OpenAI SDK, việc chuyển sang một gateway tương thích OpenAI chủ yếu là đổi base_url, đổi API key và rà lại tên model. Đổi lại, bạn có một chỗ quản lý key và một hóa đơn cho cả văn bản, hình ảnh, video và âm thanh.
Tài liệu đầy đủ: https://docs.toapis.com
All rights reserved