diff --git a/.gitignore b/.gitignore index 2173b7ea..b07cd286 100644 --- a/.gitignore +++ b/.gitignore @@ -130,6 +130,7 @@ docs/* !docs/PAYMENT.md !docs/PAYMENT_CN.md !docs/superpowers/ +!docs/design-drafts/ .superpowers/ .serena/ .codex/ diff --git a/docs/design-drafts/Landing.html b/docs/design-drafts/Landing.html new file mode 100644 index 00000000..4442b254 --- /dev/null +++ b/docs/design-drafts/Landing.html @@ -0,0 +1,1183 @@ + + + + +PURO AI — 你的 AI 订阅,已经付过钱了 + + + + + + + + +
+
+ + + + + +
+
+ NEW + 统一接入多个 AI 平台 · 零改动切换 +
+

你的 AI 订阅,
已经付过钱了。

+

+ Claude Pro · ChatGPT Plus · Codex · Gemini 订阅
+ 聚合成统一 API,零改动接入 OpenAI / Anthropic SDK +

+
+ 立即开始 → + 查看文档 +
+
+ 无需信用卡 + + 用你已有的订阅 + + 5 分钟跑通 +
+
+ + +
+
+
// providers
+

支持的 AI 平台

+

通过 OAuth 直接复用你的订阅,无需申请官方 API key

+
+
+
+ + +
Claude
+
Pro / Max
+
+
+ + +
ChatGPT
+
Plus / Pro
+
+
+ + +
Codex CLI
+
OpenAI
+
+
+ + +
Gemini
+
Code Assist
+
+
+ + +
更多
+
即将推出
+
+
+
+ + +
+
+
// features
+

付一次订阅,
用起一整个模型池

+

把散落在各个平台的订阅,整合成开发者真正能用的基础设施

+
+
+
+
+

一个 key 接所有模型

+

不再为每个 provider 申请 API key、配置 base_url。统一 sk- 走 Claude / GPT / Gemini,按 model 自动路由到对应账号池。

+
    +
  • OpenAI Responses API 兼容
  • +
  • Anthropic Messages API 兼容
  • +
  • 智能 model → provider 路由
  • +
+
+
+
🔄
+

账号池高可用

+

多账号自动调度。某个 ChatGPT Plus 触发限流,自动 failover 到下一个。重启、刷新 token 全自动。

+
    +
  • 限流/5xx 自动 failover
  • +
  • OAuth token 自动刷新
  • +
  • 加权轮询 · 最少连接
  • +
+
+
+
📊
+

用量看板

+

每条请求的 tokens、费用、上游账号、延迟全可视化。模型分布饼图 + 趋势曲线 + Top 排行。

+
    +
  • 逐请求审计日志
  • +
  • 多维度 tokens / cost 统计
  • +
  • 导出 CSV / 接 Webhook
  • +
+
+
+
+ + +
+
+
// integration
+

把 base_url 一改,就能用

+

兼容 OpenAI / Anthropic / Gemini SDK,零代码改动

+
+ +
+
+
+
+
~/.codex/config.toml
+
curl.sh
+
● edited 2s ago
+
+
1# Codex CLI — 只改 base_url 就能走 PURO
2model_provider = "puro"
3model = "gpt-5-codex"
4
5[model_providers.puro]
6 name = "PURO AI"
7 base_url = "https://ai.puro.im/v1"
8 wire_api = "responses"
9 env_key = "PURO_API_KEY" # export PURO_API_KEY=sk-puro-…
+
+ +
+
+
+
curl.sh
+
zsh · puro ≈ 210ms
+
+
1$ curl https://ai.puro.im/v1/chat/completions \
2 -H "Authorization: Bearer $PURO_API_KEY" \
3 -H "Content-Type: application/json" \
4 -d '{
5 "model": "claude-sonnet-4-5", # 自动路由到 Claude Pro 池
6 "stream": true,
7 "messages": [{ "role": "user", "content": "写一个斐波那契" }]
8 }'
9
10# ← event: content_block_delta · account=claude-3 · 187ms · 42 tok
+
+
+ +
+ 支持 OpenAI Responses API · Anthropic Messages API · Gemini generateContent · 流式 SSE & WebSocket +
+
+ + +
+
+
// observability
+

每条请求都看得见

+

+ 不像第三方 API 池子那种"扣了多少不告诉你"。你能看到每次调用:扣了哪个账号、跑了哪个模型、用了多少 tokens、花了多少钱、上游响应几秒。 +

+
+ +
+
+
+
ai.puro.im/dashboard
+
me@puro
+
+
+ +
+
+
+
Requests · 24h
+
18,294
+
▲ 12.4%
+
+
+
Tokens · 24h
+
4.7M
+
▲ 8.1%
+
+
+
Avg latency
+
312ms
+
▼ 4.2%
+
+
+
Est. savings
+
$847
+
vs. pay-as-you-go
+
+
+ +
+
+
+ Requests over time +
+ Claude + GPT + Gemini +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + 00:00 + 06:00 + 12:00 + 18:00 + now + + +
+
+
+ Model distribution + · 24h +
+ +
+ + + + + + + + + + + +
+
Claude48%
+
GPT32%
+
Gemini14%
+
Codex6%
+
+
+
+
+ +
+
+
Recent requests
+
live · 12 of 18,294
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TimeProviderModelTokensCostLatencyStatus
13:42:18claude-3sonnet-4-52,847$0.042213ms● 200
13:42:11gpt-plus-7gpt-5-codex1,204$0.018167ms● 200
13:42:03gemini-2gemini-2.5-pro4,102$0.000392ms● 200
13:41:58claude-1sonnet-4-56,318$0.095284ms● 429 → failover
13:41:49gpt-plus-2gpt-5892$0.013141ms● 200
+
+
+
+
+ + +
+

把订阅变成 API — 5 分钟

+

绑定第一个账号,生成 sk- key,把 base_url 指过来。就这些。

+
+ 创建账户 → + 登录已有账户 +
+
+
+ + + + + + diff --git a/docs/design-drafts/Login.html b/docs/design-drafts/Login.html new file mode 100644 index 00000000..36c3a207 --- /dev/null +++ b/docs/design-drafts/Login.html @@ -0,0 +1,689 @@ + + + + +登录 — PURO AI + + + + + + + + +
+ +
+
+
+ + +
+
// 你的订阅,已经付过钱了
+

+ N 个订阅 + + 1 个 key +

+
+ 省去切换账号的繁琐, + 省去为多个高昂订阅重复买单。 + PURO(纯粹)—— 让 AI 调用回归本质。 +
+ +
+
POST /v1/chat/completions
+
model claude-sonnet-4-5
+
route → claude-pool-03
+
status 200 · 213ms · 42 tok
+
+
+ +
+ Claude· + ChatGPT· + Codex· + Gemini + | + ai.puro.im · operational +
+
+
+ + +
+ ← 返回首页 + +
+

登录

+

用你的 PURO AI 账户继续

+ +
+ +
+ + + + + + + +
+
+ +
+ +
+ + + + + + + + +
+
+ + 忘记密码? +
+
+ + + +
OR
+ + + +
+ 没有账户?注册 +
+ + +
+
+
+ + + + + diff --git a/docs/design-drafts/Register.html b/docs/design-drafts/Register.html new file mode 100644 index 00000000..65b6c67c --- /dev/null +++ b/docs/design-drafts/Register.html @@ -0,0 +1,734 @@ + + + + +注册 — PURO AI + + + + + + + + +
+ +
+
+
+
+ + + + + + PURO AI + +
+ +
+
// 5 分钟开始用
+

+ N 个订阅 + + 1 个 key +

+
+ 省去切换账号的繁琐, + 省去为多个高昂订阅重复买单。 + PURO(纯粹)—— 让 AI 调用回归本质。 +
+ +
+
// 下一步
+
+
1
+
创建账户 · 邮箱 + 密码,或用 LinuxDO OAuth
+
+
+
2
+
绑定订阅 · OAuth 接入你现有的 Claude Pro / ChatGPT Plus
+
+
+
3
+
生成 key · 拿到 sk-puro-… 换掉 SDK 的 base_url
+
+
+
+ +
+ Claude· + ChatGPT· + Codex· + Gemini + | + 无需信用卡 · 永久免费 Hobby 套餐 +
+
+
+ + +
+ ← 返回首页 + +
+

创建账户

+

5 分钟开始用 PURO AI

+ +
+ +
+ + + + + + + + + + + + +
+
+ +
+ +
+ + + + + + + + +
+
+ +
+
+ // strength + +
+
+ +
+ +
+ + + + + + + + + + + + +
+
+
+ + + + + +
OR
+ + + +
+ 已有账户?登录 +
+ + +
+
+
+ + + + + diff --git a/docs/design-drafts/v2/API Keys.html b/docs/design-drafts/v2/API Keys.html new file mode 100644 index 00000000..6fff1177 --- /dev/null +++ b/docs/design-drafts/v2/API Keys.html @@ -0,0 +1,637 @@ + + + + + +API Keys — PURO AI + + + + + + + + +
+ +
+ + + +
+
+

API Keys

+
+
Zzane
+
+
+ +
+
+
+

API Keys

+
每个 key 是一张独立的"通行证",可以单独设置可用的订阅池、限速和预算,泄漏时可以直接吊销而不影响其他 key。
+
+ +
+ + +
+
+
活跃 Keys
+
3/ 10 上限
+
+
+
近 7 日调用
+
89,402
+
+
+
近 7 日花费
+
$24.18USD
+
+
+
已吊销
+
2
+
+
+ + +
+ + + +
+ +
+ + +
+ +
+
+
+ production + ACTIVE +
+
+ created 2026·03·14 + · + last used 2m ago + · + ● in use +
+
+ + + +
+
+ +
+ sk-puro- + ••••••••••••••••••••••••4f82 + 👁 显示 + 复制 +
+ +
+
+
可用订阅池
+
+ claude · 2 + gpt · 2 + gemini · 1 +
+
+
+
本月用量
+
$14.82 / $50
+
+
+
+
速率限制
+
120 RPM
+
+
+
关联应用
+
+ Claude Code + Cursor +
+
+
+
+ +
+
+
+ staging + RATE LIMITED +
+
+ created 2026·04·02 + · + last used 3h ago +
+
+ + + +
+
+
+ sk-puro- + ••••••••••••••••••••••••ae19 + 👁 显示 + 复制 +
+
+
+
可用订阅池
+
+ all pools +
+
+
+
本月用量
+
$8.24 / $10
+
+
+
+
速率限制
+
30 RPM
+
+
+
关联应用
+
+ 本地开发 +
+
+
+
+ +
+
+
+ cli-personal + ACTIVE +
+
+ created 2026·04·11 + · + last used 18h ago +
+
+ + + +
+
+
+ sk-puro- + ••••••••••••••••••••••••c3d1 + 👁 显示 + 复制 +
+
+
+
可用订阅池
+
+ claude · 1 +
+
+
+
本月用量
+
$1.12 / 无限制
+
+
+
+
速率限制
+
60 RPM
+
+
+
关联应用
+
+ Terminal +
+
+
+
+ + +
+
+
+ old-demo + REVOKED +
+
+ revoked 2026·03·02 +
+
+
+ sk-puro- + ••••••••••••••••••••••••0ab3 +
+
+
+
+
+
+ + +
+ +
+ + + diff --git a/docs/design-drafts/v2/Binding.html b/docs/design-drafts/v2/Binding.html new file mode 100644 index 00000000..a89dd567 --- /dev/null +++ b/docs/design-drafts/v2/Binding.html @@ -0,0 +1,561 @@ + + + + + +绑定订阅 — PURO AI + + + + + + + + +
+ +
+ + +
+
+ + + 返回 Dashboard + +
+
Zzane
+
+
+ +
+
+
+
// 绑定订阅 · 3 步完成
+

把你已有的 AI 订阅,变成 API

+

我们支持 OAuth 授权和 Cookie 托管两种方式接入 Claude / ChatGPT / Gemini。所有凭证使用 AES-256 加密存储,你可以随时一键解绑。

+
+ + +
+
+ + 选择平台 +
+
+
+ 2 + 授权绑定 +
+
+
+ 3 + 完成 & 加入池 +
+
+ + +
+
+ +
Claude
+
Anthropic · OAuth
+
+ Pro · $20 + Max · $100 + Team +
+
+ +
+ +
ChatGPT
+
OpenAI · OAuth + Cookie
+
+ Plus · $20 + Pro · $200 + Team +
+
+ +
+ +
Gemini
+
Google · Cookie
+
+ Advanced · $20 + Workspace +
+
+
+ + +
+
+ +
+

绑定 ChatGPT 账号

+
支持 Plus / Pro / Team · 接入后可用 gpt-5 / gpt-5-codex / gpt-4.1
+
+ + + AES-256 加密存储 + +
+ +
+ + +
+ 订阅档位 +
+
+
+
Plus
+
$20/月
+
~500k tokens · 约值 $0.08/k
+
+
+
Pro
+
$200/月
+
~5M tokens · 约值 $0.04/k
+
+
+
Team
+
$30/user
+
按席位池化,稳定性更高
+
+
+ + +
+

绑定方式 选择一种即可 · 可以在绑定后随时更换

+
+
+
+ OAuth 授权登录 + 推荐 +
+
+ 跳转到 ChatGPT 登录页,登录后自动回跳。不经过我们的密码表单,最接近"官方授权"体验。 +
+
+ 点击跳转 + ChatGPT 登录 + 授权回调 + 加入池 +
+
+ +
+
+ 粘贴 Session Cookie + 兼容模式 +
+
+ 用浏览器扩展一键导出 __Secure-next-auth.session-token 并粘贴到这里。适合多账号批量绑定。 +
+
+ 安装扩展 + 登录 chatgpt.com + 导出 cookie + 粘贴绑定 +
+
+
+ + +
+ + + + +
+ + + PURO + + chatgpt.com/oauth + + PURO +
+
约 15 秒
+
+
+ + +
+

本次绑定预览 授权成功后会自动加入池

+
+
+ + gpt-plus-7 + 加入 GPT 池 +
+
+ + gpt-plus-8 + 加入 GPT 池 +
+
+
+ + +
+
+ + 凭证仅用于代理请求,不会用于训练或泄露给第三方。 +
+
+ 稍后再说 + +
+
+
+
+ +
+
+
+
+ + diff --git a/docs/design-drafts/v2/Dashboard.html b/docs/design-drafts/v2/Dashboard.html new file mode 100644 index 00000000..3f3da566 --- /dev/null +++ b/docs/design-drafts/v2/Dashboard.html @@ -0,0 +1,770 @@ + + + + + +Dashboard — PURO AI + + + + + + + + + +
+ +
+ + + + + +
+
+ + +
+ + +
+ Z + zane + +
+
+
+ +
+ + +
+ + + + 你还有 2 个 Claude Pro 订阅未绑定 —— 绑定后立即享受多账号 failover 和请求加权调度。 + 去绑定 → + +
+ + +
+
+

Dashboard

+
欢迎回来 Zane · workspace zane-personal
+
+
+
+ + + + + +
+ +
+
+ + +
+ POST + https://ai.puro.im/v1/chat/completions + 复制 + · + 查看文档 +
+ + +
+
+ 充值 → +
余额
+
$182.40USD
+
按当前节奏约 23 天
+
+
+
今日请求
+
12,847
+
▲ 18.2% vs 昨日
+ + + +
+
+
消耗 Tokens
+
4.82M
+
▲ 12.5%
+ + + +
+
+
平均延迟
+
214ms
+
▲ 4.1% vs 昨日
+ + + +
+
+ + +
+
+
+ 请求趋势 +
+ Claude + GPT + Gemini +
+
+ + + + + + + + + + + + + + + + + + + Mon + Tue + Wed + Thu + Fri + Sat + Sun + + + + + + + Fri · 16:00 + Claude 3,824 + + +
+ +
+
+ 模型分布 + 7d +
+
+ + + + + + + +
+
Claude48%
+
GPT32%
+
Gemini14%
+
Codex6%
+
+
+
+
+ + +
+ +
+
+

订阅账号池

+ 查看全部 → +
+
+
+ +
claude-pool-01Pro · OAuth
+
+ healthy +
+
+ +
claude-pool-02Max · OAuth
+
+ healthy +
+
+ +
gpt-plus-7Plus · OAuth
+
+ near limit +
+
+ +
gpt-plus-8Pro · OAuth
+
+ healthy +
+
+ +
gemini-adv-01Advanced
+
+ healthy +
+
+ +
claude-pool-03Pro · expired
+
+ ● offline +
+ + + 绑定新订阅 + +
+
+ + +
+
+

最近请求

+ live · 12 of 18,294 +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TIMEACCOUNTMODELTOKENSCOSTSTATUS
13:42:18claude-pool-01sonnet-4-52,847$0.042200 · 213ms
13:42:11gpt-plus-7gpt-5-codex1,204$0.018200 · 167ms
13:42:03gemini-adv-01gemini-2.5-pro4,102$0.000200 · 392ms
13:41:58claude-pool-02sonnet-4-56,318$0.095200 · 288ms
13:41:49gpt-plus-7gpt-5892$0.013429 · retry
13:41:42gpt-plus-8gpt-5892$0.013200 · 198ms
13:41:35claude-pool-01haiku-4-5512$0.004200 · 98ms
13:41:28gemini-adv-01gemini-2.5-flash1,824$0.000200 · 156ms
+
+
+ +
+
+
+ + + diff --git a/docs/design-drafts/v2/Design System.html b/docs/design-drafts/v2/Design System.html new file mode 100644 index 00000000..742109c0 --- /dev/null +++ b/docs/design-drafts/v2/Design System.html @@ -0,0 +1,670 @@ + + + + + +Design System — PURO AI + + + + + + + + + +
+
+ + + +
+ + +
+
// design system · v1.0
+

PURO AI Design System

+

一套用来构建 PURO AI 所有界面的原子 token 和组件。产品的视觉语言围绕「开发者工具 · 深色为主 · 青色作为行动色 · JetBrains Mono 强调技术感」展开。

+
+ tokens · 29 + components · 22 + last updated · 2026.04.19 +
+
+ +
+ + +
+ + +
+

01Brand Lockup

+

六边形 + 内部实心菱形 — 代表"订阅被聚合成一个 key"。单色在小尺寸下使用,大尺寸下保留内描边增加分量。

+
+ + + + +
PURO.
+
+
+ + +
+

02Colors

+

所有颜色都以 CSS variables 定义在 puro.css。青色 (cyan) 是唯一的品牌色,其他颜色仅承担语义职责(success / warn / danger)。

+ +
Surfaces
+
+
bg-0
#0a0e1a
page
+
bg-1
#0f172a
raised
+
bg-2
#111827
card alt
+
bg-code
#020617
code
+
border
#1e293b
hairline
+
border-2
#334155
strong
+
+ +
Text
+
+
text-0
#f8fafc
primary
+
text-1
#cbd5e1
body
+
text-2
#94a3b8
muted
+
text-3
#64748b
hint
+
+ +
Accents
+
+
cyan
#22d3ee
primary / cta
+
purple
#a855f7
secondary glow
+
amber
#fbbf24
warn / featured
+
green
#34d399
success / 200
+
red
#f87171
error / 5xx
+
orange
#fb923c
flag / highlight
+
+ +
Provider Brand Dots
+
+
claude
#d97757
Anthropic
+
gpt
#10a37f
OpenAI
+
gemini
#4285f4
Google
+
codex
#f0a030
Codex
+
+
+ + +
+

03Typography

+

主字体 Inter · 等宽 JetBrains Mono。等宽仅用于代码、数据、时间戳、状态徽标,以强化开发者语境。

+ +
+
display · 56/64 · 800
+
你的 AI 订阅
+
+
+
h1 · 40/48 · 700
+
统一接入 API
+
+
+
h2 · 28/36 · 700
+
付一次,用一池
+
+
+
h3 · 18/26 · 600
+
多账号自动调度
+
+
+
body · 14/22 · 400
+
OAuth 绑定账号,零改动切换 base_url,沿用你习惯的 SDK。
+
+
+
caption · 12/18 · 400
+
某个 ChatGPT Plus 触发限流会自动 failover。
+
+
+
mono · 13 · 500
+
curl https://ai.puro.im/v1/chat/completions
+
+
+
kicker · mono · 12 · caps
+
// section kicker
+
+
+ + +
+

04Spacing Scale

+

4px 基线的 8 / 12 / 16 / 20 / 24 / 32 / 48 / 64 scale。页面垂直节奏用 32/48/64/96,卡片内部用 16/20/24。

+
+
4px
gap-xs · pill 间隔
+
8px
gap-sm · icon 内外距
+
12px
gap · 卡片网格
+
16px
stack-sm · 主要网格
+
20px
form field
+
24px
card padding
+
32px
content padding
+
48px
section break
+
64px
section head gap
+
96px
landing section
+
+
+ + +
+

05Radius & Shadow

+
+
6px
--r-sm
+
8px
--r-md (button, input)
+
12px
--r-lg (card)
+
16px
--r-xl (hero card)
+
+
Elevation
+
+
+
--shadow-lg
+
卡片悬浮 · 代码面板
+
+
+
--shadow-xl
+
仪表盘大图 · 对话框
+
+
+
+ + +
+

06Buttons

+

唯一的主色按钮 Primary(青色),其余都是 Ghost/Subtle。没有多种 primary —— 让每个页面最重要的那个 CTA 足够显眼。

+ +
Variants
+
+
+ + + + + +
+
+ +
Sizes
+
+
+ + + + +
+
+ +
Loading
+
+
+ + +
+
+
+ + +
+

07Badges

+
+
+ NEW + BETA + LIMITED + ACTIVE + EXPIRED + DRAFT +
+
+
+ + +
+

08Chips & Status

+

chip 用于在代码块周围承载"路由/参数/标签"信息,status-chip 是一个绝对定位的单像素点,用于显示账号/节点在线状态。

+
+
+ claude-pool-03 + gpt-plus-7 + gemini-2 + codex-pool-01 + 200 · 213ms +
+
+ OpenAI SDK + Anthropic SDK + /v1/chat/completions +
+
+
+ + +
+

09Form Fields

+
+
+
+ +
+ + + + +
+
默认 · 空态
+
+
+ + +
✓ 可用
+
+
+ + +
密码至少 8 位,包含数字和字母
+
+
+ + +
+
+ +
+ + +
+
+
+ + +
+

10Cards

+
+
+
// default
+
标准卡片
+
用于所有常规内容容器,12px 圆角 + 1px border。
+
+
+
// hover
+
可交互卡片
+
hover 时向上位移 2px,border 加深。
+
+
+
// raised
+
Raised 卡片
+
不透明背景,用于浮层/仪表盘主体。
+
+
+
+ + +
+

11Tables

+

主要用于请求日志、API Key 列表、计费记录。数字列一律等宽 tabular-nums。

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TIMEACCOUNTMODELTOKENSCOSTSTATUS
13:42:18claude-3sonnet-4-52,847$0.042200
13:42:11gpt-plus-7gpt-5-codex1,204$0.018200
13:42:03gemini-2gemini-2.5-pro4,102$0.000429
+
+
+ + +
+

12Code Frame

+
+
+
+ zsh · puro ≈ 210ms +
+
1# OpenAI SDK · 零改动
2from openai import OpenAI
3
4client = OpenAI(
5 base_url="https://ai.puro.im/v1",
6 api_key="sk-puro-••••",
7)
+
+
+ + + + +
+
+ + +
+ + + diff --git a/docs/design-drafts/v2/Docs.html b/docs/design-drafts/v2/Docs.html new file mode 100644 index 00000000..6f0d793a --- /dev/null +++ b/docs/design-drafts/v2/Docs.html @@ -0,0 +1,623 @@ + + + + + +Docs — PURO AI + + + + + + + + +
+ + + +
+ + + + +
+
+ Docs / + Getting Started / + 快速开始 +
+ +

快速开始

+

+ PURO AI 提供一个统一的 OpenAI 兼容端点 —— 你已有的 SDK 代码只需要改 base_urlapi_key 两行,就能用上你绑定的 Claude / ChatGPT / Gemini 订阅。整个过程通常不超过 5 分钟。 +

+ + +
+
+
STEP 01
+

绑定订阅

+

授权你的 Claude / ChatGPT 账号加入池。

+
+
+
STEP 02
+

创建 API Key

+

为每个客户端生成独立的 sk-puro-* key。

+
+
+
STEP 03
+

切换 base_url

+

改两行代码,剩下和官方 SDK 一模一样。

+
+
+ +

① 绑定你的订阅

+

+ 进入 Dashboard → 订阅账号 → 绑定新订阅,选择平台后通过 OAuth 一键授权。每个订阅都会被加入对应的"池",同一池内的请求会自动做负载均衡、限流回退和故障转移。 +

+
+ + + +
+ 凭证通过 AES-256 加密存储在隔离的 KMS 中。我们只会用它代理你发出的请求 —— 不会进入训练数据、不会做二次分发。详见 数据隐私。 +
+
+ +

② 创建 API Key

+

+ 在 Dashboard → API Keys → 创建 Key 生成一个 sk-puro-* 的 key。建议每个客户端 / 环境单独一个 key,泄漏时可以直接吊销而不影响其他场景。 +

+ +

③ 发送第一个请求

+

PURO AI 同时兼容 OpenAI 和 Anthropic 的 API 格式。按你原来在用的 SDK 风格选择对应的代码示例即可:

+ +
+
+
+ + + + +
+ ⧉ 复制 +
+
# pip install openai
+from openai import OpenAI
+
+client = OpenAI(
+    base_url="https://ai.puro.im/v1",
+    api_key="sk-puro-YOUR_KEY",
+)
+
+resp = client.chat.completions.create(
+    model="claude-sonnet-4-5",       # 可直接写任意平台的模型名
+    messages=[
+        {"role": "user", "content": "hi, who am I talking to?"}
+    ],
+)
+
+print(resp.choices[0].message.content)
+
+
+ +

返回结构完全符合 OpenAI 格式,可以无缝对接任何基于 OpenAI SDK 的应用(Cursor / Continue / Cline / Roo Code / Open WebUI …)。

+ +

可用模型

+

绑定后,下列模型都可以直接用 model 字段调用 —— PURO 会根据模型自动路由到对应的订阅池。

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MODELPROVIDER上下文状态
claude-sonnet-4-5ClaudePro / Max200kOK
claude-opus-4ClaudeMax200kOK
claude-haiku-4-5ClaudePro / Max200kOK
gpt-5ChatGPTPlus / Pro128kOK
gpt-5-codexChatGPTPlus / Pro128kOK
gemini-2.5-proGeminiAdvanced1MBETA
gemini-2.5-flashGeminiAdvanced1MOK
+ +

支持的 base_url

+

每种格式都提供独立的 base_url —— 如果你在用原生 Anthropic / Google SDK,请选择对应格式以获得最完整的字段兼容:

+ + + +
+ + + +
+ 一个 sk-puro-* 可以同时用于三种 base_url —— 鉴权和计费是统一的,你不需要为不同 SDK 维护多个 key。 +
+
+ +

下一步

+

把 PURO 接入到你常用的工具:

+ + + + +
+ + + +
+ + diff --git a/docs/design-drafts/v2/HANDOFF.md b/docs/design-drafts/v2/HANDOFF.md new file mode 100644 index 00000000..d45b71f5 --- /dev/null +++ b/docs/design-drafts/v2/HANDOFF.md @@ -0,0 +1,222 @@ +# PURO AI · 设计交付文档 + +> 把已有的 Claude / ChatGPT / Codex / Gemini 订阅聚合成统一 API · 让"已经付过钱的订阅"真正可编程 + +本文档面向**接手实现这套设计的工程团队 / Coding Agent**,说明每个 HTML 文件的用途、数据契约、交互逻辑,以及与后端的对接点。 + +--- + +## 0. 文件清单 + +| 文件 | 类型 | 说明 | +|---|---|---| +| `Landing.html` | 营销首页 | 未登录入口 · Hero / 模型墙 / 功能 / 代码示例 / Dashboard 预览 / Pricing / FAQ | +| `Pricing.html` | 定价页 | 完整定价 + 成本估算器 + 工具兼容墙 + 10 条 FAQ | +| `Docs.html` | 文档 | 快速开始 / 模型列表 / API 参考 / 各客户端配置 | +| `Login.html` | 登录 | 左侧叙事 + 右侧表单 · 支持 LinuxDO OAuth | +| `Register.html` | 注册 | 带密码强度 · 下一步引导 · 送 $5 | +| `Binding.html` | 订阅绑定 | 核心差异化流程 · OAuth 接入 Claude Pro / ChatGPT Plus | +| `Dashboard.html` | 控制台首页 | 余额 / 用量图表 / 近期请求 / 订阅池状态 | +| `API Keys.html` | Key 管理 | 创建 / 吊销 / 预算限制 / 模型白名单 | +| `Design System.html` | 设计系统 | 色板 / 字号 / 组件索引 | +| `puro.css` | 全站样式 | 所有页面共用的 tokens + primitives(.btn / .pill / .tag / .input 等) | + +**所有页面必须首行 meta:** `` —— 防止浏览器 auto-darken 覆盖 cyan 按钮。 + +--- + +## 1. 设计 Tokens(见 `puro.css`) + +``` +--bg-0: #0a0e1a 页面底 +--bg-1: #0f172a raised +--bg-2: #111827 card alt +--bg-code: #020617 代码面板 + +--border: #1e293b +--border-2:#334155 +--border-3:#475569 + +--text-0: #f8fafc 主 +--text-1: #cbd5e1 次 +--text-2: #94a3b8 说明 +--text-3: #64748b 弱 + +--cyan: #22d3ee 主强调(primary btn / 链接 / 数据点) +--cyan-2: #67e8f9 hover +--purple: #a855f7 次强调 / 装饰 +--amber: #fbbf24 提醒 / 限时标签 +--green: #34d399 成功 / 在线 +--red: #f87171 错误 / 危险 +``` + +字体:`Inter`(正文)+ `JetBrains Mono`(所有数值 / 代码 / 元信息)。 +圆角:`--r-sm 6px / --r-md 8px / --r-lg 12px / --r-xl 16px`。 + +--- + +## 2. 页面 → 后端契约 + +### 2.1 Landing · 无后端依赖(纯营销) +锚点:`#pricing` / `#faq` / `#features` / `#code` / `#dashboard`。注册 CTA → `Register.html`。 + +### 2.2 Register +提交表单需要 **后端返回**: +``` +POST /auth/register +{ email, password, linuxdo_token? } +→ 200 { user_id, jwt, balance_credits: 5.00 /* $5 注册赠送 */ } +``` +前端验证规则: +- 邮箱格式 `^[^\s@]+@[^\s@]+\.[^\s@]+$` +- 密码强度 ≥ 2(长度 ≥ 8 + 字母大小写混合即可通过) +- 两次密码一致 + 勾选 terms +成功后跳 `Binding.html`。 + +### 2.3 Login +``` +POST /auth/login +{ email, password } 或 { linuxdo_oauth_code } +→ 200 { jwt, user, has_subscriptions: boolean } +``` +若 `has_subscriptions === false`,引导去 `Binding.html`;否则去 `Dashboard.html`。 + +### 2.4 Binding(核心差异化) +OAuth 流程,每个平台: +``` +POST /bindings/oauth/start +{ provider: 'claude' | 'chatgpt' | 'codex' | 'gemini' } +→ { auth_url, state } +``` +前端打开 `auth_url` 新窗口;OAuth 回调: +``` +GET /bindings/oauth/callback?code=...&state=... +→ 302 → /binding/success?provider=claude&account_id=... +``` +绑定列表: +``` +GET /bindings +→ [ { id, provider, account_email, plan, status: 'healthy'|'cooling'|'error', quota_remaining_pct, bound_at } ] +DELETE /bindings/:id 解绑 +POST /bindings/:id/test 发一条测试请求验证凭证有效 +``` + +### 2.5 Dashboard +``` +GET /me/overview +→ { + balance: { credits: 45.23, bonus_credits: 12.00, expires_at: null }, + usage_today: { requests: 1842, tokens_in: 2.1e6, tokens_out: 4.8e5, cost: 1.23 }, + usage_30d: [{ date, cost, requests }, ...], + recent_requests: [{ ts, model, route_to, status, latency_ms, tokens, cost }, ...], + pool_status: [{ provider, accounts: [{ status, quota_pct }] }] +} +``` +图表用 `usage_30d` 绘制折线(cyan 主线,purple 副线)。 + +### 2.6 API Keys +``` +GET /api-keys +POST /api-keys { name, models?: string[], monthly_budget?: number } +DELETE /api-keys/:id +``` +Key 前缀 `sk-puro-` + 32 字符。创建后仅显示一次完整值,之后只保留前 8 位。 + +### 2.7 Pricing +纯静态展示。充值 CTA 统一走: +``` +POST /billing/topup +{ amount_usd, payment_method: 'alipay'|'wechat'|'usdt'|'stripe' } +→ { payment_url / qr_code, order_id } +``` +阶梯赠送在前端计算并展示(见 `Pricing.html` 底部 script),**后端下单时再次校验**: +``` +阶梯 = amount >= 500 ? 120% + : amount >= 200 ? 110% + : amount >= 99 ? 100% + : amount >= 50 ? 70% + : amount >= 30 ? 50% + : amount >= 20 ? 35% + : 21% +``` + +--- + +## 3. 统一 API Gateway(产品核心) + +所有用户集成的终点: +``` +https://api.puro.im/v1/chat/completions # OpenAI 兼容 +https://api.puro.im/v1/messages # Anthropic 兼容 +https://api.puro.im/v1beta/models/:m:generateContent # Gemini 兼容 +``` +Header: `Authorization: Bearer sk-puro-xxx` + +**调度逻辑(文档化在 `Docs.html`):** +1. 根据模型解析目标 provider +2. 从该 provider 的订阅池挑一个 `status=healthy` 的账号(权重:剩余配额 × 响应时延倒数) +3. 若 429 / 限流,标记 `cooling` 60-300s,failover 到下一个 +4. 若该 provider 所有订阅都 cooling 且用户余额 > 0,fallback 到官方 API +5. 所有请求写入 `request_logs`(用户可见,保留周期按套餐) + +--- + +## 4. 套餐与限制 + +| | Starter $9.9 | Pro $29.9 ⭐ | Scale $99 | Custom | +|---|---|---|---|---| +| 赠送 | +21% | +50% | +100% | 阶梯 | +| API Keys | 1 | 3 | 10 | 按 Pro | +| RPM | 60 | 120 | 300 | 按 Pro | +| 日志保留 | 7d | 30d | 90d | 按 Pro | +| 自带订阅 | ❌ | ∞ | ∞ | ✅ | +| 多账号 failover | — | ✅ | ✅ + 优先级 | ✅ | + +**Enterprise** 走 Sales 线:私有化 / SLA / Invoice,不在普通订单流里。 + +--- + +## 5. 交互细节(容易漏) + +- **余额不足**:Gateway 返回 `402 Payment Required`,Dashboard 顶部红色 banner + 发邮件(80% / 95% 两档预警) +- **订阅 cooling** 时 Dashboard 订阅卡片上角 amber 闪烁点 +- **API Key 创建**:弹窗必须强制用户复制一次,关闭弹窗后永远看不到完整值 +- **密码强度**:评分 0-4,label 对应 `— / 弱 / 中 / 强 / 极强`,颜色 `border / red / amber / cyan / green` +- **登录成功**:按钮变 green 显示 `✓ 登录成功`,800ms 后 window.location 跳转 +- **LinuxDO OAuth** 是 PURO 的目标用户群(开发者社区),作为次要登录按钮展示 + +--- + +## 6. 响应式断点 + +- `<= 900px`:Login/Register 的 split 变单列,narrative 折叠 +- `<= 820px`:Pricing grid 从 4 列 → 1 列 +- `<= 820px`:Landing pricing-grid-landing 从 3 列 → 1 列 +- `<= 960px`:Pricing 的 calculator 从 2 列 → 1 列 + +--- + +## 7. 后端技术建议(非设计范畴,仅供参考) + +- **Gateway 层**:Go / Rust 写高吞吐代理,HTTP/2 + streaming,每 provider 起独立 worker pool +- **调度**:Redis ZSET 存每个订阅的健康分 + cooling 过期时间 +- **日志**:写 ClickHouse(列存 + 按日分区),Dashboard 直接查 +- **凭证加密**:每个订阅凭证用 AES-256-GCM 加密,key 放 KMS;解密只在 gateway worker 内存里,绝不落日志 +- **计费**:Pulsar / Redis Streams 实时扣费,最终一致性,异步对账 + +--- + +## 8. 已知 TODO(设计层面暂不处理,开发阶段补) + +- [ ] Dashboard 真实图表联动(目前是静态 SVG) +- [ ] Binding OAuth 回调 loading / 成功动效 +- [ ] 邮件模板(注册验证 / 余额预警 / 充值成功) +- [ ] 忘记密码流程 +- [ ] 团队 / 多人协作 UI(Enterprise 档需要) +- [ ] i18n:当前仅中文,英文版待出 + +--- + +生成时间:2026-04 · 设计稿版本:v1 + +联系 Sam / 产品负责人确认实现细节。 diff --git a/docs/design-drafts/v2/Landing.html b/docs/design-drafts/v2/Landing.html new file mode 100644 index 00000000..fa229224 --- /dev/null +++ b/docs/design-drafts/v2/Landing.html @@ -0,0 +1,1423 @@ + + + + + +PURO AI — 你的 AI 订阅,已经付过钱了 + + + + + + + + +
+
+ + + + + +
+
+ NEW + 统一接入多个 AI 平台 · 零改动切换 +
+

