feat: 模型类型声明与能力位识别 + .ai tool 工具组展示与开关(4.23.0) - #141
Merged
Merged
Conversation
- 新增 [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,并同步既有分组断言(内置·其他)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
概述
本 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管理),单工具开关不受影响。list_tools组头与search_tools详情来源改用groupDisplay(内置·记忆/ MCP 服务器名 / 技能 / 知识库);mcp=过滤经matchesGroupFilter支持分类名、来源分组、组显示名(mcp=内置仍匹配全部内置工具)。2. 模型:
api连接支持[types]手动声明模型类型[types]表("模型名" = "text" / "vision" / "embed"):逐键校验并给出非法值 / 模型名含点号未加引号的 error 日志;非法值只忽略该键,不影响整行连接。[types]声明未命中当前模型列表时记一条 warning(仅status=ok时判定,按connIndex:模型名去重)。.ai model帮助同步补说明。3. 模型:列表接口能力位识别(vision / embed)
type/model_type/kind/task、architecture.input_modalities、capabilities、supports_vision),适配 OpenRouter / LM Studio / vLLM / Ollama 风格字段。string[]返回行为不变。4. 文档:模板配置统一按「框」表述
api连接/模型规则的模板解析错误、[types]非法值提示改为「第 N 框」。测试与验证
npx tsc --noEmit:无输出npm run lint:无输出npm run test:unit:242 项全部通过(新增testToolCategoryCoverage/testToolGroupsView/testToolGroupToggleRules/testAiToolCommandGroups,并同步既有分组断言)npm run build && npm run smoke:SMOKE OK: 插件加载无异常+SMOKE OK: globalThis.aiplugin4 API 可用npm run package:check:包格式与体积校验通过