uttapen

OpenRouter چیست و یوتاپن چه فرقی با آن دارد؟ (شفاف)

یوتاپن مدل‌ها را از OpenRouter می‌گیرد و کیف پول تومانی، پنل داخل ایران و پشتیبانی فارسی به آن اضافه می‌کند. مسیر درخواست، محدودیت‌ها و انتخاب بین دو.

۱۶ شهریور ۱۴۰۵ · ۹ دقیقه مطالعه · تیم یوتاپن

اگر دنبال «openrouter ایران» گشته‌ای، احتمالاً دو سؤال داری: OpenRouter دقیقاً چیست و آیا می‌شود از ایران با آن کار کرد؛ و اگر یوتاپن هم از OpenRouter استفاده می‌کند، پس چرا از خودش استفاده نکنم. این مقاله جواب هر دو را بدون بازاریابی می‌دهد. بعضی جاها نتیجه به نفع ما نیست و همان را هم می‌نویسیم، چون برنامه‌نویسی که بعداً حقیقت را کشف کند، دیگر برنمی‌گردد.

OpenRouter چیست

OpenRouter یک تجمیع‌کنندهٔ API مدل‌های زبانی است. به‌جای اینکه با OpenAI، Anthropic، Google، DeepSeek و ده‌ها ارائه‌دهندهٔ دیگر جداگانه قرارداد ببندی و کلید بگیری، یک کلید از OpenRouter می‌گیری و با یک API سازگار با OpenAI به همهٔ مدل‌ها دسترسی داری. شناسهٔ مدل به شکل provider/model است (مثل deepseek/deepseek-chat) و اگر مدلی چند ارائه‌دهنده داشته باشد، OpenRouter بین آن‌ها مسیریابی می‌کند: ارزان‌ترین، سریع‌ترین، یا آنی که تو مشخص کرده‌ای.

پرداخت به ارز خارجی و با کارت بین‌المللی یا رمزارز است. اعتبار پیش‌پرداخت می‌خری، هر درخواست از آن کم می‌شود و پنل آن مصرف را نشان می‌دهد. برای برنامه‌نویسی که خارج از ایران است یا ابزار پرداخت خارجی دارد، این یکی از راحت‌ترین راه‌های دسترسی به چند مدل هم‌زمان است.

از ایران چه اتفاقی می‌افتد؟ خودِ API OpenRouter از IP ایران جواب می‌دهد (خطای احراز هویت، نه بلاک کشوری)، ولی مشکل اصلی جای دیگری است: نمی‌توانی اعتبار بخری، سیاست‌های ارائه‌دهنده‌های زیرین دربارهٔ IP ایران یکسان نیست، و هر روز باید نگران این باشی که کدام لایه امروز بسته شده. بیشتر تیم‌های ایرانی که مستقیم از OpenRouter استفاده می‌کنند، این کار را با اکانت واسطه، کارت شخص ثالث و سرور خارج از کشور انجام می‌دهند — که هر کدام یک نقطهٔ شکست است و هیچ‌کدام فاکتور رسمی نمی‌دهد.

یوتاپن دقیقاً چه چیزی روی OpenRouter اضافه می‌کند

بگذار مسیر یک درخواست را دنبال کنیم. کد تو با SDK رسمی OpenAI به https://api.uttapen.ir/v1 می‌زند. این سرور داخل ایران است: کلید sk-up-… تو را چک می‌کند، قیمت مدل را از کاتالوگ می‌خواند، مبلغی به‌عنوان hold از کیف پول تومانی‌ات کنار می‌گذارد و درخواست را — بدون کلید تو و بدون هدرهای شناسایی — به یک relay بی‌حالت خارج از ایران می‌فرستد. relay فقط nginx است؛ هیچ داده‌ای ذخیره نمی‌کند و هیچ کلیدی از کاربران ندارد. از آنجا درخواست با اکانت OpenRouter شرکت به upstream می‌رود، جواب همان مسیر را برمی‌گردد، و در پایان هزینهٔ قطعی درخواست به تومان از کیف پولت کم می‌شود؛ مابه‌التفاوت hold آزاد می‌شود.

