China AI Builders · Real Cases · Workflows · Business

AI 极客实战案例日报

企业级 Agent 运行时与中间件治理 · AgentScope Java 2.0 × LangChain 1.0
日报日期
2026-09-30
执行时间
2026-09-30 23:46
精选案例
2 个
期数
第 004 期
今日一句话

昨天到今天,中国 AI 社区几乎同时把同一件事往前推了一步:让 Agent 真正跑进企业生产环境——阿里 ModelScope 的 AgentScope Java 2.0 冒出中文实战长文和一个能复现的开源运行样本;LangChain 1.0 的中间件钩子也被中国开发者用阿里百炼模型跑通了六大工程切面。

今日 AI 实践观察(先读这段)

今天没有"新模型发布",也没有"融资新闻"。值得花时间的,是两件很具体的事:① Java 生态第一次有了"能照着抄"的企业级 Agent 运行样本。阿里通义实验室的 AgentScope Java 2.0(当前 2.0.3)在 09-29 与 09-30 两天内,出现了两条独立的中文实战连载,其中一条来自一个真实可跑的开源项目 dream-scope:JDK 21 + Spring Boot 3.5.5 + AgentScope 2.0.3 + Redis 分布式会话 + DashScope 通义千问,作者用它在自己的 Dream-SaaS 站点上跑代码审查、混合 RAG、多 Agent 编排。这是国内少见的"Java + 国产模型 + 六边形架构边界 + 可复现"的完整组合。② Agent 的"工程切面"正在被普通开发者接管。同一时间,LangChain 1.0 的六大中间件钩子被写成了带完整可运行代码的中文教程,直接适配阿里百炼 Qwen3.7-Flash,把权限校验、上下文压缩、重试熔断、数据脱敏、Token 计费从业务代码里剥离出来。两个案例指向同一条主线:2026 年 9 月底,中国 AI 实战的竞争重心已经不在"能不能跑通 Agent",而在"这个 Agent 能不能在公司的生产环境里稳稳跑半年、并且被审计、被计量、被复用"。

01

用 AgentScope Java 2.0 + Spring Boot 3.5 + 通义千问,搭一个"能上线跑"的多 Agent 运行时(开源项目 dream-scope)

企业级 Agent 基础设施 🇨🇳 中国开源主线 ☕ Java 生态 🔁 完整可复现 💰 强商业交付属性 相关文章 2026-09-28 / 09-29 / 09-30
一句话结论:这是目前少见的"中国开源框架 + 国产模型 + 完整工程边界 + 单人可复现"的企业级 Agent 样板——把 JVM 变成 Agent 的第一等公民,而不是继续写 Python 胶水。

01 | 案例是什么?

一个叫 dream-scope 的开源项目,用阿里 ModelScope 出品的 AgentScope Java 2.0 当内核,加 Spring Boot 3.5 做外壳,搭出了一套"模块化单体"的 Agent 运行时。它对外只暴露两个 HTTP 接口(同步 POST /api/agents/invoke 和流式 SSE POST /api/agents/stream),对内把模型、消息编解码、分布式会话(Redis)、长期记忆压缩、混合检索(向量 + 关键词 RRF 融合)、MCP 工具、文件声明的子 Agent 全部装配好。同一时间,掘金上出现了两条独立的中文实战连载——一条来自项目作者「宋哥转AI」的逐层拆解(02/03 篇),一条来自公众号「栈知见」的 16 篇系列开篇——把"Java 怎么写生产级 Agent"这件事第一次讲成了可复制的操作手册。

02 | 为什么今天值得关注?

  • 为什么是现在:AgentScope Java 2.0 于 2026 年 7 月 GA(此前 5–6 月连发 RC1–RC5),到 9 月社区才真正沉淀出"照着做能跑"的中文工程样本。09-28(02 篇 Harness 层)、09-29(03 篇知识工具层)、09-30(另一条系列的开篇)三天连续输出,说明学习曲线刚被趟平。
  • 为什么以前不容易:过去把 Agent 接进 Java 系统,要么用 HTTP 桥一层 Python 网关(多一跳、难排障),要么用偏"链式编排"的 Java 框架(分布式会话、多租户隔离、沙箱、压缩要自己造)。
  • 为什么现在变容易:框架把"上线前看不见、上线后绕不开"的坑做成了内核一等公民——分布式会话、多租户隔离、沙箱、OpenTelemetry 观测、A2A 协议;而国产模型(DashScope / DeepSeek)已经是内置 provider,不需要改代码就能切换。
  • 对谁最有价值:中国有海量 Java 后端团队和存量 Spring Boot 系统。这批人"想接 AI 却不想推倒技术栈"的需求,长期缺配套基础设施——今天它出现了。

