docs/standalone/README.md
Rama master · réplica de lectura del repositorio original.
# Nyro Standalone 模式
Standalone 模式通过单个 YAML 文件驱动,无需数据库,仅运行代理服务。适用于:
- 容器化部署,配置通过 ConfigMap / Volume 挂载
- CI/CD 管道中的临时代理
- 嵌入式或边缘场景,资源受限
- Config-as-Code 工作流
```bash
nyro-server --config config.yaml
```
---
## 配置文件示例
```yaml
server:
proxy_host: "0.0.0.0"
proxy_port: 19530
providers:
- name: openai
default_protocol: openai
endpoints:
openai:
base_url: https://api.openai.com/v1
api_key: ${OPENAI_API_KEY}
models_source: https://api.openai.com/v1/models
- name: anthropic
default_protocol: anthropic
endpoints:
anthropic:
base_url: https://api.anthropic.com
api_key: ${ANTHROPIC_API_KEY}
- name: deepseek-openai
default_protocol: openai
endpoints:
openai:
base_url: https://api.deepseek.com/v1
api_key: ${DEEPSEEK_API_KEY}
- name: deepseek-anthropic
default_protocol: anthropic
endpoints:
anthropic:
base_url: https://api.deepseek.com/anthropic
api_key: ${DEEPSEEK_API_KEY}
routes:
- name: gpt-4o
vmodel: gpt-4o
targets:
- provider: openai
model: gpt-4o
- name: claude-sonnet
vmodel: claude-sonnet-4-20250514
targets:
- provider: anthropic
model: claude-sonnet-4-20250514
- name: deepseek-chat
vmodel: deepseek-chat
strategy: priority
targets:
- provider: deepseek-openai
model: deepseek-chat
priority: 1
- provider: openai
model: gpt-4o-mini
priority: 2
- name: text-embedding-3-small
vmodel: text-embedding-3-small
targets:
- provider: openai
model: text-embedding-3-small
```
### 最小配置
```yaml
providers:
- name: openai
default_protocol: openai
endpoints:
openai:
base_url: https://api.openai.com/v1
api_key: sk-xxx
routes:
- name: gpt-4o
vmodel: gpt-4o
targets:
- provider: openai
model: gpt-4o
```
### 简化写法(等价)
`default_protocol` / `api_key` 支持别名 `protocol` / `apikey`,单 endpoint 时 `protocol` 可省略(自动取 endpoints 的第一个协议):
```yaml
providers:
- name: openai
endpoints:
openai:
base_url: https://api.openai.com/v1
apikey: sk-xxx
routes:
- name: gpt-4o
vmodel: gpt-4o
targets:
- provider: openai
model: gpt-4o
```
> 规范名与别名**不能同时出现**(例如同时写 `default_protocol` 和 `protocol`),否则启动时报错。
---
## 配置字段说明
### server
| 字段 | 默认值 | 说明 |
|------|--------|------|
| `proxy_host` | `127.0.0.1` | 代理监听地址 |
| `proxy_port` | `19530` | 代理监听端口 |
> `--proxy-host` / `--proxy-port` CLI 参数不覆盖 YAML 值,Standalone 模式代理地址完全由 YAML 控制。
### providers[]
| 字段 | 别名 | 必填 | 说明 |
|------|------|------|------|
| `name` | — | 是 | Provider 名称,路由中通过此名称引用 |
| `default_protocol` | `protocol` | 否 | 默认出口协议,必须在 `endpoints` 中有对应条目;省略时自动取 `endpoints` 声明顺序的第一个协议(多 endpoint 时会打印 WARN 日志建议显式设置) |
| `endpoints` | — | 是 | 协议 → 端点映射,key 为协议名(`openai` / `anthropic` / `gemini`),保留 YAML 声明顺序 |
| `api_key` | `apikey` | 是 | API 密钥,支持 `${ENV_VAR}` 环境变量引用 |
| `use_proxy` | — | 否 | 是否使用系统 HTTP 代理(默认 `false`) |
| `models_source` | — | 否 | 模型发现 URL 或 `ai://models.dev/{vendor}` |
| `capabilities_source` | — | 否 | 模型能力发现 URL 或 `ai://models.dev/{vendor}` |
| `static_models` | — | 否 | 静态模型列表,无 API 时的硬编码兜底 |
> 规范名与别名互斥:同一 provider 下同时出现 `default_protocol` + `protocol`,或 `api_key` + `apikey`,启动时直接报错。
### routes[]
| 字段 | 别名 | 必填 | 说明 |
|------|------|------|------|
| `name` | — | 是 | 路由名称 |
| `virtual_model` | `vmodel` | 是 | 客户端请求的模型 ID(精确匹配) |
| `type` | — | 否 | 路由类型:`chat`(默认)/ `embedding` |
| `strategy` | — | 否 | 负载策略:`weighted`(默认)/ `priority` |
| `targets` | — | 是 | 目标列表(至少一个) |
| `access_control` | — | 否 | 是否启用访问控制(默认 `false`)。别名 `enable_auth` |
### routes[].targets[]
| 字段 | 必填 | 说明 |
|------|------|------|
| `provider` | 是 | Provider 名称(需与 `providers[].name` 匹配) |
| `model` | 是 | 实际模型 ID |
| `weight` | 否 | 权重,`weighted` 策略下使用(默认 `100`) |
| `priority` | 否 | 优先级,`priority` 策略下使用(默认 `1`,数字越小优先级越高) |
---
## 缓存配置
Standalone 模式支持请求缓存,在 `cache` 段配置:
```yaml
cache:
exact:
enabled: true
default_ttl: 3600 # 缓存有效期(秒),默认 3600
max_entries: 1000 # 最大缓存条数,默认 1000
semantic:
enabled: true
embedding_route: text-embedding-3-small # 用于语义向量化的路由名
similarity_threshold: 0.92 # 语义相似度阈值,默认 0.92
vector_dimensions: 1536 # 向量维度,需与 embedding 模型匹配
default_ttl: 600 # 缓存有效期(秒),默认 600
max_entries: 500 # 最大缓存条数,默认 500
```
两种缓存策略:
| 策略 | 说明 |
|------|------|
| `exact` | 完全匹配缓存,相同请求体直接返回缓存结果 |
| `semantic` | 语义相似缓存,通过 embedding 向量计算相似度,相似请求复用缓存 |
---
## 多协议转发
当 Provider 声明了多个协议端点时,Nyro 按请求协议自动选择对应端点:
```yaml
providers:
- name: deepseek
default_protocol: openai
endpoints:
openai:
base_url: https://api.deepseek.com/v1
anthropic:
base_url: https://api.deepseek.com/anthropic
```
- OpenAI 客户端请求 → 直接转发到 `openai` 端点
- Anthropic 客户端请求 → 直接转发到 `anthropic` 端点
- Gemini 客户端请求 → Provider 不支持,自动转换为 `default_protocol`(`openai`)后转发
---
## Docker 部署
```dockerfile
FROM rust:1.83 AS builder
WORKDIR /app
COPY . .
RUN cargo build --release -p nyro-server
FROM debian:bookworm-slim
COPY --from=builder /app/target/release/nyro-server /usr/local/bin/
COPY config.yaml /etc/nyro/config.yaml
EXPOSE 19530
CMD ["nyro-server", "--config", "/etc/nyro/config.yaml"]
```
`proxy_host` 在 YAML 中设置为 `0.0.0.0` 即可对容器外暴露。
---
## 与完整模式的差异
| 能力 | 完整模式 | Standalone |
|------|----------|------------|
| Provider / Route 管理 | Admin API 实时读写 | 编辑 YAML + 重启 |
| Admin API | 完整 | 不启动 |
| WebUI | 完整 | 不启动 |
| 请求日志 | DB 存储 + WebUI 查看 | 仅 stdout |
| 数据持久化 | SQLite / Postgres / MySQL | 无(进程重启从 YAML 恢复) |
| 缓存 | — | exact + semantic 缓存(内存) |
| 部署依赖 | 二进制 + 存储目录 | 二进制 + YAML 文件 |