Solon v4.0.5

harness - 配置参考

</> markdown
2026年8月3日 下午3:31:35

HarnessEngine 的配置示例:

HarnessEngine engine = HarnessEngine.of("work", ".soloncode/")
     .systemPrompt("你是一个 AI 助手")
     .sessionWindowSize(12)
     .compressionThreshold(100, 0.75D)
     .toolsAdd(ToolName.TOOL_ALL_FULL) // 设定工具权限
     .build();

可选配置:

1、核心配置项

配置项类型默认值描述
workspaceStringwork工作区
harnessHomeString.solon/马具主目录(例:.soloncode
systemPromptString/系统提示词
userAgentString/用户代理标识(会自动传播给所有模型)
toolsSet/工具权限配置(** = 所有工具;* = 仅公域工具)
disallowedToolsSet/禁用工具配置(使用具体工具名)
defaultModelString/默认模型名(不指定则取 models 中第一个)
modelsMap/大模型配置
maxTurnsint20根代理最大循环步数
autoRethinkbooleantrue最大步数自动续航(由 LLM 反思控制)
sessionWindowSizeint8会话历史窗口大小(新指令时使用几条历史消息)
compressionMaxMessagesint40触发上下文压缩的消息条数阈值
compressionMaxTokensint60_000触发上下文压缩的内容长度阈值
compressionModelString/压缩用大模型(不指定则使用主模型)
cacheControlCacheControl/缓存控制(用于 Anthropic 等支持 prompt caching 的模型)
skillProviderSkillProvider/技能提供者(可对接数据库等外部存储,不指定则用默认 MountManager)

models 模型配置参考:《模型配置与请求选项》

2、安全与行为配置

配置项类型默认值描述
sandboxEnabledbooltrue沙盒模式,启用时禁止访问绝对路径(只能访问工作区与用户主目录)
sandboxAllowUserHomebooltrue沙盒模式下允许访问用户主目录
sandboxSystemRestrictbooltrue沙盒系统级限制
hitlEnabledboolfalse是否启用人工审核(危险操作需人工确认)
subagentEnabledbooltrue是否启用子代理模式(自动委派任务给专家代理)
bashAsyncEnabledboolfalse是否启用 Bash 异步执行
memoryEnabledbooltrue是否启用心智记忆
userAgentString/用户代理标识(会自动传播给所有模型)
apiRetriesint3API 重试次数
mcpRetriesint3MCP 重试次数
modelRetriesint3模型重试次数

3、扩展配置

配置项类型默认值描述
mountsMountDir/挂载配置(alias 须以 @ 开头)
mcpServersMap/Mcp 服务配置
apiServersMap/Web Api 服务配置
lspServersMap/LSP 服务配置
extensionsList/扩展接口配置
compressionInterceptorContextCompressionInterceptor自动创建上下文压缩拦截器
stopLoopInterceptorStopLoopInterceptor自动创建停止循环拦截器(默认参数:3 次连续相同错误 / 8 轮窗口)
hitlInterceptorHITLInterceptor自动创建人工介入拦截器(默认对 bash 工具绑定 HitlStrategy)
sessionProviderAgentSessionProvider/会话提供者(必填)
memoryProviderMemorySolutionProvider/心智记忆存储方案

附录、工具权限配置选择(tools)

工具名类型描述
**-所有公域 + 私域工具
*-仅所有公域工具
pi聚合微形命令行工具(包括工具:read, write, edit, bash)
hitl私域人工介入审核
generate私域动态生成子代理
restapi私域Web 服务 API 接入
mcp私域MCP 服务接入
lsp私域LSP 代码理解服务
code公域编码指引(自动分析项目类型、编译指令等)
codesearch公域网络代码搜索
websearch公域网络搜索
webfetch公域网页内容抓取
todo公域任务清单管理
skill公域专家技能调用
task公域子代理任务委派
bash公域Shell 命令执行
ls公域列出目录内容
grep公域递归内容搜索
glob公域通配符文件搜索
edit公域文件编辑(精准文本替换,支持多处原子编辑;含 write、read)
read公域读取文件内容
write公域写入文件内容
clock公域时间/定时相关能力(ClockTalent 提供)
memory公域心智记忆读写(MemoryTalent 提供)

附录、运行时动态修改

HarnessEngine 构建完成后,仍可在运行时动态调整工具权限与模型(变更后会自动重建主代理,使其立即生效)。

  • 动态调整工具权限
engine.allowTool("websearch"); // 动态授权一个工具
engine.disallowTool("bash"); // 动态禁用一个工具

engine.allowToolReset(Arrays.asList("read", "write", "edit")); // 仅重置白名单(allowedTools)
engine.disallowToolReset(Arrays.asList("bash")); // 仅重置黑名单(disallowedTools)
engine.toolPermissionReset(Arrays.asList("read", "write"), Arrays.asList("bash")); // 同时重置白/黑名单(避免两次重建)

三种重置方法的区别

  • allowToolReset(tools) — 仅重置白名单(allowedTools),黑名单不变;
  • disallowToolReset(tools) — 仅重置黑名单(disallowedTools),白名单不变;
  • toolPermissionReset(tools, disallowedTools) — 同时重置白/黑名单,触发一次主代理重建,比分别调用前两者更高效。
  • 动态管理模型
engine.addModel(new ChatConfig().then(c -> {
 c.setApiUrl("https://api.deepseek.com");
 c.setApiKey("sk-***");
 c.setModel("deepseek-v4-flash");
})); // 添加模型

engine.setDefaultModel("deepseek-v4-flash"); // 设定默认模型(影响主代理时自动刷新)
engine.removeModel("deepseek-v4-flash"); // 移除模型
  • 其它运行时配置
engine.setMaxTurns(30);
engine.setSessionWindowSize(8);
engine.setCompressionThreshold(40, 60_000);
engine.setSandboxEnabled(true);
engine.setHitlEnabled(false);
engine.setSubagentEnabled(true);
engine.setMemoryEnabled(true);
engine.setCacheControl(CacheControl.of(...));
engine.setSystemPrompt("新的系统提示词");
  • 动态管理扩展
engine.addExtension((agentName, builder) -> {
 // 自定义拦截器或工具注入
});
engine.removeExtension(extension); // 移除扩展(触发主代理重建)
  • 动态管理服务器与挂载点
// 动态添加 MCP 服务
engine.addMcpServer("my-mcp", mcpServerParameters);
engine.refreshMcpServer("my-mcp");
engine.removeMcpServer("my-mcp");

// 动态添加 OpenAPI 服务
engine.addApiServer(apiSource);
engine.refreshApiServer(docUrl);
engine.removeApiServer(docUrl);

// 动态添加 LSP 服务
engine.addLspServer("my-lsp", lspServerParameters);
engine.removeLspServer("my-lsp");

// 挂载点管理
engine.addMount(mountDir);
engine.removeMount("@alias");
engine.refreshMount(null);  // null 表示刷新所有