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, 大语言模型, 子域名突变, 数据脱敏, 自定义请求头, 请求拦截, 负载均衡, 逆向工具