当前位置: 首页 > news >正文

APISIX > ai-proxy 插件 - 指南

文章目录

  • APISIX ai-proxy 插件介绍
    • 核心功能
    • 架构组成
    • 支持的 AI Provider
    • 实现原理
      • 1. 驱动工厂模式
      • 2. 插件生命周期
      • 3. 请求处理流程
      • 4. 响应处理
    • 关键特性
      • 认证处理
      • 流式支持
      • 负载均衡 (ai-proxy-multi)
      • 健康检查
      • 日志与指标
    • 配置示例
      • 单 Provider (ai-proxy)
      • 多 Provider (ai-proxy-multi)
    • 错误处理

APISIX ai-proxy 插件介绍

核心功能

ai-proxy 是 APISIX 的 AI 代理插件,用于将请求转发到各种 AI 大模型服务(如 OpenAI、DeepSeek、Azure OpenAI 等)。

架构组成

apisix/plugins/
├── ai-proxy.lua              # 单 Provider 插件入口
├── ai-proxy-multi.lua        # 多 Provider (负载均衡)
├── ai-proxy/
│   ├── schema.lua            # 配置 Schema
│   └── base.lua              # 共享的请求处理逻辑
└── ai-drivers/├── openai-base.lua       # 基类,所有驱动继承它├── openai.lua            # OpenAI 驱动├── deepseek.lua          # DeepSeek 驱动├── azure-openai.lua      # Azure OpenAI 驱动└── sse.lua               # SSE 流式响应解析

支持的 AI Provider

Provider驱动文件默认 Endpoint
OpenAIopenai.luahttps://api.openai.com/v1/chat/completions
DeepSeekdeepseek.luahttps://api.deepseek.com/chat/completions
Azure OpenAIazure-openai.lua自定义 endpoint
AIMLAPIaimlapi.luahttps://api.aimlapi.com/chat/completions
OpenAI-Compatibleopenai-compatible.lua可配置

实现原理

1. 驱动工厂模式

所有 AI Provider 驱动都继承 openai-base.lua 基类:

-- deepseek.lua 示例
return require("apisix.plugins.ai-drivers.openai-base").new({
host = "api.deepseek.com",
path = "/chat/completions",
port = 443
})

2. 插件生命周期

local _M = {
version = 0.5,
priority = 1040,
name = "ai-proxy",
schema = schema.ai_proxy_schema,
}
function _M.check_schema(conf)   -- 校验配置
function _M.access(conf, ctx)    -- 设置上下文,选择 AI 实例
function _M.before_proxy(conf, ctx) -- 请求转换
function _M.log(conf, ctx)       -- 日志记录

3. 请求处理流程

User Request↓
access() → 设置 ctx.picked_ai_instance↓
before_proxy() → base.before_proxy()↓
校验请求 (JSON content-type, 解析 body)↓
构建带认证的请求头/参数↓
合并 model options 到请求体↓
POST 到 AI provider endpoint↓
读取响应 (SSE 流式 或 JSON)↓
提取 token usage 和响应内容↓
设置 context variables 用于日志↓
返回响应给客户端↓
log() → 记录 summary/payload

4. 响应处理

支持两种响应格式:

  • SSE 流式 (text/event-stream): 逐行解析 SSE 事件,提取 token usage
  • JSON: 标准非流式响应,直接解析
-- Token 统计
ctx.ai_token_usage = {
prompt_tokens = data.usage.prompt_tokens or 0,
completion_tokens = data.usage.completion_tokens or 0,
total_tokens = data.usage.total_tokens or 0,
}

关键特性

认证处理

流式支持

  • 检测请求中的 stream: true
  • 自动添加 stream_options: { include_usage: true } 用于 token 统计
  • 使用 sse.lua 解析 SSE 事件

负载均衡 (ai-proxy-multi)

健康检查

  • 集成 APISIX 健康检查机制
  • 支持主动健康检查配置
  • 自动 fallback 到健康实例

日志与指标

配置示例

单 Provider (ai-proxy)

{
"provider": "openai",
"auth": {
"header": {
"authorization": "Bearer sk-xxx"
}
},
"options": {
"model": "gpt-4",
"temperature": 0.7,
"stream": true
},
"timeout": 30000,
"ssl_verify": true,
"logging": {
"summaries": true,
"payloads": false
}
}

