# LLM chat (OpenAI-compatible)

Base URL `https://ai.suzatei.com/v1`, key `sk-...`. Billed per token at each model's price.

## List available models (never hardcode ids)

```bash
curl -s https://ai.suzatei.com/v1/models -H "Authorization: Bearer $PHOENIX_MODEL_KEY"
```

## Python (openai SDK)

```python
import os
from openai import OpenAI

client = OpenAI(api_key=os.environ["PHOENIX_MODEL_KEY"], base_url="https://ai.suzatei.com/v1")
model = client.models.list().data[0].id          # or pick one by id from the list

resp = client.chat.completions.create(model=model, messages=[{"role": "user", "content": "Hello!"}])
print(resp.choices[0].message.content, resp.usage)
```

## Streaming

```python
for chunk in client.chat.completions.create(model=model, stream=True,
        messages=[{"role": "user", "content": "Write a haiku"}]):
    print(chunk.choices[0].delta.content or "", end="")
```

## Node.js

```ts
import OpenAI from "openai";
const client = new OpenAI({ apiKey: process.env.PHOENIX_MODEL_KEY, baseURL: "https://ai.suzatei.com/v1" });
const r = await client.chat.completions.create({ model: MODEL_FROM_LIST, messages: [{ role: "user", content: "Hello!" }] });
```

Optional parameters (`temperature`, `max_tokens`, tools, JSON mode …) depend on the chosen model.
Errors use the OpenAI error object; 401 = bad key, 429 = rate limited, insufficient balance is reported as an error from the gateway.
