API نوتراک — مرجع

یک اندپوینت سازگار با OpenAI، یک مدل، یک کلید. اگر کد شما از قبل با /v1/chat/completions صحبت می‌کند، فقط URL پایه و کلید را عوض کنید، و با ما صحبت خواهد کرد.

URL پایه و احراز هویت

Base URL:  https://api.bestprivateai.com/v1
Header:    Authorization: Bearer sk-…

کلیدها در صفحه کلیدها ساخته می‌شوند. یک کلید فقط یک بار، هنگام ساخت، نمایش داده می‌شود؛ ما یک hash و شش کاراکتر آخر آن را ذخیره می‌کنیم. آن را فقط از طریق HTTPS و فقط در هدر Authorization ارسال کنید — هرگز در URL.

همه چیز JSON است (Content-Type: application/json). پاسخ‌ها از schema اوپن‌ای‌آی استفاده می‌کنند، بنابراین SDKهای رسمی openai و هر کلاینت سازگار با OpenAI بدون تغییر کار می‌کنند.

مدل‌ها

GET /v1/models

{ "object": "list",
  "data": [ { "id": "notrack-uncensored", "object": "model", "owned_by": "notrack" } ] }

فقط یک مدل وجود دارد، notrack-uncensored: تیون خودمان، که روی سخت‌افزار خودمان اجرا می‌شود. هر چیزی که به‌عنوان model بفرستید به آن مسیردهی می‌شود؛ از id عمومی استفاده کنید تا لاگ‌های شما با لاگ‌های ما مطابقت داشته باشد.

Chat completions

POST /v1/chat/completions

{
  "model": "notrack-uncensored",
  "messages": [
    { "role": "system",    "content": "You are Mira, a wry bartender in 1920s Berlin." },
    { "role": "user",      "content": "Evening. What's good tonight?" }
  ],
  "max_tokens": 400,
  "temperature": 0.9
}

پاسخ — شکل استاندارد، با شمارش واقعی توکن در usage (همین مبنای صورت‌حساب شماست):

{
  "id": "chatcmpl-…", "object": "chat.completion", "model": "notrack-uncensored",
  "choices": [ { "index": 0, "finish_reason": "stop",
                 "message": { "role": "assistant", "content": "…" } } ],
  "usage": { "prompt_tokens": 41, "completion_tokens": 118, "total_tokens": 159 }
}

system prompt شما گفتگو را هدایت می‌کند. ما دقیقاً یک خط در ابتدا اضافه می‌کنیم — هویت مدل (این‌که notrack-uncensored است، ساخته BestPrivateAI) — و هیچ چیز دیگری: نه قانونی، نه فیلتر موضوعی. system message شما بعد از آن می‌آید و پرسونا، سبک و همه چیز دیگر را تعیین می‌کند. تنها استثنا در سیاست محتوا است.

استریم

"stream": true را تنظیم کنید و server-sent events را بخوانید، دقیقاً مثل OpenAI. آخرین بخش حاوی usage است (ما همیشه آن را می‌گنجانیم، چه stream_options را خواسته باشید چه نه)، سپس data: [DONE].

data: {"id":"chatcmpl-…","object":"chat.completion.chunk","choices":[{"index":0,"delta":{"content":"Ev"}}]}
data: {"id":"chatcmpl-…","object":"chat.completion.chunk","choices":[{"index":0,"delta":{"content":"ening"}}]}
…
data: {"id":"chatcmpl-…","object":"chat.completion.chunk","choices":[],"usage":{"prompt_tokens":41,"completion_tokens":118,"total_tokens":159}}
data: [DONE]

پارامترها

فیلدیادداشت‌ها
messagesالزامی. نقش‌های system، user، assistant. فعلاً فقط متن — بخش‌های تصویری رد می‌شوند.
modelاز notrack-uncensored استفاده کنید.
streamtrue برای SSE. stream_options.include_usage همیشه فعال است.
max_tokensسقف روی completion. prompt + completion باید در پنجره 64,000 توکنی جا شود.
temperature, top_p, stop, presence_penalty, frequency_penalty, seed, nهمان‌طور که در OpenAI به مدل منتقل می‌شود. اگر temperature نفرستید از 0.85 استفاده می‌کنیم، همان چیزی که در چت خودمان استفاده می‌شود. n > 1 هزینه خروجی را ضرب می‌کند.
tools, tool_choiceپشتیبانی‌شده: auto، none، required، یا یک تابع نام‌گذاری‌شده. پاسخ حاوی tool_calls و finish_reason: "tool_calls" است؛ نتیجه را به‌عنوان یک پیام role: "tool" برگردانید. وقتی tools وجود دارد، پاسخ استریم‌شده به‌جای توکن‌به‌توکن، به‌صورت یک بخش برای هر فراخوانی می‌رسد.
response_format{"type": "json_object"} پشتیبانی می‌شود (در prompt بگویید چه JSON‌ی می‌خواهید). json_schema و فیلد قدیمی functions پشتیبانی نمی‌شوند.