پس چیزهایی که اضافه می‌شود:

  • پرداخت تومانی از درگاه داخلی؛ حداقل شارژ پنجاه هزار تومان، بدون کارت خارجی، بدون واسطه.
  • پنل و داده داخل ایران: کلیدها، کیف پول، گزارش مصرف و فاکتور همه روی سرور ایران است و بدون VPN باز می‌شود.
  • کلید با سقف ماهانه و مدل‌های مجاز: می‌توانی برای هر پروژه کلیدی با سقف تومانی بسازی تا یک باگ حلقهٔ بی‌نهایت، کل موجودی را نسوزاند.
  • هزینهٔ هر درخواست به تومان در هدر پاسخ (X-Uttapen-Cost-Toman) و مجموع ماهانه در GET /v1/uttapen/me؛ هیچ تبدیل ارزی روی دوش تو نیست.
  • قیمت نهایی و شفاف به تومان برای هر مدل در /v1/models و صفحهٔ مدل؛ عددی که می‌بینی همان است که پرداخت می‌کنی، بدون کارمزد پنهان یا مالیات جداگانه.
  • پشتیبانی فارسی توسط کسانی که خودشان با همین مدل‌ها کد می‌زنند.
  • عدم وابستگی به IP: هیچ درخواستی با IP ایران به OpenRouter نمی‌رسد، چون همه از relay عبور می‌کند. این یعنی سیاست‌های upstream دربارهٔ ایران روی تو اثر نمی‌گذارد.

و چیزهایی که اضافه نمی‌شود، چون نمی‌توانیم: ما مدل نداریم. کیفیت، سرعت و در دسترس بودن هر مدل همان است که از OpenRouter و ارائه‌دهندهٔ زیرین می‌آید. اگر OpenRouter از کار بیفتد، ما هم از کار می‌افتیم.

قیمت‌ها چطور اعلام می‌شوند

هر مدل در کاتالوگ یک قیمت نهایی تومانی دارد: به‌ازای یک میلیون توکن ورودی، یک میلیون توکن خروجی، و اگر مدل ورودی تصویر یا قیمت کش داشته باشد، برای آن‌ها هم جداگانه. این قیمت‌ها در GET /v1/models (بدون نیاز به کلید) و در صفحهٔ هر مدل منتشر می‌شوند و روزانه به‌روز می‌شوند — مثلاً GPT-5 و DeepSeek Chat دو سر طیف قیمت‌اند و هر دو با همان یک کلید کار می‌کنند. قیمت تومانی ما هزینهٔ زیرساخت داخل ایران، relay، درگاه پرداخت و پشتیبانی را هم در بر دارد؛ روش محاسبه داخلی است و منتشر نمی‌شود، ولی عدد نهایی همیشه قبل از استفاده جلوی چشمت هست.

چند قاعدهٔ مالی که باید بدانی، چون روی کدت اثر می‌گذارد:

  • قبل از ارسال، hold؛ بعد از پاسخ، هزینهٔ قطعی. برآورد hold از تعداد توکن ورودی و max_tokens ساخته می‌شود. اگر max_tokens نفرستی، سقف بزرگی فرض می‌شود و با موجودی کم ممکن است 402 بگیری در حالی که هزینهٔ واقعی چند تومان است. پس max_tokens بفرست.
  • هزینهٔ قطعی بر اساس مصرف واقعی است، نه برآورد: توکن‌های ورودی، خروجی، توکن‌های استدلال مدل‌های reasoning و تصویر. اگر مدلی ورودی کش‌شده را ارزان‌تر حساب کند، همان در هزینهٔ تومانی تو منعکس می‌شود.
  • قیمتِ لحظهٔ شروع درخواست برای همان درخواست ثابت است. اگر وسط یک استریم طولانی کاتالوگ به‌روز شود، درخواستِ در حال اجرا با قیمت قبلی بسته می‌شود.
  • مدل‌های رایگان واقعاً صفر تومان‌اند و حتی بدون شارژ کار می‌کنند، با سقف روزانه برای هر کاربر.

