引擎开发指南
Hermes 引擎权限控制
Section titled “Hermes 引擎权限控制”权限等级与工具类别的组合决定执行策略(auto / confirm / deny):
| read | write | system | finance | |
|---|---|---|---|---|
| safe | confirm | confirm | confirm | confirm |
| auto | auto | auto | confirm | confirm |
| full-access | auto | auto | auto | auto |
auto:直接执行,无需确认confirm:暂停执行,等待用户在聊天界面点击确认或拒绝deny:拒绝执行(保留策略,当前未启用)
当策略为 confirm 时,引擎通过 SSE 事件向前端发送确认请求,用户可在聊天界面中看到权限确认卡片,点击”允许”或”拒绝”。超时 30 秒未响应将自动拒绝。
用户发送消息 → LLM 决策调用工具 → 查询策略矩阵 → auto: 直接执行 → confirm: 发送 SSE 事件 → 前端弹出确认卡片 → 用户决策 → 执行或跳过确认流程采用 Promise 阻塞模式:引擎发送 SSE permission_request 事件后挂起工具执行,前端渲染确认卡片,用户决策通过 HTTP API 回传,解除 Promise 阻塞继续执行。整个链路支持 AbortSignal 取消和超时保护。
权限控制基于策略矩阵(Policy Matrix)设计。每个工具在 ToolRegistry 中注册时声明类别,运行时引擎根据当前权限等级和工具类别查询策略矩阵,决定自动执行、请求确认或拒绝。
Claude 引擎
Section titled “Claude 引擎”Claude 聊天 API 支持两个技能相关参数:
{ skills?: string[]; explicitSkill?: string;}skills:会话级启用技能 slug 列表,用于过滤全局启用技能。explicitSkill:下一条消息优先使用的技能 slug,由/命令或技能面板 Sparkles 按钮产生。
普通技能会进入稳定的 system prompt;explicitSkill 会转换成 explicitSkillDirective,注入到用户 prompt,而不是 system prompt,以保留 prompt cache。两者同时存在时,显式技能优先,并会从普通技能列表中去重。
支持多种文件类型作为上下文:
files: [ { name: "report.pdf", data: fileBuffer, type: "application/pdf" }, { name: "chart.png", data: imageBuffer, type: "image/png" }]| 模式 | 说明 |
|---|---|
code | 自主编码模式,自动执行工具 |
plan | 规划模式,先制定计划再执行 |
ask | 询问模式,每个操作需确认 |
DeepAgents 引擎
Section titled “DeepAgents 引擎”DeepAgents 针对投资顾问场景优化,内置专用工具:
// 工具示例stockSearchNewsTool // 股票新闻搜索stockGetPriceTool // 获取股票价格stockRecallMarketInfo // 市场信息召回stockRecallCompanyInfo // 公司信息召回noteQueryTool // 投资笔记查询TravilySearchTool // 网络搜索Hermes 引擎技能参数
Section titled “Hermes 引擎技能参数”Hermes 聊天 API 也接收 skills 和 explicitSkill。与 Claude 不同,Hermes 会把技能注册为工具:
registerSkillTools(registry, { enabledSlugs: [...skills, explicitSkill],});Agent 会先通过 skills_list 浏览可用技能,再按需调用 skill_view 读取完整技能内容。若 explicitSkill 不在 skills 中,引擎会临时追加它,确保单次指定技能可用。
// 默认引擎配置{ "defaultEngine": "hermes"}
// 运行时切换引擎const response = await agent.execute({ engine: "claude", model: "claude-3-5-sonnet-latest", messages: [...]});
// DeepAgents 投资顾问const advisor = await investmentAdvisorAgent.chat({ messages: [...], accountId: "user_123", model: "gpt-4-turbo"});