Utilisez le Vercel AI SDK avec UberLLM (modèles moins chers, même code)
Installez @ai-sdk/openai-compatible, créez un fournisseur avec l'URL de base https://api.uberllm.dev/v1 et votre clé UberLLM, et passez uberllm("<model id>") partout où votre application passe un modèle aujourd'hui. Rien d'autre ne change dans l'application.
Étapes
- Créez une clé sur votre page de clés et ajoutez un peu de crédit (les comptes commencent à $0).
- Installez le fournisseur :
npm i ai @ai-sdk/openai-compatible
- Mettez la clé dans
.env.local(Next.js) ou l'environnement de votre serveur :
UBERLLM_API_KEY=ull_your_key
- Créez le fournisseur une fois, par exemple dans
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
});
- Utilisez-le là où vous utilisiez un modèle avant :
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.",
});
Migrer une application qui utilise déjà @ai-sdk/openai
Remplacez l'argument du modèle et gardez tout le reste :
// 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");
Les identifiants de modèle sont les identifiants sur uberllm.dev/models et ont toujours un fabricant devant (openai/…, anthropic/…, deepseek/…). C'est ainsi que vous pouvez exécuter GPT, Claude, Gemini et des modèles ouverts à partir d'une seule clé et les comparer en changeant une seule chaîne de caractères.
Une route de chat Next.js pour useChat
useChat depuis @ai-sdk/react envoie des requêtes à /api/chat par défaut. Cette route y répond :
// 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();
}
Gardez la clé sur le serveur. Ne la mettez jamais dans une variable NEXT_PUBLIC_ : n'importe qui pourrait la lire depuis la page et dépenser votre solde.
Plafonnez le coût d'un appel
Les requêtes de chat acceptent provider.max_price (dollars par million de tokens). Passez-le via providerOptions sous le fournisseur name que vous avez choisi :
await generateText({
model: uberllm("deepseek/deepseek-v4.1-flash"),
prompt: "Hi",
providerOptions: { uberllm: { provider: { max_price: { prompt: 0.2, completion: 0.4 } } } },
});
Si personne ne vend le modèle à ce prix actuellement, l'appel est refusé avec max_price_exceeded et rien n'est facturé.
Dépannage
- 401
invalid_api_key: la clé n'a pas atteint le serveur. Redémarreznext devaprès avoir modifié.env.local, et vérifiez queprocess.env.UBERLLM_API_KEYest défini là où le code s'exécute (serveur, pas le navigateur). - 402
insufficient_credits: ajoutez du crédit sur la page des crédits. - 404
model_not_found: l'ID est incorrect ou il manque son créateur. Copiez-le depuis la page du modèle. - 400
wrong_endpoint: vous avez passé un modèle d'image ou de vidéo àstreamText. Les modèles d'image passent paruberllm.imageModel(…)avecgenerateImage; la vidéo est un job, voir Créer une vidéo ou une image. - L'utilisation est vide en streaming : définissez
includeUsage: truesur le fournisseur, comme ci-dessus.
Continuez la lecture
- La référence complète avec les appels d'outils et les images : Documentation Vercel AI SDK
- Endpoint compatible OpenAI expliqué
- Prix des LLM en direct