03 | 案例的前世今生

前世。AgentScope 最早是阿里通义实验室开源的 Python 多智能体框架,解决的是"多 Agent 之间的消息通信、编排、记忆、工具调用每次都要手写"的问题。同期 Java 侧只能用 LangChain4j / Spring AI 这类"以链和流程编排为主"的框架,Agent 的自主推理循环、分布式运行设施都要自己拼。

发展。Java 版从 1.0 的 ReActAgent 内核起步;2026-05 发 v2.0.0-RC1,重做了事件流、消息模型、中间件与 HITL;RC2–RC5 陆续补上无状态 Agent、一行式 DistributedBackend、Channel IM 集成(钉钉 / 飞书 / 企业微信)、A2A / AG-UI 协议、异步工具执行、模型 provider 模块化、原生结构化输出、腾讯云 COS 状态持久化;2026-07 v2.0.0 正式 GA;2026-08 又给出 AgentScope Service(Agent 控制平面 + Dashboard,兼容 LangChain / ADK / Claude / Qoder)。当前稳定线为 2.0.3。

今生。框架能力齐了,缺的是"别人怎么用"。09-28 到 09-30 三天里,中文社区同时补上了这一环:dream-scope 作者把 Harness 工程层、三层检索链路、MCP 三传输、子 Agent 两路声明逐层写出(含真实源码路径),另一位作者则给出 16 篇的大纲总览。再加上 dream-scope 本身在 GitHub 开源(Apache-2.0)、Dream-SaaS 站点已上线可注册体验,这个案例从"框架文档"变成了"可对照复现的工程样本"。

下一步可能怎么发展(分析 / 推演,非事实):① AgentScope Java 很可能成为国内"企业 Agent 中台"的默认选型之一,与 Spring AI Alibaba 形成互补;② dream-scope 这类"参考实现"会演化成可售卖的行业模板(金融 / 制造 / 政企);③ Java Agent 交付能力会变成外包与咨询市场的硬通货。

04 | 原始资料

05 | 作者是谁?

dream-scope / Dream-SaaS 作者:掘金用户「宋哥转AI」(对应公众号「Java宋转AI」,GitHub 账号 logosssss)。从文章内容判断为一线 Java 后端 / 架构实践者,独立完成了从框架选型、六模块拆分、Redis 会话、三层检索到上线部署的完整链路,并自建 Dream-SaaS 站点做验证。其真实姓名与所在公司未公开,不做猜测。

另一条系列的作者:公众号「栈知见」,2026-09-30 起发布 16 篇 AgentScope Java 连载开篇,自述面向"有 Spring Boot 经验的 Java 工程师"。身份未进一步披露。

06 | 解决了什么真实问题?

从需求说起,而不是从技术说起。中国大量企业的核心业务系统跑在 Java / Spring Boot 上,这些团队想上 AI 时会撞上五堵墙:

  • 会话活不下来:Agent 的对话状态放在内存里,进程一重启全丢,多副本部署直接串号。
  • 多租户隔离靠自觉:同一进程服务多个用户 / 部门时,谁的数据谁能看,靠业务代码自己记得写。
  • 上下文越聊越炸:多轮对话只增不减,早晚撞模型窗口,成本一路涨。
  • 知识检索答不准:专有名词、产品型号这类强字面信号,纯向量检索拉不开距离,答案缺引用来源。
  • 工具能把主机搞坏:Agent 拿到文件读写和 Shell,HTTP 进程里跑一条命令就可能毁掉开发机。

dream-scope 的价值在于:它把上面五件事都给出了有源码位置的具体答案(Redis 分布式会话、(userId, sessionId) 寻址、Compaction 按条数压缩、向量+BM25+RRF 混合检索、运行期禁用 stdio 并关闭文件/Shell 工具),而不是停在"建议你这么设计"。

07 | 完整技术栈

