สร้าง API token แล้วดึง แพ็กเกจ, โควต้า token ที่เหลือ และ ยอดการใช้งาน จากสคริปต์ / CLI / ระบบอื่นได้
codex-cli-mac) และเลือกสิทธิ์ — read ดูข้อมูลอย่างเดียว, read,write บันทึก usage เข้ามาได้ด้วยllmk_… ครั้งเดียว (เก็บเป็น SHA-256 hash เท่านั้น) คัดลอกเก็บไว้ทันทีexport LLMHUB_TOKEN="llmk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" export LLMHUB_URL=""
401 ทันทีทุก endpoint ใต้ /api/v1/* รับ header Authorization: Bearer <token> (จะใช้ session cookie จากเบราว์เซอร์ก็ได้)
curl -s "$LLMHUB_URL/api/v1/me" -H "Authorization: Bearer $LLMHUB_TOKEN"
{
"user": { "id": "…", "email": "you@company.com", "display_name": "You", "org_id": "…", "role": "member", "package_id": "pro" },
"quota": { "package": { "id": "pro", "name": "Pro", "monthly_tokens": 5000000, "price_usd": 20 },
"period_start": "2026-09-01T00:00:00.000Z", "period_end": "2026-10-01T00:00:00.000Z",
"used_tokens": 182340, "used_cost_usd": 0.91, "requests": 57,
"remaining_tokens": 4817660, "percent_used": 3.6 }
}
/api/v1/quotaคืนแพ็กเกจปัจจุบัน, limit ต่อเดือน, ยอดที่ใช้ไปตั้งแต่ต้นเดือน (UTC) และ remaining_tokens
curl -s "$LLMHUB_URL/api/v1/quota" -H "Authorization: Bearer $LLMHUB_TOKEN" | jq .remaining_tokens
ตัวอย่างใช้ใน shell script เพื่อเช็คก่อนรันงานใหญ่:
remaining=$(curl -s "$LLMHUB_URL/api/v1/quota" -H "Authorization: Bearer $LLMHUB_TOKEN" | jq .remaining_tokens) if [ "$remaining" -lt 100000 ]; then echo "โควต้าใกล้หมด ($remaining tokens)"; exit 1; fi
Python:
import os, requests
r = requests.get(f"{os.environ['LLMHUB_URL']}/api/v1/quota",
headers={"Authorization": f"Bearer {os.environ['LLMHUB_TOKEN']}"})
q = r.json()
print(q["package"]["name"], q["used_tokens"], "/", q["package"]["monthly_tokens"], "→ เหลือ", q["remaining_tokens"])
/api/v1/usage?days=30&group_by=daygroup_by = day | provider | model | profile · days สูงสุด 365
curl -s "$LLMHUB_URL/api/v1/usage?days=7&group_by=model" -H "Authorization: Bearer $LLMHUB_TOKEN"
{
"days": 7, "group_by": "model",
"totals": { "total_tokens": 48210, "cost_usd": 0.31, "requests": 19 },
"rows": [
{ "key": "kimi-k2-0905-preview", "prompt_tokens": 30100, "completion_tokens": 9800, "total_tokens": 39900, "cost_usd": 0.0426, "requests": 15 },
{ "key": "gpt-5-codex", "prompt_tokens": 6000, "completion_tokens": 2310, "total_tokens": 8310, "cost_usd": 0.0306, "requests": 4 }
]
}
/api/v1/profilesรายการ profile ของคุณ (ไม่มี key — มีแค่ 4 ตัวท้าย)
/api/v1/usageใช้เมื่อคุณเรียก LLM เองนอกระบบ (Codex CLI, สคริปต์, n8n ฯลฯ) แล้วอยากให้ยอดมารวมบน dashboard/โควต้า
curl -s -X POST "$LLMHUB_URL/api/v1/usage" \
-H "Authorization: Bearer $LLMHUB_TOKEN" -H "Content-Type: application/json" \
-d '{ "provider": "codex", "model": "gpt-5-codex", "prompt_tokens": 1200, "completion_tokens": 400,
"external_id": "codex-session-abc123", "source": "codex-cli" }'
| field | ความหมาย |
|---|---|
provider | ชื่อ provider (kimi, codex, openai, anthropic, …) |
model | ใช้คำนวณ cost_usd อัตโนมัติจากราคา list (ส่ง cost_usd เองได้ถ้ารู้ค่าจริง) |
prompt_tokens / completion_tokens | จำนวน token (ถ้าไม่ส่ง total_tokens ระบบจะบวกให้) |
external_id | id ไม่ซ้ำจากฝั่งคุณ — ส่งซ้ำจะถูก ignore (idempotent) เหมาะกับการ import ซ้ำได้ปลอดภัย |
profile_id | ผูกกับ profile (ไม่บังคับ) |
วิธีที่แม่นที่สุด: ให้ระบบดึงตัวเลขจาก Usage & Cost API ของผู้ให้บริการโดยตรง ต้องใช้ Admin API key (คนละชนิดกับ key ที่ใช้เรียกโมเดล) — ใส่ครั้งเดียวที่ การใช้งานของฉัน → 🔗 GPT / Claude (ยอดส่วนตัว) หรือ หน้าองค์กร (ยอดทั้งทีม จับคู่รายคนด้วยอีเมล) ระบบจะ sync ทุกชั่วโมงอัตโนมัติ
sk-admin-…)llm-key-hub → คัดลอก key ที่ขึ้นต้นด้วย sk-admin- (แสดงครั้งเดียว)GET /v1/organization/usage/completions (group by user_id, model, project_id รายวัน) และ GET /v1/organization/costs สำหรับยอดบิลจริง แล้วเทียบ user_id กับ GET /v1/organization/users เพื่อได้อีเมลของแต่ละคนครอบคลุม: ทุก request ที่ใช้ API key ขององค์กร รวม Codex CLI / Codex IDE ที่ login ด้วย API key · ไม่ครอบคลุม: ChatGPT Plus/Pro/Team ที่ Codex login ด้วยบัญชี ChatGPT (ยอดพวกนั้นไม่มี API — ใช้ข้อ 7 แทน)
sk-ant-admin01-…)sk-ant-admin01- (แสดงครั้งเดียว)GET /v1/organizations/usage_report/messages (group by model, account_id, api_key_id รายวัน — นับ uncached input, cache read, cache creation, output แยกกัน) และ GET /v1/organizations/cost_report (ยอดบิลจริง, หน่วยเซนต์) แล้วเทียบ account_id กับ /v1/organizations/users หรือเจ้าของ key จาก /v1/organizations/api_keysครอบคลุม: ทุก request ผ่าน Claude API ขององค์กร รวม Claude Code ที่ login ด้วยบัญชี Console ขององค์กร (ยอดติด account_id → จับคู่อีเมลได้เลย) · ไม่ครอบคลุม: Claude Pro/Max ส่วนตัว และ Bedrock/Vertex/Foundry · ข้อมูลมาช้าประมาณ 5 นาที · ถ้าใช้ Claude Code ทั้งทีมยังมี GET /v1/organizations/usage_report/claude_code?starting_at=YYYY-MM-DD ที่ให้ค่าใช้จ่ายรายคน + จำนวน session/บรรทัดโค้ด/commit ด้วย (เพิ่มได้ใน src/sync.js)
| กรณี | ทำอย่างไร |
|---|---|
| แต่ละคนมี org ของตัวเอง (บัญชีส่วนตัว) | แต่ละคนใส่ Admin key ของตัวเองที่หน้า "การใช้งานของฉัน" — ยอดทั้งหมดจาก key นั้นนับเป็นของเขา |
| ทีมใช้ org เดียวกัน | admin ใส่ Admin key ครั้งเดียวที่หน้าองค์กร — ระบบจับคู่ยอดกับสมาชิกที่สมัครด้วยอีเมลเดียวกันกับใน OpenAI/Anthropic; ที่ยังไม่มีคนสมัครจะเห็นเป็น actor ✘ ในหน้าองค์กร พอเขาสมัครแล้ว sync รอบถัดไปย้ายยอดให้อัตโนมัติ |
| อยากนับเฉพาะบางโปรเจกต์/บาง key | ใส่ตัวกรอง project_ids (OpenAI) หรือ workspace_ids / api_key_ids (Anthropic) ตอนเชื่อมต่อ |
อ่านโควต้าจากสคริปต์: GET /api/v1/connections (ต้องใช้ API token ข้อ 1) คืน quota.spend_usd, budget_usd, remaining_usd, percent_used และ by_model ของแต่ละ connection
curl -s "$LLMHUB_URL/api/v1/connections" -H "Authorization: Bearer $LLMHUB_TOKEN" | jq '.connections[] | {provider, spend: .quota.spend_usd, remaining: .quota.remaining_usd}'
Codex CLI เก็บ session log ไว้ที่ ~/.codex/sessions/ (JSONL) ซึ่งมี token_count ของแต่ละ turn — สคริปต์นี้อ่านไฟล์ทั้งหมดแล้วส่งเข้ามาแบบ idempotent (รันซ้ำได้ ไม่นับซ้ำ):
#!/usr/bin/env bash
# sync-codex.sh — ส่งยอด token จาก Codex CLI เข้า LLM Key Hub
set -euo pipefail
for f in ~/.codex/sessions/**/*.jsonl; do
id=$(basename "$f" .jsonl)
read -r p c <<<"$(jq -rs '
[ .[] | select(.type=="event_msg" and .payload.type=="token_count") | .payload.info.total_token_usage ]
| (last // {}) | "\(.input_tokens // 0) \(.output_tokens // 0)"' "$f")"
[ "$p" = "0" ] && [ "$c" = "0" ] && continue
curl -s -X POST "$LLMHUB_URL/api/v1/usage" \
-H "Authorization: Bearer $LLMHUB_TOKEN" -H "Content-Type: application/json" \
-d "{\"provider\":\"codex\",\"model\":\"gpt-5-codex\",\"prompt_tokens\":$p,\"completion_tokens\":$c,\"external_id\":\"codex:$id\",\"source\":\"codex-cli\"}" >/dev/null
echo "synced $id in=$p out=$c"
done
ตั้ง cron/launchd ให้รันทุกชั่วโมงก็พอ (ส่งซ้ำได้ — ระบบ upsert ตาม external_id) · ถ้าใช้ Codex ผ่าน API key ขององค์กร ยอดจะโผล่ใน OpenAI Admin API อยู่แล้ว (ข้อ 6) ไม่ต้องรันสคริปต์นี้
codex app-serverCodex CLI/Desktop มี JSON-RPC app-server ในเครื่องที่ตอบ account/rateLimits/read (ใช้ไปกี่ % ของ window 5 ชม./รายสัปดาห์ + เวลารีเซ็ต + เครดิตเสริม) และ account/usage/read (token รายวัน) โดยใช้ login เดิมของคุณ ไม่ต้องมี API key สคริปต์ codex-quota-sync.mjs ดึงค่าเหล่านี้แล้วส่งขึ้น POST /api/v1/quota/snapshot:
LLMHUB_URL=$LLMHUB_URL LLMHUB_TOKEN=$LLMHUB_TOKEN node codex-quota-sync.mjs punyapat-codex # ✔ punyapat-codex (prolite) → https://team.specificimpulse.co # weekly: used 100% · remaining 0% · resets 26/9/2026 20:29 # today 1,234,567 tokens · lifetime 2,500,511,518
payload: { source, label, plan, account, windows:[{name, used_percent, window_minutes, resets_at}], credits:{balance,has_credits,unlimited}, usage:{lifetime_tokens, today_tokens, daily:[{date,tokens}]} } — ส่ง source: "claude-code" พร้อม windows ของคุณเองได้ด้วยรูปแบบเดียวกัน · ค่าจะแสดงในหน้า "การใช้งานของฉัน", หน้าแรก และ dashboard (ถ้าเปิด public stats) และ daily ถูกนับเป็น usage ของคุณบน leaderboard (provider codex)
claude-quota-sync.mjsทางลัด: หน้า /connect สร้าง token แล้วให้คำสั่งเดียว curl -fsSL …/setup/install.sh | LLMHUB_TOKEN=… bash ซึ่งดาวน์โหลดสคริปต์ทั้งสอง, รันครั้งแรก และตั้ง launchd (macOS) / cron (Linux) ทุก 30 นาทีให้เอง — ด้านล่างคือรายละเอียดถ้าจะทำมือ
บัญชีเดี่ยวไม่มี Admin API แต่ Claude Code เก็บ log ไว้ที่ ~/.claude/projects/*/*.jsonl (ทุกคำตอบมี message.usage พร้อม model) สคริปต์ claude-quota-sync.mjs รวมยอดรายวัน × model (input / output / cache read / cache write → ระบบคิดค่าใช้จ่ายให้) และดึง % ของ window 5 ชม. / 7 วัน จาก session login ของ Claude Code เอง (/api/oauth/usage) แล้วส่งขึ้นเว็บ:
LLMHUB_URL=$LLMHUB_URL LLMHUB_TOKEN=$LLMHUB_TOKEN node claude-quota-sync.mjs punyapat-claude # ✔ punyapat-claude (team) → https://team.specificimpulse.co · 490 log files, 41 day×model rows # 5h: used 37% · remaining 63% · resets 22/9/2026 14:00 # weekly: used 71% · remaining 29% · resets 25/9/2026 09:00 # today 54,000,000 tokens · last 30 days 305,000,000 tokens
ใส่ --no-windows ถ้าไม่ต้องการให้สคริปต์แตะ credential ของ Claude Code (จะได้เฉพาะยอด token) · --days=90 เปลี่ยนช่วง · ตั้ง cron ทุก 30 นาทีเหมือน Codex · ยอดขึ้นฝั่ง Claude ใน ⚔️ GPT vs Claude และการ์ด 📟 โควต้า subscription
ได้ 2 ทาง ใช้ร่วมกันได้:
org_id อัตโนมัติ → admin เห็นตารางรายคน, กราฟรายวัน, ตั้งแพ็กเกจ/role ให้สมาชิกได้ และเลือกเปิดให้ยอดรวม org โชว์บน dashboard สาธารณะprovider cloudflare = Workers AI ผ่าน AI binding ของ Worker (ไม่ต้องมี key, free tier 10,000 neurons/วัน) — ฟรี: gpt-oss-120b (default), Llama 4 Scout, Llama 3.3 70B, Qwen3.8, Gemma 4, Mistral Small ฯลฯ · ต้อง Workers Paid ($5/เดือน): Kimi K2.6/K2.7-code, DeepSeek V4, GLM-5.x · ยอด token/ค่าใช้จ่ายถูกนับเข้าระบบเหมือน provider อื่น
Moonshot (Kimi) มี balance endpoint (/v1/users/me/balance) — เพิ่ม provider อื่นได้ใน src/sync.js ด้วยโครงสร้างเดียวกัน
| status | ความหมาย |
|---|---|
401 | ไม่มี/ผิด token หรือ session หมดอายุ |
402 | โควต้า token ของเดือนนี้หมด (ตอบพร้อม quota) |
403 | token ไม่มีสิทธิ์ write / ไม่ใช่ admin ขององค์กร |
502 | provider ปลายทาง (Kimi/OpenAI/…) ตอบ error — ดู error ใน body |
MASTER_KEY (Worker secret) ก่อนลง D1 — ไม่มี endpoint ไหนคืน key กลับมาHttpOnly; Secure; SameSite=Lax