refactor(asynch): 重构异步模型配置和队列管理

This commit is contained in:
2026-06-02 20:26:45 +08:00
parent c7e9eb889b
commit 52124385a1
18 changed files with 726 additions and 1006 deletions

View File

@@ -8,45 +8,57 @@
-- 1) asynch_models
-- =========================
CREATE TABLE IF NOT EXISTS asynch_models (
-- 基础字段
id BIGINT PRIMARY KEY, -- 主键ID(非自增)
tenant_id BIGINT NOT NULL DEFAULT 0, -- 租户ID
creator VARCHAR(64) NOT NULL, -- 创建人
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, -- 创建时间
updater VARCHAR(64) NOT NULL, -- 更新人
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, -- 更新时间
deleted_at TIMESTAMP(6), -- 删除时间(软删)
-- 业务字段
model_name VARCHAR(128) NOT NULL, -- 模型名称
model_type SMALLINT NOT NULL DEFAULT 0, -- 模型类型
base_url VARCHAR(256) NOT NULL, -- 模型地址
http_method VARCHAR(8) NOT NULL DEFAULT 'POST', -- 请求方式 GET/POST
head_msg VARCHAR(1024) DEFAULT '', -- 请求头绑定(支持多个,逗号分隔)示例 X-API:xxx,operation:true
is_private SMALLINT NOT NULL DEFAULT 0, -- 是否私有化 0-私有 1-公共
enabled SMALLINT NOT NULL DEFAULT 1, -- 是否启用 0停用 1-启用
is_chat_model SMALLINT NOT NULL DEFAULT 0, -- 是否为对话模型 0-否 1-是
is_owner SMALLINT NOT NULL DEFAULT 99, -- 1=当前用户创建的0=超级管理员的
api_key VARCHAR(256) NOT NULL DEFAULT '', -- 调用凭证,密钥
prompt TEXT NOT NULL DEFAULT '', -- 提示词内容(文本)
form_json JSONB NOT NULL DEFAULT '{}'::jsonb, -- 表单结构(用于前端渲染)
request_mapping JSONB NOT NULL DEFAULT '{}'::jsonb -- 请求映射
response_mapping JSONB NOT NULL DEFAULT '{}'::jsonb, -- 返回映射
response_body JSONB NOT NULL DEFAULT '{}'::jsonb, -- 返回主体
max_concurrency INT NOT NULL DEFAULT 10, -- 单模型最大并发
queue_limit INT NOT NULL DEFAULT 1000, -- 排队上限(近似控制)
timeout_seconds INT NOT NULL DEFAULT 600, -- 调用模型服务超时(秒)
expected_seconds INT NOT NULL DEFAULT 600, -- 模型预计执行时间(秒)
retry_times SMALLINT NOT NULL DEFAULT 3, -- 失败重试次数
retry_queue_max_seconds INT NOT NULL DEFAULT 600, -- 失败重试最大排队时间(秒 0=插队到队首;>0=排队超过该时间后插队,否则仍到队尾)
auto_clean_seconds INT NOT NULL DEFAULT 86400, -- 已下载(state=4 后的保留时间(秒),到期清理)
remark TEXT DEFAULT '' -- 备注
response_token_field VARCHAR(128) NOT NULL DEFAULT ''; -- 响应中消耗token的字段映射
operator_name VARCHAR(64) NOT NULL DEFAULT '', -- 运营商名称
stream_config JSONB NOT NULL DEFAULT '{}'::jsonb, -- 流式配置
token_config JSONB NOT NULL DEFAULT '{}'::jsonb -- Token配置
extend_mapping JSONB NOT NULL DEFAULT '{}'::jsonb,
query_config JSONB NOT NULL DEFAULT '{}'::jsonb;
-- ========== 基础字段 ==========
id BIGINT PRIMARY KEY,
tenant_id BIGINT NOT NULL DEFAULT 0,
creator VARCHAR(64) NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updater VARCHAR(64) NOT NULL,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
deleted_at TIMESTAMP(6),
-- ========== 模型标识 ==========
model_name VARCHAR(128) NOT NULL,
model_type SMALLINT NOT NULL DEFAULT 0,
operator_name VARCHAR(64) NOT NULL DEFAULT '',
-- ========== 请求配置 ==========
base_url VARCHAR(256) NOT NULL,
http_method VARCHAR(8) NOT NULL DEFAULT 'POST',
head_msg JSONB NOT NULL DEFAULT '{}'::jsonb,
api_key VARCHAR(256) NOT NULL DEFAULT '',
-- ========== 状态开关 ==========
is_private SMALLINT NOT NULL DEFAULT 0,
enabled SMALLINT NOT NULL DEFAULT 1,
is_chat_model SMALLINT NOT NULL DEFAULT 0,
is_async SMALLINT NOT NULL DEFAULT 0,
is_stream SMALLINT NOT NULL DEFAULT 0,
is_owner SMALLINT NOT NULL DEFAULT 99,
-- ========== 配置相关 ==========
form_json JSONB NOT NULL DEFAULT '{}'::jsonb,
request_mapping JSONB NOT NULL DEFAULT '{}'::jsonb,
response_mapping JSONB NOT NULL DEFAULT '{}'::jsonb,
response_body JSONB NOT NULL DEFAULT '{}'::jsonb,
token_config JSONB NOT NULL DEFAULT '{}'::jsonb,
extend_mapping JSONB NOT NULL DEFAULT '{}'::jsonb,
query_config JSONB NOT NULL DEFAULT '{}'::jsonb,
stream_config JSONB NOT NULL DEFAULT '{}'::jsonb,
first_frame VARCHAR(128) NOT NULL DEFAULT '',
last_frame VARCHAR(128) NOT NULL DEFAULT '',
-- ========== 限制与重试 ==========
max_concurrency INT NOT NULL DEFAULT 10,
timeout_seconds INT NOT NULL DEFAULT 600,
retry_times SMALLINT NOT NULL DEFAULT 3,
auto_clean_seconds INT NOT NULL DEFAULT 86400,
-- ========== 其他 ==========
response_token_field VARCHAR(128) NOT NULL DEFAULT '',
);
-- ========== 索引 ==========
CREATE UNIQUE INDEX IF NOT EXISTS uk_asynch_models_tenant_creator_chat ON asynch_models(tenant_id, creator) WHERE is_chat_model = 1 AND deleted_at IS NULL;
CREATE UNIQUE INDEX IF NOT EXISTS uk_asynch_models_tenant_model_name ON asynch_models(tenant_id, creator, model_name);
CREATE INDEX IF NOT EXISTS idx_asynch_models_tenant_id ON asynch_models(tenant_id);
@@ -55,7 +67,9 @@ CREATE INDEX IF NOT EXISTS idx_asynch_models_model_type ON asynch_models(model_t
CREATE INDEX IF NOT EXISTS idx_asynch_models_enabled ON asynch_models(enabled);
CREATE INDEX IF NOT EXISTS idx_asynch_models_deleted_at ON asynch_models(deleted_at);
-- ========== 注释 ==========
COMMENT ON TABLE asynch_models IS '模型配置表';
COMMENT ON COLUMN asynch_models.id IS '主键ID(非自增)';
COMMENT ON COLUMN asynch_models.tenant_id IS '租户ID';
COMMENT ON COLUMN asynch_models.creator IS '创建人';
@@ -66,40 +80,32 @@ COMMENT ON COLUMN asynch_models.deleted_at IS '删除时间(软删)';
COMMENT ON COLUMN asynch_models.model_name IS '模型名称';
COMMENT ON COLUMN asynch_models.model_type IS '模型类型';
COMMENT ON COLUMN asynch_models.operator_name IS '运营商名称';
COMMENT ON COLUMN asynch_models.base_url IS '模型地址';
COMMENT ON COLUMN asynch_models.http_method IS '请求方式 GET/POST';
COMMENT ON COLUMN asynch_models.head_msg IS '请求头绑定(支持多个,逗号分隔)示例 X-API:xxx,operation:true';
COMMENT ON COLUMN asynch_models.is_private IS '是否私有化 0-私有 1-公共';
COMMENT ON COLUMN asynch_models.enabled IS '是否启用 0停用 1-启用';
COMMENT ON COLUMN asynch_models.is_chat_model IS '是否为对话模型 0-否 1-';
COMMENT ON COLUMN asynch_models.is_owner IS '1=当前用户创建的0=超级管理员的';
COMMENT ON COLUMN asynch_models.api_key IS '调用凭证,密钥';
COMMENT ON COLUMN asynch_models.prompt IS '提示词内容(文本)';
COMMENT ON COLUMN asynch_models.form_json IS '表单结构(用于前端渲染,也用于后端校验)';
COMMENT ON COLUMN asynch_models.head_msg IS '请求头信息';
COMMENT ON COLUMN asynch_models.api_key IS '调用凭证/密钥';
COMMENT ON COLUMN asynch_models.is_private IS '是否私有化0-私有 1-公共';
COMMENT ON COLUMN asynch_models.enabled IS '是否启用0-停用 1-启用';
COMMENT ON COLUMN asynch_models.is_chat_model IS '是否为对话模型0-否 1-是';
COMMENT ON COLUMN asynch_models.is_async IS '是否异步0-同步 1-异步';
COMMENT ON COLUMN asynch_models.is_stream IS '是否流式0-非流式 1-流式';
COMMENT ON COLUMN asynch_models.is_owner IS '1=当前用户创建 0=超级管理员';
COMMENT ON COLUMN asynch_models.form_json IS '动态表单结构';
COMMENT ON COLUMN asynch_models.request_mapping IS '请求映射';
COMMENT ON COLUMN asynch_models.response_mapping IS '返回映射';
COMMENT ON COLUMN asynch_models.response_body IS '返回主体';
COMMENT ON COLUMN asynch_models.max_concurrency IS '单模型最大并发';
COMMENT ON COLUMN asynch_models.queue_limit IS '排队上限(近似控制)';
COMMENT ON COLUMN asynch_models.timeout_seconds IS '调用模型服务超时(秒)';
COMMENT ON COLUMN asynch_models.expected_seconds IS '模型预计执行时间(秒)';
COMMENT ON COLUMN asynch_models.token_config IS 'Token计算配置';
COMMENT ON COLUMN asynch_models.extend_mapping IS '附加映射';
COMMENT ON COLUMN asynch_models.query_config IS '查询/回调配置';
COMMENT ON COLUMN asynch_models.stream_config IS '流式输出配置';
COMMENT ON COLUMN asynch_models.first_frame IS '首帧图片参数';
COMMENT ON COLUMN asynch_models.last_frame IS '尾帧图片参数';
COMMENT ON COLUMN asynch_models.max_concurrency IS '最大并发数';
COMMENT ON COLUMN asynch_models.timeout_seconds IS '调用模型超时(秒)';
COMMENT ON COLUMN asynch_models.retry_times IS '失败重试次数';
COMMENT ON COLUMN asynch_models.retry_queue_max_seconds IS '失败重试最大排队时间(秒 0=插队到队首;>0=排队超过该时间后插队,否则仍到队尾)';
COMMENT ON COLUMN asynch_models.auto_clean_seconds IS '已下载(state=4 后的保留时间(秒),到期清理)';
COMMENT ON COLUMN asynch_models.remark IS '备注';
COMMENT ON COLUMN asynch_models.auto_clean_seconds IS '任务完成后自动清理时间(秒)';
COMMENT ON COLUMN asynch_models.response_token_field IS '响应中消耗token的字段映射';
COMMENT ON COLUMN asynch_models.operator_name IS '运营商名称';
COMMENT ON COLUMN asynch_models.extend_mapping IS '附加映射(请求时候额外字段)';
COMMENT ON COLUMN asynch_models.query_config IS '查询结果配置通过task_id查询结果相关配置';
COMMENT ON COLUMN asynch_models.token_config IS '{
"zh_ratio": 1.0, // 中文字符→token系数
"en_ratio": 1.3, // 英文单词→token系数
"space_ratio": 0.1, // 空格系数
"punctuation_ratio": 0.1, // 标点系数
"max_window_size": 8192, // 模型最大窗口
"reserve_ratio": 0.2, // 预留回复空间比例
"min_reserve": 512, // 最少预留token数
}';
-- =========================