brainstate

jaccen/AIRoute · source

Snapshot 0 · 2026-11-04T12:47:28Z · TypeScript · Apache-2.0

Content fingerprint7a78022fe4cbf0fd8a6aa582d91973663fdcb6445062e76b6b16f501e2982c55

GitHub description at capture

面向国内合规增强的 AI 网关

README at capture


<div align="center">

# AIRoute

### 面向国内合规增强的 AI 网关

基于 OmniRoute (v3.8.46) fork,全面适配中国网络环境、数据合规要求与国产云生态。

**237+ Provider · 90+ 免费额度 · 17 种路由策略 · RTK+Caveman 压缩引擎**

---

### 一个入口聚合所有大模型,智能路由择优调度,数据不出境。

**你遇到的问题,AIRoute 来解:**

| 痛点 | AIRoute 怎么解 |
|------|---------------|
| OpenAI/Claude 在国内连不上,换一个 Provider 就得改一版代码 | **统一入口** — 所有 Provider 接入一个 API,下游零改动切换 |
| DeepSeek 便宜但偶尔宕机,Claude 稳但贵,不知道该用谁 | **智能路由** — 17 种策略自动选:优先国产、成本最优、故障自动切换 |
| 想白嫖免费模型,但每个平台要单独注册、单独调接口 | **90+ 免费额度** — 内置免费 Provider,开箱即用,不花一分钱 |
| 用了海外模型,数据出境合规风险大 | **合规底座** — PII 自动脱敏、数据出境管控、强制加密,一个开关 `AIRROUTE_REGION=cn` 全搞定 |
| 多人/多团队共用,成本和权限管不住 | **企业级存储** — SQLCipher/PostgreSQL 双轨,审计日志、熔断限流、多租户就绪 |

**适合谁用?**

- **个人开发者** — 零成本接入 90+ 免费模型,一个 API Key 搞定所有 AI 能力
- **创业团队** — 不用逐个对接 Provider,智能路由自动控成本、保可用
- **企业 IT** — 合规、审计、加密、不出境,满足等保与《数据安全法》要求
- **AI 应用构建者** — Coze/Dify 等 Agent 平台一键接入,MCP 95 工具开箱调用

</div>

---

## 目录

