实现支持 OpenAI 和 Anthropic 双协议的统一大模型 API 网关 MVP 版本,包含: - OpenAI 和 Anthropic 协议代理 - 供应商和模型管理 - 用量统计 - 前端配置界面
72 lines
1.4 KiB
Go
72 lines
1.4 KiB
Go
package router
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
|
|
"nex/backend/internal/config"
|
|
)
|
|
|
|
var (
|
|
ErrModelNotFound = errors.New("模型未找到")
|
|
ErrModelDisabled = errors.New("模型已禁用")
|
|
ErrProviderDisabled = errors.New("供应商已禁用")
|
|
)
|
|
|
|
// RouteResult 路由结果
|
|
type RouteResult struct {
|
|
Provider *config.Provider
|
|
Model *config.Model
|
|
}
|
|
|
|
// Router 模型路由器
|
|
type Router struct{}
|
|
|
|
// NewRouter 创建路由器
|
|
func NewRouter() *Router {
|
|
return &Router{}
|
|
}
|
|
|
|
// Route 根据模型名称路由到供应商
|
|
func (r *Router) Route(modelName string) (*RouteResult, error) {
|
|
// 查询模型
|
|
models, err := config.ListModels("")
|
|
if err != nil {
|
|
return nil, fmt.Errorf("查询模型失败: %w", err)
|
|
}
|
|
|
|
// 查找匹配的模型
|
|
var targetModel *config.Model
|
|
for i := range models {
|
|
if models[i].ModelName == modelName {
|
|
targetModel = &models[i]
|
|
break
|
|
}
|
|
}
|
|
|
|
if targetModel == nil {
|
|
return nil, ErrModelNotFound
|
|
}
|
|
|
|
// 检查模型是否启用
|
|
if !targetModel.Enabled {
|
|
return nil, ErrModelDisabled
|
|
}
|
|
|
|
// 查询供应商
|
|
provider, err := config.GetProvider(targetModel.ProviderID, false)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("查询供应商失败: %w", err)
|
|
}
|
|
|
|
// 检查供应商是否启用
|
|
if !provider.Enabled {
|
|
return nil, ErrProviderDisabled
|
|
}
|
|
|
|
return &RouteResult{
|
|
Provider: provider,
|
|
Model: targetModel,
|
|
}, nil
|
|
}
|