Solon AI Harness 是一个高性能的智能体"马具(Harness)"框架。作为底层核心,它已在 SolonCode CLI 项目中经过了三个月的深度打磨与实战验证。这次随 Solon AI v3.10.1 首次发布。
1、为什么需要 Harness
业界目前有两个极具启发性的定义:
- 公式定义:Agent = Model + Harness。模型提供推理,而 Harness 提供落地执行的实体。
- 硬件类比:Model 是 CPU(计算核心),Context 是 内存(瞬时寻址),而 Harness 则是 操作系统(资源调度与环境隔离)。
没有 Harness 的 Agent 就像一个漂浮在大脑中的灵魂,虽然能思考,但无法稳定地感知物理世界、无法受控地操作工具,更无法在复杂的长程任务中保持状态。
2、Solon AI Harness 的主要工作
组织工具使用 (Tool Steering)
- 动态挂载与发现(支持 MCP 协议、Web RestApi)。
- 输入/输出的标准化协议转换。
- 安全拦截:在危险指令执行前进行权限校验或人工确认(HITL)。
组织记忆与会话 (Memory & Session Management)
- 管理 Session 的持久化与恢复。
- 区分"短期工作记忆"与"长期向量记忆"。
- 快照机制:在任务中断时自动保存状态,支持断点续传。
操控上下文及摘要压缩 (Context Engineering)
- 窗口滑窗:当 Token 接近上限时,自动识别并保留关键信息。
- 语义压缩:将冗长的工具回显(如数千行代码输出)自动总结为模型可理解的摘要。
- 意图聚焦:通过 RAG 技术动态注入当前任务最相关的片段。
环境隔离与沙盒驱动 (Sandbox & Environment)
- 影子空间:在 .harness 目录下构建隔离的工作区,确保 Agent 的修改不直接污染生产环境。
- 自愈循环:捕获执行过程中的 stderr,将其作为 Observation 反馈给模型,驱动 ReAct 循环自动修正错误。
3、应用示例
引用依赖
xml
<dependency>
<groupId>org.noear</groupId>
<artifactId>solon-ai-harness</artifactId>
</dependency>
构建实例
java
public class DemoApp {
public static void main(String[] arg) throws Throwable {
//--- 1. 初始化
HarnessProperties harnessProps = new HarnessProperties(".tmp/");
harnessProps.addTools(ToolPermission.TOOL_ALL_FULL); //设定工具权限
harnessProps.setChatModel(null); //设定大模型配置
ChatModel chatModel = ChatModel.of(harnessProps.getChatModel()).build();
AgentSessionProvider sessionProvider = new AgentSessionProvider() {
private Map<String, AgentSession> sessionMap = new ConcurrentHashMap<>();
@Override
public AgentSession getSession(String instanceId) {
return sessionMap.computeIfAbsent(instanceId, k -> InMemoryAgentSession.of(k));
}
};
HarnessEngine engine = HarnessEngine.builder()
.properties(harnessProps)
.chatModel(chatModel)
.sessionProvider(sessionProvider)
.build();
}
}
应用示例
public class DemoApp {
public static void main(String[] arg) throws Throwable {
//--- 1. 初始化
// ...
//--- 用主代理执行
csae1(engine, "hello");
//--- 动态创建子代理执行(好处理可以动态创建不同的工具权限)
case2(engine, "hello");
}
private static void csae1(HarnessEngine engine, String prompt) throws Throwable {
AgentSession session = engine.getSession(HarnessEngine.SESSION_DEFAULT);
//--- 用主代理模式
engine.getMainAgent().prompt(prompt)
.session(session) //没有,则为临时会话
.options(o -> {
//按需,动态指定工作区(没有,则为默认工作区)
o.toolContextPut(HarnessEngine.ATTR_CWD, "xxx");
})
.call();
}
private static void case2(HarnessEngine engine, String prompt) throws Throwable {
AgentSession session = engine.getSession(HarnessEngine.SESSION_DEFAULT);
//--- 动态定义智能体
AgentDefinition definition = new AgentDefinition();
definition.setSystemPrompt("xxx"); //系统提示词
definition.getMetadata().addTools(ToolPermission.TOOL_BASH); //工具权限
ReActAgent subagent = engine.createSubagent(definition).build();
subagent.prompt(prompt)
.session(session) //没有,则为临时会话
.options(o -> {
//按需,动态指定工作区(没有,则为默认工作区)
o.toolContextPut(HarnessEngine.ATTR_CWD, "xxx");
})
.call();
}
}