نِت اَرز رابط OpenAI را پیادهسازی میکند؛ بنابراین مهاجرت یعنی تغییر دو مقدار: آدرس پایه و کلید. نام مدلها، ساختار پیامها، پارامترها، شکل پاسخ و حتی شکل خطاها همان است.
Python
from openai import OpenAI
client = OpenAI(api_key="sk-proj-...")
from openai import OpenAI
client = OpenAI(
api_key="sk-ntz-v1-...",
base_url="https://netarz.ir/api/ai/v1",
)
Node.js / TypeScript
import OpenAI from "openai";
const client = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });
import OpenAI from "openai";
const client = new OpenAI({
apiKey: process.env.NETARZ_API_KEY,
baseURL: "https://netarz.ir/api/ai/v1",
});
بدون تغییر کد: متغیرهای محیطی
SDK رسمی OpenAI (پایتون و Node) متغیرهای OPENAI_API_KEY و OPENAI_BASE_URL را خودش میخواند. اگر کدتان را نمیخواهید دست بزنید:
# بدون هیچ تغییری در کد — SDK رسمی این دو متغیر را خودش میخواند:
export OPENAI_API_KEY="sk-ntz-v1-..."
export OPENAI_BASE_URL="https://netarz.ir/api/ai/v1"
حالا Claude و Gemini هم با همان کد
پس از مهاجرت، مدلهای ارائهدهندگان دیگر فقط با تغییر مقدار model در دسترساند. ترجمهٔ درخواست به پروتکل هر ارائهدهنده (مثلاً Gemini API گوگل) در سمت نِت اَرز انجام میشود. یک نکته را یادتان باشد: اتصال مستقیم به Anthropic باز نیست، پس شناسهٔ Claude همیشه با openrouter/ شروع میشود.
# همان کد، مدل دیگر — هیچ SDK جدیدی لازم نیست
# Claude با پیشوند openrouter/ میآید؛ Gemini و DeepSeek مستقیم وصلاند.
for model in ["gpt-4o-mini", "openrouter/anthropic/claude-sonnet-4.5", "gemini-3.5-flash", "deepseek-v4-pro"]:
r = client.chat.completions.create(
model=model,
messages=[{"role": "user", "content": "در یک جمله خودتان را معرفی کنید."}],
max_tokens=80,
)
print(model, "→", r.choices[0].message.content)
چه چیزهایی دقیقاً یکسان است
- Endpointها:
/chat/completions،/completions،/responses،/embeddings،/images/generations،/audio/*و/models. مسیر/moderationsهم همان شکل را دارد، ولی فعلاً هیچ مدل پایش محتوایی روی درگاه نیست؛ توضیح. - ساختار پیامها و نقشها (
system،developer،user،assistant،tool)، محتوای چندبخشی (متن + تصویر)، ابزارها وtool_choice،response_format. - استریم با
stream: true: رویدادهایchat.completion.chunkو پایان باdata: [DONE]. - شکل خطا:
{"error": {"message", "type", "code", "param"}}با همان کدهای HTTP (400/401/402/403/404/429/5xx).
تفاوتهای کوچک که باید بدانید
| مورد | در نِت اَرز |
|---|---|
id پاسخ | شناسهٔ درخواست نِت اَرز است (req_…) و در هدر X-Request-Id هم میآید؛ با GET /requests/{id} قابل پیگیری است. |
model پاسخ | همان شناسهای است که فرستادهاید (نه نام داخلی ارائهدهنده). |
user | برای حفاظت از حریم خصوصی، با شناسهٔ حساب شما در نِت اَرز جایگزین میشود (بهجز در /responses). |
stream_options، store، service_tier، safety_identifier | حذف میشوند. usage در استریم همیشه بهطور خودکار در آخرین رویداد میآید. |
n | حداکثر ۴ (در Chat Completions). |
| خطای ۴۰۲ | کد insufficient_credit وقتی اعتبار برای رزرو درخواست کافی نیست. بیشتر |
| اندازهٔ درخواست | حداکثر ۲۰ مگابایت برای بدنهٔ JSON و ۲۵ مگابایت برای فایل صوتی. |
پشتیبانی نمیشود
این بخشهای پلتفرم OpenAI در حال حاضر از طریق نِت اَرز در دسترس نیستند: Assistants، Files، Fine-tuning، Batch، Vector Stores و Uploads. اگر به یکی از اینها نیاز دارید به پشتیبانی بگویید. Realtime روی WebSocket در دسترس است و کدی که برای OpenAI Realtime API نوشتهاید با عوض کردن نشانی و کلید کار میکند (اتصال زنده).
n8n، Dify، Flowise، Open WebUI، Cursor، Continue، LangChain، LlamaIndex و Vercel AI SDK همگی «OpenAI-compatible base URL» میپذیرند. نمونههای تنظیم در صفحهٔ SDKها.