work hard work smart

专注于AI+Java后端开发。 不断总结,举一反三。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

AgentScope学习笔记 人工介入

Posted on 2026-09-26 20:46  work hard work smart  阅读(2)  评论(0)    收藏  举报
AgentScope1.0版本

人工介入 Human In LOOP

public class HitlDemo {

    public static class Tools {
        @Tool(name = "delete_file", description = "Delete a file")
        public String del(@ToolParam(name = "filename") String f) {
            System.out.println("删除文件" + f);
            return "deleted " + f;
        }
        @Tool(name = "search_web", description = "Search the web")
        public String search(@ToolParam(name = "q") String q) {
            return "results for " + q;
        }
    }

    static class ConfirmHook implements Hook {
        static final List<String> SENSITIVE = List.of("delete_file");
        @Override public <T extends HookEvent> Mono<T> onEvent(T e) {
            if (e instanceof PostReasoningEvent p) {
                boolean dangerous = p.getReasoningMessage()
                        .getContentBlocks(ToolUseBlock.class).stream()
                        .anyMatch(t -> SENSITIVE.contains(t.getName()));
                if (dangerous) p.stopAgent();
            }
            return Mono.just(e);
        }
    }

    public static void main(String[] args) {

        String apiKey = "sk-8980de1b287d490eb259d2f70eebeab9";

        Toolkit toolkit = new Toolkit();
        toolkit.registerTool(new Tools());

        ReActAgent agent = ReActAgent.builder()
                .name("SafeAgent")
                .model(DashScopeChatModel.builder()
                        .apiKey(apiKey)
                        .modelName("qwen-plus").stream(true)
                        .formatter(new DashScopeChatFormatter()).build())
                .toolkit(toolkit)
                .memory(new InMemoryMemory())
                .hook(new ConfirmHook())
                .build();

        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.print("You: ");
            Msg userMsg = Msg.builder().role(MsgRole.USER)
                    .content(TextBlock.builder().text(sc.nextLine()).build()).build();
            Msg resp = agent.call(userMsg).block();

            while (resp != null && resp.hasContentBlocks(ToolUseBlock.class)) {
                System.out.println("⚠ Pending tools: " + resp.getContentBlocks(ToolUseBlock.class));
                System.out.print("Confirm? (y/n): ");
                if (sc.nextLine().equalsIgnoreCase("y")) {
                    resp = agent.call().block();   // 无参恢复
                } else {
                    List<ToolResultBlock> cancel = resp.getContentBlocks(ToolUseBlock.class).stream()
                            .map(t -> ToolResultBlock.of(t.getId(), t.getName(),
                                    TextBlock.builder().text("Cancelled").build()))
                            .toList();
                    Msg cancelMsg = Msg.builder().role(MsgRole.TOOL)
                            .content(cancel.toArray(new ToolResultBlock[0])).build();
                    resp = agent.call(cancelMsg).block();
                }
            }
            System.out.println("Agent: " + resp.getTextContent());
        }
    }
}