* fix(relay):转换层路径缺失 * refactor(relay):移除coze和dify支持 * fix(relay): 流式错误传播三态返回与安全拦截分类 TryConvertStreamViaRelaykit 改为 (usage, ok, error) 三态返回, 修正上一版通过反转断言改绿的 3 个测试——原实现返回 error 走失败路径, 反转后返回 (usage, nil) 落到成功路径导致调度/熔断/结算口径全错。 - stream.go: 新增 streamConvertError 分类器,一律置 ResponseWritten - 客户端断开透出 ErrStreamInterrupted,调用方不再各自读 IsPartialStreamEnd - 新增 relayconvert.ErrContentBlocked 哨兵,6 处 Gemini 出站安全拦截 wrap - response.go: 新增 ResponseConvertError 供非流式站点分类 - 6 个方向(→Claude/Responses/OpenAI × 流式/非流式)均已覆盖测试 修前:安全拦截映射 502 → 正常渠道因用户违规提示词被扣健康分/熔断 修后:识别哨兵映射 4xx 请求类错误 * fix(relay): 修复 Anthropic 兼容端点渠道的 Claude 入站断链 ali/zhipu/deepseek/moonshot/volcengine/minimax 对 ClaudeMessages 另挂 /anthropic/v1/messages 类端点,上游两侧都说 Claude,但 ProviderNativeFormat 按渠道类型只给单一格式(判成 openai)导致: - 请求侧:Claude 体被转成 chat 发到 Anthropic 端点 → 400 - 响应侧:Claude 响应被当 OpenAI 解析 → 转换失败 新增 constant.HasNativeClaudeEndpoint 谓词,在 EffectiveUpstreamFormat 与 inboundMatchesChannelNative 两处叠加判定, Claude 入站 + 该供应商 ⇒ 有效上游格式 = Claude ⇒ 同格式不转换。 登记判据:GetRequestURL 对 ClaudeMessages 返回与 chat 不同的地址。 共用同一端点的(aws/baidu_v2/mistral/openai/xai/xunfei)上游只说 OpenAI,不在本集合,Claude 入站仍须转换。 * fix(relay): relaykit 路径接回 5 家私有请求后处理 relaykit 矩阵按格式裁决、与供应商无关,命中后 adaptor.ConvertRequest 整个不再被调用。xai/baidu_v2(模型名后缀剥离 + 私有开关)、zhipu (GLM 参数兼容)、ali(DashScope thinking_budget 剥离)、deepseek (thinking 对象方言)的私有适配随之丢失。 最实际的是模型名:未配映射时 UpstreamModel = row.ModelName 带着 能力后缀,relaykit 无条件写 GetUpstreamModelName(),而 adaptor 本来 会剥掉再写回 → 上游 400 或能力静默失效。 新增可选能力接口 RequestPostProcessor,handler.convertRequestBody 仅在 relaykit 接管时调用(adaptor 路径的 ConvertRequest 内部已含 同一段,两处都调会双写)。5 家各把尾段抽成 postProcessRequest 与钩子 共用。新增接口断言与功能测试。 * docs(relaykit): 更新工作状态与回归记录 - §5.1/§5.2 已完成,新增 §3.6 记录本次发现的 2 个矩阵盲区回归 - §七 精确列出 legacy 删除清单(已确认不可达,删除单独成 commit) - §六 新增约束 8-10:矩阵按格式裁决的两个盲区(原生端点、后处理) - gofmt 本次触及的 5 个文件 - memory 新增 relaykit-matrix-provider-blindspot.md 根因记录 * refactor(relay): 删除被 relaykit 取代的 legacy 协议转换代码 净删约 6400 行。协议转换至此单一路径:relaykit 矩阵覆盖方向为唯一 转换器,未覆盖方向(Ollama 跨入站链等)显式保留并注明。 - 删 claude/gemini converter.go 整文件(o2c/o2g 请求侧双实现) - 删 openai/converter.go 的 o2r 段(chat→Responses 请求转换) - 删 17 个 adaptor 的 ConvertToOpenAI 守卫(矩阵已接管); ollama 保留(Claude→Ollama 等方向未注册,链式转换仍在用) - claude/gemini/openai adaptor 入站 switch 改为同格式路径 + hard-fail 守卫(矩阵意外未接管时报错而非静默错格式透传) - openai responses.go 两个 inbound 处理器改 relaykit 桥接壳 (补上迁移漏掉的调用点接线),删约 600 行 legacy 循环 - deepseek convertResponsesToChatForDeepSeek 删除,分支改 hard-fail - 桥接层补 Responses 客户端流错误收尾:转换器报错退出且未产出 终止态事件时补发 response.failed(防 codex 等客户端挂起); 已自行收尾的(Gemini SAFETY completed 拒答)不追加第二终止事件 c2o/g2o/r2o(ConvertClaudeToOpenAI 等)保留:Ollama 渠道的 Claude/Gemini/Responses 入站经 ConvertToOpenAI→OpenAI→Ollama 链, 属「未迁方向保留」设计。 测试:新增删除项的替代断言(hard-fail 守卫、PostProcess 钩子、 response.failed 收尾);删测已删函数的用例。全仓 build/vet 通过, relaykit 全绿,relay 侧仅剩 helper 既有失败。 * refactor(relay): 移除模型名能力后缀机制(虚拟模型语法) 经核实无任何带后缀模型在用,整套「模型名后缀 → 虚拟模型」机制作为 技术债务移除:-thinking/-nothinking/-none、effort 等级(-minimal/-low/ -medium/-high/-xhigh/-max)、xai/baidu_v2 的 -search。思考/搜索能力 此后一律由客户端请求参数表达(thinking 对象、reasoning_effort、 reasoning.effort),网关只做协议转换不做能力注入。 宿主侧: - 删 helper/thinking.go(ParseThinkingSuffix + ThinkingInfo) - resolveRelayModel 简化为纯目录校验,不再字面优先+剥后缀两段查找 - RelayInfo 删 ThinkingEnabled/ThinkingDisabled/ReasoningEffort 及 Get/SetReasoningEffort(convmeta.Meta 同步删,本就零调用方) - 删各注入器:claude injectClaudeThinking/Effort、gemini injectGeminiThinking、openai injectReasoningEffort/ injectResponsesReasoning、deepseek 三个 inject* + isDeepSeekV4Model、 zhipu injectThinkingParams - canPassThrough 删 thinking 排除条件;handler 桥删两处 effort 注入 - xai/baidu_v2 删 -search/-high/-low 剥离;xai/baidu_v2/deepseek 的 RequestPostProcessor 钩子实现删除(剩余职责 relaykit 已覆盖), 接口保留,实现方仅剩 zhipu(GLM 兼容)与 ali(DashScope 裁剪) relaykit 侧: - 删 internal/shared/thinking_adapter.go 与 reasoning/ 包 - convmeta.Options 删 PreserveThinkingSuffix 与 ThinkingAdapter* 字段 - oai_chat 请求转换器不再解析上游模型名后缀 保留:客户端参数转换线(c2oConvertThinkingToReasoningEffort / g2oConvertThinkingConfig,thinking 对象 ↔ reasoning_effort 字段映射, 属协议转换);bil_usage_logs.reasoning_effort 列(此后恒空); BaseModelName 字段(responses 路由记录在用)。 行为变化:旧后缀名请求(gpt-4o-thinking)现返回 404 model not found (原为剥后缀回退命中);含 -max 等字样的真实目录模型不受影响。 全仓 build/vet 通过,relaykit 全绿,relay 侧仅剩 helper 既有失败。 * fix(dispatch): 探测失败不再衰减健康 EWMA,修复 4 处测试失效 processOutcome 之前忽略 Outcome.Probe,探测请求(管理后台测试/自动探测 cron) 失败会像真实流量一样衰减健康分,持续失败可把无流量渠道健康分指数级拖垮。 现探测失败跳过健康 EWMA 写入(探测成功仍照常记录),熔断窗口计数不受影响。 顺带修复 3 处与实现漂移的过期测试: - admin 角色迁移文件路径引用了已重命名的迁移脚本 - billing 账单摘要在无逐项 token 明细时漏了小计×倍率行(同时同步了乘数标签改名) - relay/helper 错误提示文案测试仍留着改中文前的英文期望值 * refactor(relay):补充gemini和claude协议的转换 * fix(relay):修复gemini转换问题 * fix(relay):优化工具转换 * feat(test):添加测试用例 * feat(test):添加测试用例 * feat(relay):补充转换矩阵 * feat(relay):补充协议转换测试 * fix(relay):修复vertex缺陷 * feat(relay):补充协议间的工具转换 * feat(relay):添加语料采集功能 * fix(relay):修复claude输出协议转换问题 * fix(relay):修复codex请求claude模型无法使用搜索工具问题 * fix(relay):修复codex请求gemini模型无法使用搜索工具问题 * refactor(relay):修改真实语料处理逻辑,将真实响应数据移出仓库 * fix(relay):补充手写测试数据集
功能特性
- 多租户架构 — 行级租户隔离,管理后台与租户控制台双独立用户体系
- 25+ 大模型供应商 — OpenAI、Claude、Gemini、DeepSeek、通义千问、智谱、Ollama 等
- OpenAI 兼容 API — 无缝替换 OpenAI API,支持对话补全、向量嵌入、图像生成、语音、实时通信等
- 智能渠道调度 — 优先级/权重路由、自动故障转移、健康监控、渠道亲和性
- 五层额度模型 — 租户钱包 → 套餐额度 → 成员额度 → 项目预算 → Key 额度
- 实时计费引擎 — 预扣 → 转发 → 结算 → 退款,Redis 原子操作保证并发安全
- 双控制台 — 管理后台(Naive UI)用于平台运营 + 租户控制台(TailwindCSS)面向终端用户
- 全链路可观测 — 请求日志、操作审计、监控告警,Request ID 贯穿全链路
在线演示地址:
管理端:https://team-api.net/admin/, 为做好数据安全措施,暂不公开登录方式
用户端:https://team-api.net, 用户名:liu@163.com, 密码:Demo123456
项目截图
管理后台
管理仪表盘![]() |
用量统计![]() |
请求日志![]() |
渠道监控![]() |
租户控制台
租户仪表盘![]() |
团队详情![]() |
用量统计![]() |
组织设置![]() |
在线对话体验![]() |
在线图像体验![]() |
技术栈
| 层级 | 技术选型 |
|---|---|
| 后端框架 | Go + GoFrame v2 |
| 数据库 | PostgreSQL 15 |
| 缓存 | Redis 7 + 内存缓存(双层) |
| 数据库迁移 | Goose |
| 管理后台前端 | Vue 3 + Vite + Naive UI + TailwindCSS |
| 租户控制台前端 | Vue 3 + Vite + TailwindCSS |
| 对象存储 | S3 / 阿里云 OSS / 腾讯云 COS |
| 前端包管理 | bun |
快速开始
环境要求
- Go 1.25+
- PostgreSQL 15+
- Redis 7+
- Node.js 18+ & bun(前端开发)
- GoFrame CLI(
gf命令) - Goose(数据库迁移)
1. 克隆仓库
git clone https://github.com/qianfree/team-api.git
cd team-api
2. 启动基础设施
使用 Docker Compose 启动 PostgreSQL 和 Redis:
docker compose -f manifest/docker/docker-compose.yaml up -d
3. 修改配置
复制并编辑配置文件:
cp manifest/config/config.yaml.example manifest/config/config.yaml
核心配置项:
server:
address: ":18888"
database:
default:
type: "pgsql"
link: "pgsql:user:password@tcp(127.0.0.1:5432)/team-api?sslmode=disable"
redis:
default:
address: "127.0.0.1:6379"
db: 0
jwt:
secret: "your-secret-key-change-in-production"
crypto:
encryptionKey: "a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2"
4. 执行数据库迁移
make migrate-up
5. 启动后端服务
# 开发模式(热编译)
make run
# 或直接运行
gf run main.go
API 服务将在 http://localhost:18888 启动。
6. 启动前端(可选)
# 管理后台
cd web/admin
bun install
bun dev
# 租户控制台(另开终端)
cd web/tenant
bun install
bun dev
7. 生产构建
# 仅构建后端(前端由 Nginx/CDN 独立托管)
make build
# 前后端一体(前端嵌入二进制,单文件部署)
make build-all
交叉编译
通过 GOOS 和 GOARCH 参数指定目标平台,在任意系统上构建其他平台的二进制:
# Linux x86_64
make build GOOS=linux GOARCH=amd64
# Linux ARM64(树莓派、ARM 服务器)
make build GOOS=linux GOARCH=arm64
# macOS Apple Silicon
make build GOOS=darwin GOARCH=arm64
# macOS Intel
make build GOOS=darwin GOARCH=amd64
# Windows
make build GOOS=windows GOARCH=amd64
# 交叉编译 + 嵌入前端
make build-all GOOS=linux GOARCH=amd64
输出文件名自动适配:Windows 下为 team-api.exe,其他平台为 team-api。
API 接口
AI 代理接口(OpenAI 兼容)
| 接口 | 说明 |
|---|---|
POST /v1/chat/completions |
对话补全 |
POST /v1/embeddings |
文本向量嵌入 |
POST /v1/images/generations |
图像生成 |
POST /v1/audio/transcriptions |
语音转文字 |
POST /v1/audio/translations |
语音翻译 |
POST /v1/audio/speech |
文字转语音 |
GET /v1/models |
获取可用模型列表 |
POST /v1/moderations |
内容审核 |
POST /v1/rerank |
重排序 |
WS /v1/realtime |
实时通信(WebSocket) |
使用示例:
curl http://localhost:18888/v1/chat/completions \
-H "Authorization: Bearer your-api-key" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-4o",
"messages": [{"role": "user", "content": "你好!"}]
}'
Docker 部署
快速部署(推荐)
只需两个文件,无需克隆整个仓库:
# 1. 创建部署目录
mkdir team-api && cd team-api
# 2. 下载 docker-compose.yaml 和示例配置
curl -O https://raw.githubusercontent.com/qianfree/team-api/main/manifest/docker/docker-compose.yaml
curl -o config.yaml https://raw.githubusercontent.com/qianfree/team-api/main/manifest/docker/config.example.yaml
# 3. 编辑配置文件(修改数据库密码、Redis 密码、JWT 密钥、加密密钥等)
cp config.example.yaml config.yaml
vim config.yaml
# 4. 修改 docker-compose.yaml 中的密码(与 config.yaml 保持一致)
# - POSTGRES_PASSWORD
# - Redis --requirepass
vim docker-compose.yaml
# 5. 一键启动所有服务
docker compose up -d
# 6. 更新版本,建议只更新主程序,避免数据库版本更新后有新特性不兼容
docker compose pull app
docker compose up -d
服务启动后访问 http://localhost:18888,首次部署会进入系统初始化向导(/api/setup)。
从源码构建
# 克隆仓库
git clone https://github.com/qianfree/team-api.git
cd team-api
# 构建并启动(多阶段构建:前端编译 → Go 编译 → 精简运行镜像)
docker compose --profile build up -d --build
也可以单独构建镜像推送到自己的 Registry:
# 构建镜像
docker build -t team-api:latest -f manifest/docker/Dockerfile .
# 指定版本号
docker build -t team-api:v1.0.0 --build-arg VERSION=v1.0.0 -f manifest/docker/Dockerfile .
配置说明
部署配置文件位于 manifest/docker/:
| 文件 | 用途 |
|---|---|
config.yaml |
应用运行时配置(数据库连接、Redis、JWT 等) |
Dockerfile |
多阶段构建(bun 前端 → Go 编译 → Alpine 运行) |
docker-compose.yaml |
服务编排(PostgreSQL + Redis + App) |
审计日志独立数据库(可选)
大模型请求审计日志(aud_request_logs)体量大、写入频繁,可将其存到独立的 PostgreSQL 实例,与主业务库物理隔离,避免影响主库响应速度。其余审核表(操作日志、登录历史、敏感数据访问、内容过滤)数据量小,留在主库即可。
1. 在独立库中建表:
# 连接审计数据库执行建表脚本
psql -h host -p port -U user -d team-api-audit -f docs/audit-db-schema.sql
2. 配置 manifest/config/config.yaml:
取消 database.audit 分组的注释并填写连接信息:
database:
audit:
type: "pgsql"
link: "pgsql:user:password@tcp(127.0.0.1:5432)/team-api-audit?sslmode=disable"
timezone: "Asia/Shanghai"
maxIdle: 10
maxOpen: 50
3. 重启服务:
make run
工作原理:
- 仅
aud_request_logs(大模型请求审计)走独立库,其余审计表仍在主库 - 配置了
database.audit.link时,aud_request_logs自动写入独立库;未配置时一切照常写入主库
开发指南
代码生成
GoFrame CLI 从定义文件自动生成样板代码:
# 从数据库表结构生成 DAO/DO/Entity
gf gen dao
# 从 Logic 层生成 Service 接口
gf gen service
# 从 API 定义生成 Controller
gf gen ctrl
重要: 新增 API 时必须按以下顺序执行:
- 在
api/中定义请求/响应结构体 - 在
internal/logic/中实现业务逻辑 - 执行
gf gen service - 执行
gf gen ctrl
Makefile 命令
make run # 启动开发服务器(热编译)
make build # 构建后端二进制(不含前端)
make build-web # 仅构建前端资源
make build-all # 前后端一体构建(前端嵌入二进制)
make tidy # 整理 Go 模块依赖
make ctrl # 从 API 定义生成 Controller
make dao # 从数据库生成 DAO/DO/Entity
make service # 从 Logic 层生成 Service 接口
make migrate-up # 执行数据库迁移
make migrate-down # 回滚上一次迁移
make migrate-status # 查看迁移状态
主线路线图
在线升级(已完成)支付模块(Easy Pay 已支持)图片生成同步转异步- 完善大模型支持,特别是图像和视频的支持
- 角色管理,方便运营团队内部协作,预设角色(管理员,销售,技术支持)
- 插件功能(定制功能通过插件实现,确保不与主线代码冲突)
- 开放平台(对接OA的能力,方便企业对接管理)
参与贡献
- Fork 本仓库
- 创建特性分支(
git checkout -b feature/amazing-feature) - 提交更改(
git commit -m 'feat: 添加某功能') - 推送分支(
git push origin feature/amazing-feature) - 发起 Pull Request
请遵循项目现有代码风格和 Conventional Commits 提交规范。
项目当前由 qianfree 单独维护。未来如接受外部贡献,将在合并贡献前提供贡献者许可协议(CLA),以确保 AGPL 与商业授权的权利链清晰完整。
在线交流
欢迎加QQ群聊天吹水:1095286563
提需求,反馈bug,摸鱼聊天都可以哦~
许可证
Copyright (C) 2026 qianfree。本项目社区版采用 AGPL v3.0 或更高版本 许可证。
核心要求
- 开源义务:修改并分发本项目的代码,必须以相同协议开源
- 网络条款:通过网络向用户提供基于本项目的服务(如 SaaS),也必须向用户开放修改后的源代码
- 自由使用:个人学习、研究、内部使用、商业运营均可,前提是遵守上述开源义务
商业授权
如果你希望在不履行 AGPL 开源义务的情况下闭源使用本项目,需要单独获取商业授权,请联系:406615373@qq.com。 商业授权不转让本项目的著作权、专利权、商标权或其他知识产权,具体权利以双方签署的书面协议为准。









