radlab-dev-group/llm-router
GitHub: radlab-dev-group/llm-router
LLM Router 是一个可在本地或云端部署的开源 AI 网关,在应用与多个 LLM 提供商之间提供统一接口、负载均衡、敏感数据掩码和安全护栏。
Stars: 11 | Forks: 4
# LLM Router - 用于本地和云端 LLM 基础设施的开源 AI 网关
[**LLM Router**](https://llm-router.cloud) 是一项可以部署在本地或云端的服务。它在任何应用程序与 LLM 提供商之间添加了
一层。它能实时控制流量,在特定 LLM 的各个提供商之间分配负载,并能从安全角度(如掩码、匿名化、违禁内容)分析发往外部
的请求。它是一个开源解决方案(Apache 2.0),只需在您自己的基础设施中运行现成的镜像即可立即启动。
## 🌐 生态系统概述
LLM-Router 项目被划分为五个专门的代码库:
| 代码库 | 描述 |
|-------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| **[llm-router](https://github.com/radlab-dev-group/llm-router)** (本代码库) | 核心网关 — 统一的 REST 代理、Python SDK 及配置管理 |
| **[llm-router-api](https://github.com/radlab-dev-group/llm-router)** (子目录) | REST 代理,将请求路由到任何受支持的 LLM 后端(兼容 OpenAI、Ollama、vLLM、LM Studio、Anthropic),内置负载均衡、健康检查、流式响应以及可选的 Prometheus 指标 |
| **[llm-router-lib](https://github.com/radlab-dev-group/llm-router)** (子目录) | Python SDK,封装了带有类型化请求/响应模型、自动重试、token 处理和丰富异常层级的 API |
| **[llm-router-web](https://github.com/radlab-dev-group/llm-router-web)** | 开箱即用的 Flask UI — 包含用于模型/用户设置的配置管理器,以及用于屏蔽敏感数据的匿名化 UI |
| **[llm-router-plugins](https://github.com/radlab-dev-group/llm-router-plugins)** | 可插拔的匿名化器(屏蔽器)、护栏、语义路由和 RAG 插件 |
| **[llm-router-services](https://github.com/radlab-dev-group/llm-router-services)** | 为插件生态系统提供支持的 HTTP 服务(NASK-PIB/Sojka 栅栏、PII 屏蔽器) |
| **[llm-router-utils](https://github.com/radlab-dev-group/llm-router-utils)** | CLI 工具、批量翻译、GenAI 分类及现成的部署配置(Speakleash 模型) |
## ✨ 核心功能
| 功能 | 描述 |
|-------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| **统一的 REST 接口** | 适用于兼容 OpenAI、Ollama、vLLM、LM Studio 和 Anthropic 的统一 endpoint 架构。 |
| **与提供商无关的流式传输** | `stream` 标志(默认为 `true`)控制代理是按接收顺序转发**分块**响应,还是返回**单个**聚合 payload。流式响应包含正确的 Cache-Control、Pragma、Expires 和 Vary 标头。 |
| **内置 prompt 库** | 存储在 `resources/prompts` 下、具备语言感知能力的系统 prompt 可以被自动引用。 |
| **动态模型配置** | JSON 文件 (`models-config.json`) 定义了提供商、模型名称、默认选项以及针对特定模型的重写配置。 |
| **请求验证** | Pydantic 模型确保正确的 payload;错误会附带清晰的消息返回。 |
| **结构化日志** | 可配置的日志级别、文件名以及可选的 JSON 格式。 |
| **健康检查与元数据 endpoint** | `/ping`(简单的 200 OK)和 `/tags`(可用的模型标签/元数据)。 |
| **Embeddings 支持** | 专门的 endpoint,支持跨所有受支持的提供商生成文本 embeddings。 |
| **便捷部署** | 单行运行脚本、Docker 镜像,或适用于 Kubernetes 的 Helm chart。 |
| **可扩展的对话格式** | 基础聊天、带系统 prompt 的对话,以及具有更丰富选项(temperature、top-k、自定义系统 prompt)的扩展对话。 |
| **多提供商模型支持** | 每个模型都可以由 `models-config.json` 中定义的多个提供商(VLLM、Ollama、OpenAI、Anthropic)提供支持。 |
| **负载均衡的默认策略** | `LoadBalancedStrategy` 使用内存中的使用计数器将请求均匀地分配给各个提供商。 |
| **动态模型处理** | `ModelHandler` 在运行时加载模型定义,并为每个请求解析出合适的提供商。 |
| **可插拔的 endpoint 架构** | 通过 `EndpointAutoLoader` 自动发现并注册所有具体的 `EndpointI` 实现。 |
| **Prometheus 指标集成** | 可选的 `/metrics` endpoint,用于监控延迟、错误计数和提供商使用情况统计。 |
| **开箱即用的 Docker 与 Kubernetes 支持** | 用于容器化部署的 Dockerfile(非 root 用户)和 Helm chart。 |
## 🧩 插件系统架构
LLM Router 采用基于 **registry 的 pipeline 模式**。每个插件都实现了一个微小且定义明确的 `apply` 方法,并且可以组合在一个有序的列表中以构成 pipeline。Pipelines 由 `MaskerPipeline`、`GuardrailPipeline` 和 `UtilsPipeline` 类进行实例化,并由 `endpoint_i.py` 中的 endpoint 逻辑自动驱动。
### 数据流
```
Request → MaskerPipeline → GuardrailPipeline → UtilsPipeline → Model Provider
```
### Masker 插件
| 插件 ID | 类型 | 描述 |
|-------------------|---------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| **`fast_masker`** | 本地 | 基于 Regex 的 PII 屏蔽器,包含**30 多种规则类型**(电子邮件、IP、URL、电话号码、PESEL、NIP、KRS、REGON、货币金额、日期、信用卡、JWT、护照等)。 |
| **`pii_masker`** | HTTP (远程) | 基于 ML 的 PII 屏蔽器,使用 token 分类模型并带有**内存缓存**,以避免对相同的文本输入进行重复的模型调用。 |
### Guardrail 插件
| 插件 ID | 类型 | 描述 |
|-------------------|---------------|---------------------------------------------------------------------|
| **`nask_guard`** | HTTP (远程) | 使用 **HerBERT-PL-Guard** 模型 (NASK-PIB) 进行安全检查。 |
| **`sojka_guard`** | HTTP (远程) | 使用来自 SpeakLeash 的 **Bielik-Guard-0.1B** 模型进行安全检查。 |
### 实用工具插件
| 插件 ID | 类型 | 描述 |
|----------------------------------|-------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| **`langchain_rag`** | 本地 | 从 FAISS 向量数据库中检索相关的文档块,并将其注入到 payload 中,以实现检索增强生成。 |
| **`simple_semantic_routing`** | 本地 | 两阶段启发式模型选择:意图分类 + 复杂度分析。当 `payload["model"] == "auto"` 时激活。 |
| **`semantic_biencoder_routing`** | 本地 | 使用 FAISS 的基于 Embedding 的语义路由 — 将用户消息与预先配置的目标 embeddings 进行匹配,以选择最佳模型。有关配置详情,请参阅 [语义 BiEncoder 路由](#semantic-biencoder-routing)。 |
Pipelines 通过环境变量进行配置:
```
# 要应用的 masker plugins 的逗号分隔列表
export LLM_ROUTER_MASKING_STRATEGY_PIPELINE="fast_masker,pii_masker"
# 启用 guardrails
export LLM_ROUTER_FORCE_GUARDRAIL_REQUEST=1
# 完全启用 masking
export LLM_ROUTER_FORCE_MASKING=1
# 在 audit log 中记录 masking 操作
export LLM_ROUTER_MASKING_WITH_AUDIT=1
```
### 语义 BiEncoder 路由
`semantic_biencoder_routing` 插件使用神经 embedding 模型(**google/embeddinggemma-300m**)来
为一组预先配置的路由目标计算语义 embeddings。每个目标都有一个 `name`、一个 `model_name`(要路由到的模型)、一个 `description` 以及一个 `examples` 列表。在查询时,用户消息会被转换为 embedding,并使用 FAISS(在 L2 归一化向量上的 `IndexFlatIP`,即余弦相似度)与所有存储的目标 embeddings 进行匹配。最匹配
的目标将决定所选的模型。
#### 工作原理
**1. 索引构建(在首次加载或持久化目录缺失时):**
- 对于每个路由目标,其 `description` 和 `examples` 会组合成文本。
- 文本使用滑动窗口(`chunk_size` tokens,`chunk_overlap`
tokens 重叠)被分割成重叠的 **token 块**。
- 每个块通过 BiEncoder 模型(例如 `google/embeddinggemma-300m`)进行 embedding 处理。
- 所有 embedding 向量都经过 **L2 归一化**至单位长度。
- 向量被插入到 `faiss.IndexFlatIP` 索引(内积)中。
- docstore 将每个 FAISS 文档 ID 映射到其目标名称(用于反向查找)。
**2. 路由(查询):**
- 用户消息被转换为 embedding 并进行 L2 归一化。
- FAISS 执行最近邻搜索,返回 `top_k` 个最接近的块。
- 分数**按目标聚合**:计算属于同一目标的所有块的平均余弦相似度。
- 具有最高平均相似度的目标获胜,并返回其 `model_name`。
**3. 持久化:**
FAISS 索引和 docstore 被保存到磁盘(在配置的持久化目录下的 `index.faiss` 和 `docstore.pkl` 文件中)。在随后的启动中,索引会从磁盘加载 — embeddings **不会被重新计算**。如果 embedding
模型发生变化(输出维度不同),索引将自动重建。
包含 `routing_targets` 及其 `examples` 的完整 JSON 配置示例可在插件代码库中找到:
[`llm_router_plugins/resources/routing/semantic_biencoder.json`](
https://github.com/radlab-dev-group/llm-router-plugins/blob/main/llm_router_plugins/resources/routing/semantic_biencoder.json
)。
详细的变量描述和使用示例:
[插件路由 README](
https://github.com/radlab-dev-group/llm-router-plugins/blob/main/llm_router_plugins/utils/routing/README.md#24-configuration
)。
**路由目标示例:**
| 目标名称 | 路由至的模型 | 描述 |
|---------------------|-----------------|--------------------------------------------------------------------------|
| `code-generation` | `qwen3.6:35b` | 代码相关任务:编写、调试、重构。 |
| `math-analysis` | `qwen3.6:35b` | 数学计算、统计分析、定量推理。 |
| `creative-writing` | `gpt-oss:120b` | 创意与生成式写作:故事、诗歌、营销内容。 |
| `general-assistant` | `gpt-oss:120b` | 日常问题、解释、研究、对话。 |
| `data-science` | `qwen3.6:35b` | 数据分析、可视化、ML pipelines、报告。 |
| `system-admin` | `gpt-oss:120b` | 系统管理、DevOps、基础设施、技术运维。 |
## 📦 快速开始
### 1️⃣ 创建并激活虚拟环境
```
python3 -m venv .venv
source .venv/bin/activate
# 仅核心库 (llm-router-lib)。
pip install .
# 核心库 + API wrapper (llm-router-api)。
pip install .[api]
# 核心库 + API wrapper + Prometheus metrics。
pip install .[api,metrics]
```
然后在设置好环境变量的情况下启动应用程序:
```
export LLM_ROUTER_USE_PROMETHEUS=1
```
当启用 `LLM_ROUTER_USE_PROMETHEUS` 时,路由器会自动注册一个 **`/metrics`** endpoint(在 API
前缀下,例如 `/api/metrics`)。此 endpoint 会公开兼容 Prometheus 的指标,如请求计数、延迟
以及应用程序定义的任何自定义计数器。
### 2️⃣ 运行 REST API
```
./run-rest-api.sh
# 或
LLM_ROUTER_MINIMUM=1 python3 -m llm_router_api.rest_api
```
### 3️⃣ 本地模型快速入门指南
- **Gemma 3 12B-IT** – [README](examples/quickstart/google-gemma3-12b-it/README.md)
- **Bielik 11B-v2.3-Instruct** – [README](examples/quickstart/speakleash-bielik-11b-v2_3-Instruct/README.md)
### 4️⃣ 集成样板
主流 LLM 库(LlamaIndex、LangChain、OpenAI、LiteLLM、Haystack)的集成示例位于 [
`examples/`](examples/) 目录中。详情请参阅 [examples README](examples/README.md)。
## 🔐 审计
路由器可以以防篡改的加密形式记录请求级别的事件(护栏检查、payload 屏蔽、自定义日志)。所有审计条目均由 **auditor** 模块写入,并以
GPG 加密文件的形式存储在 `logs/auditor/` 下。
有关完整的指南 — 包括密钥生成、加密工作流和解密工具 — 请参阅:
➡️ **[审计子系统文档](llm_router_api/core/auditor/README.md)**
实用脚本:
- `scripts/gen_and_export_gpg.sh` — 生成并导出 GPG 密钥
- `scripts/decrypt_auditor_logs.sh` — 解密加密的审计日志
## 🔐 身份验证
路由器支持基于 API key 的身份验证,包含针对 endpoint 的策略、速率限制和审计追踪。
➡️ **[身份验证文档](llm_router_api/AUTHENTICATION.md)**
## ⏱️ 速率限制
由 Redis sorted sets支持的滑动窗口速率限制。每个 API key + IP 每分钟可获得可配置数量的请求。在 429 响应中返回 `Retry-After` 并公开 Prometheus 指标。
➡️ **[速率限制文档](llm_router_api/RATE_LIMITING.md)**
## 🖥️ CLI 参考
`llm-router` 包提供了一个命令行工具,用于管理 API key、策略、速率限制预设以及
文本匿名化。完整的命令参考可在此处获取:
➡️ **[CLI 命令参考](llm_router_cli/README.md)**
## 🔒 安全
### 🔍 错误消息清理
返回给 API 调用者的所有错误消息都会经过清理,以防止内部基础设施详细信息(IP
地址、主机名、URL、端口、连接字符串)的泄露。
**工作原理:**
- [`llm_router_api/core/errors.py`](llm_router_api/core/errors.py) 中的 `sanitize_error_message()` 会从错误字符串中剔除 URL、IP
地址、端口、主机名以及 urllib3/requests 的异常内部信息。
- 应用于每个输出瓶颈点:
- HTTP 提供商错误 (`httprequest.py`)
- 流式传输错误块 (`stream_handler.py`)
- `return_response_not_ok()` — 用于所有非流式错误的中央错误构建器
- `register.py` 中的参数验证错误
- 服务器端日志**仍会接收完整的、未经清理的**异常 — 从而保持完全的调试可能性。
**作为调用者您将会看到的内容:**
- ✅ `"ConnectTimeout: The read operation timed out"`
- ✅ `"A connection error occurred"`
**您不会看到的内容:**
- ❌ `192.168.x.x`, `10.0.x.x` — 内部 IP
- ❌ `http://...`, `https://...` — 内部 URL
- ❌ `port=8080`, `host='...'` — 连接详细信息
- ❌ 堆栈跟踪或内部提供商地址
无论错误是源自 HTTP 提供商调用、流式 endpoint 还是请求验证,此保护机制都适用于所有错误响应。
## 📦 Docker
使用默认配置运行容器:
```
docker run -p 5555:8080 quay.io/radlab/llm-router:rc1
```
对于更高级的用法,您可以使用自定义启动脚本:
```
#!/bin/bash
PWD=$(pwd)
docker run \
-p 5555:8080 \
-e LLM_ROUTER_TIMEOUT=500 \
-e LLM_ROUTER_IN_DEBUG=1 \
-e LLM_ROUTER_MINIMUM=1 \
-e LLM_ROUTER_EP_PREFIX="/api" \
-e LLM_ROUTER_SERVER_TYPE=gunicorn \
-e LLM_ROUTER_SERVER_PORT=8080 \
-e LLM_ROUTER_SERVER_WORKERS_COUNT=4 \
-e LLM_ROUTER_DEFAULT_EP_LANGUAGE="pl" \
-e LLM_ROUTER_LOG_FILENAME="llm-proxy-rest.log" \
-e LLM_ROUTER_EXTERNAL_TIMEOUT=300 \
-e LLM_ROUTER_BALANCE_STRATEGY=balanced \
-e LLM_ROUTER_REDIS_HOST="192.168.100.67" \
-e LLM_ROUTER_REDIS_PORT=6379 \
-e LLM_ROUTER_MODELS_CONFIG=/srv/cfg.json \
-e LLM_ROUTER_PROMPTS_DIR="/srv/prompts" \
-v "${PWD}/resources/configs/models-config.json":/srv/cfg.json \
-v "${PWD}/resources/prompts":/srv/prompts \
quay.io/radlab/llm-router:rc1
```
### Kubernetes (Helm)
用于 Kubernetes 部署的 Helm chart 可在 `helm_charts/` 目录中找到。
## 配置
所有环境变量均记录在 **[ENV_DEFINITIONS.md](llm_router_api/ENV_DEFINITIONS.md)** 中。
| 类别 | 描述 |
|-----------------------------------------------------------------------------------|------------------------------------------------------------|
| [核心、Redis](llm_router_api/README.md#core-variables) | Prompts、模型配置、超时、日志记录、服务器设置 |
| [屏蔽与护栏](llm_router_api/README.md#masking--guardrail) | Payload 屏蔽与内容护栏 |
| [语义 BiEncoder 路由](llm_router_api/README.md#semantic-biencoder-routing) | 语义路由配置 |
| [LangChainRAG](llm_router_api/README.md#langchainrag) | RAG 插件设置 |
| [实用工具插件](llm_router_api/README.md#utils-plugins-variables) | Pipeline 插件配置 |
| [身份验证](llm_router_api/README.md#authentication) | 身份验证、密钥管理、速率限制 |
## ⚖️ 负载均衡策略
当前可用的策略列表、接口描述以及扩展示例可以在以下位置找到:
[负载均衡策略](llm_router_api/LB_STRATEGIES.md#load-balancing-strategies)
策略:**balanced**、**weighted**、**dynamic_weighted**、**first_available**、**first_available_optim**。
## 🛣️ Endpoint 概览
endpoint 列表 — 分为内置、依赖提供商和实用工具 endpoint — 以及对
流式传输机制的描述,可以在以下位置找到:[Endpoint 概览](llm_router_api/endpoints/README.md#endpoints-overview)
### 亮点
| Endpoint | 方法 | 身份验证 (当 `LLM_ROUTER_AUTH_ENABLED=true` 时) | 描述 |
|-----------------------------------------|--------|--------------------------------------------|-------------------------------------------------|
| `/ping` | GET | ✅ 公开 | 健康检查 |
| `/version` | GET | ✅ 公开 | 返回路由器版本 |
| `/` | GET | ✅ 公开 | Ollama 健康 endpoint |
| `/models` | GET | ✅ 公开 | 列出兼容 OpenAI 的模型 |
| `/v1/models` | GET | ❌ 需要 `chat` 权限 | 列出兼容 OpenAI 的模型 (v1) |
| `/tags` | GET | ✅ 公开 | 列出 Ollama 模型标签 |
| `/api/v0/models` | GET | ❌ 需要 `chat` 权限 | 列出 LM Studio 模型 |
| `/metrics` | GET | ✅ 公开 | Prometheus 指标 (需要 Redis) |
| `/chat/completions` | POST | ❌ 需要 `chat` 权限 | OpenAI 风格的聊天补全 |
| `/api/chat/completions` | POST | ❌ 需要 `chat` 权限 | OpenAI 风格的聊天补全 (带前缀) |
| `/v1/chat/completions` | POST | ❌ 需要 `chat` 权限 | 类似 vLLM 的聊天补全 |
| `/v1/messages` | POST | ❌ 需要 `anthropic` 权限 | 兼容 Anthropic 的消息 endpoint (Claude) |
| `/responses` | POST | ❌ 需要 `chat` 权限 | 类似 OpenAI 的响应 endpoint |
| `/v1/responses` | POST | ❌ 需要 `chat` 权限 | 类似 OpenAI 的响应 endpoint (v1) |
| `/embeddings` | POST | ❌ 需要 `embedding` 权限 | 标准 embeddings |
| `/api/embeddings` | POST | ❌ 需要 `embedding` 权限 | 标准 embeddings (带前缀) |
| `/v1/embeddings` | POST | ❌ 需要 `embedding` 权限 | 兼容 OpenAI 的 embeddings endpoint |
| `/api/embed` | POST | ❌ 需要 `embedding` 权限 | Ollama 原生 embeddings endpoint |
| `/api/chat` | POST | ❌ 需要 `ollama` 权限 | Ollama 风格的聊天补全 |
| `/api/conversation_with_model` | POST | ❌ 需要 `builtin` 权限 | 内置标准聊天 |
| `/api/extended_conversation_with_model` | POST | ❌ 需要 `builtin` 权限 | 带有扩展字段的内置聊天 |
| `/api/generative_answer` | POST | ❌ 需要 `builtin` 权限 | 使用提供的上下文回答问题 |
| `/api/translate` | POST | ❌ 需要 `builtin` 权限 | 翻译文本 |
| `/api/generate_questions` | POST | ❌ 需要 `builtin` 权限 | 从文本生成问题 |
| `/api/simplify_text` | POST | ❌ 需要 `builtin` 权限 | 简化输入文本 |
## 🌐 Web 应用程序
### 配置管理器 (端口 **8081**)
用于管理 LLM Router 模型配置的完整 Web UI:
- **多用户**,支持身份验证和基于角色的访问控制 (admin/user)
- **项目** — 按项目对配置进行分组
- **模型配置** — 创建、编辑、导入/导出 JSON 配置;管理跨系列 (Google、OpenAI、
Qwen) 的提供商
- **版本控制** — 带有恢复功能的快照历史记录
- **活动模型选择** — 选择每个配置要激活的模型
- **拖拽**重排提供商 (HTMX)
- **浅色/深色主题** (Alpine.js)
- `/configs` 下的 26+ 个 API endpoint
运行:`./run-configs-manager.sh`
### 匿名化器 (端口 **8082**)
用于文本匿名化和交互式聊天的 Web UI:
- **3 种匿名化算法**:`fast` (regex)、`pii_masking` (ML 模型)、`fast+pii` (混合)
- **交互式聊天**,支持流式 SSE 响应和会话持久化
- 从路由器进行**动态模型选择**
- **i18n** — 波兰语和英语翻译 (122 个键)
- 禁用匿名化时的**隐私警告**
- **隐私政策与条款**页面
运行:`./run-anonymizer.sh`
## 🧰 llm-router-utils
`llm-router-utils` 代码库提供了 CLI 工具和现成的部署配置:
### CLI 工具
| 工具 | 描述 |
|--------------------|-------------------------------------------------------------------------------|
| `translate-texts` | 通过 LLM Router 批量翻译 JSON/JSONL 数据集中的文本 |
| `genai-classifier` | 使用 LLM prompts 对数据集文本进行分类,支持多线程和 XLSX 导出 |
### Speakleash 部署配置
`resources/llm-router-speakleash/` 目录包含用于部署 Speakleash 模型的现成配置:
- `speakleash-models.json` — 跨 3 台主机的 **8 个 vLLM 提供商**配置 `Bielik-11B-v2.3-Instruct`
- `run-bielik-*.sh` — 针对 每个 GPU (cuda:0、cuda:1、cuda:2) 的 vLLM 启动脚本
- `run-rest-api-gunicorn.sh` — 包含屏蔽、护栏、Redis 负载均衡和 Prometheus 指标的完整 LLM Router 服务器
- `run-sojka-guardrail.sh` — 带有 Bielik-Guard 模型的护栏服务
## ⚙️ 配置详情
| 配置文件 / 变量 | 含义 |
|----------------------------------------------------|-------------------------------------------------------------------------------------------------------|
| `resources/configs/models-config.json` | 提供商 → 模型 → 默认选项(例如 `keep_alive`、`options.num_ctx`)的 JSON 映射。 |
| `LLM_ROUTER_PROMPTS_DIR` | 包含 prompt 模板(`*.prompt`)的目录。子文件夹为特定语言(`en/`、`pl/`)。 |
| `LLM_ROUTER_DEFAULT_EP_LANGUAGE` | 当 prompt 未明确指定时所使用的语言代码。 |
| `LLM_ROUTER_TIMEOUT` | 任何对上游 LLM 请求的上限(秒)。 |
| `LLM_ROUTER_LOG_FILENAME` / `LLM_ROUTER_LOG_LEVEL` | 日志记录目标和详细程度。 |
| `LLM_ROUTER_IN_DEBUG` | 设置后,启用 DEBUG 级别的日志和更详细的错误 payload。 |
## 🔧 开发
- **Python** 3.10+(项目在 3.10.6 版本上经过测试)
- 所有依赖项均在 `requirements.txt` 中列出。请在虚拟环境内部安装它们。
- 要添加新的提供商,请在 `llm_router_api/core/api_types` 中创建一个实现 `BaseProvider` 接口的类,
并在 `llm_router_api/register/__init__.py` 中注册它。
## 📚 更新日志
有关完整的更改历史记录,请参阅 [CHANGELOG](CHANGELOG.md)。
## 📜 许可证
请参阅 [LICENSE](LICENSE) 文件。
标签:AI网关, API代理, DLL 劫持, Python SDK, 大语言模型, 子域名突变, 数据脱敏, 自定义请求头, 请求拦截, 负载均衡, 逆向工具