# Vercel AI SDK (/ro/docs/integrations/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 [#înainte-să-începi]

- O cheie codai din [hub.codai.ro](https://hub.codai.ro) → **Keys → Create key** (detalii în [quickstart](../gateway/index.mdx)), salvată ca `CODAI_API_KEY`.
- AI SDK 7 (`ai`) și provider-ul OpenAI-compatibil. SDK-ul se distribuie doar ca ESM.

```bash
pnpm add ai @ai-sdk/openai-compatible
```

## Creezi provider-ul [#creezi-provider-ul]

```ts title="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](../gateway/models.mdx).

## Generezi text [#generezi-text]

```ts title="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 [#streaming-cu-tool-uri]

```ts title="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`](../gateway/limits-pricing.mdx#chitanța-de-cost).

## Depanare [#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](../gateway/limits-pricing.mdx). SDK-ul reîncearcă implicit de două ori apelurile eșuate (`maxRetries`).

## Surse [#surse]

Verificat 2026-10-18.

- [AI SDK — provider OpenAI Compatible](https://ai-sdk.dev/providers/openai-compatible-providers)
- [Ghid de migrare la AI SDK 7](https://ai-sdk.dev/docs/migration-guides/migration-guide-7-0)