你的 AI 订阅,
已经付过钱了。

+

+ Claude Pro · ChatGPT Plus · Codex · Gemini 订阅
+ 聚合成统一 API,零改动接入 OpenAI / Anthropic SDK +

+
+ 立即开始 → + 查看文档 +
+
+ 无需信用卡 + + 用你已有的订阅 + + 5 分钟跑通 +
+
+ + +
+
+
// providers
+

支持的 AI 平台

+

通过 OAuth 直接复用你的订阅,无需申请官方 API key

+
+
+
+ + +
Claude
+
Pro / Max
+
+
+ + +
ChatGPT
+
Plus / Pro
+
+
+ + +
Codex CLI
+
OpenAI
+
+
+ + +
Gemini
+
Code Assist
+
+
+ + +
更多
+
即将推出
+
+
+
+ + +
+
+
// features
+

付一次订阅,
用起一整个模型池

+

把散落在各个平台的订阅,整合成开发者真正能用的基础设施

+
+
+
+
+

一个 key 接所有模型

+

不再为每个 provider 申请 API key、配置 base_url。统一 sk- 走 Claude / GPT / Gemini,按 model 自动路由到对应账号池。

+
    +
  • OpenAI Responses API 兼容
  • +
  • Anthropic Messages API 兼容
  • +
  • 智能 model → provider 路由
  • +