یک کد، دو مقصد

بهترین راه برای فهمیدن «فرق» این است که ببینی کد تقریباً یکسان است. اسکریپت زیر با آرگومان openrouter یا uttapen اجرا می‌شود و تنها تفاوت، base_url و کلید است. برای مقصد uttapen، هدرهای هزینه و موجودی هم چاپ می‌شود.

# compare.py — یک کد، دو دروازه؛ فقط base_url و کلید فرق می‌کند
import os, sys
from openai import OpenAI

TARGETS = {
    "openrouter": ("https://openrouter.ai/api/v1", os.getenv("OPENROUTER_API_KEY")),
    "uttapen":    (os.getenv("UTTAPEN_BASE_URL", "https://api.uttapen.ir/v1"), os.getenv("UTTAPEN_API_KEY")),
}
name = sys.argv[1] if len(sys.argv) > 1 else "uttapen"
base_url, key = TARGETS[name]
client = OpenAI(base_url=base_url, api_key=key)

raw = client.chat.completions.with_raw_response.create(
    model="deepseek/deepseek-chat",
    messages=[{"role": "user", "content": "یک جملهٔ کوتاه دربارهٔ کوه دماوند بنویس."}],
    max_tokens=60,
)
resp = raw.parse()
print(resp.choices[0].message.content)
print("usage:", resp.usage.prompt_tokens, "in /", resp.usage.completion_tokens, "out")
if name == "uttapen":
    h = raw.headers
    print("cost:", h["X-Uttapen-Cost-Toman"], "toman   balance:", h["X-Uttapen-Balance-Toman"], "toman")
    print("request id:", h["X-Uttapen-Request-Id"])

خروجی سمت یوتاپن شبیه این است (متن پاسخ بستگی به مدل دارد):

usage: 26 in / 24 out
cost: 3.914050 toman   balance: 95841.692193 toman
request id: 01a078e3-362e-75dc-83b1-f781892a942f

دو هدر آخر همان چیزی است که در OpenRouter نداری: هزینهٔ همین درخواست به تومان و موجودی بعد از آن، به‌علاوهٔ یک شناسهٔ درخواست که اگر روزی اختلاف حساب داشتی، با همان در پنل و لاگ پیدا می‌شود. وضعیت کلی حساب هم با یک درخواست ساده می‌آید:

curl -s https://api.uttapen.ir/v1/uttapen/me \
  -H "Authorization: Bearer $UTTAPEN_API_KEY" | python3 -m json.tool
{
  "key": { "name": "test", "prefix": "sk-up-62nBtYlq", "monthly_limit_toman": null,
           "spent_this_month_toman": "4131.932807", "rate_limit_rpm": 60, "allowed_models": null },
  "wallet": { "balance_toman": "95841.692193", "held_toman": "0.000000", "available_toman": "95841.692193" },
  "user": { "id": "…", "phone_masked": "0912***0001" },
  "prices_updated_at": "2026-09-06T22:18:20Z"
}

اگر استریم می‌کنی و هدر پاسخ برایت دیر است، هدر X-Uttapen-Include-Meta: 1 را بفرست تا قبل از [DONE] یک رویداد اضافه با cost_toman، balance_toman و hold_toman بیاید؛ بدون این هدر، استریم دقیقاً فرمت OpenAI است. جزئیات در مستندات استریم.

چه چیزهایی از OpenRouter عبور می‌کند و چه چیزهایی نه

چون gateway ما passthrough است، تقریباً همهٔ قابلیت‌های OpenRouter در دسترس‌اند: استریم، tool calling، ورودی تصویر و فایل، response_format، پارامترهای reasoning، و حتی فیلد provider برای انتخاب ارائه‌دهندهٔ ترجیحی و فیلد models برای fallback. فهرست مدل‌ها هم همان کاتالوگ کامل است — بیش از ۴۰۰ مدل، شامل مدل‌های رایگان — که هر ساعت همگام می‌شود.