模型默认 dashscope:qwen-plus(通义千问);支持 deepseek: / openai: / anthropic: / gemini: / ollama: 前缀切换;视觉场景可换 qwen-vl-plus
Agent 框架AgentScope Java 2.0.3(core + harness + extensions-redis + extensions-model-dashscope)
语言 / 构建Java 21,Maven 3.9+
应用框架Spring Boot 3.5.5(Jakarta),Spring Cloud Alibaba 2025.0.0.0(Nacos Config + Discovery,默认关闭)
协议 / 接口REST(/api/agents/invoke)、SSE(/api/agents/stream)、MCP(streamableHttp / sse)、A2A(Agent Card + /a2a)
数据 / 中间件Redis 7(分布式会话,必选,Docker Compose 一键起);PostgreSQL + pgvector(可选,生产检索);Nacos 3.x(可选,需 gRPC 9848);Jedis
观测Actuator(health / info / metrics / prometheus)+ OpenTelemetry(OtelTracingMiddleware)+ 自定义 LoggingMiddleware
前端dream-scope-ui:Vue + Vite(开发端口 5173)
部署Docker Compose;默认端口 8091(主路径) / 8092(官方 starter 对照入口) / 8093(内置演示 MCP)
许可证Apache License 2.0

08 | 完整 Workflow

用户输入:HTTP POST /api/agents/invoke(或 SSE /stream),body 含 input / imageUrls / agentId / sessionId / userId
↓
契约层(domain):AgentInvokeRequest 进入 Agent 注册表,按 agentId 路由(默认 chat;knowledge 为纯检索出口,不调模型)——本层禁止依赖 io.agentscope.*
↓
Agent 装配(adapter):ScopeChatAgent 构造 HarnessAgent —— 权限模式 BYPASS、Plan Mode 默认开启、关闭 read_file/write_file/shell、注册 getCurrentTime/calculate/httpGet/retrieve 四个工具
↓
中间件横切:onAgent → onReasoning →(onSystemPrompt → onModelCall)→ onActing 洋葱式包裹;日志、鉴权、脱敏、耗时统计在这里发生
↓
推理 + 工具调用:模型决定是否调用工具;@Tool 注解方法被反射执行,未被 @ToolParam 标注的参数(如 UserContext)由 RuntimeContext 直接注入,不经模型之手
↓
检索(可选):retrieve 工具 → embed + pgvector/内存 ∥ 关键词索引 → RRF 融合(K=60)→ 可选问句改写 + 精排(gte-rerank-v2)→ 返回带 [1][2] 编号的资料
↓
状态持久化:(userId, sessionId) 成对传入时写入 Redis(key-prefix: dream-scope:);消息数达 30 条触发 Compaction,压缩后保留最近 10 条原文
↓
输出:output + inputTokens/outputTokens + planActive;SSE 侧事件为 textDelta / toolCall / toolResult / hint / done / error

09 | 它到底是怎么实现的?

  • ReAct + Harness 双层,只叠加不替换。底层 ReActAgent 只管"推理—行动—回填"循环;上层 HarnessAgent 是一层薄包装,用 builder 挂点把 workspace、分布式存储、记忆压缩、子 Agent、中间件、计划模式叠在循环外围。业务从 ReActAgent 起步,需要长期运行时可无缝迁到 HarnessAgent。
  • 三个共享对象 = 全部衔接面。RuntimeContext(本次调用的身份)、Workspace(约定文件读写)、AgentStateStore / DistributedStore(跨调用状态恢复)。Harness 的各项能力互不依赖,只通过这三个对象通信。
  • 六边形边界靠构建期强制。模块拆成 bom / domain / adapter / knowledge / web / boot / ui;dream-scope-domain 禁止 import io.agentscope.*,检索逻辑因此可以脱离框架单测。
  • 只有装配点做条件分支。"用 distributedStore 还是 stateStore"的二选一只出现在 ScopeChatAgent 构造器里;运行期不散落 if-else。
  • 失败路径全部有归宿。Redis 连接启动即 ping,失败直接抛错让进程起不来(fail fast);检索 provider 分 auto / pg / simple / keyword 四档,auto 档的降级链是 pg → 内存向量 → 关键词。

10 | 手把手复现

  1. Step 1 · 环境:JDK 21、Maven 3.9+、Docker(Redis 必选);Node 20+(只在跑前端时需要)。
  2. Step 2 · 拉代码:git clone https://github.com/logosssss/dream-scope.git && cd dream-scope,并 cp .env.example .env(进程不会自动加载 .env)。
  3. Step 3 · 起 Redis:docker compose up -d redis。
  4. Step 4 · 配 Key:设置 DASHSCOPE_API_KEY;可选 DREAM_SCOPE_MODEL_CHAT=dashscope:qwen-plus。
  5. Step 5 · 跑测试再启动:mvn -q test → mvn -pl dream-scope-web -am spring-boot:run(默认 8091)。
  6. Step 6 · 冒烟调用:curl -s http://localhost:8091/api/agents/invoke -H "Content-Type: application/json" -d '{"input":"你好"}'。
  7. Step 7 · 起前端(可选):cd dream-scope-ui && npm install && npm run dev,浏览器开 http://127.0.0.1:5173。
  8. Step 8 · 对照实验(强烈建议):mvn -pl dream-scope-boot -am spring-boot:run 起 8092 端口,这是官方 starter 装配的 ReActAgent(内存 Memory、空 Toolkit、无 Redis / 无子 Agent)。同一台机器上对比 8091 与 8092,能直观理解"Harness 层到底加了什么"。