+
+
+
🔄
+

账号池高可用

+

多账号自动调度。某个 ChatGPT Plus 触发限流,自动 failover 到下一个。重启、刷新 token 全自动。

+
    +
  • 限流/5xx 自动 failover
  • +
  • OAuth token 自动刷新
  • +
  • 加权轮询 · 最少连接
  • +
+
+
+
📊
+

用量看板

+

每条请求的 tokens、费用、上游账号、延迟全可视化。模型分布饼图 + 趋势曲线 + Top 排行。

+
    +
  • 逐请求审计日志
  • +
  • 多维度 tokens / cost 统计
  • +
  • 导出 CSV / 接 Webhook
  • +
+
+
+
+ + +
+
+
// integration
+

把 base_url 一改,就能用

+

兼容 OpenAI / Anthropic / Gemini SDK,零代码改动

+
+ +
+
+
+
+
~/.codex/config.toml
+
curl.sh
+
● edited 2s ago
+
+
1# Codex CLI — 只改 base_url 就能走 PURO
2model_provider = "puro"
3model = "gpt-5-codex"
4
5[model_providers.puro]
6 name = "PURO AI"
7 base_url = "https://ai.puro.im/v1"
8 wire_api = "responses"
9 env_key = "PURO_API_KEY" # export PURO_API_KEY=sk-puro-…
+
+ +
+
+
+
curl.sh
+
zsh · puro ≈ 210ms
+
+
1$ curl https://ai.puro.im/v1/chat/completions \
2 -H "Authorization: Bearer $PURO_API_KEY" \
3 -H "Content-Type: application/json" \
4 -d '{
5 "model": "claude-sonnet-4-5", # 自动路由到 Claude Pro 池
6 "stream": true,
7 "messages": [{ "role": "user", "content": "写一个斐波那契" }]
8 }'
9
10# ← event: content_block_delta · account=claude-3 · 187ms · 42 tok
+
+
+ +
+ 支持 OpenAI Responses API · Anthropic Messages API · Gemini generateContent · 流式 SSE & WebSocket +
+
+ + +
+
+
// observability
+

