پرش به مطلب اصلی

مرجع API

API هوش مصنوعی نوین کلاود کاملاً سازگار با استاندارد OpenAI است. هر کتابخانه یا ابزاری که با OpenAI کار می‌کند، تنها با تغییر base_url و api_key به نوین کلاود متصل می‌شود.

آدرس پایه​

https://iapi.novin.cloud/v1

احراز هویت​

کلید API را در هدر Authorization قرار دهید:

Authorization: Bearer sk-xxxxxxxxxxxxxxxxxxxx

ساخت کلید: کلیدهای API.

اتصال کتابخانه‌های رسمی​

Python
from openai import OpenAI

client = OpenAI(
api_key=os.environ["NOVIN_API_KEY"],
base_url="https://iapi.novin.cloud/v1",
)
Node.js / TypeScript
import OpenAI from "openai";

const client = new OpenAI({
apiKey: process.env.NOVIN_API_KEY,
baseURL: "https://iapi.novin.cloud/v1",
});
LangChain
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(
model="openai/gpt-4o",
api_key=os.environ["NOVIN_API_KEY"],
base_url="https://iapi.novin.cloud/v1",
)
متغیر محیطی (بدون تغییر کد)

بسیاری از ابزارها این دو متغیر را می‌خوانند:

export OPENAI_API_KEY="sk-xxxxxxxxxxxx"
export OPENAI_BASE_URL="https://iapi.novin.cloud/v1"

POST /v1/chat/completions​

اصلی‌ترین endpoint برای گفتگو با مدل‌ها.

پارامترهای اصلی​

پارامترنوعالزامیتوضیح
modelstring✅شناسه مدل، مثل openai/gpt-4o
messagesarray✅آرایه پیام‌های گفتگو
streamboolean❌دریافت پاسخ به‌صورت تدریجی (پیش‌فرض false)
max_tokensinteger❌حداکثر توکن پاسخ
temperaturenumber❌میزان خلاقیت، بین 0 تا 2 (پیش‌فرض 1)
top_pnumber❌نمونه‌گیری تجمعی، بین 0 تا 1
stopstring | array❌رشته‌هایی که با دیدن آن‌ها تولید متوقف شود
toolsarray❌تعریف توابع قابل فراخوانی
response_formatobject❌اجبار خروجی به JSON

ساختار messages​

[
{"role": "system", "content": "تو یک دستیار فارسی‌زبان هستی."},
{"role": "user", "content": "سلام"},
{"role": "assistant", "content": "سلام! چطور می‌توانم کمک کنم؟"},
{"role": "user", "content": "پایتخت ایران کجاست؟"}
]
نقشکاربرد
systemتعیین رفتار کلی مدل — در ابتدای آرایه
userپیام کاربر
assistantپاسخ قبلی مدل، برای حفظ تاریخچه

راهنمای temperature​

مقداررفتارمناسب برای
0 تا 0.3دقیق و قابل تکراراستخراج داده، دسته‌بندی، پاسخ واقعی
0.7 تا 1.0متعادلگفتگوی عمومی
1.2 تا 2.0خلاقانه و متنوعایده‌پردازی، داستان‌نویسی

نمونه درخواست​

curl https://iapi.novin.cloud/v1/chat/completions \
-H "Authorization: Bearer $NOVIN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "openai/gpt-4o",
"messages": [
{"role": "system", "content": "تو یک دستیار فارسی‌زبان هستی."},
{"role": "user", "content": "سه نکته برای یادگیری برنامه‌نویسی بگو"}
],
"temperature": 0.7,
"max_tokens": 500
}'

ساختار پاسخ​

{
"id": "chatcmpl-abc123",
"object": "chat.completion",
"created": 1750000000,
"model": "openai/gpt-4o",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "متن پاسخ مدل..."
},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 25,
"completion_tokens": 150,
"total_tokens": 175
}
}

مقادیر finish_reason​

مقدارمعنی
stopپاسخ به‌طور طبیعی تمام شد
lengthبه سقف max_tokens رسید — پاسخ ناقص است
tool_callsمدل درخواست فراخوانی تابع کرده است
content_filterمحتوا توسط فیلتر ایمنی مسدود شد

استریمینگ​

با stream: true پاسخ به‌صورت Server-Sent Events ارسال می‌شود.

هر خط با data: شروع می‌شود و پایان جریان با data: [DONE] مشخص می‌گردد:

data: {"choices":[{"delta":{"content":"سلام"}}]}

data: {"choices":[{"delta":{"content":" دنیا"}}]}

data: [DONE]

با کتابخانه رسمی​

stream = client.chat.completions.create(
model="openai/gpt-4o",
messages=[{"role": "user", "content": "یک شعر کوتاه بگو"}],
stream=True,
)

