Używamy plików cookie. Pliki cookie i pamięć przeglądarki pozwalają utrzymać logowanie i zapamiętać Twoje preferencje. Za Twoją zgodą mierzymy też, jak korzystasz ze strony. W każdej chwili możesz . Zobacz naszą politykę cookie.

Vercel AI SDK

Przewodniki SDK

Vercel AI SDK

Użyj api14 jako dostawcy zgodnego z OpenAI w Vercel AI SDK: konfiguracja, generowanie tekstu, streaming, narzędzia i embeddingi.

Vercel AI SDK łączy się z api14 przez swojego dostawcę zgodnego z OpenAI. Każdy identyfikator modelu staje się modelem, który możesz przekazać do generateText, streamText, generateObject lub embed.

Instalacja

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

Konfiguracja

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 również działa: createOpenAI({ baseURL: "https://api14.com/api/v1", apiKey }), a następnie użyj openai.chat("anthropic/claude-sonnet-4.5"), aby żądania trafiały do /chat/completions.

Generowanie tekstu

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

W route handlerze Next.js zwróć strumień bezpośrednio:

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

Narzędzia i ustrukturyzowane wyjście

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

Embeddingi

import { embedMany } from "ai";

const { embeddings } = await embedMany({
  model: api14.textEmbeddingModel("openai/text-embedding-3-small"),
  values: ["The quick brown fox", "Lorem ipsum"],
});

Błędy

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

SDK domyślnie ponawia 429 i 5xx dwukrotnie (maxRetries w każdym wywołaniu). Zobacz Błędy.