---
title: "示例：定制一个 PiAgent"
---


网上传说的 PiAgent 以 `read`、`write`、`edit`、`bash` 四类终端能力为核心。Harness 提供了 `ToolName.TOOL_PI` 这一快捷枚举，它在工具名映射层展开为 `read`、`write`、`edit`、`bash`、`bash_start`、`bash_wait`、`bash_stop` 七个名字，其中后三个用于异步 Bash 会话的启动、等待与终止。

### 1、代码示例

```java
public class DemoApp {
    public static void main(String[] arg) throws Throwable {
        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.of(".tmp/", ".demo")
                .sessionProvider(sessionProvider)
                .toolsAdd(ToolName.TOOL_PI)
                .build();

        engine.prompt("网络调查 ai mcp 协议，生成一个 mcp.md 报告").call();
    }
}
```

需要注意 `bash_start`、`bash_wait`、`bash_stop` 属于异步会话工具，只有在 `bashAsyncEnabled(true)` 时才会进入代理的真实工具集：`AgentFactory` 完成名字展开后，终端能力会按该开关过滤掉这三个异步工具，而 `bashAsyncEnabled` 默认为 `false`。所以按上例的默认配置，PiAgent 实际可用的是 `read`、`write`、`edit`、`bash` 四个基础工具。若确实需要完整的七个工具，构建时补上该开关即可：

```java
HarnessEngine engine = HarnessEngine.of(".tmp/", ".demo")
        .sessionProvider(sessionProvider)
        .toolsAdd(ToolName.TOOL_PI)
        .bashAsyncEnabled(true) //开启异步 bash 会话，才会暴露 bash_start/bash_wait/bash_stop
        .build();
```