for chunk in stream:
delta = chunk.choices[0].delta.content
if delta:
print(delta, end="", flush=True)

پردازش دستی در JavaScript​

const response = await fetch(
"https://iapi.novin.cloud/v1/chat/completions",
{
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${apiKey}`,
},
body: JSON.stringify({
model: "openai/gpt-4o",
messages: [{ role: "user", content: "سلام" }],
stream: true,
}),
}
);

const reader = response.body.getReader();
const decoder = new TextDecoder();
let buffer = "";

while (true) {
const { done, value } = await reader.read();
if (done) break;

buffer += decoder.decode(value, { stream: true });
const lines = buffer.split("\n");
buffer = lines.pop() ?? "";

for (const line of lines) {
if (!line.startsWith("data: ")) continue;
const data = line.slice(6).trim();
if (data === "[DONE]") break;

const chunk = JSON.parse(data);
const delta = chunk.choices?.[0]?.delta?.content;
if (delta) process.stdout.write(delta);
}
}
یادداشت

در حالت استریم، بخش usage معمولاً در انتهای جریان ارسال می‌شود. برای گزارش دقیق مصرف، به صفحه مصرف مراجعه کنید.


GET /v1/models​

فهرست مدل‌های در دسترس کلید شما.

curl https://iapi.novin.cloud/v1/models \
-H "Authorization: Bearer $NOVIN_API_KEY"
{
"object": "list",
"data": [
{
"id": "openai/gpt-4o",
"object": "model",
"created": 1750000000,
"owned_by": "openai"
}
]
}

مقدار id همان چیزی است که باید در پارامتر model بفرستید.


خروجی JSON​

برای دریافت پاسخ ساختاریافته و قابل پردازش:

response = client.chat.completions.create(
model="openai/gpt-4o",
messages=[
{"role": "system", "content": "خروجی را فقط به صورت JSON بده."},
{"role": "user", "content": "نام و پایتخت سه کشور آسیایی"},
],
response_format={"type": "json_object"},
)
نکته

هنگام استفاده از response_format، کلمه «JSON» را در پیام سیستمی هم ذکر کنید تا مدل ساختار درست‌تری تولید کند.


فراخوانی تابع (Function Calling)​

مدل‌های دارای این قابلیت می‌توانند تشخیص دهند برای پاسخ به کاربر لازم است تابعی از سمت شما فراخوانی شود.

tools = [{
"type": "function",
"function": {
"name": "get_weather",
"description": "دریافت وضعیت آب و هوای یک شهر",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string", "description": "نام شهر"}
},
"required": ["city"],
},
},
}]

response = client.chat.completions.create(
model="openai/gpt-4o",
messages=[{"role": "user", "content": "هوای تهران چطوره؟"}],
tools=tools,
)

tool_call = response.choices[0].message.tool_calls[0]
print(tool_call.function.name) # get_weather
print(tool_call.function.arguments) # {"city": "تهران"}

مدل خودش تابع را اجرا نمی‌کند؛ فقط می‌گوید چه تابعی با چه ورودی‌هایی باید صدا زده شود. اجرای تابع و بازگرداندن نتیجه به مدل بر عهده شماست.

فهرست مدل‌های پشتیبان این قابلیت: مدل‌ها.


کدهای خطا​

کدمعنیاقدام
400درخواست نامعتبرساختار messages و پارامترها را بررسی کنید
401کلید نامعتبرکلید را بررسی کنید؛ ممکن است حذف یا منقضی شده باشد
402موجودی ناکافیکیف پول را شارژ کنید
404مدل یافت نشدشناسه مدل را با /v1/models مطابقت دهید
429عبور از محدودیت نرخصبر کنید یا RPM/TPM کلید را افزایش دهید
500 / 502 / 503خطای سمت سرویسبا تأخیر فزاینده دوباره تلاش کنید

تلاش مجدد هوشمند​

برای خطاهای 429 و 5xx، با تأخیر فزاینده (exponential backoff) دوباره تلاش کنید:

import time
from openai import RateLimitError, APIError

def ask_with_retry(messages, model="openai/gpt-4o", retries=4):
for attempt in range(retries):
try:
return client.chat.completions.create(
model=model, messages=messages
)
except (RateLimitError, APIError):
if attempt == retries - 1:
raise
time.sleep(2 ** attempt) # ۱، ۲، ۴، ۸ ثانیه
هشدار

برای خطاهای 401، 402 و 404 تلاش مجدد نکنید — این خطاها با تکرار برطرف نمی‌شوند و فقط باعث فشار اضافی می‌شوند.

گام بعدی​