uttapen

دسترسی به API مدل‌های OpenAI و Claude از ایران — راهنمای کامل ۱۴۰۵

راه‌های واقعی دسترسی به API مدل‌های GPT، Claude و Gemini از ایران، ریسک هر کدام، و راه‌اندازی در ۱۰ دقیقه با کلید تومانی و SDK رسمی OpenAI.

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

اگر برنامه‌نویس ایرانی هستی و یک بار سعی کرده‌ای با کلید OpenAI یا Anthropic از داخل کشور درخواست بزنی، احتمالاً به یکی از این‌ها خورده‌ای: صفحهٔ ثبت‌نام که شمارهٔ موبایل ایران را قبول نمی‌کند، خطای unsupported_country_region_territory، یا اکانتی که بعد از چند روز کار با VPN مسدود شد و موجودی دلاری‌اش سوخت. این مقاله می‌خواهد بدون شعار توضیح بدهد که مشکل دقیقاً کجاست، چه راه‌هایی واقعاً وجود دارد، هر کدام چه ریسکی دارد، و در نهایت چطور می‌شود در کمتر از ده دقیقه با یک کلید تومانی به همان مدل‌ها وصل شد. لحن مقاله مهندس به مهندس است؛ اگر جایی محدودیتی هست، صریح می‌گوییم.

مشکل دقیقاً چیست؟

سه لایهٔ جدا از هم دسترسی را می‌بندند و بیشتر آدم‌ها فقط لایهٔ اول را می‌بینند:

لایهٔ شبکه. OpenAI و Anthropic درخواست‌هایی که از IP ایران می‌آید را رد می‌کنند یا با کد 403 جواب می‌دهند. این لایه با VPN دور زده می‌شود و به همین خاطر خیلی‌ها فکر می‌کنند مشکل حل شده.

لایهٔ هویت و پرداخت. برای ساختن اکانت به شمارهٔ موبایل غیرایرانی و برای خرید اعتبار به کارت بین‌المللی نیاز است. اینجا معمولاً پای دوست یا خویشاوند خارج از کشور یا سرویس‌های کارت مجازی وسط می‌آید. مبلغ به دلار است، کارمزد تبدیل بالاست، و هر بار شارژ یک هماهنگی انسانی می‌خواهد.

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

بنابراین «VPN بزن و کلید بگیر» یک راه‌حل نیست؛ یک بدهی فنی است که دیر یا زود سررسید می‌شود.

راه‌هایی که واقعاً وجود دارد

۱. اکانت شخصی خارج از کشور

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

۲. خرید اکانت یا کلید اشتراکی

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

۳. دروازهٔ واسط با پرداخت ریالی

مدل سوم این است که یک سرویس داخلی، خرید اعتبار و ارتباط با ارائه‌دهنده را به عهده بگیرد و به تو فقط یک کلید و یک آدرس بدهد. یوتاپن در همین دسته است. بگذار دقیق بگوییم چه چیزی هست و چه چیزی نیست، چون شفافیت اینجا از تبلیغ مهم‌تر است.

یوتاپن چطور کار می‌کند

مسیر یک درخواست این‌طور است: کد تو با SDK رسمی OpenAI به https://api.uttapen.ir/v1 درخواست می‌زند. این سرور داخل ایران است، پس تأخیر شبکه‌ای برای رسیدن به آن حداقلی است و نیازی به VPN نیست. دروازه، کلید تو را چک می‌کند، هزینهٔ تقریبی درخواست را از کیف پول تومانی‌ات به‌صورت موقت بلوکه می‌کند، و درخواست را از طریق یک relay بی‌حالت در فنلاند به OpenRouter می‌فرستد. OpenRouter یک تجمیع‌کنندهٔ شناخته‌شده است که به بیش از چهارصد مدل از OpenAI، Anthropic، Google، DeepSeek، Qwen، Meta و دیگران دسترسی می‌دهد. پاسخ از همان مسیر برمی‌گردد، هزینهٔ واقعی از روی گزارش مصرف ارائه‌دهنده حساب می‌شود، بلوکهٔ اضافه آزاد می‌شود، و رقم دقیق در هدر پاسخ به تو داده می‌شود.

چند نکتهٔ مهم دربارهٔ این معماری:

  • هیچ درخواستی با IP ایران به ارائه‌دهندهٔ خارجی نمی‌رسد؛ همه از relay خارج از کشور می‌گذرد. پس کد تو در معرض بسته‌شدن اکانت نیست، چون اکانتی به نام تو وجود ندارد.
  • محتوای پرامپت و پاسخ در مسیر API ذخیره نمی‌شود؛ فقط متادیتا (مدل، تعداد توکن، هزینه، زمان، شناسهٔ درخواست) برای صورت‌حساب نگه داشته می‌شود. جزئیات در صفحهٔ حریم خصوصی داده آمده.
  • ما به OpenRouter وابسته‌ایم. اگر آن‌ها برای مدلی مشکل داشته باشند، ما هم داریم. این را پنهان نمی‌کنیم و در صفحهٔ هر مدل وضعیت را نشان می‌دهیم.
  • مسیر ایران → فنلاند → ارائه‌دهنده به‌طور معمول حدود ۱۰۰ میلی‌ثانیه به زمان تا اولین توکن اضافه می‌کند. برای چت و پردازش متن محسوس نیست؛ برای کاربردهای بلادرنگ صوتی باید در نظر بگیری.
  • در فاز اول SLA رسمی نداریم. آپتایم را پایش می‌کنیم و اختلال را اطلاع می‌دهیم، ولی قرارداد جریمه‌دار فعلاً وجود ندارد.

