Skip to content

feat: 模型类型声明与能力位识别 + .ai tool 工具组展示与开关(4.23.0) - #141

Merged
error2913 merged 5 commits into
mainfrom
feat/tool-groups
Sep 13, 2026
Merged

error2913 merged 5 commits into
mainfrom
feat/tool-groups

Conversation

@error2913

Copy link
Copy Markdown
Owner

概述

本 PR 包含 4.23.0 的功能改动(模型类型声明 / 能力位识别 / 模板配置「框」表述统一 / 工具组展示与开关),版本推进与发版文档在后续 chore(release): 版本推进 4.23.0 提交中单独进行。


1. .ai tool 工具组展示与整组开关(新增)

内置工具按能力细分为 14 个分类(基础调度 / 指令 / 定时 / 触发 / 记忆 / 图片 / OB11 / 资源 / 属性 / 原文检索 / 黑名单 / 网页 / 公开会话 / 子代理;外部插件注册的工具归「外部插件」),MCP 工具按服务器成组。

  • Tool 新增 category 字段与 Tool.withCategory(分类, 注册批次) 包装,62 个 new Tool(...) 调用点零改动;未打分类的内置工具兜底「其他」。
  • .ai tool:无参=组概览(组名 + 工具数 + 开/关统计,不再刷屏 60+ 行)、<组名>=组明细、<函数名>=工具详情、all=原扁平全量视图、list=概览别名。
  • .ai tool on/off:支持组名(--group= 显式指定,绕开 on/off/help/call/list/all 保留字与撞名);关闭时默认跳过核心常驻工具CORE_TOOL_NAMES),无参 off 同样适用,--force 才一并关闭;开启时跳过「禁止调用的函数」并如实回报变更/跳过个数;工具名与无参用法完全保持原行为。
  • 新增 src/tool/tool_group.ts.ai tool on/off <组名>.ai mcp on/off <服务器> 共用同一批量开关实现(setToolGroupState / formatGroupToggleReply)。
  • 技能与知识库不参与工具组维度(会话开关仍由 .ai skill / .ai kb 管理),单工具开关不受影响。
  • AI 侧同口径:list_tools 组头与 search_tools 详情来源改用 groupDisplay内置·记忆 / MCP 服务器名 / 技能 / 知识库);mcp= 过滤经 matchesGroupFilter 支持分类名、来源分组、组显示名(mcp=内置 仍匹配全部内置工具)。

2. 模型:api连接 支持 [types] 手动声明模型类型

  • 新增 [types] 表("模型名" = "text" / "vision" / "embed"):逐键校验并给出非法值 / 模型名含点号未加引号的 error 日志;非法值只忽略该键,不影响整行连接。
  • 分类优先级改为 手动声明 > 命名终值 > 接口能力位 > 命名能力位 > 兜底 text;手动声明即最终答案。
  • [types] 声明未命中当前模型列表时记一条 warning(仅 status=ok 时判定,按 connIndex:模型名 去重)。
  • 出厂示例与 .ai model 帮助同步补说明。

3. 模型:列表接口能力位识别(vision / embed)

  • 读取供应商自报能力位(type/model_type/kind/taskarchitecture.input_modalitiescapabilitiessupports_vision),适配 OpenRouter / LM Studio / vLLM / Ollama 风格字段。
  • 只取正向证据(保守元数据不会把模型降级),命名终值白名单优先于接口元数据;仍只发一次列表请求,不做额外探测;老式 string[] 返回行为不变。

4. 文档:模板配置统一按「框」表述

  • 模板配置的每个元素是一个文本框,不再用「行」描述元素;框内内容自身的「行」表述(角色设定首行、TOML/JSON 语法行、事件白名单等)刻意保留。
  • 日志:api连接 / 模型规则 的模板解析错误、[types] 非法值提示改为「第 N 框」。

测试与验证

  • npx tsc --noEmit:无输出
  • npm run lint:无输出
  • npm run test:unit242 项全部通过(新增 testToolCategoryCoverage / testToolGroupsView / testToolGroupToggleRules / testAiToolCommandGroups,并同步既有分组断言)
  • npm run build && npm run smokeSMOKE OK: 插件加载无异常 + SMOKE OK: globalThis.aiplugin4 API 可用
  • npm run package:check:包格式与体积校验通过

