本地api动态负载路由

机械师 2026-06-30 12:50 1

本地api动态负载路由


高性能的本地 API 路由网关,专为 AI 服务(OpenAI、Anthropic、Gemini 等)设计,支持多模型、多 Base URL、多 API Key 的动态管理和负载均衡。


应用效果






^-^ 核心功能




















































功能 说明
多模型路由 支持正则匹配、前缀匹配、精确匹配、通配符四种模式
多端点负载均衡 每个模型可配置多个 Base URL,支持加权轮询
多 Key 管理 每个端点可配置多个 API Key,自动轮询和故障切换
自动故障转移 Key 失败后自动切换到下一个可用 Key,请求不断
Key 冷却恢复 失败 Key 自动进入冷却期(可配置),到期自动恢复
模型重定向 支持将请求重定向到另一个模型配置(可链式)
配置文件热加载 修改 config.yaml 自动重新加载,无需重启
管理接口 /admin/status 查看状态,/admin/add-key 动态添加 Key
单二进制部署 使用 deno compile 编译为独立可执行文件
多服务认证 自动识别 OpenAI、Anthropic、Gemini 等认证方式

# 指定配置和端口
CONFIG_PATH=./config.yaml PORT=8081 ./api-router

配置示例


# ============================================================
# API Router 完整配置文件
# 支持:正则匹配 / 前缀匹配 / 精确匹配 / 通配符
# 多 Base URL / 多 Key / 加权负载均衡
# Key 冷却 / 重试 / 超时 / 模型重定向
# ============================================================

models:
# ==========================================================
# 1. 正则匹配示例:Mimo v2.5 系列
# 匹配:mimo-v2.5, mimo-v2.5-pro 等
# ==========================================================
- name: "^mimo-v2\\.5.*"
# 模型级全局配置
cooldown_ms: 60000 # Key 失败后冷却时间(毫秒)
default_timeout: 120 # 默认请求超时(秒)
default_max_retries: 3 # 默认最大重试次数

endpoints:
# 主服务端点(权重高)
- base_url: "https://api.mimo.com/v1"
keys:
- "mimo-master-key-1"
- "mimo-master-key-2"
- "mimo-master-key-3"
weight: 5 # 权重越高,被选中的概率越大
timeout: 180 # 覆盖全局超时(秒)
max_retries: 4 # 覆盖全局重试次数

# 备用代理端点(权重中)
- base_url: "https://api.mimo-proxy.com/v1"
keys:
- "mimo-proxy-key-1"
- "mimo-proxy-key-2"
weight: 2
# timeout 和 max_retries 使用全局默认值

# 紧急备用端点(权重低)
- base_url: "https://api.mimo-backup.com/v1"
keys:
- "mimo-backup-key-1"
weight: 1
timeout: 300 # 备用服务较慢,设置更长超时

# ==========================================================
# 2. 正则匹配示例:OpenAI GPT-4 全系列
# 匹配:gpt-4, gpt-4-turbo, gpt-4o, gpt-4o-mini, gpt-4-32k 等
# ==========================================================
- name: "^gpt-4.*"
cooldown_ms: 30000 # 30 秒冷却
default_timeout: 90
default_max_retries: 2

endpoints:
- base_url: "https://api.openai.com/v1"
keys:
- "sk-proj-gpt4-key1"
- "sk-proj-gpt4-key2"
- "sk-proj-gpt4-key3"
weight: 10 # 官方服务权重最高

- base_url: "https://api.openai-proxy1.com/v1"
keys:
- "sk-proxy1-key1"
- "sk-proxy1-key2"
- "sk-proxy1-key3"
weight: 3
timeout: 120 # 代理稍慢

- base_url: "https://api.openai-proxy2.com/v1"
keys:
- "sk-proxy2-key1"
weight: 1

# ==========================================================
# 3. 正则匹配示例:OpenAI GPT-3.5 系列
# 匹配:gpt-3.5-turbo, gpt-3.5-turbo-16k, gpt-3.5-turbo-instruct 等
# ==========================================================
- name: "^gpt-3\\.5.*"
cooldown_ms: 20000 # 20 秒冷却
default_timeout: 60
default_max_retries: 3

endpoints:
- base_url: "https://api.openai.com/v1"
keys:
- "sk-proj-gpt35-key1"
- "sk-proj-gpt35-key2"
- "sk-proj-gpt35-key3"
- "sk-proj-gpt35-key4" # 更多 Key 提高并发
weight: 8

- base_url: "https://api.openai-proxy1.com/v1"
keys:
- "sk-proxy35-key1"
weight: 2