محدودیت‌ها و هدرهای پاسخ

محدودیتمقدارهنگام عبور از حد
درخواست‌های همزمان برای هر کلید8429 concurrency
درخواست در دقیقه برای هر کلید300429 rate_limit
پنجره کانتکست (prompt + completion)64,000 توکن400 context_limit — تاریخچه را کوتاه کنید و دوباره تلاش کنید
هزینه روزانه برای هر کلید (اختیاری)توسط شما در صفحه کلیدها تنظیم می‌شود402 key_daily_cap تا 00:00 UTC

هر پاسخ موفق حاوی موارد زیر است:

هدرمعنی
X-Request-Idهنگام نوشتن به پشتیبانی آن را ذکر کنید؛ این تنها چیزی است که درباره یک درخواست نگه می‌داریم.
X-NoTrack-Balance-USDاعتبار شما پیش از کسر هزینه این درخواست، به دلار.
X-RateLimit-Limit-Requestsدرخواست در دقیقه مجاز برای این کلید.
X-RateLimit-Limit-Concurrencyدرخواست‌های همزمان مجاز برای این کلید.
X-NoTrack-Content-Flagفقط در رد محتوا: minor_in_sexual_context یا child_safety.

خطاها

خطاها JSON هستند با یک type پایدار؛ message برای انسان‌ها است و ممکن است تغییر کند.

{ "error": { "type": "no_credit", "message": "no credit left on this account — top up at bestprivateai.com/api-keys" } }
HTTPtypeچه باید کرد
400bodyJSON نامعتبر یا بدون messages.
400context_limitprompt برای پنجره 64,000 توکنی خیلی طولانی است. نوبت‌های قدیمی‌تر را حذف کنید.
400content_policy + X-NoTrack-Content-Flag: minor_in_sexual_contextصحنه جنسی به نظر می‌رسد و یک شخصیت زیر سن قانونی به نظر می‌رسد. شخصیت‌ها را به‌طور غیرقابل‌ابهام بزرگسال کنید و دوباره ارسال کنید؛ هزینه‌ای دریافت نمی‌شود.
401auth, invalid_key, key_revoked, key_expiredکلید را اصلاح یا جایگزین کنید.
402no_creditاعتبار صفر است. شارژ کنید؛ درخواست‌ها بلافاصله از سر گرفته می‌شوند.
402key_daily_capاین کلید به سقف روزانه‌ای که تعیین کرده‌اید رسیده است. آن را افزایش دهید یا تا 00:00 UTC صبر کنید.
403content_policy + X-NoTrack-Content-Flag: child_safetyرد شده و هزینه‌ای دریافت نشده. سیاست محتوا را ببینید.
429rate_limit, concurrencyسرعت را کم کنید و دوباره تلاش کنید؛ به هر دو هدر X-RateLimit-* احترام بگذارید.
502upstreamمدل پاسخ نداد. با backoff دوباره تلاش کنید؛ هزینه‌ای دریافت نمی‌شود.
503billing, safetyیکی از dependency‌های ما از کار افتاده است. چند ثانیه دیگر دوباره تلاش کنید؛ هزینه‌ای دریافت نمی‌شود.

صورت‌حساب

اعتبار پیش‌پرداخت، بر اساس usage واقعی هر پاسخ به ازای هر توکن محاسبه می‌شود: $0.25 به ازای هر 1M توکن ورودی، $1.00 به ازای هر 1M توکن خروجی. ورودی هر چیزی است که می‌فرستید (system prompt، تاریخچه، پیام جدید)؛ خروجی چیزی است که مدل می‌نویسد.

پرسونا — مدل خام یا شخصیت BestPrivateAI

هر کلید یک سبک دارد، که در صفحه کلیدها انتخاب می‌شود و هر زمان قابل تغییر است:

یک درخواست می‌تواند تنظیم کلید را لغو کند، یا با یک فیلد یا با یک پسوند مدل (برای کلاینت‌هایی که فقط می‌توانند نام مدل را تنظیم کنند):

{ "model": "notrack-uncensored", "notrack": { "persona": "notrack" }, "messages": [ … ] }

