Việc chuyển đổi từ API chính thức của OpenAI sang LemonData chỉ mất hai dòng thay đổi. Mã nguồn, prompt và tên model hiện tại của bạn đều hoạt động bình thường. Bạn cũng có quyền truy cập vào hơn 300 model từ OpenAI, Anthropic, Google, DeepSeek và nhiều hơn nữa, thông qua cùng một API key.
Nếu bạn đang so sánh các lựa chọn gateway trước khi di chuyển, hãy đọc so sánh giá và so sánh OpenRouter vs LemonData. Nếu đội ngũ của bạn cần một quy trình cụ thể theo khu vực, hướng dẫn cho nhà phát triển tại Trung Quốc sẽ đề cập đến khía cạnh thanh toán và vận hành.
Phiên bản tóm tắt
- Đăng ký tại lemondata.cc và lấy một API key (bạn sẽ nhận được 1$ credit miễn phí)
- Thay thế
base_urlvàapi_keycủa bạn - Xong. Mọi thứ khác giữ nguyên.
Python (OpenAI SDK)
# Trước đây: OpenAI chính thức
from openai import OpenAI
client = OpenAI(api_key="sk-openai-xxx")
# Sau khi đổi: LemonData (thay đổi 2 dòng)
from openai import OpenAI
client = OpenAI(
api_key="sk-lemon-xxx",
base_url="https://api.lemondata.cc/v1"
)
# Mọi thứ khác giữ nguyên
response = client.chat.completions.create(
model="gpt-4.1",
messages=[{"role": "user", "content": "Hello!"}]
)
print(response.choices[0].message.content)
Streaming, function calling, vision: tất cả đều hoạt động giống hệt nhau. OpenAI Python SDK sẽ gửi yêu cầu đến bất kỳ base_url nào mà bạn chỉ định.
Node.js (OpenAI SDK)
// Trước đây: OpenAI chính thức
import OpenAI from 'openai';
const openai = new OpenAI({ apiKey: 'sk-openai-xxx' });
// Sau khi đổi: LemonData (thay đổi 2 dòng)
import OpenAI from 'openai';
const openai = new OpenAI({
apiKey: 'sk-lemon-xxx',
baseURL: 'https://api.lemondata.cc/v1',
});
// Mọi thứ khác giữ nguyên
const completion = await openai.chat.completions.create({
model: 'gpt-4.1',
messages: [{ role: 'user', content: 'Hello!' }],
});
console.log(completion.choices[0].message.content);
Lưu ý: trong Node.js SDK là baseURL (camelCase), không phải base_url.
curl
# Trước đây: OpenAI chính thức
curl https://api.openai.com/v1/chat/completions \
-H "Authorization: Bearer sk-openai-xxx" \
-H "Content-Type: application/json" \
-d '{"model":"gpt-4.1","messages":[{"role":"user","content":"Hello"}]}'
# Sau khi đổi: LemonData (thay đổi URL và key)
curl https://api.lemondata.cc/v1/chat/completions \
-H "Authorization: Bearer sk-lemon-xxx" \
-H "Content-Type: application/json" \
-d '{"model":"gpt-4.1","messages":[{"role":"user","content":"Hello"}]}'
Cùng đường dẫn endpoint, cùng thân yêu cầu (request body), cùng định dạng phản hồi (response format).
Cách tiếp cận bằng biến môi trường (Environment Variable)
Nếu mã nguồn của bạn đọc từ các biến môi trường (điều mà bạn nên làm), bạn thậm chí không cần chạm vào code:
# Trước đây
export OPENAI_API_KEY="sk-openai-xxx"
export OPENAI_BASE_URL="https://api.openai.com/v1"
# Sau khi đổi
export OPENAI_API_KEY="sk-lemon-xxx"
export OPENAI_BASE_URL="https://api.lemondata.cc/v1"
OpenAI SDK tự động đọc OPENAI_API_KEY và OPENAI_BASE_URL từ môi trường. Không cần thay đổi code.
Những gì bạn nhận được sau khi di chuyển
Khi đã sử dụng LemonData, bạn vẫn giữ được khả năng tương thích hoàn toàn với OpenAI và có thêm các khả năng bổ sung:
Hơn 300 Model, Một API Key
Mã nguồn OpenAI hiện tại của bạn giờ đây có thể hoạt động với Claude, Gemini, DeepSeek, Mistral và hàng trăm model khác. Trong nhiều trường hợp, điều duy nhất bạn cần thay đổi là tham số model:
# GPT-4.1 (OpenAI): $2.00/$8.00 trên 1M tokens
response = client.chat.completions.create(model="gpt-4.1", messages=messages)
# Claude Sonnet 4.6 (Anthropic): $3.00/$15.00 trên 1M tokens
response = client.chat.completions.create(model="claude-sonnet-4-6", messages=messages)
# Gemini 2.5 Pro (Google)
response = client.chat.completions.create(model="gemini-2.5-pro", messages=messages)
# DeepSeek V3: $0.28/$0.42 trên 1M tokens (sử dụng "deepseek-chat" hoặc alias "deepseek-v3")
response = client.chat.completions.create(model="deepseek-chat", messages=messages)
Khả năng dự phòng đa kênh có nghĩa là nếu một nhà cung cấp thượng nguồn gặp sự cố, gateway sẽ tự động chuyển hướng đến một kênh thay thế. Không cần thay đổi mã nguồn.
Truy cập giao thức gốc (Tùy chọn)
Nếu bạn muốn sử dụng các model Anthropic hoặc Google với đầy đủ khả năng gốc của chúng (extended thinking, prompt caching với cache_control, Google search grounding), LemonData hỗ trợ các giao thức gốc của họ thông qua cùng một base URL:
# Anthropic native: sử dụng Anthropic SDK
# Extended thinking, cache_control, Citations đều hoạt động nguyên bản
from anthropic import Anthropic
client = Anthropic(
api_key="sk-lemon-xxx",
base_url="https://api.lemondata.cc" # Không có /v1. Anthropic SDK tự thêm /v1/messages.
)
# Google Gemini native: sử dụng Google SDK
# Search grounding, grounding_metadata đều hoạt động nguyên bản
from google import genai
client = genai.Client(
api_key="sk-lemon-xxx",
http_options={"base_url": "https://api.lemondata.cc"} # Không có hậu tố đường dẫn. SDK tự thêm /v1beta/models/...
)
Điều này là hoàn toàn tùy chọn. Endpoint tương thích với OpenAI hoạt động cho tất cả các model. Nhưng nếu bạn cần extended thinking của Anthropic hoặc grounding của Google, việc truy cập giao thức gốc sẽ cung cấp cho bạn các tính năng đó mà không bị mất mát do chuyển đổi định dạng.
Những gì thường thay đổi trong quá trình di chuyển
Hầu hết các cuộc di chuyển đều đơn giản về mặt kỹ thuật nhưng lại sơ sài về mặt vận hành. Các đội ngũ thường thay đổi base URL và key, sau đó giả định mọi thứ khác đều giống hệt nhau. Điều đó thường đúng với cấu trúc yêu cầu (request schema), nhưng không phải lúc nào cũng đúng với mọi thứ xung quanh nó.
Các khu vực đáng để kiểm tra trước khi bạn chuyển đổi lưu lượng truy cập là:
- Cài đặt timeout trong SDK hoặc HTTP client của bạn
- Danh sách model được phép (allowlists) trong cấu hình ứng dụng
- Bảng điều khiển chi phí giả định chỉ có một nhà cung cấp duy nhất
- Logic thử lại (retry logic) đã được tinh chỉnh cho một nhà cung cấp cụ thể
- Bất kỳ giả định cứng nào về header phản hồi hoặc giới hạn tốc độ (rate limits)
Nếu bạn kiểm tra năm khu vực này trước khi chuyển đổi lưu lượng thực tế, việc di chuyển thường sẽ diễn ra suôn sẻ.
Danh sách kiểm tra di chuyển
Sử dụng danh sách kiểm tra này nếu bạn muốn việc di chuyển diễn ra ổn định:
- Tạo một LemonData API key.
- Thay đổi
base_urlhoặcbaseURL. - Chạy một bài kiểm tra nhanh (smoke test) với
/v1/models. - Kiểm tra một chat completion, một phản hồi dạng stream và một trường hợp lỗi.
- Xác nhận nhật ký (logs) của bạn vẫn ghi lại được request ID và tên model.
- Kiểm tra hóa đơn sau vài lần gọi đầu tiên để đảm bảo các giả định về chi phí của bạn vẫn đúng.
- Chỉ sau đó mới di chuyển các tác vụ chạy ngầm và lưu lượng thực tế.
Các lỗi thường gặp
Lỗi 1: Cố định danh sách model cũ
Một số đội ngũ xác thực model ID dựa trên một danh sách tĩnh trong cấu hình ứng dụng. Nếu bạn giữ danh sách đó, gateway vẫn hoạt động nhưng chính ứng dụng của bạn sẽ từ chối các tên model hợp lệ trước khi yêu cầu được gửi đi.
Lỗi 2: Coi việc di chuyển chỉ là hoán đổi nhà cung cấp
Lợi ích thực sự không chỉ là rời bỏ OpenAI. Lợi ích thực sự là chuyển từ kiến trúc một nhà cung cấp sang mô hình gateway, nơi bạn có thể thêm Claude, Gemini, DeepSeek và các model khác mà không cần thay đổi lại phần còn lại của ứng dụng.
Lỗi 3: Bỏ qua các bài kiểm tra trường hợp lỗi
Một kết quả thành công (happy-path) chứng minh API key hoạt động. Nó không chứng minh logic thử lại, phân tích lỗi hoặc khả năng quan sát (observability) của bạn vẫn hợp lý sau khi chuyển đổi.
Nếu bạn đang triển khai một ứng dụng hướng tới người dùng thay vì chỉ là một script, hai hướng dẫn triển khai tiếp theo nên đọc là hướng dẫn tạo chatbot với một key và hướng dẫn về giới hạn tốc độ (rate limiting).
Di chuyển các tích hợp phổ biến
Cursor
Settings → Models → OpenAI API Key:
- API Key:
sk-lemon-xxx - Base URL:
https://api.lemondata.cc/v1
LangChain
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(
model="gpt-4.1",
api_key="sk-lemon-xxx",
base_url="https://api.lemondata.cc/v1"
)
Vercel AI SDK
import { createOpenAI } from '@ai-sdk/openai';
const lemondata = createOpenAI({
apiKey: 'sk-lemon-xxx',
baseURL: 'https://api.lemondata.cc/v1',
});
const result = await generateText({
model: lemondata('gpt-4.1'),
prompt: 'Hello!',
});
LiteLLM
import litellm
response = litellm.completion(
model="openai/gpt-4.1",
messages=[{"role": "user", "content": "Hello!"}],
api_key="sk-lemon-xxx",
api_base="https://api.lemondata.cc/v1"
)
Xác minh việc di chuyển của bạn
Kiểm tra nhanh sau khi chuyển đổi:
curl https://api.lemondata.cc/v1/models \
-H "Authorization: Bearer sk-lemon-xxx" | head -c 200
Nếu bạn thấy phản hồi JSON với các đối tượng model, bạn đã thành công.
FAQ
Các prompt hiện tại của tôi có hoạt động không? Có. LemonData hoàn toàn tương thích với OpenAI, vì vậy định dạng yêu cầu và phản hồi vẫn giữ nguyên.
Tôi có cần thay đổi tên model không? Không. gpt-4.1, gpt-4o, và gpt-4.1-mini đều hoạt động như mong đợi. LemonData cũng có hệ thống phân giải model ba lớp: khớp chính xác, tra cứu bí danh (alias) và sửa lỗi mờ (fuzzy correction). Điều đó có nghĩa là ngay cả các tên đã lỗi thời như gpt-4-turbo hoặc lỗi đánh máy như gpt4o thường vẫn được phân giải chính xác.
Còn streaming thì sao? Hoạt động giống hệt nhau. Định dạng SSE, cấu trúc chunk tương tự. Đối với các giao thức Anthropic/Gemini gốc, bạn sẽ nhận được định dạng SSE gốc của từng nhà cung cấp (bao gồm cả thinking deltas cho extended thinking).
Còn function calling / tools? Được hỗ trợ đầy đủ. Cùng schema, cùng hành vi.
Còn việc xử lý lỗi? LemonData trả về các lỗi tương thích với OpenAI cùng với các trường bổ sung thân thiện với agent như retryable, did_you_mean, suggestions, và retry_after. Việc xử lý lỗi tiêu chuẩn của OpenAI SDK vẫn hoạt động vì các trường này là phần bổ sung.
Tôi có thể chuyển đổi ngược lại không? Có. Chỉ cần đổi lại hai dòng code. Không có định dạng độc quyền và không có dữ liệu nào cần di chuyển ngược lại.
Bắt đầu tại đây: lemondata.cc/r/devto-migration
Tài liệu API đầy đủ: docs.lemondata.cc
Hướng dẫn bắt đầu nhanh: docs.lemondata.cc/quickstart