行为变更提示:.ai tool 无参输出由「全量列表」改为「组概览」,已保留 .ai tool all 作为等价逃生口,并在 changelog / README 明示;.ai tool off(含无参)默认保留核心常驻工具,避免 AI 静默失去工具发现与执行入口。

- 新增 [types] 表(每行 "模型名" = "text" / "vision" / "embed"):configs/model.ts 的 ApiConnectionItem 增加 types(objectValue: any,保留原值以便精确校验),逐键校验并给出非法值 / 模型名含点号未加引号(被解析成嵌套表)的 error 日志;非法值只忽略该键,不影响整行连接
- catalog.ts:新增 DeclarableModelTag(限 text/vision/embed,不含内部排除值 gen)与 ClassifyExtra;classifyModel 优先级改为 手动声明 > 命名终值(rerank/生图/嵌入白名单) > 接口能力位(仅正向证据) > 命名能力位 > 兜底 text;手动声明即最终答案,与自动判定冲突时按声明执行、不记日志
- model.ts:ConnConfigLike 增加 modelTypes;rebuildEntries 把 manual 传给 classifyModel;新增 warnUnusedModelTypes() —— [types] 声明未命中当前列表(仅 status=ok 时判定)记一条 warning,按 connIndex:模型名 去重,reset() 清空
- 配置描述与出厂示例补 [types](写明"必须写在本行最后""模型名含 . : / 需加引号"两条坑);.ai model 帮助补一句类型声明说明
- 单测 4 项:声明生效(嵌入/识图进候选、嵌入不再进对话候选)、绝对优先(glm-4v→text、text-embedding-3-small→vision、覆盖生图白名单)、TOML 解析(大小写空格/引号键/非法值/裸键嵌套表/表头顺序错误整行跳过)、未命中声明 warning(恰好一次、命中不提示、列表未就绪不误报、忽略连接不提示)
- README/docs 同步:api连接 配置手册与示例、分类优先级说明、.ai model 命令手册、catalog/model 模块说明、模型类型排查话术
- list.ts:新增 ModelCapabilityHints / ModelListEntry / ModelListResult;ListFetchFn 返回 ModelListResult(string[] 是其等价子集,既有单测桩与老路径零改动)
- 列表响应对象项提取供应商自报能力位 extractHints():type/model_type/kind/task(LM Studio、vLLM 等)、architecture.input_modalities(OpenRouter 等)、capabilities(数组或对象,Ollama 等)、supports_vision/vision;未知取值(含 anthropic 的 type:"model")一律忽略;只产出 vision/embed 正向证据(不产出 text,避免保守元数据把多模态模型降级)
- normalizeModelListResult():归一化为「模型名(保序去重)+ 能力位映射(同名多次出现逐键合并)」,解析失败文案与超时/翻页/认证语义保持不变;仍只发一次列表请求,不做任何额外探测
- model.ts:ConnState 增加 hints(只存内存);fetchConnState 走归一化(失败时清空 hints);rebuildEntries 把 hints 传给 classifyModel
- 单测 3 项:真实解析路径(桩 HTTP 响应)下 7 种字段/取值的能力位分类 + 候选生效(嵌入不进对话候选)+ 名字保序去重;只取正向证据(capabilities:["completion"] 不降级 glm-4v、命名终值优先于接口的 type:"vlm");老式 string[] 结果行为不变
- 文档同步:changelog 能力位条目、README 分类说明字段表、docs/03 list.ts 模块说明、docs/02 视觉标签来源优先级
- 模板配置的每个元素是一个文本框,不能用「行」描述元素;框内内容自身的「行」表述保持原样
- 模型配置:[types] 提示改「必须写在本框最后」,描述改「在本框末尾追加 [types] 表,表内每个模型写一条 …」「否则整框解析失败」「框序 = 连接序号(自上而下,第一个框为 0)」;模板注释「按行序逐键合并」→「按框顺序逐键合并」;parseModelTypes 与 buildModelConfig 内部注释同步
- 其余模板配置:「每行一个」→「每框一个」——预设上下文、自动切换触发错误、忽略消息正则、触发正则、本地图片/语音/文件/视频路径、角色扮演设定、子代理禁止调用工具、禁止调用与默认关闭的函数、禁止调用与默认关闭的 OB11 action、可调用指令白名单;音乐服务配置「每行一条」→「每框一条」
- 刻意保留(属框内内容语义,非模板元素,改了才是误伤):角色设定「第一行为角色设定名称」、事件白名单「每行一个事件类型」(parseNoticeWhitelist 按逗号/换行切分,一个框内可写多个)、TOML/JSON「逐行解析」、模板示例内「使用前删除该行」「删掉 models 行」、知识库正文「每个小节第一行…」
- changelog 同步(含 4.23.0 条目措辞);单测 238 项全绿,lint/tsc 无输出
- 模板配置的每个元素是一个文本框,不用「行」描述模板元素;框内内容自身的「行」表述保持原样
- 日志:api连接 / 模型规则 的模板解析错误、[types] 非法值提示改为「第 N 框」(4 处)
- 代码注释:ConnConfigLike.connIndex 改述为「模板框序号」;request_rules 的合并语义改述为「框序」
- 文档:README 与 docs/03、05、09、11、12 同步——api连接/模型规则、预设上下文、自动切换触发错误、忽略消息与触发正则、本地图片/语音/文件/视频路径、角色扮演设定、子代理禁止调用工具、禁止调用与默认关闭的函数及 OB11 action、可调用指令白名单、音乐服务配置的「每行一个(条)」→「每框一个(条)」;[types] 说明改为「在本框末尾追加 [types] 表,表内每个模型写一条…;必须写在本框最后,其后不能再写 api_key 等键,否则整框解析失败」
- api连接 出厂示例:模型名改为 deepseek-flash,[types] 由注释示例改为生效示例(deepseek-flash 声明为 vision)
- 刻意保留(属框内内容语义,改了才是误伤):事件白名单「每行一个事件类型」(parseNoticeWhitelist 按逗号/换行切分,一个框内可写多个)、角色设定「第一行为角色设定名称」、TOML/JSON「逐行解析」、模板示例内「使用前删除该行」「删掉 models 行」、知识库正文;历史 changelog 条目不改
- changelog 4.23.0 配置变更条目补充该约定说明;tsc/lint 无输出,单测 238 项全绿,build + smoke 通过
内置工具按能力细分为 14 个分类(category),MCP 工具按服务器成组,`.ai tool`
从"全量列表"改为组概览 + 组明细 + 整组开关;技能/知识库不参与组维度。

