Files
ST-Amily2-Chat-Optimisation/TODOList.md

14 KiB
Raw Permalink Blame History

TODOList — 待办任务总览

用于派工与进度跟踪。任务卡格式统一,可拆分给不同执行者(人 / Claude / GPT / 其他模型)。

关联文档:

  • 51TODO.md — 跨方向重构计划Bus tool-call 升级 / 跨议题决策点)
  • TableTODO.md — 表格模块 IAD 深度重构计划Phase 0/B/C
  • TODO.md — 旧版本变更日志(保留作为发布记录)

最后更新2026-05-08对应 v2.2.0 已发布。


一、最近落地v2.1.1 → v2.2.0

上下文摘要,让接手者了解当前状态。代码细节看对应 commit。

commit 内容 涉及范围
d283ff4 表格模块 IAD 解耦 + API 自定义参数 + 厂商预设连接 core/table-system/* 新增 dto/infra/actionsassets/api-vendor-params.jsonUI
f022002 DeepSeek registry 补 thinking 模式参数 assets/api-vendor-params.json
671c1b2 profile 优先级修正profile 分配后即权威,旧字段不再覆盖 core/api.js 6 处 getApiSettings
68217ff legacy 自动迁移 + 清除按钮 + tableFilling slot + silent fallback 移除 ApiProfileManager.js / historiographer.js / 表格 3 filler
b40f575 bump 2.2.0 + tableFilling 默认 link main manifest.json / ApiProfileManager.js

核心架构现状(接手必读):

  • 状态权威utils/config/ApiProfileManager.js 是 API 配置单一指挥所profile 分配后即权威,旧字段(s.ngmsTemperature 等)不再覆盖 profile
  • 表格模块:核心在 core/table-system/ ,已按 IAD 拆分dto/infra/actions/rendering.js/templates.js/preset.jsmanager.js 退化为兼容层(仍保留 16 个 UI mutation + loadTables + updateTableFromText
  • API 厂商识别utils/api-vendor.js 提供 detectVendor / listVendorParamsregistry 在 assets/api-vendor-params.json
  • VS Code 类型校验jsconfig.json 已开启 checkJstypes/sillytavern.d.ts 提供 SillyTavern 全局模块声明

二、待办任务

任务卡格式说明

每个任务包含:

  • 类型bug / feature / refactor / cleanup / docs
  • 难度🟢 简单(< 1h 🟡 中等1-3h 🔴 高耦合(> 3h 或需架构判断)
  • 建议执行者GPT / Claude / Human / 任意
  • 文件:明确路径 + 行号锚点(若适用)
  • 修改要点bullet 列表
  • 验收:可验证的预期行为
  • 依赖:前置任务的 ID若有

🟢 GPT-friendly 简单任务

T-001: 清理已确认的死代码

  • 类型cleanup
  • 难度🟢 简单
  • 建议执行者GPT
  • 依赖:无

待清理项

  1. core/fractal-memory.js —— 整个文件死代码,initializeFractalMemory 在文件外完全没人调用。建议:直接删除整个文件。
  2. ui/historiography-bindings.js:494-513 —— 绑定 #amily2_ngms_temperature#amily2_ngms_max_tokens 这两个 HTML 中已不存在的元素。getElementById 永远返回 null整段代码空跑。建议直接删掉这段。
  3. ui/plot-opt-bindings.js:664-665 —— 同样引用不存在的 #amily2_opt_max_tokens / #amily2_opt_temperature。建议:删掉。
  4. ui/plot-opt-bindings.js:698-699 —— opt_bindSlider 调用同样的不存在 ID删除。

修改要点

  • 删除前用 grep 确认每个 ID 在所有 .html 文件里都不存在
  • 删完后用 grep 检查没有其他文件 import 被删的函数
  • 提交前肉眼跑一次表格填表 / 剧情优化 / NGMS 总结,确认 UI 无回归

验收

  • 4 处死代码块全部删除
  • 启动控制台无 JS 错误
  • 表格 / 剧情优化 / 总结功能无回归

T-002: cwb / autoCharCard 加入 legacy 自动迁移

  • 类型feature
  • 难度🟢 简单
  • 建议执行者GPT
  • 依赖:无

背景utils/config/ApiProfileManager.jsLEGACY_PROFILE_MIGRATION_MAP 目前覆盖 main / plotOpt / plotOptConc / ngms / nccs / sybd 6 个 slot。cwb 和 autoCharCard 的 legacy 字段结构略不同cwb 用 cwb_apiUrl / cwb_apiKey / cwb_model autoCharCard 用 acc_* 前缀),所以暂时没纳入。

修改要点

  1. 找出 cwb / autoCharCard 的 legacy 字段名grep cwb_apiUrl / acc_apiUrl 之类)
  2. LEGACY_PROFILE_MIGRATION_MAP 加两条:
    {
        slot: 'cwb',
        urlKey: 'cwb_apiUrl',
        modelKey: 'cwb_model',
        keyName: 'cwb_apiKey',
        maxTokensKey: 'cwb_max_tokens',
        temperatureKey: 'cwb_temperature',
        name: 'CWB 旧配置',
    },
    {
        slot: 'autoCharCard',
        urlKey: '???',  // 需 grep 确认实际 key
        ...
    }
    
  3. 同时在 clearLegacyConfigALL_LEGACY_FIELDSLEGACY_KEY_NAMES 加对应条目

验收

  • 两个 slot 在迁移自调用 IIFE 跑过后能正确创建 profile + setKey + setAssignment
  • 清理按钮能识别并清除这俩模块的旧字段

T-003: 表格 NCCS 支路透传 customParams

  • 类型feature
  • 难度🟢 简单
  • 建议执行者GPT
  • 依赖:无

背景v2.2.0 给 core/api.js 的 callOpenAITest / callOpenAICompatible / callSillyTavernBackend 都接入了 options.customParams spread。但 core/api/NccsApi.jscallNccsOpenAITest 等独立路径没有接入,导致用户在 NCCS profile 配置的 customParams 不生效。

修改要点

  1. NccsApi.js 里发请求的函数(callNccsOpenAITest / callNccsSillyTavernPreset),定位到 JSON.stringify({ ... })
  2. 在 body 构建时按"customParams 在前,核心字段在后覆盖"的顺序 spread
    body: JSON.stringify({
        ...(options.customParams || {}),
        // 核心字段
        chat_completion_source: 'openai',
        model: options.model,
        messages,
        // ...
    })
    
  3. 同时确保 getNccsApiSettingsprofile.customParams 透出(参考 core/api.js:447-462 模式)
  4. 同步给 NgmsApi / JqyhApi / SybdApi 做相同处理

验收

  • 在 NCCS profile 加 {"top_p": 0.5}DevTools Network 看请求 body 包含 top_p:0.5
  • NGMS / JQYH / SYBD 同样验证

T-004: hint panel 点击参数名插入到 textarea

  • 类型feature
  • 难度🟢 简单
  • 建议执行者GPT
  • 依赖:无

背景ui/api-config-bindings.js_updateCustomParamsHint 现在只显示纯文本"已知参数top_p、frequency_penalty、..."。没有交互。

修改要点

  1. 把 hint 区改成参数名按钮列表,每个按钮 click 触发"如果当前 textarea JSON 已有这个 key 则不动,没有就 append 进去"
  2. 实现 _insertParamToCustomParams(paramName, defaultValue):解析 textarea JSON → 添加 key用合理的占位值例如 number 类型用 0、string 类型用 ""、object 类型用 {})→ JSON.stringify 回写
  3. 处理 textarea 当前为空 / 当前是非法 JSON 的情况(非法 JSON 时按钮 disabled + 提示用户先修复)

验收

  • 切换 vendor 后参数名按钮列表更新
  • 点击按钮把对应 key 添加到 textarea
  • 已存在的 key 不重复添加

🟡 中等任务

T-005: 15 处散乱 vendor URL 检查迁到 detectVendor

  • 类型refactor
  • 难度🟡 中等
  • 建议执行者GPT 或 Claude
  • 依赖:无

背景:之前的 51TODO Phase B 收尾任务。代码里 15+ 处 apiUrl.includes('googleapis.com') 散乱判断厂商,应该统一调 utils/api-vendor.js#detectVendor

待迁移文件grep googleapis.com|anthropic.com|openai.com 找):

  • ui/api-config-bindings.js
  • ui/plot-opt-bindings.js
  • core/rag-api.js
  • ui/profile-sync.js
  • core/api.js
  • CharacterWorldBook/src/cwb_apiService.js
  • ui/bindings.js
  • ui/table/nccs-bindings.js
  • core/api/SybdApi.js
  • core/api/Ngms_api.js
  • core/api/JqyhApi.js
  • core/api/NccsApi.js
  • core/api/ConcurrentApi.js

修改要点

  1. 每处 if (apiUrl.includes('googleapis.com')) 改为 if ((await detectVendor(apiUrl)) === 'google')
  2. 注意有的位置在同步上下文(事件回调),用 detectVendorSync 但要先 await getRegistry() 预加载
  3. 不要为了重构改变行为:原来只判断 google 就只判断 google原来判断多个 vendor 就保留多个

验收

  • 所有散乱 URL 检查替换完
  • 行为完全等价(用 grep 自检 includes 已全替换)
  • 跑一遍主功能(主聊天 / 剧情优化 / NGMS 总结 / 表格填表)确认无回归

T-006: jqyh/sybd/cwb 在 profile 已分配时把 slider 改成 informational

  • 类型feature / UX
  • 难度🟡 中等
  • 建议执行者GPT 或 Claude
  • 依赖:无

背景v2.2.0 之后profile 一旦分配就权威jqyh/sybd/cwb 这些有 slider 的模块在 profile 分配后 slider 是无效的(用户改 slider 不影响请求)。这是用户陷阱。

修改要点

每个有 slider 的模块面板(plot-opt-bindings.js / historiography-bindings.js / glossary 相关 bindings / cwb_settingsManager.js

  1. 启动时 / profile 分配变化时检查对应 slot 是否分配了 profile
  2. 若已分配:
    • slider disable
    • slider 旁加小字提示:"当前由 profile 「{profile.name}」 控制,请在 API 连接配置面板修改 profile"
  3. 若未分配保持原样slider 可用,写入 legacy 字段)
  4. 监听 profile 分配变化事件(可通过 ApiProfileManager 加 subscribe或者轮询

验收

  • 给 plotOpt 分配 profile 后,剧情优化面板的温度/maxTokens slider 变灰 + 提示
  • 取消分配后 slider 重新可用
  • 其他模块同样行为

T-007: 表格 Phase 0.4 — 抽出 mutations.js

  • 类型refactor
  • 难度🟡 中等
  • 建议执行者Claude涉及 IAD 一致性判断)
  • 依赖:无

背景TableTODO.md#四-phase-0 计划的 Phase 0.4。manager.js 还有 16 个 UI 突变函数addRow / deleteColumn / renameTable 等),应抽到 core/table-system/actions/ui-mutations.js

修改要点

  1. core/table-system/actions/ 创建 ui-mutations.js
  2. 把 manager.js 里这 16 个函数搬过去deleteColumn / moveRow / insertRow / addRow / addColumn / updateHeader / deleteRow / restoreRow / commitPendingDeletions / insertColumn / moveColumn / deleteTable / addTable / renameTable / moveTable / updateTableRules / updateRow / clearAllTables / updateColumnWidth
  3. manager.js 改为 re-export 这些函数(保持外部调用路径不变)
  4. 各函数签名/行为保持完全一致

验收

  • manager.js 行数显著减少
  • 所有 UI 突变操作在表格面板里行为一致(手动测每个操作)
  • 没有任何 import 失败

🔴 高耦合 / 架构任务

T-008: Bus tool-call 能力升级

  • 类型feature / 架构
  • 难度🔴
  • 建议执行者Claude涉及 Bus 架构判断)
  • 依赖:无(独立于表格重构)

详见51TODO.md#二-phase-a-bus-tool-call-升级

核心交付

  • SL/bus/tool/ToolRegistry.js 私有工具注册表
  • register(pluginName) 返回的 context 加 tool 能力
  • Options.js / RequestBody.js 支持 tools / toolChoice 字段
  • context.model.callWithTools(messages, options, { maxSteps, onToolError }) agent loop

预估1.5 天


T-009: 表格 Phase B — JSON formatter

  • 类型feature
  • 难度🟡 中等
  • 建议执行者GPT 或 Claude
  • 依赖:无(不依赖 Bus 升级)

详见TableTODO.md#五-phase-b-json-formatter

核心交付

  • core/table-system/formatters/json.js:教 LLM 输出 {"operations":[...]},解析为 Op[]
  • 设置项 table_filling_format: 'legacy'|'json'|'toolcall',默认 legacy
  • UI 加 dropdown 切换
  • fillerShared 调用统一 formatter dispatcher

预估0.5 天


T-010: 表格 Phase C — ToolCall formatter

  • 类型feature
  • 难度🟡 中等
  • 建议执行者Claude
  • 依赖T-008 完成 + T-009 完成

详见TableTODO.md#六-phase-c-toolcall-formatter


T-011: 表格 Phase 0.7-0.9 收尾

  • 类型refactor
  • 难度🔴filler 三方差异需小心对齐 / 解循环依赖 / Service 重写)
  • 建议执行者Claude
  • 依赖T-007Phase 0.4 mutations 完成后做)

详见TableTODO.md#四-phase-0 0.7-0.9

  • 0.7: core/table-system/filler/shared.js —— 三个 filler 重复代码消除
  • 0.8: 解 manager.js ↔ secondary-filler.js 循环依赖
  • 0.9: TableSystemService 真正变成门面

预估1 天


三、派工建议

适合现在直接派给 GPT独立、无架构判断

  • T-001 死代码清理
  • T-002 cwb/autoCharCard 加入迁移
  • T-003 NCCS 透传 customParams
  • T-004 hint panel 点击插入

GPT 或 Claude 都可以

  • T-005 vendor 检查迁移(量大但机械)
  • T-006 slider informational 状态
  • T-009 JSON formatter

建议留给 Claude 或人

  • T-007 mutations.js 抽出(涉及 IAD 一致性)
  • T-008 Bus tool-call 升级(架构核心)
  • T-010 ToolCall formatter依赖前置
  • T-011 表格 Phase 0 收尾filler 重复代码 dedup 风险高)

四、未列入但可能的小项

  • 自动迁移完成后给所有 chat 类型 slot 加默认 link 选项(不只 tableFilling
  • profile 分配 UI 加"复用现有 profile"快捷按钮(避免用户为每个 slot 重复创建相同配置)
  • 51TODO.md 第三节决策点中"是否合并发版"等问题做最终决定记录
  • TODO.md旧版本变更日志的 v2.2.0 版本条目补全