Usa il Vercel AI SDK con UberLLM (modelli più economici, stesso codice)
Installa @ai-sdk/openai-compatible, crea un provider con baseURL https://api.uberllm.dev/v1 e la tua chiave UberLLM, e passa uberllm("<model id>") ovunque la tua app passi un modello oggi. Nient'altro nell'app cambia.
Passaggi
- Crea una chiave sulla tua pagina delle chiavi e aggiungi un po' di credito (gli account partono da $0).
- Installa il provider:
npm i ai @ai-sdk/openai-compatible
- Inserisci la chiave in
.env.local(Next.js) o nell'ambiente del tuo server:
UBERLLM_API_KEY=ull_your_key
- Crea il provider una volta, ad esempio in
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
});
- Usalo dove usavi un modello prima:
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.",
});
Spostare un'app che usa già @ai-sdk/openai
Scambia l'argomento del modello e mantieni tutto il resto:
// 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");
Gli ID dei modelli sono gli ID su uberllm.dev/models e hanno sempre un produttore davanti (openai/…, anthropic/…, deepseek/…). È così che puoi eseguire GPT, Claude, Gemini e modelli aperti da una singola chiave e confrontarli cambiando una stringa.
Una route di chat Next.js per useChat
Il useChat da @ai-sdk/react invia richieste POST a /api/chat per impostazione predefinita. Questa route risponde a tali richieste:
// 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();
}
Mantieni la chiave sul server. Non metterla mai in una variabile NEXT_PUBLIC_: chiunque potrebbe leggerla dalla pagina e spendere il tuo saldo.
Fissa un tetto al costo di una singola chiamata
Le richieste di chat accettano provider.max_price (dollari per milione di token). Passalo tramite providerOptions sotto il provider name che hai scelto:
await generateText({
model: uberllm("deepseek/deepseek-v4.1-flash"),
prompt: "Hi",
providerOptions: { uberllm: { provider: { max_price: { prompt: 0.2, completion: 0.4 } } } },
});
Se nessuno vende il modello sotto quel prezzo in questo momento, la chiamata viene rifiutata con max_price_exceeded e nulla viene addebitato.
Risoluzione dei problemi
- 401
invalid_api_key: la chiave non ha raggiunto il server. Riavvianext devdopo aver modificato.env.locale verifica cheprocess.env.UBERLLM_API_KEYsia impostato dove il codice viene eseguito (server, non il browser). - 402
insufficient_credits: aggiungi credito sulla pagina dei crediti. - 404
model_not_found: l'id è sbagliato o manca il suo creatore. Copialo dalla pagina del modello. - 400
wrong_endpoint: hai passato un modello di immagine o video astreamText. I modelli di immagine passano attraversouberllm.imageModel(…)congenerateImage; il video è un lavoro, vedi Crea un video o un'immagine. - L'utilizzo è vuoto sugli stream: imposta
includeUsage: truesul provider, come sopra.
Continua a leggere
- La documentazione completa con chiamate a strumenti e immagini: Documentazione Vercel AI SDK
- Endpoint compatibile con OpenAI spiegato
- Prezzi LLM in tempo reale