- Tool 新增 category 字段与 Tool.withCategory(分类, 注册批次) 包装,62 个
  new Tool 调用点零改动;未打分类的内置工具兜底归「其他」,外部插件注册的
  工具归「外部插件」(agent/api.ts)
- .ai tool:无参=组概览(组名+数量+开/关统计)、<组名>=组明细、<函数名>=详情、
  all=原扁平全量视图;list 为概览别名
- .ai tool on/off:支持组名(--group= 显式指定,绕开 on/off/help/call/list/all
  保留字与撞名);关闭时默认跳过核心常驻工具(CORE_TOOL_NAMES),无参 off 同样
  适用,--force 才一并关闭;开启时跳过「禁止调用的函数」并如实回报变更/跳过个数;
  工具名与无参用法完全保持原行为
- 新增 src/tool/tool_group.ts:setToolGroupState / formatGroupToggleReply,
  .ai tool on/off <组名> 与 .ai mcp on/off <服务器> 共用同一批量开关实现
- AI 侧同步口径:list_tools 组头与 search_tools 详情来源改用 groupDisplay
  (内置·记忆 / MCP 服务器名 / 技能 / 知识库);mcp= 过滤经 matchesGroupFilter
  支持分类名、来源分组、组显示名(mcp=内置 仍匹配全部内置工具)
- 文档:changelog / README(工具管理命令、可用工具函数表按工具组重排、禁止调用
  的函数)/ docs/04(category 属性、工具权限与分组实现)/ docs/05(tool 子命令)
- 单测:新增 testToolCategoryCoverage / testToolGroupsView / testToolGroupToggleRules
  / testAiToolCommandGroups,并同步既有分组断言(内置·其他)
@error2913
error2913 merged commit 9ff93e4 into main Sep 13, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant