无题
众所周知,阅读源码是前端进阶的一种方式,但很多同学不会使用调试工具,不知道该怎么高效的阅读源码。市面上也没有课程专门讲调试的,而这门课程就是弥补这个领域的空白。
我们会学习网页、Node.js 的调试,还会学习调试工具的实现原理,并且自己实现一个简易版小程序调试工具、React DevTools 还有 Chrome DevTools。
课程主要分为四部分内容:用 VSCode Debugger 调试网页的 JS、用 VSCode Debugger 调试 Node.js、用 Chrome DevTools 调试网页、调试工具的原理和实现简易版调试工具。
首先,我们会学习如何用 VSCode Debugger 调试网页,以 React 项目为例,然后我们会过一遍 VSCode Chrome Debugger 的配置,之后再调试下 Vue 项目。
这个过程中会用到 sourcemap,所以接下来会讲 sourcemap 的原理和作用,webpack 的 sourcemap 配置,然后再用这些知识来调试 React、Vue 源码。
调试完 Vue、React 项目和 Vue、React 源码 ...
无题
作为前端开发,调试是每天都会接触的概念。你觉得什么是调试呢?
有同学说,我用 Chrome DevTools 调试网页,可以查看元素,网络请求,断点运行 JS,用 Performance 工具分析性能等,这是网页的调试。
有同学说,我用 VSCode Debugger 调试 Node.js,可以同时调试多个进程的代码。这是 Node.js 的调试。
有同学说,我用 React DevTools 和 Vue DevTools 的 chrome 插件来调试 React、Vue 组件,还会用独立的 React DevTools 调试 React Native 应用。这是我常用的调试工具。
没错,这些都属于调试。那它们有什么共同特点呢?
它们都是把运行的状态暴露给调试工具,做一些展示和交互。
所以,我们可以给调试下个定义:
代码在某个平台运行,把运行时的状态通过某种方式暴露出来,传递给开发工具做 UI 的展示和交互,辅助开发者排查问题、梳理流程、了解代码运行状态等,这个就是调试。
这里的某个平台,可以是浏览器、Node.js、Electron、小程序等任何能执行 JS 代码的平台。
...
15-14 AgentScope Java进阶:Plan-and-Execute
✅AgentScope Java进阶:Plan-and-Execute
经典的 plan-and-execute 范式有两种:
双 Agent 模型(LangGraph):Planner 跑一次出 plan → Executor 逐步执行 → 完不成再回 Planner 重规划。优点是职责清晰,缺点是状态在两个 Agent 之间穿梭、prompt 上下文冗长。
单 Agent 自驱模型(ASJ):同一个 ReActAgent 既能调”规划工具”又能调”执行工具”——LLM 自己决定什么时候建计划、什么时候推进、什么时候改、什么时候收尾。框架只做两件事:
把”plan 是什么、当前进度、下一步该做什么”以 形式塞进每一轮的输入消息;
提供一组安全的、有状态校验的工具让 LLM 操作 plan。
ASJ 选了后者。代价是 prompt 工程要更精细(hint 必须根据状态动态生成),收益是统一了 ReAct 主循环——没有任何特殊”plan 阶段”和”execute 阶段”,所有动作都还是 reasoning↔acting。
在ASJ中,Plan-and-Exe ...
15-13 AgentScope Java进阶:Human-in-the-Loop
✅AgentScope Java进阶:Human-in-the-Loop
Human-in-the-Loop我们之前也讲过,这是一种允许在 Agent 执行过程中暂停、人工审查、交互确认后继续执行的机制。这一机制使得 AI Agent 可以在涉及敏感操作、信息缺失或需要人类决策的场景下安全、可控地运行。
前面在介绍ReAct Agent的实现原理的时候提到过,ReActAgent每一轮迭代只干2件事,推理和行动。
整个过程对应用层是自动运转的,agent.call(userMsg).block() 一次调用要么成功返回最终答案,要么抛异常。HITL 要解决的核心问题就一句话:怎么在这个全自动循环里安全地插入一个”暂停—等用户—继续”的缝隙。
注意”安全”二字 —— 暂停后 memory 里可能留着没填 result 的 ToolUseBlock,下一次调用必须能恢复,不能让模型看到悬空状态。
敏感动作前确认
HIL的一个最常见的场景:模型想调 delete_file,我希望先弹出 “确认/取消”。
在ReActAgent.reasoning() 里,看 ...
15-12 AgentScope Java进阶:Skill
✅AgentScope Java进阶:Skill
Skill之前我们有专门的讲过,包括Spring Ai Alibaba也介绍过他的支持Skill的原理。
ASJ当然也是支持Skill的,并且支持的要比SAA好。
数据模型
前面我们介绍过skill的结构,在ASJ中对应的就是AgentSkill这个类,它包含以下这几个字段:
Column 1
Column 2
Column 3
字段
说明
必填
name
Skill 名称
是
description
Skill 描述,决定 LLM 何时触发该 Skill
是
skillContent
Skill 的实际内容/指令
是
metadata
元数据 Map(含 name、description 及扩展字段)
是
resources
资源文件 Map(path -> content)
否
source
来源标识,默认 “custom”
否
Skill创建方式
我们有三种方式创建 AgentSkill:
方式一:直接构造
1AgentSkill skill ...
15-11 AgentScope Java特性:RAG
✅AgentScope Java特性:RAG
(虽然在ASJ的2.0的relesse note中提到:RAG (Knowledge / KnowledgeRetrievalTools / RAGMode) and long-term memory modules deprecated — being rewritten on the v2 architecture; don’t depend on them in new code`,但是截止目前,2.0还没正式发布,也没给出替代方案,我们先讲1.0的方案和用法,后续新版本更新了我能再单独讲方案和用法)
三个核心抽象ASJ中针对RAG做了抽象,其中比较核心的就是Knowledge / Document / RetrieveConfig这三个。整个 RAG 子系统就由这三个类(接口)驱动,其它都是装饰。
Knowledge 接口只有两个方法:
12345public interface Knowledge { Mono<Void> addDocuments( ...
15-10 AgentScope Java特性:MCP接入
✅AgentScope Java特性:MCP接入
MCP我们前面有专门的章节介绍过了,他是 Anthropic 提出的开放协议,定义了”AI 应用”和”工具服务”之间的标准通信接口。核心思想是:
AI Agent(MCP Client) ←──MCP协议──→ Tool Server(MCP Server)
MCP Server 暴露工具列表 + 执行入口
MCP Client 负责发现工具、生成 schema 给 LLM、调用执行。
定义MCP Client(连接MCP Server)ASJ实现的是 MCP Client 端——让你的 Agent 可以连接任意符合 MCP 协议的 Tool Server。
McpClientBuilder
McpClientBuilder通过名字你就能看出来,他是MCP Client的构造器。用它就能构造一个mcp client。通过McpClientBuilder.create(name),他支持三种传输层:
123// StdIO 传输:启动子进程,通过 stdin/stdout 通信McpClientWrap ...
15-09 AgentScope Java特性:工具集成
✅AgentScope Java特性:工具集成
我们最开始讲ASJ的时候的case中就演示了使用Toolkit来实现工具的集成,工具使用是Agent的必备技能。我们这一节再展开介绍下ASJ种的工具集成的相关能力和实现。
工具定义的方式
基于@Tool注解
在ASJ中,工具定义的方式有很多种,我们前面演示过最简单的基于注解的方式:
123456public class SimpleTools { @Tool(name = "get_time", description = "获取当前时间") public String getTime( @ToolParam(name = "zone", description = "时区,例如:北京") String zone) { return java.time.LocalDateTime.now() .format(java.time.format.Date ...
15-08 AgentScope Java中ReactAgent的实现原理
✅AgentScope Java中ReactAgent的实现原理
ReAct 的论文核心思想就一句话:让 LLM 交替”思考(Reasoning)”和”行动(Acting)”,直到得出最终答案。落到工程里要解决五个问题:
怎么把 LLM 决定的工具调用真正执行掉(reasoning → acting)
怎么把工具结果再喂回 LLM(acting → reasoning)
什么时候停(max_iters / 没有 tool_use / HITL stop / 完成)
流式输出怎么保证既能展示给用户、又能在结束时拼成完整 Msg
任意一步暂停或崩溃后,下次能从中间状态恢复
ReActAgent 的所有复杂度都是在回答这五个问题。
Builder装配
要了解ReActAgent的实现原理,需要从他的build方法讲起:
12345678910public ReActAgent build() { Toolkit agentToolkit = this.toolkit.copy(); // ① 深拷贝 ...
15-07 实战:实现AgentScope的三层记忆体系
✅实战:实现AgentScope的三层记忆体系
AutoContextMemory的使用
AutoContextMemory其实也是Memory的一个实现类。所以可以把他当做Memory设置到ReactAgent中。
AutoContextMemory可以通过AutoContextConfig来设置一些可以调节的参数,并且AutoContextMemory因为需要用到LLM,所以需要给他一个ChatModel。
12DashScopeChatModel chatModel = DashScopeChatModel.builder() .apiKey("sk-dcebc45c03b04c6e85391abb2264e594") .modelName("qwen3-max") .stream(true) .enableThinking(true) .formatter(new DashScopeChatFormatter()) .defaultOption ...