چند چیز فعلاً فرق دارد یا نیست:

  • endpoint /v1/responses (API جدید OpenAI) هنوز فعال نیست و 404 با پیام راهنما برمی‌گرداند؛ /v1/chat/completions و /v1/embeddings کار می‌کنند.
  • BYOK (آوردن کلید خودت از ارائه‌دهنده) نداریم.
  • داشبورد OpenRouter برای مقایسهٔ تأخیر ارائه‌دهنده‌ها اینجا نیست؛ فقط گزارش مصرف خودت را داری.
  • در فاز اول SLA رسمی نداریم. uptime را جدی می‌گیریم ولی قول کتبی نمی‌دهیم.
  • در پیام‌های خطای upstream، اسم OpenRouter به «upstream» تغییر داده می‌شود. این برای تمیزی پیام است، نه پنهان‌کاری؛ همین مقاله و مستندات به‌صراحت می‌گویند تأمین‌کننده کیست.

تأخیر و حریم خصوصی

مسیر ایران به relay به upstream و برگشت، حدود صد میلی‌ثانیه به هر درخواست اضافه می‌کند. برای استریم چت محسوس نیست، چون اولین توکن هنوز زیر یک ثانیه می‌رسد؛ برای یک سرویس با هزاران درخواست کوتاه در ثانیه ممکن است مهم باشد. اندازه‌گیری کن.

دربارهٔ داده: gateway محتوای prompt و پاسخ را ذخیره نمی‌کند — فقط متادیتا (مدل، تعداد توکن، هزینه، زمان، وضعیت). relay هیچ چیزی لاگ نمی‌کند. بعد از آن، داده تابع سیاست OpenRouter و ارائه‌دهندهٔ زیرین است که خارج از کنترل ماست؛ اگر پروژه‌ات دادهٔ حساس دارد، این را در طراحی لحاظ کن. جزئیات در صفحهٔ حریم خصوصی داده نوشته شده.

کِی کدام را انتخاب کنی

OpenRouter مستقیم اگر: خارج از ایران هستی یا پرداخت ارزی و سرور خارجی پایدار داری، به BYOK یا /v1/responses نیاز داری، یا می‌خواهی خودت مستقیم با تأمین‌کنندهٔ اصلی طرف باشی و مدیریت اکانت، پرداخت و ریسک IP را خودت به عهده بگیری.

یوتاپن اگر: در ایران هستی و می‌خواهی با تومان و درگاه داخلی شارژ کنی، داشبورد و فاکتور فارسی می‌خواهی، نمی‌خواهی نگران IP و سیاست ارائه‌دهنده‌ها باشی، یا برای هر پروژه کلید با سقف تومانی لازم داری. کد تو در هر دو حالت یکی است، پس اگر روزی تصمیمت عوض شد، فقط دو خط عوض می‌شود.

هر دو اگر: تیم بزرگی هستی که بخشی از بار را روی سرور خارج و بخشی را داخل اجرا می‌کند. چون SDK و شناسهٔ مدل‌ها یکسان است، یک لایهٔ نازک پیکربندی کافی است.

اگر می‌خواهی خودت مسیر را امتحان کنی، یک کلید از داشبورد بساز و compare.py را با آرگومان uttapen اجرا کن؛ راهنمای شروع سریع هم پنج دقیقه‌ای است. اگر بعد از تست به این نتیجه رسیدی که OpenRouter مستقیم برایت بهتر است، عیبی ندارد — هدف این مقاله این بود که با چشم باز انتخاب کنی.

مقاله‌های مرتبط

می‌خواهی همین کد را اجرا کنی؟

با شماره موبایل ثبت‌نام کن، کیف پول را شارژ کن و کلید بگیر. ساخت کلید API ←