Files
model-gateway/model/dto/model_call_dto.go
T
19904408334 9d9bd71468 fix: 优化模型网关请求重试与业务字段前置写入
- 流式调用增加可重试错误码检测与指数退避重试
- 业务字段写入改为前置追加,不覆盖已有值
- 请求体按模板元数据递归合并,补充数组/对象字段处理
- 异步任务查询支持请求体映射与占位符替换
- 升级 common 与 gmq 依赖版本,移除本地 replace
2026-08-21 09:47:21 +08:00

161 lines
7.3 KiB
Go

package dto
import (
"model-gateway/consts/task"
"github.com/gogf/gf/v2/frame/g"
)
// ModelCallReq 模型调用请求
type ModelCallReq struct {
g.Meta `path:"/modelCall" method:"post" tags:"模型管理" summary:"模型调用" dc:"模型调用"`
ModelId int64 `json:"modelId" v:"required#modelId不能为空" dc:"模型ID"`
BizName string `json:"bizName" dc:"业务名称(调用方模块/系统,用于统计)"`
SessionId string `json:"sessionId" v:"required#sessionId不能为空" dc:"会话ID"`
RequestParams map[string]any `json:"requestParams" dc:"请求参数(模板字段)"`
BusinessParams map[string]any `json:"businessParams" dc:"业务参数(按业务字段名传,按 RequestBusinessFieldMapping 写入请求体)"`
MsgTopic string `json:"msgTopic" dc:"消息主题(异步必要参数)"`
}
type ModelCallRes struct {
TaskId int64 `json:"id" dc:"任务ID"`
State task.Status `json:"state" dc:"状态"`
TotalTokens int64 `json:"totalTokens" dc:"总token"`
PromptTokens int64 `json:"promptTokens" dc:"输入token"`
CompletionTokens int64 `json:"completionTokens" dc:"输出token"`
Tools []ModelTool `json:"tools" dc:"工具"`
ReasoningContent string `json:"reasoningContent" dc:"思考内容"`
Content map[string]any `json:"content" dc:"内容"`
Cost float64 `json:"cost" dc:"费用(元)"`
ErrorMsg string `json:"errorMsg" dc:"错误消息"`
}
type ModelTool struct {
Id string `json:"id" dc:"工具ID"`
Type string `json:"type" dc:"工具类型"`
Function struct {
Name string `json:"name"`
Arguments string `json:"arguments"`
} `json:"function"`
}
// ModelCallStreamEvent 流式增量事件(SSE data 行)。文本增量事件省略 Type,
// 流末 done 事件带 Type="done" 与 Tools。字段名由本结构体 json tag 统一管理。
type ModelCallStreamEvent struct {
Type string `json:"type,omitempty"`
Content map[string]any `json:"content,omitempty"`
ReasoningContent string `json:"reasoningContent,omitempty"`
TotalTokens int64 `json:"totalTokens,omitempty"`
PromptTokens int64 `json:"promptTokens,omitempty"`
CompletionTokens int64 `json:"completionTokens,omitempty"`
Tools []ModelTool `json:"tools,omitempty"`
Cost float64 `json:"cost,omitempty" dc:"费用(元),done事件携带最终费用,增量事件不带"`
}
// ModelCallStreamReq 模型调用流式请求
type ModelCallStreamReq struct {
g.Meta `path:"/modelCallStream" method:"post" tags:"模型管理" summary:"模型调用流式" dc:"模型调用流式"`
ModelId int64 `json:"modelId" v:"required#modelId不能为空" dc:"模型ID"`
BizName string `json:"bizName" dc:"业务名称(调用方模块/系统,用于统计)"`
SessionId string `json:"sessionId" v:"required#sessionId不能为空" dc:"会话ID"`
RequestParams map[string]any `json:"requestParams" dc:"请求参数(模板字段)"`
BusinessParams map[string]any `json:"businessParams" dc:"业务参数(按业务字段名传,按 RequestBusinessFieldMapping 写入请求体)"`
}
var ModelErrorResp struct {
Error struct {
Code string `json:"code"`
Message string `json:"message"`
} `json:"error"`
}
var ModelError1Resp struct {
Code int `json:"code"`
Message string `json:"message"`
}
type ModelMsg struct {
TaskID int64 `json:"id" dc:"任务ID"`
State task.Status `json:"state" dc:"状态"`
TotalTokens int64 `json:"totalTokens" dc:"总token"`
PromptTokens int64 `json:"promptTokens" dc:"输入token"`
CompletionTokens int64 `json:"completionTokens" dc:"输出token"`
Content map[string]any `json:"content" dc:"内容"`
Cost float64 `json:"cost" dc:"费用(元)"`
ErrorMsg string `json:"errorMsg" dc:"错误消息"`
}
//========================
// Upload 文件上传定义
//========================
// UploadFileBytesReq 上传文件请求(字节流)
type UploadFileBytesReq struct {
FileName string `json:"fileName" dc:"文件名"`
FileBytes []byte `json:"fileBytes" dc:"文件字节流"`
FileStoreURL string `json:"fileStoreURL" dc:"文件存储URL"`
}
type UploadFileBytesRes struct {
FileURL string `json:"fileURL" dc:"上传地址"`
FileSize int `json:"fileSize" dc:"文件大小"`
FileName string `json:"fileName" dc:"文件名称"`
FileFormat string `json:"fileFormat" dc:"文件格式"`
FileAddressPrefix string `json:"fileAddressPrefix"`
}
// ===========================
// Template 元数据模板定义
// ===========================
// UploadRule 上传文件规则
type UploadRule struct {
Format string `json:"format" dc:"格式"`
MaxSize int `json:"maxSize" dc:"最大大小"`
MaxCount int `json:"maxCount" dc:"最大数量"`
}
// Constraint 字段约束
type Constraint struct {
// 数字类型:int、float、double
NumberType string `json:"numberType" dc:"数字类型"`
Min any `json:"min" dc:"最小值"`
Max any `json:"max" dc:"最大值"`
// 字符串类型:string、text
MinLength int `json:"minLength" dc:"最小长度"`
MaxLength int `json:"maxLength" dc:"最大长度"`
Pattern string `json:"pattern" dc:"正则"`
// 上传文件类型
UploadTotalMaxCount int `json:"uploadTotalMaxCount" dc:"上传文件最大数量"`
UploadTotalMaxSize int `json:"uploadTotalMaxSize" dc:"上传文件最大大小"`
UploadRules []UploadRule `json:"uploadRules" dc:"上传文件规则"`
}
// SelectOptionT 选择框选项
type SelectOptionT struct {
Label string `json:"label" dc:"展示标签"`
Value any `json:"value" dc:"选项值"`
}
// Template 元数据模板结构体
// 用于描述单个字段的元数据,包括类型、值、默认值、校验规则等
type Template struct {
Type string `json:"type" dc:"类型:string/boolean/number/object/array/null"`
Value any `json:"value" dc:"值"`
DefaultValue any `json:"defaultValue" dc:"默认值"`
Required bool `json:"required" dc:"是否必填"`
FieldType string `json:"fieldType" dc:"字段类型(输入框/选择框/多行文本/数字输入等)"`
Attrs any `json:"attrs" dc:"子字段(object/array时使用)"`
IsContainer bool `json:"isContainer" dc:"是否为容器"`
LinkRules []map[string]string `json:"linkRules" dc:"链接规则"`
Label string `json:"label" dc:"展示标签"`
Loop bool `json:"loop" dc:"是否为循环"`
IsForm bool `json:"isForm" dc:"是否为表单"`
Constraint Constraint `json:"constraint" dc:"字段约束"`
Options []SelectOptionT `json:"options" dc:"选项列表(字段类型为选择框时使用)"`
FieldConstraint string `json:"fieldConstraint" dc:"字段额外约束"`
EnumValues []any `json:"enumValues" dc:"枚举值列表"`
}