【learn-claude-code】S01AgentLoop - Agent 循环:模型与真实世界的第一道连接 📅 发布时间:2026/7/11 23:43:22 👁️ 浏览次数: 核心理念“模型即 Agent代码即 Harness”源码https://github.com/xiayongchao/learn-claude-code-4j/blob/main/src/main/java/org/jc/agents/S01AgentLoop.java原版https://github.com/shareAI-lab/learn-claude-code这个项目源自 shareAI-lab/learn-claude-code旨在帮助 Java 程序员理解 AI Agent 的核心机制。不同于 Python 原版本文用 Java 实现相同的 Agent Loop让习惯 Java 的开发者也能深入学习。问题背景语言模型能推理代码但它无法直接触碰真实世界——不能读文件、不能运行测试、不能查看错误日志。没有 Agent Loop每次工具调用后你都需要手动把结果粘回去。你自己就是那个循环。解决方案一个循环控制整个流程-------- ------- --------- | User | --- | LLM | --- | Tool | | prompt | | | | execute | -------- ------ -------- ^ | | tool_result | ---------------- (loop until 模型不再调用工具)Java 实现详解1. 入口main 方法publicstaticvoidmain(String[]args){ScannerscannernewScanner(System.in);ListChatCompletionMessageParammessagesnewArrayList();while(true){System.out.print(请输入 );Stringqueryscanner.nextLine();if(List.of(q,exit,).contains(query.strip())){break;}// 添加用户消息messages.add(ChatCompletionMessageParam.ofUser(ChatCompletionUserMessageParam.builder().content(query).build()));// 启动 Agent 循环agentLoop(messages);// 输出最终回复System.out.println( Commons.getText(messages.get(messages.size()-1)));}}2. 核心agentLoop 方法// 工具处理器注册privatestaticfinalMapString,FunctionString,StringTOOL_HANDLERSnewHashMap();static{TOOL_HANDLERS.put(bash,Tools::runBash);}privatestaticfinalStringSYSTEM你当前工作目录为 Commons.CWD作为编程智能体使用 Bash 完成任务直接执行、无需解释;publicstaticvoidagentLoop(ListChatCompletionMessageParammessages){while(true){// 1. 构建完整消息列表系统提示 历史消息ListChatCompletionMessageParamfullMessagesnewArrayList();fullMessages.add(ChatCompletionMessageParam.ofSystem(ChatCompletionSystemMessageParam.builder().content(SYSTEM).build()));fullMessages.addAll(messages);// 2. 调用 LLM APIChatCompletionCreateParamsparamsChatCompletionCreateParams.builder().model(qwen3.5-plus).messages(fullMessages).tools(List.of(Tools.bashTool())).build();ChatCompletionchatCompletionCommons.getClient().chat().completions().create(params);ChatCompletionMessagemessagechatCompletion.choices().get(0).message();// 3. 将模型回复加入历史messages.add(ChatCompletionMessageParam.ofAssistant(message.toParam()));// 4. 检查是否有工具调用OptionalListChatCompletionMessageToolCalltoolCallsOptionalmessage.toolCalls();if(toolCallsOptional.isEmpty()){return;// 无工具调用结束循环}// 5. 执行工具调用for(ChatCompletionMessageToolCalltoolCall:toolCallsOptional.get()){ChatCompletionMessageParamtoolMessageTools.exe(TOOL_HANDLERS,toolCall);if(toolMessage!null){messages.add(toolMessage);// 将工具结果发回给模型}}}}3. 工具执行Tools.exe 方法publicstaticChatCompletionMessageParamexe(MapString,FunctionString,StringTOOL_HANDLERS,ChatCompletionMessageToolCalltoolCall){if(toolCallnull||!toolCall.isFunction()){returnnull;}ChatCompletionMessageFunctionToolCallfunctionCalltoolCall.asFunction();StringfunctionNamefunctionCall.function().name();StringargumentsfunctionCall.function().arguments();FunctionString,StringtoolHandlerTOOL_HANDLERS.get(functionName);if(toolHandlernull){returnChatCompletionMessageParam.ofTool(ChatCompletionToolMessageParam.builder().content(String.format(未知的工具%s,functionName)).toolCallId(functionCall.id()).build());}returnChatCompletionMessageParam.ofTool(ChatCompletionToolMessageParam.builder().content(toolHandler.apply(arguments)).toolCallId(functionCall.id()).build());}4. Bash 工具定义publicstaticChatCompletionToolbashTool(){MapString,JsonValueparamMapnewHashMap();paramMap.put(type,JsonValue.from(object));MapString,JsonValuecommandPropnewHashMap();commandProp.put(type,JsonValue.from(string));commandProp.put(description,JsonValue.from(要执行的shell命令));paramMap.put(properties,JsonValue.from(Map.of(command,JsonValue.from(commandProp))));paramMap.put(required,JsonValue.from(List.of(command)));FunctionParametersparametersFunctionParameters.builder().putAllAdditionalProperties(paramMap).build();returnChatCompletionTool.ofFunction(ChatCompletionFunctionTool.builder().function(FunctionDefinition.builder().name(bash).description(在当前工作区中运行 shell 命令).parameters(parameters).build()).build());}5. 危险命令防护Agent 执行 shell 命令存在安全风险需要拦截危险操作privatestaticfinalSetStringdangerousnewHashSet(List.of(rm -rf /,sudo,shutdown,reboot));publicstaticStringrunBash(Stringarguments){if(dangerous.contains(arguments)){return错误危险命令被阻止;}// ... 执行命令}防护策略黑名单拦截rm -rf /、sudo、shutdown、reboot等危险命令直接拒绝路径沙箱限制操作在指定工作目录内s02 详解超时控制防止命令永久阻塞Python vs Java 对比组件PythonJavaAPI 客户端anthropic.AnthropicOpenAIOkHttpClient消息类型{role: user, ...}ChatCompletionMessageParam.ofUser()工具定义{name: bash, ...}ChatCompletionToolFunctionDefinition停止判断response.stop_reason ! tool_usemessage.toolCalls().isEmpty()工具执行TOOL_HANDLERS[name](args)Tools.exe(TOOL_HANDLERS, toolCall)工具注册{bash: run_bash}TOOL_HANDLERS.put(bash, Tools::runBash)项目依赖dependencygroupIdcom.openai/groupIdartifactIdopenai-java/artifactIdversion4.29.1/version/dependencydependencygroupIdcom.alibaba/groupIdartifactIdfastjson/artifactIdversion2.0.32/version/dependency试试看创建名为hello.java的文件使其输出打印 “Hello, World!”列出当前目录下所有 Java 文件当前 Git 分支是什么创建名为test_output的文件夹并在其中新建 3 个文件核心要义“One loop Bash is all you need”一个工具 一个循环 一个 Agent循环本身不变后续所有机制s02-s12都在此基础上叠加s02: 添加更多工具s03: 任务规划TodoWrites04: 子 Agent 隔离s05: 技能加载…模型决定何时调用工具代码负责执行工具并返回结果。这就是 Agent 的全部秘密。
AI原生产品化与业务域大脑 ## 引言:AI原生化,不可逆转的趋势如果说2023年是AI大模型的“技术爆发年”,那么2026年,我们正站在“AI原生产品化”的拐点上。这不再是工程师的玩具,不再是实验室的Demo,而是真实渗透进各行各业核心业务的生… 2026/4/6 18:19:16
AI编程一句话开发一个浏览器一键多开网页的插件 小生有这样一个需求:每天都会打开一些固定网站,每天电脑开机后都需要一个个去点一遍,很是麻烦。突然想到,现在 AI编程 这么热火,我为什么不自己开发一个,于是就拿出了小生常用的 AI 神器 Gemini ࿰… 2026/4/12 3:33:56
开源工具Lenovo Legion Toolkit:游戏本性能管理的轻量化创新方案 开源工具Lenovo Legion Toolkit:游戏本性能管理的轻量化创新方案 【免费下载链接】LenovoLegionToolkit Lightweight Lenovo Vantage and Hotkeys replacement for Lenovo Legion laptops. 项目地址: https://gitcode.com/gh_mirrors/le/LenovoLegionToolkit … 2026/3/31 1:28:34
Notion API + Make 搭建项目资产库:自动归集 50+ 类软件文档与报告 Notion API Make 构建智能项目资产库:从文档自动化到知识图谱实践 当Jira需求卡、Git提交记录、飞书会议纪要和腾讯文档散落在不同平台时,项目管理者常陷入"文档沼泽"——明明所有材料都存在,却需要切换5个工具才能拼凑出完整项目… 2026/7/11 23:41:09
UE渲染管线中CustomDepth开关的陷阱与优化实践 1. 项目概述:为什么CustomDepth的开关是个“坑”?在UE4/UE5的渲染管线里,CustomDepth(自定义深度)是个功能强大但细节魔鬼的模块。它允许你将特定物体的深度信息渲染到一个独立的缓冲区,是实现诸如物体轮廓… 2026/7/11 23:41:09
场景法 vs 流程图法:5步构建高效业务测试策略,避免用例冗余 场景法与流程图法:构建高效业务测试策略的黄金组合在当今快速迭代的软件开发环境中,测试团队面临着前所未有的挑战:如何在有限时间内设计出既全面又高效的测试用例?传统的单点测试方法往往难以应对复杂业务流程的验证需求… 2026/7/11 23:41:09
VS Code Claude Code 插件配置 DeepSeek API 教程(远程服务器) 前言 Claude Code 是 Anthropic 推出的 AI 编程工具,可以读取当前项目、分析代码、修改文件并辅助完成开发任务。 默认情况下,Claude Code 使用 Anthropic 官方服务。由于 DeepSeek 提供了兼容 Anthropic API 格式的接口,因此可以通过配置 AP… 2026/7/11 23:37:04
无代码电脑自动化 OpenClaw 部署排坑,适配 Windows 与 macOS 📌 一、工具核心优势盘点 数据本地存储,安全系数高所有操作日志、文档资料均保存在本机,不会上传至云端,能够有效保护企业文件与个人隐私,规避数据泄露风险。 上手简单,零编程门槛采用全图形化可视化界面&… 2026/7/11 23:37:04
蓝桥杯Java排序进阶:Comparator与Comparable接口的3种实战写法与选择策略 Java排序进阶:Comparator与Comparable接口的3种实战写法与选择策略在蓝桥杯等编程竞赛中,排序算法是基础但至关重要的技能。Java提供了两种核心接口来实现自定义排序:Comparable和Comparator。本文将深入探讨它们的三种实战写法(匿… 2026/7/11 23:35:04
5分钟搞定Kodi字幕难题:智能字幕插件让你追剧无忧 [特殊字符] 5分钟搞定Kodi字幕难题:智能字幕插件让你追剧无忧 🎬 【免费下载链接】zimuku_for_kodi Kodi 插件,用于从「字幕库」网站下载字幕 项目地址: https://gitcode.com/gh_mirrors/zi/zimuku_for_kodi 还记得那个深夜吗?你刚下载… 2026/7/11 0:00:11
工业信号干扰处理与FOD4216光耦应用实战 1. 工业环境中的信号干扰挑战在工业自动化领域,信号采集的准确性直接关系到整个控制系统的可靠性。典型的工业现场充斥着各种干扰源:大功率电机启停产生的电磁干扰、变频器工作产生的高频噪声、继电器触点火花放电,以及长距离传输引入的共模干… 2026/7/11 0:00:11
OpenHarmony 完整项目工程整合规范 + 模块化分层架构(API23+ 标准企业级结构) 摘要前面系列教程覆盖了 ArkUI 组件、路由、生命周期、本地存储、网络请求、Ability 底层全套基础能力,本篇统一梳理标准工程目录分层、模块化拆分、代码复用规范、全局工具统一管理、项目打包权限配置、常见工程报错统一解决方案,形成可直接用于课程设计… 2026/7/11 0:00:11
6个月转型AI工程师:实战路径与核心技能 1. 项目概述:6个月转型AI工程师的可行性路径在2023年大模型技术爆发的背景下,AI工程师岗位需求同比增长217%(LinkedIn数据)。不同于传统算法工程师需要3-5年培养周期,现代AI工程师更侧重工程化落地能力。我在硅谷科技公… 2026/7/11 14:53:30
TPAFE0808与PIC18F87K22的多通道信号采集方案 1. 项目背景与核心需求在工业自动化、医疗设备和科研仪器等领域,多通道信号采集与系统监测是基础且关键的技术需求。传统方案往往面临通道数量不足、信号调理复杂、系统集成度低等问题。TPAFE0808作为一款8通道模拟前端芯片,与PIC18F87K22微控制器的组合… 2026/7/11 12:30:52
STC3115与PIC18LF26K80构建高精度电池管理系统 1. STC3115与PIC18LF26K80在电池管理系统中的核心价值在现代电子设备中,电池管理系统(BMS)的重要性不亚于设备的核心处理器。STC3115作为一款高精度电池电量监测IC,与PIC18LF26K80微控制器的组合,构成了一个既能精确监控又能智能管理的完整解… 2026/7/11 15:29:59