Vercel AI SDK
Apelezi codai din Vercel AI SDK 7 prin provider-ul OpenAI-compatibil, cu streaming, tool-uri și chitanța de cost.
AI SDK ajunge la codai prin @ai-sdk/openai-compatible: base URL https://ai.codai.ro/v1, cheia ta codai_… și modelul codai. Este exact configurația pe care asistentul Ask-the-docs de pe acest site o rulează în producție.
Înainte să începi
- O cheie codai din hub.codai.ro → Keys → Create key (detalii în quickstart), salvată ca
CODAI_API_KEY. - AI SDK 7 (
ai) și provider-ul OpenAI-compatibil. SDK-ul se distribuie doar ca ESM.
pnpm add ai @ai-sdk/openai-compatibleCreezi provider-ul
import { createOpenAICompatible } from '@ai-sdk/openai-compatible';
export const codai = createOpenAICompatible({
name: 'codai',
baseURL: 'https://ai.codai.ro/v1',
apiKey: process.env.CODAI_API_KEY,
// Header-e codai opționale — vezi pagina despre header-ele cererii.
headers: { 'X-Codai-Effort': 'medium' },
includeUsage: true,
});includeUsage: truecere chunk-ul final de usage pe stream-uri, ca numărul de tokeni să ajungă înonEnd/usage.- Folosești
codai.chatModel('codai'). Gateway-ul vorbește nativ Chat Completions;codaie modelul implicit, celelalte alias-uri sunt în modele.
Generezi text
import { generateText } from 'ai';
import { codai } from './lib/codai';
const result = await generateText({
model: codai.chatModel('codai'),
instructions: 'You are a terse senior engineer.',
prompt: 'Explain Promise.all in three sentences.',
});
console.log(result.text);
console.log(result.usage);
// Ce model a servit efectiv apelul și cât a costat (micro-USD), când se știe înaintea primului byte:
console.log(result.response.headers?.['x-codai-routed-to']);
console.log(result.response.headers?.['x-codai-cost-micro-usd']);AI SDK 7 folosește instructions pentru promptul de sistem (a înlocuit system).
Streaming, cu tool-uri
import { createTextStreamResponse, isStepCount, streamText, toTextStream, tool } from 'ai';
import { z } from 'zod';
import { codai } from '@/lib/codai';
export async function POST(req: Request) {
const { prompt } = (await req.json()) as { prompt: string };
const result = streamText({
model: codai.chatModel('codai'),
prompt,
stopWhen: isStepCount(3),
tools: {
weather: tool({
description: 'Current temperature for a city.',
inputSchema: z.object({ city: z.string() }),
execute: async ({ city }) => ({ city, celsius: 18 }),
}),
},
});
return createTextStreamResponse({ stream: toTextStream({ stream: result.stream }) });
}În AI SDK 7 helper-ele de stream sunt exporturi stateless de nivel superior; result.toTextStreamResponse() încă merge, dar e marcat deprecated. Tool-urile de tip funcție pleacă drept tools OpenAI și se întorc drept tool_calls; SDK-ul le execută și continuă bucla. Pe stream-uri costul nu se știe la momentul header-elor: gateway-ul trimite x-codai-cost-estimate: pending, iar cifra exactă e în GET /v1/receipt.
Depanare
404— base URL-ul nu are/v1. Trebuie să fie exacthttps://ai.codai.ro/v1.401 invalid_api_key—CODAI_API_KEYnu e setată acolo unde rulează codul (mediul serverului, nu browserul).- Usage gol pe stream-uri — adaugi
includeUsage: truela provider. 429— citeștierror.code; vezi limite și prețuri. SDK-ul reîncearcă implicit de două ori apelurile eșuate (maxRetries).
Surse
Verificat 2026-10-18.