راه‌اندازی در ده دقیقه

گام اول: ثبت‌نام و شارژ

با شمارهٔ موبایل ایرانی وارد می‌شوی، کد یک‌بارمصرف را می‌زنی، و کیف پول را از درگاه زیبال شارژ می‌کنی. کمترین مبلغ شارژ ۵۰٬۰۰۰ تومان است. پول به تومان می‌ماند و هر درخواست دقیقاً به اندازهٔ مصرفش کم می‌کند؛ اشتراک ماهانه یا بستهٔ از پیش تعیین‌شده در کار نیست.

گام دوم: ساخت کلید

از داشبورد یک کلید با پیشوند sk-up- می‌سازی. می‌توانی برای هر پروژه یک کلید جدا داشته باشی و برای هر کدام سقف ماهانهٔ تومانی بگذاری تا یک باگ در حلقهٔ بی‌نهایت، کل موجودی را خالی نکند. کلید فقط یک بار نمایش داده می‌شود؛ همان لحظه در متغیر محیطی پروژه بگذارش.

گام سوم: اولین درخواست

مدل‌ها با قالب provider/model نام‌گذاری شده‌اند: openai/gpt-5، anthropic/claude-sonnet-4.5، google/gemini-2.5-flash، deepseek/deepseek-chat. نمونهٔ زیر برای هر پنج زبان رایج آماده است و همان کدی است که در شروع سریع هم می‌بینی:

curl https://api.uttapen.ir/v1/chat/completions \
  -H "Authorization: Bearer sk-up-…" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "openai/gpt-5-mini",
    "messages": [{"role": "user", "content": "سلام! خودت را معرفی کن."}],
    "stream": true
  }'

خروجی که از سرور برمی‌گردد دقیقاً همان ساختار OpenAI است، با چند هدر اضافه که کار حسابداری را راحت می‌کند. این خروجی واقعی یک اجرای curl است:

HTTP/1.1 200 OK
Content-Type: application/json
X-Uttapen-Request-Id: 01a078de-e86a-7298-8b1b-bcad3c623bb2
X-Uttapen-Model: openai/gpt-5-nano
X-Uttapen-Cost-Toman: 1.384688
X-Uttapen-Balance-Toman: 97516.444276
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 54

یعنی همین درخواست کوتاه با gpt-5-nano حدود ۱٫۴ تومان هزینه داشته و موجودی بعد از آن ۹۷٬۵۱۶ تومان است. برای جزئیات نحوهٔ محاسبه، مقالهٔ قیمت‌ها به تومان را ببین.

استریم کردن پاسخ

برای رابط‌های چت، پاسخ را استریم می‌کنی تا کاربر منتظر کل متن نماند. پارامتر stream=True همان است که در OpenAI می‌شناسی. اگر بخواهی هزینهٔ همان استریم را هم بدانی، هدر X-Uttapen-Include-Meta: 1 را بفرست؛ آن‌وقت درست قبل از [DONE] یک رویداد اضافه با نوع uttapen.meta می‌آید که هزینه و موجودی را دارد. این کد در Python تست شده:

import os
from openai import OpenAI

client = OpenAI(
    base_url="https://api.uttapen.ir/v1",
    api_key=os.environ["UTTAPEN_API_KEY"],
)

stream = client.chat.completions.create(
    model="anthropic/claude-sonnet-4.5",
    messages=[{"role": "user", "content": "یک بیت شعر دربارهٔ کد تمیز بگو."}],
    stream=True,
    extra_headers={"X-Uttapen-Include-Meta": "1"},
)
for chunk in stream:
    if getattr(chunk, "object", None) == "uttapen.meta":
        print("\n[هزینه]", chunk.model_extra.get("cost_toman"), "تومان — موجودی:", chunk.model_extra.get("balance_toman"))
        continue
    if chunk.choices:
        print(chunk.choices[0].delta.content or "", end="", flush=True)

بدون آن هدر، استریم بیت‌به‌بیت همان فرمت OpenAI است و هر کتابخانه‌ای که با OpenAI کار می‌کند، اینجا هم کار می‌کند. راهنمای کامل در مستندات استریم است.

خطاها را از روز اول درست هندل کن

