# OpenAI SDK

Cukup ganti `base_url` dan `api_key`. Semua model (termasuk Claude, Gemini, DeepSeek) bisa dipanggil
lewat format OpenAI.

## Python

```python
from openai import OpenAI

client = OpenAI(base_url="https://ai.brandkamu.id/v1", api_key="sk-...")

# Chat Completions
resp = client.chat.completions.create(
    model="gemini/gemini-3.5-flash",
    messages=[
        {"role": "system", "content": "Kamu asisten yang ringkas."},
        {"role": "user", "content": "Apa ibu kota Kalimantan Timur?"},
    ],
)
print(resp.choices[0].message.content)

# Responses API
r = client.responses.create(model="gpt-5-mini", input="Ringkas berita ini dalam 3 poin: ...")
print(r.output_text)

# Embeddings
e = client.embeddings.create(model="text-embedding-3-small", input=["halo dunia"])
print(len(e.data[0].embedding))
```

## Node.js / TypeScript

```ts
import OpenAI from "openai";

const client = new OpenAI({
  baseURL: "https://ai.brandkamu.id/v1",
  apiKey: process.env.SUMOROUTER_API_KEY,
});

const resp = await client.chat.completions.create({
  model: "claude-sonnet-5",
  messages: [{ role: "user", content: "Buat 3 ide nama kedai kopi" }],
});
console.log(resp.choices[0].message.content);
```

## Gambar (vision)

Untuk model dengan `supports_vision`, kirim gambar sebagai `image_url` (URL publik atau data URL base64):

```python
resp = client.chat.completions.create(
    model="gpt-5-mini",
    messages=[{
        "role": "user",
        "content": [
            {"type": "text", "text": "Apa isi gambar ini?"},
            {"type": "image_url", "image_url": {"url": "data:image/png;base64,iVBOR..."}},
        ],
    }],
)
```

## Tool calling / function calling

Didukung di model yang mendukungnya, dengan format OpenAI (`tools`, `tool_choice`) yang sama persis.

:::note
Model yang tidak punya Responses API di upstream otomatis dilayani lewat Chat Completions, jadi
`client.responses.create` tetap jalan untuk semua model chat.
:::
