Documentation
¶
Overview ¶
Package sdk 定义 AirGate 插件作者直接使用的 Go SDK。
本包只放稳定插件契约、共享类型、capability 辅助和日志辅助。 gRPC、go-plugin、broker、protobuf 转换等运行时细节属于 runtimego/grpc。
Index ¶
- Constants
- Variables
- func ExtractOrGenerateRequestID(headers http.Header) string
- func GetPluginDSN(ctx PluginContext) string
- func InitLogger(module, level, format string)
- func IsKnownCapability(c Capability) bool
- func LogFormat() string
- func LoggerFromContext(ctx context.Context) *slog.Logger
- func LoggerWithRequestID(ctx context.Context) (context.Context, *slog.Logger)
- func RequestIDFromContext(ctx context.Context) string
- func WithLogger(ctx context.Context, logger *slog.Logger) context.Context
- func WithRequestID(ctx context.Context, id string) context.Context
- type Account
- type AccountType
- type BackgroundTask
- type Capability
- type CapabilityValidationReport
- type ConfigField
- type ConfigWatcher
- type CredentialField
- type DecisionAction
- type DispatchCandidate
- type DispatchDSL
- type DispatchGate
- type DispatchModel
- type DispatchPlan
- type DispatchRule
- type DispatchWhen
- type EventHandler
- type EventSchema
- type EventSubscription
- type ExtensionPlugin
- type FailoverScope
- type ForwardOutcome
- type ForwardRequest
- type FrontendPage
- type FrontendWidget
- type GatewayPlugin
- type HealthChecker
- type Host
- type HostAware
- type HostInvokeRequest
- type HostInvokeResponse
- type HostStream
- type HostStreamFrame
- type HostStreamRequest
- type HostTask
- type InvokeSchema
- type InvokeTransport
- type MiddlewareDecision
- type MiddlewareEvent
- type MiddlewarePlugin
- type MiddlewareRequest
- type ModelInfo
- type OutcomeKind
- type PayloadSchema
- type Plugin
- type PluginConfig
- type PluginContext
- type PluginDSNAware
- type PluginEvent
- type PluginInfo
- type PluginSchema
- type PluginType
- type RequestHandler
- type RouteDefinition
- type RouteRegistrar
- type RouteSchema
- type SchemaProvider
- type TaskProcessor
- type TaskSchema
- type TaskStatus
- type UpstreamResponse
- type Usage
- type WebAssetsProvider
- type WebSocketConn
- type WebSocketConnectInfo
Constants ¶
const ( WSMessageText = 1 WSMessageBinary = 2 )
WebSocket 消息类型(与 gorilla/websocket 的 TextMessage / BinaryMessage 对齐)。
const ( HeaderRequestID = "X-Request-ID" LogFieldRequestID = "request_id" LogFieldUserID = "user_id" LogFieldGroupID = "group_id" LogFieldAccountID = "account_id" LogFieldAPIKeyID = "api_key_id" LogFieldPluginID = "plugin_id" LogFieldModel = "model" LogFieldPlatform = "platform" LogFieldStatus = "status_code" LogFieldDurationMs = "duration_ms" LogFieldError = "error" LogFieldMethod = "method" LogFieldPath = "path" LogFieldReason = "reason" )
日志相关 HTTP header 与字段名约定。
字段命名一律 snake_case,事件名一律 snake_case,由 slog 统一输出。 全局 module 字段由 InitLogger 注入("core" 或 "plugin.<id>")。
const ( DefaultMiddlewareDeadline = 200 * time.Millisecond DefaultMiddlewareChainBudget = 500 * time.Millisecond )
DefaultMiddlewareDeadline / DefaultMiddlewareChainBudget 单 hook / 整条链的默认超时预算。 Core 侧按此控制超时,middleware 超时不得 block 主流程,只会被跳过并 log warn。
const ( ModelCapChat = "chat" // 文本对话 ModelCapReasoning = "reasoning" // 推理 / 思维链 ModelCapImageGeneration = "image_generation" // 图像生成 ModelCapImageEdit = "image_edit" // 图像编辑 ModelCapVideoGeneration = "video_generation" // 视频生成 ModelCapAudioGeneration = "audio_generation" // 音频/音乐生成 ModelCapTTS = "tts" // 文本转语音 ModelCapSTT = "stt" // 语音转文字 ModelCapCodeExecution = "code_execution" // 代码执行 ModelCapEmbedding = "embedding" // 向量嵌入 )
标准模型能力常量。网关插件在声明 Models() 时应为每个模型填充 Capabilities 字段。 Playground / Core 按此分类展示和过滤。新增能力类型在此追加即可,无需改 proto。
const ( SlotAccountIdentity = "account-identity" SlotAccountCreate = "account-create" SlotAccountEdit = "account-edit" SlotAccountUsageWindow = "account-usage-window" SlotUsageMetricDetail = "usage-metric-detail" SlotUsageCostDetail = "usage-cost-detail" )
前端组件插槽。
const ConfigKeyLogLevel = "_log_level"
ConfigKeyLogLevel Core 通过此配置键把日志级别传给插件。
const PluginDSNConfigKey = "plugin_dsn"
PluginDSNConfigKey Core 注入"插件专属数据库 DSN"时使用的 config key。 插件作者应通过 GetPluginDSN(ctx) 访问,而非直接拼字符串。
const SDKVersion = "0.2.5"
SDKVersion 当前 SDK 版本,插件编译时嵌入到 PluginInfo。
Variables ¶
var ErrInvalidCredentials = errors.New("invalid credentials")
ErrInvalidCredentials ValidateAccount 判定凭证格式/语义不合法时返回。
var ErrNotSupported = errors.New("not supported")
ErrNotSupported 插件不支持某项可选能力时返回(如 HandleWebSocket)。
Functions ¶
func ExtractOrGenerateRequestID ¶
ExtractOrGenerateRequestID 从 HTTP header 抽取 X-Request-ID;缺失则生成新 UUID。
用于 core 入口、插件 HTTP 处理器等所有"链路开始"的位置:
- core 接到客户端请求 → 抽取/生成 → 写回 header → 透传给插件
- 插件回调入口(webhook 等) → 同样抽取/生成
func InitLogger ¶
func InitLogger(module, level, format string)
InitLogger 初始化全局 slog。 module 日志来源标识(如 "core"、"plugin.gateway-openai");level: debug/info/warn/error;format: text/json。
text 格式且 stdout 是 TTY 时自动启用 ANSI 颜色(按等级染色 + request_id 高亮); 重定向到文件 / 管道、或设置 NO_COLOR=1 时自动退化为纯文本。
func IsKnownCapability ¶
func IsKnownCapability(c Capability) bool
IsKnownCapability 判断 capability 是否在当前 SDK 版本的已知集合内。
func LoggerFromContext ¶
LoggerFromContext 从 context 取 logger;不存在则返回 slog.Default()。
该函数永远不返回 nil,调用方可直接 .Info/.Error。
func LoggerWithRequestID ¶
LoggerWithRequestID 为 ctx 派生一个带 request_id 字段的 logger 并写回 ctx。
典型用法(HTTP 中间件):
rid := sdk.ExtractOrGenerateRequestID(r.Header)
ctx = sdk.WithRequestID(ctx, rid)
ctx, logger := sdk.LoggerWithRequestID(ctx)
logger.Info("http_request_received", "method", r.Method, "path", r.URL.Path)
func RequestIDFromContext ¶
RequestIDFromContext 从 context 取 request_id;不存在返回空串。
func WithLogger ¶
WithLogger 把 logger 绑到 context;通常由 HTTP/gRPC 入口构造请求级 logger 后调用。
Types ¶
type Account ¶
type Account struct {
ID int64 `json:"id"`
Name string `json:"name"`
Platform string `json:"platform"`
Type string `json:"type"` // 对应 AccountType.Key(apikey / oauth / ...)
Credentials map[string]string `json:"credentials"` // JSONB 透传,结构由 Type 决定
ProxyURL string `json:"proxy_url"`
}
Account 上游账户(Core 调度后传给插件的最小视图)。
type AccountType ¶
type AccountType struct {
Key string `json:"key"`
Label string `json:"label"`
Description string `json:"description"`
Fields []CredentialField `json:"fields"`
}
AccountType 账号类型声明。
type BackgroundTask ¶
type BackgroundTask struct {
Name string
Interval time.Duration
Handler func(ctx context.Context) error
}
BackgroundTask 后台任务声明(Core 负责调度)。
type Capability ¶
type Capability string
Capability 类型化的能力标识符(命名规范:<domain>.<action>)。 所有 capability 常量必须用此类型以便编译期捕获拼写错误。
运行时授权由 Core 强制执行;SDK 只负责声明格式和基础类型自检。
const ( // CapabilityHostInvoke 允许插件通过 Host.Invoke / Host.InvokeStream 调用 Core 开放的方法。 // // Core 可以进一步要求插件声明 method 级 capability: // // host.invoke.<method> // // 例如: // // host.invoke.scheduler.select_account // host.invoke.tasks.update CapabilityHostInvoke Capability = "host.invoke" CapabilityMiddlewareReadBody Capability = "middleware.read_body" )
func CapabilityForHostMethod ¶
func CapabilityForHostMethod(method string) Capability
CapabilityForHostMethod 返回某个 Core method 对应的细粒度 capability。
func KnownCapabilities ¶
func KnownCapabilities() []Capability
KnownCapabilities 返回 SDK 内置 capability,按字典序排序。 host.invoke.<method> 属于动态 capability,不会出现在此列表中。
func (Capability) String ¶
func (c Capability) String() string
type CapabilityValidationReport ¶
type CapabilityValidationReport struct {
// Effective 当前 plugin type 下实际生效的 capability = 声明 ∩ 类型允许,去重+排序。
Effective []Capability
// Unknown SDK 不认识的 capability(多半是拼写错)。
Unknown []Capability
// Denied SDK 认识但当前 plugin type 不允许的 capability(配置错误)。
Denied []Capability
}
CapabilityValidationReport ValidateCapabilities 的输出。
func ValidateCapabilities ¶
func ValidateCapabilities(typ PluginType, declared []Capability) CapabilityValidationReport
ValidateCapabilities 对一组声明做 self-check。授权决策仍由 Core 的方法注册表负责, 这里只做"声明 vs 已知 vs 类型允许"的纸面检查。
func (CapabilityValidationReport) HasIssues ¶
func (r CapabilityValidationReport) HasIssues() bool
HasIssues 报告是否检测到任何问题。
type ConfigField ¶
type ConfigField struct {
Key string `json:"key"`
Label string `json:"label"`
Type string `json:"type"` // string / int / bool / float / duration / password
Required bool `json:"required"`
Default string `json:"default,omitempty"`
Description string `json:"description,omitempty"`
Placeholder string `json:"placeholder,omitempty"`
}
ConfigField 配置项声明。
type ConfigWatcher ¶
type ConfigWatcher interface {
OnConfigUpdate(config PluginConfig) error
}
ConfigWatcher 可选:支持配置热更新的插件实现。
type CredentialField ¶
type CredentialField struct {
Key string `json:"key"`
Label string `json:"label"`
Type string `json:"type"` // text / password / textarea / select
Required bool `json:"required"`
Placeholder string `json:"placeholder"`
EditDisabled bool `json:"edit_disabled,omitempty"`
}
CredentialField 凭证字段声明。
type DecisionAction ¶
type DecisionAction int32
DecisionAction 对应 proto MiddlewareDecision.Action。
const ( DecisionAllow DecisionAction = 0 DecisionDeny DecisionAction = 1 DecisionMutate DecisionAction = 2 )
type DispatchCandidate ¶ added in v0.2.3
type DispatchCandidate struct {
Scheduling string `json:"scheduling"`
Wire string `json:"wire,omitempty"`
}
DispatchCandidate 是一条可尝试的调度候选。
type DispatchDSL ¶ added in v0.2.3
type DispatchDSL struct {
Rules []DispatchRule `json:"rules,omitempty"`
}
DispatchDSL 声明插件默认的请求调度规则。
Core 会先用 group 级 DSL 覆盖/追加,再回退到插件默认 DSL,最终得到一次请求的 DispatchPlan 列表。每条规则既能声明模型选择,也能声明操作语义、分组开关和超时画像。
type DispatchGate ¶ added in v0.2.3
type DispatchGate struct {
RequiredOperation string `json:"required_operation,omitempty"`
Status int `json:"status,omitempty"`
ErrorType string `json:"error_type,omitempty"`
Code string `json:"code,omitempty"`
Message string `json:"message,omitempty"`
}
DispatchGate 声明当前请求需要的分组操作开关,以及拒绝时的错误响应。
type DispatchModel ¶ added in v0.2.3
type DispatchModel struct {
StripSuffix string `json:"strip_suffix,omitempty"`
}
DispatchModel 描述规则命中后对客户端模型名的变换。
type DispatchPlan ¶ added in v0.2.3
type DispatchPlan struct {
ClientModel string `json:"client_model,omitempty"`
SchedulingModel string `json:"scheduling_model,omitempty"`
WireModel string `json:"wire_model,omitempty"`
RuleID string `json:"rule_id,omitempty"`
Operation string `json:"operation,omitempty"`
TimeoutProfile string `json:"timeout_profile,omitempty"`
Gate DispatchGate `json:"gate,omitempty"`
}
DispatchPlan 是一次请求经过 DSL 解析后的单个调度方案。
同一请求可能产生多个候选方案;Core 会按顺序尝试调度对应的 scheduling model, 并把最终选中的方案写回 ForwardRequest.DispatchPlan 传给插件。
func (DispatchPlan) UpstreamModel ¶ added in v0.2.3
func (p DispatchPlan) UpstreamModel() string
UpstreamModel 返回本次请求真正要发给插件上游的模型名。
type DispatchRule ¶ added in v0.2.3
type DispatchRule struct {
ID string `json:"id,omitempty"`
When DispatchWhen `json:"when,omitempty"`
Model DispatchModel `json:"model,omitempty"`
Operation string `json:"operation,omitempty"`
TimeoutProfile string `json:"timeout_profile,omitempty"`
Gate DispatchGate `json:"gate,omitempty"`
Candidates []DispatchCandidate `json:"candidates,omitempty"`
}
DispatchRule 一条请求调度规则。
type DispatchWhen ¶ added in v0.2.3
type DispatchWhen struct {
Methods []string `json:"methods,omitempty"`
Paths []string `json:"paths,omitempty"`
PathPrefixes []string `json:"path_prefixes,omitempty"`
Models []string `json:"models,omitempty"`
ModelPrefixes []string `json:"model_prefixes,omitempty"`
ModelSuffixes []string `json:"model_suffixes,omitempty"`
}
DispatchWhen 描述一条规则的匹配条件。
type EventHandler ¶
type EventHandler interface {
EventSubscriptions() []EventSubscription
HandleEvent(ctx context.Context, event PluginEvent) error
}
EventHandler 可选接口:插件实现后即可订阅并处理 Core 推送的事件。
type EventSchema ¶
type EventSchema struct {
Type string `json:"type"`
Source string `json:"source,omitempty"`
Summary string `json:"summary,omitempty"`
Payload PayloadSchema `json:"payload,omitempty"`
Metadata map[string]string `json:"metadata,omitempty"`
}
EventSchema 描述插件订阅或发布的事件类型。
type EventSubscription ¶
type EventSubscription struct {
Type string `json:"type"`
Source string `json:"source,omitempty"`
Filter map[string]string `json:"filter,omitempty"`
Metadata map[string]string `json:"metadata,omitempty"`
}
EventSubscription 声明插件希望接收的 Core 事件。
Type 支持精确事件名,也可由 Core 约定支持通配符,例如 "account.*"。 Filter 是弱契约过滤条件,只用于事件分发提示;安全过滤仍由 Core 负责。
type ExtensionPlugin ¶
type ExtensionPlugin interface {
Plugin
RegisterRoutes(r RouteRegistrar)
Migrate() error
BackgroundTasks() []BackgroundTask
}
ExtensionPlugin 通用扩展插件接口:注册自定义路由、执行迁移、声明后台任务。
type FailoverScope ¶ added in v0.2.3
type FailoverScope string
FailoverScope 声明一次 ForwardOutcome 允许 Core 重试的边界。
零值表示不覆盖 OutcomeKind 自身语义。插件只有在能精确判断某类失败应该切换 Core 下发的 DispatchPlan 候选时,才应填写 DispatchCandidate。
const ( // FailoverScopeNone 表示不请求额外 failover。 FailoverScopeNone FailoverScope = "" // FailoverScopeDispatchCandidate 表示当前 DispatchPlan 候选不可用,Core 可前进 // 到下一候选重试;若没有下一候选,则按原 OutcomeKind 处理。 FailoverScopeDispatchCandidate FailoverScope = "dispatch_candidate" )
type ForwardOutcome ¶
type ForwardOutcome struct {
Kind OutcomeKind
FailoverScope FailoverScope
Upstream UpstreamResponse
Usage *Usage
Duration time.Duration
RetryAfter time.Duration
Reason string
UpdatedCredentials map[string]string
}
ForwardOutcome 是插件对一次 Forward 的完整判决结果。
字段填写约定:
Kind 必填,零值视为 Unknown(Core 保守处理) Upstream 必填(StatusCode 至少填;Headers/Body 按 Kind 决定是否透传) Usage 仅 Success(偶尔 ClientError)下非 nil RetryAfter 仅 AccountRateLimited 下有意义 Duration 插件测得的耗时,Core 仅用于日志 Reason 人类可读原因,Core 仅落日志,不做任何判断 UpdatedCredentials 插件若在 Forward 中刷新了凭证(OAuth 轮转等)通过此字段带回 FailoverScope 可选,声明 OutcomeKind 之外的重试边界
type ForwardRequest ¶
type ForwardRequest struct {
Account *Account
Body []byte
Headers http.Header
// Model 是客户端请求的原始模型;调度和上游模型由 DispatchPlan 表达。
Model string
DispatchPlan DispatchPlan
Stream bool
// Writer 流式响应写入目标。
// Core 负责把写入内容转发给用户,并在调用结束后根据 ForwardOutcome 写记录和更新账号状态。
Writer http.ResponseWriter
}
ForwardRequest 转发请求(Core → 插件)。
type FrontendPage ¶
type FrontendPage struct {
Path string `json:"path"`
Title string `json:"title"`
Icon string `json:"icon"`
Description string `json:"description"`
// Audience 决定页面可见范围:
// "admin" / "" 仅管理员(默认)
// "user" 仅普通登录用户
// "all" 所有登录用户
Audience string `json:"audience,omitempty"`
}
FrontendPage 前端独立页面声明。
type FrontendWidget ¶
type FrontendWidget struct {
Slot string `json:"slot"`
EntryFile string `json:"entry_file"`
Title string `json:"title"`
}
FrontendWidget 前端组件嵌入声明。
type GatewayPlugin ¶
type GatewayPlugin interface {
Plugin
Platform() string
Models() []ModelInfo
Routes() []RouteDefinition
Forward(ctx context.Context, req *ForwardRequest) (ForwardOutcome, error)
ValidateAccount(ctx context.Context, credentials map[string]string) error
// HandleWebSocket 处理 WebSocket 双向通信。连接结束后返回 ForwardOutcome。
// 不支持时返回 ErrNotSupported。
HandleWebSocket(ctx context.Context, conn WebSocketConn) (ForwardOutcome, error)
}
GatewayPlugin 网关插件接口。
Core 负责:账号调度、并发/RPM 限流、结算记录、failover。 插件负责:声明模型/路由、转发请求、验证凭证;账号管理和使用记录页面通过 插件前端静态资源与插件私有 API 承接。
Forward 的返回契约:
- ForwardOutcome 表达业务判决(成功 / 客户端错 / 账号限流 / 账号死 / 上游抖动 / 流中断)
- error 仅表达"插件自身无法完成此次调用"(进程异常、gRPC 层故障),不承担业务语义
详见 outcome.go 的 OutcomeKind 文档。
type HealthChecker ¶
HealthChecker 可选:Core 定期调用以探测插件存活。
type Host ¶
type Host interface {
// Invoke 调用 Core 开放的方法。
// Method 使用点分命名,例如 "scheduler.select_account"、"tasks.update"。
// Payload 是 JSON 对象语义,运行时会通过 protobuf bytes 传输。
Invoke(ctx context.Context, req HostInvokeRequest) (*HostInvokeResponse, error)
// InvokeStream 调用 Core 开放的流式方法。
// 首帧由 SDK 根据 req 自动发送;后续由返回的 HostStream 发送和接收。
InvokeStream(ctx context.Context, req HostStreamRequest) (HostStream, error)
}
Host Core 暴露给插件的反向调用接口(plugin → core)。
通过 hashicorp/go-plugin 的 GRPCBroker 架起子进程隧道,插件无需 admin HTTP / Bearer 鉴权。 SDK 只定义通用调用通道,不定义 Core 方法清单;具体 method、入参和出参由 Core 的 方法注册表和插件 schema 共同约定,并由 Core 按 capability 强制授权。
在插件 Init 里通过 HostAware 拿到:
func (p *MyPlugin) Init(ctx sdk.PluginContext) error {
if h, ok := ctx.(sdk.HostAware); ok {
p.host = h.Host() // 可能为 nil
}
return nil
}
type HostAware ¶
type HostAware interface {
// Host 返回 Host 客户端;可能为 nil(Core 版本不支持 / 未启用)。
Host() Host
}
HostAware 可选接口:PluginContext 实现它就能暴露 Host。
type HostInvokeRequest ¶
type HostInvokeRequest struct {
Method string
// Payload 是方法入参。SDK 不解释字段含义,Core method 自己校验 schema。
Payload map[string]interface{}
// IdempotencyKey 用于创建任务、下单等副作用方法的幂等控制;只读方法可留空。
IdempotencyKey string
// Metadata 是调用级辅助信息,不应用于替代权限、调度或核心业务字段。
Metadata map[string]string
}
HostInvokeRequest 是插件调用 Core 方法的通用请求。
type HostInvokeResponse ¶
type HostInvokeResponse struct {
// Status 是方法自己的业务状态;传输错误、鉴权错误和 schema 错误应通过 error 返回。
Status string
// Payload 是方法出参。SDK 不解释字段含义。
Payload map[string]interface{}
// Metadata 是调用级辅助信息。
Metadata map[string]string
}
HostInvokeResponse 是 Core 方法调用的通用响应。
type HostStream ¶
type HostStream interface {
Send(frame HostStreamFrame) error
Recv() (*HostStreamFrame, error)
CloseSend() error
}
HostStream 是插件与 Core 之间的双向流。
Recv 在流结束时返回 io.EOF。调用方不再发送数据时应调用 CloseSend。
type HostStreamFrame ¶
type HostStreamFrame struct {
// Event 是 method 内部约定的帧类型,例如 "chunk"、"progress"、"error"、"result"。
Event string
// Status 是 method 自己的业务状态,通常只在最终帧使用。
Status string
// Payload 是当前帧的 JSON 对象语义数据。
Payload map[string]interface{}
// Metadata 是帧级辅助信息。
Metadata map[string]string
// Done 表示这是当前流的最终业务帧;传输层结束仍以 io.EOF 为准。
Done bool
}
HostStreamFrame 是 InvokeStream 的单帧数据。
type HostStreamRequest ¶
type HostStreamRequest struct {
Method string
// Payload 是首帧入参。SDK 不解释字段含义,Core method 自己校验 schema。
Payload map[string]interface{}
// IdempotencyKey 用于副作用类流式方法的幂等控制;只读方法可留空。
IdempotencyKey string
// Metadata 是调用级辅助信息,不应用于替代权限、调度或核心业务字段。
Metadata map[string]string
}
HostStreamRequest 是插件调用 Core 流式方法的起始请求。
type HostTask ¶
type HostTask struct {
ID int64
PublicTaskID string
PluginID string
TaskType string
Status TaskStatus // pending, processing, completed, failed, cancelled
UserID int64
Input map[string]interface{}
Output map[string]interface{}
Execution map[string]interface{} // plugin internal state, survives retries
ErrorMessage string
Progress int // 0-100
Attempts int
MaxAttempts int
CreatedAt time.Time
UpdatedAt time.Time
StartedAt *time.Time
CompletedAt *time.Time
}
HostTask 任务完整信息。
type InvokeSchema ¶
type InvokeSchema struct {
Method string `json:"method"`
Summary string `json:"summary,omitempty"`
// Transport 为空时等价于 unary。
Transport InvokeTransport `json:"transport,omitempty"`
Request PayloadSchema `json:"request,omitempty"`
Response PayloadSchema `json:"response,omitempty"`
// ClientFrame / ServerFrame 只用于 InvokeStream,描述双方 frame payload。
ClientFrame PayloadSchema `json:"client_frame,omitempty"`
ServerFrame PayloadSchema `json:"server_frame,omitempty"`
Metadata map[string]string `json:"metadata,omitempty"`
}
InvokeSchema 描述通过 Host.Invoke 或 Host.InvokeStream 调用的扩展动作。
type InvokeTransport ¶
type InvokeTransport string
InvokeTransport 描述 Host.Invoke method 的传输模式。
const ( InvokeTransportUnary InvokeTransport = "unary" InvokeTransportServerStream InvokeTransport = "server_stream" InvokeTransportClientStream InvokeTransport = "client_stream" InvokeTransportBidirectionalStream InvokeTransport = "bidirectional_stream" )
type MiddlewareDecision ¶
type MiddlewareDecision struct {
Action DecisionAction
// DenyStatusCode / DenyMessage 仅 DecisionDeny 使用;默认 403。
DenyStatusCode int32
DenyMessage string
// SetHeaders 仅 DecisionMutate 使用:追加或覆盖的请求头。
SetHeaders http.Header
// Metadata 无论 Action 是什么都会 merge 进请求上下文的 bag。
Metadata map[string]string
}
MiddlewareDecision OnForwardBegin 的返回值。nil 等价于 DecisionAllow 且不改任何东西。
type MiddlewareEvent ¶
type MiddlewareEvent struct {
RequestID string
UserID int64
GroupID int64
AccountID int64
Platform string
Model string
Stream bool
StatusCode int32
Duration time.Duration
Usage *Usage
ErrorKind string // "" / "upstream_5xx" / "timeout" / "no_account" / ...
ErrorMsg string
Metadata map[string]string
// ResponseBody / ResponseHeaders 仅在插件声明 CapabilityMiddlewareReadBody 时填充。
// 流式响应下 ResponseBody 只含摘要(首个非空 chunk)。
ResponseBody []byte
ResponseHeaders http.Header
}
MiddlewareEvent OnForwardEnd 的入参。
type MiddlewarePlugin ¶
type MiddlewarePlugin interface {
Plugin
OnForwardBegin(ctx context.Context, req *MiddlewareRequest) (*MiddlewareDecision, error)
OnForwardEnd(ctx context.Context, evt *MiddlewareEvent) error
}
MiddlewarePlugin 中间件插件接口。
PluginInfo.Type = PluginTypeMiddleware 时注册为"请求/响应拦截层"。Core 在每次 forward 的 前后回调 OnForwardBegin / OnForwardEnd,按 PluginInfo.Priority 升序进 Begin、降序出 End。
失败语义:Begin/End 返回 error 只会被 log warn,不 block 主流程。唯一例外是 OnForwardBegin 返回 DecisionDeny——此时请求被拒绝,用户看到的错误文案来自 Decision。
Payload:默认只给元数据;插件声明 CapabilityMiddlewareReadBody 才会收到 request_body / response_body。流式响应的 response_body 只给摘要。
type MiddlewareRequest ¶
type MiddlewareRequest struct {
RequestID string
UserID int64
GroupID int64
AccountID int64
Platform string
Model string
Stream bool
// Metadata 贯穿 Begin/End 的 KV bag,多个 middleware 之间共享。
Metadata map[string]string
// RequestBody / RequestHeaders 仅在插件声明 CapabilityMiddlewareReadBody 时填充。
RequestBody []byte
RequestHeaders http.Header
}
MiddlewareRequest OnForwardBegin 的入参。
type ModelInfo ¶
type ModelInfo struct {
ID string `json:"id"`
Name string `json:"name"`
ContextWindow int `json:"context_window"`
MaxOutputTokens int `json:"max_output_tokens"`
Capabilities []string `json:"capabilities,omitempty"`
// Metadata 保存展示、分类、供应商标签等非核心扩展信息。
// Core 不应依赖这里做调度、计费或权限判断。
Metadata map[string]string `json:"metadata,omitempty"`
}
ModelInfo 插件声明的模型信息。
Core 可用这些字段做展示、基础选择和能力过滤;具体价格、倍率、套餐和用量算法 由网关插件在 Forward 中计算后写入 Usage。
func (*ModelInfo) HasCapability ¶
HasCapability 检查模型是否具备指定能力。
type OutcomeKind ¶
type OutcomeKind int
OutcomeKind 一次 Forward 调用的判决类型。
插件必须在返回的 ForwardOutcome 里显式声明 Kind;零值 OutcomeUnknown 等于 "插件未声明",Core 会按"可疑上游错误"保守处理(不透传响应给客户端、也不把账号标死)。 这是 SDK 契约的核心:插件只做判决,Core 只做执行。
const ( // OutcomeUnknown 保留给零值:插件未声明判决。Core 将保守处理。 OutcomeUnknown OutcomeKind = iota // OutcomeSuccess 上游返回 2xx,Usage 必填。 OutcomeSuccess // OutcomeClientError 4xx,错在客户端请求本身(context 过长、参数非法等)。 // 换账号救不回来,Core 会把 Upstream 原样透传给客户端,不罚账号。 OutcomeClientError // OutcomeAccountRateLimited 账号被上游限流(通常 429),冷却一段时间后可恢复。 // Core 会把账号打入 RateLimited 状态 + 尝试 failover 到其它账号。 OutcomeAccountRateLimited // OutcomeAccountDead 账号凭证失效(401/403,或上游语义化消息),需要人工处理。 // Core 会把账号打入 Disabled 状态 + 尝试 failover。 OutcomeAccountDead // OutcomeUpstreamTransient 上游抽风(5xx、连接抖动、超时),账号本身没问题。 // Core 尝试 failover;累计多次后由状态机决定是否升级为 AccountDead。 OutcomeUpstreamTransient // OutcomeStreamAborted 流式响应已经开始写入客户端,中途断开。 // 不能 failover(字节已经发出去了),也不能把账号直接标死。 OutcomeStreamAborted // OutcomeFamilyTransient 上游某个模型家族暂时过载(例如 model overloaded)。 // Core 会把 (account, model-family) 写入短退避冷却并尝试 failover,不影响同账号其它 family。 OutcomeFamilyTransient // Core 会短暂降级并累计次数,连续达到阈值后再升级为 AccountDead。 OutcomeAccountUnavailable )
func (OutcomeKind) IsAccountFault ¶
func (k OutcomeKind) IsAccountFault() bool
IsAccountFault 本次判决是否需要避开当前选中的账号上下文。 FamilyTransient 只惩罚当前账号的当前模型家族,不会降级整个账号。
func (OutcomeKind) ShouldFailover ¶
func (k OutcomeKind) ShouldFailover() bool
ShouldFailover 是否允许换账号重试。 ClientError 不应 failover(换号也救不回来);StreamAborted 不能 failover(已写入); Success / Unknown 显然不该 failover。
type PayloadSchema ¶
type PayloadSchema struct {
ContentType string `json:"content_type,omitempty"`
Schema string `json:"schema,omitempty"`
Example string `json:"example,omitempty"`
Metadata map[string]string `json:"metadata,omitempty"`
}
PayloadSchema 描述一个 JSON payload 的结构。
Schema 通常是 JSON Schema 字符串;Example 是 JSON 示例字符串。
type Plugin ¶
type Plugin interface {
Info() PluginInfo
Init(ctx PluginContext) error
Start(ctx context.Context) error
Stop(ctx context.Context) error
}
Plugin 所有插件的基础接口。
type PluginConfig ¶
type PluginConfig interface {
GetString(key string) string
GetInt(key string) int
GetBool(key string) bool
GetFloat64(key string) float64
GetDuration(key string) time.Duration
// GetAll 返回 JSONB 原始 map。
GetAll() map[string]string
}
PluginConfig 配置读取接口。
type PluginContext ¶
type PluginContext interface {
Logger() *slog.Logger
Config() PluginConfig
}
PluginContext Core 注入给插件的最小上下文:Logger + Config。 其它能力(Host 反向调用、插件专属 DB DSN 等)通过可选接口暴露。
type PluginDSNAware ¶
type PluginDSNAware interface {
// PluginDSN 返回 DSN;空字符串 = 未启用插件 DB。调用方需 nil/empty check。
PluginDSN() string
}
PluginDSNAware 可选接口:实现它表示能拿到 Core 注入的插件专属 DB DSN。 DSN 已预设 search_path 到独立 schema(plugin_<id>),核心业务表在 PostgreSQL 层被 REVOKE。
type PluginEvent ¶
type PluginEvent struct {
ID string `json:"id,omitempty"`
Type string `json:"type"`
Source string `json:"source,omitempty"`
Subject string `json:"subject,omitempty"`
UserID int64 `json:"user_id,omitempty"`
GroupID int64 `json:"group_id,omitempty"`
Payload map[string]interface{} `json:"payload,omitempty"`
Metadata map[string]string `json:"metadata,omitempty"`
OccurredAt time.Time `json:"occurred_at,omitempty"`
}
PluginEvent 是 Core 推送给插件的标准事件结构。
Payload 是事件类型相关的 JSON 对象;稳定事件应在插件 schema 中声明 payload schema。
type PluginInfo ¶
type PluginInfo struct {
ID string `json:"id"`
Name string `json:"name"`
Version string `json:"version"`
SDKVersion string `json:"sdk_version"`
Description string `json:"description"`
Author string `json:"author"`
Type PluginType `json:"type"`
Dependencies []string `json:"dependencies"`
ConfigSchema []ConfigField `json:"config_schema"`
AccountTypes []AccountType `json:"account_types"`
FrontendPages []FrontendPage `json:"frontend_pages"`
FrontendWidgets []FrontendWidget `json:"frontend_widgets"`
InstructionPresets []string `json:"instruction_presets"`
Capabilities []Capability `json:"capabilities"`
// DispatchDSL 声明插件默认的请求调度规则。Core 可在 group 级覆盖或追加,
// 并把最终选中的 DispatchPlan 回传给插件。
DispatchDSL DispatchDSL `json:"dispatch_dsl,omitempty"`
// Metadata 保存插件声明层面的非核心扩展信息。
// 只放展示、分类、市场索引等弱契约字段;需要 Core 授权或参与调度的字段必须进入显式 SDK 契约。
Metadata map[string]string `json:"metadata,omitempty"`
// Priority 仅对 type=middleware 生效:Begin 升序、End 降序(LIFO)。默认 100。
Priority int32 `json:"priority"`
}
PluginInfo 插件元信息。
type PluginSchema ¶
type PluginSchema struct {
Routes []RouteSchema `json:"routes,omitempty"`
Tasks []TaskSchema `json:"tasks,omitempty"`
Events []EventSchema `json:"events,omitempty"`
Invokes []InvokeSchema `json:"invokes,omitempty"`
Metadata map[string]string `json:"metadata,omitempty"`
}
PluginSchema 是插件的能力发现清单,用于 Core、管理后台和开发工具了解插件可用能力。
type PluginType ¶
type PluginType string
PluginType 插件扮演的角色。
gateway 上游适配器(airgate-openai / claude 等) extension 后台任务 + 自定义 HTTP 路由(airgate-health / epay 等) middleware forward 路径上的旁路拦截层(审计 / 脱敏 / 记账等)
const ( PluginTypeGateway PluginType = "gateway" PluginTypeExtension PluginType = "extension" PluginTypeMiddleware PluginType = "middleware" )
type RequestHandler ¶
type RequestHandler interface {
HandleRequest(ctx context.Context, method, path, query string, headers http.Header, body []byte) (statusCode int, respHeaders http.Header, respBody []byte, err error)
}
RequestHandler 可选:Core 将插件私有 API 请求透传给插件自行路由。
type RouteDefinition ¶
type RouteDefinition struct {
Method string `json:"method"`
Path string `json:"path"`
Description string `json:"description"`
// Metadata 保存路由展示、分类、文档链接等非核心扩展信息。
Metadata map[string]string `json:"metadata,omitempty"`
}
RouteDefinition 网关插件声明的 API 端点。
type RouteRegistrar ¶
type RouteRegistrar interface {
Handle(method, path string, handler http.HandlerFunc)
Group(prefix string) RouteRegistrar
}
RouteRegistrar 扩展插件使用的路由注册器。
type RouteSchema ¶
type RouteSchema struct {
Method string `json:"method"`
Path string `json:"path"`
Summary string `json:"summary,omitempty"`
Request PayloadSchema `json:"request,omitempty"`
Response PayloadSchema `json:"response,omitempty"`
Metadata map[string]string `json:"metadata,omitempty"`
}
RouteSchema 描述插件公开的自定义 HTTP API。
type SchemaProvider ¶
type SchemaProvider interface {
Schema() PluginSchema
}
SchemaProvider 可选接口:插件实现后可向 Core 暴露结构化能力清单。
type TaskProcessor ¶
type TaskProcessor interface {
// ProcessTask 处理一个异步任务。Context 带有超时。
ProcessTask(ctx context.Context, task HostTask) error
// TaskTypes 返回此插件能处理的任务类型列表。
TaskTypes() []string
}
TaskProcessor 可选接口:扩展插件实现它来处理 Core 分发的异步任务。
Core 在后台轮询 pending 任务,按 plugin_id 找到对应插件调用 ProcessTask。 插件内部如需回写进度,应通过 Host.Invoke 调用 Core 开放的任务方法。
使用方式:
func (p *MyPlugin) ProcessTask(ctx context.Context, task sdk.HostTask) error {
_, _ = p.host.Invoke(ctx, sdk.HostInvokeRequest{
Method: "tasks.update",
Payload: map[string]interface{}{
"task_id": task.ID,
"status": sdk.TaskStatusProcessing.String(),
"progress": 10,
},
})
// ... 执行任务逻辑 ...
_, _ = p.host.Invoke(ctx, sdk.HostInvokeRequest{
Method: "tasks.update",
Payload: map[string]interface{}{
"task_id": task.ID,
"status": sdk.TaskStatusCompleted.String(),
"output": result,
},
})
return nil
}
func (p *MyPlugin) TaskTypes() []string { return []string{"image_generation"} }
type TaskSchema ¶
type TaskSchema struct {
Type string `json:"type"`
Summary string `json:"summary,omitempty"`
Input PayloadSchema `json:"input,omitempty"`
Output PayloadSchema `json:"output,omitempty"`
Metadata map[string]string `json:"metadata,omitempty"`
}
TaskSchema 描述插件支持的异步任务类型。
type TaskStatus ¶
type TaskStatus string
const ( TaskStatusPending TaskStatus = "pending" TaskStatusProcessing TaskStatus = "processing" TaskStatusCompleted TaskStatus = "completed" TaskStatusFailed TaskStatus = "failed" TaskStatusCancelled TaskStatus = "cancelled" )
func (TaskStatus) String ¶
func (s TaskStatus) String() string
type UpstreamResponse ¶
UpstreamResponse 上游返回的原始 HTTP 快照。
语义:插件应尽量保存上游实际响应。Core 会先基于 Kind 组织调度 / failover; 最终不再重试时,若 Upstream 有可返回响应,则优先原样返回给客户端。 StreamAborted 场景 Body 通常为空(字节已经流给客户端)。
type Usage ¶
type Usage struct {
Model string `json:"model,omitempty"`
AccountCost float64 `json:"account_cost,omitempty"`
UserCost float64 `json:"user_cost,omitempty"`
BillingMultiplier float64 `json:"billing_multiplier,omitempty"`
Currency string `json:"currency,omitempty"`
Summary string `json:"summary,omitempty"`
FirstTokenMs int64 `json:"first_token_ms,omitempty"`
InputTokens int `json:"input_tokens,omitempty"`
OutputTokens int `json:"output_tokens,omitempty"`
CachedInputTokens int `json:"cached_input_tokens,omitempty"`
CacheCreationTokens int `json:"cache_creation_tokens,omitempty"`
ReasoningOutputTokens int `json:"reasoning_output_tokens,omitempty"`
ReasoningEffort string `json:"reasoning_effort,omitempty"`
InputPrice float64 `json:"input_price,omitempty"`
OutputPrice float64 `json:"output_price,omitempty"`
CachedInputPrice float64 `json:"cached_input_price,omitempty"`
CacheCreationPrice float64 `json:"cache_creation_price,omitempty"`
InputCost float64 `json:"input_cost,omitempty"`
OutputCost float64 `json:"output_cost,omitempty"`
CachedInputCost float64 `json:"cached_input_cost,omitempty"`
CacheCreationCost float64 `json:"cache_creation_cost,omitempty"`
Metadata map[string]string `json:"metadata,omitempty"`
}
Usage 是插件计算后的单次调用用量与费用结果。
只有 OutcomeSuccess 下 Usage 必填;OutcomeClientError 如果上游也计费(如部分重置 context 后仍计 token)可填;其他 Kind 下应为 nil。
平台价格、token 拆分、图片分档等标准计费规则全部由网关插件自己实现。 插件填通用 token、单价和账号成本字段;Core 只读取这些通用标量字段并按用户、 分组、模型等倍率写入自己的 usage_log 标准列。插件特有维度(如 service_tier、 Claude cache TTL 拆分、OpenAI 图片尺寸/数量/单价)放入 Metadata。
type WebAssetsProvider ¶
WebAssetsProvider 可选:插件通过此接口提供前端静态资源。