feat: 增加内置read、write、shell 工具支持

This commit is contained in:
2026-05-28 11:16:41 +08:00
parent f324acb83c
commit 2bc525c16e
4 changed files with 457 additions and 0 deletions

View File

@@ -0,0 +1,101 @@
package com.easyagents.agent.runtime.tool.operate;
import com.easyagents.agent.runtime.AgentRuntimeException;
import com.easyagents.agent.runtime.tool.AgentToolSpec;
import io.agentscope.core.tool.Toolkit;
import org.junit.Assert;
import org.junit.Test;
import java.util.List;
import java.util.Set;
/**
* 测试 Agent 操作类工具适配器。
*/
public class AgentOperateToolAdapterTest {
private final AgentOperateToolAdapter adapter = new AgentOperateToolAdapter();
@Test
public void shouldRegisterReadFileToolsWithDefaultHitlDisabled() {
Toolkit toolkit = new Toolkit();
AgentOperateToolSpec spec = spec(AgentOperateToolType.READ_FILE);
List<AgentToolSpec> toolSpecs = adapter.register(List.of(spec), toolkit);
Assert.assertNotNull(toolkit.getTool(AgentOperateToolAdapter.VIEW_TEXT_FILE_TOOL));
Assert.assertNotNull(toolkit.getTool(AgentOperateToolAdapter.LIST_DIRECTORY_TOOL));
Assert.assertEquals(2, toolSpecs.size());
Assert.assertTrue(toolSpecs.stream().noneMatch(AgentToolSpec::isApprovalRequired));
}
@Test
public void shouldRegisterWriteFileToolsWithDefaultHitlEnabled() {
Toolkit toolkit = new Toolkit();
AgentOperateToolSpec spec = spec(AgentOperateToolType.WRITE_FILE);
List<AgentToolSpec> toolSpecs = adapter.register(List.of(spec), toolkit);
Assert.assertNotNull(toolkit.getTool(AgentOperateToolAdapter.WRITE_TEXT_FILE_TOOL));
Assert.assertNotNull(toolkit.getTool(AgentOperateToolAdapter.INSERT_TEXT_FILE_TOOL));
Assert.assertEquals(2, toolSpecs.size());
Assert.assertTrue(toolSpecs.stream().allMatch(AgentToolSpec::isApprovalRequired));
}
@Test
public void shouldRegisterShellToolWithEmptyWhitelist() {
Toolkit toolkit = new Toolkit();
AgentOperateToolSpec spec = spec(AgentOperateToolType.SHELL);
spec.setShellAllowedCommands(Set.of());
List<AgentToolSpec> toolSpecs = adapter.register(List.of(spec), toolkit);
Assert.assertNotNull(toolkit.getTool(AgentOperateToolAdapter.EXECUTE_SHELL_COMMAND_TOOL));
Assert.assertEquals(1, toolSpecs.size());
Assert.assertTrue(toolSpecs.get(0).isApprovalRequired());
}
@Test
public void shouldSkipDisabledOperateTool() {
Toolkit toolkit = new Toolkit();
AgentOperateToolSpec spec = spec(AgentOperateToolType.SHELL);
spec.setEnabled(false);
List<AgentToolSpec> toolSpecs = adapter.register(List.of(spec), toolkit);
Assert.assertNull(toolkit.getTool(AgentOperateToolAdapter.EXECUTE_SHELL_COMMAND_TOOL));
Assert.assertTrue(toolSpecs.isEmpty());
}
@Test(expected = AgentRuntimeException.class)
public void shouldRejectMissingBaseDir() {
AgentOperateToolSpec spec = spec(AgentOperateToolType.READ_FILE);
spec.setBaseDir(null);
adapter.register(List.of(spec), new Toolkit());
}
@Test(expected = AgentRuntimeException.class)
public void shouldRejectRelativeBaseDir() {
AgentOperateToolSpec spec = spec(AgentOperateToolType.READ_FILE);
spec.setBaseDir("relative/workspace");
adapter.register(List.of(spec), new Toolkit());
}
@Test(expected = AgentRuntimeException.class)
public void shouldRejectToolNameConflict() {
Toolkit toolkit = new Toolkit();
AgentOperateToolSpec first = spec(AgentOperateToolType.READ_FILE);
AgentOperateToolSpec second = spec(AgentOperateToolType.READ_FILE);
adapter.register(List.of(first, second), toolkit);
}
private AgentOperateToolSpec spec(AgentOperateToolType type) {
AgentOperateToolSpec spec = new AgentOperateToolSpec();
spec.setType(type);
spec.setBaseDir(System.getProperty("java.io.tmpdir"));
return spec;
}
}