codai docs
Integrări

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-compatible

Creezi provider-ul

lib/codai.ts
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: true cere chunk-ul final de usage pe stream-uri, ca numărul de tokeni să ajungă în onEnd / usage.
  • Folosești codai.chatModel('codai'). Gateway-ul vorbește nativ Chat Completions; codai e modelul implicit, celelalte alias-uri sunt în modele.

Generezi text

generate.ts
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

app/api/chat/route.ts
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 exact https://ai.codai.ro/v1.
  • 401 invalid_api_key — CODAI_API_KEY nu e setată acolo unde rulează codul (mediul serverului, nu browserul).
  • Usage gol pe stream-uri — adaugi includeUsage: true la provider.
  • 429 — citești error.code; vezi limite și prețuri. SDK-ul reîncearcă implicit de două ori apelurile eșuate (maxRetries).

Surse

Verificat 2026-10-18.

Pe această pagină