مستندات API هوش مصنوعی
دو نشانی، یک کلید. هر چیزی که در این صفحه است از همان کدی آمده که درخواست شما را پاسخ میدهد.
کلید را از پنل بگیرید
حساب کسبوکار بیدرنگ ساخته میشود و کلید را خودتان میسازید.
احراز هویت
کلید را در هدر Authorization بفرستید. هدر x-api-key هم پذیرفته میشود.
Authorization: Bearer ehr_live_…⚠️ کلید فقط سمت سرور نگهداری شود. کلیدی که در جاوااسکریپت مرورگر یا اپلیکیشن موبایل بنشیند، در دسترس هر کسی است که ابزار توسعهدهندهٔ مرورگر را باز کند.
اگر IP سرورتان ثابت است، هنگام ساخت کلید فهرست IP مجاز را پر کنید؛ آنوقت کلیدِ نشتکرده از جای دیگر کار نمیکند.
گفتوگو با مدل زبانی
POST https://ehrazino.com/api/v1/ai/chat/completions/
{
"model": "gemini-flash",
"messages": [
{ "role": "system", "content": "پاسخها را کوتاه و فارسی بده." },
{ "role": "user", "content": "پایتخت ایران کجاست؟" }
],
"max_tokens": 200,
"temperature": 0.3
}| فیلد | لازم | توضیح |
|---|---|---|
model | بله | نام مدل، از جدول «مدلهای در دسترس». |
messages | بله | آرایهای از پیامها. هر پیام role (system | user | assistant) و content دارد. نقش ناشناخته رد میشود و بیصدا به user تبدیل نمیشود. |
max_tokens | خیر | سقف طول پاسخ. بیشتر از سقف مدل بفرستید تا همان سقف کوتاه میشود. نفرستید، سقف پیشفرض مدل اعمال میشود. |
temperature | خیر | میزان تنوع پاسخ. نفرستید، پیشفرض مدل. |
stream | خیر | true یعنی پاسخ تکهتکه و بهصورت SSE بیاید. |
پاسخ موفق
{
"ok": true,
"requestId": "req_7f3c…",
"model": "gemini-flash",
"content": "تهران.",
"usage": { "promptTokens": 42, "completionTokens": 3 },
"finishReason": "stop",
"billing": { "amountRial": 710, "balanceRial": 48912340 }
}🔴 billing.amountRial مبلغی است که واقعاً کسر شد و نه سقفی که پیش از تماس قفل شده بود. تفاوت این دو همان لحظه به موجودی برمیگردد.
requestId را نگه دارید. تنها چیزی است که برای پیگیری یک فراخوان در پشتیبانی به کار میآید — چون متن پیامها را نگه نمیداریم.
پاسخ جریانی
با فرستادن "stream": true، پاسخ بهصورت text/event-stream تکهتکه میآید. هر تکه یک خط data: است.
data: {"requestId":"req_7f3c…","delta":"ته"}
data: {"requestId":"req_7f3c…","delta":"ران."}
data: {"requestId":"req_7f3c…","done":true,"usage":{"promptTokens":42,"completionTokens":3},"billing":{"amountRial":710}}
data: [DONE]⚠️ صورتحساب در تکهٔ پایانی میآید، نه در ابتدا — چون هزینه تا پایان تولید معلوم نیست. اگر ارتباط را وسط کار قطع کنید، بابت همان مقداری که تولید شده هزینه کسر میشود؛ مدل تا آن لحظه کار کرده است.
اگر پیش از شروع جریان خطایی رخ دهد — کلید نامعتبر، موجودی ناکافی، مدل خاموش — پاسخ یک JSON معمولی با کد وضعیت مناسب است و نه جریان. پس همیشه content-type را بررسی کنید.
تولید تصویر
POST https://ehrazino.com/api/v1/ai/images/
{
"model": "nano-banana",
"input": {
"prompt": "یک فنجان قهوه روی میز چوبی، نور طبیعی"
}
}🔴 محتوای input دستنخورده به مدل میرود و ما اعتبارسنجیاش نمیکنیم. هر مدل ورودیهای خودش را دارد (prompt، image، aspect_ratio…). اگر مدل ورودی را رد کند، invalid_input برمیگردد و هزینهای ندارد.
این تصمیم عمدی است: نگاشتکردن ورودی هر مدل در سمت ما یعنی هر مدل تازه یک تغییر کد بخواهد، و مدلی که ورودی تازهای اضافه کند بیصدا از دسترس خارج شود.
پاسخ موفق
{
"ok": true,
"requestId": "req_9b1d…",
"model": "nano-banana",
"output": ["https://…/output.png"],
"billing": { "amountRial": 531300, "balanceRial": 48381040 }
}output همان چیزی است که مدل برگردانده و شکلش به مدل بستگی دارد — معمولاً فهرستی از نشانی تصویر. مهلت این مسیر بلندتر از گفتوگوست؛ timeout سمت خودتان را دستکم ۱۲۰ ثانیه بگذارید.
خطاها
هر پاسخ ناموفق همین شکل را دارد و کد وضعیت HTTP هم با آن میخواند:
{
"ok": false,
"requestId": "req_7f3c…",
"error": { "code": "insufficient_funds", "message": "…" },
"billing": { "amountRial": 0, "balanceRial": 120000 }
}| وضعیت | کد | معنا و کاری که باید کرد |
|---|---|---|
| ۴۰۰ | invalid_json | بدنه JSON معتبر نیست. هزینهای ندارد. |
| ۴۰۰ | invalid_input | نام مدل نیامده، فهرست پیامها نامعتبر است، یا مدل ورودی را رد کرده. هزینهای ندارد. |
| ۴۰۱ | unauthorized | کلید نیامده یا معتبر نیست. کلید تازه را از پنل بسازید. |
| ۴۰۳ | ip_not_allowed | IP فراخوان در فهرست مجاز کلید نیست. فهرست را در پنل بهروز کنید. |
| ۴۰۳ | model_not_enabled | این مدل همین حالا ارائه نمیشود. جدول «مدلهای در دسترس» را ببینید. |
| ۴۰۳ | organization_inactive | حساب کسبوکار فعال نیست. با پشتیبانی تماس بگیرید. |
| ۴۰۲ | insufficient_funds | موجودی برای سقف این فراخوان کافی نیست. پیام میگوید سقف چقدر است. پنل را شارژ کنید. |
| ۴۰۴ | unknown_model | چنین مدلی وجود ندارد. املای نام مدل را بررسی کنید. |
| ۴۲۹ | rate_limited | سقف فراخوان در دقیقه رد شده. به اندازهٔ Retry-After صبر کنید. هزینهای ندارد. |
| ۵۰۳ | model_unavailable | مدل پاسخ نداد یا در مهلت مقرر نرسید. قابل تلاش دوباره. هزینهای ندارد. |
| ۵۰۳ | ai_disabled | ارائهٔ هوش مصنوعی موقتاً بسته است. سرویسهای استعلام مستقلاند و باز میمانند. |
| ۵۰۳ | api_disabled | ارائهٔ API موقتاً بهکلی بسته است. با پشتیبانی تماس بگیرید. |
| ۵۰۳ | pricing_unavailable | پیکربندی قیمتگذاری ناقص است. خطای ماست و نه شما؛ با پشتیبانی تماس بگیرید. |
| ۴۰۰ | wrong_endpoint | مدل توکنی را به نشانی تصویر فرستادهاید. از /api/v1/ai/chat/completions/ استفاده کنید. هزینهای ندارد. |
| ۵۰۴ | timeout | تولید تصویر در مهلت مقرر تمام نشد. هزینهای ندارد؛ ضررش با ماست. دوباره تلاش کنید. |
| ۵۰۰ | internal_error | خطای پیشبینینشدهٔ ما. شناسهٔ درخواست را به پشتیبانی بدهید. |
⚠️ 429 هدر Retry-After دارد؛ بهجای تلاش فوری، همان اندازه صبر کنید.
صورتحساب
- پیش از تماس با مدل، سقف هزینه از موجودی قفل میشود. پس از پاسخ، مبلغ واقعی کسر و باقی همان لحظه آزاد میشود.
- سقف خروجی را با
max_tokensخودتان تعیین میکنید. اگر نفرستید، سقف پیشفرض همان مدل اعمال میشود. - ورودی نامعتبر، در دسترس نبودن مدل و عبور از سقف نرخ هزینهای ندارند.
- اگر ارائهدهنده شمار توکن را گزارش نکند، فراخوان رایگان حساب میشود. ضررش با ماست، نه شما.
برای برآورد پیش از مصرف، ماشینحساب قیمت متن خودتان را میگیرد و عدد میدهد. شرح کلی سرویس و کاربردهایش در صفحهٔ API هوش مصنوعی است.
مدلهای در دسترس
فهرست مدلها همین حالا در دسترس نیست. برای دریافت فهرست با ما تماس بگیرید.
نمونهٔ کد
curl
curl -X POST 'https://ehrazino.com/api/v1/ai/chat/completions/' \
-H 'Authorization: Bearer ehr_live_…' \
-H 'Content-Type: application/json' \
-d '{"model":"gemini-flash","messages":[{"role":"user","content":"سلام"}],"max_tokens":200}'Node.js
const response = await fetch('https://ehrazino.com/api/v1/ai/chat/completions/', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.EHRAZINO_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
model: 'gemini-flash',
messages: [{ role: 'user', content: prompt }],
max_tokens: 200,
}),
});
const body = await response.json();
if (body.ok) {
console.log(body.content, body.billing.amountRial);
}Python
import os, requests
response = requests.post(
"https://ehrazino.com/api/v1/ai/chat/completions/",
headers={"Authorization": f"Bearer {os.environ['EHRAZINO_API_KEY']}"},
json={
"model": "gemini-flash",
"messages": [{"role": "user", "content": prompt}],
"max_tokens": 200,
},
timeout=120,
)
body = response.json()
if body.get("ok"):
print(body["content"], body["billing"]["amountRial"])PHP / وردپرس
$response = wp_remote_post( 'https://ehrazino.com/api/v1/ai/chat/completions/', array(
'timeout' => 120,
'headers' => array(
'Authorization' => 'Bearer ' . EHRAZINO_API_KEY,
'Content-Type' => 'application/json',
),
'body' => wp_json_encode( array(
'model' => 'gemini-flash',
'messages' => array( array( 'role' => 'user', 'content' => $prompt ) ),
'max_tokens' => 200,
) ),
) );
if ( is_wp_error( $response ) ) {
return; // شبکه قطع بود — دوباره تلاش کنید.
}
$body = json_decode( wp_remote_retrieve_body( $response ), true );
if ( ! empty( $body['ok'] ) ) {
// $body['content'] پاسخ مدل است.
}⚠️ مهلت (timeout) را دستکم ۱۲۰ ثانیه بگذارید. پاسخهای بلند زمان میبرند و مهلت کوتاه یعنی شما پاسخ را نمیبینید در حالی که صورتحسابش صادر شده.
آنچه نگه نمیداریم
متن پیامها و پاسخ مدل ذخیره نمیشود. از هر فراخوان فقط نام مدل، وضعیت، شمار توکن، مبلغ و زمان ثبت میشود — همان چیزی که در بخش هوش مصنوعی پنل میبینید.