11 | Prompt / Code / Config(原文公开的部分)

Maven 依赖(官方 README 公开):

<dependency>
  <groupId>io.agentscope</groupId>
  <artifactId>agentscope-harness</artifactId>
  <version>2.0.3</version>
</dependency>
<dependency>
  <groupId>io.agentscope</groupId>
  <artifactId>agentscope-extensions-model-dashscope</artifactId>
  <version>2.0.3</version>
</dependency>

官方最小 Agent(README 公开,Java 21):

HarnessAgent agent = HarnessAgent.builder()
    .name("assistant")
    .sysPrompt("You are a helpful AI assistant.")
    .model("dashscope:qwen-plus")     // 自动读 DASHSCOPE_API_KEY
    .workspace(Paths.get(".agentscope/workspace"))
    .build();

RuntimeContext ctx = RuntimeContext.builder()
    .sessionId("demo").userId("alice").build();

工具定义与"业务上下文不过模型手"(作者 03 篇公开):

public record UserContext(String tenantId, String userId) {}

@Tool(name = "list_my_orders", description = "查询当前用户的订单")
public String listOrders(UserContext ctx,        // 无 @ToolParam → 框架从 RuntimeContext 注入
                         @ToolParam(name = "status", required = false) String status) {
    return query(ctx.tenantId(), ctx.userId(), status);
}

Compaction 配置(作者 02 篇公开):

CompactionConfig.builder()
    .triggerMessages(30)   // 30 条触发压缩
    .keepMessages(10)      // 保留最近 10 条原文
    .keepTokens(0)         // 显式关闭 token 阈值,避免两个阈值互相打架
    .build();

12 | 踩坑(来自作者原文与 README)

坑 1 · MiddlewareBase 从抽象类变成了接口。2.0.3 里它是 interface,不是 abstract class。从 1.x 迁移时旧代码用 extends 会直接编译失败,得改成 implements。

坑 2 · 子 Agent 的 tools 白名单不生效。在 2.0.3 里,tools: "[]"(空列表)与完全不写 tools 效果一样,都会继承父 Agent 的工具。想收紧权限必须写非空白名单。

坑 3 · Redis 连不上 = 进程起不来。设计上故意 fail fast。本地开发忘了 docker compose up -d redis,会看到 redis required but unreachable。

坑 4 · Nacos 2.x 会启动探活失败。AgentScope 的 AI 能力走 Nacos 3.x 的 gRPC 9848,只开 8848 的 2.x 配置中心不行。

坑 5 · .env 不会被自动加载。要么用环境变量,要么写 application-local.yml 并加 --spring.profiles.active=local。

坑 6 · 多通道检索会打架。框架内置的 ReActAgent.knowledge() 会自动注入检索(旧版 GenericRAGHook,已标 @Deprecated)。如果同时用自动注入 + retrieve 工具,同一轮里模型会看到两份来源不同、格式不同的资料。作者的取舍是只留工具化检索一条通道。

13 | 中国用户能不能直接做?

国内访问✅ 完全可用。模型走阿里云百炼 DashScope;依赖全部来自 Maven 中央仓,可配国内镜像加速。
注册阿里云账号 + 百炼开通,国内手机号即可;无需海外信用卡。
APIDASHSCOPE_API_KEY 一个环境变量即可跑通;换 DeepSeek 只需改 model 前缀 + 对应 Key。
成本开源项目本身 0 元;主要成本是模型 token。可选本地 Ollama 把推理成本压到电费。
技术门槛开发者级 需要 JDK 21、Maven、Docker、Redis,以及能读懂 Spring Boot 与依赖注入。有 Java 后端经验的人 1–2 天可跑通。

