گیسو همان قالب API شرکت OpenAI را دارد، پس مهاجرت یعنی عوض کردن دو مقدار: نشانی پایه (base URL) و کلید. کد، کتابخانهها، پرامپتها و منطق خطا همان میماند. این صفحه تفاوتهای ریز را فهرست میکند تا هیچکدام غافلگیرتان نکند، و یک چکلیست برای جابهجایی بدون قطعی میدهد.
دو مقدار#
from openai import OpenAI
# before
# client = OpenAI(api_key=os.environ["OPENAI_API_KEY"])
# after: two values change, nothing else
client = OpenAI(
base_url="https://gisoo.pro/api/v1",
api_key=os.environ["GISOO_API_KEY"],
)
// before
// const client = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });
// after
const client = new OpenAI({
baseURL: "https://gisoo.pro/api/v1",
apiKey: process.env.GISOO_API_KEY,
});
# If your code reads the standard variables, change only the environment:
OPENAI_BASE_URL=https://gisoo.pro/api/v1
OPENAI_API_KEY=sk-gisoo-v1-...
چه چیزهایی همان است#
- قالب درخواست و پاسخ
/chat/completions،/responses،/embeddings،/images/generations،/audio/*و/models. - پاسخ جریانی (SSE)، فراخوانی ابزار، خروجی JSON و ورودی تصویر.
- قالب خطا (
error.type،error.code) و منطق تلاش دوبارهٔ SDKها. - نام مدلهای OpenAI؛
gpt-4o-miniدر گیسو همانgpt-4o-miniاست.
تفاوتها#
| موضوع | در گیسو |
|---|---|
| مدلهای سازندههای دیگر | Claude، Gemini، DeepSeek و بقیه هم از همین endpointها میآیند؛ شناسهشان را از GET /models بردارید (قاعدهٔ شناسهها). |
| شناسهٔ پاسخ | id با req_ شروع میشود و همان مقدار در هدر X-Request-Id میآید. |
| مصرف در پاسخ جریانی | رویداد usage همیشه در پایان جریان میآید؛ stream_options لازم نیست. |
| فیلدهایی که فرستاده نمیشوند | store، service_tier و safety_identifier نادیده گرفته میشوند. user پذیرفته میشود ولی بهجای آن شناسهٔ گیسو به سرویسدهنده میرود. |
| هدرهای سازمان و پروژه | OpenAI-Organization و OpenAI-Project اثری ندارند؛ پروژه را خود کلید تعیین میکند. |
| هدرهای محدودیت | X-RateLimit-Limit و X-RateLimit-Remaining برای تعداد درخواست در دقیقه؛ هدرهای محدودیت توکن OpenAI نیستند. |
| متن خطا | message فارسی است؛ code و type همان مقدارهای پایدارند (فهرست). |
| پرداخت | اعتبار پیشپرداخت و دلاری است و در صفحهٔ پرداخت نِت اَرز شارژ میشود؛ صورتحساب ماهانه ندارد (قیمتگذاری). |
endpointهایی که در گیسو نیستند#
این بخشهای API شرکت OpenAI فعلاً در گیسو نیستند و درخواست به آنها خطای 404 unknown_url میگیرد:
- بارگذاری فایل و Vector Store (
/files،/uploads،/vector_stores): متن و تصویر را مستقیم در درخواست بفرستید؛ برای جستوجو در اسناد از امبدینگ استفاده کنید. - Assistants و Threads: همان کار را با Chat Completions یا Responses API و نگه داشتن تاریخچه در برنامهٔ خودتان انجام دهید.
- Batch، Fine-tuning و Realtime (صدای زنده از WebSocket).
- ویرایش تصویر (
/images/edits) و نسخهٔ دیگر تصویر (/images/variations).
از سرویسهای مشابه#
- از سرویس دیگری که سازگار با OpenAI است (مثل OpenRouter یا یک درگاه دیگر): همان دو مقدار را عوض کنید. شناسهٔ مدلهای OpenRouter را با پیشوند
openrouter/یا به شکلvendor/modelبفرستید؛ مثلاًanthropic/claude-sonnet-4.5. - از SDK اختصاصی Anthropic: گیسو endpoint سازگار با Anthropic هم دارد؛ سازگاری با Anthropic و Claude Code را ببینید. راه دیگر: Claude را با قالب OpenAI و SDK رسمی OpenAI صدا بزنید.
- از SDK اختصاصی Google (google-genai): این SDK با گیسو کار نمیکند؛ Gemini را با قالب OpenAI و شناسهای مثل
gemini-3.6-flashصدا بزنید.
چکلیست جابهجایی بدون قطعی#
- کلید آزمایشی بسازید
یک پروژهٔ «staging» با سقف هزینهٔ کم و کلید جدا.
- نشانی و کلید را از متغیر محیطی بخوانید
تا جابهجایی و برگشت فقط تغییر تنظیم باشد، نه کد.
- با GET /me شروع کنید
درستی کلید، موجودی و محدودیتها را پیش از اولین درخواست واقعی ببینید.
- چند درخواست واقعی را مقایسه کنید
همان پرامپتهای تولید را با همان مدل بفرستید و خروجی، زمان پاسخ و هزینه را کنار هم بگذارید.
- کمکم ترافیک را بیاورید
اول بخشی از کاربران، بعد همه. مصرف را با
GET /usageدنبال کنید. - برای کلید تولید سقف بگذارید
سقف هزینهٔ کلید و بودجهٔ ماهانهٔ پروژه را متناسب با مصرف واقعی تنظیم کنید.
پشتیبان در کنار گیسو#
اگر سرویس شما نباید حتی چند دقیقه از کار بیفتد، یک مسیر پشتیبان نگه دارید و فقط برای خطاهای موقت (۴۲۹ و ۵xx) سراغش بروید:
import os
from openai import OpenAI, APIStatusError, APIConnectionError
primary = OpenAI(base_url="https://gisoo.pro/api/v1", api_key=os.environ["GISOO_API_KEY"], max_retries=2)
backup = OpenAI(base_url=os.environ["BACKUP_BASE_URL"], api_key=os.environ["BACKUP_API_KEY"])
def chat(**kwargs):
try:
return primary.chat.completions.create(**kwargs)
except (APIConnectionError, APIStatusError) as e:
if isinstance(e, APIStatusError) and e.status_code < 500 and e.status_code != 429:
raise # a 4xx is our bug, not an outage
return backup.chat.completions.create(**kwargs)
پاسخ پرسشتان را پیدا نکردید؟
شناسهٔ درخواست (هدر X-Request-Id) را با پرسشتان در تیکت بفرستید تا دقیق بررسی کنیم.