每条请求都看得见

+

+ 不像第三方 API 池子那种"扣了多少不告诉你"。你能看到每次调用:扣了哪个账号、跑了哪个模型、用了多少 tokens、花了多少钱、上游响应几秒。 +

+
+ +
+
+
+
ai.puro.im/dashboard
+
me@puro
+
+
+ +
+
+
+
Requests · 24h
+
18,294
+
▲ 12.4%
+
+
+
Tokens · 24h
+
4.7M
+
▲ 8.1%
+
+
+
Avg latency
+
312ms
+
▼ 4.2%
+
+
+
Est. savings
+
$847
+
vs. pay-as-you-go
+
+
+ +
+
+
+ Requests over time +
+ Claude + GPT + Gemini +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + 00:00 + 06:00 + 12:00 + 18:00 + now + + +
+
+
+ Model distribution + · 24h +
+ +
+ + + + + + + + + + + +
+
Claude48%
+
GPT32%
+
Gemini14%
+
Codex6%
+
+
+
+
+ +
+
+
Recent requests
+
live · 12 of 18,294
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TimeProviderModelTokensCostLatencyStatus
13:42:18claude-3sonnet-4-52,847$0.042213ms● 200
13:42:11gpt-plus-7gpt-5-codex1,204$0.018167ms● 200
13:42:03gemini-2gemini-2.5-pro4,102$0.000392ms● 200
13:41:58claude-1sonnet-4-56,318$0.095284ms● 429 → failover
13:41:49gpt-plus-2gpt-5892$0.013141ms● 200
+
+
+
+
+ + +
+