# ==========================================================
# 4. 前缀匹配示例:Claude 模型家族
# 匹配:claude-3-opus, claude-3-sonnet, claude-3-haiku, claude-2 等
# ==========================================================
- name: "claude-*"
cooldown_ms: 120000 # 2 分钟冷却
default_timeout: 180 # Claude 推理较慢
default_max_retries: 2

endpoints:
- base_url: "https://api.anthropic.com/v1"
keys:
- "sk-ant-api-key-1"
- "sk-ant-api-key-2"
weight: 4

- base_url: "https://api.anthropic-proxy.com/v1"
keys:
- "sk-ant-proxy-key-1"
weight: 1
timeout: 240 # 代理更慢

# ==========================================================
# 5. 精确匹配示例:Gemini Pro
# 只匹配 "gemini-pro"(不匹配 gemini-pro-vision 等)
# ==========================================================
- name: "gemini-pro"
cooldown_ms: 45000
default_timeout: 120
default_max_retries: 3

endpoints:
- base_url: "https://generativelanguage.googleapis.com/v1beta"
keys:
- "AIzaSyGeminiKey1"
- "AIzaSyGeminiKey2"
weight: 3
# Gemini 认证方式特殊(API Key 放在 URL 参数),代码自动处理

- base_url: "https://generativelanguage-proxy.com/v1beta"
keys:
- "gemini-proxy-key"
weight: 1

# ==========================================================
# 6. 精确匹配示例:Azure OpenAI
# 只匹配 "azure-gpt-4"
# ==========================================================
- name: "azure-gpt-4"
cooldown_ms: 60000
default_timeout: 120
default_max_retries: 3

endpoints:
- base_url: "https://your-resource.openai.azure.com/openai/deployments/gpt-4"
keys:
- "azure-api-key-1"
- "azure-api-key-2"
weight: 5

# ==========================================================
# 7. 模型重定向示例:将 gpt-4 请求转发到 gpt-4-turbo 配置
# 注意:重定向的模型可以没有 endpoints
# ==========================================================
- name: "gpt-4"
redirect_to: "gpt-4-turbo" # 转发到 gpt-4-turbo 的配置

# 实际处理 gpt-4-turbo 的配置
- name: "gpt-4-turbo"
cooldown_ms: 30000
default_timeout: 90
default_max_retries: 2
endpoints:
- base_url: "https://api.openai.com/v1"
keys:
- "sk-gpt4-turbo-key1"
- "sk-gpt4-turbo-key2"
weight: 5

# ==========================================================
# 8. 链式重定向示例:gpt-4o -> gpt-4-turbo
# ==========================================================
- name: "gpt-4o"
redirect_to: "gpt-4-turbo" # 最终也落到 gpt-4-turbo

# ==========================================================
# 9. 通配符默认配置:匹配所有未明确配置的模型
# 必须放在最后,作为 fallback
# ==========================================================
- name: "*"
cooldown_ms: 60000
default_timeout: 120
default_max_retries: 3

endpoints:
- base_url: "https://api.openai.com/v1"
keys:
- "sk-default-key-1"
- "sk-default-key-2"
weight: 1
# 这个配置会捕获所有未匹配的模型,避免请求失败

程序地址 Deno打包体积太大了


api-router.7z - 蓝奏云

