# Open API

> आपके किरदारों के लिए OpenAI-संगत एंडपॉइंट।

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

Reverie एक OpenAI-संगत Chat Completions एंडपॉइंट देता है। किसी भी OpenAI क्लाइंट को उस पर मोड़िए, एक Reverie API की भेजिए, और `model` फ़ील्ड में LLM की जगह कोई **किरदार या परिदृश्य** लिखिए। बातचीत, यादें और सारांश Reverie अपनी तरफ़ रखता है, इसलिए हर अनुरोध में बस आपका नया संदेश चाहिए।

साइन इन किया कोई भी खाता इसे इस्तेमाल कर सकता है। न कोई सदस्यता स्तर है, न प्रतीक्षा सूची — आपको एक API की चाहिए, बस इतना ही। [एक बनाएँ →](https://reverie.im/hi/docs/integrations/api-keys)

## बेस URL और प्रमाणीकरण \[#base-url-and-auth]

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

**सेटिंग्स → और देखें → API कीज़** में **API Endpoint** कार्ड पर सही बेस URL दिखता है, साथ में कॉपी बटन भी।

> **यह सर्वर-साइड API है।** दूसरे ऑरिजिन से आने वाले ब्राउज़र अनुरोध रोक दिए जाते हैं, इसलिए आपकी अपनी वेब पेज से किया fetch की सही होने पर भी नाकाम रहेगा। इसे किसी बैकएंड से बुलाइए, और की को क्लाइंट कोड से बाहर रखिए।

## जल्दी शुरू करें \[#quick-start]

**cURL**

```bash
curl --no-buffer https://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://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://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 ?? "");
}
```

**सेटिंग्स → और देखें → API कीज़** में एक अनुरोध बिल्डर भी है, जो आपकी किसी असली की और किसी असली किरदार के साथ ये तीनों नमूने बना देता है।

## `model` फ़ील्ड किरदार का नाम है \[#the-model-field-names-a-character]

> **सिर्फ़ किरदार का नाम लिखने से काम नहीं चलता।** `model: "Luna"` Luna नाम के किसी किरदार को नहीं ढूँढ़ता। वह किसी से मेल नहीं खाता, की के डिफ़ॉल्ट किरदार या आपकी सबसे हाल की चैट पर फिसल जाता है, और आपको किसी और किरदार का जवाब मिल जाता है — बिना किसी त्रुटि के। हमेशा वही `नाम [छोटीID]` शैली इस्तेमाल करें जो `GET /models` लौटाता है।

| `model` का मान                                | कौन जवाब देता है                                             |
| --------------------------------------------- | ------------------------------------------------------------ |
| `Luna [abc12345]`                             | वह किरदार या परिदृश्य जिसका ID उन 8 अक्षरों पर ख़त्म होता है |
| पूरा किरदार या परिदृश्य ID                    | वही किरदार या परिदृश्य                                       |
| कोई Reverie मॉडल ID, जैसे `deepseek-v4-flash` | **LLM** चुनता है; किरदार की से या आपकी पिछली चैट से आता है   |
| न दिया गया हो                                 | की से जुड़ा किरदार, वरना आपकी सबसे हाल की चैट                |

छोटा ID हल होगा या नहीं, यह इन बातों से तय होता है:

* `[...]` स्ट्रिंग के **अंत** में होना चाहिए।
* 8 या उससे कम अक्षरों वाला प्रत्यय सिर्फ़ उन्हीं किरदारों से मिलाया जाता है **जिनके साथ आपकी पहले से चैट है** — वेब पर हो या API से। जिस किरदार को आपने कभी खोला ही नहीं, उसका छोटा ID चुपचाप ख़ाली चला जाता है।
* परिदृश्य की खोज तभी चलती है जब की किसी किरदार से जुड़ी हो। वैश्विक की के साथ छोटा परिदृश्य ID कभी हल नहीं होता।
* 8 से ज़्यादा अक्षर होने पर उसे पूरा ID मान लिया जाता है।

### आप किससे बात कर सकते हैं, यह देखना \[#listing-what-you-can-talk-to]

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

**वैश्विक** की आपके हालिया किरदार लौटाती है। **किसी किरदार से जुड़ी** की उस किरदार के परिदृश्य लौटाती है, और अगर एक भी न हो तो ख़ुद किरदार। हर प्रविष्टि कुछ ऐसी दिखती है:

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

`id` को सीधे `model` में कॉपी कर दीजिए। इस एंडपॉइंट की त्रुटियाँ OpenAI के लिफ़ाफ़े की जगह एक सादे त्रुटि रूप में आती हैं।

## अनुरोध के मुख्य भाग से क्या पढ़ा जाता है \[#what-the-request-body-reads]

चार फ़ील्ड पढ़े जाते हैं। बाकी सब स्वीकार कर के चुपचाप गिरा दिया जाता है।

| फ़ील्ड        | प्रकार        | डिफ़ॉल्ट                     | टिप्पणी                                           |
| ------------- | ------------- | ---------------------------- | ------------------------------------------------- |
| `messages`    | सरणी          | ज़रूरी                       | नीचे देखें — इसका सिर्फ़ एक हिस्सा काम आता है     |
| `model`       | स्ट्रिंग      | वैकल्पिक                     | ऊपर बताए अनुसार किरदार, परिदृश्य या LLM           |
| `stream`      | बूलियन        | **`true`**                   | OpenAI API से अलग, यहाँ स्ट्रीमिंग ही डिफ़ॉल्ट है |
| `temperature` | 0–2 की संख्या | किरदार की सेटिंग, वरना `0.8` | सीमा से बाहर के मान अस्वीकार होते हैं             |

बिना चेतावनी नज़रअंदाज़ होते हैं: `max_tokens`, `top_p`, `n`, `stop`, `presence_penalty`, `frequency_penalty`, `logit_bias`, `seed`, `user`, `response_format`, `tools`, `tool_choice`, `logprobs`, `stream_options`.

`messages` को कैसे बरता जाता है:

* **`system` संदेश गिरा दिए जाते हैं।** व्यक्तित्व और व्यवहार किरदार के अपने फ़ील्ड से आते हैं, अनुरोध से नहीं। [प्रॉम्प्ट फ़ील्ड →](https://reverie.im/hi/docs/characters/prompt-fields)
* **दृष्टि का समर्थन नहीं है।** सामग्री स्ट्रिंग भी हो सकती है और हिस्सों की सरणी भी, पर सिर्फ़ `text` हिस्से पढ़े जाते हैं; तस्वीर वाले हिस्से नज़रअंदाज़ हो जाते हैं।
* बातचीत में सिर्फ़ **आख़िरी `user` संदेश** जुड़ता है। उससे पहले के उपयोगकर्ता संदेश नज़रअंदाज़ होते हैं।
* सहायक संदेश सिर्फ़ इतिहास मिलाने के लिए इस्तेमाल होते हैं (नीचे देखें)।
* आख़िरी उपयोगकर्ता संदेश ख़ाली हो या सिर्फ़ स्पेस का हो तो `missing_user_message` लौटता है।

## जवाब \[#responses]

बिना स्ट्रीमिंग वाला जवाब एक सामान्य `chat.completion` ऑब्जेक्ट होता है। `finish_reason` हमेशा `stop` रहता है — भीतरी टूल कॉल कभी बाहर नहीं दिखते — और `usage` के आँकड़े शून्य होते हैं, इसलिए टोकन जवाब से नहीं, API कीज़ पेज के उपयोग आँकड़ों से नापिए।

स्ट्रीमिंग वाला जवाब `text/event-stream` होता है:

1. सामग्री के टुकड़े: `delta.content` वाले `chat.completion.chunk` ऑब्जेक्ट। \*&#x2A;शुरुआत में `delta: {"role": "assistant"}` वाला टुकड़ा नहीं भेजा जाता।*\*
2. एक समापन टुकड़ा, जिसमें `finish_reason` `stop`, `length` या `content_filter` होता है। टूल कॉल से हुए समापन `stop` के रूप में बताए जाते हैं।
3. एक उपयोग टुकड़ा, जिसमें `choices` ख़ाली सरणी होती है।
4. `data: [DONE]`.

अगर बीच स्ट्रीम में बनना नाकाम हो जाए, तो स्ट्रीम `data: {"error": {...}}` भेजती है और फिर `[DONE]`।

## बातचीत की स्थिति \[#conversation-state]

बातचीत Reverie सँभालता है। हर की-और-किरदार जोड़ी के लिए एक चैट होती है, वह वेब ऐप में आपकी बाकी चैट के साथ दिखती है, और हर बारी किरदार के सिस्टम प्रॉम्प्ट और परिदृश्य, वर्ल्ड बुक के तयशुदा विवरण, दीर्घकालिक यादों, चलते-फिरते सारांशों, किरदार की कथन शैली, जवाब की लंबाई और NSFW सेटिंग्स, आपके खाते की भाषा से आए भाषा-ताले, और मॉडल की कॉन्टेक्स्ट विंडो में जितना हालिया इतिहास समाए उतने से बनती है। मॉडल टूल समर्थन करता हो तो याददाश्त के टूल भी चलते हैं।

इतिहास सर्वर के पास है, इसलिए आपको उसे दोबारा भेजने की ज़रूरत नहीं।

> **सहायक संदेश भेजने से इतिहास मिट सकता है।** अगर आपकी `messages` सरणी में सहायक संदेश हैं, तो Reverie उनमें से आख़िरी लेता है, उसे सहेजे गए 20 सबसे हालिया संदेशों में ढूँढ़ता है, और मिल जाने पर उसके बाद बने हर संदेश को — साथ में उस बिंदु के बाद बनी यादों को भी — हमेशा के लिए मिटा देता है। कुछ न मिले तो कुछ नहीं मिटता। आपकी सरणी कितनी लंबी है, इससे फ़र्क़ नहीं पड़ता। इससे पूरी तरह बचना हो तो सिर्फ़ नया उपयोगकर्ता संदेश भेजिए।

## कौन-सा LLM जवाब देता है \[#which-llm-answers]

यह किरदार तय करता है, अनुरोध नहीं — जब तक आप ख़ुद कोई LLM न बता दें। प्राथमिकता नीचे से ऊपर इस तरह है: डिफ़ॉल्ट चैट मॉडल, फिर किरदार की अपनी मॉडल सेटिंग, फिर `model` में भेजा गया Reverie मॉडल ID, और आख़िर में वेब ऐप में उस चैट के लिए तय की गई मॉडल पसंद, जो सब पर भारी पड़ती है। [मॉडल →](https://reverie.im/hi/docs/reference/models)

## त्रुटियाँ \[#errors]

`/chat/completions` की त्रुटियाँ OpenAI के लिफ़ाफ़े में आती हैं: `{"error": {"message", "type", "param": null, "code"}}`.

| HTTP          | `code`                 | `type`                  | कारण                                                                   |
| ------------- | ---------------------- | ----------------------- | ---------------------------------------------------------------------- |
| 401           | `invalid_api_key`      | `invalid_request_error` | `Authorization` नदारद या ग़लत बना हुआ, की अनजानी, या की निष्क्रिय      |
| 401           | `api_key_expired`      | `invalid_request_error` | की की अवधि बीत चुकी है                                                 |
| 404           | `scenario_not_found`   | `invalid_request_error` | परिदृश्य ID हल तो हुआ, पर वह परिदृश्य रहा ही नहीं                      |
| 404           | `character_not_found`  | `invalid_request_error` | किरदार मौजूद नहीं है या मिटा दिया गया है                               |
| 404           | `no_chat_history`      | `invalid_request_error` | न `model`, न कोई जुड़ा किरदार, और न पीछे लौटने लायक कोई पुरानी चैट     |
| 400           | `missing_user_message` | `invalid_request_error` | कोई ग़ैर-ख़ाली `user` संदेश नहीं है                                    |
| 429           | `rate_limit_exceeded`  | `rate_limit_exceeded`   | फ्री मॉडल की खिड़की ख़त्म। `Retry-After` बताता है कितने सेकंड रुकना है |
| 429           | `insufficient_quota`   | `insufficient_quota`    | इस अनुरोध के लिए क्रेडिट कम हैं                                        |
| 502           | `MODEL_EMPTY_RESPONSE` | `server_error`          | मॉडल ठीक-ठाक ख़त्म हुआ, पर कोई टेक्स्ट नहीं दिया                       |
| बदलता रहता है | प्रदाता का कोड         | `server_error`          | ऊपर की ओर बनाना नाकाम रहा                                              |

दो सूरतें इस लिफ़ाफ़े से बाहर रहती हैं: `GET /models` की त्रुटियाँ, और जाँच में रद्द हुए अनुरोध (जैसे सीमा से बाहर का `temperature`) — दोनों सादा त्रुटि रूप लौटाते हैं।

## दर सीमाएँ और कोटा \[#rate-limits-and-quotas]

इस API पर **न तो हर की के लिए दर सीमा है, न समानांतर अनुरोधों की हद, और न कोई अनुरोध कोटा**। आपके इस्तेमाल को सिर्फ़ दो चीज़ें बाँधती हैं:

| बंधन             | मान                                                                                             |
| ---------------- | ----------------------------------------------------------------------------------------------- |
| क्रेडिट बैलेंस   | हर अनुरोध से पहले जाँचा जाता है; कम पड़ने पर `insufficient_quota` लौटता है                      |
| फ्री मॉडल खिड़की | हर खाते के लिए हर 3 घंटे में 15 संदेश — Pro पर ×3 (45), Premium पर ×4 (60), Ultimate पर ×5 (75) |

फ्री मॉडल की खिड़की वेब चैट, कहानियों, उपन्यासों और बॉट्स के साथ साझा है — यह हर खाते के लिए एक हिस्सा है, हर जगह के लिए अलग-अलग नहीं। [फ्री मॉडल →](https://reverie.im/hi/docs/reference/free-models)

Reverie बाहर कोई webhook नहीं भेजता; बनना पूरा होने की सूचना के लिए सदस्यता लेने को कुछ है ही नहीं।

## किरदार आयात करना \[#importing-characters]

एक दूसरा एंडपॉइंट, `POST /api/v1/characters/import`, किरदार कार्ड से किरदार बनाता है। इसके लिए आयात के दायरे वाली की चाहिए, और वह उस तरह की की नहीं है जो सेटिंग्स पेज बनाता है। [API कीज़ →](https://reverie.im/hi/docs/integrations/api-keys) और [किरदार आयात करना →](https://reverie.im/hi/docs/characters/import-characters)

## संबंधित \[#related]

* [API कीज़](https://reverie.im/hi/docs/integrations/api-keys) — कीज़ बनाना, जोड़ना, अवधि तय करना और उन पर नज़र रखना
* [मॉडल](https://reverie.im/hi/docs/reference/models) — मॉडल ID और क्रेडिट गुणक
* [सीमाएँ](https://reverie.im/hi/docs/reference/limits) — उत्पाद की बाकी हदें
* [क्रेडिट](https://reverie.im/hi/docs/billing/credits) — अनुरोधों की क़ीमत कैसे बनती है