14 | 中国企业可以怎么用?

  • 存量 Java 系统的"AI 入口"。银行、制造、政企的大量核心系统是 Spring Boot。直接在既有工程里引 agentscope-harness,把 Agent 做成一个 Bean,通过 /api/agents/invoke 暴露给前端;会话状态接公司已有的 Redis。
  • 企业内部知识助手(带引用)。把制度文档、产品手册、接口约定灌进 pgvector,用 retrieve 工具做向量 + 关键词混合检索 + 精排,答案带 [1][2] 编号可溯源。
  • 多租户 AI 中台。用 (userId, sessionId) 贯通工作区路径、存储命名空间与沙箱,让一条业务线一个租户,数据隔离由框架强制而非靠代码自觉。
  • 遗留系统 SOP 自动化。用 Markdown 写 subagents/xxx.md 声明专职子 Agent,把"售后政策问答""报价草稿""日志初筛"等固定流程固化,不写 Java 就能加一个子 Agent。

15 | 如何迁移到其他行业

① 制造业 · 设备售后知识中台把设备手册、故障码、维修知识灌入混合检索;用子 Agent 声明"故障初诊""配件清单生成";售后工程师用企业微信侧接口提问。
② 金融 / 政企 · 合规问答与审计用中间件统一做权限拦截与操作留痕,Plan Mode 保证多步任务先出计划再执行;数据不出内网,模型走本地 Ollama 或私有化部署。
③ 电商 / 跨境 · 多平台客服后台把订单、物流、退换货政策做成工具与知识库;用 (userId, sessionId) 隔离不同店铺的会话,避免串号。

16 | 培训课程设计

课程名称《Java 工程师的第一堂 AI Agent 生产课:用 AgentScope Java 2.0 搭一个能上线的智能体》
适合人群有 Spring Boot 经验的 Java 后端 / 架构师;企业 IT 负责人
建议时长半天(3 小时)起,可扩展为两天训练营
30 分钟 Demo现场跑 8091 / 8092 两个端口,让学员亲眼看到"有 Harness 与没有 Harness"的差别
60 分钟 Workshop学员自己写一个 @Tool 方法(如查询工单),并用中间件给它加权限校验与耗时统计
半天课程六个模块边界 → Harness 与 ReAct 分工 → 三共享对象 → Redis 会话与 Compaction → 三层 RAG → 用 Markdown 加一个子 Agent
课后作业提交一个自定义子 Agent(Markdown 声明)与一份"哪些工具不该给它"的风险说明

17 | 培训师点评

真正值得教的不是 AgentScope,而是"工程边界感"。这个案例最珍贵的部分是它反复出现的取舍:条件分支只出现在装配点、工具白名单宁少勿多、stdio 在服务端直接拒绝、两个压缩阈值只留一个。教这套框架,本质是教一群 Java 工程师把"能跑通"升级成"能负责"。

18 | 最终判断

落地性
高
中国市场相关性
高
商业价值
高
复现难度
中
变现潜力
高
02

用 LangChain 1.0 中间件钩子 + 阿里百炼 Qwen3.7-Flash,给企业 Agent 补上权限、重试、脱敏、审计与 Token 计费

Agent 工程化 / 切面治理 🇨🇳 国产模型已验证适配 🧩 代码可复制 💰 0 成本可复现 发布于 2026-09-30
一句话结论:把权限、压缩、重试、脱敏、审计、计费这六件"每个 Agent 都要重复写一遍"的事,收进六个可插拔钩子里——这是企业 Agent 从"能演示"到"敢上线"最短的一段路,而且今天有人把代码直接写给了你。

01 | 案例是什么?

LangChain 1.0 把 Agent 的重心从"链"改成了"钩子":核心入口只剩一个 create_agent,其余能力通过 middleware(中间件)在 Agent 生命周期上打点。2026-09-30,掘金作者「码农悟道」发了一篇实战文章,用六大钩子写出完整可运行代码,并明确适配阿里百炼新版模型 qwen3.7-flash:任务前置拦截(权限)、模型调用前预处理(压缩上下文/切换大小模型)、模型调用包装(重试/熔断/耗时/Token 统计)、工具调用包装(重试/入参校验/脱敏/审计)、输出后置审核(内容安全/格式修复)、任务收尾统计(全链路 Token 与工具次数归集)。它解决的是一个非常具体的工程问题:Agent 业务代码正在被通用基建代码淹没。

