工作台任务模型升级为动态跟随用户选择:/api/run 提交时读最近活跃手动会话 model(sessions.model,会话级无全局设置)写入 model_id,无则兜底 auto;实证:此刻用户会话 flash→任务 model=flash ACCEPTED success=1

This commit is contained in:
maogeigei committed 2026-09-03 11:23:00 +08:00
1 parent cf359f46c2
commit cea7d11ba2
1 file changed
+10 -4
@@ -537,9 +537,10 @@ const server = http.createServer((req, res) => {
if (!prompt || typeof prompt !== 'string' || !prompt.trim()) return sendErr(400, 'prompt 不能为空'); if (!prompt || typeof prompt !== 'string' || !prompt.trim()) return sendErr(400, 'prompt 不能为空');
// 09-01 参数级技能挂载:skills_json 是 automations 表原生字段(default '[]'), // 09-01 参数级技能挂载:skills_json 是 automations 表原生字段(default '[]'),
// 客户端调度器创建会话时按该字段挂载技能;前端传技能名数组(如 ['短视频脚本创作'])即完成任务级技能绑定 // 客户端调度器创建会话时按该字段挂载技能;前端传技能名数组(如 ['短视频脚本创作'])即完成任务级技能绑定
// 09-03 模型跟随用户 AUTO:model_id 改 'auto'(原 'deepseek-v4-flash' 钉死绕过用户模型选择)。 // 09-03 模型跟随用户选择:原 model_id 钉死 'deepseek-v4-flash'(绕过用户模型选择,全任务跑 flash)。
// 调度器实证:model_id 有值 → setSessionModel 强制指定会话模型;'auto' 为用户界面合法模型模式(sessions.model 实证), // 已改为动态读取最近活跃手动会话的 model(下方 modelRow/modelId,跟随用户在 UI 的 auto/flash/pro 选择);
// 由系统按任务复杂度自动路由。若实测调度不认 'auto',可改留 NULL(调度不强制,走宿主默认初始模型) // 兜底 'auto' = 系统按任务复杂度自动路由。实证:调度器 model_id 有值 → setSessionModel 强制指定会话模型,
// 'auto' 与具体模型 ID 均被接受(auto 会话 model='auto'、任务 ACCEPTED success=1 验证通过)
const skillsArr = Array.isArray(skills) ? skills.filter((s) => typeof s === 'string' && s.trim()).map((s) => s.trim()) : []; const skillsArr = Array.isArray(skills) ? skills.filter((s) => typeof s === 'string' && s.trim()).map((s) => s.trim()) : [];
// 09-01 并发方案A:浏览器类任务(账号信息/视频列表/采集/导入)自动注入浏览器锁约束—— // 09-01 并发方案A:浏览器类任务(账号信息/视频列表/采集/导入)自动注入浏览器锁约束——
// 多个 AI 会话任务并行共享同一 9223 Chrome 实例,必须互斥使用,否则标签页互相导航抢占 // 多个 AI 会话任务并行共享同一 9223 Chrome 实例,必须互斥使用,否则标签页互相导航抢占
@@ -567,9 +568,14 @@ const server = http.createServer((req, res) => {
const nextRunAt = Date.now() + 5 * 1000; // 08-31 实测:客户端调度器按 next_run_at 扫描;缺此列=null=永不拾取(工作台任务卡死根因) const nextRunAt = Date.now() + 5 * 1000; // 08-31 实测:客户端调度器按 next_run_at 扫描;缺此列=null=永不拾取(工作台任务卡死根因)
const uidRow = db.prepare("SELECT user_id FROM sessions WHERE user_id IS NOT NULL AND user_id <> '' ORDER BY created_at DESC LIMIT 1").get(); const uidRow = db.prepare("SELECT user_id FROM sessions WHERE user_id IS NOT NULL AND user_id <> '' ORDER BY created_at DESC LIMIT 1").get();
const ownerUserId = uidRow ? uidRow.user_id : ''; const ownerUserId = uidRow ? uidRow.user_id : '';
// 09-03 动态跟随用户模型选择:WorkBuddy 模型为会话级(sessions.model,无全局设置),
// 读最近活跃的【手动】会话(非后台自动化)的 model 写入任务 → 用户在 UI 切 auto/flash/pro,任务即跟随;
// 无手动会话记录时兜底 'auto'(自动路由)。实证:调度接受 'auto' 与具体模型 ID('deepseek-v4-pro' 曾成功)
const modelRow = db.prepare(`SELECT model FROM sessions WHERE deleted_at IS NULL AND COALESCE(is_background_automation,0)=0 AND model IS NOT NULL AND model <> '' ORDER BY COALESCE(last_activity_at, updated_at) DESC LIMIT 1`).get();
const modelId = (modelRow && modelRow.model) ? modelRow.model : 'auto';
db.prepare(`INSERT INTO automations (id,name,prompt,status,schedule_type,scheduled_at,next_run_at,rrule,cwds,created_at,updated_at,skills_json,connector_ids_json,model_id,permission_mode,owner_user_id,owner_status) db.prepare(`INSERT INTO automations (id,name,prompt,status,schedule_type,scheduled_at,next_run_at,rrule,cwds,created_at,updated_at,skills_json,connector_ids_json,model_id,permission_mode,owner_user_id,owner_status)
VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)`) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)`)
.run(id, name || '工作台任务', finalPrompt, 'ACTIVE', 'once', scheduledAt, nextRunAt, '', JSON.stringify([cwd]), now, now, JSON.stringify(skillsArr), '[]', 'auto', 'fullAccess', ownerUserId, 'confirmed'); .run(id, name || '工作台任务', finalPrompt, 'ACTIVE', 'once', scheduledAt, nextRunAt, '', JSON.stringify([cwd]), now, now, JSON.stringify(skillsArr), '[]', modelId, 'fullAccess', ownerUserId, 'confirmed');
db.close(); db.close();
log('已提交 AI 任务: ' + id + (name ? ' (' + name + ')' : '')); log('已提交 AI 任务: ' + id + (name ? ' (' + name + ')' : ''));
return sendJSON(200, { ok: true, id, message: '任务已提交,请在左侧会话栏查看执行' }); return sendJSON(200, { ok: true, id, message: '任务已提交,请在左侧会话栏查看执行' });