Usamos cookies. Las cookies y el almacenamiento del navegador mantienen tu sesión iniciada y recuerdan tus preferencias. Con tu permiso, también medimos cómo se usa el sitio. Puedes en cualquier momento. Consulta nuestra política de cookies.

Vercel AI SDK

Guías de SDK

Vercel AI SDK

Usa api14 como proveedor compatible con OpenAI en el Vercel AI SDK con generateText, streamText, generateObject, herramientas y embeddings.

El Vercel AI SDK se comunica con api14 mediante su proveedor compatible con OpenAI. Cada id de modelo se convierte en un modelo que puedes pasar a generateText, streamText, generateObject o embed.

Instalación

npm install ai @ai-sdk/openai-compatible zod
export API14_API_KEY="sk-api14-..."

Configuración

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,
});

@ai-sdk/openai también funciona: createOpenAI({ baseURL: "https://api14.com/api/v1", apiKey }), y luego usa openai.chat("anthropic/claude-sonnet-4.5") para que las peticiones vayan a /chat/completions.

Generar texto

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);

En un route handler de Next.js, devuelve el stream directamente:

// 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();
}

Herramientas y salida estructurada

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"],
});

Errores

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;
}

El SDK reintenta dos veces por defecto los errores 429 y 5xx (maxRetries en cada llamada). Consulta Errores.