refactor(model): 重构模型网关实体和映射逻辑

This commit is contained in:
2026-06-12 17:50:22 +08:00
parent b3b111995e
commit 445ee02c5a
5 changed files with 152 additions and 162 deletions

View File

@@ -22,13 +22,13 @@ import (
// ParseAndValidate 解析并校验结果 // ParseAndValidate 解析并校验结果
func ParseAndValidate(raw map[string]any, model *entity.ModelGatewayModel) (map[string]any, error) { func ParseAndValidate(raw map[string]any, model *entity.ModelGatewayModel) (map[string]any, error) {
// 1) 解析 content 字符串为 rounds 数组 // 1) 解析 content 字符串为 rounds 数组
contentVal, ok := raw[model.ResponseBody] contentVal, ok := raw[entity.ResponseBody]
if !ok { if !ok {
return raw, fmt.Errorf("字段 %s 不存在", model.ResponseBody) return raw, fmt.Errorf("字段 %s 不存在", entity.ResponseBody)
} }
contentStr, ok := contentVal.(string) contentStr, ok := contentVal.(string)
if !ok || strings.TrimSpace(contentStr) == "" { if !ok || strings.TrimSpace(contentStr) == "" {
return raw, fmt.Errorf("字段 %s 为空或不是字符串", model.ResponseBody) return raw, fmt.Errorf("字段 %s 为空或不是字符串", entity.ResponseBody)
} }
var arr []any var arr []any
if err := json.Unmarshal([]byte(contentStr), &arr); err != nil { if err := json.Unmarshal([]byte(contentStr), &arr); err != nil {

View File

@@ -9,36 +9,34 @@ import (
// CreateModelReq 添加模型配置 // CreateModelReq 添加模型配置
type CreateModelReq struct { type CreateModelReq struct {
g.Meta `path:"/createModel" method:"post" tags:"模型管理" summary:"创建模型配置" dc:"添加新的模型配置"` g.Meta `path:"/createModel" method:"post" tags:"模型管理" summary:"创建模型配置" dc:"添加新的模型配置"`
ModelName string `p:"modelName" json:"modelName" v:"required#模型名称不能为空" dc:"模型名称(唯一标识)"` ModelName string `p:"modelName" json:"modelName" v:"required#模型名称不能为空" dc:"模型名称(唯一标识)"`
ModelType int `p:"modelType" json:"modelType" v:"required#模型类型不能为空" dc:"模型类型"` ModelType int `p:"modelType" json:"modelType" v:"required#模型类型不能为空" dc:"模型类型"`
BaseURL string `p:"baseUrl" json:"baseUrl" v:"required#模型地址不能为空" dc:"模型服务地址"` BaseURL string `p:"baseUrl" json:"baseUrl" v:"required#模型地址不能为空" dc:"模型服务地址"`
HttpMethod string `p:"httpMethod" json:"httpMethod" dc:"请求方式GET/POST默认POST"` HttpMethod string `p:"httpMethod" json:"httpMethod" dc:"请求方式GET/POST默认POST"`
HeadMsg map[string]any `p:"headMsg" json:"headMsg" dc:"请求头JSON结构"` HeadMsg map[string]any `p:"headMsg" json:"headMsg" dc:"请求头JSON结构"`
IsPrivate *int `p:"isPrivate" json:"isPrivate" dc:"是否私有化0-私有 1-公共"` IsPrivate *int `p:"isPrivate" json:"isPrivate" dc:"是否私有化0-私有 1-公共"`
Enabled *int `p:"enabled" json:"enabled" dc:"是否启用0-停用 1-启用"` Enabled *int `p:"enabled" json:"enabled" dc:"是否启用0-停用 1-启用"`
IsChatModel *int `p:"isChatModel" json:"isChatModel" dc:"是否为对话模型0-否 1-是"` IsChatModel *int `p:"isChatModel" json:"isChatModel" dc:"是否为对话模型0-否 1-是"`
CallModel *int `p:"callModel" json:"callModel" dc:"调用模式0-同步 1-异步 2-流式"` CallModel *int `p:"callModel" json:"callModel" dc:"调用模式0-同步 1-异步 2-流式"`
RequiredFields []string `p:"requiredFields" json:"requiredFields" dc:"必填字段"` RequiredFields []string `p:"requiredFields" json:"requiredFields" dc:"必填字段"`
IsOwner *int `p:"isOwner" json:"isOwner" dc:"是否为所有者0-否 1-是"` IsOwner *int `p:"isOwner" json:"isOwner" dc:"是否为所有者0-否 1-是"`
ApiKey string `p:"apiKey" json:"apiKey" dc:"调用凭证/密钥"` ApiKey string `p:"apiKey" json:"apiKey" dc:"调用凭证/密钥"`
Form []map[string]any `p:"form" json:"form" dc:"动态表单配置"` Form []map[string]any `p:"form" json:"form" dc:"动态表单配置"`
RequestMapping map[string]any `p:"requestMapping" json:"requestMapping" dc:"请求映射"` RequestMapping map[string]any `p:"requestMapping" json:"requestMapping" dc:"请求映射"`
ResponseMapping map[string]any `p:"responseMapping" json:"responseMapping" dc:"返回映射"` ResponseMapping map[string]any `p:"responseMapping" json:"responseMapping" dc:"返回映射"`
ResponseBody string `p:"responseBody" json:"responseBody" dc:"返回主体"` OperatorName string `p:"operatorName" json:"operatorName" dc:"运营商名称"`
ResponseTokenField string `p:"responseTokenField" json:"responseTokenField" dc:"响应中消耗token的字段映射"` TokenConfig map[string]any `p:"tokenConfig" json:"tokenConfig" dc:"token计算配置"`
OperatorName string `p:"operatorName" json:"operatorName" dc:"运营商名称"` ExtendMapping map[string]any `p:"extendMapping" json:"extendMapping" dc:"附加映射"`
TokenConfig map[string]any `p:"tokenConfig" json:"tokenConfig" dc:"token计算配置"` QueryConfig map[string]any `p:"queryConfig" json:"queryConfig" dc:"查询/回调配置"`
ExtendMapping map[string]any `p:"extendMapping" json:"extendMapping" dc:"附加映射"` StreamConfig map[string]any `p:"streamConfig" json:"streamConfig" dc:"流式输出配置"`
QueryConfig map[string]any `p:"queryConfig" json:"queryConfig" dc:"查询/回调配置"` FirstFrame string `p:"firstFrame" json:"firstFrame" dc:"首帧图片参数"`
StreamConfig map[string]any `p:"streamConfig" json:"streamConfig" dc:"流式输出配置"` LastFrame string `p:"lastFrame" json:"lastFrame" dc:"尾帧图片参数"`
FirstFrame string `p:"firstFrame" json:"firstFrame" dc:"首帧图片参数"` MaxConcurrency int `p:"maxConcurrency" json:"maxConcurrency" dc:"最大并发数默认10"`
LastFrame string `p:"lastFrame" json:"lastFrame" dc:"尾帧图片参数"` TimeoutSeconds int `p:"timeoutSeconds" json:"timeoutSeconds" dc:"请求超时时间默认600"`
MaxConcurrency int `p:"maxConcurrency" json:"maxConcurrency" dc:"最大并发数(默认10"` RetryTimes int `p:"retryTimes" json:"retryTimes" dc:"失败重试次数(默认3"`
TimeoutSeconds int `p:"timeoutSeconds" json:"timeoutSeconds" dc:"请求超时时间(秒,默认600"` AutoCleanSeconds int `p:"autoCleanSeconds" json:"autoCleanSeconds" dc:"任务完成后自动清理时间(秒,默认86400"`
RetryTimes int `p:"retryTimes" json:"retryTimes" dc:"失败重试次数默认3"` CallbackUrl string `p:"callbackUrl" json:"callbackUrl" dc:"回调地址"`
AutoCleanSeconds int `p:"autoCleanSeconds" json:"autoCleanSeconds" dc:"任务完成后自动清理时间默认86400"`
CallbackUrl string `p:"callbackUrl" json:"callbackUrl" dc:"回调地址"`
} }
type CreateModelRes struct { type CreateModelRes struct {
@@ -46,37 +44,35 @@ type CreateModelRes struct {
} }
type UpdateModelReq struct { type UpdateModelReq struct {
g.Meta `path:"/updateModel" method:"put" tags:"模型管理" summary:"更新模型配置" dc:"更新指定ID的模型配置"` g.Meta `path:"/updateModel" method:"put" tags:"模型管理" summary:"更新模型配置" dc:"更新指定ID的模型配置"`
ID int64 `p:"id" json:"id" v:"required#id不能为空" dc:"配置ID"` ID int64 `p:"id" json:"id" v:"required#id不能为空" dc:"配置ID"`
ModelName string `p:"modelName" json:"modelName" dc:"模型名称"` ModelName string `p:"modelName" json:"modelName" dc:"模型名称"`
ModelType int `p:"modelType" json:"modelType" dc:"模型类型"` ModelType int `p:"modelType" json:"modelType" dc:"模型类型"`
BaseURL string `p:"baseUrl" json:"baseUrl" dc:"模型服务地址"` BaseURL string `p:"baseUrl" json:"baseUrl" dc:"模型服务地址"`
HttpMethod string `p:"httpMethod" json:"httpMethod" dc:"请求方式GET/POST"` HttpMethod string `p:"httpMethod" json:"httpMethod" dc:"请求方式GET/POST"`
HeadMsg map[string]any `p:"headMsg" json:"headMsg" dc:"请求头JSON结构"` HeadMsg map[string]any `p:"headMsg" json:"headMsg" dc:"请求头JSON结构"`
IsPrivate *int `p:"isPrivate" json:"isPrivate" dc:"是否私有化0-私有 1-公共"` IsPrivate *int `p:"isPrivate" json:"isPrivate" dc:"是否私有化0-私有 1-公共"`
Enabled *int `p:"enabled" json:"enabled" dc:"是否启用0-停用 1-启用"` Enabled *int `p:"enabled" json:"enabled" dc:"是否启用0-停用 1-启用"`
IsChatModel *int `p:"isChatModel" json:"isChatModel" dc:"是否为对话模型0-否 1-是"` IsChatModel *int `p:"isChatModel" json:"isChatModel" dc:"是否为对话模型0-否 1-是"`
CallModel *int `p:"callModel" json:"callModel" dc:"调用模式0-同步 1-异步 2-流式"` CallModel *int `p:"callModel" json:"callModel" dc:"调用模式0-同步 1-异步 2-流式"`
RequiredFields []string `p:"requiredFields" json:"requiredFields" dc:"必填字段"` RequiredFields []string `p:"requiredFields" json:"requiredFields" dc:"必填字段"`
IsOwner *int `p:"isOwner" json:"isOwner" dc:"是否为所有者0-否 1-是"` IsOwner *int `p:"isOwner" json:"isOwner" dc:"是否为所有者0-否 1-是"`
ApiKey string `p:"apiKey" json:"apiKey" dc:"调用凭证/密钥"` ApiKey string `p:"apiKey" json:"apiKey" dc:"调用凭证/密钥"`
Form []map[string]any `p:"form" json:"form" dc:"动态表单配置"` Form []map[string]any `p:"form" json:"form" dc:"动态表单配置"`
RequestMapping map[string]any `p:"requestMapping" json:"requestMapping" dc:"请求映射"` RequestMapping map[string]any `p:"requestMapping" json:"requestMapping" dc:"请求映射"`
ResponseMapping map[string]any `p:"responseMapping" json:"responseMapping" dc:"返回映射"` ResponseMapping map[string]any `p:"responseMapping" json:"responseMapping" dc:"返回映射"`
ResponseBody string `p:"responseBody" json:"responseBody" dc:"返回主体"` OperatorName string `p:"operatorName" json:"operatorName" dc:"运营商名称"`
ResponseTokenField string `p:"responseTokenField" json:"responseTokenField" dc:"响应中消耗token的字段映射"` TokenConfig map[string]any `p:"tokenConfig" json:"tokenConfig" dc:"token计算配置"`
OperatorName string `p:"operatorName" json:"operatorName" dc:"运营商名称"` ExtendMapping map[string]any `p:"extendMapping" json:"extendMapping" dc:"附加映射"`
TokenConfig map[string]any `p:"tokenConfig" json:"tokenConfig" dc:"token计算配置"` QueryConfig map[string]any `p:"queryConfig" json:"queryConfig" dc:"查询/回调配置"`
ExtendMapping map[string]any `p:"extendMapping" json:"extendMapping" dc:"附加映射"` StreamConfig map[string]any `p:"streamConfig" json:"streamConfig" dc:"流式输出配置"`
QueryConfig map[string]any `p:"queryConfig" json:"queryConfig" dc:"查询/回调配置"` FirstFrame string `p:"firstFrame" json:"firstFrame" dc:"首帧图片参数"`
StreamConfig map[string]any `p:"streamConfig" json:"streamConfig" dc:"流式输出配置"` LastFrame string `p:"lastFrame" json:"lastFrame" dc:"尾帧图片参数"`
FirstFrame string `p:"firstFrame" json:"firstFrame" dc:"首帧图片参数"` MaxConcurrency int `p:"maxConcurrency" json:"maxConcurrency" dc:"最大并发数"`
LastFrame string `p:"lastFrame" json:"lastFrame" dc:"尾帧图片参数"` TimeoutSeconds int `p:"timeoutSeconds" json:"timeoutSeconds" dc:"请求超时时间(秒)"`
MaxConcurrency int `p:"maxConcurrency" json:"maxConcurrency" dc:"最大并发数"` RetryTimes int `p:"retryTimes" json:"retryTimes" dc:"失败重试次数"`
TimeoutSeconds int `p:"timeoutSeconds" json:"timeoutSeconds" dc:"请求超时时间(秒)"` AutoCleanSeconds int `p:"autoCleanSeconds" json:"autoCleanSeconds" dc:"任务完成后自动清理时间(秒)"`
RetryTimes int `p:"retryTimes" json:"retryTimes" dc:"失败重试次数"` CallbackUrl string `p:"callbackUrl" json:"callbackUrl" dc:"回调地址"`
AutoCleanSeconds int `p:"autoCleanSeconds" json:"autoCleanSeconds" dc:"任务完成后自动清理时间(秒)"`
CallbackUrl string `p:"callbackUrl" json:"callbackUrl" dc:"回调地址"`
} }
type UpdateModelRes struct { type UpdateModelRes struct {

View File

@@ -4,99 +4,96 @@ import "gitea.redpowerfuture.com/red-future/common/beans"
type modelGatewayModelCol struct { type modelGatewayModelCol struct {
beans.SQLBaseCol beans.SQLBaseCol
ModelName string ModelName string
ModelType string ModelType string
BaseURL string BaseURL string
HttpMethod string HttpMethod string
HeadMsg string HeadMsg string
FormJSON string FormJSON string
RequestMapping string RequestMapping string
ResponseMapping string ResponseMapping string
ResponseBody string ResponseBody string
ResponseTokenField string RequiredFields string
RequiredFields string IsPrivate string
IsPrivate string IsChatModel string
IsChatModel string CallMode string
CallMode string ApiKey string
ApiKey string Enabled string
Enabled string MaxConcurrency string
MaxConcurrency string TimeoutSeconds string
TimeoutSeconds string RetryTimes string
RetryTimes string AutoCleanSeconds string
AutoCleanSeconds string IsOwner string
IsOwner string OperatorName string
OperatorName string TokenConfig string
TokenConfig string ExtendMapping string
ExtendMapping string QueryConfig string
QueryConfig string StreamConfig string
StreamConfig string FirstFrame string
FirstFrame string LastFrame string
LastFrame string
MaxTokens string
} }
var ModelGatewayModelCol = modelGatewayModelCol{ var ModelGatewayModelCol = modelGatewayModelCol{
SQLBaseCol: beans.DefSQLBaseCol, SQLBaseCol: beans.DefSQLBaseCol,
ModelName: "model_name", ModelName: "model_name",
ModelType: "model_type", ModelType: "model_type",
BaseURL: "base_url", BaseURL: "base_url",
HttpMethod: "http_method", HttpMethod: "http_method",
HeadMsg: "head_msg", HeadMsg: "head_msg",
FormJSON: "form_json", FormJSON: "form_json",
RequestMapping: "request_mapping", RequestMapping: "request_mapping",
ResponseMapping: "response_mapping", ResponseMapping: "response_mapping",
ResponseBody: "response_body", RequiredFields: "required_fields",
ResponseTokenField: "response_token_field", IsPrivate: "is_private",
RequiredFields: "required_fields", IsChatModel: "is_chat_model",
IsPrivate: "is_private", CallMode: "call_mode",
IsChatModel: "is_chat_model", ApiKey: "api_key",
CallMode: "call_mode", Enabled: "enabled",
ApiKey: "api_key", MaxConcurrency: "max_concurrency",
Enabled: "enabled", TimeoutSeconds: "timeout_seconds",
MaxConcurrency: "max_concurrency", RetryTimes: "retry_times",
TimeoutSeconds: "timeout_seconds", AutoCleanSeconds: "auto_clean_seconds",
RetryTimes: "retry_times", IsOwner: "is_owner",
AutoCleanSeconds: "auto_clean_seconds", OperatorName: "operator_name",
IsOwner: "is_owner", TokenConfig: "token_config",
OperatorName: "operator_name", ExtendMapping: "extend_mapping",
TokenConfig: "token_config", QueryConfig: "query_config",
ExtendMapping: "extend_mapping", StreamConfig: "stream_config",
QueryConfig: "query_config", FirstFrame: "first_frame",
StreamConfig: "stream_config", LastFrame: "last_frame",
FirstFrame: "first_frame",
LastFrame: "last_frame",
MaxTokens: "max_tokens",
} }
type ModelGatewayModel struct { type ModelGatewayModel struct {
beans.SQLBaseDO `orm:",inline"` beans.SQLBaseDO `orm:",inline"`
ModelName string `orm:"model_name" json:"modelName"` ModelName string `orm:"model_name" json:"modelName"`
ModelType int `orm:"model_type" json:"modelType"` ModelType int `orm:"model_type" json:"modelType"`
BaseURL string `orm:"base_url" json:"baseUrl"` BaseURL string `orm:"base_url" json:"baseUrl"`
HttpMethod string `orm:"http_method" json:"httpMethod"` HttpMethod string `orm:"http_method" json:"httpMethod"`
HeadMsg map[string]any `orm:"head_msg" json:"headMsg"` HeadMsg map[string]any `orm:"head_msg" json:"headMsg"`
Form []map[string]any `orm:"form_json" json:"form"` Form []map[string]any `orm:"form_json" json:"form"`
RequestMapping map[string]any `orm:"request_mapping" json:"requestMapping"` RequestMapping map[string]any `orm:"request_mapping" json:"requestMapping"`
ResponseMapping map[string]any `orm:"response_mapping" json:"responseMapping"` ResponseMapping map[string]any `orm:"response_mapping" json:"responseMapping"`
ResponseBody string `orm:"response_body" json:"responseBody"` RequiredFields []string `orm:"required_fields" json:"requiredFields"`
ResponseTokenField string `orm:"response_token_field" json:"tokenField"` IsPrivate *int `orm:"is_private" json:"isPrivate"`
RequiredFields []string `orm:"required_fields" json:"requiredFields"` IsChatModel *int `orm:"is_chat_model" json:"isChatModel"`
IsPrivate *int `orm:"is_private" json:"isPrivate"` CallMode *int `orm:"call_mode" json:"callMode"`
IsChatModel *int `orm:"is_chat_model" json:"isChatModel"` ApiKey string `orm:"api_key" json:"apiKey"`
CallMode *int `orm:"call_mode" json:"callMode"` Enabled *int `orm:"enabled" json:"enabled"`
ApiKey string `orm:"api_key" json:"apiKey"` MaxConcurrency int `orm:"max_concurrency" json:"maxConcurrency"`
Enabled *int `orm:"enabled" json:"enabled"` TimeoutSeconds int `orm:"timeout_seconds" json:"timeoutSeconds"`
MaxConcurrency int `orm:"max_concurrency" json:"maxConcurrency"` RetryTimes int `orm:"retry_times" json:"retryTimes"`
TimeoutSeconds int `orm:"timeout_seconds" json:"timeoutSeconds"` AutoCleanSeconds int `orm:"auto_clean_seconds" json:"autoCleanSeconds"`
RetryTimes int `orm:"retry_times" json:"retryTimes"` IsOwner *int `orm:"is_owner" json:"isOwner"`
AutoCleanSeconds int `orm:"auto_clean_seconds" json:"autoCleanSeconds"` OperatorName string `orm:"operator_name" json:"operatorName"`
IsOwner *int `orm:"is_owner" json:"isOwner"` TokenConfig map[string]any `orm:"token_config" json:"tokenConfig"`
OperatorName string `orm:"operator_name" json:"operatorName"` ExtendMapping map[string]any `orm:"extend_mapping" json:"extendMapping"`
TokenConfig map[string]any `orm:"token_config" json:"tokenConfig"` QueryConfig map[string]any `orm:"query_config" json:"queryConfig"`
ExtendMapping map[string]any `orm:"extend_mapping" json:"extendMapping"` StreamConfig map[string]any `orm:"stream_config" json:"streamConfig"`
QueryConfig map[string]any `orm:"query_config" json:"queryConfig"` FirstFrame string `orm:"first_frame" json:"firstFrame"`
StreamConfig map[string]any `orm:"stream_config" json:"streamConfig"` LastFrame string `orm:"last_frame" json:"lastFrame"`
FirstFrame string `orm:"first_frame" json:"firstFrame"`
LastFrame string `orm:"last_frame" json:"lastFrame"`
MaxTokens int `orm:"max_tokens" json:"maxTokens"`
} }
const ( //ResponseMapping 下的字段
ResponseBody = "response_body" //返回主体
TotalTokens = "total_tokens" //总token数
)

View File

@@ -205,7 +205,7 @@ func (w *asyncWorker) callModelAsync(ctx context.Context, task *entity.ModelGate
return nil, err return nil, err
} }
// 2. 拿到 task_id // 2. 拿到 task_id
taskID := gjson.New(body).Get(model.ResponseBody).String() taskID := gjson.New(body).Get(entity.ResponseBody).String()
// 3. 创建等待通道 // 3. 创建等待通道
ch := make(chan asyncResult, 1) ch := make(chan asyncResult, 1)
@@ -310,8 +310,8 @@ func (w *asyncWorker) parseAndRetry(ctx context.Context, body map[string]any, ta
} }
// 2) 先存 token 到数据库,防止后续失败丢失 // 2) 先存 token 到数据库,防止后续失败丢失
if _, ok := mapped[model.ResponseTokenField]; ok { if _, ok := mapped[entity.TotalTokens]; ok {
task.ExpendTokens = gconv.Int64(mapped[model.ResponseTokenField]) task.ExpendTokens = gconv.Int64(mapped[entity.TotalTokens])
_, err = dao.ModelGatewayTask.Update(ctx, &entity.ModelGatewayTask{ _, err = dao.ModelGatewayTask.Update(ctx, &entity.ModelGatewayTask{
SQLBaseDO: beans.SQLBaseDO{Id: task.Id}, SQLBaseDO: beans.SQLBaseDO{Id: task.Id},
ExpendTokens: task.ExpendTokens, ExpendTokens: task.ExpendTokens,
@@ -327,7 +327,7 @@ func (w *asyncWorker) parseAndRetry(ctx context.Context, body map[string]any, ta
return parsed, nil return parsed, nil
} }
case public.BuildTypeStruct: case public.BuildTypeStruct:
parsed = util.ParseStructResult(mapped, model.ResponseBody) parsed = util.ParseStructResult(mapped, entity.ResponseBody)
return parsed, nil return parsed, nil
default: default:
return mapped, nil return mapped, nil

View File

@@ -33,7 +33,6 @@ CREATE TABLE IF NOT EXISTS model_gateway_models (
max_concurrency int4 NOT NULL DEFAULT 10, max_concurrency int4 NOT NULL DEFAULT 10,
timeout_seconds int4 NOT NULL DEFAULT 600, timeout_seconds int4 NOT NULL DEFAULT 600,
retry_times int2 NOT NULL DEFAULT 3, retry_times int2 NOT NULL DEFAULT 3,
auto_clean_seconds int4 NOT NULL DEFAULT 86400,
response_token_field varchar(128) NOT NULL DEFAULT '', response_token_field varchar(128) NOT NULL DEFAULT '',
call_mode int2 NOT NULL DEFAULT 0, call_mode int2 NOT NULL DEFAULT 0,
required_fields jsonb NOT NULL DEFAULT '[]', required_fields jsonb NOT NULL DEFAULT '[]',
@@ -55,6 +54,7 @@ COMMENT ON COLUMN model_gateway_models.created_at IS '创建时间';
COMMENT ON COLUMN model_gateway_models.updater IS '更新人'; COMMENT ON COLUMN model_gateway_models.updater IS '更新人';
COMMENT ON COLUMN model_gateway_models.updated_at IS '更新时间'; COMMENT ON COLUMN model_gateway_models.updated_at IS '更新时间';
COMMENT ON COLUMN model_gateway_models.deleted_at IS '删除时间(软删)'; COMMENT ON COLUMN model_gateway_models.deleted_at IS '删除时间(软删)';
COMMENT ON COLUMN model_gateway_models.model_name IS '模型名称'; COMMENT ON COLUMN model_gateway_models.model_name IS '模型名称';
COMMENT ON COLUMN model_gateway_models.model_type IS '模型类型'; COMMENT ON COLUMN model_gateway_models.model_type IS '模型类型';
COMMENT ON COLUMN model_gateway_models.operator_name IS '运营商名称'; COMMENT ON COLUMN model_gateway_models.operator_name IS '运营商名称';
@@ -62,12 +62,11 @@ COMMENT ON COLUMN model_gateway_models.base_url IS '模型地址';
COMMENT ON COLUMN model_gateway_models.http_method IS '请求方式 GET/POST'; COMMENT ON COLUMN model_gateway_models.http_method IS '请求方式 GET/POST';
COMMENT ON COLUMN model_gateway_models.head_msg IS '请求头信息'; COMMENT ON COLUMN model_gateway_models.head_msg IS '请求头信息';
COMMENT ON COLUMN model_gateway_models.api_key IS '调用凭证/密钥'; COMMENT ON COLUMN model_gateway_models.api_key IS '调用凭证/密钥';
COMMENT ON COLUMN model_gateway_models.is_private IS '是否私有化0-私有 1-公共'; COMMENT ON COLUMN model_gateway_models.is_private IS '是否私有化0-私有 1-公共';
COMMENT ON COLUMN model_gateway_models.enabled IS '是否启用0-停用 1-启用'; COMMENT ON COLUMN model_gateway_models.enabled IS '是否启用0-停用 1-启用';
COMMENT ON COLUMN model_gateway_models.is_chat_model IS '是否为对话模型0-否 1-是'; COMMENT ON COLUMN model_gateway_models.is_chat_model IS '是否为对话模型0-否 1-是';
COMMENT ON COLUMN model_gateway_models.is_owner IS '1=当前用户创建 0=超级管理员'; COMMENT ON COLUMN model_gateway_models.is_owner IS '1=当前用户创建 0=超级管理员';
COMMENT ON COLUMN model_gateway_models.call_mode IS '调用模式0-同步 1-异步 2-流式';
COMMENT ON COLUMN model_gateway_models.form_json IS '动态表单结构'; COMMENT ON COLUMN model_gateway_models.form_json IS '动态表单结构';
COMMENT ON COLUMN model_gateway_models.request_mapping IS '请求映射'; COMMENT ON COLUMN model_gateway_models.request_mapping IS '请求映射';
COMMENT ON COLUMN model_gateway_models.response_mapping IS '返回映射'; COMMENT ON COLUMN model_gateway_models.response_mapping IS '返回映射';
@@ -81,9 +80,7 @@ COMMENT ON COLUMN model_gateway_models.last_frame IS '尾帧图片参数';
COMMENT ON COLUMN model_gateway_models.max_concurrency IS '最大并发数'; COMMENT ON COLUMN model_gateway_models.max_concurrency IS '最大并发数';
COMMENT ON COLUMN model_gateway_models.timeout_seconds IS '调用模型超时(秒)'; COMMENT ON COLUMN model_gateway_models.timeout_seconds IS '调用模型超时(秒)';
COMMENT ON COLUMN model_gateway_models.retry_times IS '失败重试次数'; COMMENT ON COLUMN model_gateway_models.retry_times IS '失败重试次数';
COMMENT ON COLUMN model_gateway_models.auto_clean_seconds IS '任务完成后自动清理时间(秒)';
COMMENT ON COLUMN model_gateway_models.response_token_field IS '响应中消耗token的字段映射'; COMMENT ON COLUMN model_gateway_models.response_token_field IS '响应中消耗token的字段映射';
COMMENT ON COLUMN model_gateway_models.call_mode IS '调用模式0-同步 1-异步 2-流式';
COMMENT ON COLUMN model_gateway_models.required_fields IS '必选字段列表'; COMMENT ON COLUMN model_gateway_models.required_fields IS '必选字段列表';
COMMENT ON COLUMN model_gateway_models.max_tokens IS '最大 token 数0 表示不传'; COMMENT ON COLUMN model_gateway_models.max_tokens IS '最大 token 数0 表示不传';