把订阅变成 API — 5 分钟

+

绑定第一个账号,生成 sk- key,把 base_url 指过来。就这些。

+
+ 创建账户 → + 登录已有账户 +
+
+
+ + +
+
+
// pricing
+

充一次,全平台通用

+

积分永不过期 · 同一份余额可跑 Claude / ChatGPT / Gemini · 支付宝 / 微信 / USDT

+
+ +
+
+
STARTER
+
tier · 01
+
尝鲜测试 · 跑通接入
+
$9.9
+
充 $9.9 → 得 $12 积分 +21%
+
相当于官方 API · 0.5 折起
+
+
+
✓ 全模型 / 全池可用
+
✓ 1 个 API Key
+
✓ 60 RPM
+
— 不支持自带订阅
+
+ 充值 +
+ + + +
+
⚡ 限时 +100%
+
tier · 03
+
小团队 / 长跑项目
+
$99
+
充 $99 → 得 $198 积分 +100%
+
相当于官方 API · 2-5 折
+
+
+
✓ 10 个 API Key · 独立预算
+
✓ 300 RPM · 90 天日志
+
✓ 请求优先级调度
+
✓ Slack / Discord 群组支持
+
+ 充值 +
+
+ + +
+ + +
+
+
// frequently asked
+

你可能想问的

+

没找到答案?发邮件给我们 ↗ · 通常 2 小时内回复

+
+ +
+ 01PURO 和 API 中转站有什么不同? +
+ 中转站只是转发官方 API,价格取决于你预付的 balance。PURO 的不同是 —— 我们让你把已有的 Claude Pro / ChatGPT Plus 订阅变成 API。 + 你原本就在付的 $20/月,不再只能在官网聊天里用,而是通过统一 API 喂给 Cursor、Claude Code、任何 SDK。 + 同时也提供按量充值的官方 API 备用池,两种模式可混用。 +
+
+ +
+ 02用订阅跑 API 会不会被封号? +
+ 我们会自动控制每个订阅的请求节奏,并在触发限流时把请求 failover 到池内其他订阅。实际上 PURO 的调用模式比你在官方客户端复制粘贴大段对话更不容易触发风控。 + 所有凭证用 AES-256 加密存储,请求链路不经过第三方。 +
+
+ +
+ 03积分会过期吗?可以退款吗? +
+ 积分永不过期。首次充值 7 天内未产生任何调用可全额退款,之后按剩余积分 85% 比例退。 +
+
+ +
+ 04支持哪些支付方式? +
+ 国内:支付宝 · 微信支付。国际:Stripe 信用卡 · USDT (TRC20 / ERC20) · PayPal。企业充值支持 Invoice 对公打款,人民币开票。 +
+
+ +
+ 05数据会被用于训练吗? +
+ 不会。所有请求仅用于路由转发,不入库、不留存内容(仅保留元数据如模型、token 数、延迟,用于计费和日志)。Pro 档及以上可选开启"零日志模式"。 +
+
+ +
+ 06支持哪些模型?新模型上线多久? +
+ 当前覆盖 Claude(Sonnet 4.5 / Opus 4 / Haiku 4.5)、ChatGPT(GPT-5 / GPT-5 Codex / GPT-4.1)、Gemini(2.5 Pro / 2.5 Flash)。官方发布新模型后通常 24 小时内上线。 +
+
+ +
+ 查看全部 10 个问题 +
+
+ + + + + + diff --git a/docs/design-drafts/v2/Login.html b/docs/design-drafts/v2/Login.html new file mode 100644 index 00000000..33ea8429 --- /dev/null +++ b/docs/design-drafts/v2/Login.html @@ -0,0 +1,351 @@ + + + + + +登录 — PURO AI + + + + + + + + +
+
+ +
+ +
+
+ + + + + + PURO AI + + +
+
// 你的订阅,已经付过钱了
+

+ N 个订阅 + + 1 个 key +

+
+ +
+ 省去切换账号的繁琐, + 省去为多个高昂订阅重复买单。 + PURO(纯粹)—— 让 AI 调用回归本质。 +
+ +
+
POST/v1/chat/completions
+
modelclaude-sonnet-4-5
+
route →claude-pool-03
+
status200·213ms·42 tok
+
+
+ +
+ Claude· + ChatGPT· + Codex· + Gemini + | + ai.puro.im · operational +
+
+ + +
+ ← 返回首页 + +
+

登录

+

用你的 PURO AI 账户继续

+ +
+ +
+ + + + + + + +
+
+ +
+ +
+ + + + + + + + +
+
+ + 忘记密码? +
+
+ + + +
OR
+ + + +
+ 没有账户?注册 +
+ + +
+
+
+ + + + diff --git a/docs/design-drafts/v2/Pricing.html b/docs/design-drafts/v2/Pricing.html new file mode 100644 index 00000000..f7600a62 --- /dev/null +++ b/docs/design-drafts/v2/Pricing.html @@ -0,0 +1,472 @@ + + + + + +Pricing — PURO AI + + + + + + + + +
+
+ + + +
+
// pricing · 充多少 · 用多少 · 永不过期
+

一次充值,全平台通用

+

+ 同一份积分可以用在 Claude / ChatGPT / Gemini 任意池上。我们把你的订阅额度变成真正的 API 余额 —— 相比官方 API 便宜 至多 70%。 +