02 | 为什么今天值得关注?

  • 为什么是现在:LangChain 1.0 于 2025-10 正式 GA(GA 当晚同时推出 LangGraph 1.0),把 create_react_agent 换成 create_agent、把中间件抬为一等公民。到 2026 年 9 月,官方已内置 PIIMiddleware / SummarizationMiddleware / HumanInTheLoopMiddleware 等预置中间件——意味着"切面治理"已经是官方推荐范式,而中文实战内容才刚刚跟上。
  • 为什么以前不容易:1.0 之前想控制 Agent 执行的中间过程,只能用 callback handler、继承子类或 fork 预置图;企业上线时只能把权限、脱敏、计费硬塞进业务逻辑。
  • 为什么现在变容易:钩子把"在哪一刀切"变成声明式配置;同时国产模型的兼容性已被社区跑通——文章里百炼走的是 OpenAI 兼容端点 dashscope.aliyuncs.com/compatible-mode/v1,模型名直接用 qwen3.7-flash-2026-07-15。

03 | 原始资料

04 | 解决了什么真实问题?

从企业侧的需求讲:一个 Agent 上线前,技术负责人一定会问五个问题——谁能用?聊久了会不会爆上下文?模型接口抖动会不会让流程挂掉?工具返回的手机号会不会漏?这个月谁花了多少钱?原文的痛点描述很直白:"每新建一个 Agent 就重复写一遍,不仅代码臃肿冗余,各个项目的规则还参差不齐,后期维护简直是噩梦。"

05 | 完整技术栈

模型阿里百炼 qwen3.7-flash-2026-07-15(走 OpenAI 兼容端点)
框架LangChain 1.0(langchain.agents.create_agent + langchain.agents.middleware)
语言Python(langchain_openai.ChatOpenAI 作为统一客户端)
依赖langchain、langchain-openai、langchain-core、python-dotenv
关键参数stream_usage=True(流式下拿 Token 用量)、temperature=0、max_tokens=2048

06 | 完整 Workflow

用户输入:agent.invoke({"messages":[{"role":"user","content":"查询AI中台项目员工及进度信息"}]}, context={"user_id":"admin_001"})
↓
before_agent(任务前置拦截):校验 user_id 是否具备企业数据查询权限;不通过直接抛异常,不触发任何 LLM 调用
↓
before_model(调用前预处理):消息轮数 > 5 时只保留最近 3 条(上下文压缩);同时做 Token 用量采集与防重复统计
↓
wrap_model_call(调用包装):包裹真实 LLM 调用 → 失败自动重试(max_retry=2,间隔 1s)→ 记录耗时
↓
Agent 决策:模型选择调用业务工具(示例为 company_info_query)
↓
wrap_tool_call(工具包装):打印入参 → 执行工具 → 返回内容命中手机号则替换为 ******* → 归集调用次数
↓
after_model(输出后置审核):检查输出是否含"机密"字样,命中则强制改写为拒答
↓
after_agent(收尾统计):输出累计总 Token 消耗与累计工具调用次数,供监控 / 计费使用

07 | 它到底是怎么实现的?

  • 核心机制是"洋葱包裹 + next 短路"。每个钩子拿到本次的 request 和一个 handler(next)。调用 handler(request) 才会继续往下走;不调用就是短路——这正是中间件能"拦截"的原因。
  • 官方钩子语义:before_agent(调 Agent 前,载入记忆 / 校验输入)、before_model(每次 LLM 调用前,改提示词 / 裁剪消息)、wrap_model_call(包裹每次 LLM 调用)、wrap_tool_call(包裹每次工具调用)、after_model(每次 LLM 响应后,校验输出 / 加护栏)、after_agent(Agent 完成后,保存结果 / 清理)。
  • 为什么能省 Token:入口拦截无效请求(一次 LLM 都不调),以及调用前压缩上下文(长会话不再把全部历史带过去)。
  • 为什么脱敏要放在工具出口:数据是在工具返回值里出现的,不是在模型输出里生成的。在 wrap_tool_call 拦截返回内容,能在数据进入上下文之前就把它改掉。
  • 为什么计费要放在收尾:不管 Agent 正常结束还是中途异常终止,收尾钩子都会百分百触发,保证"每一次调用都有账可查"。

08 | Prompt / Code / Config

from langchain_openai import ChatOpenAI
from langchain.agents import create_agent
from langchain.agents.middleware import (wrap_model_call, wrap_tool_call,
                                        before_model, ModelRequest, ToolCallRequest)

llm = ChatOpenAI(
    model="qwen3.7-flash-2026-07-15",
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
    api_key="你的API_KEY",
    temperature=0, stream_usage=True, max_tokens=2048,
)

@before_model                                   # ① 权限拦截(原文示例)
def before_agent_permission(state, runtime):
    if runtime.context.get("user_id") != "admin_001":
        raise Exception("【权限拦截】无企业数据查询权限")
    return state