- [项目定位](#项目定位)
- [国内增强特性](#国内增强特性)
- [架构概览](#架构概览)
- [国内特性文件清单](#国内特性文件清单)
- [部署指南](#部署指南)
- [公网暴露(FreeDomain + Cloudflare Named Tunnel)](#公网暴露freedomain--cloudflare-named-tunnel)
- [开发路线图](#开发路线图)
- [快速开始](#快速开始)
- [技术栈](#技术栈)
- [License](#license)

---

## 项目定位

AIRoute 是 [OmniRoute](https://github.com/diegosouzapw/AIRoute) 的国内合规 fork。OmniRoute 是一个开源的 AI Gateway,聚合 237+ LLM Provider、95 种 MCP 工具、17 种路由策略和 10 级 Token 压缩管线。AIRoute 在此基础上:

1. **合规先行** — 满足《个人信息保护法》(PIPL)、《数据安全法》(DSL) 对 PII 脱敏、数据出境管控、强制加密的要求
2. **本地优先** — 默认优先国内 Provider,降低跨境延迟 100-300ms
3. **信创适配** — 华为云盘古、阿里云百炼、腾讯混元、百度千帆等国产大模型一等公民
4. **企业级存储** — SQLCipher / PostgreSQL 双轨可选,满足等保与审计要求

核心开关:`AIRROUTE_REGION=cn`。设置后自动激活全部中国区特性。

---

## 国内增强特性

### P0 — 合规底座(必选)

| 特性 | 说明 | 关键文件 |
|------|------|----------|
| **华为云盘古 Provider** | ModelArts / 盘古大模型接入,满足信创要求 | `open-sse/config/providers/registry/huawei/index.ts` |
| **国产 PII 脱敏** | 中国身份证号(18位)、手机号(11位)、银联卡号自动识别与脱敏 | `src/lib/piiSanitizer.ts`, `src/shared/utils/inputSanitizer.ts` |
| **强制加密** | `AIRROUTE_REGION=cn` 时未配置 `STORAGE_ENCRYPTION_KEY` 拒绝启动 | `src/lib/db/encryption.ts` |
| **区域感知默认值** | 区域敏感配置项支持 `"auto"` 默认值,按 `AIRROUTE_REGION` 自动解析 | `src/shared/constants/featureFlagDefinitions.ts`, `src/shared/utils/featureFlags.ts` |

### P1 — 功能增强

| 特性 | 说明 | 关键文件 |
|------|------|----------|
| **百度/必应中国搜索** | `baidu-search` 与 `bing-cn-search` 搜索 Provider | `open-sse/config/searchRegistry.ts`, `src/shared/constants/providers/search.ts` |
| **数据出境管控** | 域名白名单 + 出境日志记录,符合《数据安全法》要求 | `src/lib/compliance/dataExportControl.ts` |
| **区域感知路由** | 国内 Provider 评分权重自动上浮,跨境 Provider 延迟惩罚 | `open-sse/services/regionProviders.ts`, `open-sse/services/autoCombo/scoring.ts` |
| **策略引擎合规** | 自动注入 `cn-prefer-domestic` / `cn-block-overseas-free-tier` 等策略 | `src/domain/policyEngine.ts` |
| **Coze/Dify 适配层** | Agent 平台集成:RAG、工具调用、多轮工作流委托 | `src/lib/integrations/coze/adapter.ts`, `src/lib/integrations/dify/adapter.ts` |
| **ACK/CCE 部署模板** | 阿里云 ACK / 华为云 CCE 一键部署 YAML,含 HPA/PDB/NetworkPolicy | `deploy/ack/airoute.yaml`, `deploy/cce/airoute.yaml` |

### P2 — 企业级

| 特性 | 说明 | 关键文件 |
|------|------|----------|
| **SQLCipher / PostgreSQL** | 企业级存储层三选一:SQLite(默认) / SQLCipher(中国区) / PostgreSQL(大规模) | `src/lib/db/adapters/sqlcipherAdapter.ts`, `src/lib/db/adapters/pgAdapter.ts` |
| **PG SQL 转译器** | 15+ 自动转换规则:AUTOINCREMENT→SERIAL、datetime→CURRENT_TIMESTAMP 等 | `src/lib/db/pgSqlTranspiler.ts` |
| **PG 迁移覆盖** | FTS5→tsvector/GIN、rowid→SERIAL+触发器 等手工覆盖 | `src/lib/db/migrations_pg/022_add_memory_fts5.sql`, `023_fix_memory_fts_uuid.sql` |
| **MITM 审计日志** | HMAC 链式校验和,防篡改审计所有 MITM 操作 | `src/mitm/mitmAuditLogger.ts` |
| **MITM 作用域限制** | 国内 80+ 金融/政务域名自动绕过;限制 tproxy-decrypt 等高危功能 | `src/mitm/cnScopeLimitation.ts` |
| **MITM DNS 区域感知** | 国内用 AliDNS (223.5.5.5),海外用 Google DNS (8.8.8.8) | `src/mitm/server.cjs` |
| **国产模型自动同步** | 6 大国产 Provider 模型列表后台轮询同步(6h 间隔,退避重试) | `src/lib/cnProviderModelSync.ts` |
| **Provider modelsUrl** | DeepSeek、豆包、Moonshot、腾讯混元、GLM 增加 modelsUrl 配置 | `open-sse/config/providers/registry/{deepseek,doubao,moonshot,tencent,glm}/index.ts` |

---

## 架构概览

```
┌──────────────────────────────────────────────────────────┐
│     IDE / CLI (Claude Code, Codex, Cursor, Cline …)     │
└─────────────────────────┬────────────────────────────────┘
                          │ http://localhost:20128/v1
                          ▼
┌──────────────────────────────────────────────────────────┐
│                   AIRoute — 智能路由网关                   │
│                                                          │
│  ┌─────────────┐  ┌─────────────┐  ┌──────────────────┐ │
│  │ 区域感知路由  │  │ PIPI 合规层  │  │ 10级压缩管线     │ │
│  │ (CN优先策略) │  │ (脱敏/管控)  │  │ (RTK+Caveman)   │ │
│  └─────────────┘  └─────────────┘  └──────────────────┘ │
│  ┌─────────────┐  ┌─────────────┐  ┌──────────────────┐ │
│  │ 熔断器×3层   │  │ MITM 审计   │  │ MCP(95工具)/A2A  │ │
│  │ (Provider/  │  │ (HMAC链式)  │  │ (Coze/Dify适配)  │ │
│  │  Key/Model) │  │             │  │                  │ │
│  └─────────────┘  └─────────────┘  └──────────────────┘ │
└───────────────┬──────────┬──────────────┬────────────────┘
                ▼          ▼              ▼
        ┌──────────┐ ┌──────────┐ ┌─────────────┐
        │ 国产云    │ │ 国际云    │ │ 免费额度     │
        │ 盘古/百炼 │ │ OpenAI/  │ │ Kiro/Qoder/ │
        │ 混元/千帆 │ │ Claude/  │ │ Pollinations│
        │ DeepSeek │ │ Gemini   │ │ Cloudflare  │
        └──────────┘ └──────────┘ └─────────────┘
```

---

## 国内特性文件清单

以下仅列出 AIRoute 新增/修改的文件(不含 OmniRoute 原有文件)。

### 核心合规

```
src/
├── lib/
│   ├── piiSanitizer.ts                        # [修改] 增加18位身份证、11位手机号、银联卡PII模式
│   ├── compliance/
│   │   └── dataExportControl.ts               # [新增] 数据出境管控:域名白名单+出境日志
│   ├── db/
│   │   ├── encryption.ts                      # [修改] CN区强制加密策略
│   │   ├── core.ts                            # [修改] PG异步初始化路径、pg_dump备份
│   │   ├── pgSqlTranspiler.ts                 # [新增] SQLite→PG SQL自动转译(15+规则)
│   │   ├── pgMigrationRunner.ts               # [新增] PG专用迁移执行器(information_schema)
│   │   ├── migrations_pg/
│   │   │   ├── 022_add_memory_fts5.sql        # [新增] FTS5→tsvector/GIN PG覆盖
│   │   │   └── 023_fix_memory_fts_uuid.sql    # [新增] rowid→SERIAL+PG触发器覆盖
│   │   └── adapters/
│   │       ├── types.ts                       # [修改] SqliteDriverKind扩展postgresql
│   │       ├── driverFactory.ts               # [修改] resolveDbType(), SQLCipher/PG路径
│   │       ├── sqlcipherAdapter.ts             # [新增] SQLCipher完整适配器
│   │       └── pgAdapter.ts                    # [新增] PostgreSQL完整适配器
│   ├── cnProviderModelSync.ts                  # [新增] 国产模型自动同步服务
│   └── integrations/
│       ├── coze/adapter.ts                     # [新增] Coze(扣子) Agent平台适配
│       └── dify/adapter.ts                     # [新增] Dify Agent平台适配
├── mitm/
│   ├── mitmAuditLogger.ts                     # [新增] HMAC链式MITM审计日志
│   ├── cnScopeLimitation.ts                   # [新增] CN区MITM作用域限制(80+域名绕过)
│   ├── manager.ts                             # [修改] CN作用域校验、审计日志集成
│   └── server.cjs                             # [修改] 区域感知DNS(AliDNS/Google)
├── domain/
│   └── policyEngine.ts                        # [修改] 注入cn-prefer-domestic等合规策略
├── shared/
│   ├── constants/
│   │   ├── providers/
│   │   │   ├── apikey/regional.ts             # [修改] 华为/Coze/Dify前端展示字段
│   │   │   ├── search.ts                      # [修改] 百度/必应中国搜索Provider
│   │   │   ├── providers.ts                   # [修改] ENTERPRISE_CLOUD_PROVIDER_IDS
│   │   │   └── featureFlagDefinitions.ts      # [修改] 区域感知"auto"默认值
│   │   └── utils/
│   │       ├── featureFlags.ts                # [修改] isChinaRegion() + "auto"解析
│   │       └── inputSanitizer.ts              # [修改] 中国PII模式
├── lib/a2a/skills/
│   ├── cozeDelegation.ts                      # [新增] Coze A2A技能
│   └── difyDelegation.ts                      # [新增] Dify A2A技能
└── instrumentation-node.ts                    # [修改] CN模型同步接入启动流程
```

### Provider 注册

```
open-sse/config/providers/
├── registry/
│   ├── huawei/index.ts                        # [新增] 华为云ModelArts/盘古
│   ├── huawei-cn/index.ts                     # [新增] 华为云(中国区端点)
│   ├── coze-bot/index.ts                      # [新增] Coze(扣子)Bot
│   ├── dify-workflow/index.ts                 # [新增] Dify工作流
│   ├── deepseek/index.ts                      # [修改] 增加modelsUrl+passthroughModels
│   ├── doubao/index.ts                        # [修改] 增加modelsUrl+passthroughModels
│   ├── moonshot/index.ts                      # [修改] 增加modelsUrl+passthroughModels
│   ├── tencent/index.ts                       # [修改] 增加modelsUrl+passthroughModels
│   └── glm/index.ts                           # [修改] 增加modelsUrl+passthroughModels
├── index.ts                                   # [修改] barrel导出
├── searchRegistry.ts                          # [修改] 百度/必应中国搜索
└── services/
    └── regionProviders.ts                     # [新增] 区域Provider配置
```

### 路由与策略

```
open-sse/services/
├── regionProviders.ts                         # [新增] 区域Provider配置与评分调整
├── autoCombo/scoring.ts                       # [修改] CN区评分权重上浮
└── combo/autoConfig.ts                        # [修改] CN区auto-combo默认配置
```

### 部署

```
deploy/
├── ack/airoute.yaml                           # [修改] DB_TYPE/PG连接/NetworkPolicy
├── cce/airoute.yaml                           # [修改] DB_TYPE/PG连接/NetworkPolicy
├── postgres/postgresql.yaml                   # [新增] PG StatefulSet独立部署
├── redis/redis.yaml                           # [新增] Redis StatefulSet
└── README.md                                  # [修改] 数据库模式选择指南
```

### 配置

```
.env.example                                   # [修改] DB_TYPE/DB_CONNECTION_STRING/SQLCIPHER_*环境变量
```

---

## 部署指南

### 环境变量速查

#### 基础配置

| 变量 | 默认值 | 说明 |
|------|--------|------|
| `AIRROUTE_REGION` | — | 设为 `cn` 激活全部中国区特性 |
| `STORAGE_ENCRYPTION_KEY` | — | AES-256-GCM 密钥(CN 区强制要求;非 CN 区同样强制,除非 `ENCRYPTION_OPT_OUT=true`) |
| `DB_TYPE` | `sqlite` | 可选 `sqlite` / `sqlcipher` / `postgresql` |
| `DB_CONNECTION_STRING` | — | PostgreSQL 连接串(DB_TYPE=postgresql 时必填) |
| `SQLCIPHER_KEY` | — | SQLCipher 密钥(DB_TYPE=sqlcipher 时必填) |
| `PORT` | `20128` | API + 仪表盘端口 |
| `DATA_DIR` | `~/.airoute/` | 数据目录 |

#### 安全配置(v3.8.46 安全加固后新增)

| 变量 | 默认值 | 说明 |
|------|--------|------|
| `JWT_SECRET` | — | **必填**,>=32 字符,启动时校验长度与占位符 |
| `INITIAL_PASSWORD` | — | 管理员初始密码,**不可为 `CHANGEME`**,否则拒绝启动 |
| `GUARDRAIL_ON_ERROR` | `block` | Guardrail 异常时的行为:`block`(拒绝请求)或 `warn`(放行并告警) |
| `ENCRYPTION_OPT_OUT` | `false` | 设为 `true` 可跳过强制加密(仅限非生产环境调试用) |
| `AUTH_COOKIE_SECURE` | `true` | 认证 Cookie Secure 标志,本地 HTTP 调试可设为 `false` |
| `PIPELINE_TIMEOUT_MS` | `300000` | AI Pipeline 总超时(毫秒),默认 5 分钟 |
| `STAGE_TIMEOUT_MS` | `120000` | AI Pipeline 单阶段超时(毫秒),默认 2 分钟 |

### 阿里云 ACK 部署

```bash
# 1. 创建命名空间
kubectl create namespace airoute

# 2. 创建加密密钥
kubectl create secret generic airoute-secrets \
  --namespace airoute \
  --from-literal=STORAGE_ENCRYPTION_KEY=$(openssl rand -hex 32)

# 3. 部署
kubectl apply -f deploy/ack/airoute.yaml

# 4. 验证
kubectl get pods -n airoute
kubectl port-forward svc/airoute 20128:20128 -n airoute
```

详见 `deploy/README.md`。

### 华为云 CCE 部署

```bash
kubectl apply -f deploy/cce/airoute.yaml
```

### PostgreSQL 模式部署

```bash
# 先部署 PG
kubectl apply -f deploy/postgres/postgresql.yaml

# 再部署 AIRoute(DB_TYPE=postgresql)
# 详见 deploy/ack/airoute.yaml 中 DB_TYPE/DB_CONNECTION_STRING 配置
```

### Docker 部署

#### 前置要求

| 工具 | 最低版本 | 说明 |
|------|----------|------|
| Docker | 24.0+ | 支持 BuildKit(`DOCKER_BUILDKIT=1`) |
| Docker Compose | v2.20+ | `docker compose`(非 `docker-compose`) |

> Windows 用户推荐 [Docker Desktop](https://www.docker.com/products/docker-desktop/),安装后 `docker` 和 `docker compose` 均可用。

#### 镜像说明

Dockerfile 提供三个运行时目标(target),按需选择:

| Target | 镜像标签 | 大小 | 适用场景 |
|--------|----------|------|----------|
| `runner-base` | `airoute:base` | ~2.3 GB | 绝大多数 Provider,推荐默认使用 |
| `runner-web` | `airoute:web` | ~3.8 GB | 需要 Playwright/Chromium 的 Web-Cookie Provider(gemini-web、claude-web、claude-turnstile) |
| `runner-cli` | `airoute:cli` | ~5.6 GB | 容器内安装 Codex/Claude Code/Droid/OpenClaw CLI |

#### 方式一:Docker Compose(推荐)

**1. 准备环境变量**

```bash
cp .env.example .env
```

编辑 `.env`,至少填写以下必填项:

```bash
AIRROUTE_REGION=cn
STORAGE_ENCRYPTION_KEY=<openssl rand -hex 32>   # 加密密钥
JWT_SECRET=<32字符的随机字符串>                  # JWT 签名密钥
INITIAL_PASSWORD=<你的强密码>                     # 管理员密码,不可为 CHANGEME
REDIS_PASSWORD=<Redis密码>                        # Redis 认证密码
```

> 生成密钥快捷命令:`openssl rand -hex 32`

**2. 选择 Profile 启动**

```bash
# 最小化启动(推荐大多数用户)
docker compose --profile base up -d

# 需要 Web-Cookie Provider 时
docker compose --profile web up -d

# 需要容器内 CLI 工具时
docker compose --profile cli up -d

# 容器内 CLI + CLIProxyAPI 侧车
docker compose --profile cli --profile cliproxyapi up -d

# 添加 Qdrant 语义记忆侧车(百万级向量场景)
docker compose --profile base --profile memory up -d

# 添加 Bifrost Go LLM 路由侧车
docker compose --profile base --profile bifrost up -d

# Host 模式:挂载宿主机已安装的 CLI 二进制
docker compose --profile host up -d
```

**3. 验证**

```bash
# 查看容器状态
docker compose ps

# 查看日志
docker compose logs -f AIRoute

# 健康检查
curl http://localhost:20128/api/monitoring/health
```

**4. 访问服务**

| 入口 | 地址 |
|------|------|
| 仪表盘 | `http://localhost:20128` |
| API 端点 | `http://localhost:20128/v1` |
| API(独立端口) | `http://localhost:20129`(需设置 `API_PORT=20129`) |

#### 方式二:docker run

**最小化启动**

```bash
docker run -d --name airoute --restart unless-stopped \
  -p 20128:20128 \
  -e AIRROUTE_REGION=cn \
  -e STORAGE_ENCRYPTION_KEY=$(openssl rand -hex 32) \
  -e JWT_SECRET=$(openssl rand -hex 32) \
  -e INITIAL_PASSWORD=YourStrongPassword123! \
  -v airoute-data:/app/data \
  airoute:base
```

**带 Redis + 认证**

```bash
# 1. 启动 Redis
docker run -d --name airoute-redis --restart unless-stopped \
  redis:7-alpine \
  redis-server --save 60 1 --loglevel warning --requirepass your_redis_password

# 2. 启动 AIRoute
docker run -d --name airoute --restart unless-stopped \
  --link airoute-redis:redis \
  -p 20128:20128 \
  -e AIRROUTE_REGION=cn \
  -e STORAGE_ENCRYPTION_KEY=$(openssl rand -hex 32) \
  -e JWT_SECRET=$(openssl rand -hex 32) \
  -e INITIAL_PASSWORD=YourStrongPassword123! \
  -e REDIS_URL=redis://:your_redis_password@redis:6379 \
  -v airoute-data:/app/data \
  airoute:base
```

#### 方式三:生产环境 Compose

```bash
# 启动(端口 20130/20131,与开发环境隔离)
docker compose -f docker-compose.prod.yml up -d --build

# 查看日志
docker compose -f docker-compose.prod.yml logs -f

# 停止
docker compose -f docker-compose.prod.yml down
```

生产环境默认使用 `runner-cli` target,端口映射 `20130→20128`(仪表盘)、`20131→20129`(API)。

#### 构建自定义镜像

```bash
# 默认构建(runner-base)
docker build -t airoute:base .

# 指定 target
docker build --target runner-web -t airoute:web .
docker build --target runner-cli -t airoute:cli .

# 调整构建内存(默认 4GB,大型项目可能需要更多)
docker build --build-arg AIRoute_BUILD_MEMORY_MB=6144 -t airoute:base .

# 多平台构建(ARM64 / AMD64)
docker buildx build --platform linux/amd64,linux/arm64 -t airoute:base .
```

#### 数据卷管理

| 路径 | 用途 | 建议 |
|------|------|------|
| `./data:/app/data` | 应用数据(SQLite/SQLCipher 数据库、日志、配置) | 必须挂载,否则容器重建后数据丢失 |
| `airoute-data` | Docker 命名卷(替代 bind mount) | 生产环境推荐命名卷 |

```bash
# 备份数据
docker run --rm -v airoute-data:/app/data -v $(pwd):/backup alpine \
  tar czf /backup/airoute-backup-$(date +%Y%m%d).tar.gz -C /app data

# 恢复数据
docker run --rm -v airoute-data:/app/data -v $(pwd):/backup alpine \
  tar xzf /backup/airoute-backup-20260803.tar.gz -C /app
```

#### 运行时内存调优

| 环境变量 | 默认值 | 说明 |
|----------|--------|------|
| `AIRoute_MEMORY_MB` | `1024` | Node.js V8 堆上限(MB),容器运行时生效 |
| `AIRoute_BUILD_MEMORY_MB` | `4096` | 构建阶段 V8 堆上限(MB),仅 `docker build` 时使用 |

```bash
# 低内存 VPS(1-2 GB RAM)
docker compose --profile base up -d -e AIRoute_MEMORY_MB=512

# 高并发生产环境
docker compose --profile base up -d -e AIRoute_MEMORY_MB=2048
```

#### Docker Compose Profile 速查

| Profile | 包含组件 | 用途 |
|---------|----------|------|
| `base` | AIRoute + Redis | 最小化部署,覆盖绝大多数场景 |
| `web` | AIRoute(含Chromium) + Redis | Web-Cookie Provider(gemini-web/claude-web/claude-turnstile) |
| `cli` | AIRoute(含CLI工具) + Redis | 容器内直接使用 Codex/Claude Code/Droid/OpenClaw |
| `host` | AIRoute + Redis | 挂载宿主机 CLI 二进制(Linux 优先) |
| `memory` | Qdrant 侧车 | 百万级向量语义记忆(需 `QDRANT_ENABLED=true`) |
| `bifrost` | Bifrost Go 侧车 | Tier-1 LLM 路由(需 `BIFROST_ENABLED=true`) |
| `cliproxyapi` | CLIProxyAPI 侧车 | CLI Proxy API 端口 8317 |

#### 常见问题

**Q: 容器启动后显示 `unhealthy`**

健康检查脚本会依次探测 `127.0.0.1` → `localhost` → `::1` → 容器内网 IP。启动需要 10-15 秒,如果持续 unhealthy:

```bash
# 查看健康检查日志
docker inspect --format='{{json .State.Health}}' airoute | python3 -m json.tool

# 手动测试
docker exec airoute node healthcheck.mjs
```

**Q: 数据卷权限错误(`WARNING: /app/data is not writable`)**

```bash
# Docker 环境
sudo chown -R 1000:1000 ./data
chmod -R u+rwX ./data

# Podman 环境
podman unshare chown -R $(id -u):$(id -g) ./data
```

**Q: 构建时 `JavaScript heap out of memory`**

```bash
# 增大构建内存
docker build --build-arg AIRoute_BUILD_MEMORY_MB=6144 -t airoute:base .
```

**Q: 需要 Web-Cookie Provider 但用了 `base` 镜像**

Web-Cookie Provider 依赖 Playwright/Chromium,`base` 镜像不包含。请切换到 `web` profile:

```bash
docker compose --profile web up -d
```

**Q: 如何查看完整环境变量列表**

`.env.example` 文件包含 940+ 行环境变量文档,覆盖所有可配置项:

```bash
cp .env.example .env
# 按 .env 中的注释说明逐项配置
```

### 本地源码运行

> **Node.js 版本要求**:`>=22.0.0 <23 || >=24.0.0 <27`(推荐 Node 22.x LTS 或 24.x LTS)
>
> 低于 Node 22 会导致 `undici` 的 `webidl` 兼容性错误,项目无法启动。

```bash
# 1. 确保 Node.js 版本正确
node -v   # 应输出 v22.x 或 v24.x 或 v25.x

# 2. 复制环境变量并修改
cp .env.example .env
# 编辑 .env,必填项:
#   AIRROUTE_REGION=cn
#   STORAGE_ENCRYPTION_KEY=<openssl rand -hex 32>
#   JWT_SECRET=<>=32字符的随机字符串>
#   INITIAL_PASSWORD=<强密码,不可为 CHANGEME>

# 3. 安装依赖
npm install

# 4. 如果切换过 Node 版本,需重编译原生模块
npm rebuild better-sqlite3

# 5. 启动开发服务器
PORT=20128 npm run dev
```

仪表盘:`http://localhost:20128`
API 端点:`http://localhost:20128/v1`

> **Windows 注意**:系统中可能存在多个 Node.js 安装。请确保 PATH 中优先使用 `>=22` 的版本,或使用完整路径启动:
> ```powershell
> & "node.exe" --max-old-space-size=8192 scripts/dev/run-next.mjs dev
> ```

---

## 公网暴露(FreeDomain + Cloudflare Named Tunnel)

AIRoute 内置的 Cloudflare Quick Tunnel 生成临时域名(`*.trycloudflare.com`),每次重启都会变。要获得稳定、免备案的公网固定入口,可用 [DigitalPlat FreeDomain](https://github.com/DigitalPlatDev/FreeDomain) 免费域名 + Cloudflare Named Tunnel 绑定。

> 详细操作步骤见 [`FreeDomain_Cloudflare_Tunnel_AIRoute_绑定指南.docx`](FreeDomain_Cloudflare_Tunnel_AIRoute_绑定指南.docx),Tunnel 通用文档见 [`docs/ops/TUNNELS_GUIDE.md`](docs/ops/TUNNELS_GUIDE.md)。

**5 步快速配置:**

```bash
# 1. 注册 FreeDomain 免费域名,将 NS 指向 Cloudflare
#    (在 FreeDomain 面板把 NS 改为 Cloudflare 给的两个 NS 地址)

# 2. 安装 cloudflared CLI 并登录
cloudflared tunnel login          # 浏览器授权,选你的域名

# 3. 创建 Named Tunnel 并配 DNS 路由
cloudflared tunnel create airoute-tunnel
cloudflared tunnel route dns airoute-tunnel airoute.你的域名.js.cool

# 4. 编写配置文件 ~/.cloudflared/config.yml
#    tunnel: <Tunnel-ID>
#    credentials-file: ~/.cloudflared/<Tunnel-ID>.json
#    ingress:
#      - hostname: airoute.你的域名.js.cool
#        service: http://127.0.0.1:20128
#      - service: http_status:404

# 5. 启动 Tunnel(AIRoute 须已在 127.0.0.1:20128 运行)
cloudflared tunnel run airoute-tunnel

# 可选:设为系统服务自启动
cloudflared service install       # Windows/Linux/macOS 均可
```

**如需 OAuth Provider(Claude/Cursor/Gemini 等),额外设置:**

```bash
# .env 中添加
NEXT_PUBLIC_BASE_URL=https://airoute.你的域名.js.cool
REQUIRE_API_KEY=true              # 公网暴露后必须开启认证
```

> **安全提醒**:公网暴露后必须启用 `REQUIRE_API_KEY`。Named Tunnel 不受 AIRoute 内置 Tunnel 安全门禁(`tunnelAuthGate.ts`)管控,需手动确保认证已开启。建议在 Cloudflare 侧启用 Access Policy 增加一层访问控制。**切勿用于政务或企业合规场景**,免费域名无 SLA 保证,也无法满足等保要求。

**三种公网暴露方案对比:**

| 方案 | 域名稳定性 | 适用场景 |
|------|-----------|---------|
| Cloudflare Quick Tunnel | 临时,重启变化 | 临时 Demo,不想配置 |
| Cloudflare Named Tunnel + FreeDomain | 稳定,自定义域名 | 长期使用,需固定 URL |
| ngrok Reserved Domain | 稳定(需付费) | 已有 ngrok 付费计划 |
| Tailscale Funnel | 稳定(每节点固定) | 团队内部,已有 Tailscale |

---

## 开发路线图

### 已完成 (v3.8.46-cn)

- [x] **P0-1** 华为云盘古 Provider(含中国区端点 `huawei-cn`)
- [x] **P0-2** 国产 PII 脱敏(身份证/手机号/银联卡)+ 区域默认值翻转
- [x] **P0-3** 凭证强制加密(所有区域未配置密钥拒绝启动,CN 区同理)
- [x] **P1-4** 百度搜索 / 必应中国搜索 Provider
- [x] **P1-5** 数据出境管控(域名白名单 + 出境日志)
- [x] **P1-6** 区域感知路由(评分权重自动调整)
- [x] **P1-7** Coze/Dify Agent 平台适配层
- [x] **P1-8** ACK/CCE K8s 部署模板
- [x] **P2-9** SQLCipher / PostgreSQL 企业级存储层
- [x] **P2-10** MITM 使用审计 + 作用域限制
- [x] **P2-11** 国产模型版本自动同步(6 Provider, 6h 间隔)
- [x] **SEC-1** 安全审计 — 三视角审计(安全/网络/AI安全)完成,28 项发现,19 项已修复
- [x] **SEC-2** Phase 1 紧急修复 — 15 项修复已落地(Guardrail fail-closed、加密强制、JWT 校验、OAuth state 验证、注入防护默认 block 等)
- [x] **SEC-3** Phase 2 加固修复 — 4 项修复已落地(CSP nonce、SSRF 逐跳校验、模板注入防护、Pipeline 超时)
- [x] **NODE-1** Node.js 升级至 v25.2.1 — 满足 `>=22.0.0` 要求,better-sqlite3 已重编译

### 进行中

- [ ] **PG 覆盖迁移补全** — 为 025/075/096/103 号迁移文件编写 PostgreSQL 手工覆盖(涉及 JSON1 函数重写)
- [ ] **SEC-4 Phase 3 持续验证** — 安全加固回归测试、定期重审、安全基线自动化扫描
- [ ] **GitHub 远程仓库** — 初始化远程仓库并推送

### 规划中 (v3.9.x-cn)

- [ ] **等保三级加固(续)** — 审计日志持久化(PG)、操作留存 90 天、管理员双因素认证(部分已在 SEC-1/2/3 完成:mandatory encryption、JWT 校验、Guardrail fail-closed)
- [ ] **国密算法支持** — SM2/SM3/SM4 替代 AES-256/RSA/HMAC-SHA256 用于加密签名
- [ ] **WAF 规则集** — 针对中国常见攻击模式的请求过滤规则
- [ ] **Prometheus + Grafana 监控** — 国产化监控栈集成(华为 AOM / 阿里云 ARMS)
- [ ] **国产向量数据库** — Milvus / TDengine 适配(替代 Qdrant/sqlite-vec)
- [ ] **政务云适配** — 公有云政务区 / 专属云部署模板
- [ ] **多租户隔离** — 企业级租户隔离(Schema级别 / 数据库级别)
- [ ] **API 网关前置** — Kong / APISIX 集成模板(限流、认证、流量镜像)
- [ ] **I18N 中文优化** — 仪表盘中文翻译完善、中文错误码提示
- [ ] **CI/CD 流水线** — GitHub Actions / 华为云 CodeArts 自动化构建与发布

---

## 快速开始

### 1. 安装与启动

```bash
npm install -g airoute
AIRROUTE_REGION=cn STORAGE_ENCRYPTION_KEY=$(openssl rand -hex 32) airoute
```

### 2. 连接 Provider

仪表盘 → **Providers** → 连接 **DeepSeek** / **阿里云百炼** / **Kiro AI**(免费)

### 3. 配置 IDE/CLI

```
Base URL: http://localhost:20128/v1
API Key:  [从仪表盘 Endpoints 页复制]
Model:    auto            # 零配置智能路由
```

### 4. 验证

```bash
curl http://localhost:20128/v1/models -H "Authorization: Bearer YOUR_KEY"
```

---

## 核心能力概览(继承自 OmniRoute)

| 能力 | 详情 |
|------|------|
| Provider | 237+ LLM Provider,90+ 免费额度,11 个永久免费 |
| 路由策略 | 17 种:priority / weighted / cost-optimized / context-relay / fusion 等 |
| 压缩 | 10 级管线:Session-Dedup → CCR → RTK → Headroom → Relevance → Caveman → LLMLingua-2 → Lite → Aggressive → Ultra |
| 压缩节省 | 最高 95%(RTK+Caveman 堆叠),平均 89%(工具密集会话) |
| MCP | 95 工具 / 3 传输 / 30 作用域 |
| A2A | JSON-RPC 2.0 + SSE,6 技能(含 Coze/Dify 委托) |
| 韧性 | 三层独立:Provider 熔断器 → Key 冷却 → Model 锁定 |
| 协议 | OpenAI / Claude / Gemini / Responses API 自动互译 |
| 安全 | PII 脱敏 / 注入防护(block 默认) / 视觉审查 / MITM 审计 / CSP nonce / SSRF 逐跳校验 / Guardrail fail-closed / OAuth state 验证 / Pipeline 超时 |
| 内存 | FTS5 全文搜索 + 向量检索(Qdrant/sqlite-vec) |

### 安全加固(v3.8.46 审计修复)

基于三视角(安全 / 网络 / AI 安全)审计,共发现 28 项安全问题,已修复 19 项:

**Phase 1 — 紧急修复(15 项,已落地)**

| 编号 | 修复内容 | 涉及文件 |
|------|----------|----------|
| S-01 | Guardrail 异常默认 fail-closed | `registry.ts` |
| S-02 | 移除客户端可控的 Guardrail 开关 | `registry.ts` |
| S-03 | 强制加密策略全局生效 | `encryption.ts` |
| S-05 | 拒绝 CHANGEME 作为初始密码 | `managementPassword.ts` |
| S-06 | JWT_SECRET 启动校验(长度 + 占位符) | `instrumentation-node.ts` |
| N-01 | 限流器 Redis 故障时 fail-closed | `rateLimiter.ts` |
| N-03 | 认证 Cookie 默认 Secure 标志 | `pipeline.ts`, `login/route.ts` |
| N-05 | OAuth 2.0 state 服务端校验(10 分钟 TTL) | `oauth/[provider]/[action]/route.ts` |
| N-07 | Docker Redis 加固(认证 + 禁用危险命令) | `docker-compose.yml` |
| N-08 | 启动时不安全配置检测(6 项环境变量) | `instrumentation-node.ts` |
| A-01 | 中文注入模式 + 扫描范围提升至 32KB | `inputSanitizer.ts` |
| A-02 | Memory 注入上下文检测 | `injection.ts` |
| A-03 | Copilot CLI 命令白名单 | `tools.ts` |
| A-04 | Memory 存储 PII 脱敏 | `store.ts` |
| A-05 | 注入防护默认策略从 `warn` 改为 `block` | `promptInjection.ts` |

**Phase 2 — 加固修复(4 项,已落地)**

| 编号 | 修复内容 | 涉及文件 |
|------|----------|----------|
| S-07 | CSP 按请求生成 nonce,移除 `unsafe-inline`(生产) | `next.config.mjs`, `layout.tsx`, `pipeline.ts` |
| N-04 | SSRF 出站请求逐跳 URL 校验 | `safeOutboundFetch.ts` |
| A-06 | 模板注入防护(转义 `{` `}`) | `prompts.ts`, `db/prompts.ts` |
| A-07 | Pipeline 超时 + 单阶段超时 + AbortSignal | `pipeline.ts` |

**Phase 3 — 持续验证(进行中)**

回归测试、定期重审与安全基线自动化扫描。

---

## 技术栈

| 层 | 技术 |
|----|------|
| 运行时 | Node.js 22.x / 24.x LTS(`>=22.0.0 <23 \|\| >=24.0.0 <27`) |
| 语言 | TypeScript 6.0,100% 类型覆盖(核心模块零 `any`) |
| 框架 | Next.js 16 + React 19 + Tailwind CSS 4 |
| 数据库 | SQLite (better-sqlite3) / SQLCipher / PostgreSQL |
| 校验 | Zod(MCP 工具 I/O、API 契约) |
| 协议 | MCP (stdio/HTTP/SSE) + A2A v0.3 (JSON-RPC 2.0) |
| 流式 | Server-Sent Events + WebSocket |
| 认证 | OAuth 2.0 PKCE + JWT + API Keys + MCP Scoped Auth |
| 测试 | Node.js test runner + Vitest(21,000+ 测试用例) |
| 平台 | Desktop(Electron) / Android(Termux) / PWA |
| 部署 | Docker / ACK / CCE / Fly.io / 本地 |

---

## 数据库模式选择

| 模式 | 适用场景 | 环境变量 | 说明 |
|------|----------|----------|------|
| SQLite | 个人/小团队 | `DB_TYPE=sqlite`(默认) | 零配置,单文件 |
| SQLCipher | 中国区合规/等保 | `DB_TYPE=sqlcipher` | 透明加密,CN区自动默认 |
| PostgreSQL | 大规模/企业级 | `DB_TYPE=postgresql` | 含自动SQL转译、PG覆盖迁移 |

---

## License

— 详见 [LICENSE](LICENSE)

---

<div align="center">

AIRoute v1.0 cn · Node >=22.0.0

基于 [OmniRoute](https://github.com/diegosouzapw/AIRoute) 开源项目

</div>