# Gateway entegrasyonu

OpenAI SDK ile geçiş, Responses API ve Chat Completions, streaming, yalnız maskeleme ve sanal anahtar.

Mevcut OpenAI entegrasyonunuzu Gateway’e taşırken yalnız iki değer değişir:

- `base_url` → `https://gw-tr.gurubase.io/v1`
- API anahtarı → [panelden](https://gateway-tr.gurubase.io) ürettiğiniz sanal anahtar

Gerisi standart OpenAI SDK’sıdır; model adı, parametreler ve yanıt biçimi aynı kalır. Maskeleme her istekte otomatik çalışır: girdi, modele iletilmeden önce maskelenir.

## Drop-in geçiş

Aşağıdaki örneklerde yalnız `base_url` ve anahtar satırları Gateway’e özgüdür; kodun kalanı, doğrudan sağlayıcıya giden sürümle aynıdır.

### Responses API

Varsayılan yol Responses API’dir. Örnekteki ad ve TCKN, modele gitmeden maskelenir.

```python
from openai import OpenAI

client = OpenAI(
    base_url="https://gw-tr.gurubase.io/v1",
    api_key="SANAL_ANAHTAR",
)

resp = client.responses.create(
    model="gpt-4o-mini",
    input="Ahmet Yılmaz, TCKN 10000000382, adres değişikliği istiyor.",
)
print(resp.output_text)
```

```bash
curl https://gw-tr.gurubase.io/v1/responses \
  -H "Authorization: Bearer $SANAL_ANAHTAR" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-4o-mini",
    "input": "Ahmet Yılmaz, TCKN 10000000382, adres değişikliği istiyor."
  }'
```

```ts
import OpenAI from "openai";

const client = new OpenAI({
  baseURL: "https://gw-tr.gurubase.io/v1",
  apiKey: process.env.SANAL_ANAHTAR,
});

const resp = await client.responses.create({
  model: "gpt-4o-mini",
  input: "Ahmet Yılmaz, TCKN 10000000382, adres değişikliği istiyor.",
});
console.log(resp.output_text);
```

### Chat Completions

Kodunuz `chat.completions` kullanıyorsa Responses API’ye geçmeniz gerekmez; aynı iki değişiklik burada da yeter. Bundan sonraki Python ve TypeScript örnekleri, yukarıda tanımlanan `client` ile devam eder.

```python
resp = client.chat.completions.create(
    model="gpt-4o-mini",
    messages=[
        {"role": "user", "content": "Ayşe Demir'in talebini özetle."},
    ],
)
print(resp.choices[0].message.content)
```

```bash
curl https://gw-tr.gurubase.io/v1/chat/completions \
  -H "Authorization: Bearer $SANAL_ANAHTAR" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-4o-mini",
    "messages": [
      { "role": "user", "content": "Ayşe Demir'\''in talebini özetle." }
    ]
  }'
```

```ts
const resp = await client.chat.completions.create({
  model: "gpt-4o-mini",
  messages: [{ role: "user", content: "Ayşe Demir'in talebini özetle." }],
});
console.log(resp.choices[0].message.content);
```

## Streaming

`stream: true` verdiğinizde yanıt SSE ile parça parça akar. Maskelemenin yeri değişmez: girdi modele gitmeden maskelenir, akış maskeli metin üzerinden üretilir.

```python
stream = client.chat.completions.create(
    model="gpt-4o-mini",
    stream=True,
    messages=[{"role": "user", "content": "Toplantı notlarını madde madde özetle."}],
)
for chunk in stream:
    print(chunk.choices[0].delta.content or "", end="", flush=True)
```

```ts
const stream = await client.chat.completions.create({
  model: "gpt-4o-mini",
  stream: true,
  messages: [{ role: "user", content: "Toplantı notlarını madde madde özetle." }],
});
for await (const chunk of stream) {
  process.stdout.write(chunk.choices[0]?.delta?.content ?? "");
}
```

## Yalnız maskeleme (`gurubase-siper`)

Metni dil modeline göndermeden, aynı uçtan yalnız maskeleme alabilirsiniz. `model` alanına rezerve `gurubase-siper` değerini verin; Gateway metni maskeler ve maskeli halini doğrudan döndürür.

```bash
curl https://gw-tr.gurubase.io/v1/responses \
  -H "Authorization: Bearer $SANAL_ANAHTAR" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gurubase-siper",
    "input": "Vatandaş Ahmet Yılmaz, TCKN 10000000382, başvuru durumu nedir?"
  }'
```

Maskeli metin `output_text` alanında döner:

```text
Vatandaş <PERSON_1>, TCKN <TCKN_1>, başvuru durumu nedir?
```

İstek hiçbir dil modeline gitmez; `gurubase-siper` bir dil modeli değil, Gateway’in maskeleme için ayırdığı rezerve model adıdır ve Chat Completions ile de çalışır. Maskeleme yapılamazsa istek 502 ile durur, ham metin de dönmez (fail-closed). Tespit raporuna (kategori ve konum listesi) da ihtiyacınız varsa doğrudan `/mask` ucunu kullanın: [Yalnız maskeleme](/docs/guides/mask-only/).

## Sanal anahtar

Tüm istekler `Authorization: Bearer` başlığındaki sanal anahtarla doğrulanır. Sanal anahtarı panelden üretirsiniz; gerçek sağlayıcı anahtarı yalnız Gateway içinde durur, uygulamanızda tutmanız gerekmez. Bir anahtarı panelden iptal edip yenisini üretebilirsiniz. Adımlar için [Panel](/docs/panel/).

## Modelleri listeleme

Erişebildiğiniz modelleri `/v1/models` ucundan alırsınız; listede rezerve `gurubase-siper` adı da görünür.

```bash
curl https://gw-tr.gurubase.io/v1/models \
  -H "Authorization: Bearer $SANAL_ANAHTAR"
```

Maskelemeyi Gateway olmadan, kendi akışınızın bir adımı olarak kullanmak için [Yalnız maskeleme](/docs/guides/mask-only/); kod yazmadan denemek için [Playground](/docs/guides/playground/).

Kendi uygulamanızı yazmak yerine hazır bir kurumsal asistan arıyorsanız [Gurubase](https://gurubase.io) kurumun bilgi kaynaklarına (Confluence, Zendesk, Google Drive, web sitesi ve benzeri) bağlanan, yanıtlarını bu kaynaklara dayandırıp kaynak gösteren ajanlar sunar; bulut veya kurum içi (on-premise) kurulabilir.
