Sử dụng Vercel AI SDK với UberLLM (mô hình rẻ hơn, cùng mã)
Cài đặt @ai-sdk/openai-compatible, tạo một provider với baseURL https://api.uberllm.dev/v1 và khóa UberLLM của bạn, và truyền uberllm("<model id>") vào bất cứ đâu ứng dụng của bạn đang truyền một model. Không có gì khác trong ứng dụng thay đổi.
Các bước
- Tạo một khóa trên trang khóa của bạn và nạp một ít tín dụng (tài khoản bắt đầu từ $0).
- Cài đặt nhà cung cấp:
npm i ai @ai-sdk/openai-compatible
- Đặt khóa vào
.env.local(Next.js) hoặc môi trường máy chủ của bạn:
UBERLLM_API_KEY=ull_your_key
- Tạo nhà cung cấp một lần, ví dụ trong
lib/uberllm.ts:
import { createOpenAICompatible } from "@ai-sdk/openai-compatible";
export const uberllm = createOpenAICompatible({
name: "uberllm",
baseURL: "https://api.uberllm.dev/v1",
apiKey: process.env.UBERLLM_API_KEY, // sent as Authorization: Bearer <key>
includeUsage: true, // token counts on streamed answers too
});
- Sử dụng nó ở nơi bạn đã sử dụng một mô hình trước đây:
import { generateText } from "ai";
import { uberllm } from "@/lib/uberllm";
const { text } = await generateText({
model: uberllm("deepseek/deepseek-v4.1-flash"),
prompt: "Write a one-line welcome message.",
});
Di chuyển một ứng dụng đã sử dụng @ai-sdk/openai
Đổi đối số model và giữ nguyên mọi thứ khác:
// before
import { openai } from "@ai-sdk/openai";
const model = openai("gpt-4o");
// after
import { uberllm } from "@/lib/uberllm";
const model = uberllm("deepseek/deepseek-v4.1-flash");
ID model là các ID trên uberllm.dev/models và luôn có tên nhà cung cấp ở phía trước (openai/…, anthropic/…, deepseek/…). Đó là cách bạn có thể chạy GPT, Claude, Gemini và các model mở từ một khóa và so sánh chúng bằng cách thay đổi một chuỗi.
Một route chat Next.js dành cho useChat
useChat từ @ai-sdk/react gửi đến /api/chat theo mặc định. Route này sẽ trả lời nó:
// app/api/chat/route.ts
import { streamText, convertToModelMessages, type UIMessage } from "ai";
import { uberllm } from "@/lib/uberllm";
export async function POST(req: Request) {
const { messages }: { messages: UIMessage[] } = await req.json();
const result = streamText({
model: uberllm("deepseek/deepseek-v4.1-flash"),
messages: await convertToModelMessages(messages),
});
return result.toUIMessageStreamResponse();
}
Giữ key trên server. Đừng bao giờ đặt nó vào biến NEXT_PUBLIC_: bất kỳ ai cũng có thể đọc nó từ trang và tiêu tốn số dư của bạn.
Giới hạn chi phí một cuộc gọi
Yêu cầu trò chuyện chấp nhận provider.max_price (đô la cho mỗi triệu token). Truyền nó qua providerOptions với nhà cung cấp name bạn đã chọn:
await generateText({
model: uberllm("deepseek/deepseek-v4.1-flash"),
prompt: "Hi",
providerOptions: { uberllm: { provider: { max_price: { prompt: 0.2, completion: 0.4 } } } },
});
Nếu hiện tại không ai bán mô hình dưới mức giá đó, cuộc gọi sẽ bị từ chối với max_price_exceeded và không có phí nào được tính.
Khắc phục sự cố
- 401
invalid_api_key: khóa không đến được máy chủ. Khởi động lạinext devsau khi chỉnh sửa.env.local, và kiểm traprocess.env.UBERLLM_API_KEYđã được đặt ở nơi mã chạy (máy chủ, không phải trình duyệt). - 402
insufficient_credits: thêm tín dụng trên trang tín dụng. - 404
model_not_found: id sai hoặc thiếu nhà sản xuất. Sao chép nó từ trang của mô hình. - 400
wrong_endpoint: bạn đã truyền một mô hình hình ảnh hoặc video chostreamText. Các mô hình hình ảnh đi quauberllm.imageModel(…)vớigenerateImage; video là một công việc, xem Tạo video hoặc hình ảnh. - Mức sử dụng trống trên các luồng: đặt
includeUsage: truetrên nhà cung cấp, như trên.
Đọc thêm
- Tài liệu tham khảo đầy đủ với các lệnh gọi công cụ và hình ảnh: Tài liệu Vercel AI SDK
- Giải thích về endpoint tương thích với OpenAI
- Giá LLM trực tiếp