Files
new-api/api-relay-outsourcing-requirements-mvp.html
2026-05-25 19:47:07 +08:00

993 lines
51 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>企业级 API 中转站 MVP 外包需求与验收标准</title>
<style>
:root {
--bg: #0b1020;
--panel: #11182b;
--panel-2: #151f36;
--panel-3: #0f1628;
--text: #eef4ff;
--muted: #9fb0ca;
--dim: #74839a;
--line: #25334d;
--line-soft: #1b2740;
--brand: #41d1b4;
--brand-2: #58a6ff;
--brand-3: #9b8cff;
--warn: #ffb454;
--danger: #ff6b6b;
--ok: #58d68d;
--paper: #f8fafc;
--ink: #101828;
--shadow: 0 24px 70px rgba(0, 0, 0, .32);
}
* { box-sizing: border-box; }
html { scroll-behavior: smooth; }
body {
margin: 0;
color: var(--text);
background:
radial-gradient(circle at 8% -4%, rgba(65, 209, 180, .18), transparent 28%),
radial-gradient(circle at 88% 8%, rgba(88, 166, 255, .16), transparent 28%),
linear-gradient(180deg, #090d18 0%, var(--bg) 46%, #080b13 100%);
font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", "Microsoft YaHei", "Segoe UI", sans-serif;
line-height: 1.72;
font-size: 15px;
}
.page {
width: min(1180px, calc(100vw - 32px));
margin: 0 auto;
padding: 28px 0 56px;
}
.hero {
position: relative;
overflow: hidden;
min-height: 420px;
border: 1px solid rgba(255, 255, 255, .09);
border-radius: 18px;
background:
linear-gradient(135deg, rgba(65, 209, 180, .12), rgba(88, 166, 255, .10) 42%, rgba(155, 140, 255, .12)),
linear-gradient(180deg, rgba(17, 24, 43, .98), rgba(11, 16, 32, .96));
box-shadow: var(--shadow);
padding: 36px;
}
.hero::after {
content: "";
position: absolute;
inset: auto -12% -48% 45%;
height: 320px;
background: linear-gradient(90deg, transparent, rgba(65, 209, 180, .16), transparent);
transform: rotate(-12deg);
pointer-events: none;
}
.eyebrow {
display: inline-flex;
align-items: center;
gap: 8px;
padding: 7px 11px;
border: 1px solid rgba(65, 209, 180, .25);
border-radius: 999px;
background: rgba(65, 209, 180, .08);
color: #bff8ed;
font-size: 12px;
font-weight: 700;
letter-spacing: .08em;
text-transform: uppercase;
}
h1 {
max-width: 860px;
margin: 22px 0 12px;
font-size: 44px;
line-height: 1.12;
letter-spacing: 0;
}
.hero-copy {
max-width: 820px;
margin: 0;
color: #c6d5ec;
font-size: 17px;
}
.meta-grid {
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
gap: 12px;
margin-top: 28px;
}
.meta-card, .metric-card {
min-height: 96px;
border: 1px solid rgba(255, 255, 255, .09);
border-radius: 10px;
background: rgba(7, 11, 22, .54);
padding: 15px;
}
.meta-label {
color: var(--dim);
font-size: 12px;
font-weight: 700;
letter-spacing: .04em;
text-transform: uppercase;
}
.meta-value {
margin-top: 7px;
color: var(--text);
font-size: 18px;
font-weight: 800;
line-height: 1.25;
}
.layout {
display: grid;
grid-template-columns: 264px minmax(0, 1fr);
gap: 22px;
align-items: start;
margin-top: 22px;
}
.toc {
position: sticky;
top: 16px;
border: 1px solid var(--line);
border-radius: 14px;
background: rgba(17, 24, 43, .84);
backdrop-filter: blur(16px);
padding: 14px;
box-shadow: 0 16px 44px rgba(0, 0, 0, .22);
}
.toc-title {
padding: 5px 7px 10px;
color: #dbe8fb;
font-size: 13px;
font-weight: 800;
letter-spacing: .04em;
}
.toc a {
display: block;
padding: 8px 9px;
border-radius: 8px;
color: var(--muted);
text-decoration: none;
font-size: 13px;
line-height: 1.35;
}
.toc a:hover {
background: rgba(88, 166, 255, .10);
color: var(--text);
}
.content {
display: grid;
gap: 18px;
}
section {
border: 1px solid var(--line);
border-radius: 16px;
background:
linear-gradient(180deg, rgba(21, 31, 54, .88), rgba(17, 24, 43, .96));
box-shadow: 0 16px 44px rgba(0, 0, 0, .22);
overflow: hidden;
}
.section-head {
display: flex;
gap: 14px;
align-items: flex-start;
padding: 24px 26px 16px;
border-bottom: 1px solid var(--line-soft);
background: rgba(255, 255, 255, .02);
}
.num {
flex: 0 0 auto;
display: inline-grid;
place-items: center;
min-width: 38px;
height: 38px;
padding: 0 10px;
border-radius: 10px;
color: #071119;
background: linear-gradient(135deg, var(--brand), #8ff2df);
font-weight: 900;
}
.section-head h2 {
margin: 1px 0 5px;
font-size: 22px;
line-height: 1.25;
letter-spacing: 0;
}
.section-head p {
margin: 0;
color: var(--muted);
font-size: 13px;
}
.section-body {
padding: 22px 26px 26px;
}
h3 {
display: flex;
align-items: center;
gap: 9px;
margin: 24px 0 10px;
color: #f4f8ff;
font-size: 17px;
letter-spacing: 0;
}
h3:first-child { margin-top: 0; }
h3::before {
content: "";
width: 5px;
height: 18px;
border-radius: 8px;
background: var(--brand-2);
}
p { margin: 9px 0; color: #d7e1f1; }
ul, ol { margin: 10px 0; padding-left: 22px; }
li { margin: 6px 0; color: #d7e1f1; }
strong { color: #fff; }
code {
padding: 2px 6px;
border: 1px solid rgba(88, 166, 255, .18);
border-radius: 6px;
color: #b9dcff;
background: rgba(88, 166, 255, .10);
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
font-size: .92em;
}
.callout {
margin: 14px 0;
padding: 14px 16px;
border: 1px solid rgba(65, 209, 180, .24);
border-left: 4px solid var(--brand);
border-radius: 10px;
background: rgba(65, 209, 180, .07);
color: #d9fff7;
}
.callout.warn {
border-color: rgba(255, 180, 84, .25);
border-left-color: var(--warn);
background: rgba(255, 180, 84, .08);
color: #ffe8c4;
}
.callout.danger {
border-color: rgba(255, 107, 107, .28);
border-left-color: var(--danger);
background: rgba(255, 107, 107, .08);
color: #ffd2d2;
}
.cards {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 12px;
margin: 16px 0;
}
.metric-card {
min-height: 118px;
background: linear-gradient(180deg, rgba(15, 22, 40, .92), rgba(9, 13, 24, .82));
}
.metric-number {
color: var(--brand);
font-size: 30px;
font-weight: 900;
line-height: 1;
}
.metric-text {
margin-top: 9px;
color: var(--muted);
font-size: 13px;
line-height: 1.5;
}
.table-wrap {
margin: 14px 0 18px;
overflow-x: auto;
border: 1px solid var(--line);
border-radius: 12px;
background: rgba(5, 8, 16, .28);
}
table {
width: 100%;
min-width: 720px;
border-collapse: collapse;
font-size: 13px;
}
th, td {
padding: 11px 13px;
border-bottom: 1px solid var(--line-soft);
border-right: 1px solid var(--line-soft);
vertical-align: top;
text-align: left;
}
th:last-child, td:last-child { border-right: 0; }
tr:last-child td { border-bottom: 0; }
th {
position: sticky;
top: 0;
z-index: 1;
color: #dcecff;
background: #17233b;
font-weight: 800;
white-space: nowrap;
}
td { color: #d3dfef; }
.badge {
display: inline-flex;
align-items: center;
height: 22px;
padding: 0 8px;
border-radius: 999px;
font-size: 11px;
font-weight: 800;
letter-spacing: .03em;
white-space: nowrap;
}
.p0 { color: #ffe3e3; background: rgba(255, 107, 107, .18); border: 1px solid rgba(255, 107, 107, .26); }
.p1 { color: #fff0cf; background: rgba(255, 180, 84, .16); border: 1px solid rgba(255, 180, 84, .25); }
.ok { color: #d9fff0; background: rgba(88, 214, 141, .14); border: 1px solid rgba(88, 214, 141, .25); }
.cfg { color: #d9e8ff; background: rgba(88, 166, 255, .14); border: 1px solid rgba(88, 166, 255, .25); }
.timeline {
display: grid;
grid-template-columns: repeat(5, minmax(0, 1fr));
gap: 10px;
margin-top: 14px;
}
.step {
border: 1px solid var(--line);
border-radius: 12px;
background: rgba(7, 11, 22, .42);
padding: 13px;
}
.step b {
display: block;
color: var(--brand);
font-size: 12px;
letter-spacing: .04em;
text-transform: uppercase;
margin-bottom: 5px;
}
.step strong {
display: block;
margin-bottom: 6px;
font-size: 14px;
}
.step span {
color: var(--muted);
font-size: 12px;
line-height: 1.45;
}
.sign-grid {
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
gap: 12px;
margin-top: 14px;
}
.sign-box {
min-height: 116px;
border: 1px dashed rgba(238, 244, 255, .30);
border-radius: 12px;
padding: 13px;
background: rgba(255, 255, 255, .03);
color: var(--muted);
}
.sign-box strong {
display: block;
color: var(--text);
margin-bottom: 30px;
}
.print-note {
margin-top: 16px;
color: var(--dim);
font-size: 12px;
text-align: right;
}
@media (max-width: 980px) {
.page { width: min(100vw - 22px, 920px); padding-top: 14px; }
.hero { padding: 24px; min-height: auto; }
h1 { font-size: 34px; }
.meta-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.layout { grid-template-columns: 1fr; }
.toc { position: static; }
.toc a { display: inline-block; margin: 2px; }
.cards { grid-template-columns: 1fr; }
.timeline { grid-template-columns: 1fr; }
.sign-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 620px) {
body { font-size: 14px; }
.hero { padding: 20px; border-radius: 14px; }
h1 { font-size: 29px; }
.meta-grid, .sign-grid { grid-template-columns: 1fr; }
.section-head { padding: 20px 18px 14px; }
.section-body { padding: 18px; }
table { min-width: 660px; }
}
@media print {
body {
background: #fff;
color: var(--ink);
font-size: 11px;
}
.page { width: 100%; padding: 0; }
.hero, section {
box-shadow: none;
border-color: #cbd5e1;
background: #fff;
color: var(--ink);
page-break-inside: avoid;
}
.hero { min-height: 0; padding: 22px; }
.hero::after, .toc { display: none; }
h1, .section-head h2, h3, p, li, td, .hero-copy { color: var(--ink); }
.layout { display: block; }
.section-head { background: #f1f5f9; border-color: #cbd5e1; }
.section-body { padding: 16px 18px; }
.num { color: #fff; background: #0f766e; }
.callout, .metric-card, .step, .sign-box {
background: #f8fafc;
border-color: #cbd5e1;
color: var(--ink);
}
th { background: #e2e8f0; color: var(--ink); }
td { color: var(--ink); }
th, td { border-color: #cbd5e1; }
code { color: #0f172a; background: #e2e8f0; border-color: #cbd5e1; }
}
</style>
</head>
<body>
<main class="page">
<header class="hero">
<span class="eyebrow">MVP Outsourcing Standard · v1.1</span>
<h1>企业级 API 中转站 MVP 外包需求与验收标准</h1>
<p class="hero-copy">基于 <code>QuantumNous/new-api</code> 的 B2B API 中转站交付标准。核心目标是接通可用、稳定运行、可故障切换、可监控、可交接验收,而不是从零开发完整 SaaS 平台。</p>
<div class="meta-grid">
<div class="meta-card"><div class="meta-label">上游渠道商</div><div class="meta-value">3 家</div></div>
<div class="meta-card"><div class="meta-label">预期用户规模</div><div class="meta-value">约 500 人</div></div>
<div class="meta-card"><div class="meta-label">交付模式</div><div class="meta-value">配置 + 部署 + 验收</div></div>
<div class="meta-card"><div class="meta-label">MVP 原则</div><div class="meta-value">先稳定可用</div></div>
</div>
</header>
<div class="layout">
<aside class="toc">
<div class="toc-title">文档目录</div>
<a href="#overview">1. 项目概述</a>
<a href="#boundary">2. New API 能力边界</a>
<a href="#flow">3. 角色与流程</a>
<a href="#features">4. 功能需求</a>
<a href="#quality">5. 非功能需求</a>
<a href="#ops">6. 部署与运维</a>
<a href="#acceptance">7. 验收维度</a>
<a href="#milestones">8. 交付节点</a>
<a href="#defects">9. 不通过处理</a>
<a href="#legal">10. 法务与交接</a>
</aside>
<div class="content">
<section id="overview">
<div class="section-head">
<span class="num">1</span>
<div>
<h2>项目概述</h2>
<p>先对齐“做什么 / 不做什么 / 以什么方式交付”,避免外包范围膨胀。</p>
</div>
</div>
<div class="section-body">
<h3>1.1 项目背景</h3>
<p>本项目拟基于开源项目 <strong>New API</strong> 部署一个面向企业 B2B 客户的 API 中转站。甲方上游不直接对接原始模型厂商,而是对接已经完成模型解析和接口封装的渠道商。当前计划接入 3 家上游渠道商,由上游渠道商向甲方提供可调用 API。</p>
<p>本次外包目标不是从零开发一个完整 SaaS 平台,而是交付一个 MVP接通可用、运行稳定、可监控、可故障切换、可支撑约 500 人规模的企业客户使用。</p>
<div class="cards">
<div class="metric-card"><div class="metric-number">3</div><div class="metric-text">上游渠道商接入,均需可独立测试、启停、记录命中日志。</div></div>
<div class="metric-card"><div class="metric-number">500</div><div class="metric-text">按约 500 人规模配置,不因用户或日志规模导致明显卡顿。</div></div>
<div class="metric-card"><div class="metric-number">99.5%</div><div class="metric-text">试运行期核心 API 可用性目标,不包含客户参数错误和上游自身故障。</div></div>
</div>
<h3>1.2 本次交付范围</h3>
<ol>
<li>部署并配置一个可生产使用的 API 中转站,优先基于 New API 等成熟开源方案。</li>
<li>接入 3 家上游渠道商 API并支持统一的下游调用入口。</li>
<li>提供企业 B2B 客户使用所需的账号、API Key、额度、调用统计、基础权限能力。</li>
<li>基于 New API 已有能力配置上游故障识别、失败重试、手动切换、权重分流、自动禁用与恢复验证机制。</li>
<li>完成日志、监控、告警、备份、部署文档、运维交接文档。</li>
<li>支撑约 500 名用户规模的稳定运行,满足本文定义的性能和稳定性验收标准。</li>
</ol>
<h3>1.3 明确不做范围</h3>
<div class="callout warn"><strong>MVP 不做复杂平台化。</strong> 本次交付不开发完整自研 API 网关内核,不开发复杂 CRM、分销、账单、企业组织、动态调度算法、故障演练平台和原生 App。</div>
<ol>
<li>不开发完整自研 API 网关内核。</li>
<li>不开发复杂 CRM、销售管理、工单系统。</li>
<li>不开发复杂分销、代理、佣金结算体系。</li>
<li>不开发多租户集团组织架构的复杂审批流。</li>
<li>不开发原生 App。</li>
<li>不承诺上游渠道商自身的可用性,只要求中转站具备故障发现、切换和记录能力。</li>
<li>不承诺特定模型输出质量,只验收 API 调用链路、稳定性、分流策略和计费统计准确性。</li>
<li>不开发企业级复杂组织架构MVP 可采用“一个企业 = 一个用户 / 一个分组 + 多个 Token”的方式交付。</li>
<li>不开发动态智能调度算法MVP 只要求权重、优先级、模型匹配和可用性过滤。</li>
<li>不开发完整 B2B 账单系统、月度对账单、发票、在线支付、充值和合同管理。</li>
<li>不开发独立事故管理系统MVP 只要求监控告警可触达、故障日志可追溯。</li>
</ol>
<h3>1.4 技术基线</h3>
<div class="table-wrap">
<table>
<thead><tr><th>项目</th><th>要求</th></tr></thead>
<tbody>
<tr><td>基础系统</td><td>New API乙方需在开工前提交选型说明</td></tr>
<tr><td>部署方式</td><td>Docker Compose 或等效可复现部署方式</td></tr>
<tr><td>数据库</td><td>使用开源项目推荐的稳定数据库方案,生产环境不得使用仅适合本地测试的临时存储</td></tr>
<tr><td>反向代理</td><td>Nginx / Caddy / Traefik 任一成熟方案</td></tr>
<tr><td>HTTPS</td><td>必须启用,证书自动续期或提供明确续期方案</td></tr>
<tr><td>日志</td><td>调用日志、错误日志、上游切换日志、管理员操作日志必须保留</td></tr>
<tr><td>监控</td><td>Prometheus + Grafana、Uptime Kuma、Sentry 或同等方案</td></tr>
<tr><td>告警</td><td>支持 Telegram / 飞书 / 企业微信 / 邮件任一可用告警通道</td></tr>
<tr><td>权限</td><td>管理员账号、企业客户账号、API Key 权限隔离</td></tr>
</tbody>
</table>
</div>
</div>
</section>
<section id="boundary">
<div class="section-head">
<span class="num">2</span>
<div>
<h2>New API 能力边界与外包工作拆分</h2>
<p>明确哪些是开源项目自带,哪些只是配置验收,哪些留到未来二开。</p>
</div>
</div>
<div class="section-body">
<div class="callout"><strong>报价约束:</strong>乙方报价和排期时必须区分“开源项目自带能力”“配置与部署验收工作”“未来二开选项”,不得把 New API 已有能力包装成从零开发。</div>
<h3>2.1 New API 开源项目自带能力</h3>
<div class="table-wrap">
<table>
<thead><tr><th>能力</th><th>New API 自带情况</th><th>MVP 处理方式</th></tr></thead>
<tbody>
<tr><td>统一 API 入口</td><td>自带统一 LLM API 网关能力,可对外提供统一 Base URL</td><td><span class="badge cfg">配置并验收</span></td></tr>
<tr><td>OpenAI 兼容接口</td><td>自带 OpenAI 兼容 API并支持多模型服务格式兼容</td><td><span class="badge cfg">配置并验收</span></td></tr>
<tr><td>多上游渠道</td><td>自带 Channel 管理,可配置 Base URL、API Key、模型列表</td><td>配置 3 家渠道商</td></tr>
<tr><td>上游启停与测试</td><td>自带渠道测试、启用、禁用能力</td><td>配置并演示</td></tr>
<tr><td>模型映射</td><td>自带 Model Mapping</td><td>配置主要模型映射</td></tr>
<tr><td>权重分流</td><td>自带 Priority / Weight 等渠道选择能力</td><td>配置权重并压测验证</td></tr>
<tr><td>失败重试</td><td>自带失败自动重试能力</td><td>配置阈值并模拟故障</td></tr>
<tr><td>自动禁用异常渠道</td><td>自带 Auto Disable 等渠道保护能力</td><td>配置并模拟验证</td></tr>
<tr><td>用户管理</td><td>自带用户、角色、状态、额度等管理能力</td><td>配置企业客户账号</td></tr>
<tr><td>Token / API Key</td><td>自带 Token 创建、禁用、额度、模型限制、IP 白名单等能力</td><td>配置客户 Token</td></tr>
<tr><td>分组隔离</td><td>自带 Group可限制用户或 Token 可访问的渠道和模型</td><td>用于企业/客户隔离</td></tr>
<tr><td>调用日志</td><td>自带请求日志、Token 消耗、额度扣减和统计</td><td>验证字段完整性</td></tr>
<tr><td>模型价格与倍率</td><td>自带模型倍率、分组倍率、计费配置</td><td>配置内部计量口径</td></tr>
<tr><td>Docker 部署</td><td>自带 Docker / Docker Compose 部署方式</td><td>生产化部署</td></tr>
<tr><td>数据库 / Redis</td><td>支持 MySQL、PostgreSQL、Redis 等生产组件</td><td>生产环境必须启用</td></tr>
<tr><td>集群部署</td><td>官方支持共享数据库、Redis、反向代理的集群部署思路</td><td>作为稳定性增强项</td></tr>
</tbody>
</table>
</div>
<h3>2.2 自带但必须认真配置和验收</h3>
<div class="table-wrap">
<table>
<thead><tr><th>能力</th><th>外包必须完成的配置</th><th>验收重点</th></tr></thead>
<tbody>
<tr><td>3 家渠道商接入</td><td>配置 Base URL、API Key、模型列表、模型映射、启停状态</td><td>每家渠道商可单独连通测试;日志能看到命中的上游</td></tr>
<tr><td>上游接口兼容性</td><td>核查渠道商是否 OpenAI 兼容;轻微差异先通过配置解决</td><td>不接受只配置一家可用,另外两家“待后续接入”</td></tr>
<tr><td>故障切换</td><td>配置失败重试、自动禁用、优先级、权重、超时参数</td><td>模拟 5xx、超时、网络失败后请求能转移到备用上游</td></tr>
<tr><td>权重分流</td><td>配置 3 家上游权重,例如 A/B/C = 50/30/20</td><td>压测后实际流量分布与配置大体一致</td></tr>
<tr><td>模型匹配</td><td>配置不同模型在不同上游的可用范围</td><td>不支持某模型的上游不得收到该模型请求</td></tr>
<tr><td>分组隔离</td><td>以 Group 或用户/Token 配置实现客户隔离</td><td>企业客户不能使用未授权模型或渠道</td></tr>
<tr><td>Token 额度</td><td>配置额度、过期时间、模型限制、IP 白名单或基础限制</td><td>超额、过期、禁用后必须立即拒绝调用</td></tr>
<tr><td>用量统计</td><td>确认请求量、Token、额度、模型、上游、错误等字段可查</td><td>可按客户、Token、模型、上游维度抽查</td></tr>
<tr><td>生产数据库</td><td>使用 MySQL 或 PostgreSQL不得用 SQLite 作为生产交付</td><td>重启、升级、备份后数据不丢失</td></tr>
<tr><td>Redis / 缓存</td><td>按 New API 生产建议配置 Redis 或等效缓存组件</td><td>高并发下服务稳定,不因缓存缺失导致明显异常</td></tr>
<tr><td>HTTPS 与反代</td><td>配置 Nginx / Caddy / Traefik、HTTPS、请求体大小、超时、流式响应</td><td>长响应和 stream 不被代理层截断</td></tr>
<tr><td>监控告警</td><td>接入 Uptime Kuma、Prometheus/Grafana、Sentry 或同等工具</td><td>服务宕机、上游异常、错误率升高能触发告警</td></tr>
<tr><td>备份恢复</td><td>配置数据库自动备份和恢复脚本</td><td>完成一次恢复演示</td></tr>
</tbody>
</table>
</div>
<h3>2.3 MVP 暂不做,列为未来开发选项</h3>
<div class="table-wrap">
<table>
<thead><tr><th>未来选项</th><th>说明</th></tr></thead>
<tbody>
<tr><td>企业级组织体系</td><td>企业、部门、企业管理员、开发者、审批流、成员邀请等完整租户功能</td></tr>
<tr><td>企业管理员自助后台</td><td>企业管理员自行创建成员、分配 Key、查看本企业所有成员用量</td></tr>
<tr><td>B2B 账单与月报</td><td>月度对账单、发票、合同、在线支付、充值、欠费停用</td></tr>
<tr><td>动态智能调度</td><td>按实时成本、实时延迟、实时错误率、渠道余额自动选择最优上游</td></tr>
<tr><td>429 自动降权策略</td><td>收到 429 后临时降低某上游权重、冷却后自动恢复的精细策略</td></tr>
<tr><td>故障演练平台</td><td>一键模拟上游异常、生成演练报告、事故复盘时间线</td></tr>
<tr><td>管理员操作审计</td><td>记录谁修改了渠道、额度、Token、模型、价格并可追责导出</td></tr>
<tr><td>品牌化客户门户</td><td>完整企业品牌、定制 UI、隐藏开源项目默认充值/公告等不相关入口</td></tr>
<tr><td>独立数据仓库报表</td><td>将调用日志同步到 BI / ClickHouse / 数据仓库进行长期分析</td></tr>
</tbody>
</table>
</div>
</div>
</section>
<section id="flow">
<div class="section-head">
<span class="num">3</span>
<div>
<h2>角色与核心业务流程</h2>
<p>MVP 用 New API 的用户、分组、Token 组合承载 B2B 客户。</p>
</div>
</div>
<div class="section-body">
<h3>3.1 用户角色</h3>
<div class="table-wrap">
<table>
<thead><tr><th>角色</th><th>说明</th><th>MVP 权限</th></tr></thead>
<tbody>
<tr><td>超级管理员</td><td>甲方内部技术或运营负责人</td><td>管理上游渠道、客户、额度、模型、分流策略、日志与告警</td></tr>
<tr><td>企业客户账号</td><td>B2B 客户侧负责人或技术对接人</td><td>查看本账号 API Key、额度、用量、调用记录</td></tr>
<tr><td>企业开发者</td><td>B2B 客户实际调用人员</td><td>使用分配到的 API Key 调用接口,查看必要的调用说明</td></tr>
<tr><td>运维人员</td><td>甲方或乙方交接人员</td><td>查看系统状态、告警、日志、备份与恢复流程</td></tr>
</tbody>
</table>
</div>
<h3>3.2 核心业务流程</h3>
<div class="table-wrap">
<table>
<thead><tr><th>流程</th><th>MVP 要求</th><th>验收标准</th></tr></thead>
<tbody>
<tr><td>企业开户</td><td>管理员创建企业客户账号或客户分组,配置额度和 API Key</td><td>新建客户后可立即生成可用 API Key</td></tr>
<tr><td>API 调用</td><td>企业客户通过统一接口调用模型</td><td>OpenAI 兼容格式或双方约定格式可正常请求和返回</td></tr>
<tr><td>上游路由</td><td>系统按模型、权重、可用性选择上游渠道商</td><td>日志中可看到每次请求命中的上游</td></tr>
<tr><td>故障切换</td><td>某上游异常时自动切换到可用上游</td><td>模拟上游 5xx、超时、网络失败后请求可转移到备用上游</td></tr>
<tr><td>基础智能分流</td><td>按权重、优先级、模型匹配、可用性分配流量</td><td>管理后台可调整权重,实际调用分布与配置基本一致</td></tr>
<tr><td>额度控制</td><td>按客户或 API Key 限制额度</td><td>超出额度后拒绝调用并返回明确错误</td></tr>
<tr><td>用量统计</td><td>记录调用次数、Token、费用或等效消耗</td><td>客户维度、Key 维度、上游维度均可查看统计</td></tr>
<tr><td>监控告警</td><td>异常率、延迟、上游不可用触发告警</td><td>人工制造异常后 3 分钟内收到告警</td></tr>
</tbody>
</table>
</div>
</div>
</section>
<section id="features">
<div class="section-head">
<span class="num">4</span>
<div>
<h2>功能需求</h2>
<p>围绕统一入口、多上游、故障切换、分流和客户 Token 管理验收。</p>
</div>
</div>
<div class="section-body">
<h3>4.1 API 中转核心能力 <span class="badge p0">P0</span></h3>
<div class="table-wrap"><table><thead><tr><th>验收项</th><th>判定标准</th></tr></thead><tbody>
<tr><td>统一 API 入口</td><td>对外提供统一 Base URL客户无需感知 3 家上游差异</td></tr>
<tr><td>OpenAI 兼容接口</td><td>至少支持 Chat Completions 或双方确认的主要调用接口</td></tr>
<tr><td>上游密钥管理</td><td>3 家渠道商密钥可在后台或安全配置中管理,不得写死在代码中</td></tr>
<tr><td>模型映射</td><td>支持将下游模型名映射到不同上游模型名</td></tr>
<tr><td>请求转发</td><td>请求头、请求体、流式响应、错误响应处理稳定</td></tr>
<tr><td>流式输出</td><td>如上游支持 stream中转站需正确透传流式响应</td></tr>
<tr><td>错误标准化</td><td>上游错误需转换为客户可理解的统一错误格式,并保留内部错误详情日志</td></tr>
</tbody></table></div>
<h3>4.2 上游渠道商管理 <span class="badge p0">P0</span></h3>
<div class="table-wrap"><table><thead><tr><th>验收项</th><th>判定标准</th></tr></thead><tbody>
<tr><td>接入 3 家上游</td><td>3 家渠道商均可独立配置、启停、测试连通性</td></tr>
<tr><td>健康检查</td><td>系统可定时检测上游连通性、延迟、错误率</td></tr>
<tr><td>手动启停</td><td>管理员可手动禁用某个上游,禁用后不再分配新请求</td></tr>
<tr><td>优先级配置</td><td>可设置主用、备用或权重</td></tr>
<tr><td>模型支持差异</td><td>不同上游支持模型不同,系统不得把请求路由到不支持该模型的上游</td></tr>
<tr><td>上游凭据保护</td><td>上游 API Key 不得在前端、日志、错误信息中明文泄露</td></tr>
</tbody></table></div>
<h3>4.3 故障切换与熔断 <span class="badge p0">P0</span></h3>
<div class="table-wrap"><table><thead><tr><th>场景</th><th>MVP 要求</th><th>验收方式</th></tr></thead><tbody>
<tr><td>上游网络超时</td><td>超过配置阈值后自动切换备用上游</td><td>人工配置超时或断网模拟</td></tr>
<tr><td>上游 5xx</td><td>连续失败达到阈值后熔断该上游</td><td>使用 mock 或测试上游返回 500</td></tr>
<tr><td>上游限流</td><td>收到 429 或等效限流错误后触发失败重试、自动禁用或转备用上游</td><td>模拟 429</td></tr>
<tr><td>上游恢复</td><td>被自动禁用或异常的上游可通过健康检查或人工测试恢复使用</td><td>恢复上游后观察重新进入候选池</td></tr>
<tr><td>无可用上游</td><td>返回明确错误,不得卡死或无限重试</td><td>禁用全部上游后测试</td></tr>
<tr><td>手动兜底</td><td>管理员可强制指定上游或关闭某上游</td><td>后台操作后立即生效</td></tr>
</tbody></table></div>
<h3>4.4 基础智能分流 <span class="badge p0">P0</span></h3>
<p>MVP 分流不开发复杂算法,使用 New API 自带的优先级、权重、模型匹配、分组隔离和可用性过滤完成。分流策略必须可解释、可配置、可回滚。</p>
<div class="table-wrap"><table><thead><tr><th>分流策略</th><th>MVP 要求</th></tr></thead><tbody>
<tr><td>权重分流</td><td>例如渠道 A 50%、渠道 B 30%、渠道 C 20%</td></tr>
<tr><td>可用性优先</td><td>已熔断或健康检查失败的上游不得继续分配流量</td></tr>
<tr><td>模型匹配</td><td>按模型支持情况选择可用上游</td></tr>
<tr><td>优先级</td><td>支持配置某上游为优先使用,备用上游只在故障时启用</td></tr>
<tr><td>客户隔离</td><td>通过 Group、用户或 Token 限制不同客户可用模型和渠道</td></tr>
<tr><td>实际分布统计</td><td>管理后台或报表可看到各上游承接的请求量和占比</td></tr>
</tbody></table></div>
<h3>4.5 企业客户与 API Key 管理 <span class="badge p0">P0</span></h3>
<div class="table-wrap"><table><thead><tr><th>验收项</th><th>判定标准</th></tr></thead><tbody>
<tr><td>企业客户创建</td><td>管理员可通过 New API 用户、分组或等效配置创建、禁用、编辑企业客户</td></tr>
<tr><td>API Key 生成</td><td>每个企业客户可生成一个或多个 Token / API Key</td></tr>
<tr><td>Key 禁用</td><td>禁用 Key 后立即无法调用</td></tr>
<tr><td>额度设置</td><td>支持按企业或 Key 设置额度、过期时间或调用限制</td></tr>
<tr><td>速率限制</td><td>支持基础 QPS / RPM 限制,避免单客户打爆系统</td></tr>
<tr><td>调用记录</td><td>可按企业、Key、时间、模型、上游查询调用记录</td></tr>
<tr><td>数据隔离</td><td>企业客户只能看到自己的用量和 Key如默认界面无法完整满足MVP 可由管理员代查</td></tr>
</tbody></table></div>
<h3>4.6 管理后台与客户侧最小页面</h3>
<div class="table-wrap"><table><thead><tr><th>模块</th><th>必须能力</th></tr></thead><tbody>
<tr><td>仪表盘</td><td>今日请求量、成功率、平均延迟、错误率、上游状态</td></tr>
<tr><td>上游管理</td><td>3 家渠道商配置、启停、权重、健康状态</td></tr>
<tr><td>客户管理</td><td>用户/分组列表、额度、API Key、状态</td></tr>
<tr><td>调用日志</td><td>请求时间、客户、模型、上游、状态码、耗时、错误原因</td></tr>
<tr><td>告警记录</td><td>可通过外部监控系统查看告警触发时间、类型、恢复时间</td></tr>
<tr><td>客户侧页面</td><td>登录页、API Key 页、用量页、接入说明页</td></tr>
</tbody></table></div>
</div>
</section>
<section id="quality">
<div class="section-head">
<span class="num">5</span>
<div>
<h2>非功能需求</h2>
<p>稳定性、性能、安全和可观测性是 MVP 可运营的硬门槛。</p>
</div>
</div>
<div class="section-body">
<h3>5.1 稳定性与性能 <span class="badge p0">P0</span></h3>
<div class="table-wrap"><table><thead><tr><th>指标</th><th>验收标准</th></tr></thead><tbody>
<tr><td>系统可用性</td><td>试运行期核心 API 可用性不低于 99.5%</td></tr>
<tr><td>API 成功率</td><td>排除客户参数错误后,成功率不低于 99%</td></tr>
<tr><td>故障切换</td><td>单一上游故障时,中转站应在 1 分钟内停止向其分配新请求</td></tr>
<tr><td>500 用户规模</td><td>按 500 个企业用户或开发者账号规模配置,不因用户表规模导致明显卡顿</td></tr>
<tr><td>并发请求</td><td>至少通过 100 并发请求压测,系统自身不崩溃</td></tr>
<tr><td>中转额外延迟</td><td>上游正常情况下,中转站额外增加的中位延迟应小于 300ms</td></tr>
<tr><td>后台查询</td><td>近 7 天调用日志查询 3 秒内返回</td></tr>
<tr><td>长响应</td><td>对流式或长文本响应不得被代理层提前截断</td></tr>
</tbody></table></div>
<h3>5.2 安全与可观测性</h3>
<div class="table-wrap"><table><thead><tr><th>模块</th><th>必须要求</th></tr></thead><tbody>
<tr><td>HTTPS</td><td>生产域名必须启用 HTTPS</td></tr>
<tr><td>密钥保护</td><td>上游 Key、数据库密码、JWT Secret 等必须通过环境变量或密钥文件管理</td></tr>
<tr><td>日志脱敏</td><td>不记录完整 API Key、上游密钥、用户敏感请求内容如必须记录需可配置关闭</td></tr>
<tr><td>权限隔离</td><td>管理员、企业客户、普通用户权限隔离</td></tr>
<tr><td>API 请求监控</td><td>请求量、成功率、错误率、平均延迟、P95 延迟</td></tr>
<tr><td>上游状态监控</td><td>每个上游的健康状态、错误率、延迟、熔断次数</td></tr>
<tr><td>系统资源监控</td><td>CPU、内存、磁盘、网络、数据库连接数</td></tr>
<tr><td>告警</td><td>上游不可用、错误率过高、延迟过高、磁盘不足、服务宕机</td></tr>
</tbody></table></div>
</div>
</section>
<section id="ops">
<div class="section-head">
<span class="num">6</span>
<div>
<h2>部署与运维交付</h2>
<p>必须交付可复现部署、备份恢复、监控告警和完整运维文档。</p>
</div>
</div>
<div class="section-body">
<h3>6.1 环境要求</h3>
<div class="table-wrap"><table><thead><tr><th>环境</th><th>用途</th><th>要求</th></tr></thead><tbody>
<tr><td>测试环境</td><td>功能验收和模拟故障</td><td>可随时重置,不影响生产数据</td></tr>
<tr><td>生产环境</td><td>真实客户使用</td><td>HTTPS、监控、备份、告警全部启用</td></tr>
</tbody></table></div>
<h3>6.2 必交文档</h3>
<ol>
<li>服务器配置建议。</li>
<li>域名和 DNS 配置。</li>
<li>Docker Compose 或部署命令。</li>
<li>环境变量清单。</li>
<li>数据库初始化和迁移步骤。</li>
<li>上游渠道商配置步骤。</li>
<li>监控和告警配置步骤。</li>
<li>备份与恢复步骤。</li>
<li>常见故障排查手册。</li>
<li>如何新增第 4 家上游渠道商。</li>
</ol>
<h3>6.3 备份与恢复</h3>
<div class="table-wrap"><table><thead><tr><th>验收项</th><th>判定标准</th></tr></thead><tbody>
<tr><td>自动备份</td><td>数据库至少每日自动备份一次</td></tr>
<tr><td>保留周期</td><td>至少保留最近 7 天备份</td></tr>
<tr><td>恢复演练</td><td>乙方需演示一次从备份恢复到测试环境</td></tr>
<tr><td>配置备份</td><td>关键配置、环境变量模板、部署文件纳入交付物</td></tr>
</tbody></table></div>
</div>
</section>
<section id="acceptance">
<div class="section-head">
<span class="num">7</span>
<div>
<h2>验收维度</h2>
<p>P0 一票否决 + 功能清单 + New API 配置专项验收。</p>
</div>
</div>
<div class="section-body">
<h3>7.1 P0 一票否决项</h3>
<div class="callout danger">以下任一项未通过,则整批不验收。</div>
<ol>
<li>统一 API 入口无法稳定调用。</li>
<li>3 家上游渠道商未全部接通,且无明确原因和替代方案。</li>
<li>单一上游故障时不能自动或手动切换到其他上游。</li>
<li>API Key、上游密钥或客户数据存在明显泄露风险。</li>
<li>调用日志、用量统计、额度扣减核心数据明显不准确。</li>
<li>管理后台无法完成上游管理、客户管理、Key 管理、用量查看。</li>
<li>监控告警未接入,或模拟故障无法触发告警。</li>
<li>无部署文档、无运维交接文档、无备份恢复方案。</li>
<li>存在恶意代码、后门、未知数据外传逻辑。</li>
<li>乙方将 New API 已有能力改写成不可维护的私有实现,且未获得甲方书面确认。</li>
</ol>
<h3>7.2 功能验收清单</h3>
<div class="table-wrap"><table><thead><tr><th>勾选</th><th>验收项</th><th>判定标准</th><th>验收方</th></tr></thead><tbody>
<tr><td>[ ]</td><td>统一 Base URL</td><td>客户可通过统一地址调用</td><td>甲方技术</td></tr>
<tr><td>[ ]</td><td>3 家上游接入</td><td>每家上游可单独测试通过</td><td>甲方技术</td></tr>
<tr><td>[ ]</td><td>模型映射</td><td>至少 3 个主要模型完成映射</td><td>甲方技术</td></tr>
<tr><td>[ ]</td><td>流式响应</td><td>stream 调用可正常透传</td><td>甲方技术</td></tr>
<tr><td>[ ]</td><td>故障切换</td><td>模拟上游异常后自动切换成功</td><td>甲方技术</td></tr>
<tr><td>[ ]</td><td>手动切换</td><td>后台禁用某上游后立即生效</td><td>甲方技术</td></tr>
<tr><td>[ ]</td><td>权重分流</td><td>权重调整后流量分布变化可观察</td><td>甲方技术</td></tr>
<tr><td>[ ]</td><td>企业客户</td><td>可创建、禁用、编辑企业客户</td><td>甲方产品</td></tr>
<tr><td>[ ]</td><td>API Key</td><td>可生成、禁用、复制、调用</td><td>甲方产品</td></tr>
<tr><td>[ ]</td><td>额度限制</td><td>超额后调用被拒绝</td><td>甲方产品</td></tr>
<tr><td>[ ]</td><td>调用日志</td><td>可按客户、Key、模型、上游查询</td><td>甲方运营</td></tr>
<tr><td>[ ]</td><td>监控告警</td><td>故障 3 分钟内触达告警渠道</td><td>甲方运维</td></tr>
</tbody></table></div>
<h3>7.3 New API 配置专项验收清单</h3>
<div class="table-wrap"><table><thead><tr><th>勾选</th><th>验收项</th><th>判定标准</th><th>验收方</th></tr></thead><tbody>
<tr><td>[ ]</td><td>使用生产数据库</td><td>MySQL 或 PostgreSQL 已启用,未使用 SQLite 交付生产</td><td>甲方技术</td></tr>
<tr><td>[ ]</td><td>Redis 或等效缓存</td><td>按生产配置启用 Redis 或说明替代方案</td><td>甲方技术</td></tr>
<tr><td>[ ]</td><td>3 家渠道商配置表</td><td>交付每家渠道商的 Base URL、模型、权重、优先级、启停状态说明</td><td>甲方技术</td></tr>
<tr><td>[ ]</td><td>模型映射表</td><td>交付下游模型名到上游模型名的映射表</td><td>甲方技术</td></tr>
<tr><td>[ ]</td><td>分组与客户映射</td><td>交付企业客户与 New API 用户/分组/Token 的映射规则</td><td>甲方产品</td></tr>
<tr><td>[ ]</td><td>故障演示记录</td><td>提交 5xx、超时、禁用上游、恢复上游的演示记录</td><td>甲方技术</td></tr>
<tr><td>[ ]</td><td>权重压测记录</td><td>提交权重分流压测结果和日志截图</td><td>甲方技术</td></tr>
<tr><td>[ ]</td><td>日志字段核查</td><td>日志中可查客户、Token、模型、上游、状态、耗时、错误</td><td>甲方运营</td></tr>
<tr><td>[ ]</td><td>反代流式配置</td><td>stream / 长响应不被 Nginx、Caddy 或负载均衡截断</td><td>甲方技术</td></tr>
</tbody></table></div>
</div>
</section>
<section id="milestones">
<div class="section-head">
<span class="num">8</span>
<div>
<h2>交付节点与付款建议</h2>
<p>按验收节点释放款项,避免“部署能打开但不可运营”。</p>
</div>
</div>
<div class="section-body">
<div class="timeline">
<div class="step"><b>CP 1 · 20%</b><strong>方案确认</strong><span>选型说明、架构图、部署计划、风险清单、New API 配置清单。</span></div>
<div class="step"><b>CP 2 · 20%</b><strong>基础部署</strong><span>测试环境、统一 API 入口、管理员后台、1 家上游接通。</span></div>
<div class="step"><b>CP 3 · 25%</b><strong>多上游与切换</strong><span>3 家上游接通、故障切换、权重分流、日志、模型映射表。</span></div>
<div class="step"><b>CP 4 · 25%</b><strong>生产就绪</strong><span>生产部署、HTTPS、监控告警、备份恢复、压测报告。</span></div>
<div class="step"><b>尾款 · 10%</b><strong>保修期结束</strong><span>试运行问题闭环、文档交接完成,无遗留 P0/P1 问题。</span></div>
</div>
</div>
</section>
<section id="defects">
<div class="section-head">
<span class="num">9</span>
<div>
<h2>不通过处理</h2>
<p>缺陷等级、修复时限与返工规则。</p>
</div>
</div>
<div class="section-body">
<h3>9.1 缺陷等级</h3>
<div class="table-wrap"><table><thead><tr><th>等级</th><th>定义</th><th>修复时限</th></tr></thead><tbody>
<tr><td><span class="badge p0">P0</span></td><td>API 主链路不可用、密钥泄露、故障无法切换、数据严重错误</td><td>24 小时内修复或给出可执行临时方案</td></tr>
<tr><td><span class="badge p1">P1</span></td><td>部分客户受影响、部分上游异常、统计局部错误、后台核心功能异常</td><td>72 小时内修复</td></tr>
<tr><td><span class="badge cfg">P2</span></td><td>非核心页面问题、体验问题、文档小错误</td><td>7 个工作日内修复</td></tr>
</tbody></table></div>
<h3>9.2 返工规则</h3>
<ol>
<li>P0 缺陷未关闭,不进入下一付款节点。</li>
<li>同一 P0 问题重复出现 2 次以上,甲方有权要求乙方提交根因分析报告。</li>
<li>返工超过 10 个工作日仍无法通过核心验收,甲方有权暂停项目或更换供应商。</li>
<li>乙方提交修复后,甲方有权要求重测相关完整链路,而非只测单点。</li>
</ol>
</div>
</section>
<section id="legal">
<div class="section-head">
<span class="num">10</span>
<div>
<h2>法务与交接条款</h2>
<p>保修、保密、知识产权、开源合规与最终交接清单。</p>
</div>
</div>
<div class="section-body">
<h3>10.1 保修期与保密</h3>
<ol>
<li>生产验收通过后进入 4 周保修期。</li>
<li>保修期内,由乙方交付代码、配置、部署方式导致的 P0 / P1 缺陷,乙方需免费修复。</li>
<li>上游渠道商自身不可用不属于乙方责任,但乙方需保证中转站能按设计完成故障识别、切换、告警和日志记录。</li>
<li>乙方对上游渠道商信息、API Key、客户信息、价格策略、调用数据、系统架构、部署凭据负保密义务。</li>
</ol>
<h3>10.2 知识产权与开源合规</h3>
<ol>
<li>基于开源项目的部分遵守原开源许可证。</li>
<li>乙方为本项目新增的部署脚本、配置、二次开发代码、文档、监控面板配置,验收并结清款项后归甲方使用。</li>
<li>乙方不得在交付后保留生产环境访问权限、数据库权限、服务器权限或上游密钥。</li>
<li>若采用 <code>QuantumNous/new-api</code>,乙方必须在方案确认阶段提示其开源许可证约束,并说明二次开发、部署、对外服务场景下的合规处理方式。</li>
</ol>
<h3>10.3 最终交接清单</h3>
<ol>
<li>源码仓库或二次开发补丁。</li>
<li>部署文件。</li>
<li>环境变量模板。</li>
<li>管理员账号交接清单。</li>
<li>上游渠道商配置说明。</li>
<li>监控面板地址和告警配置。</li>
<li>数据库备份和恢复说明。</li>
<li>压测报告。</li>
<li>故障切换演示记录。</li>
<li>运维手册。</li>
<li>New API 配置清单包括渠道、模型映射、分组、Token、价格倍率、环境变量。</li>
<li>未来二开建议清单,必须与本次 MVP 交付范围分开列示。</li>
</ol>
<h3>双方确认</h3>
<div class="sign-grid">
<div class="sign-box"><strong>甲方业务负责人</strong>签字 / 日期</div>
<div class="sign-box"><strong>甲方技术负责人</strong>签字 / 日期</div>
<div class="sign-box"><strong>乙方项目负责人</strong>签字 / 日期</div>
<div class="sign-box"><strong>乙方技术负责人</strong>签字 / 日期</div>
</div>
<div class="print-note">企业级 API 中转站 MVP 外包需求与验收标准 · v1.1 · 2026-05-25</div>
</div>
</section>
</div>
</div>
</main>
</body>
</html>