Ctrl K
ComunidadGuías…

docs/standalone/README.md

Rama master · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
# 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 文件 |