{ "model": "notrack-uncensored:notrack", "messages": [ … ] }      // same thing, by model name
{ "model": "notrack-uncensored:bare",    "messages": [ … ] }      // force the bare model on a persona key

نام‌های پرسونا: notrack (شخصیت ساده)، concise، detailed، creative (همان نسخه‌هایی که چت ارائه می‌دهد)، bare. هدر پاسخ X-NoTrack-Persona می‌گوید کدام‌یک اعمال شده است.

سیاست محتوا

ما هیچ system prompt‌ی اضافه نمی‌کنیم و هیچ فیلتر موضوعی اجرا نمی‌کنیم. داستان بزرگسالان، مضامین تاریک، زبان تند، خشونت در داستان — مدل همان‌طور که نوشته شده پاسخ می‌دهد. یک قانون در کد اجرا شده و قابل خاموش کردن نیست: هر چیز جنسی که مربوط به یک فرد زیر سن قانونی باشد رد می‌شود.

تکرار 403 روی یک کلید منجر به بسته شدن آن کلید و سپس حساب می‌شود. متن کامل در سیاست استفاده مجاز آمده است.

حریم خصوصی

prompts و completions روی دیسک نوشته نمی‌شوند — نه توسط gateway، نه توسط سرورهای مدل. آنچه ما به ازای هر درخواست نگه می‌داریم عبارت است از id درخواست، id کلید، شمارش توکن‌ها و قیمت، چون همین صورت‌حساب را می‌سازد. ردهای امنیتی بر اساس دسته‌بندی، بدون متن، ثبت می‌شوند. هیچ ارائه‌دهنده مدل شخص ثالثی هرگز ترافیک شما را نمی‌بیند: مدل روی سخت‌افزاری اجرا می‌شود که ما اجاره می‌کنیم و کنترل می‌کنیم.

کلاینت‌ها و SDKها

وب‌سایت BestPrivateAI و اپلیکیشن BestPrivateAI چت خودمان هستند — فیلدی برای کلید API ندارند و هرگز نخواهند داشت. یک کلید برای برنامه‌های دیگر است: آن را در یکی از کلاینت‌های زیر، یا در کد خودتان، paste کنید.

Python

from openai import OpenAI
client = OpenAI(base_url="https://api.bestprivateai.com/v1", api_key="sk-…")
stream = client.chat.completions.create(model="notrack-uncensored",
    messages=[{"role": "user", "content": "Hello"}], stream=True)
for chunk in stream:
    if chunk.choices and chunk.choices[0].delta.content:
        print(chunk.choices[0].delta.content, end="")

Node.js

import OpenAI from "openai";
const client = new OpenAI({ baseURL: "https://api.bestprivateai.com/v1", apiKey: process.env.API_KEY });
const r = await client.chat.completions.create({ model: "notrack-uncensored",
  messages: [{ role: "user", content: "Hello" }] });
console.log(r.choices[0].message.content);

SillyTavern

API Connections → API: Chat Completion → Source: Custom (OpenAI-compatible) → Custom Endpoint https://api.bestprivateai.com/v1 → Custom API Key → Connect → Model notrack-uncensored. Streaming روشن. اندازه کانتکست را در 64,000 توکن یا کمتر نگه دارید.

Chatbox

Settings → Model Provider → Add → Add Custom Provider، حالت OpenAI API Compatible → URL پایه و کلید را paste کنید، سپس notrack-uncensored را به‌عنوان مدل اضافه کنید.

NextChat

Settings → Custom Endpoint را روشن کنید (سازگار با OpenAI) → URL پایه و کلید، سپس نام مدل را در فیلد مدل تایپ کنید.

Cherry Studio

Settings → Model Providers → Add Provider → OpenAI را تایپ کنید → URL پایه و کلید، سپس «Add model» → notrack-uncensored.

LobeChat

Settings → AI Service Provider → OpenAI → custom API endpoint را فعال کنید، URL پایه و کلید را paste کنید، و مدل را به لیست مدل‌ها اضافه کنید.

هر چیز دیگر

LangChain، LlamaIndex، Open WebUI، Continue، تنظیمات پراکسی JanitorAI، curl — هر کلاینتی که گزینه «OpenAI-compatible» یا «custom base URL» داشته باشد.

متن منوها در بالا بین نسخه‌های اپلیکیشن تغییر می‌کند — اگر یک برچسب دقیقاً مطابقت نداشت، به دنبال تنظیمی باشید که «custom»، «OpenAI-compatible» یا «base URL» را ذکر می‌کند.

اگر یک کلاینت وصل نمی‌شود

کلیدها

سؤال دارید یا یک request id برای بررسی: پشتیبانی · bestprivateai.com/support.