feat(architecture): Core+Plugin

This commit is contained in:
Apple\Apple
2025-10-13 02:02:11 +08:00
parent ede47ef014
commit 39c841e600
22 changed files with 2608 additions and 0 deletions

View File

@@ -0,0 +1,66 @@
package interfaces
import (
"io"
"net/http"
"github.com/QuantumNous/new-api/dto"
relaycommon "github.com/QuantumNous/new-api/relay/common"
"github.com/QuantumNous/new-api/types"
"github.com/gin-gonic/gin"
)
// ChannelPlugin 定义Channel插件接口
// 继承原有的Adaptor接口增加插件元数据
type ChannelPlugin interface {
// 插件元数据
Name() string
Version() string
Priority() int
// 原有Adaptor接口方法
Init(info *relaycommon.RelayInfo)
GetRequestURL(info *relaycommon.RelayInfo) (string, error)
SetupRequestHeader(c *gin.Context, req *http.Header, info *relaycommon.RelayInfo) error
ConvertOpenAIRequest(c *gin.Context, info *relaycommon.RelayInfo, request *dto.GeneralOpenAIRequest) (any, error)
ConvertRerankRequest(c *gin.Context, relayMode int, request dto.RerankRequest) (any, error)
ConvertEmbeddingRequest(c *gin.Context, info *relaycommon.RelayInfo, request dto.EmbeddingRequest) (any, error)
ConvertAudioRequest(c *gin.Context, info *relaycommon.RelayInfo, request dto.AudioRequest) (io.Reader, error)
ConvertImageRequest(c *gin.Context, info *relaycommon.RelayInfo, request dto.ImageRequest) (any, error)
ConvertOpenAIResponsesRequest(c *gin.Context, info *relaycommon.RelayInfo, request dto.OpenAIResponsesRequest) (any, error)
DoRequest(c *gin.Context, info *relaycommon.RelayInfo, requestBody io.Reader) (any, error)
DoResponse(c *gin.Context, resp *http.Response, info *relaycommon.RelayInfo) (usage any, err *types.NewAPIError)
GetModelList() []string
GetChannelName() string
ConvertClaudeRequest(c *gin.Context, info *relaycommon.RelayInfo, request *dto.ClaudeRequest) (any, error)
ConvertGeminiRequest(c *gin.Context, info *relaycommon.RelayInfo, request *dto.GeminiChatRequest) (any, error)
}
// TaskChannelPlugin 定义Task类型的Channel插件接口
type TaskChannelPlugin interface {
// 插件元数据
Name() string
Version() string
Priority() int
// 原有TaskAdaptor接口方法
Init(info *relaycommon.RelayInfo)
ValidateRequestAndSetAction(c *gin.Context, info *relaycommon.RelayInfo) *dto.TaskError
BuildRequestURL(info *relaycommon.RelayInfo) (string, error)
BuildRequestHeader(c *gin.Context, req *http.Request, info *relaycommon.RelayInfo) error
BuildRequestBody(c *gin.Context, info *relaycommon.RelayInfo) (io.Reader, error)
DoRequest(c *gin.Context, info *relaycommon.RelayInfo, requestBody io.Reader) (*http.Response, error)
DoResponse(c *gin.Context, resp *http.Response, info *relaycommon.RelayInfo) (taskID string, taskData []byte, err *dto.TaskError)
GetModelList() []string
GetChannelName() string
FetchTask(baseUrl, key string, body map[string]any) (*http.Response, error)
ParseTaskResult(respBody []byte) (*relaycommon.TaskInfo, error)
}
// ChannelConfig 插件配置
type ChannelConfig struct {
Enabled bool `yaml:"enabled"`
Priority int `yaml:"priority"`
Config map[string]interface{} `yaml:"config"`
}

93
core/interfaces/hook.go Normal file
View File

@@ -0,0 +1,93 @@
package interfaces
import (
"io"
"net/http"
"github.com/gin-gonic/gin"
)
// HookContext Relay Hook执行上下文
type HookContext struct {
// Gin Context
GinContext *gin.Context
// Request相关
Request *http.Request
RequestBody []byte
// Response相关
Response *http.Response
ResponseBody []byte
// Channel信息
ChannelID int
ChannelType int
ChannelName string
// Model信息
Model string
OriginalModel string
// User信息
UserID int
TokenID int
Group string
// 扩展数据(插件间共享)
Data map[string]interface{}
// 错误信息
Error error
// 是否跳过后续处理
ShouldSkip bool
}
// RelayHook Relay Hook接口
type RelayHook interface {
// 插件元数据
Name() string
Priority() int
Enabled() bool
// 生命周期钩子
// OnBeforeRequest 在请求发送到上游之前执行
OnBeforeRequest(ctx *HookContext) error
// OnAfterResponse 在收到上游响应之后执行
OnAfterResponse(ctx *HookContext) error
// OnError 在发生错误时执行
OnError(ctx *HookContext, err error) error
}
// RequestModifier 请求修改器接口
// 实现此接口的Hook可以修改请求内容
type RequestModifier interface {
RelayHook
ModifyRequest(ctx *HookContext, body io.Reader) (io.Reader, error)
}
// ResponseProcessor 响应处理器接口
// 实现此接口的Hook可以处理响应内容
type ResponseProcessor interface {
RelayHook
ProcessResponse(ctx *HookContext, body []byte) ([]byte, error)
}
// StreamProcessor 流式响应处理器接口
// 实现此接口的Hook可以处理流式响应
type StreamProcessor interface {
RelayHook
ProcessStreamChunk(ctx *HookContext, chunk []byte) ([]byte, error)
}
// HookConfig Hook配置
type HookConfig struct {
Name string `yaml:"name"`
Enabled bool `yaml:"enabled"`
Priority int `yaml:"priority"`
Config map[string]interface{} `yaml:"config"`
}

View File

@@ -0,0 +1,31 @@
package interfaces
import (
"github.com/gin-gonic/gin"
)
// MiddlewarePlugin 中间件插件接口
type MiddlewarePlugin interface {
// 插件元数据
Name() string
Priority() int
Enabled() bool
// 返回Gin中间件处理函数
Handler() gin.HandlerFunc
// 初始化(可选)
Initialize(config MiddlewareConfig) error
}
// MiddlewareConfig 中间件配置
type MiddlewareConfig struct {
Name string `yaml:"name"`
Enabled bool `yaml:"enabled"`
Priority int `yaml:"priority"`
Config map[string]interface{} `yaml:"config"`
}
// MiddlewareFactory 中间件工厂函数类型
type MiddlewareFactory func(config MiddlewareConfig) (MiddlewarePlugin, error)