کدهای خطا همان قالب OpenAI است، با یک بلوک اضافهٔ uttapen وقتی موضوع مالی باشد. مهم‌ترین موردی که در OpenAI وجود ندارد، 402 insufficient_balance است: یعنی موجودی قابل‌استفاده از برآورد هزینهٔ این درخواست کمتر است. برآورد بر اساس max_tokens انجام می‌شود، پس اگر max_tokens بزرگی روی مدل گرانی بفرستی، ممکن است با موجودی معقول هم این خطا را بگیری. کد زیر روی سرور واقعی اجرا شده و خروجی‌اش دقیقاً همین بود:

import os
import openai
from openai import OpenAI

client = OpenAI(
    base_url="https://api.uttapen.ir/v1",
    api_key=os.environ["UTTAPEN_API_KEY"],
    max_retries=2,  # SDK خودش 429 و 5xx را با backoff تکرار می‌کند
)

try:
    client.chat.completions.create(
        model="anthropic/claude-opus-4.1",
        messages=[{"role": "user", "content": "یک مقالهٔ بلند بنویس."}],
        max_tokens=100_000,
    )
except openai.AuthenticationError:
    print("کلید اشتباه است یا لغو شده (401)")
except openai.RateLimitError as e:
    print("سقف نرخ (429):", e.body.get("code") if isinstance(e.body, dict) else e)
except openai.APIStatusError as e:
    # e.body همان شیء error در پاسخ است: {message, type, code, uttapen?}
    err = e.body if isinstance(e.body, dict) else {}
    if e.status_code == 402:
        info = err.get("uttapen", {})
        print(f"موجودی کم است: لازم ≈ {float(info['required_toman']):,.0f} تومان، "
              f"موجود {float(info['available_toman']):,.0f} تومان → {info['topup_url']}")
    else:
        print(e.status_code, err.get("code"), err.get("message"))
موجودی کم است: لازم ≈ 363,993 تومان، موجود 95,568 تومان → https://uttapen.ir/dashboard/wallet

نکتهٔ ظریف: SDK پایتون شیء error را از بدنه بیرون می‌کشد و در e.body می‌گذارد، پس کلید uttapen مستقیم روی e.body است، نه زیر e.body["error"]. فهرست کامل کدها با شرایط رخ‌دادن هر کدام در صفحهٔ خطاها است.

کدام مدل را انتخاب کنم؟

کاتالوگ فعلی ۴۳۰ مدل دارد که ۱۸ تای آن با پسوند :free رایگان است (با سقف روزانهٔ هر کاربر و ظرفیت مشترک؛ برای محصول رویشان حساب نکن). برای شروع، این ترکیب برای بیشتر پروژه‌های فارسی جواب می‌دهد:

فهرست کامل با قیمت تومانی لحظه‌ای در صفحهٔ مدل‌ها است و از طریق GET /v1/models هم بدون احراز هویت در دسترس است؛ بلوک pricing هر مدل به تومان است و فیلد pricing_currency با مقدار IRT این را صریح می‌کند.

سؤال‌های پرتکرار

آیا باید VPN داشته باشم؟ نه. آدرس api.uttapen.ir داخل ایران است و همهٔ مسیر بین‌المللی سمت ما مدیریت می‌شود.

کدم را چقدر باید عوض کنم؟ فقط base_url و کلید. اگر با SDK رسمی OpenAI کار می‌کنی، یک خط. مقالهٔ migration برای Python، Node و PHP قدم‌به‌قدم نشان می‌دهد.

قیمت‌ها را کجا ببینم؟ همه‌چیز از اول به تومان است: صفحهٔ قیمت‌ها و صفحهٔ هر مدل قیمت ورودی و خروجی را به‌ازای هر یک میلیون توکن نشان می‌دهد، و هر پاسخ API هزینهٔ دقیق همان درخواست را در هدر X-Uttapen-Cost-Toman برمی‌گرداند؛ چیزی برای حساب‌کردن نمی‌ماند.

اگر وسط استریم قطع شدم چه می‌شود؟ فقط بابت توکن‌هایی که ارائه‌دهنده واقعاً تولید کرده شارژ می‌شوی و بلوکهٔ اضافه آزاد می‌شود. برای خطاهای سمت ما، هیچ مبلغی کم نمی‌شود.

Responses API را پشتیبانی می‌کنید؟ فعلاً نه؛ مسیر /v1/responses با پیام راهنما 404 می‌دهد. chat/completions، completions و embeddings کامل کار می‌کند.

جمع‌بندی

دسترسی به API مدل‌های زبانی از ایران مسئلهٔ «دور زدن» نیست؛ مسئلهٔ داشتن مسیری است که هر روز صبح هم کار کند و صورت‌حسابش قابل پیش‌بینی باشد. اگر می‌خواهی امتحان کنی، یک حساب بساز، ۵۰ هزار تومان شارژ کن و همان نمونهٔ curl بالا را بزن؛ اگر جواب برنگشت یا عددی با صفحهٔ قیمت‌ها نخواند، این را یک باگ می‌دانیم و می‌خواهیم بدانیم.

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

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

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