AionUi ACP 单聊技能体系全解:技能自动发现、指定注入与 MCP 工具服务

AionUi ACP 单聊技能体系全解:技能自动发现、指定注入与 MCP 工具服务 AionUi ACP 单聊技能体系全解技能自动发现、指定注入与 MCP 工具服务【免费下载链接】AionUiOpen-source 24/7 Cowork app for OpenClaw, Hermes, Claude Code, Codex, OpenCode and 20 more CLI Agent | Customize your assistants | Team them upStar if you like it!项目地址: https://gitcode.com/GitHub_Trending/ai/AionUi本文基于docs/prds/conversations/acp/skills.mdF-SKILL 系列 PRD覆盖技术场景 S-MSG-04 ~ S-MSG-06、S-SKILL-01展开并结合仓库源码与docs/prds/conversations/acp/agent-skill-discovery.md调研文档系统讲解 AionUi 中 ACPAgent Client Protocol单聊会话的技能扩展机制。读完本文你将掌握 AionUi 如何为 AI 自动发现并注入技能、如何在发送消息时精确指定技能以及 MCP 外部工具服务如何在会话建立时自动装配并了解每条能力的实现状态与底层源码证据。一、背景ACP 会话中的技能与工具从何而来AionUi 是一款面向 OpenClaw、Hermes、Claude Code、Codex、OpenCode 等 20 CLI Agent 的开源 24/7 协同工作台。在 ACP 单聊场景下技能Skill和MCP 工具服务是让 AI 获得专业能力的两条核心路径技能以 Markdown 文件形式存在的专业能力描述如代码审查、测试规范告诉 AI你会做什么、怎么做MCP 工具服务通过 Model Context Protocol 暴露的外部工具数据库查询、API 调用、图像生成等让 AI 能真正执行动作。关于 ACP 协议本身的边界docs/prds/conversations/acp/agent-skill-discovery.md的调研指出ACP v1 协议没有定义一等的 skill 对象也没有标准的加载 skill方法。session/new、session/load、session/resume、session/prompt等会话生命周期方法可以携带 workspace root、MCP servers 等上下文但 skill 的发现与加载完全依赖各 Agent 后端自己的能力。AionUi 因此在产品层设计了自动发现注入与指定注入两套机制来弥补协议缺口这正是 F-SKILL-01 / F-SKILL-02 要解决的问题。二、F-SKILL-01AI 技能自动发现与注入 [已实现]2.1 用户故事与正常流程作为用户我希望 AI 能自动发现并使用我配置的技能如代码审查、测试等专业能力以便获得更专业的帮助。前置条件用户已在技能目录中配置了技能。正常流程用户视角用户发送首条消息时系统自动扫描并发现可用技能技能索引自动注入到 AI 的上下文中AI 知道自己拥有哪些专业能力AI 根据任务需要自动调用相应技能。2.2 不同 AI 后端的差异原生发现 vs Prompt 注入这一流程在不同 AI 后端上有两条截然不同的实现路径后端类型机制说明支持原生技能发现的后端工作目录技能文件AI 通过工作目录中的技能文件自动获取技能信息AionCore 会在 workspace 中创建技能软链不支持原生技能发现的后端首条消息注入技能索引系统通过在首条消息中注入技能索引来告知 AI 其拥有的能力从底层实现看判断走哪条路的关键开关是agent_metadata表中的native_skills_dirs字段ACP backend 是否使用原生 skill 目录完全由该字段决定。在 AionUi 前端这一字段也暴露给了用户——自定义 Agent 的高级编辑JSON 面板中可以直接配置native_skills_dirs见 acpTypes.ts 中CustomAgentAdvancedOverrides类型的定义其注释明确说明这些字段直接映射到后端AgentMetadata列snake_case 键名与后端 wire format 一致。当 Agent 没有配置 native skill dirs 时AionCore 会走prompt injectionPrompt 注入first_message_injector中区分了 native support 与 injected skills 两种模式native skill discovery 使用 light mode否则使用 heavy mode 注入技能索引。2.3 三种技能来源按验收标准自动发现需覆盖三种来源内置技能builtin应用自带的能力如 cron 相关技能标记为自动注入打包技能随扩展Extension插件分发的技能用户自定义技能custom用户手动放入技能目录的技能。这一模型在 SkillsHubSettings.tsx 中有直接体现SkillInfo类型带有is_auto_inject、is_custom与source?: builtin | custom | cron | extension字段说明技能中心Skills Hub正是按来源维度对技能进行管理、展示和标记的。2.4 内置 ACP Agent 的原生技能目录清单agent-skill-discovery.md调研整理了 AionCore 内置 ACP Agent 的native_skills_dirs配置与热加载能力矩阵这是判断技能能否在当前会话被识别的重要参考BackendAgentnative_skills_dirs当前会话新增 skillclaudeClaude Code.claude/skills支持但要求顶层.claude/skills在 session 启动时已存在codexCodex CLI.codex/skills路径可能不匹配官方文档为.agents/skills需复核geminiGemini CLI.gemini/skills可以支持但通常需要触发/skills reloadqwenQwen.qwen/skills文档说明需要重启不承诺原生热加载codebuddyCodeBuddy.codebuddy/skills未确认热加载/skills仅展示已加载项droidDroid.factory/skills未确认热加载gooseGoose.goose/skills未确认kimiKimi.kimi/skills未确认opencodeOpenCode.opencode/skills同时兼容.claude/skills、.agents/skills未确认热加载vibeVibe.vibe/skills同时兼容.agents/skills未确认热加载cursorCursor.cursor/skills未确认auggie/copilot/qoder/kiro/hermes/snow/openclaw对应 CLINULL只能走 prompt injection值得注意的是不同 Agent 对会话中途新增技能的支持差异极大Claude Code 会自动监听已存在 skill 目录中的SKILL.md变化Gemini CLI 提供/skills reload刷新而 Qwen Code 明确要求重启才能生效。因此会话中动态加技能不能作为 ACP 通用能力承诺而应按 Agent 能力分别处理——这正是产品层设计 capability matrix 的原因。2.5 技能文件服务的源码实现技能发现的前提是能安全地读取技能目录。AionUi 主进程侧通过 skillFiles.ts由 index.ts 导出createSkillFileService提供技能文件读写服务其实现包含严格的安全约束技能根目录必须是绝对路径resolveSkillRoot中if (!path.isAbsolute(skillLocation))直接抛错若传入路径的 basename 是skill.md则自动取其父目录作为根目录禁止路径穿越resolveExistingEntry通过isWithin校验相对路径解析后仍在技能目录内并通过fs.realpath二次校验真实路径防符号链接逃逸目录列表按规则排序skill.md固定置顶目录优先于文件其余按名称排序。这个服务在 UI 侧支撑了技能文件的浏览与预览SkillFileBrowser、SkillDetailPage也验证了注入的内容包含技能目录路径信息这一验收标准的可行性。三、F-SKILL-02指定技能注入高级模式[已实现]3.1 用户故事与正常流程作为高级用户我希望在发送消息时能指定使用哪些技能以便精确控制 AI 的专业能力范围。正常流程用户视角用户在高级编辑界面中选择要启用的技能发送消息系统将选中技能的完整内容注入到消息上下文中AI 获得所选技能的详细指导按照技能要求执行任务。异常情况未选择任何技能时消息按原样发送不注入技能信息。3.2 源码链路从会话快照到发送框指定技能注入的 UI 数据流在 ACP 发送框 AcpSendBox.tsx 中有清晰呈现const loadedSkills conversationContext?.loadedSkills ?? [];当loadedSkills.length 0时发送框的菜单会渲染出 Selected skills已选技能Action Sheet列出每个已加载技能名作为选项见AcpSendBox.tsx第 633-646 行。这一数据的来源是会话快照——ConversationContext.tsx 中loadedSkills的注释说明Loaded skill names for this conversation (snapshot from conversation.extra.skills). Surfaced inside the SendBoxmenu so users can review/jump to active skills.即loadedSkills是conversation.extra.skills的快照用于在发送框菜单中展示/跳转当前生效的技能。实际接线在 ChatConversation.tsxloadedSkills{(conversation.extra as { skills?: string[] } | undefined)?.skills}3.3 请求层inject_skills参数在消息发送的 IPC 请求层AionUi 在 ipcBridge.ts 中定义了inject_skills?: string[]字段并在第 379 行将其透传给后端。这意味着指定注入不仅是一个 UI 交互它已经打通到协议请求——前端可以在发送消息时携带一份技能名单让后端按名单注入对应技能。验收标准对照支持在发送消息时手动选择启用的技能 —— 通过发送框菜单的 Selected skills 列表实现选中技能的完整内容被注入到 AI 上下文 —— 由inject_skills请求字段与 AionCore 的inject_skillsturn 机制共同完成注入的内容包含技能目录路径信息 —— 由主进程技能文件服务skillFiles.ts提供目录路径解析支撑。3.4 边界会话中临时新增技能的当前缺口尽管指定注入已实现但在会话进行中添加新技能仍有产品链路缺口。agent-skill-discovery.md明确列出当前状态extra.skills在会话创建后不可修改AionCore 会拒绝会话创建后对该字段的改动AionCore 发送消息前会调用ensure_workspace_skill_links重新确保技能软链存在但读取的是会话创建时的extra.skills不可变快照request.inject_skills目前尚未被软链逻辑与[LOAD_SKILL]middleware 的allowed_skill_names采纳初始技能为空时不会预创建 native 顶层目录而这恰恰是 Claude Code watcher 能识别后续新增技能的前提。从源码结构看AionUi 产品层因此采用按 Agent 能力声明的策略Claude 可在已存在目录内热加载Gemini 需触发/skills reloadQwen 需重启或走 prompt injection。对用户的实际指导是若想在当前会话内使用新技能优先选择支持热加载的 Agent如 Claude Code或直接新建会话。四、F-SKILL-03MCP 工具服务注入 [部分实现]4.1 用户故事与正常流程作为用户我希望 AI 能自动使用我配置的外部工具服务以便 AI 能够完成更多类型的任务如数据库查询、API 调用等。前置条件用户已在设置中添加并启用了 MCP 工具服务。正常流程用户视角用户在设置中配置 MCP 工具服务添加服务地址、选择传输方式、配置认证信息用户启用该工具服务用户创建或进入会话时系统自动将所有已启用的工具服务注入到 AI 会话中AI 在对话中根据需要自动调用外部工具用户会在界面中看到工具调用的过程和结果用户无需在每次对话中手动选择要使用的工具。4.2 MCP 工具服务的三种来源与技能类似MCP 工具服务也有三种来源用户手动配置在设置界面添加的外部工具服务如数据库连接、API 网关等系统内置应用预装的工具服务如图像生成标记为内置用户可启用/禁用扩展贡献通过已安装的扩展插件自动提供的工具服务。系统内置的典型例子是图像生成服务packages/desktop/src/process/resources/builtinMcp/constants.ts中定义了BUILTIN_IMAGE_GEN_ID builtin-image-gen对应的 imageGenServer.ts 会在主进程侧拉起内置 MCP 服务器。前端在 McpManagement.tsx 中用isVisibleMcpServer过滤逻辑将内置图像生成服务从可见可编辑列表中隐藏避免用户误删预装服务但保留了启用/禁用能力。4.3 设置中心的 MCP 管理能力McpManagement.tsx 是 MCP 配置的入口页面围绕添加 → 测试 → 启用 → 授权提供完整操作闭环连接测试useMcpConnection提供单个/批量测试handleTestMcpConnection、handleTestMcpConnections批量测试并发数为 4OAuth 登录useMcpOAuth的login(server)执行授权流程成功后自动触发一次连接测试失败则展示错误信息见第 59-71 行handleOAuthLogin增删改与批量导入useMcpServerCRUD提供handleAddMcpServer、handleBatchImportMcpServers、handleEditMcpServer、handleDeleteMcpServer支持 JSON 导入与一键导入JsonImportModal/OneClickImportModal导入格式为{ mcpServers: { ... } }授权状态回显checkOAuthStatus会在页面加载时对所有支持 OAuth 的服务检查状态。哪些服务支持 OAuth源码给出了明确判断条件第 17-18 行const isOAuthCapableServer (server: IMcpServer) server.transport.type http || server.transport.type sse || server.transport.type streamable_http;即http、sse、streamable_http 三种传输方式的服务具备 OAuth 能力。这也对应了 ACP 协议的 MCP 传输能力模型——acpTypes.ts 中AcpMcpCapabilities定义了stdio/http/sse三种传输类型stdio 是 ACP 规范要求的必选能力。4.4 会话注入规则与重要限制PRD 明确了两条影响用户体验的关键规则MCP 工具服务仅在会话建立时注入会话中途新增或修改的工具配置需要重新进入会话才生效禁用某个工具服务后已建立的会话不受影响新建会话才会排除该工具。这两条规则背后的原因是 MCP 服务随session/new一起装配AionCore 在会话创建时把已启用的服务快照进会话上下文。因此操作上的最佳实践是先配置好 MCP 服务再新建会话或修改配置后重启会话。4.5 异常情况处理PRD 定义了一套完整的异常降级策略MCP 工具服务连接失败AI 仍可正常对话但缺少对应外部工具能力需要 OAuth 认证的工具服务系统会引导用户在设置中完成登录授权会话恢复时MCP 工具服务自动重新加载工具服务在会话中途不可用AI 会收到工具调用失败的反馈并尝试其他方式完成任务。4.6 不同 AI 后端的差异部分后端可能不支持 MCP 工具服务取决于其 ACP adapter 是否声明mcpCapabilities不同后端支持的 MCP 传输方式可能不同——ACP 规范规定只有当 agent 声明了mcpCapabilities时 stdio 才为必选若 initialize 响应中缺失该字段则所有传输能力均为 false见 acpTypes.ts 注释。4.7 实现差距OAuth 引导 UI 缺失F-SKILL-03 标注为部分实现PRD 明确指出实现差距4/5 验收标准通过缺失 OAuth 认证引导 UI仅支持 header 传递 token。从源码看OAuth 的登录动作本身已实现useMcpOAuth.login可发起授权并回写 token但引导用户去完成授权的产品化流程尚未闭合——即当某个服务需要 OAuth 时系统缺少主动的引导入口/弹窗用户需要自行前往设置页操作。这是后续迭代的明确方向。五、实现状态与验收标准总览功能状态验收标准达成情况F-SKILL-01 技能自动发现与注入已实现首条消息时自动发现并注入可用技能通过原生发现 prompt 注入双路径支持内置、打包、用户自定义三种来源通过SkillInfo.source字段区分技能注入仅在首条消息时执行后续不重复通过first_message_injector首消息注入模型F-SKILL-02 指定技能注入已实现支持发送时手动选择启用技能通过发送框 Selected skills 菜单选中技能完整内容注入上下文通过inject_skills请求字段注入内容包含技能目录路径信息通过技能文件服务返回目录路径F-SKILL-03 MCP 工具服务注入部分实现已启用服务进入会话时自动注入通过支持手动配置、内置、扩展三种来源通过IMcpServer.builtin、扩展 MCPOAuth 认证引导用户完成授权未通过仅支持 header 传 token加载失败不影响 AI 基本功能通过会话恢复时自动重新加载通过六、实践建议与延伸阅读综合 PRD 与源码给 ACP 单聊用户的实操建议想省心把技能文件按 Agent 的native_skills_dirs规范放好如 Claude Code 用.claude/skills由 F-SKILL-01 自动发现注入首条消息即生效想精确在发送框中通过 菜单的 Selected skills 指定本次会话使用的技能F-SKILL-02未选择时消息原样发送要用外部工具先在设置中配置并测试 MCP 服务支持 JSON 批量导入确认通过后再新建会话让服务随会话自动注入F-SKILL-03需要 OAuth 的服务当前需手动在设置页完成授权注意会话边界技能快照与 MCP 装配都以会话创建时刻为准会话中改动配置请重开会话。想深入探索可继续阅读技能发现机制调研docs/prds/conversations/acp/agent-skill-discovery.md同系列 PRDmessaging.md、session.md、config.md、permissions.md技能文件服务实现skillFiles.ts发送框技能菜单AcpSendBox.tsxMCP 设置页McpManagement.tsx技能中心SkillsHubSettings.tsx【免费下载链接】AionUiOpen-source 24/7 Cowork app for OpenClaw, Hermes, Claude Code, Codex, OpenCode and 20 more CLI Agent | Customize your assistants | Team them upStar if you like it!项目地址: https://gitcode.com/GitHub_Trending/ai/AionUi创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考