# Açık API

> Karakterleriniz için OpenAI uyumlu bir uç nokta.

Source: https://reverie.im/tr/docs/integrations/open-api
Language: tr

Reverie, OpenAI uyumlu bir Chat Completions uç noktası sunar. Herhangi bir OpenAI istemcisini buraya yöneltin, bir Reverie API anahtarı geçirin ve `model` alanında bir LLM yerine bir **karakter ya da senaryo** adı verin. Konuşmayı, anıları ve özetleri Reverie kendi tarafında tuttuğu için her isteğin taşıması gereken tek şey yeni mesajınızdır.

Oturum açmış her hesap kullanabilir. Abonelik kademesi de bekleme listesi de yok — bir API anahtarı gerekir, hepsi bu. [Bir tane oluşturun →](https://reverie.im/tr/docs/integrations/api-keys)

## Temel URL ve kimlik doğrulama \[#base-url-and-auth]

```
https://www.reverie.im/api/device/v1
Authorization: Bearer rk_...
```

**Ayarlar → Daha fazla → API Anahtarları**, **API Endpoint** kartında tam temel URL'yi kopyalama düğmesiyle birlikte gösterir.

> **Bu, sunucu tarafında bir API'dir.** Farklı kaynaktan gelen tarayıcı istekleri engellenir; bu yüzden kendi web sayfanızdan atılan bir fetch, anahtar doğru olsa da başarısız olur. Onu bir arka uçtan çağırın ve anahtarı istemci kodunun dışında tutun.

## Hızlı başlangıç \[#quick-start]

**cURL**

```bash
curl --no-buffer https://www.reverie.im/api/device/v1/chat/completions \
  -H "Authorization: Bearer $REVERIE_API_KEY" \
  -H "Content-Type: application/json" \
  --data-binary '{
  "model": "Luna [abc12345]",
  "messages": [
    {
      "role": "user",
      "content": "Hi"
    }
  ],
  "stream": true,
  "temperature": 0.8
}'
```

**Python**

```python
import os
from openai import OpenAI

client = OpenAI(
    api_key=os.environ["REVERIE_API_KEY"],
    base_url="https://www.reverie.im/api/device/v1",
)

stream = client.chat.completions.create(
    model="Luna [abc12345]",   # an id from GET /models, a full character or scenario ID, or omit entirely
    messages=[{"role": "user", "content": "Hi"}],
    stream=True,
    temperature=0.8,
)

for chunk in stream:
    print(chunk.choices[0].delta.content or "", end="")
```

**TypeScript**

```ts
import OpenAI from "openai";

const client = new OpenAI({
	apiKey: process.env.REVERIE_API_KEY,
	baseURL: "https://www.reverie.im/api/device/v1",
});

const stream = await client.chat.completions.create({
	model: "Luna [abc12345]",
	messages: [{ role: "user", content: "Hi" }],
	stream: true,
	temperature: 0.8,
});

for await (const chunk of stream) {
	process.stdout.write(chunk.choices[0]?.delta?.content ?? "");
}
```

**Ayarlar → Daha fazla → API Anahtarları** ayrıca bir istek oluşturucu içerir; gerçek anahtarlarınızdan biriyle ve gerçek bir karakterle bu üç parçayı üretir.

## `model` alanı bir karakteri adlandırır \[#the-model-field-names-a-character]

> **Yalnızca karakter adı yazmak işe yaramaz.** `model: "Luna"`, Luna adlı bir karakteri aramaz. Hiçbir şeyle eşleşmez, anahtarın varsayılan karakterine ya da en son sohbetinize düşer ve hiçbir hata almadan başka bir karakterden yanıt alırsınız. Her zaman `GET /models`'in döndürdüğü `Ad [kısaid]` biçimini kullanın.

| `model` değeri                                    | Kim yanıtlar                                                       |
| ------------------------------------------------- | ------------------------------------------------------------------ |
| `Luna [abc12345]`                                 | ID'si o 8 karakterle biten karakter ya da senaryo                  |
| Tam bir karakter veya senaryo ID'si               | O karakter ya da o senaryo                                         |
| Bir Reverie model ID'si, örn. `deepseek-v4-flash` | **LLM**'i seçer; karakter anahtardan ya da son sohbetinizden gelir |
| Boş bırakılmış                                    | Anahtara sabitlenmiş karakter, yoksa en son sohbetiniz             |

Kısa bir ID'nin çözülüp çözülmeyeceğini belirleyen ayrıntılar:

* `[...]` dizginin **sonunda** olmalıdır.
* 8 karakter ya da daha kısa bir sonek, yalnızca **hâlihazırda sohbetiniz olan** karakterlerle karşılaştırılır; web'de olsun, API üzerinden olsun. Hiç açmadığınız bir karakterin kısa ID'si sessizce boşa düşer.
* Senaryo araması yalnızca anahtar bir karaktere sabitlenmişken çalışır. Genel bir anahtarla kısa senaryo ID'si asla çözülemez.
* 8 karakterden uzunu tam ID sayılır.

### Kimlerle konuşabileceğinizi listelemek \[#listing-what-you-can-talk-to]

```bash
curl https://www.reverie.im/api/device/v1/models \
  -H "Authorization: Bearer $REVERIE_API_KEY"
```

**Genel** bir anahtar son karakterlerinizi döndürür. Bir karaktere **sabitlenmiş** anahtar ise o karakterin senaryolarını, hiç senaryosu yoksa karakterin kendisini döndürür. Her kayıt şöyle görünür:

```json
{
	"id": "Luna [abc12345]",
	"object": "model",
	"created": 1759200000,
	"owned_by": "character",
	"permission": [],
	"root": "<full character id>",
	"parent": null
}
```

`id` değerini doğrudan `model` alanına kopyalayın. Bu uç noktanın hataları OpenAI zarfı yerine yalın bir hata biçimi kullanır.

## İstek gövdesinden neler okunur \[#what-the-request-body-reads]

Dört alan okunur. Geri kalan her şey kabul edilip sessizce atılır.

| Alan          | Tür            | Varsayılan                    | Notlar                                             |
| ------------- | -------------- | ----------------------------- | -------------------------------------------------- |
| `messages`    | dizi           | zorunlu                       | Aşağıya bakın — yalnızca bir kısmı kullanılır      |
| `model`       | dizgi          | isteğe bağlı                  | Yukarıdaki gibi karakter, senaryo ya da LLM        |
| `stream`      | boole          | **`true`**                    | OpenAI API'sinin aksine, burada varsayılan akıştır |
| `temperature` | 0–2 arası sayı | karakterin ayarı, yoksa `0.8` | Aralık dışı değerler reddedilir                    |

Uyarı vermeden yok sayılanlar: `max_tokens`, `top_p`, `n`, `stop`, `presence_penalty`, `frequency_penalty`, `logit_bias`, `seed`, `user`, `response_format`, `tools`, `tool_choice`, `logprobs`, `stream_options`.

`messages` nasıl işlenir:

* **`system` mesajları atılır.** Kişilik ve davranış, istekten değil, karakterin kendi alanlarından gelir. [Prompt alanları →](https://reverie.im/tr/docs/characters/prompt-fields)
* **Görüntü desteği yoktur.** İçerik bir dizgi ya da parçalardan oluşan bir dizi olabilir, ama yalnızca `text` parçaları okunur; görsel parçalar yok sayılır.
* Konuşmaya yalnızca **son `user` mesajı** eklenir. Daha önceki kullanıcı mesajları yok sayılır.
* Asistan mesajları yalnızca geçmişi eşitlemek için kullanılır (aşağıya bakın).
* Boş ya da yalnızca boşluktan oluşan son kullanıcı mesajı `missing_user_message` döndürür.

## Yanıtlar \[#responses]

Akışsız yanıt, sıradan bir `chat.completion` nesnesidir. `finish_reason` her zaman `stop`'tur — içerideki araç çağrıları dışarıya hiç yansımaz — ve `usage` sayaçları sıfırdır; bu yüzden tokenları yanıttan değil, API anahtarları sayfasındaki kullanım istatistiklerinden ölçün.

Akışlı yanıt bir `text/event-stream`'dir:

1. İçerik parçaları: `delta.content` taşıyan `chat.completion.chunk` nesneleri. \*&#x2A;Baştaki `delta: {"role": "assistant"}` parçası gönderilmez.*\*
2. `finish_reason` değeri `stop`, `length` ya da `content_filter` olan bir bitiş parçası. Araç çağrısıyla gelen bitişler `stop` olarak bildirilir.
3. `choices` dizisi boş olan bir kullanım parçası.
4. `data: [DONE]`.

Üretim akışın ortasında başarısız olursa akış `data: {"error": {...}}` yayar, ardından `[DONE]` gelir.

## Konuşmanın durumu \[#conversation-state]

Konuşmayı Reverie saklar. Her anahtar-karakter çifti için tek bir sohbet vardır, web uygulamasında diğer sohbetlerinizin yanında görünür ve her tur şunlardan kurulur: karakterin sistem promptu ve senaryosu, world book kanonu, uzun vadeli anılar, biriken özetler, karakterin anlatım tarzı, yanıt uzunluğu ve NSFW ayarları, hesap dilinizden gelen bir dil kilidi ve modelin bağlam penceresine sığdığı kadar yakın geçmiş. Model araçları destekliyorsa bellek araçları da çalışır.

Geçmişi sunucu tuttuğu için onu yeniden göndermenize gerek yok.

> **Asistan mesajı göndermek geçmişi silebilir.** `messages` diziniz asistan mesajları içeriyorsa Reverie sonuncusunu alır, onu saklanan en yeni 20 mesaj arasında arar ve eşleşme bulursa ondan sonra oluşturulmuş her mesajı, o noktadan sonra oluşan anılarla birlikte kalıcı olarak siler. Hiçbir şey eşleşmezse hiçbir şey silinmez. Dizinizin uzunluğunun önemi yoktur. Bundan büsbütün kaçınmak için yalnızca yeni kullanıcı mesajını gönderin.

## Hangi LLM yanıtlar \[#which-llm-answers]

Buna istek değil karakter karar verir — siz bir LLM adı vermedikçe. Öncelik, en düşükten en yükseğe: varsayılan sohbet modeli, sonra karakterin kendi model ayarı, sonra `model` olarak geçirilen Reverie model ID'si ve en sonunda web uygulamasında o sohbet için belirlediğiniz model tercihi; bu sonuncusu hepsini geçer. [Modeller →](https://reverie.im/tr/docs/reference/models)

## Hatalar \[#errors]

`/chat/completions` hataları OpenAI zarfını kullanır: `{"error": {"message", "type", "param": null, "code"}}`.

| HTTP     | `code`                 | `type`                  | Nedeni                                                                            |
| -------- | ---------------------- | ----------------------- | --------------------------------------------------------------------------------- |
| 401      | `invalid_api_key`      | `invalid_request_error` | `Authorization` eksik ya da bozuk, anahtar tanınmıyor veya anahtar etkin değil    |
| 401      | `api_key_expired`      | `invalid_request_error` | Anahtarın süresi dolmuş                                                           |
| 404      | `scenario_not_found`   | `invalid_request_error` | Senaryo ID'si çözüldü ama senaryo ortada yok                                      |
| 404      | `character_not_found`  | `invalid_request_error` | Karakter yok ya da silinmiş                                                       |
| 404      | `no_chat_history`      | `invalid_request_error` | Ne `model`, ne sabitlenmiş bir karakter, ne de geri dönülecek eski bir sohbet var |
| 400      | `missing_user_message` | `invalid_request_error` | Boş olmayan hiçbir `user` mesajı yok                                              |
| 429      | `rate_limit_exceeded`  | `rate_limit_exceeded`   | Ücretsiz model penceresi tükendi. `Retry-After` kaç saniye bekleneceğini verir    |
| 429      | `insufficient_quota`   | `insufficient_quota`    | İstek için yeterli kredi yok                                                      |
| 502      | `MODEL_EMPTY_RESPONSE` | `server_error`          | Model düzgün bitirdi ama hiç metin üretmedi                                       |
| değişken | sağlayıcı kodu         | `server_error`          | Üretim yukarı tarafta başarısız oldu                                              |

İki durum bu zarfın dışında kalır: `GET /models` hataları ve doğrulamanın reddettiği istek gövdeleri (örneğin aralık dışı bir `temperature`) — ikisi de yalın bir hata biçimi döndürür.

## Hız sınırları ve kotalar \[#rate-limits-and-quotas]

Bu API'de **anahtar başına hız sınırı, eşzamanlılık tavanı ve istek kotası yoktur**. Kullanımınızı yalnızca iki şey sınırlar:

| Sınır                    | Değer                                                                                    |
| ------------------------ | ---------------------------------------------------------------------------------------- |
| Kredi bakiyesi           | Her istekten önce denetlenir; yetmezse `insufficient_quota` döner                        |
| Ücretsiz model penceresi | Hesap başına 3 saatte 15 mesaj — Pro'da ×3 (45), Premium'da ×4 (60), Ultimate'ta ×5 (75) |

Ücretsiz model penceresi web sohbeti, hikâyeler, romanlar ve botlarla ortaktır — her yüzey için ayrı değil, hesap başına tek bir haktır. [Ücretsiz modeller →](https://reverie.im/tr/docs/reference/free-models)

Reverie dışarıya webhook göndermez; üretimin bittiğini öğrenmek için abone olunacak bir şey yoktur.

## Karakter içe aktarma \[#importing-characters]

İkinci bir uç nokta olan `POST /api/v1/characters/import`, bir karakter kartından karakter oluşturur. İçe aktarma kapsamı olan bir anahtar ister ve bu, ayarlar sayfasının oluşturduğu türden bir anahtar değildir. [API anahtarları →](https://reverie.im/tr/docs/integrations/api-keys) ve [Karakter içe aktarma →](https://reverie.im/tr/docs/characters/import-characters)

## İlgili \[#related]

* [API anahtarları](https://reverie.im/tr/docs/integrations/api-keys) — anahtar oluşturma, sabitleme, süre verme ve izleme
* [Modeller](https://reverie.im/tr/docs/reference/models) — model ID'leri ve kredi çarpanları
* [Sınırlar](https://reverie.im/tr/docs/reference/limits) — üründeki diğer tavanlar
* [Krediler](https://reverie.im/tr/docs/billing/credits) — isteklerin fiyatlandırılması
