راهنمای API — Acecr AI
دروازهٔ سازگار با OpenAI — هر SDK یا ابزاری که base_url را پشتیبانی کند، بدون تغییر روی کد کار میکند.
🚀 شروع سریع در ۳ قدم
۲
آدرس پایه را ست کن
در SDK یا ابزارت، آدرس پایه را عوض کن و کلید را بگذار (حالت امنتر: متغیر محیطی).
۳
اولین درخواست
همین نمونهٔ curl را با کلیدت اجرا کن — یا مستقیم برو سراغ نمونهٔ پایتون/Node پایینتر.
# آدرس پایه (Base URL) https://chat.acecr.ir/v1 # متغیرهای محیطی (اختیاری ولی توصیهشده) export ACECR_BASE="https://chat.acecr.ir/v1" export ACECR_KEY="***"
# اولین درخواست — غیراستریم
curl https://chat.acecr.ir/v1/chat/completions \
-H "Authorization: Bearer ***" \
-H "Content-Type: application/json" \
-d '{"model":"claude-sonnet-4-6-free","messages":[{"role":"user","content":"سلام!"}]}'
۱) احراز هویت
- هر درخواست باید هدر Authorization: Bearer sk-mn-… داشته باشد.
- کلیدها از صفحهٔ کلیدهای API ساخته میشوند؛ در دیتابیس فقط هش ذخیره میشود.
- بدون کلید یا با کلید نامعتبر: پاسخ 401 invalid_api_key.
۲) فهرست مدلها
curl https://chat.acecr.ir/v1/models \ -H "Authorization: Bearer ***"
فهرست بهصورت خودکار بر اساس «مدلهای مجاز» حساب تو فیلتر میشود.
۳) چت — غیراستریم
curl https://chat.acecr.ir/v1/chat/completions \
-H "Authorization: Bearer ***" \
-H "Content-Type: application/json" \
-d '{
"model": "claude-sonnet-4-6-free",
"messages": [{"role": "user", "content": "Hello! Answer briefly."}],
"temperature": 0.7
}'
۴) چت — استریم (SSE)
curl -N https://chat.acecr.ir/v1/chat/completions \
-H "Authorization: Bearer ***" \
-H "Content-Type: application/json" \
-d '{
"model": "claude-sonnet-4-6-free",
"stream": true,
"stream_options": {"include_usage": true},
"messages": [{"role": "user", "content": "Write a fibonacci function in Python"}]
}'
خروجی: خطوط data: {…} با قطعههای chat.completion.chunk و پایانِ data: [DONE].
۵) پایتون (OpenAI SDK)
from openai import OpenAI
client = OpenAI(
base_url="https://chat.acecr.ir/v1",
api_key="***",
)
# غیراستریم
resp = client.chat.completions.create(
model="claude-sonnet-4-6-free",
messages=[{"role": "user", "content": "سلام"}],
)
print(resp.choices[0].message.content)
# استریم
for chunk in client.chat.completions.create(
model="claude-sonnet-4-6-free",
messages=[{"role": "user", "content": "یک شعر کوتاه بگو"}],
stream=True,
):
if chunk.choices and chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="")
۶) Node.js (OpenAI SDK)
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://chat.acecr.ir/v1",
apiKey: "***",
});
const stream = await client.chat.completions.create({
model: "claude-sonnet-4-6-free",
messages: [{ role: "user", content: "سلام" }],
stream: true,
});
for await (const chunk of stream) {
process.stdout.write(chunk.choices[0]?.delta?.content ?? "");
}
۷) JavaScript خام (fetch + استریم)
const res = await fetch("https://chat.acecr.ir/v1/chat/completions", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer ***",
},
body: JSON.stringify({
model: "claude-sonnet-4-6-free",
stream: true,
messages: [{ role: "user", content: "سلام" }],
}),
});
const reader = res.body.getReader();
const decoder = new TextDecoder();
while (true) {
const { done, value } = await reader.read();
if (done) break;
for (const line of decoder.decode(value).split("\n")) {
if (!line.startsWith("data: ") || line.includes("[DONE]")) continue;
const chunk = JSON.parse(line.slice(6));
const text = chunk.choices?.[0]?.delta?.content;
if (text) console.log(text);
}
}
۸) پارامترها
| پارامتر | الزامی | توضیح |
|---|---|---|
| model | بله | شناسهٔ مدل از /v1/models — مثل claude-sonnet-4-6-free |
| messages | بله | آرایهٔ پیامها با نقشهای system / user / assistant |
| stream | خیر | خروجی SSE تکهتکه |
| temperature | خیر | خلاقیت پاسخ (۰ تا ۲) |
| top_p | خیر | نمونهگیری هستهای |
| max_tokens | خیر | حداکثر توکن خروجی |
| stream_options.include_usage | خیر | ارسال مصرف توکن در انتهای استریم |
۹) خطاها
| کد | code | معنی و راهحل |
|---|---|---|
| 401 | invalid_api_key | کلید ارسال/معتبر نیست — هدر Bearer را بررسی کن |
| 403 | model_not_allowed | این مدل برای حساب تو فعال نیست — از ادمین بخواه |
| 404 | model_not_found | شناسهٔ مدل نادرست است — از /v1/models فهرست بگیر |
| 429 | rate_limit_exceeded | تعداد درخواستها زیاد است — کمی بعد دوباره تلاش کن |
| 429 | allowance_exhausted | سهمیهٔ ماهانهٔ حساب تمام شده — از پنل شارژ کن |
| 429 | key_allowance_exhausted | سهمیهٔ ماهانهٔ همین کلید تمام شده — کلید دیگری بساز |
| 502 | upstream_error | خطای موقت ارائهدهنده — دوباره تلاش کن |
۱۰) محدودیتها و نکات
- محدودیت نرخ: ۳۰ درخواست در دقیقه و ۲ استریم همزمان برای هر کاربر.
- مصرف با «توکن وزنی» حساب میشود (ضریب مدل × توکن) — سهمیهٔ ماهانهٔ حساب و کلید جداگانه اعمال میشود.
- پاسخها بهصورت خودکار بین ارائهدهندههای فعال مسیریابی میشوند (پایداری در خطا چکشده است).
- پشتیبانی Anthropic فعال است — POST /v1/messages (استریم و غیراستریم) با هدر x-api-key یا Bearer — بخش ۱۲ را ببین.
۱۱) مدل رایگان یا محلی (Ollama)؟
- هر سرویسِ سازگار با OpenAI با همین API کار میکند — در پنل → ارائهدهندهها یک ارائهدهندهٔ جدید با Base URL آن بساز، کلیدش را ثبت کن و مدلها را نگاشت کن.
- رایگانهای ابری: Google AI Studio (generativelanguage.googleapis.com/v1beta/openai)، OpenRouter (openrouter.ai/api/v1 — مدلهای :free)، Groq (api.groq.com/openai/v1) — این سه بهصورت پیشفرض در پنل هستند (غیرفعال؛ فقط کلید بگذار و فعال کن).
- سرور داخلی با Ollama: روی سرور ollama serve را بالا بیاور و یک مدل بگیر؛ بعد در Acecr AI ارائهدهندهٔ «Ollama (سرور محلی)» را با آدرس http://SERVER-IP:11434/v1 فعال کن (کلید لازم نیست — مقدار دلخواه بگذار).
۱۲) سازگاری Anthropic — /v1/messages
curl https://chat.acecr.ir/v1/messages \
-H "x-api-key: ***" \
-H "anthropic-version: 2023-06-01" \
-H "Content-Type: application/json" \
-d '{
"model": "claude-sonnet-4-6-free",
"max_tokens": 200,
"system": "پاسخ خیلی کوتاه بده",
"messages": [{"role": "user", "content": "سلام!"}]
}'
همان کلیدهای sk-mn-… کار میکنند؛ با SDK رسمی Anthropic هم فقط base_url را عوض کن. پارامتر stream: true هم پشتیبانی میشود.
💡 هر بلوک کد بالا دکمهٔ «کپی» دارد — کلیدت را جای *** بگذار و مستقیم اجرا کن.