从产品设想到
可运行的业务闭环。
需求调研、产品设计、技术架构、接口与部署。
An eight-language product MVP with persistent data and an isolated demo.
01 · 需求调研与产品定位
调研日期:2026-09-16。范围:对用户提供的 Eden AI 与 TokenSeq 进行实际浏览,并结合开发者平台常见任务推导首版需求。没有做用户访谈,也没有验证两家平台的服务质量或商业数据。
参考观察
| 参考 | 实际观察 | OmniRelay 的设计响应 |
| Eden AI ↗ | 官网以统一接入多种 AI 能力为主线,提供模型、文档、价格入口;黑白底色、蓝色连线图说明统一网关 | 首屏表达统一 API;用路由示意连接产品与模型;单独设置开发者接入说明 |
| TokenSeq ↗ | 登录后的导航包含仪表盘、访问令牌、用量汇总、模型价格和操作手册;用量展示请求数、Token 与金额 | 以账户余额、令牌、用量、模型和账单构成客户工作流 |
不移植竞品的认证、用户规模、可用率或客户背书。竞品的品牌和模型商标只用于说明生态,不意味着合作关系。
目标用户与待验证假设
- 独立开发者:希望用熟悉的 SDK 验证多个模型,减少重复接入工作。
- 应用团队:需要按应用发放与撤销令牌,理解 Token 消耗与费用。
- 平台运营者:需要控制模型目录、价格、渠道和用户状态,追溯配置变化。
上述为产品假设。正式定价前,建议访谈 5–8 位开发者,验证主要任务、月度用量、可接受的服务加价和结算偏好。
定位
OmniRelay = 模型接入入口 + 令牌访问控制 + 用量与余额 + 运营控制台。
首版优势不依赖模型数量宣传,而是让一次调用的配置、执行、计量和账单关系清楚可见。
范围决策
- 中文和英文为首发语言;所有核心页面、操作和错误信息可切换。
- 默认 USD;金额以 micro-USD 整数存储,避免浮点余额误差。
- 技术验证先用模拟供应商,不依赖真实密钥或支付账户。
- 演示管理员每个空间隔离,避免公开演示者修改其他人的数据。
- Cloudflare 为首选托管路径;EC2 为需要自主管理运行环境的备选。
需要商业验证而非臆测的内容
供应商转售授权、模型可用地域、真实采购价与加价、账期、退款、发票、隐私条款、可用性承诺、生产管理员名单以及域名所有权均未得到业务确认。首版不将其作为已成立事实展示。
02 · 产品需求与验收标准
目标
交付一个可以演示完整业务流程、具备持久化和服务端权限的 MVP。让用户从官网进入后台,创建令牌,发起模拟请求,查看消费,再由管理员调整服务配置。
角色
| 角色 | 可访问 | 限制 |
| 访客 | 官网、登录、注册、文档 | 不能访问业务数据 |
| 已注册客户 | 自己的资料、令牌、模型目录、用量、账单 | 不具备管理员角色;真实调用与支付关闭 |
| 演示客户 | 独立空间的模拟调用、演示充值及客户功能 | 不能访问其他空间;可显式切换到本演示空间的管理员 |
| 演示管理员 | 当前演示空间的用户、模型、渠道、请求、审计 | 不能管理其他空间或真实注册账户 |
演示角色切换是隔离的产品体验,不是生产权限提升入口。非演示账户请求该接口返回 403。
P0 功能与验收
| 模块 | 用户故事 | 验收标准 |
| 官网 | 理解服务并开始体验 | 首屏明确定位;导航可达;模型、接入、计费、FAQ 完整 |
| 国际化 | 使用中、英、西、法、德、葡、日、韩八种语言 | 官网和两类后台核心流程、表单、错误提示切换;刷新保留偏好 |
| 主题 | 适应不同使用环境 | 浅色、深色、跟随系统;刷新保留偏好,官网与后台共用 |
| 账户 | 注册并再次登录 | 新账户使用 Supabase Auth、邮箱验证与密码恢复;Google/GitHub 登录已接入,完整用户授权验收待完成;旧账户保留独立入口 |
| 令牌 | 为应用创建和撤销密钥 | 明文只显示一次;列表只展示前缀;撤销即拒绝请求 |
| 模型 | 找到并体验模型 | 搜索、供应商筛选有效;停用模型不可调用 |
| Playground | 验证调用闭环 | 模拟响应标识明确;显示估算 Token 与费用;用量/账单同步 |
| 账单 | 增加演示余额并查看消费 | 同一充值 reference 不重复入账;余额不足不产生成功记录 |
| 用户运营 | 停用与恢复客户 | 停用撤销会话且阻止其令牌调用;不能停用自己 |
| 模型运营 | 改价格或暂停模型 | 新请求按新单价计费;历史记录保存当时 cost |
| 渠道运营 | 暂停某个供应商 | 状态 disabled 或权重为 0 时,对应调用拒绝 |
| 审计 | 追踪修改 | 保存操作者、动作、对象、时间;无普通用户写日志入口 |
主要流程
1. 官网 → 登录页 → 客户演示 → 创建令牌并保存。
2. 模型广场 → 模型体验 → 输入消息 → 模拟响应 → 用量记录 → 扣费流水。
3. 账单 → 演示充值 → 余额增加 → 刷新后仍保留。
4. 切换管理员 → 模型与定价 → 停用模型 → 客户调用被阻止 → 恢复模型。
5. 管理员 → 用户停用 → 用户会话与 API Key 调用被拒绝。
非功能要求
- 浏览器端不持有供应商密钥;API Key、会话值在数据库中只存哈希。
- 后端始终使用服务端认证得到的 user/workspace,不信任请求体中的归属信息。
- 除匿名认证接口外,业务接口要求有效会话或 Bearer Key。
- 钱包更新与调用流水在数据库批事务中原子提交。
- 同源写操作检查 Origin;HTTPOnly、SameSite 会话 Cookie;HTTPS 设置 Secure。
- 移动端侧栏折叠;表格局部横向滚动;键盘焦点可见。
P1 / 生产化差距
真实供应商适配、流式 SSE、准确 Token 结算、支付回调及退款、认证端到端验收、防刷、MFA、生产管理员配置、组织成员邀请、多渠道加权选路和熔断、失败请求日志、监控告警、留存清理、完整灾难恢复演练与隐私合规(单份数据库备份恢复已验证)。邮箱验证和密码恢复已经接入 Supabase,但不能用本地模拟测试代替真实邮件与回调验收。
当前 demo 不被描述为已具备以上生产能力。
03 · 产品设计与多语言规范
视觉方向
白色主表面、深墨色标题、电光蓝主操作。官网采用宽留白与连接示意;后台采用固定侧栏、浅灰蓝画布、清晰的数据分组。模型供应商只作为生态说明,避免堆叠虚构社会证明。
- 主色:#3155F5。
- 正文:#263149;辅助正文使用更浅但可读的蓝灰色。
- 边界:#E7EAF1;背景:#F7F8FC。
- 字体:DM Sans + Noto Sans SC,加载失败时回退系统 sans-serif。
- 控件圆角 6px;内容卡片 9px;对话框 12px。
- 常规操作与正文尽量保持 14–16px;次要数据和元信息为 12px。
- 信息状态:启用/成功绿色;停用/撤销红色;示例数据中性灰。
信息架构
官网 / → 产品优势 / 模型生态 / 开发者 / 计费 / FAQ。
认证:/login、/register。
客户:/console、/console/keys、/console/models、/console/playground、/console/usage、/console/billing、/console/settings。
管理员:/admin、/admin/users、/admin/models、/admin/channels、/admin/usage、/admin/audit、/admin/settings。
文档:/docs.html。
核心交互
- 创建 Key 使用原生 dialog;关闭后删除密钥 DOM;复制失败可手动选择。
- 撤销令牌、停用用户使用确认弹窗;在真正执行前说明影响。
- 模型搜索和供应商筛选即时更新;用量按模型和时间过滤。
- 表单提交时禁用按钮;失败在表单内部显示错误并保留输入。
- 所有演示后台页面显示持续的 demo 标识;模型体验再次强调非真实 AI 生成。
- 历史示例请求显示 sample,Token 与费用为 0,不混入真实演示调用总计。
多语言
产品界面支持中文、英文、西班牙语、法语、德语、葡萄牙语(巴西格式)、日语、韩语。源码词典统一位于 locales/*.json,构建为共享 public/i18n.js,覆盖官网、认证、客户及管理员后台、主题与错误提示。数据标识、模型 ID 和审计事件代码不翻译。产品与技术文档正文当前保留中文。
- 语言偏好保存在
localStorage['omni-lang'],仅用作设备偏好,不作为用户数据源。 - 金额与日期使用
Intl.NumberFormat、Intl.DateTimeFormat。 - 数据库时间为 ISO UTC;趋势按 UTC 日期分桶,详情按浏览器时区显示。
- API 返回稳定英文错误码,界面映射本地化文案。
- 增加新语言时新增 locale JSON 并登记语言元数据。构建阶段检查全部词典键与插值占位符一致,再检查长文案、窄屏和按钮布局。
响应式与可访问性
760px 以下后台侧栏折叠;表格在局部容器内滚动;表单堆叠布局。官网 720px 以下导航折叠。使用语义标签、原生输入、可见焦点、dialog、aria-live 反馈和 reduced-motion。
不宣称完成 WCAG 认证;正式上线前补充屏幕阅读器、200% 缩放和完整对比度审计。
主题模式
官网、认证页、客户/管理员后台与文档页共用浅色、深色和跟随系统三种主题。右上角主题图标按「跟随系统 → 深色 → 浅色」循环切换;八语言提示显示当前模式与下一模式。默认跟随系统。
偏好仅保存在设备 localStorage 的 omni-theme 项,不影响账户数据。首屏渲染前应用主题,避免刷新时浅色闪烁;跟随系统模式监听系统配色变化,跨标签页同步偏好。深色主题对表格、输入、弹窗、状态标签和图表分别设置颜色。
04 · 技术架构与安全边界
实现选择
原生 HTML/CSS/JavaScript 前端 + 共享 Fetch API handler。当前公开站点在 AWS EC2 上以 Node.js 24 + SQLite 运行;Cloudflare Workers + D1 为兼容部署方式,既有 Sites 预览独立运行。无客户端框架运行依赖。构建时将静态页面嵌入 Worker,减少不同托管环境的静态资源绑定差异;后续图片/大资源应迁至 CDN/R2。
本地与 EC2 通过 Node.js 24 的 SQLite 适配器运行同一个 Worker handler。数据库结构由 Drizzle schema 生成迁移,不在业务请求中创建/变更表。
flowchart LR
Browser[八语言官网/客户/管理员] --> CF[Cloudflare DNS与HTTPS代理]
SDK[OpenAI兼容SDK] --> CF
CF --> Caddy[EC2上的Caddy]
Caddy --> Node[Node.js 24 / 共享Fetch handler]
Node --> Auth[Session / Bearer Key / 角色与空间隔离]
Auth --> Simulator[模型可用性检查 / 模拟响应]
Simulator --> DB[(本机持久SQLite / 原子计费)]
DB --> Backup[每日一致性快照]
Backup --> S3[私有S3备份]
Cloudflare 到源站使用 Full (strict),源站仅允许 Cloudflare IPv4 访问 80/443;SSM 用于维护,无公网 SSH。当前是单主机部署;SQLite 文件持久化与备份不等于高可用。Sites 预览的数据与公开 AWS 站点互不共享。
数据模型
| 表 | 用途 | 隔离 / 索引 |
| workspaces | 独立工作空间、demo 标识 | ID 主键 |
| users | 账户、角色、密码派生值、余额 | email 唯一;workspace 索引 |
| sessions | 不透明会话的 SHA-256 哈希、到期时间 | hash 主键;user 索引 |
| api_keys | 令牌前缀、哈希、状态 | hash 唯一;user 索引 |
| models | 模型目录、演示输入/输出单价 | workspace + slug 唯一 |
| channels | 供应商路由、状态、权重 | workspace 索引 |
| requests | 模型、估算 Token、结算费用 | user/created、workspace/created |
| ledger | 追加式资金流水 | reference 唯一;user/created |
| audit | 账户和配置操作 | workspace/created |
| limits | 固定窗口节流计数 | id 主键 |
不保存提示词和响应正文。日志保存请求元数据,降低内容数据暴露。当前业务 API 不提供删除或修改 ledger/audit 的操作。
金额
1 USD = 1,000,000 micro-USD。输入、输出价格表示每百万 Token 的 micro-USD 单价。
单次演示费 = ceil((inputTokens × inputRate + outputTokens × outputRate) / 1,000,000),最低 1 micro-USD。余额不足返回 402。
扣款先执行 UPDATE ... WHERE balance >= cost,同一 D1 batch 中仅在更新成功时插入请求和负向流水。充值使用唯一 reference 以及 INSERT OR IGNORE,只有新流水插入成功才增加余额。
正式接真实供应商后,应增加额度预占、真实 usage 结算、超时对账、退款和幂等推理请求设计;当前模拟同步响应没有外部费用窗口。
身份与权限
- 账户密码通过 PBKDF2-HMAC-SHA256、100,000 次迭代及独立 256-bit salt 派生。此值用于 Workers 演示兼容;上线前按平台预算重新评估密码方案/使用成熟 IdP。
- 会话随机 256-bit,数据库只存 SHA-256 哈希;7 天有效;Cookie HttpOnly、SameSite=Lax,HTTPS 上设置 Secure。
- API Key 随机 256-bit;明文只在创建响应返回,日志不打印。
- Origin 检查保护基于 Cookie 的写 API;Bearer API 不依赖浏览器 Cookie。
- 每个 SQL 查询绑定认证获得的 workspace/user。管理接口服务端检查角色;客户端隐藏按钮不是授权边界。
- 演示管理员与客户仅共享自己的 demo workspace;其他用户演示和真实注册空间不可访问。
- 登录、注册、演示空间创建、模拟调用和充值有固定窗口频率限制。
- 本地 Node adapter 去除伪造的 OpenAI/Cloudflare 身份请求头;应用本身不依赖这些头授予权限。
- HTML 数据插入统一转义;SQL 使用参数绑定;CSV 导出对公式起始字符转义。
实现限制
后台是隔离的服务管理演示,不包含跨租户超级管理员。单供应商单渠道;权重只决定是否参与,不实现多渠道加权负载均衡。只记录成功模拟调用与示例记录,失败调用当前返回错误但不进入请求日志。API Key 配额与更精细的组织预算尚未实现。固定窗口记录、会话和 demo 空间需在生产增加自动清理。
Node 适配器串行处理请求,适合演示和小规模验证;不应直接据此承诺并发生产容量。
依据
- Cloudflare D1 Database API ↗:使用 prepared statements 与事务批操作。
- Cloudflare Workers bindings ↗:运行时资源通过 env binding 获取。
- Workers static asset bindings ↗:后续大资源可采用独立 ASSETS 绑定。
以上文档于 2026-09-16 查阅;架构容量与生产可靠性仍需实际压测验证。
05 · 接口文档
约定
新账户浏览器接口使用 Supabase access token(Bearer),服务端向 Supabase 验证身份后映射本地账户。演示及旧账户使用 HttpOnly omni_session Cookie。写操作必须带同源 Origin 与 Content-Type: application/json。API 请求体限制 16,000 字符;本地适配层还有 32KB 总大小限制。生产入口仍应增加统一字节级限制。
失败结构:{"error":{"code":"unauthorized"}}。UI 将错误码映射为所选的八种界面语言之一。
| 状态 | 常见错误 |
| 400 | invalid_input / weak_password / stream_not_supported |
| 401 | unauthorized / invalid_credentials |
| 402 | insufficient_balance |
| 403 | forbidden / invalid_origin / account_suspended |
| 404 | not_found / model_unavailable |
| 409 | email_unavailable |
| 429 | rate_limited |
| 503 | channel_unavailable / live_provider_not_configured / payments_not_configured / storage_unavailable |
服务地址与健康检查
公开演示站点为 https://omnirelay.ai,SDK base URL 为 https://omnirelay.ai/v1。
GET /health 无需登录,返回 {"ok":true,"service":"omnirelay","mode":"demo-mvp"}。这仅表示应用响应正常,不证明供应商、支付或备份服务已就绪。
账户
| 方法 | 路径 | 请求 / 行为 |
| POST | /api/auth/register | 已关闭,返回 410;新注册使用 Supabase Auth |
| POST | /api/auth/login | 仅旧账户:email, password;创建本地会话 |
| POST | /api/auth/logout | 撤销当前本地会话;Supabase 会话由 SDK signOut 退出 |
| POST | /api/auth/demo | role: customer 或 admin;创建独立演示空间 |
| POST | /api/demo/switch | role;仅当前演示空间内切换 |
| GET | /api/me | 资料、角色、余额、workspace/demo |
| PATCH | /api/profile | name |
新账户邮箱注册、密码登录、重发验证邮件、密码恢复及 Google/GitHub 登录均由官方 Supabase SDK 发起。邮箱验证回调为 /auth/callback,恢复回调为 /auth/reset。PKCE 邮件链接需在发起流程的同一浏览器打开。前端 60 秒邮件重试倒计时只是交互保护,不能替代服务端限流或 CAPTCHA。详见认证运维文档。
客户与通用数据
| 方法 | 路径 | 请求 / 行为 |
| GET | /api/dashboard | 客户只汇总自己;管理员汇总当前空间 |
| GET / POST | /api/keys | 列表 / name 创建;创建时返回一次明文 key |
| DELETE | /api/keys/:id | 仅可撤销自己的令牌 |
| GET | /api/models | 当前空间模型目录 |
| POST | /api/playground | model, messages, locale;会话鉴权的模拟调用 |
| GET | /api/usage?days=30&model=... | days 为 1/7/30/90,最多 500 条 |
| GET | /api/billing | 自己的余额和最近 100 条流水 |
| POST | /api/billing/topup | amount 为 micro-USD,reference 为调用者提供的幂等键;仅 demo |
管理 API
| 方法 | 路径 | 请求 / 行为 |
| GET / PATCH | /api/admin/users | 用户列表 / id, status;停用清除会话 |
| PATCH | /api/admin/models | id, input, output, status;单价单位 micro-USD / 1M Token |
| GET / PATCH | /api/admin/channels | 渠道列表 / id, status, weight,weight 为 0–100 |
| GET | /api/admin/audit | 最近 200 条审计事件 |
上述接口要求 admin,且限定其 workspace。
OpenAI 兼容模拟网关
使用 Authorization: Bearer <从客户后台创建的令牌>。
- GET
/v1/models:返回{object:"list",data:[...]}。 - POST
/v1/chat/completions:非流式对话模拟。 - 允许 system/user/assistant 文本消息,最多 20 条;总文本不超过 10,000 字符。
- 不支持工具调用、图片、JSON schema、真实供应商参数或 SSE。stream=true 明确返回 400,不伪装成支持。
- Key 属于非 demo 账户时,推理返回 503,避免把模拟结果误作真实付费模型输出。
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ['OMNIRELAY_API_KEY'],
base_url=os.environ['OMNIRELAY_BASE_URL'], # https://omnirelay.ai/v1
)
result = client.chat.completions.create(
model='gpt-demo',
messages=[{'role': 'user', 'content': 'Hello OmniRelay'}],
)
print(result.choices[0].message.content)
此示例调用自有部署的模拟网关,不会访问 OpenAI。私有 Sites 外层还要求站点所有者身份,普通外部 SDK 无法只靠 OmniRelay Key 穿过该外层;SDK 演示优先使用本地服务或自行授权的独立部署。站点访问策略不得为了测试而静默放宽。
成功响应包括标准 choices、usage,并增加 demo:true 与 cost_microusd。Token 按字符数估算,价格仅为演示。
幂等与重试
充值必须在重试时复用同一个 reference。模拟推理目前未提供幂等重放,同一次输入重新提交会形成新的模拟请求并扣除对应演示费用。自动重试推理需由后续网关幂等机制支持。
06 · 部署方案
方案比较
| 项目 | Cloudflare Workers + D1 | AWS EC2 + Docker + SQLite |
| 首版定位 | 推荐预览与轻量 API 部署 | 自主管理、兼容传统服务的演示部署 |
| 运行逻辑 | Fetch handler / env.DB | 相同 handler / Node SQLite adapter |
| 运维 | 平台托管 Worker 与数据库 | 自行负责主机、证书、备份、补丁 |
| 扩容 | 需遵守 Worker 与 D1 限额,先压测 | 当前串行本地适配器只适合小规模;扩容前升级服务层和数据库 |
| 数据 | D1 | 持久 Docker volume,单主机 SQLite |
| 费用 | 依账户计划和实际流量 | EC2、存储、流量、域名及备份费用 |
不预设月费数字,也不承诺当前实现的生产吞吐。
A · 本任务的 Sites 托管
项目 .openai/hosting.json 绑定同一个既有 project_id 和逻辑 DB。npm run build 生成 Worker 与迁移元数据。Sites 管理真实 Cloudflare 资源、私有访问策略和部署。
既有 Sites 预览维持 owner-private;omnirelay.ai 自有域名使用下述独立 AWS 部署,两个环境的数据互不共享。
B · 自有 Cloudflare 账户
仓库提供 deploy/wrangler.example.toml,数据库 ID 明确为待填项。
1. 登录自己的 Cloudflare 账户,使用受控 Wrangler 安装。
2. 运行 wrangler d1 create omnirelay,记录实际数据库 ID。
3. 把示例配置复制为项目根 wrangler.toml,替换数据库 ID。
4. npm run build。
5. wrangler d1 migrations apply omnirelay --remote。
6. wrangler deploy。
7. 验证 /health、注册、demo、创建 key、模拟请求、账单和租户隔离。
8. 通过账户中已验证的域名设置 Worker route/custom domain,再启用访问控制、WAF 和容量监控。
不要对已应用的 Drizzle 迁移重写历史;新增 schema 用追加迁移。Cloudflare Wrangler 迁移记录与 Sites 迁移管理应各自使用独立环境,不对同一数据库混用两个迁移执行器。
C · AWS EC2
2026-09-17 已在 AWS 新加坡 ap-southeast-1 部署:CloudFormation 管理 t3.small、加密 30 GiB gp3、Elastic IP、私有 S3 备份及 SSM。Cloudflare 代理 omnirelay.ai,Caddy 提供源站 TLS,应用数据保存在持久 SQLite 中。每日备份已完成独立恢复验证。
实际部署和升级使用仓库 deploy/aws/ 下的 CloudFormation、install-release.sh 和 backup.sh;以下 Compose 步骤仅为另一种手工部署方式。单实例、单数据库架构适用于 MVP,目前不具备高可用能力。
1. 创建 Linux EC2 主机并安装 Docker Engine / Compose,使用 IAM Role 管理后续云权限。
2. 仅开放 80/443;管理端口仅对受信 IP 或 SSM 开放;应用 8080 不对公网发布。
3. 将源码放至主机,设置域名 DNS A/AAAA 到主机。
4. 在 deploy/ 目录创建 .env,设置 OMNI_DOMAIN=你的真实域名。
5. 在项目根执行:docker compose -f deploy/compose.yml up -d --build。
6. Caddy 在域名正确且端口可达时申请 TLS;应用用 SQLite volume 持久化。
7. 备份数据库请使用 SQLite online backup,或先停应用再复制,不能在 WAL 活跃时只复制主文件。
8. 升级前备份;回滚容器版本时确认 schema 向后兼容。
Compose 仅向公网暴露 Caddy;应用显式 TRUST_PROXY=1 后读取 Caddy 转发的 HTTPS 协议,确保同源检查与 Secure Cookie 正确。不得把应用端口直接暴露给不受信请求。
当前 Node 适配器串行处理请求;正式对外服务前应使用成熟 Node API 服务层,并根据压测采用 PostgreSQL、Redis 限流、异步计费对账及分布式队列。
生产上线顺序
- 供应商合同与真实授权密钥 → 单供应商非流式 → 准确 usage 对账 → SSE/错误策略。
- 支付商户接入 → webhook 签名验签 → 幂等到账 → 退款/争议。
- 邮箱验证、找回密码、MFA、生产管理员控制、密钥轮换。
- 流量/WAF 限制、日志脱敏、余额异常告警、备份恢复验证。
- 压测、故障演练、隐私政策、服务条款、地域可用性审查。
参考
- Cloudflare Wrangler configuration ↗
- Cloudflare D1 Worker API ↗
- AWS Docker application and reverse proxy deployment pattern ↗
AWS 实际部署与验证记录见仓库 deploy/aws/README.md。自有 Cloudflare Workers / D1 配置仍是备选方案,尚未在该独立账户部署。
07 · 8 分钟演示手册
1. 产品价值(1 分钟)
打开官网,展示统一 API、模型生态与按 Token 计量的产品定位。切换 English,再切回中文,确认语言偏好在后台继续生效。
2. 客户工作流(3 分钟)
- 从登录页点击「体验客户后台」,建立独立演示空间,初始余额 $25。
- 打开 API 令牌 → 创建名称为 Demo app 的 Key;复制并保存;关闭弹窗后列表只展示前缀。
- 模型广场筛选供应商 → 体验此模型 → 输入消息 → 发送模拟请求。
- 响应明确标识为模拟,展示估算 Token 和费用。
- 打开用量日志,确认新记录;导出 CSV。
- 账单与余额中查看负向调用流水,再点击演示充值;刷新确认余额保存。
3. 管理员工作流(2 分钟)
- 侧栏点击「切换管理员视角」,保持同一个演示空间。
- 查看总览、用户、模型与定价、渠道、审计。
- 在模型与定价中停用一个模型,切回客户后确认它不可调用;恢复模型。
- 在渠道中把对应供应商状态设为停用,客户端请求返回渠道不可用;恢复后可再次调用。
- 查看审计日志中的 model.updated / channel.updated。
停用用户后其会话将失效,因此演示用户停用时建议在另一个保留管理员会话的浏览器窗口操作;不要把退出后的新 demo 误认为原来的演示空间。
4. 权限与界限(1 分钟)
- 客户直接请求管理接口会收到 403。
- 不同新 demo 的数据互相隔离。
- 真实注册账户没有 demo 管理员切换能力,也不能演示充值。
- 说明真实模型和支付尚未接通,不能把 demo 余额当成现金。
5. 技术交付(1 分钟)
展示 /docs.html,介绍相同 Worker 业务逻辑用于 Cloudflare D1 和本地/EC2 SQLite。指出生产上线的供应商、支付、身份和运维工作。
路线图
阶段 A:当前完成
产品官网、八语言、深色/浅色/跟随系统主题、注册/登录、隔离角色演示、Key 管理、模型/渠道管理、模拟网关、Token 估算、钱包与审计、部署配置和文档。AWS 新加坡公开演示已上线,Cloudflare 严格 HTTPS、持久化 SQLite、每日 S3 备份和单份备份恢复验证已完成;代码已推送 GitHub 私有仓库。
阶段 B:首个真实模型闭环
确定供应商与转售许可,安全配置密钥,加入真实 usage、请求预算预占、余额对账、失败重试和错误日志。先限制内部白名单用户。
阶段 C:商业试运行
接入支付、验签 webhook、退款与发票;生产管理员与 MFA;邮件验证/找回密码;告警通知、数据清理与完整灾难恢复演练(现有每日备份继续使用)。小规模邀请制试运行。
阶段 D:扩大规模
多渠道路由、熔断、组织成员/预算、流式调用、模型评测、容量压测与多区域策略。
这些阶段是建议次序,不是承诺的交付时间表。
08 · 验证记录
记录更新:2026-09-18。本地功能验证完成于 2026-09-16,AWS 实机及公开 HTTPS 验证完成于 2026-09-17。下面按环境区分结果,均不代表生产容量认证。
自动化集成验证
npm test:18 个业务检查全部通过(Node runner 汇总含父测试为 19 个)。
- HTML / CSS / JavaScript 资源路由与 MIME 类型。
- 未登录业务访问与跨源写操作拒绝。
- HTTPS 会话 Cookie 的 HttpOnly / SameSite / Secure 标记。
- API Key 明文仅创建时返回、数据库哈希保存。
- 客户管理接口访问拒绝。
- 跨空间撤销 Key、修改模型拒绝。
- 模拟请求、用量、余额与流水一致。
- 不支持的流式调用返回错误且不扣费。
- 充值幂等 reference 防重复入账。
- Demo 角色切换不跨空间。
- 模型停用、渠道关闭阻断调用,并保留配置审计。
- 余额不足不写成功请求或消费流水。
- 用户停用撤销会话并阻止 API Key,恢复后 Key 重新具备资格。
- Key 撤销后立即拒绝鉴权。
- 注册密码派生保存,真实账户不能提升为 demo 管理员或获得 demo 充值。
- 用户内容作为数据返回,UI 使用统一 HTML 转义。
浏览器验证
通过 Ego Lite 验证登录演示、客户总览、Playground 模拟响应、创建 Key 弹窗、演示充值及账单更新、管理员切换、英文界面与官网。检查 390px 移动端官网和客户后台,页面无整体横向溢出;检查桌面官网与后台截图。浏览器中确认 WebMCP 工具 read_omnirelay_usage 注册;合法输入返回 requests/tokens/spend,与页面对应;多余参数导致预期错误,未改变数据。
八语言验证
8 套语言字典通过键名与插值占位符完整性检查。Ego Lite 实测官网全部语言切换及跨页面偏好保留;新增 6 种语言的 390px 登录页均无整体横向溢出。日语 Playground 完成模拟调用并显示日语响应;法语管理后台显示本地化金额、数字、日期和模型编辑表单。桌面深色模式截图检查通过。技术文档正文目前为中文。
AWS 与公开域名验证(2026-09-17)
- CloudFormation 模板通过 cfn-lint、项目 cfn-guard 规则和 AWS ValidateTemplate;变更集执行成功。
- 新加坡 x86_64 EC2 Docker 构建完成,实例状态检查正常,SSM 可用。
- Cloudflare Full (strict) 下公开 HTTPS 冒烟通过:页面、Cookie 属性、CSRF、客户与管理权限隔离、模拟扣费一致性、撤销 Key 后鉴权拒绝。
- HTTP 返回 308 跳转至 HTTPS。Caddy 采用 HTTP-01 证书验证。
- 容器重启后用户数据保留,SQLite integrity_check 通过。
- 每日备份定时器已启用;从 S3 下载一份备份,在隔离 SQLite 中验证完整性、用户、示例/模拟请求及账单流水。没有执行整机重建或线上覆盖恢复。
- 公开站点浏览器检查通过:八语言切换、深色刷新保持、浅色主题、390px 手机官网无整体横向溢出、客户与管理员演示导航。
本次文档复查(2026-09-18)
- 公开
/health返回ok:true、mode:demo-mvp。 - GitHub
huntersjq/omnirelay.ai可访问,visibility 为 PRIVATE,默认分支 main。 - 上述历史 AWS 和浏览器检查保留原日期;本次未重新执行完整云端验证。
明确未验证
真实供应商调用、真实支付、邮件发送、找回密码、MFA、自有账户中的独立 Wrangler/Workers 部署、生产负载、跨实例/跨区域完整容灾恢复。WebMCP 在本次 Ego Lite 环境中通过注册、合法调用和非法参数检查;其他不支持的浏览器不依赖此增强。
09 · 项目进展与交付状态
更新日期:2026-09-18。范围:OmniRelay.ai;Mirvos 官网及 mirvos.sg 域名不属于本项目。
当前结论
公开演示已上线:https://omnirelay.ai 。从 https://omnirelay.ai/login 进入客户或管理员演示。当前是具备持久化、服务端权限和模拟计费闭环的 MVP;真实推理、收款和生产超级管理功能尚未完成。
交付清单
| 工作项 | 状态 | 依据 |
| 需求调研、PRD、设计、架构与 API 文档 | 已交付 | 文档 01–05;调研日期保留原始日期 |
| 官网、注册登录、客户与隔离管理员演示 | 已实现 | 文档 02、05、07、08 |
| 中英西法德葡日韩八语言及三种主题 | 已实现并验证 | 文档 03、08;文档正文为中文 |
| Key、模型/渠道、模拟调用、用量与账单 | 已实现并验证 | 文档 05、08;不包含真实模型调用 |
| AWS 新加坡 EC2 与 Cloudflare 严格 HTTPS | 已上线 | 2026-09-17 实机和公开访问验证 |
| 持久化与每日 S3 备份 | 已配置 | 单份备份隔离恢复验证通过 |
| GitHub 私有仓库 | 已创建并推送 | MIRVOS-AI/omnirelay.ai |
| Supabase Auth 与 Resend SMTP | 已接入,完整验收待完成 | 邮件投递已验证;邮箱确认、恢复与 OAuth 完整授权仍需用户操作 |
| 模型品牌图标 | 已更新 | 首页 Meta 替换为 Kimi,Qwen/Kimi 使用官网素材,其余来源详见核验记录 |
| 自动 CI/CD | 未配置 | 当前使用源码归档、S3、SSM 手工触发发布 |
| 真实模型、支付、生产管理员 | 未完成 | 进入下面生产化阶段 |
最近里程碑
- 2026-09-16:完成 MVP 功能、八语言与主题、本地业务测试和浏览器验证。
- 2026-09-17:完成 AWS 新加坡部署、Cloudflare 域名与严格 HTTPS、持久化和备份恢复验证。
- 2026-09-18:代码进入 GitHub 私有仓库;更新文档中的功能范围、部署状态、验证证据及待办。
下一阶段与完成条件
| 优先级 | 工作 | 完成条件 |
| P0 | 首个真实模型供应商 | 确认转售授权,内部白名单真实调用成功,usage/费用/失败补偿可对账 |
| P0 | 生产身份与管理权限 | 完成已接入的邮箱验证、找回密码和社交登录验收;配置防刷、MFA及独立生产管理员授权 |
| P0 | 支付与资金流程 | 验签 webhook、幂等入账、退款和对账通过,演示余额与真钱隔离 |
| P0 | 运维与恢复 | 告警接收渠道、备份失败通知、日志与留存清理、整机重建演练;确定 RPO/RTO |
| P0 | 对外商业服务规则 | OmniRelay 专属隐私政策、服务条款、供应商与支付要求完成审核 |
| P1 | 性能和扩展 | 压测后确定服务层/数据库演进;验证并发、限流和故障处理 |
| P1 | 发布自动化 | 自动构建测试、受控部署与回滚;GitHub 推送不会自动发布 |
| P1 | 网关能力 | 流式 SSE、多渠道选路、熔断、失败日志、组织预算等按优先级交付 |
运维边界与文档维护
当前为单实例 SQLite,尚无高可用;CloudWatch 实例状态告警没有通知目标,应用日志为本地轮转。详细资源、费用快照、升级和恢复步骤保存在私有仓库的 deploy/aws/README.md。
发布版本、仓库提交与文档版本需分别记录。最近核验的线上应用版本为 20260918-model-brand-audit;实时发布记录以 deploy/aws/README.md 为准。安全接入第一批正在完善邮件重发、倒计时和相关文档,尚不能据此宣称 Turnstile、MFA 或真实推理已上线。构建只更新仓库中的生成页面,不会自动发布或改变云资源。
每次交付应同步本文件、验证记录和部署运行手册;只把实际验证过的项目标为通过,并保留验证日期与环境。研究资料日期不因文档编辑而改成新的调研日期。