+
+ + 余额永不过期 · 支持支付宝 / 微信 / USDT · 无隐藏订阅费 +
+
+ +
+
+ +
+ STARTER +
tier · 01
+
先尝尝鲜,跑通接入
+
$9.9
+
充 $9.9 $12 积分 +21%
+ 相当于官方 API · 0.5 折起 +
+
+
可用所有模型 / 所有池
+
1 个 API Key
+
60 RPM 速率限制
+
基础日志(7 天保留)
+
自带订阅接入
+
团队 / 多人协作
+
+ 充值 → +
+ + + +
+ ⚡ 限时 +100% +
tier · 03
+
小团队 / 长跑项目
+
$99
+
充 $99 $198 积分 +100%
+ 相当于官方 API · 2-5 折 +
+
+
所有 Pro 能力
+
10 个 API Key · 独立预算
+
300 RPM 速率限制
+
调用日志(90 天保留)
+
请求优先级加权调度
+
Slack / Discord 群组支持
+
+ 充值 → +
+ +
+ CUSTOM +
tier · 04
+
自定义金额 · 按需充值
+
$50
+
得约 $78 积分 +56%
+ + 根据金额阶梯自动匹配折扣 +
+
+
积分永不过期
+
Pro 全部能力
+
阶梯 +21% ~ +100%
+
支付宝 / 微信 / USDT
+
拖动滑块预览赠送
+
+ 定制充值 → +
+
+ +
+
+
+
+

Enterprise · 企业定制

+

专属订阅池、SLA、合规审计、私有化部署、发票结算。规模 >$500/月起可申请。

+
+ 联系商务 → +
+
+
+
+

已有订阅?直接接入

+

有 Claude Max / ChatGPT Pro?免费注册后绑定,只为 PURO 路由费买单 —— 按次 $0.0008/request

+
+ 接入我的订阅 → +
+
+
+ +
+
+
+
// cost estimator
+

算算你能省多少?

+

按你的使用场景,对比 PURO 和官方 API 的月度花费差。数字会根据你选的场景自动更新。

+
+
+
日均请求数5,000
+ +
+
+
平均每请求 tokens3,000
+ +
+
+
Claude 占比50%
+ +
+
+
+
+
+
月度 tokens 消耗450M
+
官方 API 价格$1,620
+
PURO 价格(含 +50% 赠送)$486
+
节省$1,134 · 70%
+
+
+
+
建议充值
+
≈ 3 天试用 + Pro 档充值
+
+
$486
+
+
+
+
+ +
+
+
// works everywhere
+

一个 key,所有工具通用

+

只要支持自定义 base_url 或 OpenAI / Anthropic API,都能直接接入 PURO。

+
+
+
Claude Code
ANTHROPIC_BASE_URL
+
Cursor
自定义模型
+
Cline
OpenAI 兼容
+
Roo Code
OpenAI 兼容
+
Continue
config.yaml
+
OpenAI SDK
Python / Node
+
Anthropic SDK
原生 Claude
+
Open WebUI
自定义 base
+
LangChain
LLM 节点
+
LlamaIndex
模型路由
+
Zed
Assistant
+
更多…
60+ 工具
+
+
+ +
+
+
// frequently asked
+

你可能想问的

+

没找到答案?发邮件给我们 ↗ · 通常 2 小时内回复。

+
+ +
+ 01PURO 和 API 中转站 / API 代理有什么不同? +
+ 中转站只是把官方 API 请求转一手,价格取决于你预付多少 balance。PURO 的不同是 —— 我们让你 把已有的 Claude Pro / ChatGPT Plus 订阅变成 API。 + 你原本就在付的 $20/月,不再只能在官网聊天里用,而是通过统一 API 喂给 Cursor、Claude Code、任何 SDK。 + 同时我们也提供按量充值的官方 API 备用池,两种模式可以混用。 +
+
+ +
+ 02用订阅跑 API 会不会被封号? +
+ 我们会自动控制每个订阅的请求节奏,并在触发限流时把请求 failover 到池子里的其他订阅。实际上 PURO 的调用模式比你在官方客户端直接复制粘贴大段对话 更不容易触发风控。 + 你绑定多个订阅时,单个账号的 RPM 会被压到足够安全的阈值内。另外所有凭证用 AES-256 加密存储,请求链路不经过第三方。 +
+
+ +
+ 03积分会过期吗?可以退款吗? +
+ 积分永不过期。你可以攒着慢慢用 —— 包括几个月都不用。首次充值 7 天内未产生任何调用可全额退款,之后按剩余积分 85% 比例退。详见 退款政策。 +
+
+ +
+ 04支持哪些支付方式? +
+ 国内:支付宝 · 微信支付。国际:Stripe 信用卡 · USDT (TRC20 / ERC20) · PayPal。企业充值支持 Invoice 对公打款,人民币开票。 +
+
+ +
+ 05一个 PURO 账号可以绑定多少个订阅? +
+
    +
  • Starter 档:不支持绑定自带订阅
  • +
  • Pro 档及以上:无限制,你可以把 10 个 ChatGPT Plus + 3 个 Claude Pro 一起绑上去,统一调度
  • +
  • Enterprise:支持跨团队共享池,按组织维度隔离
  • +
+
+
+ +
+ 06如果某个订阅触发限流了会怎样? +
+ PURO 的调度器会把受限的订阅自动标记为 cooling 状态,暂时从池子里摘除。同一请求会立刻被 failover 到池内其他健康订阅上 —— 调用方通常 感受不到中断。你可以在 Dashboard 看到每个订阅的当前状态和剩余配额。 +
+
+ +
+ 07计费精度?超量会怎么办? +
+ 按实际 token 数 + 模型单价计费,精度到 4 位小数。每个 API Key 可设置独立月度预算,达到后 402 Payment Required,不会继续扣费。账户总余额不足时同样会返回 402,且 Dashboard 有 80% / 95% 两级提醒邮件。 +
+
+ +
+ 08数据会被用于训练吗? +
+ 不会。所有请求仅用于路由转发,不入库、不留存内容(仅保留元数据如模型、token 数、延迟,用于计费和日志)。Pro 档及以上可选开启"零日志模式",我们连请求 ID 都不记录。 +
+
+ +
+ 09可以私有化部署吗? +
+ Enterprise 档支持 Docker / K8s 私有化部署,控制面和数据面可以分开。授权按年订阅,包含升级和技术支持。联系商务 → +
+
+ +
+ 10支持哪些模型?会跟进新模型吗? +
+ 当前覆盖 Claude(Sonnet 4.5 / Opus 4 / Haiku 4.5)、ChatGPT(GPT-5 / GPT-5 Codex / GPT-4.1)、Gemini(2.5 Pro / 2.5 Flash)。每当官方发布新模型,我们通常在 24 小时内上线。完整模型列表见 文档。 +
+
+
+ +
+
+
// ready to start
+

5 分钟,拿到你第一个 sk-puro-* key

+

注册送 $5 测试积分 · 绑定你的第一个订阅即可开始。

+
+ 免费注册 → + 查看文档 +
+
+
+ + + + diff --git a/docs/design-drafts/v2/Register.html b/docs/design-drafts/v2/Register.html new file mode 100644 index 00000000..36c204b1 --- /dev/null +++ b/docs/design-drafts/v2/Register.html @@ -0,0 +1,386 @@ + + + + + +注册 — PURO AI + + + + + + + + +
+
+ +
+
+
+ + + + + + PURO AI + + +
+
// 5 分钟开始用
+

+ N 个订阅 + + 1 个 key +

+
+ +
+ 省去切换账号的繁琐, + 省去为多个高昂订阅重复买单。 + PURO(纯粹)—— 让 AI 调用回归本质。 +
+ +
+
// 下一步
+
+
1
+
创建账户 · 邮箱 + 密码,或用 LinuxDO OAuth
+
+
+
2
+
绑定订阅 · OAuth 接入你现有的 Claude Pro / ChatGPT Plus
+
+
+
3
+
生成 key · 拿到 sk-puro-…,换掉 SDK 的 base_url
+
+
+
+ +
+ Claude· + ChatGPT· + Codex· + Gemini + | + ai.puro.im · operational +
+
+ +
+ ← 返回首页 + +
+

创建账户

+

注册即送 $5 测试积分