@before_model                                   # ② 上下文精简
def model_trim_middleware(state, runtime):
    msgs = state.get("messages", [])
    if len(msgs) > 5: state["messages"] = msgs[-3:]
    return state

@wrap_model_call                                # ③ 重试 / 熔断 / 耗时
def model_retry_middleware(request, handler):
    ...  # max_retry=2,失败 sleep(1) 后重试

@wrap_tool_call                                 # ④ 工具脱敏 + 审计
def tool_secure_middleware(request, handler):
    result = handler(request)
    if isinstance(result, ToolMessage) and "13800138000" in result.content:
        result.content = result.content.replace("13800138000", "*******")
    return result

agent = create_agent(
    model=llm, tools=tools,
    middleware=[before_agent_permission, model_trim_middleware,
                model_retry_middleware, tool_secure_middleware, ...],
    system_prompt="简洁准确回答用户问题",
)

Token 统计的关键一行(原文强调的国产模型适配点):百炼新版 qwen3.7-flash 在 response_metadata["token_usage"] 里只返回总 Token、没有输入/输出细分字段,作者用 total_tokens 采集并加了防重复统计标记。

09 | 踩坑

坑 1 · 国产模型的 Token 字段不完整。百炼新版模型只返回总 Token,没有 prompt / completion 细分,直接照抄 GPT 的统计代码会拿到 0。

坑 2 · 中间件执行时序。多个中间件叠加时,谁先谁后会实际影响结果(例如权限校验必须先于 Token 采集),这是最容易在真实项目里翻车的地方。

坑 3 · 计数器会重复累加。Agent 原生就是 ReAct 循环,同一段历史会被多次读取。原文专门加了 _token_counted 标记做防重复。

坑 4 · 上下文裁剪会破坏工具调用链。文章用"保留最近 3 条"做压缩,而官方推荐的是 SummarizationMiddleware(把历史摘要化而非直接丢弃)。粗暴裁剪可能切断 tool_call 与 tool_result 的配对。

坑 5 · 钩子命名与实现存在错配(务必自行核对)。原文示例中函数名标为 before_agent_permission 却用 @before_model 装饰、agent_finish_stat 也用 @before_model 实现。代码可运行,但语义与实际钩子不一致,复制到生产前建议对照官方文档改名或改为 AgentMiddleware 子类实现。

坑 6 · 部分自研件与官方预置件功能重叠。脱敏、摘要、人工审批官方已有 PIIMiddleware / SummarizationMiddleware / HumanInTheLoopMiddleware。建议:通用能力用官方件,业务规则才自研。

10 | 中国用户能不能直接做?

国内访问✅ 可用。百炼端点在境内;pip 安装可用清华等镜像加速。
注册阿里云账号 + 百炼开通,国内手机号即可,无需海外支付方式。
成本0 元可试 代码本身 0 成本,用免费额度即可跑通全部六个钩子;转生产后按 token 计费。
技术门槛有一定门槛 需要会 Python、理解 Agent 循环与装饰器;不需要 GPU、不需要 Docker、不需要服务器。

11 | 企业场景

  • 内部数据查询助手的权限门禁。不同部门查不同库。用 before_agent 做入口拦截(一次 LLM 都不调就拒绝),用 before_model 按角色动态改提示词与可用工具。
  • 数据脱敏与合规输出。在 wrap_tool_call 统一对返回内容做脱敏(手机号、身份证、地址),在 after_model 做输出侧敏感词拦截。形成"进也拦、出也拦"的双层合规。
  • Agent 成本核算与部门分摊。把收尾钩子采集的 Token 数与工具次数写进日志系统,按 user_id 归集——这是"AI 成本能不能说清楚"的问题。
  • 多 Agent 复用同一套规范。新做一个 Agent 时,直接挂上同一组中间件,天然继承权限、脱敏、计费规则。

12 | 如何迁移到其他行业

① 金融 / 理财强合规行业:入口按岗位拦截、输出必须过合规审核钩子、所有调用留痕可回溯,Token 成本按部门归集。
② 医疗 / 健康患者信息在工具返回处统一脱敏,会话加摘要压缩以支撑长病程随访;输出侧加医学术语纠正与免责声明。
③ 电商 / 客服把"售后规则校验""超时未发货筛查"做成工具级审计,订单号与收件人信息在出口脱敏;按店铺维度归集 Token。

13 | 培训师点评

