1monorepo 目录树
aigw/ # 新建开发目录(独立 git 仓库)
├─ pnpm-workspace.yaml
├─ package.json # 根:scripts、devDeps(typescript, vitest, wrangler, eslint)
├─ tsconfig.base.json
├─ .github/workflows/ci.yml # lint+typecheck+test → deploy preview/prod
├─ .gitignore # 含 .dev.vars, node_modules, .wrangler
├─ README.md
├─ packages/
│ ├─ core/ # 纯逻辑,无 CF 依赖,可独立单测
│ │ ├─ src/
│ │ │ ├─ router.ts # resolveCandidates + dispatch(见 23)
│ │ │ ├─ cache.ts # cacheKey 规范化 + 判定
│ │ │ ├─ billing.ts # cost/billed_units 计算
│ │ │ ├─ schemas.ts # Zod:API I/O + 配置
│ │ │ ├─ errors.ts # 统一错误码
│ │ │ └─ providers/ # 各上游 adapter(请求转换/usage 解析/错误归一)
│ │ │ ├─ openrouter.ts
│ │ │ ├─ deepseek.ts
│ │ │ ├─ groq.ts
│ │ │ └─ workers-ai.ts
│ │ └─ test/ # vitest 单测(router/cache/billing/providers)
│ ├─ db/ # D1 迁移 + 数据访问
│ │ ├─ migrations/0001_init.sql # 见 22
│ │ └─ src/queries.ts
│ └─ config/ # 共享类型/常量:provider 白名单、tier 定义
│ └─ src/allowlist.ts # PROVIDER_ALLOWLIST(红线护栏)
├─ workers/
│ ├─ gateway/ # 主 Worker(数据面 + 管理端)
│ │ ├─ src/
│ │ │ ├─ index.ts # Hono app 入口
│ │ │ ├─ middleware/ # auth, ratelimit, requestId, error
│ │ │ ├─ routes/ # /v1/chat, /v1/embeddings, /v1/models, /admin/*
│ │ │ └─ do/RateLimiter.ts # Durable Object 令牌桶
│ │ ├─ wrangler.toml # bindings: D1, KV, DO, Queues, AI, secrets(见 25)
│ │ └─ test/ # Miniflare 集成测试
│ └─ batch/ # 批处理消费者 Worker(M3)
│ ├─ src/index.ts # Queue consumer
│ └─ wrangler.toml
└─ docs/ # 从 AI_Gateway/ 迁移过来的相关规格(19–27)
2技术栈锁定
| 层 | 选型(锁定) |
|---|---|
| 运行时 | Cloudflare Workers(compatibility_date 2026-05-30+,nodejs_compat 视需要) |
| 语言 | TypeScript 5.x(strict) |
| Web 框架 | Hono 4.x |
| 校验 | Zod 3.x |
| 数据 | D1(SQLite)+ KV + Durable Objects + Queues |
| 上游聚合 | OpenRouter(统一接入)+ DeepSeek/Groq 直采 + Workers AI;前置 Cloudflare AI Gateway |
| 包管理 | pnpm 9.x workspaces |
| 测试 | Vitest(单测)+ @cloudflare/vitest-pool-workers / Miniflare(集成) |
| Lint | ESLint 9 + typescript-eslint(沿用根仓库配置风格) |
| 部署 | wrangler 4.x + GitHub Actions |
与仓库既有 Cloudflare-first 约定一致(根 wrangler.toml/tsconfig);后端模式参照 meng/12。
3脚手架步骤(M0,从 0 到可部署空网关)
mkdir aigw && cd aigw && git init && pnpm init
# 1) workspace
printf 'packages:\n - "packages/*"\n - "workers/*"\n' > pnpm-workspace.yaml
# 2) 根 devDeps
pnpm add -Dw typescript vitest wrangler eslint typescript-eslint @cloudflare/vitest-pool-workers
# 3) 创建 packages/core packages/db packages/config workers/gateway(各自 package.json + tsconfig)
# 4) gateway Worker:Hono hello world + wrangler.toml 绑定 D1/KV
pnpm --filter gateway add hono zod
# 5) 本地 D1 + 迁移
wrangler d1 create aigw-dev-db
wrangler d1 migrations apply aigw-dev-db --local
# 6) 本地跑
pnpm --filter gateway dev # wrangler dev(Miniflare)
# 7) CI:.github/workflows/ci.yml(lint+typecheck+test)
# 8) 首次部署 preview
wrangler deploy --env preview
DoD(M0):CI 全绿;GET /healthz 返回 200;preview 环境可访问;本地 D1 迁移成功。
4MVP 分步序列(与 19 里程碑对齐)
M1-1
鉴权中间件:解析 Bearer、sha256 查 D1
api_keys、KV 缓存校验结果。单测 + 集成测试。M1-2
chat/completions 直通:OpenRouter adapter;非流式先通,再加 SSE 流式透传。回显 OpenAI 格式 + 响应头。
M1-3
记账:解析 usage → billing.ts 算 cost → 写
requests(含 latency、request id)。M1-4
基础限流:RateLimiter Durable Object 令牌桶(每 key RPM)。
M2-1
路由 + 回退:routes 配置 → resolveCandidates/dispatch(见 23);接 DeepSeek/Groq/Workers AI adapter。
M2-2
缓存:cacheKey 规范化 + KV 读写 + 命中标记;prompt 缓存透传。
M2-3
配额 + 倍率:quota 前置检查 + billed_units 回扣;logical_models.multiplier。
M2-4
管理端 API:渠道/模型/路由/key/配额 CRUD + 用量聚合;白名单护栏(FR-14)。
M3-1
Batch:/v1/batch + Queues 消费者 Worker + 结果存取。
M3-2
可观测 + 硬化:Analytics Engine 指标 + 告警;压测、回滚演练、安全复查(见 26)。