最新回复 (5)
  • 项学 06-30 12:54
    1

    已经收藏了,有个小问题,我把它部署到服务器上,是不是也能用 ^-^

  • 机械师 楼主 06-30 13:19
    4

    可以的内部有接口可以动态管理配置


    ^-^ 管理接口文档


    概述


    Deno API Router 提供了一套管理接口,用于查看服务状态、动态管理 API Key 以及手动触发配置重载。


    基础地址http://localhost:8080(端口可通过 PORT 环境变量修改)




    1. 获取服务状态


    GET /admin/status


    查看所有模型配置、端点、Key 的实时状态。


    请求示例


    bash


    curl http://localhost:8080/admin/status

    响应示例


    json


    {
    "[0] ^gpt-4.* (regex)": [
    {
    "base_url": "https://api.openai.com/v1",
    "weight": 10,
    "keys": {
    "total": 3,
    "active": 3,
    "cooldown": 0
    }
    },
    {
    "base_url": "https://api.openai-proxy1.com/v1",
    "weight": 3,
    "keys": {
    "total": 3,
    "active": 3,
    "cooldown": 0
    }
    }
    ],
    "[1] ^gpt-3\\.5.* (regex)": [
    {
    "base_url": "https://api.openai.com/v1",
    "weight": 8,
    "keys": {
    "total": 4,
    "active": 4,
    "cooldown": 0
    }
    }
    ],
    "[2] claude-* (prefix)": [
    {
    "base_url": "https://api.anthropic.com/v1",
    "weight": 4,
    "keys": {
    "total": 2,
    "active": 2,
    "cooldown": 0
    }
    }
    ],
    "* (default)": [
    {
    "base_url": "https://api.openai.com/v1",
    "weight": 1,
    "keys": {
    "total": 2,
    "active": 2,
    "cooldown": 0
    }
    }
    ]
    }

    字段说明
































    字段 说明
    base_url 上游服务地址
    weight 负载均衡权重
    keys.total 该端点配置的 Key 总数
    keys.active 当前活跃可用的 Key 数量
    keys.cooldown 处于冷却状态的 Key 数量



    2. 动态添加 API Key


    POST /admin/add-key


    运行时动态添加新的 API Key,无需重启服务。


    请求参数
































    参数 类型 必填 说明
    model_pattern string 模型匹配模式(与配置文件中的 name 一致)
    base_url string 端点 Base URL(必须与配置中完全匹配)
    key string 要添加的 API Key

    请求示例


    bash


    curl -X POST http://localhost:8080/admin/add-key \
    -H "Content-Type: application/json" \
    -d '{
    "model_pattern": "^gpt-4.*",
    "base_url": "https://api.openai.com/v1",
    "key": "sk-proj-new-key-xxxxx"
    }'

    响应示例


    text


    OK

    错误响应




















    状态码 说明
    400 缺少必填参数
    404 模型模式或 Base URL 不存在



    3. 动态移除 API Key


    POST /admin/remove-key


    运行时动态移除指定的 API Key。


    请求参数
































    参数 类型 必填 说明
    model_pattern string 模型匹配模式
    base_url string 端点 Base URL
    key string 要移除的 API Key

    请求示例


    bash


    curl -X POST http://localhost:8080/admin/remove-key \
    -H "Content-Type: application/json" \
    -d '{
    "model_pattern": "^gpt-4.*",
    "base_url": "https://api.openai.com/v1",
    "key": "sk-proj-old-key-xxxxx"
    }'

    响应示例


    text


    OK

    错误响应




















    状态码 说明
    400 缺少必填参数
    404 模型模式或 Base URL 不存在



    4. 手动触发配置重载


    POST /admin/reload


    手动触发配置文件重载(通常热加载已自动监听文件变化,此接口用于手动触发)。


    请求示例


    bash


    curl -X POST http://localhost:8080/admin/reload

    响应示例


    json


    {
    "message": "Reload endpoint is handled by file watcher"
    }



    5. 代理请求(主要功能)


    POST /v1/*


    转发请求到上游 AI 服务,自动路由到匹配的模型配置。


    请求示例


    bash


    curl http://localhost:8080/v1/chat/completions \
    -H "Content-Type: application/json" \
    -d '{
    "model": "gpt-4",
    "messages": [
    {"role": "user", "content": "Hello, world!"}
    ]
    }'

    支持的路径
































    路径 说明
    /v1/chat/completions 聊天补全(最常用)
    /v1/completions 文本补全
    /v1/embeddings 向量嵌入
    /v1/models 模型列表
    /v1/* 其他兼容 OpenAI API 的路径



    状态码说明




































    状态码 说明
    200 请求成功
    400 请求参数错误
    404 路径或模型配置不存在
    429 API Key 被限流,自动切换重试
    502 所有 API Key 均失败
    503 无可用端点或 Key



    使用场景示例


    场景一:查看当前服务健康状况


    bash


    # 查看所有 Key 状态
    curl http://localhost:8080/admin/status | jq .

    场景二:新增一个 API Key


    bash


    # 添加新的 OpenAI Key
    curl -X POST http://localhost:8080/admin/add-key \
    -H "Content-Type: application/json" \
    -d '{"model_pattern":"^gpt-4.*","base_url":"https://api.openai.com/v1","key":"sk-new-key"}'

    场景三:移除一个失效的 API Key


    bash


    # 移除失效 Key
    curl -X POST http://localhost:8080/admin/remove-key \
    -H "Content-Type: application/json" \
    -d '{"model_pattern":"^gpt-4.*","base_url":"https://api.openai.com/v1","key":"sk-invalid-key"}'
  • TomyGin 06-30 13:25
    5

    部署到 cloud flare 也是有可能的吧。还有 deno deploy

  • 无敌疯狂暴龙战神 06-30 13:29
    6

    和CPA有什么区别呀 一个是本地部署 一个是云端部署?

  • 机械师 楼主 06-30 19:34
    7

    更新管理页面

    完善api功能

    支持接口鉴权

* 帖子来源Linux.do
返回