یوتاپن دقیقاً چطور کار می‌کند؟ (شفاف)

مسیر یک درخواست از کد تو تا مدل و برگشت، قواعد مالی hold و تسویه، هدرهای هزینه، تأخیر، حریم خصوصی، و اینکه کِی یوتاپن انتخاب درستی نیست.

۱۶ شهریور ۱۴۰۵ · به‌روزرسانی ۱۸ شهریور ۱۴۰۵ · ۷ دقیقه مطالعه · تیم یوتاپن
یوتاپن دقیقاً چطور کار می‌کند؟ (شفاف)

اگر قرار است زیرساخت مدل زبانی پروژه‌ات را به یک سرویس بسپاری، حق داری بدانی دقیقاً چه اتفاقی می‌افتد: درخواستت از کجا رد می‌شود، پول چطور حساب می‌شود، چه چیزی ذخیره می‌شود و کجا کم می‌آوریم. این مقاله همان را می‌گوید، بدون بازاریابی. (اگر اول می‌خواهی بدانی یوتاپن چیست و چه کسی آن را ساخته، آنجا کوتاه نوشته‌ایم.) بعضی جاها نتیجه به نفع ما نیست و همان را هم می‌نویسیم، چون برنامه‌نویسی که بعداً حقیقت را کشف کند، دیگر برنمی‌گردد.

مسیر یک درخواست

کد تو با SDK رسمی OpenAI به https://api.uttapen.ir/v1 می‌زند. این سرور داخل ایران است، پس رسیدن به آن نه VPN می‌خواهد نه تأخیر معنادار دارد. دروازه کلید sk-up-… تو را چک می‌کند، قیمت مدل را از کاتالوگ می‌خواند، مبلغی به‌عنوان hold از کیف پول تومانی‌ات کنار می‌گذارد، و درخواست را — بدون هدرهای شناسایی‌کنندهٔ تو (IP، cookie، X-Forwarded-For) — از زیرساخت خودمان در خارج از ایران به مدل می‌رساند.

پاسخ همان مسیر را برمی‌گردد. در پایان، هزینهٔ قطعی درخواست به تومان از کیف پولت کم می‌شود و مابه‌التفاوت hold آزاد می‌شود. هیچ درخواستی با IP ایران به سرویس‌های خارجی نمی‌رسد، پس کد تو در معرض بسته‌شدن اکانت نیست — چون اصلاً اکانت خارجی نداری که بسته شود.

آنچه این معماری به تو می‌دهد:

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

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

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

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

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

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

هزینه را در همان پاسخ ببین

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

# cost.py — هزینهٔ هر درخواست، در همان پاسخ
import os
from openai import OpenAI

client = OpenAI(
    base_url=os.getenv("UTTAPEN_BASE_URL", "https://api.uttapen.ir/v1"),
    api_key=os.environ["UTTAPEN_API_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")

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

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

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 است. جزئیات در مستندات استریم.

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

دروازه passthrough است، پس تقریباً هر چیزی که با قرارداد chat/completions می‌فرستی عبور می‌کند: استریم، tool calling، ورودی تصویر و فایل، response_format، پارامترهای reasoning و فیلد models برای fallback. کاتالوگ هم کامل است — بیش از ۴۰۰ مدل، شامل مدل‌های رایگان — و هر ساعت همگام می‌شود.

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

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

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

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

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

کِی یوتاپن انتخاب درستی نیست

اگر خارج از ایران هستی، کارت بین‌المللی داری و می‌خواهی مستقیم با سازندهٔ مدل طرف باشی، مستقیم برو سراغ خودشان؛ یک واسطه کمتر همیشه بهتر است. اگر به BYOK یا /v1/responses نیاز داری، فعلاً ما جواب نیستیم. و اگر تأخیر زیر صد میلی‌ثانیه برای معماری‌ات حیاتی است، اول اندازه بگیر و بعد تصمیم بگیر.

یوتاپن برای این ساخته شده که در ایران باشی و بخواهی با تومان و درگاه داخلی شارژ کنی، فاکتور رسمی و داشبورد فارسی داشته باشی، نگران IP و سیاست سرویس‌های خارجی نباشی، و برای هر پروژه کلیدی با سقف تومانی بسازی. چون کد با SDK رسمی OpenAI نوشته می‌شود، اگر روزی تصمیمت عوض شد فقط دو خط عوض می‌شود — base_url و کلید.

یک کلید از داشبورد بساز و cost.py را اجرا کن؛ راهنمای شروع سریع هم پنج دقیقه‌ای است.

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

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

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