这个案例真正值得教的,是"在哪里切一刀"的判断力。六个钩子只是六个位置,难的是把权限放在入口而不是输出、把脱敏放在工具出口而不是模型出口、把计费放在一定会触发的收尾。学会这套位置感,换任何一个 Agent 框架(AgentScope、Spring AI、Dify)都能重新装一遍。

14 | 最终判断

落地性
高
中国市场相关性
高
商业价值
中高
复现难度
低
变现潜力
中

今日 AI 实战观察

今天这两个案例指向的是同一件事:中国 AI 实战的竞争线,已经从"模型能不能用"移到了"Agent 能不能管"。

先看事实。案例 01 里,AgentScope Java 2.0 把分布式会话、多租户隔离、安全沙箱、上下文压缩、可观测性从"业务自己想办法"改成了"框架的内核一等公民";dream-scope 又进一步划出六边形边界,把框架类型关在 adapter 里。案例 02 里,LangChain 1.0 干脆用六个钩子把权限、压缩、重试、脱敏、审计、计费从业务代码里连根拔起。两件事发生的时间相差不到 24 小时,方向完全一致:行业正在为"Agent 上线之后"补齐基础设施。

再看变化本身。第一个变化是治理能力开始前移——权限校验放在入口、脱敏放在工具出口、计费放在一定会触发的收尾,而不是散落在事后。第二个变化是Java 生态回来了:AgentScope Java 2.0 在 2026 年 7 月 GA 后,到 9 月底终于出现中文实战长文与可跑通的参考实现。第三个变化是国产模型进入"被适配"阶段:文章里百炼 Qwen3.7-Flash 需要专门处理 Token 字段差异,这不是缺陷,而是信号——社区已经深入到"逐个字段对齐"的工程层。

还有一点值得注意:这两个案例都不是新闻。没有新模型发布,没有融资,没有榜单。它们是一个框架的版本沉淀,加一个开发者把自己半夜踩的坑写了出来。这恰恰是当下最值得关注的一类信号——真正改变产业曲线的,往往不是发布会的聚光灯,而是一群人默默把"能跑通"改写成"能负责"。

今日商业机会雷达

机会 1 · 「Java 存量系统 AI 接入」实施服务

  • 客户:有 Spring Boot 存量系统、想上 AI 又不想换技术栈的中大型企业(银行、制造、政企、SaaS 厂商)。
  • 实现方式:AgentScope Java 2.0 + 国产模型(通义千问 / DeepSeek)+ 企业已有 Redis / 数据库。
  • 可能商业模式:AI 实施服务(项目制)+ 年度运维。
  • 为什么是现在:框架刚 GA 三个月、中文参考实现刚出现,市场上"会做"的人还很少。

机会 2 · 企业 Agent「治理层」交付与体检

  • 客户:已经在跑 Agent、但被合规或成本问题卡住的团队(金融、医疗、政企优先)。
  • 实现方式:六大中间件钩子(权限 / 压缩 / 重试 / 脱敏 / 审核 / 计费)+ 检查清单。
  • 可能商业模式:低价体检(建立信任)→ 中间件交付(项目制)→ 长期治理运维(订阅)。

机会 3 · 行业 Agent 模板 / 培训(面向 Java 人群的 AI 转型)

  • 客户:① 想要现成脚手架的企业;② 想转型 AI 的 Java 工程师(人群规模巨大,市面课程 90% 是 Python 向)。
  • 实现方式:把 dream-scope 这类参考实现按行业裁剪成模板;把"框架 + 工程边界"沉淀成 1 天或 2 天课程。
  • 可能商业模式:模板授权 + 企业内训 + 训练营。

以上均为基于案例结构的商业模式分析,不代表已经验证的商业成功。

原始资料

数据真实性说明

本期需要特别说明:

  1. 关于发布日期。日报日期为 2026-09-30,数据窗口为 2026-09-29 12:00 至 2026-09-30 23:46(GMT+8)。案例 01 的核心实操长文发布于 09-28 与 09-29,案例 01 的另一条系列开篇与案例 02 均发布于 09-30。本期未把与窗口无关的旧内容包装成"昨日新案例"。
  2. 关于内容农场。本期检索过程中,"尧图"系内容农场站点大面积污染了搜索结果排名。上述站点内容一律未被采信、未被引用,请读者以官方文档为准。
  3. 关于作者自述数据。"4C8G 单机运行 12 个 AI Agent 模块""月 LLM 成本可压在数百元量级"等来自 dream-saas.com 站点自述;"彻底根治中间件时序 BUG"等来自原文作者自述——本报告均无法独立验证,已在正文标注。