هر درخواست به وبسرویس گیسو با یک کلید دسترسی (API Key) شناخته میشود. کلید میگوید درخواست از کدام حساب و کدام پروژه است، هزینه از کدام اعتبار کم شود و چه محدودیتهایی رویش باشد. این صفحه ساختن، فرستادن و امن نگه داشتن کلید را توضیح میدهد.
فرستادن کلید#
کلید را در سربرگ (هدر) Authorization و با پیشوند Bearer بفرستید؛ SDK رسمی OpenAI همین کار را خودش میکند.
ابزاری که این هدر را نمیفرستد، میتواند کلید را در هدر X-API-Key بگذارد. کلید را در نشانی (Query String) نفرستید؛ نشانیها در لاگ سرورها و مرورگر میمانند.
# Standard: the Authorization header
curl https://gisoo.pro/api/v1/me -H "Authorization: Bearer $GISOO_API_KEY"
# For tools that cannot set Authorization
curl https://gisoo.pro/api/v1/me -H "X-API-Key: $GISOO_API_KEY"
ساختن کلید#
- بخش API اپ را باز کنید
در gisoo.pro/app/api پروژههایتان را میبینید. پروژه یعنی یک برنامه یا یک مشتری شما؛ مثلاً «ربات پشتیبانی» و «سایت فروشگاه».
- یک پروژه بسازید
برای هر پروژه میتوانید بودجهٔ ماهانه و فهرست مدلهای مجاز بگذارید. گزارش مصرف هم به تفکیک پروژه است.
- برای پروژه کلید بسازید
برای کلید نام، سقف هزینه، فهرست IP مجاز، محدودیت درخواست در دقیقه و تاریخ انقضا تعیین کنید؛ همه اختیاریاند.
- کلید را همان لحظه کپی کنید
کلید کامل فقط یک بار نشان داده میشود. ما فقط اثر رمزنگاریشدهٔ آن (hash) را نگه میداریم و خودش را نمیتوانیم دوباره نشان دهیم. اگر گمش کردید، کلید تازه بسازید و قبلی را باطل کنید.
پیشوند کلید: sk-gisoo و sk-ntz#
کلیدی که در گیسو میسازید با sk-gisoo-v1- شروع میشود و کلیدی که در نِت اَرز ساخته شده با sk-ntz-v1-.
گیسو برند هوش مصنوعی نِت اَرز است و حساب و اعتبار در هر دو یکی است؛ برای همین هر دو کلید روی هر دو نشانی کار میکنند و از همان اعتبار کم میکنند.
پیشوند فقط برای این است که خودتان و ابزارهای اسکن رمز (Secret Scanning) کلید را بشناسید.
| کلید | وبسرویس گیسو | وبسرویس نِت اَرز |
|---|---|---|
sk-gisoo-v1-… | کار میکند | کار میکند |
sk-ntz-v1-… | کار میکند | کار میکند |
آزمودن کلید و دیدن محدودیتها#
GET /me بدون هزینه است و میگوید کلید به کدام پروژه وصل است، چقدر اعتبار دارید و چه محدودیتهایی رویش هست. برای آزمودن کلید تازه همین را صدا بزنید:
{
"object": "account",
"balance": { "usd": "12.408114", "usd_display": "$12.4081" },
"status": "active",
"project": { "id": 42, "name": "support-bot" },
"key": {
"name": "production",
"prefix": "sk-gisoo-v1-Xy7Q",
"rpm_limit": 60,
"spend_limit_usd": "20.00",
"spent_usd": "3.591886",
"expires_at": null
},
"limits": { "concurrency": 8, "max_request_kb": 20480 }
}
محدودیتهایی که روی هر کلید میگذارید#
| تنظیم | چه میکند | اگر پر شود |
|---|---|---|
| سقف هزینه | بیشترین مبلغی که این کلید در کل عمرش خرج میکند. | 402 key_spend_limit_reached |
| مدلهای مجاز | کلید فقط این مدلها را صدا میزند. فهرست خالی یعنی هر مدلی که پروژه اجازه دهد. | 403 model_not_allowed |
| IP مجاز | فقط از این نشانیها پذیرفته میشود: IP دقیق، پیشوند مثل 185.10. یا بازهٔ CIDR مثل 10.0.0.0/24 (IPv4). | 403 ip_not_allowed |
| درخواست در دقیقه | سقف اختصاصی این کلید؛ اگر خالی بماند، سقف حساب (۶۰ در دقیقه بهطور پیشفرض). | 429 rate_limit_exceeded |
| تاریخ انقضا | بعد از این تاریخ کلید خودش از کار میافتد؛ برای کلیدی که به پیمانکار یا برای یک رویداد میدهید. | 401 api_key_expired |
بودجهٔ ماهانهٔ پروژه و سقف روزانهٔ حساب هم هست؛ جزئیاتش در مدیریت هزینه و محدودیتها.
کلید را کجا نگه دارید#
- روی سرور، در متغیر محیطی یا مدیر رمز (Secret Manager). نه در کد، نه در مخزن گیت، نه در فایلی که همراه برنامه منتشر میشود.
- برای هر برنامه و هر محیط یک کلید جدا. کلید «توسعه» و «تولید» را جدا بسازید تا اگر یکی لو رفت، فقط همان را باطل کنید.
- برای هر کلید سقف هزینه بگذارید. کلیدی که لو برود، تا سقف خودش خرج میکند، نه تا ته اعتبار حساب.
- اگر سرورتان IP ثابت دارد، فهرست IP مجاز را پر کنید. آنوقت کلید لورفته از جای دیگری کار نمیکند.
وبسرویس گیسو درخواست مستقیم مرورگر را هم میپذیرد (CORS باز است، مثل خود OpenAI)، ولی هر کسی کد صفحه یا اپ را باز کند، کلید را میبیند و با اعتبار شما درخواست میفرستد. برنامهٔ سمت کاربر را به سرور خودتان وصل کنید و کلید فقط روی سرور بماند. اگر برای نمونهٔ آزمایشی ناچارید، کلیدی با سقف هزینهٔ کم، یک مدل مجاز و تاریخ انقضای نزدیک بسازید.
نمونهٔ یک سرور کوچک که کلید را پیش خودش نگه میدارد و مرورگر فقط با آن حرف میزند:
// server.js — the browser talks to YOUR server; only the server knows the key.
import express from "express";
import OpenAI from "openai";
const app = express();
app.use(express.json());
const gisoo = new OpenAI({ baseURL: "https://gisoo.pro/api/v1", apiKey: process.env.GISOO_API_KEY });
app.post("/chat", async (req, res) => {
// your own checks first: signed-in user, message length, daily quota...
const reply = await gisoo.chat.completions.create({
model: "gpt-4o-mini",
messages: [{ role: "user", content: String(req.body.message).slice(0, 4000) }],
max_tokens: 400,
});
res.json({ text: reply.choices[0].message.content });
});
app.listen(3000);
# app.py — Flask: the key stays on the server
import os
from flask import Flask, request, jsonify
from openai import OpenAI
app = Flask(__name__)
gisoo = OpenAI(base_url="https://gisoo.pro/api/v1", api_key=os.environ["GISOO_API_KEY"])
@app.post("/chat")
def chat():
message = str(request.json.get("message", ""))[:4000]
reply = gisoo.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": message}],
max_tokens=400,
)
return jsonify(text=reply.choices[0].message.content)
چرخش و ابطال کلید#
برای عوض کردن کلید بدون قطعی، این ترتیب را نگه دارید:
- کلید تازه بسازید
همان تنظیمهای کلید قبلی را به کلید تازه بدهید.
- کلید تازه را در برنامه بگذارید
برنامه را با کلید تازه بالا بیاورید و با
GET /meمطمئن شوید کار میکند. - کلید قبلی را باطل کنید
از همان بخش API اپ. کلید باطلشده از همان لحظه با
401 api_key_revokedرد میشود و دوباره فعال نمیشود.
اول باطلش کنید، بعد سراغ پیدا کردن جای نشت بروید. هزینهای که پیش از ابطال با آن کلید خرج شده در گزارش مصرف دیده میشود. اگر مصرف ناآشنایی دیدید، با شناسهٔ درخواستها تیکت بفرستید.
خطاهای احراز هویت#
| وضعیت و کد | یعنی چه |
|---|---|
401 missing_api_key | هیچ کلیدی در هدرها نبود. |
401 invalid_api_key | کلیدی با این مقدار وجود ندارد. |
401 api_key_revoked | کلید باطل شده است. |
401 api_key_expired | تاریخ انقضای کلید گذشته است. |
401 api_key_disabled | کلید موقتاً خاموش شده است. |
403 ip_not_allowed | IP درخواست در فهرست مجاز این کلید نیست. |
429 too_many_failed_attempts | از این IP در ده دقیقه بیش از ۲۰ کلید نادرست آمده است؛ چند دقیقه بعد دوباره امتحان کنید. |
پاسخ پرسشتان را پیدا نکردید؟
شناسهٔ درخواست (هدر X-Request-Id) را با پرسشتان در تیکت بفرستید تا دقیق بررسی کنیم.