شروع سریع — اولین درخواست در ۵ دقیقه
ثبتنام با شماره موبایل، شارژ کیف پول تومانی، ساخت کلید sk-up و اولین فراخوانی مدل با SDK رسمی OpenAI در Python، Node و curl.
بهروزرسانی: ۱۶ شهریور ۱۴۰۵
uttapen یک gateway سازگار با API رسمی OpenAI است. کدی که امروز با OpenAI کار میکند، با تغییر یک خط (base_url) به بیش از ۴۰۰ مدل وصل میشود و هزینهٔ هر درخواست از کیف پول تومانیات کم میشود. این صفحه تو را از ثبتنام تا اولین پاسخ مدل میبرد.
۱. ثبتنام با شماره موبایل
به صفحهٔ ورود برو و شماره موبایلت را وارد کن. یک کد یکبارمصرف پیامک میشود؛ همان کد را وارد کن. ثبتنام و ورود یکی است و حسابت با اولین تأیید ساخته میشود. بعداً میتوانی در تنظیمات، رمز عبور هم بگذاری تا هر بار منتظر پیامک نمانی.
۲. شارژ کیف پول
از داشبورد ← کیف پول مبلغ را به تومان وارد کن و با درگاه زیبال پرداخت کن. حداقل شارژ ۵۰٬۰۰۰ تومان است. بعد از برگشت از درگاه، موجودی همان لحظه در حساب مینشیند و برای هر پرداخت فاکتور صادر میشود.
مدلهای رایگان (شناسه با پسوند :free) بدون شارژ هم کار میکنند، ولی سقف روزانه و ظرفیت مشترک دارند. برای کار جدی، حداقل یک شارژ کوچک بکن تا با 402 روبهرو نشوی.
۳. ساخت کلید API
در داشبورد ← کلیدها دکمهٔ «کلید جدید» را بزن. یک نام بده (مثلاً local-dev) و بساز. کلید با پیشوند sk-up- فقط یک بار نمایش داده میشود؛ همان لحظه کپیاش کن و در فایل .env پروژه بگذار. اگر گمش کردی، کلید را لغو کن و یک کلید تازه بساز.
هر کلید میتواند سقف ماهانه (تومان)، فهرست مدلهای مجاز، محدودیت نرخ و تاریخ انقضا داشته باشد. جزئیات در احراز هویت و کلیدها.
۴. اولین درخواست
آدرس پایه همیشه https://api.uttapen.ir/v1 است و شناسهٔ مدل به شکل provider/model نوشته میشود. نمونهٔ زیر با openai/gpt-5-mini است؛ هر مدل دیگری از فهرست مدلها را میتوانی جایش بگذاری.
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
}'from openai import OpenAI
client = OpenAI(
base_url="https://api.uttapen.ir/v1",
api_key="sk-up-…",
)
stream = client.chat.completions.create(
model="openai/gpt-5-mini",
messages=[{"role": "user", "content": "سلام! خودت را معرفی کن."}],
stream=True,
)
for chunk in stream:
print(chunk.choices[0].delta.content or "", end="", flush=True)import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api.uttapen.ir/v1",
apiKey: "sk-up-…",
});
const stream = await client.chat.completions.create({
model: "openai/gpt-5-mini",
messages: [{ role: "user", content: "سلام! خودت را معرفی کن." }],
stream: true,
});
for await (const chunk of stream) {
process.stdout.write(chunk.choices[0]?.delta?.content ?? "");
}<?php
// composer require openai-php/client guzzlehttp/guzzle
$client = OpenAI::factory()
->withBaseUri('https://api.uttapen.ir/v1')
->withApiKey('sk-up-…')
->make();
$result = $client->chat()->create([
'model' => 'openai/gpt-5-mini',
'messages' => [['role' => 'user', 'content' => 'سلام! خودت را معرفی کن.']],
]);
echo $result->choices[0]->message->content;package main
import (
"context"
"fmt"
"github.com/openai/openai-go"
"github.com/openai/openai-go/option"
)
func main() {
client := openai.NewClient(
option.WithBaseURL("https://api.uttapen.ir/v1"),
option.WithAPIKey("sk-up-…"),
)
resp, err := client.Chat.Completions.New(context.Background(), openai.ChatCompletionNewParams{
Model: "openai/gpt-5-mini",
Messages: []openai.ChatCompletionMessageParamUnion{openai.UserMessage("سلام! خودت را معرفی کن.")},
})
if err != nil {
panic(err)
}
fmt.Println(resp.Choices[0].Message.Content)
}اگر SDK نصب نیست:
pip install openai # Python
npm install openai # Node.js
کلید را در کد ننویس؛ از متغیر محیطی بخوان:
import os
from openai import OpenAI
client = OpenAI(
base_url="https://api.uttapen.ir/v1",
api_key=os.environ["UTTAPEN_API_KEY"],
)
resp = client.chat.completions.create(
model="openai/gpt-5-mini",
messages=[{"role": "user", "content": "سه مزیت Postgres را در سه خط بگو."}],
max_tokens=200,
)
print(resp.choices[0].message.content)
print(resp.usage.prompt_tokens, resp.usage.completion_tokens)
۵. پاسخ چه چیزی دارد
بدنهٔ پاسخ دقیقاً فرمت OpenAI است: id، model، choices[0].message.content، finish_reason و بلوک usage. دو چیز اضافه هم میبینی:
usage— تعداد توکن ورودی و خروجی که مدل برای همین درخواست گزارش کرده؛ مبنای شارژ همین مصرف واقعی است.- چند هدر با پیشوند
X-Uttapen-روی پاسخهای غیراستریم:
X-Uttapen-Request-Id: 01a078dd-853e-7480-aa83-262d3239e6a2
X-Uttapen-Model: openai/gpt-5-mini
X-Uttapen-Cost-Toman: 6.659688
X-Uttapen-Balance-Toman: 97564.413809
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 59
X-Uttapen-Request-Id را در گزارش خطا به ما بده؛ همان شناسه در لاگ و دفتر حساب ما ثبت شده است. در Python با client.chat.completions.with_raw_response.create(...) و در Node با .withResponse() به این هدرها میرسی.
مبلغ تومانی هر درخواست از روی مصرف واقعی که مدل گزارش میدهد حساب میشود، نه از برآورد ما. قبل از ارسال مبلغی موقتاً رزرو میشود و بعد از پاسخ، مبلغ نهایی کم و بقیه آزاد میشود. جزئیات در قیمتگذاری.
۶. اگر خطا گرفتی
| وضعیت | معنی | کار بعدی |
|---|---|---|
401 invalid_api_key | کلید غلط، لغوشده یا منقضی | کلید تازه بساز و .env را بهروز کن |
402 insufficient_balance | موجودی برای رزرو این درخواست کافی نیست | کیف پول را شارژ کن یا max_tokens را کم کن |
404 model_not_found | شناسهٔ مدل اشتباه است | از /v1/models یا صفحهٔ مدلها شناسه را کپی کن |
429 rate_limit_exceeded | بیش از سقف دقیقهای کلید | Retry-After را رعایت کن |
جدول کامل در خطاها و کدها.
قدمهای بعدی
- پاسخ زنده با استریم و رویداد اختیاری
uttapen.metaبرای دیدن هزینهٔ هر پاسخ. - اگر از OpenAI یا OpenRouter میآیی، راهنمای migration تفاوتهای کوچک را فهرست کرده است.
- Tool calling، تصویر و فایل، خروجی JSON و مدلهای استدلالی.
- برای هر زبان یک صفحهٔ جدا داریم: Python، Node، PHP، Go، curl.
- مصرف و هزینه را در داشبورد ← مصرف یا با
GET /v1/uttapen/usageببین.