多 Provider (ai-proxy-multi)

{
"instances": [
{
"name": "openai-primary",
"provider": "openai",
"weight": 10,
"priority": 0,
"auth": { "header": { "authorization": "Bearer sk-xxx" } },
"options": { "model": "gpt-4" }
},
{
"name": "deepseek-backup",
"provider": "deepseek",
"weight": 5,
"priority": 1,
"auth": { "header": { "authorization": "Bearer ds-xxx" } },
"options": { "model": "deepseek-chat" }
}
],
"balancer": {
"algorithm": "roundrobin"
},
"fallback_strategy": "instance_health_and_rate_limiting"
}

错误处理

  • HTTP 429 (Rate Limited): 使用 fallback 实例重试
  • HTTP 5xx: 使用 fallback 实例重试
  • 连接超时: 返回 504 Gateway Timeout
  • 无效 Provider: schema 校验时返回 400
http://www.jsqmd.com/news/329545/

相关文章:

  • 亲测好用9个降AIGC平台 千笔·降AIGC助手帮你降AI率
  • 计算机毕设Java农村住宅房屋信息管理应用系统 基于Java的农村住宅信息管理系统设计与实现 Java技术驱动的农村房屋信息管理平台开发
  • 【小程序毕设源码分享】基于springboot+小程序的爱抚宠物小程序的设计与实现(程序+文档+代码讲解+一条龙定制)
  • 金融信创环境下,百度富文本编辑器支持哪些WORD图片粘贴的优化方案?
  • 2026最新!10个AI论文网站测评:专科生毕业论文+开题报告高效写作指南
  • 智能体的设计模式探讨
  • 【小程序毕设源码分享】基于springboot+Android家庭医务助手APP的设计与实现(程序+文档+代码讲解+一条龙定制)
  • SpringMVC中如何处理百M级别大附件的上传下载?
  • 打造国产化内网新基座:PageAdmin 助力构建新一代智慧警务网站集群
  • 农业信息化平台用百度UM编辑器导入WORD文档,如何解决图片粘贴后的排版问题?
  • 从模型到ECU:手搓BMS控制器的野路子
  • 310. Java Stream API -大小特性和子大小特性流
  • 【一句日历】2026年02月
  • 医疗系统用百度UMEDITOR导入WORD文档,如何处理粘贴的图片清晰度问题?
  • 教育网站如何通过百度UMEDITOR实现PPT课件中WORD图片的网页化展示?
  • 风、光、负荷出力各场景及概率、场景削减、负荷点的拉丁超立方抽样(Matlab代码实现)
  • 为什么有些人边框不用border属性
  • 计算机毕设Java快递仓库管理系统 基于Java的快递仓储信息化管理系统设计与实现 Java技术驱动的快递仓库智能管理平台开发
  • 苹果斥资20亿美元收购AI初创公司:准备把“耳语”变成换机杀手锏?
  • 深度测评10个降AI率工具 千笔·专业降AI率智能体高效降AIGC
  • 计算机毕设Java教研室管理系统设计与实现 基于Java技术的教研室信息管理系统开发与应用 Java环境下教研室综合管理平台的设计与实现
  • 基于peakcan/PCAN UDS上位机 (14229/15765) 可以开发UDS小工具
  • 开题卡住了?8个AI论文写作软件深度测评,本科生毕业论文必备工具推荐
  • 水库变形监测的单北斗GNSS系统应用解析
  • 亲测好用9个降AIGC网站推荐,千笔AI助你轻松降AI率
  • spaCy:Python与Cython中的高效文本处理库
  • 【小程序毕设全套源码+文档】php基于微信小程序的文山手工艺品展销平台设计与实现(丰富项目+远程调试+讲解+定制)
  • 【小程序毕设全套源码+文档】基于Android家庭医务助手APP的设计与实现(丰富项目+远程调试+讲解+定制)
  • 参考文献崩了?AI论文网站 千笔·专业学术智能体 VS 万方智搜AI,专科生写作新选择!
  • 【小程序毕设全套源码+文档】基于nodejs实验室教学日志系统小程序的设计与实现(丰富项目+远程调试+讲解+定制)