feat: 新增业务字段路径读写工具

新增 TakeBusinessFields、WriteBusinessFields、SetByPath 与 GetByPath 等工具,支持按映射路径写入请求体与解析响应,并更新相关依赖。
This commit is contained in:
2026-08-18 10:11:09 +08:00
parent 55c797dd96
commit 76c55fbb73
41 changed files with 6011 additions and 56 deletions
+45
View File
@@ -0,0 +1,45 @@
package domain
// ChatFieldsReq 对话/推理模型业务字段映射
// 适用于 推理模型(100) 和 多模态模型(500) 的子类型
type ChatFieldsReq struct {
MaxTokens string `json:"max_tokens" dc:"模型支持的最大输出 token 数"`
Stream string `json:"stream" dc:"是否流式输出"`
Tools string `json:"tools" dc:"工具"`
ToolId string `json:"tool_id" dc:"工具 ID"`
ToolPrompt string `json:"tool_prompt" dc:"工具提示词,用于描述工具的需求"`
UserPrompt string `json:"user_prompt" dc:"用户提示词,用于描述用户的需求"`
SystemPrompt string `json:"system_prompt" dc:"系统提示词,用于描述系统的需求"`
AssistantPrompt string `json:"assistant_prompt" dc:"助手提示词,用于描述助手的需求"`
ReferenceImage string `json:"reference_image" dc:"参考图片,用于生成角色形象和风格一致性参考"`
ReferenceVideo string `json:"reference_video" dc:"参考视频,用于生成动作和场景一致性参考"`
ReferenceAudio string `json:"reference_audio" dc:"参考音频,用于生成声音和风格一致性参考"`
ImgReferenceTemplate string `json:"img_reference_template" dc:"prompt 中引用参考图片的标签格式,用 %d 作为编号占位符"`
VideoReferenceTemplate string `json:"video_reference_template" dc:"prompt 中引用参考视频的标签格式,用 %d 作为编号占位符"`
AudioReferenceTemplate string `json:"audio_reference_template" dc:"prompt 中引用参考音频的标签格式,用 %d 作为编号占位符"`
}
// ChatFieldsRes 对话/推理模型业务字段映射
// 适用于 推理模型(100) 和 多模态模型(500) 的子类型
type ChatFieldsRes struct {
Tools string `json:"tools" dc:"工具"`
ReasoningContent string `json:"reasoning_content" dc:"推理内容"`
}
// VideoFields 视频模型业务字段映射
// 适用于 视频模型(600) 及其子类型
type VideoFields struct {
MinDuration string `json:"min_duration" dc:"模型支持的最小视频时长(秒)"`
MaxDuration string `json:"max_duration" dc:"模型支持的最大视频时长(秒)"`
FirstFrame string `json:"first_frame" dc:"视频的首帧/初始画面,传入一张图片作为视频第一帧画面"`
ReferenceImage string `json:"reference_image" dc:"参考图片,用于生成角色形象和风格一致性参考"`
ReferenceVideo string `json:"reference_video" dc:"参考视频,用于生成动作和场景一致性参考"`
MaxMediaItems string `json:"max_media_items" dc:"模型允许传入的最大参考媒体数量"`
ImgReferenceTemplate string `json:"img_reference_template" dc:"prompt 中引用参考图片的标签格式,用 %d 作为编号占位符"`
VideoReferenceTemplate string `json:"video_reference_template" dc:"prompt 中引用参考视频的标签格式,用 %d 作为编号占位符"`
AudioReferenceTemplate string `json:"audio_reference_template" dc:"prompt 中引用参考音频的标签格式,用 %d 作为编号占位符"`
Fps string `json:"fps" dc:"视频帧率"`
Resolution string `json:"resolution" dc:"视频分辨率,如 1920x1080"`
NegativePrompt string `json:"negative_prompt" dc:"反向提示词,描述不希望出现的内容"`
CfgScale string `json:"cfg_scale" dc:"CFG 引导比例,控制对 prompt 的遵从程度"`
}
+155
View File
@@ -0,0 +1,155 @@
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"`
}
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:"枚举值列表"`
}
+156
View File
@@ -0,0 +1,156 @@
package dto
import (
"model-gateway/consts/model"
"model-gateway/consts/public"
"model-gateway/model/entity"
"gitea.redpowerfuture.com/red-future/common/beans"
"github.com/gogf/gf/v2/frame/g"
)
// CreateModelManageReq 添加模型配置
type CreateModelManageReq struct {
g.Meta `path:"/createModelManage" method:"post" tags:"模型管理" summary:"创建模型配置" dc:"添加新的模型配置"`
ModelSupplier model.SupplierType `json:"modelSupplier" v:"required#模型供应商不能为空" dc:"模型供应商"`
ModelName string `json:"modelName" v:"required#模型名称不能为空" dc:"模型名称"`
ModelType model.ModelType `json:"modelType" v:"required#模型类型不能为空" dc:"模型类型"`
BaseURL string `json:"baseUrl" v:"required#模型服务地址不能为空" dc:"模型服务地址"`
SystemModel *bool `json:"systemModel" dc:"系统模型"`
HttpMethod string `json:"httpMethod" dc:"请求方式:GET/POST" d:"POST"`
ChatModel *bool `json:"chatModel" dc:"对话模型"`
ResponseType model.ResponseType `json:"responseType" v:"required#调用模式不能为空" dc:"调用模式:0-同步 1-异步 2-流式"`
ApiKey string `json:"apiKey" dc:"调用凭证/密钥"`
Enabled *bool `json:"enabled" dc:"启用"`
RequestHeadMapping map[string]string `json:"requestHeadMapping" dc:"请求头映射"`
RequestBodyMapping map[string]any `json:"requestBodyMapping" dc:"请求体映射"`
RequestBusinessFieldMapping map[string]string `json:"requestBusinessFieldMapping" dc:"业务字段映射"`
ResponseMapping map[string]any `json:"responseMapping" dc:"返回映射"`
ResponseBodyMapping map[string]string `json:"responseBodyMapping" dc:"返回体映射"`
ResponseBusinessFieldMapping map[string]string `json:"responseBusinessFieldMapping" dc:"业务字段映射"`
MaxConcurrency int `json:"maxConcurrency" dc:"最大并发数(默认10"`
TokenMapping *entity.TokenMapping `json:"tokenMapping" dc:"token映射"`
AsyncTaskMapping *entity.AsyncTaskMapping `json:"asyncTaskMapping" dc:"异步任务映射"`
TokenPredictPrice float64 `json:"tokenPredictPrice" dc:"模型Token预估价格"`
TokenPredictPriceUnit string `json:"tokenPredictPriceUnit" dc:"模型Token预估价格单位"`
PriceConfig *entity.PriceConfig `json:"priceConfig" dc:"计费规则"`
MaxTokens int `json:"maxTokens" dc:"最大token数"`
MinDuration int `json:"minDuration" dc:"最小时长"`
MaxDuration int `json:"maxDuration" dc:"最大时长"`
LastFrame string `json:"lastFrame" dc:"视频的尾帧图像"`
}
type CreateModelManageRes struct {
Id int64 `json:"id,string" dc:"配置ID"`
}
type UpdateModelManageReq struct {
g.Meta `path:"/updateModelManage" method:"put" tags:"模型管理" summary:"更新模型配置" dc:"更新指定ID的模型配置"`
Id int64 `json:"id" v:"required#id不能为空" dc:"配置ID"`
ModelSupplier model.SupplierType `json:"modelSupplier" dc:"模型供应商"`
ModelName string `json:"modelName" dc:"模型名称"`
ModelType model.ModelType `json:"modelType" dc:"模型类型"`
BaseURL string `json:"baseUrl" dc:"模型服务地址"`
SystemModel *bool `json:"systemModel" dc:"系统模型"`
HttpMethod string `json:"httpMethod" dc:"请求方式:GET/POST"`
ChatModel *bool `json:"chatModel" dc:"对话模型"`
ResponseType model.ResponseType `json:"responseType" dc:"调用模式:0-同步 1-异步 2-流式"`
ApiKey string `json:"apiKey" dc:"调用凭证/密钥"`
Enabled *bool `json:"enabled" dc:"启用"`
RequestHeadMapping map[string]string `json:"requestHeadMapping" dc:"请求头映射"`
RequestBodyMapping map[string]any `json:"requestBodyMapping" dc:"请求体映射"`
RequestBusinessFieldMapping map[string]string `json:"requestBusinessFieldMapping" dc:"业务字段映射"`
ResponseMapping map[string]any `json:"responseMapping" dc:"返回映射"`
ResponseBodyMapping map[string]string `json:"responseBodyMapping" dc:"返回主体映射"`
ResponseBusinessFieldMapping map[string]string `json:"responseBusinessFieldMapping" dc:"业务字段映射"`
MaxConcurrency int `json:"maxConcurrency" dc:"最大并发数(默认10"`
TokenMapping *entity.TokenMapping `json:"tokenMapping" dc:"token映射"`
AsyncTaskMapping *entity.AsyncTaskMapping `json:"asyncTaskMapping" dc:"异步任务映射"`
TokenPredictPrice float64 `json:"tokenPredictPrice" dc:"模型Token预估价格"`
TokenPredictPriceUnit string `json:"tokenPredictPriceUnit" dc:"模型Token预估价格单位"`
PriceConfig *entity.PriceConfig `json:"priceConfig" dc:"计费规则"`
MaxTokens int `json:"maxTokens" dc:"最大token数"`
MinDuration int `json:"minDuration" dc:"最小时长"`
MaxDuration int `json:"maxDuration" dc:"最大时长"`
LastFrame string `json:"lastFrame" dc:"视频的尾帧图像"`
}
type DeleteModelManageReq struct {
g.Meta `path:"/deleteModelManage" method:"delete" tags:"模型管理" summary:"删除模型配置" dc:"删除指定ID的模型配置"`
Id int64 `p:"id" json:"id,string" v:"required#id不能为空" dc:"配置ID"`
}
type GetModelManage struct {
ChatModel *bool `json:"chatModel" dc:"对话模型"`
Creator string `json:"creator" dc:"创建人"`
ModelName string `json:"modelName" dc:"模型名称"`
}
type GetModelManageReq struct {
g.Meta `path:"/getModelManage" method:"get" tags:"模型管理" summary:"获取模型配置" dc:"获取指定ID的模型配置"`
Id int64 `p:"id" json:"id,string" v:"required#id不能为空" dc:"配置ID"`
}
type GetModelManageRes struct {
ModelManage *entity.ModelManage `json:"modelManage"`
}
type GetChatModelReq struct {
g.Meta `path:"/getChatModel" method:"get" tags:"模型管理" summary:"获取聊天模型" dc:"获取聊天模型"`
}
type GetChatModelRes struct {
ModelManage *entity.ModelManage `json:"modelManage"`
}
// ListModelManageReq 配置列表
type ListModelManageReq struct {
g.Meta `path:"/listModelManage" method:"get" tags:"模型管理" summary:"模型配置列表" dc:"分页获取模型配置列表"`
*beans.Page `json:"page"`
Id int64 `p:"id" json:"id,string" dc:"配置ID"`
ModelName string `p:"modelName" json:"modelName" dc:"模型名称(模糊查询,可选)"`
ModelType model.ModelType `p:"modelType" json:"modelType" dc:"模型类型"`
IsSameType bool `p:"isSameType" json:"isSameType" dc:"是否相同类型"`
Creator string `json:"creator" dc:"创建人"`
}
type ListModelManageRes struct {
List []*entity.ModelManage `json:"list" dc:"列表数据"`
Total int `json:"total" dc:"总数"`
}
type CheckChatModelReq struct {
g.Meta `path:"/checkChatModel" method:"get" tags:"模型管理" summary:"检查是否为聊天模型" dc:"检查是否为聊天模型"`
}
type CheckChatModelRes struct {
IsChatModel bool `json:"isChatModel" dc:"是否为聊天模型"`
}
// ModelTypeReq 模型类型列表(分页)
type ModelTypeReq struct {
g.Meta `path:"/modelType" method:"get" tags:"模型管理" summary:"模型类型列表" dc:"分页获取模型类型列表"`
}
type ModelTypeRes struct {
List []*model.TypeTree `json:"list" dc:"模型类型ID到名称的映射"`
}
type ModelSupplierReq struct {
g.Meta `path:"/modelSupplier" method:"get" tags:"模型管理" summary:"获取运营商列表" dc:"获取运营商列表"`
}
type ModelSupplierRes struct {
List []*public.Option `json:"list" dc:"运营商名称到ID的映射"`
}
// BuildSchemaMappingReq 构建 Schema 映射请求
type BuildSchemaMappingReq struct {
g.Meta `path:"/buildSchemaMapping" method:"post" tags:"模型管理" summary:"自动构建 Schema 映射" dc:"根据模型类型和 Schema JSON,自动生成业务字段映射"`
ModelType int `json:"modelType" v:"required#模型类型不能为空" dc:"模型类型编码"`
Schema map[string]any `json:"schema" v:"required#Schema不能为空" dc:"模型的完整 Schema JSON"`
}
type BuildSchemaMappingRes struct {
SchemaMapping map[string]any `json:"schemaMapping" dc:"生成的 Schema 映射 JSON"`
}
+32
View File
@@ -0,0 +1,32 @@
package dto
import "model-gateway/model/entity"
type CallModelSessionReq struct {
Id int64 `json:"id" v:"required#id不能为空" dc:"任务ID"`
ModelInfo *entity.ModelManage `json:"modelInfo" dc:"模型信息"`
RequestParams map[string]any `json:"requestParams" dc:"新请求参数"`
}
// CreateModelSessionReq 创建会话
type CreateModelSessionReq struct {
ModelId int64 `json:"modelId" dc:"模型ID"`
BizName string `json:"bizName" dc:"业务名称(调用方模块/系统,用于统计)"`
SessionId string `json:"sessionId" v:"required#sessionId不能为空" dc:"会话ID"`
RequestPath string `json:"requestPath" dc:"请求参数保存路径"`
OriginalRequestPath string `json:"originalRequestPath" dc:"原始请求参数保存路径"`
}
// UpdateModelSessionReq 修改会话
type UpdateModelSessionReq struct {
Id int64 `json:"id" v:"required#id不能为空" dc:"任务ID"`
RetryCount int `json:"retryCount" dc:"重试"`
ResponsePath string `json:"responsePath" dc:"响应结果保存路径"`
OriginalResponsePath string `json:"originalResponsePath" dc:"原始响应结果保存路径"`
DurationSeconds int64 `json:"durationSeconds" dc:"耗时(秒)"`
PromptTokens int64 `json:"promptTokens" dc:"输入token"`
CompletionTokens int64 `json:"completionTokens" dc:"输出token"`
TotalTokens int64 `json:"totalTokens" dc:"总token"`
TotalCost float64 `json:"totalCost" dc:"总费用(元)"`
ErrorMsg string `json:"errorMsg" dc:"错误消息"`
}
+16
View File
@@ -0,0 +1,16 @@
package dto
type CreateModelTaskEndReq struct {
ModelId int64 `json:"modelId" dc:"模型ID"`
BizName string `json:"bizName" dc:"业务名称(调用方模块/系统,用于统计)"`
MsgTopic string `json:"msgTopic" dc:"消息主题(可选,用于后续业务通知)"`
TaskId string `json:"taskId" dc:"任务ID"`
ResponseParams map[string]any `json:"responseParams" dc:"响应结果"`
OriginalResponseParams map[string]any `json:"originalResponseParams" dc:"原始响应结果"`
DurationSeconds int64 `json:"durationSeconds" dc:"耗时(秒)"`
PromptTokens int64 `json:"promptTokens" dc:"输入token"`
CompletionTokens int64 `json:"completionTokens" dc:"输出token"`
TotalTokens int64 `json:"totalTokens" dc:"总token"`
TotalCost float64 `json:"totalCost" dc:"本次调用总费用(元),未配置计费规则为0"`
ErrorMsg string `json:"errorMsg" dc:"错误消息"`
}
+46
View File
@@ -0,0 +1,46 @@
package dto
import (
"model-gateway/model/entity"
"gitea.redpowerfuture.com/red-future/common/beans"
)
type CallModelTaskStartReq struct {
Id int64 `json:"id" v:"required#id不能为空" dc:"任务ID"`
ModelInfo *entity.ModelManage `json:"modelInfo" dc:"模型信息"`
RequestParams map[string]any `json:"requestParams" dc:"新请求参数"`
}
// CreateModelTaskStartReq 创建任务
type CreateModelTaskStartReq struct {
ModelId int64 `json:"modelId" dc:"模型ID"`
BizName string `json:"bizName" dc:"业务名称(调用方模块/系统,用于统计)"`
MsgTopic string `json:"msgTopic" dc:"消息主题(可选,用于后续业务通知)"`
RequestPath string `json:"requestPath" dc:"请求参数保存路径"`
OriginalRequestPath string `json:"originalRequestPath" dc:"原始请求参数保存路径"`
MediaType string `json:"mediaType" dc:"输入媒体类型快照(audio/no_video/has_video,创建任务时按请求体推导)"`
}
type CreateModelTaskStartRes struct {
Id int64 `json:"id" dc:"任务ID"`
}
// UpdateModelTaskStartReq 修改任务
type UpdateModelTaskStartReq struct {
Id int64 `json:"id" v:"required#id不能为空" dc:"任务ID"`
RetryCount int `json:"retryCount" dc:"重试"`
ResponseParams map[string]any `json:"responseParams" dc:"响应结果"`
OriginalResponseParams map[string]any `json:"originalResponseParams" dc:"原始响应结果"`
TaskId string `json:"taskId" dc:"任务ID"`
DurationSeconds int64 `json:"durationSeconds" dc:"耗时(秒)"`
ErrorMsg string `json:"errorMsg" dc:"错误消息"`
}
type DeleteModelTaskStartReq struct {
Id int64 `json:"id" v:"required#ids不能为空" dc:"任务ID"`
}
type GetModelTaskStartListReq struct {
Page *beans.Page `json:"page"`
}
+164
View File
@@ -0,0 +1,164 @@
package entity
import (
"model-gateway/consts/model"
"gitea.redpowerfuture.com/red-future/common/beans"
)
type modelManageCol struct {
beans.SQLBaseCol
ModelSupplier string
ModelName string
ModelType string
BaseURL string
SystemModel string
HttpMethod string
ChatModel string
ResponseType string
ApiKey string
Enabled string
RequestHeadMapping string
RequestBodyMapping string
RequestBusinessFieldMapping string
ResponseMapping string
ResponseBodyMapping string
ResponseBusinessFieldMapping string
MaxConcurrency string
TokenPredictPrice string
TokenPredictPriceUnit string
PriceConfig string
MaxTokens string
MinDuration string
MaxDuration string
LastFrame string
}
var ModelManageCol = modelManageCol{
SQLBaseCol: beans.DefSQLBaseCol,
ModelSupplier: "model_supplier",
ModelName: "model_name",
ModelType: "model_type",
BaseURL: "base_url",
SystemModel: "system_model",
HttpMethod: "http_method",
ChatModel: "chat_model",
ResponseType: "response_type",
ApiKey: "api_key",
Enabled: "enabled",
RequestHeadMapping: "request_head_mapping",
RequestBodyMapping: "request_body_mapping",
RequestBusinessFieldMapping: "request_business_field_mapping",
ResponseMapping: "response_mapping",
ResponseBodyMapping: "response_body_mapping",
ResponseBusinessFieldMapping: "response_business_field_mapping",
MaxConcurrency: "max_concurrency",
TokenPredictPrice: "token_predict_price",
TokenPredictPriceUnit: "token_predict_price_unit",
PriceConfig: "price_config",
MaxTokens: "max_tokens",
MinDuration: "min_duration",
MaxDuration: "max_duration",
LastFrame: "last_frame",
}
type ModelManage struct {
beans.SQLBaseDO `orm:",inline"`
ModelSupplier model.SupplierType `orm:"model_supplier" json:"modelSupplier" description:"模型供应商"`
ModelName string `orm:"model_name" json:"modelName" description:"模型名称"`
ModelType model.ModelType `orm:"model_type" json:"modelType" description:"模型类型"`
BaseURL string `orm:"base_url" json:"baseUrl" description:"模型地址"`
SystemModel *bool `orm:"system_model" json:"systemModel" description:"系统模型"`
HttpMethod string `orm:"http_method" json:"httpMethod" description:"http方法"`
ChatModel *bool `orm:"chat_model" json:"chatModel" description:"是否聊天模型"`
ResponseType model.ResponseType `orm:"response_type" json:"responseType" description:"返回类型:1同步,2异步,3流"`
ApiKey string `orm:"api_key" json:"apiKey" description:"api key"`
Enabled *bool `orm:"enabled" json:"enabled" description:"是否启用"`
RequestHeadMapping map[string]string `orm:"request_head_mapping" json:"requestHeadMapping" description:"请求头映射"`
RequestBodyMapping map[string]any `orm:"request_body_mapping" json:"requestBodyMapping" description:"请求体映射"`
RequestBusinessFieldMapping map[string]string `orm:"request_business_field_mapping" json:"requestBusinessFieldMapping" description:"请求业务字段映射"`
ResponseMapping map[string]any `orm:"response_mapping" json:"responseMapping" description:"响应映射"`
ResponseBodyMapping map[string]string `orm:"response_body_mapping" json:"responseBodyMapping" description:"响应主体映射"`
ResponseBusinessFieldMapping map[string]string `orm:"response_business_field_mapping" json:"responseBusinessFieldMapping" description:"响应业务字段映射"`
MaxConcurrency int `orm:"max_concurrency" json:"maxConcurrency" description:"最大并发数"`
TokenMapping *TokenMapping `orm:"token_mapping" json:"tokenMapping" description:"token映射"`
AsyncTaskMapping *AsyncTaskMapping `orm:"async_task_mapping" json:"asyncTaskMapping" description:"异步任务映射"`
TokenPredictPrice float64 `orm:"token_predict_price" json:"tokenPredictPrice" description:"模型Token预估价格"`
TokenPredictPriceUnit string `orm:"token_predict_price_unit" json:"tokenPredictPriceUnit" description:"模型token预估价格单位(秒,百万Token,千Token,字数)"`
PriceConfig *PriceConfig `orm:"price_config" json:"priceConfig" description:"计费规则"`
MaxTokens int `orm:"max_tokens" json:"maxTokens" description:"最大token数"`
MinDuration int `orm:"min_duration" json:"minDuration" description:"最小时长(秒)"`
MaxDuration int `orm:"max_duration" json:"maxDuration" description:"最大时长(秒)"`
LastFrame string `orm:"last_frame" json:"lastFrame" description:"视频的尾帧图像"`
}
type TokenMapping struct {
PromptTokens string `json:"promptTokens" dc:"输入token"`
CompletionTokens string `json:"completionTokens" dc:"输出token"`
TotalTokens string `json:"totalTokens" dc:"总token"`
}
type AsyncTaskMapping struct {
Url string `json:"url" dc:"url"`
HttpMethod string `json:"httpMethod" dc:"http方法" d:"POST"`
RequestHeadMapping map[string]string `json:"requestHeadMapping" description:"请求头映射"`
ResponseMapping map[string]any `json:"responseMapping" description:"响应映射"`
TaskId string `json:"taskId" dc:"任务id"`
TaskStatus string `json:"taskStatus" dc:"任务状态"`
TaskStatusPending string `json:"taskStatusPending" dc:"任务状态-待处理"`
TaskStatusRunning string `json:"taskStatusRunning" dc:"任务状态-运行中"`
TaskStatusSuccess string `json:"taskStatusSuccess" dc:"任务状态-成功"`
TaskStatusFailed string `json:"taskStatusFailed" dc:"任务状态-失败"`
TaskStatusCancel string `json:"taskStatusCancel" dc:"任务状态-取消"`
TaskStatusUnknown string `json:"taskStatusUnknown" dc:"任务状态-未知"`
}
// PriceConfig 模型计费规则(price_config 列,JSONB)。
// 命中条件为固定字段结构(PriceMatch):token 档位从调用用量读取,媒体类型由请求体参考媒体字段推导,
// 全部字段缺省表示无条件命中。
type PriceConfig struct {
Currency string `json:"currency" dc:"币种,默认CNY"`
Unit string `json:"unit" dc:"单价基准:per_1K-千token/per_1M-百万token/per_1-单个"`
Rules []PriceRule `json:"rules" dc:"定价规则数组,按序首条命中生效"`
Discount *PriceDiscount `json:"discount" dc:"模型级限时折扣,规则级可覆盖"`
// 单规则便捷字段:Rules 为空时的兜底价(等价于一条空 match 规则),全部为 0 时不参与计费
InputPrice float64 `json:"inputPrice,omitempty" dc:"输入单价"`
OutputPrice float64 `json:"outputPrice,omitempty" dc:"输出单价"`
CacheHitPrice float64 `json:"cacheHitPrice,omitempty" dc:"缓存命中单价"`
CacheStorageHourPrice float64 `json:"cacheStorageHourPrice,omitempty" dc:"缓存存储单价(元/小时)"`
}
// PriceRule 定价规则:match 条件命中后按价格项计价,缺省项视为 0
type PriceRule struct {
Name string `json:"name"`
Match *PriceMatch `json:"match,omitempty" dc:"命中条件(固定字段,见 PriceMatch);空表示任意调用"`
Input float64 `json:"input" dc:"输入单价(非音频)"`
InputAudio float64 `json:"inputAudio,omitempty" dc:"输入单价(音频),请求体 reference_audio 参考媒体字段命中时生效(见 DetectMediaType"`
Output float64 `json:"output" dc:"输出单价"`
CacheHit float64 `json:"cacheHit" dc:"缓存命中单价(非音频)"`
CacheHitAudio float64 `json:"cacheHitAudio,omitempty" dc:"缓存命中单价(音频),请求体 reference_audio 参考媒体字段命中时生效(见 DetectMediaType"`
CacheStorageHour float64 `json:"cacheStorageHour" dc:"缓存存储单价(元/小时)"`
Discount *PriceDiscount `json:"discount" dc:"规则级折扣,覆盖模型级折扣"`
}
// PriceMatch 命中条件:字段对应调用上下文固定路径,全部缺省(空值)表示无条件命中任意调用。
// token 档位(InputLength/OutputLength/TotalLength/CachedTokens)从调用用量读取,
// MediaType 由请求体参考媒体字段推导(见 DetectMediaType)。
type PriceMatch struct {
MediaType string `json:"mediaType,omitempty" dc:"输入媒体类型精确值(audio/no_video/has_video,由请求体参考媒体字段推导)"`
InputLengthMax int64 `json:"inputLengthMax,omitempty" dc:"输入token上限(<=usage.prompt_tokens"`
InputLengthMin int64 `json:"inputLengthMin,omitempty" dc:"输入token下限(>=usage.prompt_tokens"`
OutputLengthMax int64 `json:"outputLengthMax,omitempty" dc:"输出token上限(<=usage.completion_tokens"`
OutputLengthMin int64 `json:"outputLengthMin,omitempty" dc:"输出token下限(>=usage.completion_tokens"`
TotalLengthMax int64 `json:"totalLengthMax,omitempty" dc:"总token上限(<=usage.total_tokens"`
TotalLengthMin int64 `json:"totalLengthMin,omitempty" dc:"总token下限(>=usage.total_tokens"`
CachedTokensMax int64 `json:"cachedTokensMax,omitempty" dc:"缓存命中token上限(<=usage.cached_tokens"`
CachedTokensMin int64 `json:"cachedTokensMin,omitempty" dc:"缓存命中token下限(>=usage.cached_tokens"`
}
// PriceDiscount 限时折扣:rate 为折扣率(0.4=4折),effective 为空数组表示长期有效
type PriceDiscount struct {
Rate float64 `json:"rate" dc:"折扣率"`
Effective [2]string `json:"effective" dc:"有效期[起始,截止],格式YYYY-MM-DD,缺省长期有效"`
}
+60
View File
@@ -0,0 +1,60 @@
package entity
import (
"gitea.redpowerfuture.com/red-future/common/beans"
)
type modelSessionCol struct {
beans.SQLBaseCol
ModelId string
BizName string
SessionId string
RetryCount string
RequestPath string
ResponsePath string
OriginalRequestPath string
OriginalResponsePath string
DurationSeconds string
PromptTokens string
CompletionTokens string
TotalTokens string
TotalCost string
ErrorMsg string
}
var ModelSessionCol = modelSessionCol{
SQLBaseCol: beans.DefSQLBaseCol,
ModelId: "model_id",
BizName: "biz_name",
SessionId: "session_id",
RetryCount: "retry_count",
RequestPath: "request_path",
ResponsePath: "response_path",
OriginalRequestPath: "original_request_path",
OriginalResponsePath: "original_response_path",
DurationSeconds: "duration_seconds",
PromptTokens: "prompt_tokens",
CompletionTokens: "completion_tokens",
TotalTokens: "total_tokens",
TotalCost: "total_cost",
ErrorMsg: "error_msg",
}
// ModelSession 模型网关任务
type ModelSession struct {
beans.SQLBaseDO `orm:",inline"`
ModelId int64 `orm:"model_id" json:"modelId" dc:"模型ID"`
BizName string `orm:"biz_name" json:"bizName" dc:"业务名称"`
SessionId string `orm:"session_id" json:"sessionId" dc:"会话ID"`
RetryCount int `orm:"retry_count" json:"retryCount" dc:"重试"`
RequestPath string `orm:"request_path" json:"requestPath" dc:"请求参数保存路径"`
ResponsePath string `orm:"response_path" json:"responsePath" dc:"响应结果保存路径"`
OriginalRequestPath string `orm:"original_request_path" json:"originalRequestPath" dc:"原始请求参数保存路径"`
OriginalResponsePath string `orm:"original_response_path" json:"originalResponsePath" dc:"原始响应结果保存路径"`
DurationSeconds int64 `orm:"duration_seconds" json:"durationSeconds" dc:"耗时(秒)"`
PromptTokens int64 `orm:"prompt_tokens" json:"promptTokens" dc:"输入token"`
CompletionTokens int64 `orm:"completion_tokens" json:"completionTokens" dc:"输出token"`
TotalTokens int64 `orm:"total_tokens" json:"totalTokens" dc:"总token"`
TotalCost float64 `orm:"total_cost" json:"totalCost" dc:"总费用(元)"`
ErrorMsg string `orm:"error_msg" json:"errorMsg" dc:"错误消息"`
}
+57
View File
@@ -0,0 +1,57 @@
package entity
import (
"gitea.redpowerfuture.com/red-future/common/beans"
)
type modelTaskEndCol struct {
beans.SQLBaseCol
ModelId string
BizName string
MsgTopic string
RetryCount string
ResponseParams string
OriginalResponseParams string
DurationSeconds string
TaskId string
PromptTokens string
CompletionTokens string
TotalTokens string
TotalCost string
ErrorMsg string
}
var ModelTaskEndCol = modelTaskEndCol{
SQLBaseCol: beans.DefSQLBaseCol,
ModelId: "model_id",
BizName: "biz_name",
MsgTopic: "msg_topic",
RetryCount: "retry_count",
ResponseParams: "response_params",
OriginalResponseParams: "original_response_params",
DurationSeconds: "duration_seconds",
TaskId: "task_id",
PromptTokens: "prompt_tokens",
CompletionTokens: "completion_tokens",
TotalTokens: "total_tokens",
TotalCost: "total_cost",
ErrorMsg: "error_msg",
}
// ModelTaskEnd 模型网关任务
type ModelTaskEnd struct {
beans.SQLBaseDO `orm:",inline"`
ModelId int64 `orm:"model_id" json:"modelId" dc:"模型ID"`
BizName string `orm:"biz_name" json:"bizName" dc:"业务名称"`
MsgTopic string `orm:"msg_topic" json:"msgTopic" dc:"消息主题"`
RetryCount int `orm:"retry_count" json:"retryCount" dc:"重试"`
ResponseParams string `orm:"response_params" json:"responseParams" dc:"响应结果"`
OriginalResponseParams string `orm:"original_response_params" json:"originalResponseParams" dc:"原始响应结果"`
DurationSeconds int64 `orm:"duration_seconds" json:"durationSeconds" dc:"耗时(秒)"`
TaskId string `orm:"task_id" json:"taskId" dc:"任务ID"`
PromptTokens int64 `orm:"prompt_tokens" json:"promptTokens" dc:"输入token"`
CompletionTokens int64 `orm:"completion_tokens" json:"completionTokens" dc:"输出token"`
TotalTokens int64 `orm:"total_tokens" json:"totalTokens" dc:"总token"`
TotalCost float64 `orm:"total_cost" json:"totalCost" dc:"本次调用总费用(元),未配置计费规则为0"`
ErrorMsg string `orm:"error_msg" json:"errorMsg" dc:"错误消息"`
}
+54
View File
@@ -0,0 +1,54 @@
package entity
import (
"gitea.redpowerfuture.com/red-future/common/beans"
)
type modelTaskStartCol struct {
beans.SQLBaseCol
ModelId string
BizName string
MsgTopic string
RetryCount string
RequestPath string
OriginalRequestPath string
ResponseParams string
OriginalResponseParams string
DurationSeconds string
TaskId string
MediaType string
ErrorMsg string
}
var ModelTaskStartCol = modelTaskStartCol{
SQLBaseCol: beans.DefSQLBaseCol,
ModelId: "model_id",
BizName: "biz_name",
MsgTopic: "msg_topic",
RetryCount: "retry_count",
RequestPath: "request_path",
OriginalRequestPath: "original_request_path",
ResponseParams: "response_params",
OriginalResponseParams: "original_response_params",
DurationSeconds: "duration_seconds",
TaskId: "task_id",
MediaType: "media_type",
ErrorMsg: "error_msg",
}
// ModelTaskStart 模型网关任务
type ModelTaskStart struct {
beans.SQLBaseDO `orm:",inline"`
ModelId int64 `orm:"model_id" json:"modelId" dc:"模型ID"`
BizName string `orm:"biz_name" json:"bizName" dc:"业务名称"`
MsgTopic string `orm:"msg_topic" json:"msgTopic" dc:"消息主题"`
RetryCount int `orm:"retry_count" json:"retryCount" dc:"重试"`
RequestPath string `orm:"request_path" json:"requestPath" dc:"请求参数保存路径"`
OriginalRequestPath string `orm:"original_request_path" json:"originalRequestPath" dc:"原始请求参数保存路径"`
ResponseParams map[string]any `orm:"response_params" json:"responseParams" dc:"响应结果"`
OriginalResponseParams map[string]any `orm:"original_response_params" json:"originalResponseParams" dc:"原始响应结果"`
DurationSeconds int64 `orm:"duration_seconds" json:"durationSeconds" dc:"耗时(秒)"`
TaskId string `orm:"task_id" json:"taskId" dc:"任务ID"`
MediaType string `orm:"media_type" json:"mediaType" dc:"输入媒体类型快照(audio/no_video/has_video,创建任务时按请求体推导)"`
ErrorMsg string `orm:"error_msg" json:"errorMsg" dc:"错误消息"`
}