Skip to main content

gpt2api-openai-gateway

OpenAI-compatible SaaS gateway that reverse-engineers chatgpt.com to provide GPT Image 2, multi-account pooling, batch image generation, and billing management.

소스 정보

저장소
reason-machines/trending-skills
최근 소스 활동
2026년 4월 21일 14:42
감지된 SKILL.md 언어
영어
스타
82
포크
15

설치 방법

기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.

소스 파일 검토

설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.

SKILL.md 표시 중

SKILL.md
소스 지침 · 읽기 전용 미리보기
name
gpt2api-openai-gateway
description
OpenAI-compatible SaaS gateway that reverse-engineers chatgpt.com to provide GPT Image 2, multi-account pooling, batch image generation, and billing management.
triggers
["set up gpt2api gateway","configure chatgpt account pool","generate images with gpt-image-2","deploy openai compatible proxy","batch image generation with chatgpt","add accounts to gpt2api","configure gpt2api proxy pool","integrate gpt2api with openai sdk"]
# gpt2api OpenAI Gateway > Skill by [ara.so](https://ara.so) — Daily 2026 Skills collection. `gpt2api` is a self-hosted OpenAI-compatible API gateway that reverse-engineers `chatgpt.com` to expose GPT Image 2 / DALL·E 3 / IMG2 grayscale capabilities via standard `/v1/images/generations`, `/v1/images/edits`, and `/v1/chat/completions` endpoints. It provides multi-account pooling, proxy pooling, rate limiting, credit billing, and an admin dashboard. --- ## Installation & Deployment ### Docker Compose (Recommended) ```bash git clone https://github.com/432539/gpt2api.git cd gpt2api/deploy cp .env.example .env ``` Edit `.env` — these three are **required**: ```env JWT_SECRET=<generate with: openssl rand -base64 48 | tr -d '=/+' | cut -c1-48> CRYPTO_AES_KEY=<generate with: openssl rand -hex 32> MYSQL_ROOT_PASSWORD=<strong-password> MYSQL_PASSWORD=<strong-password> ``` Generate secrets: ```bash # CRYPTO_AES_KEY (must be exactly 64 hex chars = 32 bytes AES-256) openssl rand -hex 32 # JWT_SECRET (>=32 chars) openssl rand -base64 48 | tr -d '=/+' | cut -c1-48 ``` Start services: ```bash docker compose up -d --build docker compose logs -f server ``` On startup the server automatically: 1. Waits for MySQL health check 2. Runs `goose up` database migrations 3. Starts HTTP on `:8080` **Default admin credentials** (change immediately): - URL: `http://<server-ip>:8080/` - Email: `admin@example.com` - Password: `admin123` --- ## Configuration Main config file: `configs/config.yaml` (override with `GPT2API_*` env vars in Docker). ```yaml app: listen: ":8080" base_url: "https://your-domain.com" # used for signed image proxy URLs mysql: dsn: "user:pass@tcp(mysql:3306)/gpt2api?parseTime=true" max_open_conns: 500 redis: addr: "redis:6379" pool_size: 500 # needed for distributed locks & rate limiting jwt: secret: "${JWT_SECRET}" access_ttl_sec: 7200 refresh_ttl_sec: 604800 crypto: aes_key: "${CRYPTO_AES_KEY}" # 64-char hex, encrypts account AT/cookies scheduler: min_interval_sec: 10 # minimum seconds between uses of same account daily_usage_ratio: 0.8 # daily usage cap ratio before circuit break cooldown_429_sec: 300 # backoff when upstream returns 429 ``` Environment variable override pattern (Docker): ```env GPT2API_APP_BASE_URL=https://api.example.com GPT2API_SCHEDULER_MIN_INTERVAL_SEC=15 GPT2API_SCHEDULER_COOLDOWN_429_SEC=600 ``` --- ## Quick Start: First Image Generation ### 1. Add a Proxy Via admin dashboard → **Proxy Management** → New Proxy, or via API: ```bash curl -X POST http://localhost:8080/api/admin/proxies \ -H "Authorization: Bearer $ADMIN_JWT" \ -H "Content-Type: application/json" \ -d '{ "name": "proxy-us-01", "url": "http://user:pass@proxy.example.com:8080", "type": "http" }' ``` SOCKS5 example: ```bash -d '{"name":"socks-01","url":"socks5://user:pass@proxy.example.com:1080","type":"socks5"}' ``` ### 2. Import ChatGPT Accounts Batch import via admin dashboard → **GPT Accounts** → Batch Import. Supported formats — JSON session: ```json [ { "email": "user@example.com", "access_token": "$CHATGPT_ACCESS_TOKEN", "refresh_token": "$CHATGPT_REFRESH_TOKEN", "proxy_id": 1 } ] ``` Or AT/RT/ST plain text (one per line in the UI). ### 3. Create an API Key Admin dashboard → **User Management** → select user → **API Keys** → Create Key. Or programmatically: ```bash curl -X POST http://localhost:8080/api/user/apikeys \ -H "Authorization: Bearer $USER_JWT" \ -H "Content-Type: application/json" \ -d '{ "name": "my-app-key", "rpm_limit": 60, "daily_quota": 1000, "model_whitelist": ["gpt-image-2", "picture_v2"] }' ``` ### 4. Generate an Image ```bash curl -X POST http://localhost:8080/v1/images/generations \ -H "Authorization: Bearer sk-your-api-key" \ -H "Content-Type: application/json" \ -d '{ "model": "gpt-image-2", "prompt": "A serene mountain lake at sunset, photorealistic", "n": 2, "size": "1024x1024" }' ``` Response: ```json { "created": 1713456789, "data": [ { "url": "https://your-domain.com/p/img/task123/0?exp=1713460389&sig=abc123" }, { "url": "https://your-domain.com/p/img/task123/1?exp=1713460389&sig=def456" } ] } ``` --- ## API Reference ### Image Generation ``` POST /v1/images/generations ``` ```json { "model": "gpt-image-2", // or "picture_v2" for IMG2 grayscale "prompt": "your prompt", "n": 1, // number of images (1-4 recommended) "size": "1024x1024", // "1024x1024" | "1792x1024" | "1024x1792" "response_format": "url" // "url" | "b64_json" } ``` ### Image Edit (img2img) ``` POST /v1/images/edits Content-Type: multipart/form-data ``` ```bash curl -X POST http://localhost:8080/v1/images/edits \ -H "Authorization: Bearer sk-your-api-key" \ -F "image=@input.png" \ -F "prompt=Make the sky more dramatic" \ -F "model=gpt-image-2" \ -F "n=1" ``` ### Check Task Status ``` GET /v1/images/tasks/:id Authorization: Bearer sk-your-api-key ``` ### List Models ``` GET /v1/models Authorization: Bearer sk-your-api-key ``` ### Chat Completions (preserved, UI disabled) ``` POST /v1/chat/completions ``` ```json { "model": "gpt-4o", "messages": [{"role": "user", "content": "Hello"}], "stream": true } ``` --- ## Using with OpenAI SDK ### Python ```python from openai import OpenAI import os client = OpenAI( api_key=os.environ["GPT2API_KEY"], # your sk- key from the dashboard base_url="http://localhost:8080/v1" # or your production domain ) # Single image response = client.images.generate( model="gpt-image-2", prompt="A futuristic city skyline at night, cyberpunk style", n=1, size="1024x1024" ) print(response.data[0].url) # Batch images response = client.images.generate( model="gpt-image-2", prompt="Abstract watercolor painting, vibrant colors", n=4, size="1024x1792" # 9:16 portrait ) for img in response.data: print(img.url) ``` ### Node.js / TypeScript ```typescript import OpenAI from "openai"; const client = new OpenAI({ apiKey: process.env.GPT2API_KEY, baseURL: process.env.GPT2API_BASE_URL ?? "http://localhost:8080/v1", }); async function generateImages(prompt: string, count: number = 2) { const response = await client.images.generate({ model: "gpt-image-2", prompt, n: count, size: "1024x1024", }); return response.data.map((img) => img.url); } // Image edit async function editImage(imagePath: string, prompt: string) { const fs = await import("fs"); const response = await client.images.edit({ image: fs.createReadStream(imagePath), prompt, model: "gpt-image-2", }); return response.data[0].url; } ``` ### Go ```go package main import ( "context" "fmt" "os" openai "github.com/sashabaranov/go-openai" ) func main() { cfg := openai.DefaultConfig(os.Getenv("GPT2API_KEY")) cfg.BaseURL = os.Getenv("GPT2API_BASE_URL") // e.g. "http://localhost:8080/v1" client := openai.NewClientWithConfig(cfg) resp, err := client.CreateImage(context.Background(), openai.ImageRequest{ Model: "gpt-image-2", Prompt: "A tranquil Japanese garden with cherry blossoms", N: 2, Size: openai.CreateImageSize1024x1024, }) if err != nil { panic(err) } for _, img := range resp.Data { fmt.Println(img.URL) } } ``` --- ## Key Concepts ### IMG2 Grayscale Hit IMG2 is a grayscale (A/B test) feature on `chatgpt.com` that returns multiple high-res final images in a single call. The gateway: 1. Sends the generation request 2. Detects `preview_only` in the tool message response 3. Automatically retries up to 3 times within the same conversation to capture IMG2 output 4. Returns all signed image URLs aggregated Use model `picture_v2` to specifically target the IMG2 grayscale path: ```json { "model": "picture_v2", "prompt": "...", "n": 1 } ``` Successful IMG2 hit shows in logs: ``` image runner result summary turns_used=1 is_preview=false signed_count=2 ``` ### Account Pool Scheduling The scheduler uses Redis distributed locks to serialize account usage: - `min_interval_sec`: minimum gap between consecutive uses of the same account - `daily_usage_ratio`: if an account hits this fraction of its daily limit, it's circuit-broken - `cooldown_429_sec`: account is cooled down after receiving a 429 from upstream - Accounts are bound 1:1 to `oai-device-id` / `oai-session-id` fingerprints (stored in DB) ### Image Proxy & Anti-Hotlink All returned image URLs go through the built-in HMAC-signed proxy: ``` /p/img/:task_id/:index?exp=<unix_timestamp>&sig=<hmac_sha256> ``` This bypasses `chatgpt.com`'s `estuary/content` 403 hotlink protection. The proxy fetches and streams the image server-side when accessed. ### Credit Billing System - Users have a credit wallet; credits are pre-deducted before generation - Group multipliers allow VIP / internal / reseller pricing tiers - Billing settled after successful generation; failed calls are refunded - EPay (易支付) integration for recharge --- ## Admin Operations ### Account Pool Management ```bash # Check account statuses via API curl http://localhost:8080/api/admin/accounts \ -H "Authorization: Bearer $ADMIN_JWT" # Manually trigger account token refresh curl -X POST http://localhost:8080/api/admin/accounts/123/refresh \ -H "Authorization: Bearer $ADMIN_JWT" # Bulk import accounts (JSON body) curl -X POST http://localhost:8080/api/admin/accounts/batch \ -H "Authorization: Bearer $ADMIN_JWT" \ -H "Content-Type: application/json" \ -d @accounts.json ``` ### Database Backup & Restore Via admin dashboard → **Data Backup**, or: ```bash # Trigger backup curl -X POST http://localhost:8080/api/admin/backups \ -H "Authorization: Bearer $ADMIN_JWT" # List backups curl http://localhost:8080/api/admin/backups \ -H "Authorization: Bearer $ADMIN_JWT" # Download backup curl http://localhost:8080/api/admin/backups/backup-2026-04-21.sql.gz \ -H "Authorization: Bearer $ADMIN_JWT" \ -o backup.sql.gz ```
GitHub에서 보기
이 SKILL.md는 매우 커서 SkillsMP가 여기에는 첫 섹션만 미리 보여줍니다. GitHub에서 보기