Lets you connect an existing ChatGPT Plus, Pro, or Team subscription to access gpt-5-codex and related models without needing an API key. It's an OAuth device-code flow: you get a verification URL and code, the user logs into their OpenAI account in a browser, then you poll to finalize. The big gotcha is that the frontend won't show the new models until the user manually refreshes the page, so you have to tell them that explicitly or they'll think it failed. Only use this when someone explicitly says they want to sign in with their ChatGPT subscription. If they mention an API key instead, that's a different setup path entirely.
npx -y skills add starchild-ai-agent/official-skills --skill chatgpt-codex-onboarding --agent claude-codeInstalls into .claude/skills of the current project.
Use the user's existing ChatGPT or Codex subscription for gpt-5-codex, gpt-5, gpt-5-mini access — without an API key.
This is a script-mode skill — no tools registered. Read this file, then call the exports from a bash block.
byok-custom-model skill — for vendor-key BYOK setup (DIFFERENT mechanism, NOT OAuth)config/context/references/model-onboarding.md — overall model-selection landscape✅ Use when the user EXPLICITLY says one of:
❌ Do NOT use for:
byok-custom-model⚠️ Vendor names that sound similar (Codex, OpenAI, GPT) are NOT a signal to start OAuth on their own. Only an explicit user mention of "subscription / sign in / login with ChatGPT" qualifies.
If poll returns status='pending', the user hasn't finished yet — wait for them, then poll again. Don't loop poll automatically.
python3 - <<'EOF'
import sys, json
sys.path.insert(0, "/data/workspace/skills/chatgpt-codex-onboarding")
from exports import status, start, poll, logout, refresh, models, usage
# Check current state
print(json.dumps(status(), indent=2))
# Start a flow
result = start()
print(f"Open: {result['verification_url']}\nCode: {result['user_code']}")
EOF
After the user approves:
python3 - <<'EOF'
import sys, json
sys.path.insert(0, "/data/workspace/skills/chatgpt-codex-onboarding")
from exports import poll
print(json.dumps(poll(), indent=2))
EOF
| Function | Required args | Purpose |
|---|---|---|
status() | — | Inspect current OAuth state, expiry, model list |
start() | — | Begin device-code flow → verification_url + user_code |
poll(pending_id=None) | — | Check authorization (call after user confirms approval) |
logout() | — | Disconnect + remove credentials |
refresh() | — | Force-refresh access token (debug; normally automatic) |
models(force=False) | — | List available models from the OAuth endpoint |
usage(force=False) | — | Subscription usage stats |
force=True on models / usage bypasses the cache TTL.
All functions return a dict with ok: True on success or ok: False, error: "..." on failure.
When poll() returns status='connected', the first thing you must do is tell the user:
"Connection successful. Please refresh your browser page — once it reloads, the new
openai-codex/*models will appear in the model picker."
The web frontend caches the model list client-side and does not auto-refresh after an OAuth connect completes. Without a manual page refresh the user will not see their newly available models and will think the connection failed. Always include this instruction in your reply — do not assume the picker updates on its own.
Models appear with the openai-codex/ prefix:
openai-codex/gpt-5-codex — primaryopenai-codex/gpt-5 — full GPT-5openai-codex/gpt-5-mini — smaller / fasterAfter refresh, the user switches via /model openai-codex/gpt-5-codex or the model picker UI.
Subsequent calls hit OpenAI directly using the OAuth token — bypasses the platform proxy. Subscription usage limits apply (not the platform's credit balance).
Tokens auto-refresh via refresh_token. If a 401 surfaces:
refresh() — try the manual refresh path.logout() + restart from start().start and poll. Auto-polling wastes API calls and gives stale "pending" responses.sickn33/antigravity-awesome-skills
moizibnyousaf/ai-agent-skills
github/awesome-copilot