# 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 / 产品负责人确认实现细节。