+ +
+ +
+ + + + + + + + + + + + +
+
+ +
+ +
+ + + + + + + + +
+
+ +
+
+ // strength + +
+
+ +
+ +
+ + + + + + + + + + + + +
+
+
+ + + + + +
OR
+ + + +
+ +$5 + 完成注册即送 $5 测试积分 —— 够你跑几万次 Claude 请求。 +
+ +
+ 已有账户?登录 +
+
+
+
+ + + + diff --git a/docs/design-drafts/v2/puro.css b/docs/design-drafts/v2/puro.css new file mode 100644 index 00000000..96c11980 --- /dev/null +++ b/docs/design-drafts/v2/puro.css @@ -0,0 +1,726 @@ +/* ========================================================================== + PURO AI — Design System + Shared tokens + primitive styles used across every page. + -------------------------------------------------------------------------- + Usage: + ========================================================================== */ + +*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } + +:root { + /* Surfaces */ + --bg-0: #0a0e1a; /* page */ + --bg-1: #0f172a; /* raised */ + --bg-2: #111827; /* card alt */ + --bg-code: #020617; /* code canvas */ + + /* Borders */ + --border: #1e293b; + --border-2: #334155; + --border-3: #475569; + + /* Text */ + --text-0: #f8fafc; /* primary */ + --text-1: #cbd5e1; /* body */ + --text-2: #94a3b8; /* muted */ + --text-3: #64748b; /* hint */ + + /* Accents */ + --cyan: #22d3ee; + --cyan-2: #67e8f9; + --cyan-dim: #0891b2; + --purple: #a855f7; + --amber: #fbbf24; + --green: #34d399; + --red: #f87171; + --orange: #fb923c; + + /* Provider brand dots */ + --p-claude: #d97757; + --p-gpt: #10a37f; + --p-gemini: #4285f4; + --p-codex: #f0a030; + + /* Radius */ + --r-sm: 6px; + --r-md: 8px; + --r-lg: 12px; + --r-xl: 16px; + + /* Shadow */ + --shadow-lg: 0 30px 60px -30px rgba(0,0,0,0.6); + --shadow-xl: 0 40px 80px -40px rgba(0,0,0,0.8); + + /* Typography */ + --font-sans: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; + --font-mono: 'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, monospace; +} + +html, body { + background: var(--bg-0); + color: var(--text-0); + font-family: var(--font-sans); + font-feature-settings: "cv11", "ss01", "ss03"; + -webkit-font-smoothing: antialiased; + text-rendering: optimizeLegibility; + line-height: 1.5; +} + +body { overflow-x: hidden; } + +a { color: inherit; text-decoration: none; } +button { font-family: inherit; cursor: pointer; border: none; background: none; color: inherit; } + +/* scrollbar — subtle */ +::-webkit-scrollbar { width: 10px; height: 10px; } +::-webkit-scrollbar-track { background: transparent; } +::-webkit-scrollbar-thumb { background: var(--border-2); border-radius: 6px; } +::-webkit-scrollbar-thumb:hover { background: var(--border-3); } + +.mono { font-family: var(--font-mono); } + +/* ========================================================================== + BACKGROUND EFFECTS + ========================================================================== */ +.bg-glow { + position: fixed; + inset: 0; + pointer-events: none; + z-index: 0; + overflow: hidden; +} +.bg-glow::before, +.bg-glow::after { + content: ""; + position: absolute; + width: 900px; + height: 900px; + border-radius: 50%; + filter: blur(120px); + opacity: 0.35; +} +.bg-glow::before { + background: radial-gradient(circle, #22d3ee 0%, transparent 60%); + top: -300px; + left: -200px; +} +.bg-glow::after { + background: radial-gradient(circle, #a855f7 0%, transparent 60%); + top: 200px; + right: -300px; + opacity: 0.25; +} +.bg-glow.soft::before, .bg-glow.soft::after { opacity: 0.15; } + +.grain { + position: fixed; + inset: 0; + pointer-events: none; + z-index: 1; + opacity: 0.4; + mix-blend-mode: overlay; + background-image: url("data:image/svg+xml;utf8,"); +} + +.container { + max-width: 1100px; + margin: 0 auto; + padding: 0 32px; + position: relative; + z-index: 2; +} +.container-wide { max-width: 1280px; } +.container-narrow { max-width: 860px; } + +/* ========================================================================== + NAV + ========================================================================== */ +.nav { + position: sticky; + top: 0; + z-index: 50; + backdrop-filter: blur(16px); + background: rgba(10, 14, 26, 0.72); + border-bottom: 1px solid var(--border); +} +.nav-inner { + display: flex; + align-items: center; + height: 64px; + gap: 48px; +} +.brand { + display: flex; + align-items: center; + gap: 10px; + font-weight: 700; + font-size: 15px; + letter-spacing: 0.02em; +} +.hex { + width: 22px; + height: 22px; + color: var(--cyan); +} +.nav-links { + display: flex; + gap: 28px; + font-size: 14px; + color: var(--text-2); +} +.nav-links a { transition: color .15s; } +.nav-links a:hover, .nav-links a.active { color: var(--text-0); } +.nav-links .disabled { color: var(--text-3); cursor: not-allowed; display: inline-flex; align-items: center; gap: 6px; } +.nav-links .disabled::after { + content: "即将推出"; + font-size: 10px; + padding: 2px 6px; + border: 1px solid var(--border-2); + border-radius: 4px; + color: var(--text-3); +} +.nav-cta { + margin-left: auto; + display: flex; + gap: 10px; + align-items: center; +} + +/* ========================================================================== + BUTTONS + ========================================================================== */ +.btn { + display: inline-flex; + align-items: center; + justify-content: center; + gap: 6px; + padding: 8px 14px; + font-size: 13px; + font-weight: 500; + border-radius: var(--r-md); + transition: all .15s; + white-space: nowrap; + border: 1px solid transparent; +} +.btn-primary { + background: var(--cyan); + color: #042f2e; + font-weight: 600; +} +.btn-primary:hover { background: var(--cyan-2); } +.btn-primary:active { transform: translateY(1px); } +.btn-primary:disabled { opacity: 0.5; cursor: not-allowed; } + +.btn-ghost { + border-color: var(--border-2); + color: var(--text-1); +} +.btn-ghost:hover { border-color: var(--border-3); color: var(--text-0); background: rgba(255,255,255,0.02); } + +.btn-subtle { + background: rgba(255,255,255,0.04); + color: var(--text-1); + border-color: transparent; +} +.btn-subtle:hover { background: rgba(255,255,255,0.08); color: var(--text-0); } + +.btn-danger { + background: rgba(248, 113, 113, 0.1); + color: var(--red); + border-color: rgba(248, 113, 113, 0.25); +} +.btn-danger:hover { background: rgba(248, 113, 113, 0.15); border-color: rgba(248, 113, 113, 0.4); } + +.btn-lg { padding: 12px 20px; font-size: 14px; } +.btn-sm { padding: 5px 10px; font-size: 12px; } +.btn-icon { padding: 7px; aspect-ratio: 1; } + +.btn .spinner { + width: 14px; height: 14px; + border: 2px solid rgba(0,0,0,0.2); + border-top-color: currentColor; + border-radius: 50%; + animation: spin .7s linear infinite; + display: none; +} +.btn.loading .spinner { display: inline-block; } +.btn.loading .label { opacity: 0.5; } +@keyframes spin { to { transform: rotate(360deg); } } + +/* ========================================================================== + BADGES / PILLS / CHIPS + ========================================================================== */ +.badge { + display: inline-flex; + align-items: center; + gap: 4px; + padding: 2px 8px; + border-radius: 100px; + font-size: 11px; + font-weight: 600; + letter-spacing: 0.02em; + background: rgba(34, 211, 238, 0.1); + color: var(--cyan); +} +.badge.amber { background: rgba(251, 191, 36, 0.12); color: var(--amber); } +.badge.purple { background: rgba(168, 85, 247, 0.12); color: var(--purple); } +.badge.green { background: rgba(52, 211, 153, 0.12); color: var(--green); } +.badge.red { background: rgba(248, 113, 113, 0.12); color: var(--red); } +.badge.muted { background: rgba(255, 255, 255, 0.04); color: var(--text-2); border: 1px solid var(--border); } + +.pill { + display: inline-block; + padding: 2px 8px; + border-radius: var(--r-sm); + background: rgba(255,255,255,0.04); + border: 1px solid var(--border); + font-family: var(--font-mono); + font-size: 12px; + color: var(--text-0); +} + +.chip { + display: inline-flex; + align-items: center; + gap: 6px; + padding: 4px 10px; + border-radius: 100px; + background: rgba(15, 23, 42, 0.6); + border: 1px solid var(--border); + font-size: 12px; + color: var(--text-1); + font-family: var(--font-mono); +} +.chip .dot { width: 6px; height: 6px; border-radius: 50%; background: var(--green); } +.chip.claude .dot { background: var(--p-claude); } +.chip.gpt .dot { background: var(--p-gpt); } +.chip.gemini .dot { background: var(--p-gemini); } +.chip.codex .dot { background: var(--p-codex); } + +.dot-sep { width: 4px; height: 4px; border-radius: 50%; background: var(--text-3); display: inline-block; } + +/* status chip (tiny dot absolute-positioned) */ +.status-chip { + width: 6px; + height: 6px; + border-radius: 50%; + background: var(--green); + box-shadow: 0 0 0 3px rgba(52, 211, 153, 0.15); + display: inline-block; +} +.status-chip.dim { background: var(--text-3); box-shadow: none; } +.status-chip.amber { background: var(--amber); box-shadow: 0 0 0 3px rgba(251, 191, 36, 0.15); } +.status-chip.red { background: var(--red); box-shadow: 0 0 0 3px rgba(248, 113, 113, 0.15); } + +/* ========================================================================== + CARDS / SURFACES + ========================================================================== */ +.card { + background: rgba(15, 23, 42, 0.6); + border: 1px solid var(--border); + border-radius: var(--r-lg); + padding: 24px; +} +.card-raised { + background: var(--bg-1); + border: 1px solid var(--border); + border-radius: var(--r-lg); +} +.card-interactive { + transition: all .2s; + cursor: pointer; +} +.card-interactive:hover { + border-color: var(--border-2); + background: rgba(15, 23, 42, 0.85); + transform: translateY(-2px); +} + +.divider { height: 1px; background: var(--border); margin: 24px 0; border: 0; } +.divider-dashed { border: 0; border-top: 1px dashed var(--border); margin: 20px 0; } + +/* ========================================================================== + FORMS + ========================================================================== */ +.field { margin-bottom: 18px; } +.field-label { + display: block; + font-size: 12px; + font-weight: 500; + color: var(--text-1); + margin-bottom: 8px; +} +.field-hint { + font-size: 12px; + color: var(--text-3); + margin-top: 6px; +} +.field-error { + font-size: 12px; + color: var(--red); + margin-top: 6px; +} + +.input-wrap { position: relative; } +.input-wrap .icon { + position: absolute; + left: 14px; + top: 50%; + transform: translateY(-50%); + color: var(--text-3); + pointer-events: none; + display: inline-flex; +} +.input { + width: 100%; + height: 42px; + padding: 0 14px; + background: rgba(15, 23, 42, 0.6); + border: 1px solid var(--border-2); + border-radius: var(--r-md); + color: var(--text-0); + font-size: 14px; + font-family: inherit; + outline: none; + transition: all .15s; +} +.input.with-icon { padding-left: 40px; } +.input::placeholder { color: var(--text-3); } +.input:hover { border-color: var(--border-3); } +.input:focus { + border-color: var(--cyan); + box-shadow: 0 0 0 3px rgba(34, 211, 238, 0.12); + background: rgba(15, 23, 42, 0.9); +} +.input.ok { border-color: rgba(52, 211, 153, 0.4); } +.input.ok:focus { box-shadow: 0 0 0 3px rgba(52, 211, 153, 0.12); } +.input.error { border-color: var(--red); } +.input.error:focus { box-shadow: 0 0 0 3px rgba(248, 113, 113, 0.12); } + +textarea.input { height: auto; padding: 12px 14px; resize: vertical; line-height: 1.5; } + +select.input { + appearance: none; + background-image: url("data:image/svg+xml;utf8,"); + background-repeat: no-repeat; + background-position: right 14px center; + padding-right: 36px; +} + +/* checkbox */ +.check { + display: inline-flex; + align-items: center; + gap: 10px; + cursor: pointer; + user-select: none; + font-size: 13px; + color: var(--text-1); +} +.check input { display: none; } +.check .box { + width: 16px; height: 16px; + border: 1px solid var(--border-2); + border-radius: 4px; + background: var(--bg-1); + display: inline-flex; + align-items: center; + justify-content: center; + transition: all .15s; + flex-shrink: 0; +} +.check input:checked + .box { + background: var(--cyan); + border-color: var(--cyan); +} +.check input:checked + .box::after { + content: "✓"; + color: #042f2e; + font-size: 11px; + font-weight: 700; +} + +/* ========================================================================== + SECTION HEADINGS + ========================================================================== */ +.section-kicker { + font-family: var(--font-mono); + font-size: 12px; + color: var(--cyan); + letter-spacing: 0.15em; + text-transform: uppercase; + margin-bottom: 12px; +} +.section-title { + font-size: clamp(28px, 3.5vw, 40px); + font-weight: 700; + letter-spacing: -0.02em; + line-height: 1.15; + margin-bottom: 16px; +} +.section-sub { + color: var(--text-2); + font-size: 16px; + line-height: 1.6; +} + +/* ========================================================================== + TABLES + ========================================================================== */ +.tbl { + width: 100%; + font-size: 13px; + border-collapse: collapse; +} +.tbl th { + text-align: left; + color: var(--text-3); + font-weight: 500; + padding: 12px 14px; + border-bottom: 1px solid var(--border); + text-transform: uppercase; + font-size: 10px; + letter-spacing: 0.1em; +} +.tbl td { + padding: 14px; + border-bottom: 1px solid rgba(30, 41, 59, 0.5); + color: var(--text-1); +} +.tbl tr:last-child td { border-bottom: none; } +.tbl tr:hover td { background: rgba(15, 23, 42, 0.4); } +.tbl td.mono, .tbl th.mono { font-family: var(--font-mono); } + +/* ========================================================================== + CODE BLOCKS + ========================================================================== */ +.code-frame { + background: var(--bg-code); + border: 1px solid var(--border); + border-radius: var(--r-lg); + overflow: hidden; + box-shadow: var(--shadow-lg); +} +.code-head { + display: flex; + align-items: center; + height: 40px; + padding: 0 16px; + border-bottom: 1px solid var(--border); + background: rgba(15, 23, 42, 0.8); + gap: 10px; +} +.traffic { + display: flex; + gap: 6px; +} +.traffic span { + width: 10px; + height: 10px; + border-radius: 50%; + background: #475569; +} +.code-body { + padding: 22px 26px; + font-family: var(--font-mono); + font-size: 13px; + line-height: 1.75; + color: var(--text-1); + overflow-x: auto; +} +.code-body .line { display: flex; gap: 20px; } +.ln { color: var(--text-3); user-select: none; min-width: 16px; text-align: right; opacity: 0.5; } + +/* syntax */ +.kw { color: #c084fc; } +.str { color: #86efac; } +.num { color: #fbbf24; } +.com { color: #64748b; font-style: italic; } +.fn { color: #22d3ee; } +.prop{ color: #f0abfc; } +.var-v { color: #f8fafc; } +.flag{ color: #fb923c; } +.bash-prompt { color: var(--cyan); user-select: none; } + +/* ========================================================================== + PROVIDER-BRAND HELPERS + ========================================================================== */ +.provider { + display: inline-flex; + align-items: center; + gap: 6px; + font-family: var(--font-mono); + font-size: 12px; +} +.provider .dot { width: 6px; height: 6px; border-radius: 50%; } +.provider.claude .dot { background: var(--p-claude); } +.provider.gpt .dot { background: var(--p-gpt); } +.provider.gemini .dot { background: var(--p-gemini); } +.provider.codex .dot { background: var(--p-codex); } + +/* ========================================================================== + UTILITIES + ========================================================================== */ +.stack-xs { display: flex; flex-direction: column; gap: 8px; } +.stack-sm { display: flex; flex-direction: column; gap: 12px; } +.stack-md { display: flex; flex-direction: column; gap: 20px; } +.stack-lg { display: flex; flex-direction: column; gap: 32px; } + +.row { display: flex; align-items: center; gap: 12px; } +.row-sm { gap: 8px; } +.row-lg { gap: 20px; } +.row-between { justify-content: space-between; } +.row-center { justify-content: center; } +.row-wrap { flex-wrap: wrap; } + +.flex-1 { flex: 1; } +.ml-auto { margin-left: auto; } +.mt-auto { margin-top: auto; } + +.text-0 { color: var(--text-0); } +.text-1 { color: var(--text-1); } +.text-2 { color: var(--text-2); } +.text-3 { color: var(--text-3); } +.text-cyan { color: var(--cyan); } +.text-purple { color: var(--purple); } +.text-amber { color: var(--amber); } +.text-green { color: var(--green); } +.text-red { color: var(--red); } + +.text-xs { font-size: 11px; } +.text-sm { font-size: 13px; } +.text-md { font-size: 14px; } +.text-lg { font-size: 16px; } +.text-xl { font-size: 20px; } +.text-2xl { font-size: 28px; } +.text-3xl { font-size: 36px; } + +.fw-400 { font-weight: 400; } +.fw-500 { font-weight: 500; } +.fw-600 { font-weight: 600; } +.fw-700 { font-weight: 700; } +.fw-800 { font-weight: 800; } + +.tabular { font-variant-numeric: tabular-nums; } +.truncate { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } + +/* ========================================================================== + APP SHELL (for dashboard-style pages) + ========================================================================== */ +.app-shell { + display: grid; + grid-template-columns: 240px 1fr; + min-height: 100vh; + position: relative; + z-index: 2; +} +.app-side { + border-right: 1px solid var(--border); + background: rgba(2, 6, 23, 0.6); + padding: 20px 14px; + display: flex; + flex-direction: column; + gap: 28px; + position: sticky; + top: 0; + height: 100vh; + overflow-y: auto; +} +.app-side .brand { padding: 6px 10px 14px; } +.side-group { display: flex; flex-direction: column; gap: 2px; } +.side-label { + font-size: 10px; + color: var(--text-3); + text-transform: uppercase; + letter-spacing: 0.12em; + padding: 0 10px 8px; + font-family: var(--font-mono); +} +.side-item { + display: flex; + align-items: center; + gap: 10px; + padding: 8px 10px; + border-radius: var(--r-sm); + font-size: 13px; + color: var(--text-2); + cursor: pointer; + transition: all .12s; +} +.side-item:hover { color: var(--text-0); background: rgba(255,255,255,0.03); } +.side-item.active { background: rgba(34, 211, 238, 0.08); color: var(--cyan); } +.side-item .ico { + width: 16px; height: 16px; opacity: 0.8; + display: inline-flex; align-items: center; justify-content: center; + flex-shrink: 0; +} +.side-item .count { + margin-left: auto; + font-size: 11px; + color: var(--text-3); + font-family: var(--font-mono); +} +.side-item.active .count { color: var(--cyan); } + +.app-main { + min-width: 0; /* allow grid children to shrink */ + display: flex; + flex-direction: column; +} +.app-topbar { + height: 60px; + border-bottom: 1px solid var(--border); + display: flex; + align-items: center; + padding: 0 32px; + gap: 16px; + position: sticky; + top: 0; + z-index: 10; + background: rgba(10, 14, 26, 0.75); + backdrop-filter: blur(12px); +} +.app-topbar h1 { + font-size: 18px; + font-weight: 600; + letter-spacing: -0.01em; +} +.app-content { + padding: 32px; + flex: 1; +} + +/* user avatar pill */ +.avatar { + width: 28px; height: 28px; + border-radius: 50%; + background: linear-gradient(135deg, #22d3ee, #a855f7); + display: inline-flex; + align-items: center; + justify-content: center; + color: #042f2e; + font-weight: 700; + font-size: 12px; + flex-shrink: 0; +} + +/* ========================================================================== + KBD + ========================================================================== */ +kbd { + display: inline-flex; + align-items: center; + justify-content: center; + min-width: 20px; + height: 20px; + padding: 0 6px; + font-family: var(--font-mono); + font-size: 11px; + font-weight: 500; + color: var(--text-1); + background: var(--bg-1); + border: 1px solid var(--border-2); + border-bottom-width: 2px; + border-radius: 4px; + line-height: 1; +} diff --git a/docs/design-drafts/v2/uploads/pasted-1776589344748-0.png b/docs/design-drafts/v2/uploads/pasted-1776589344748-0.png new file mode 100644 index 00000000..2699b0a0 Binary files /dev/null and b/docs/design-drafts/v2/uploads/pasted-1776589344748-0.png differ diff --git a/docs/design-drafts/v2/uploads/pasted-1776589408607-0.png b/docs/design-drafts/v2/uploads/pasted-1776589408607-0.png new file mode 100644 index 00000000..f415cd53 Binary files /dev/null and b/docs/design-drafts/v2/uploads/pasted-1776589408607-0.png differ