# Start rapid (/ro/docs/gateway)

Obții o cheie, trimiți prima cerere către ai.codai.ro, alegi un wire format.

Gateway-ul codai rulează la `https://ai.codai.ro`. Vorbește trei wire formats — OpenAI Chat Completions, Anthropic Messages și OpenAI Responses API — și un singur nume de model, `codai`. Orice SDK folosești deja funcționează; gateway-ul traduce în spate.

<Steps>
<Step>

### Obții o cheie API [#obții-o-cheie-api]

Te autentifici pe [hub.codai.ro](https://hub.codai.ro) și deschizi **Keys → Create key**. Cheile arată ca `codai_xxxxxxxx` și se afișează o singură dată — păstrează-o într-o variabilă de mediu:

```powershell tab="PowerShell"
$env:CODAI_API_KEY = 'codai_xxxxxxxx'
```

```bash tab="bash"
export CODAI_API_KEY='codai_xxxxxxxx'
```

</Step>
<Step>

### Trimiți prima cerere [#trimiți-prima-cerere]

<Tabs items={['curl', 'TypeScript', 'Python']}>
<Tab value="curl">

```bash
curl https://ai.codai.ro/v1/chat/completions \
  -H "Authorization: Bearer $CODAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "codai",
    "messages": [
      { "role": "user", "content": "Scrie o funcție Python pe o linie care returnează al n-lea număr Fibonacci." }
    ]
  }'
```

</Tab>
<Tab value="TypeScript">

```ts title="quickstart.ts"
import { Codai } from 'codai-sdk';

const codai = new Codai({ apiKey: process.env.CODAI_API_KEY! });

const res = await codai.chat({
  messages: [{ role: 'user', content: 'Scrie o funcție Python pe o linie care returnează al n-lea număr Fibonacci.' }],
});

console.log(res.content);
console.log(res.routedTo); // modelul upstream care a răspuns efectiv
```

</Tab>
<Tab value="Python">

```python title="quickstart.py"
import os
from codai import Codai

client = Codai(api_key=os.environ["CODAI_API_KEY"])

result = client.chat([
    {"role": "user", "content": "Scrie o funcție Python pe o linie care returnează al n-lea număr Fibonacci."}
])

print(result.content)
print(result.routed_to)
```

</Tab>
</Tabs>

Un răspuns reușit este un chat completion standard:

```json
{
  "id": "chatcmpl-…",
  "object": "chat.completion",
  "model": "codai",
  "choices": [
    {
      "index": 0,
      "message": { "role": "assistant", "content": "def fib(n): return n if n < 2 else fib(n - 1) + fib(n - 2)" },
      "finish_reason": "stop"
    }
  ],
  "usage": { "prompt_tokens": 27, "completion_tokens": 21, "total_tokens": 48 }
}
```

</Step>
<Step>

### Citești header-ele de răspuns [#citești-header-ele-de-răspuns]

Fiecare răspuns îți spune ce s-a întâmplat de fapt. Cele două pe care le vei folosi cel mai des:

| Header | Semnificație |
| --- | --- |
| `x-codai-routed-to` | Modelul upstream care a servit cererea. |
| `x-codai-cost-micro-usd` | Costul acestei cereri în micro-USD, număr întreg (când e cunoscut înaintea primului byte — vezi [limite și prețuri](./limits-pricing.mdx)). |

Lista completă este pe pagina [header-e de cerere](./headers.mdx).

Ca să le vezi, adaugi `-i` la cererea curl de mai sus:

```text
HTTP/2 200
x-codai-routed-to: claude-sonnet-5-5
x-codai-upstream: claude-sonnet-5-5
x-codai-cost-micro-usd: 1840
```

`1840` micro-USD înseamnă 0,00184 $. Pe stream-urile native costul nu se știe când pleacă header-ele, așa că primești `x-codai-cost-estimate: pending`, iar cifra exactă vine ulterior din [`GET /v1/receipt`](./limits-pricing.mdx#chitanța-de-cost).

</Step>
</Steps>

## `codai` sau un model fixat? [#codai-sau-un-model-fixat]

<Callout type="info" title="Ce face `codai` astăzi">
`model: "codai"` este în prezent un lanț de modele Claude actuale ale Anthropic, cu failover automat între deployment-uri: când un deployment nu e disponibil, răspunde următorul din lanț. Nu trece singur la alți furnizori. Fixezi un nume când vrei același model de fiecare dată: un alias de workload precum `codai-fast` sau `codai-max`, ori un nume upstream direct, pe planurile care îl permit. În ambele cazuri `x-codai-routed-to` îți spune ce model a răspuns. Modelul propriu codai este în beta opt-in ca `codai-1-beta` (îl ceri după nume; nu este listat). Detalii în [modele](./models.mdx).
</Callout>

## Folosești deja un SDK? [#folosești-deja-un-sdk]

Îl îndrepți către gateway și păstrezi codul.

<Tabs items={['OpenAI (Node)', 'OpenAI (Python)', 'Anthropic (Node)']}>
<Tab value="OpenAI (Node)">

```ts
import OpenAI from 'openai';

const client = new OpenAI({
  apiKey: process.env.CODAI_API_KEY,
  baseURL: 'https://ai.codai.ro/v1',
});

const res = await client.chat.completions.create({
  model: 'codai',
  messages: [{ role: 'user', content: 'Salut!' }],
});
console.log(res.choices[0].message.content);
```

</Tab>
<Tab value="OpenAI (Python)">

```python
import os

from openai import OpenAI

client = OpenAI(api_key=os.environ["CODAI_API_KEY"], base_url="https://ai.codai.ro/v1")
res = client.chat.completions.create(
    model="codai",
    messages=[{"role": "user", "content": "Salut!"}],
)
print(res.choices[0].message.content)
```

</Tab>
<Tab value="Anthropic (Node)">

```ts
import Anthropic from '@anthropic-ai/sdk';

const client = new Anthropic({
  apiKey: process.env.CODAI_API_KEY,
  baseURL: 'https://ai.codai.ro', // rădăcina, nu /v1 — SDK-ul adaugă /v1/messages
});

const msg = await client.messages.create({
  model: 'codai',
  max_tokens: 1024,
  messages: [{ role: 'user', content: 'Salut' }],
});
console.log(msg.content);
```

</Tab>
</Tabs>

<Callout type="info">
Base URL-ul OpenAI include `/v1`; base URL-ul Anthropic este doar host-ul. Dacă le inversezi primești un `404 not_found` care seamănă cu o eroare de autentificare.
</Callout>

## Pașii următori [#pașii-următori]

<Cards>
  <Card title="Modele" href="./models.mdx" description="La ce se rezolvă `codai`, celelalte alias-uri, effort și thinking." />
  <Card title="Wire formats" href="./wire-formats.mdx" description="Chat Completions, Messages și Responses — forma cererii și a răspunsului." />
  <Card title="Streaming" href="./streaming.mdx" description="Formele SSE per format și unde ajunge usage." />
  <Card title="Clienți" href="./clients.mdx" description="VS Code, Copilot CLI, Cursor, Continue, MCP." />
  <Card title="SDK-uri" href="../sdks/index.mdx" description="Clienții oficiali TypeScript și Python." />
  <Card title="Limite și prețuri" href="./limits-pricing.mdx" description="Rate limits, plafoane de cheltuieli și contractul de erori." />
</Cards>
