Guide agli SDK
Vercel AI SDK
Usa api14 come provider compatibile con OpenAI nel Vercel AI SDK, con esempi per generateText, streamText, strumenti, output strutturato ed embeddings.
Il Vercel AI SDK comunica con api14 tramite il suo provider compatibile con OpenAI. Ogni id di modello diventa un modello che puoi passare a generateText, streamText, generateObject o embed.
Installazione
npm install ai @ai-sdk/openai-compatible zod
export API14_API_KEY="sk-api14-..."
Configurazione
import { createOpenAICompatible } from "@ai-sdk/openai-compatible";
export const api14 = createOpenAICompatible({
name: "api14",
baseURL: "https://api14.com/api/v1",
apiKey: process.env.API14_API_KEY,
includeUsage: true,
});
Funziona anche @ai-sdk/openai: createOpenAI({ baseURL: "https://api14.com/api/v1", apiKey }), poi usa openai.chat("anthropic/claude-sonnet-4.5") in modo che le richieste vadano a /chat/completions.
Generare testo
import { generateText } from "ai";
const { text, usage } = await generateText({
model: api14("anthropic/claude-sonnet-4.5"),
prompt: "Explain vector databases in two sentences.",
});
console.log(text, usage);
Streaming
import { streamText } from "ai";
const result = streamText({
model: api14("openai/gpt-5-mini"),
prompt: "Write a haiku about APIs.",
});
for await (const delta of result.textStream) process.stdout.write(delta);
In un route handler di Next.js, restituisci direttamente lo stream:
// app/api/chat/route.ts
import { convertToModelMessages, streamText, type UIMessage } from "ai";
export async function POST(req: Request) {
const { messages }: { messages: UIMessage[] } = await req.json();
const result = streamText({ model: api14("openai/gpt-5-mini"), messages: convertToModelMessages(messages) });
return result.toUIMessageStreamResponse();
}
Strumenti e output strutturato
import { generateObject, generateText, tool } from "ai";
import { z } from "zod";
const { text } = await generateText({
model: api14("openai/gpt-5-mini"),
prompt: "What is the weather in Istanbul?",
tools: {
getWeather: tool({
description: "Get the current weather",
inputSchema: z.object({ city: z.string() }),
execute: async ({ city }) => ({ city, tempC: 21 }),
}),
},
});
const { object } = await generateObject({
model: api14("openai/gpt-5-mini"),
schema: z.object({ city: z.string(), country: z.string() }),
prompt: 'Extract the place from: "I live in Lisbon, Portugal."',
});
Embeddings
import { embedMany } from "ai";
const { embeddings } = await embedMany({
model: api14.textEmbeddingModel("openai/text-embedding-3-small"),
values: ["The quick brown fox", "Lorem ipsum"],
});
Errori
import { APICallError } from "ai";
try {
await generateText({ model: api14("openai/gpt-5-mini"), prompt: "Hi" });
} catch (e) {
if (APICallError.isInstance(e) && e.statusCode === 402) console.error("Balance too low, add funds");
else if (APICallError.isInstance(e) && e.statusCode === 429) console.error("Retry after", e.responseHeaders?.["retry-after"]);
else throw e;
}
L'SDK ripete due volte per impostazione predefinita le richieste con 429 e 5xx (maxRetries su ogni chiamata). Vedi Errori.