魔改鱼皮的 AI 零代码应用:加入 LangGraph 工作流、思维链可视化、三层压缩和 TODO 任务规划
最近在学习鱼皮的 AI 零代码应用生成平台时,【感谢yupi 鸽鸽😘】基于原项目做了一轮工程化改造。
我在这个基础上,重点参考了 Claude Code / Codex 这类 Agent 工具的运行机制,补充了更适合长链路 AI 代码生成的能力。
- 加入 LangGraph 工作流
- 推理过程和工具调用过程可视化
- 加入TODO 任务规划机制
- 加入三层上下文压缩机制
项目地址:
👉 https://github.com/LQF-dev/Zero-code
如果你也在做 AI 代码生成、AI Agent、LangChain4j、LangGraph4j 或者零代码平台相关项目,可以参考一下这个实现。

我主要做了哪些增强?
1. 加入 LangGraph4j 工作流模式
原来的项目中没有把LangGraph4j接入到业务生成链路中 这次我做的核心改造,是把普通生成模式和工作流生成模式统一抽象成同一类“代码生成引擎”。
我新增了 ChatCodeGenerationEngine 接口,用它定义统一的生成入口:
ClassicChatCodeGenerationEngine:普通模式,继续走原来的AiCodeGeneratorFacadeWorkflowChatCodeGenerationEngine:工作流模式,走新的CodeGenWorkflow- 两种模式都统一返回
Flux<String>,因此后面的 SSE 推送、事件聚合、落库逻辑都不需要重复实现
整体调用流程是:
▼text复制代码前端传 mode ↓ AppController 接收请求 ↓ AppServiceImpl 解析 mode ↓ 根据 mode 选择 ChatCodeGenerationEngine ↓ classic 走 AiCodeGeneratorFacade workflow 走 CodeGenWorkflow ↓ 统一返回 Flux<String> ↓ streamHandlerExecutor 继续处理 SSE、事件聚合、落库

2. 推理过程和工具调用过程可视化
yupi 代码没有做推理过程展示
我做了过程可视化:
- 展示模型 thinking / reasoning 过程
- 展示工具调用过程
- 展示工具执行结果
- 展示最终回复
- 每一轮对话都会聚合成结构化事件并落库

3. 加入 updatePlan TODO 任务规划机制
参考 Claude Code 的 TODO 思路,新增了 updatePlan 工具。
模型在生成 Vue 项目之前,需要先调用 updatePlan 创建任务计划,例如:
▼json复制代码[ { "id": "#1", "text": "创建项目骨架", "status": "in_progress", "deps": [] }, { "id": "#2", "text": "实现路由与布局", "status": "pending", "deps": ["#1"] }, { "id": "#3", "text": "实现首页", "status": "pending", "deps": ["#2"] } ]
这个机制不是简单的顺序 checklist,而是支持依赖关系。
也就是说,TODO 可以表达成一个任务图:
▼text复制代码#1 项目骨架 ├── #2 路由与布局 │ ├── #3 首页 │ └── #4 其他页面 └── #5 公共样式
后端会校验:
- 依赖的任务必须存在
- 任务进入
in_progress前,它依赖的任务必须已经completed - 计划状态会持久化到 Redis
- 如果模型连续多次调用工具却不更新计划,会自动注入 reminder 提醒模型更新 TODO
前端也会实时展示 TODO 计划面板,让用户看到当前生成进度。

4. 加入三层上下文压缩机制
参考 Claude Code 的压缩机制 加入三层上下文压缩机制
▼text复制代码Layer 1:工具结果微压缩 Layer 2:达到context阈值后自动摘要压缩 Layer 3:手动压缩
Layer 1:工具结果微压缩
旧的工具执行结果会被替换成占位符:
▼text复制代码[已执行: readFile]
压缩前:
▼json复制代码{ "id": "call_00_zWOMowxyqSEa6bEOGYx2hWfD", "toolName": "readFile", "text": "export const articles = [ ... 大段文件内容 ... ]", "type": "TOOL_EXECUTION_RESULT" }
压缩后:
▼json复制代码{ "id": "call_00_zWOMowxyqSEa6bEOGYx2hWfD", "toolName": "readFile", "text": "[已执行: readFile]", "type": "TOOL_EXECUTION_RESULT" }
最近的工具结果仍然保留原文,避免模型丢失最近上下文。
Layer 2:自动摘要压缩
当上下文超过阈值后,会调用模型生成结构化摘要,把多轮历史压缩成一条摘要消息。
摘要会重点保留:
- 已完成的操作
- 当前项目结构
- 用户核心需求
- 尚未完成的任务
- 关键修改的前后值
压缩前:
▼text复制代码用户消息 + AI 回复 + thinking + 工具请求 + 工具结果 + 多轮文件修改记录 ...
压缩后:
▼text复制代码[对话已压缩,完整记录保留在事件日志中] 1) 已完成的操作 - 创建了 package.json、vite.config.js、index.html、src/main.js 等文件 - 将首页标题从「静夜思」修改为「测试」 2) 当前项目状态 - 当前是 Vite + Vue3 项目 - 已包含路由、页面组件、公共样式和模拟数据 3) 用户需求和偏好 - 需要个人博客 - 需要文章列表、详情页、分类、搜索、评论和关于页面 4) 尚未完成的任务 - 无,当前需求已完成
压缩阈值在 application-ai.yml 中配置,不需要修改代码:
▼yaml复制代码# 上下文压缩配置 context-compaction: # 触发自动压缩的 token 估算阈值 # 建议设为所用模型最大上下文长度的 80% # 例如:DeepSeek V4-Pro 最大上下文 1M tokens → 800000 # GLM-4 最大上下文 128K tokens → 102400 # Qwen 最大上下文 128K tokens → 102400 token-threshold: 800000 # 送入摘要模型的最大字符数(避免摘要请求本身超长) max-summary-input-chars: 300000
Layer 3:手动压缩
也提供了手动压缩接口,可以主动触发上下文压缩。
完整历史不会丢失,因为完整事件仍然保存在 MySQL chat_event_log 中。压缩只影响下一轮发送给 LLM 的Context大小。
5. 适配 DeepSeek V4-Pro
原来 DeepSeek 是 deepseek-chat 和 deepseek-reasoner 两个模型分开用:
- 一个负责普通 chat
- 一个负责 reasoning
现在 DeepSeek V4 是统一模型模式,所以我做了适配:
- 统一切换到
deepseek-v4-pro - 普通模式通过
thinking.type = disabled关闭 thinking - 推理模式通过
thinking.type = enabled开启 thinking - 支持
reasoning_effort - 保留 reasoning 内容回放能力
这样普通生成和复杂 Agent 生成都可以使用同一个模型,只是通过参数控制是否开启思考。
6. 项目结构拆分
我也把项目结构整理了一下,把单体和微服务拆得更清楚:
▼text复制代码zero-code-monolith 单体应用 zero-code-microservice 微服务应用 zero-code-frontend 前端应用
当前项目支持的能力
目前项目大致支持:
- HTML / 多文件 / Vue 项目生成
- LangGraph4j 工作流模式
- LangChain4j 工具调用模式
- 三层上下文压缩
- 带依赖关系的任务计划规划 + redis 持久化
- reasoning 思考过程展示
- 工具调用过程展示
- DeepSeek V4-Pro thinking 模式
- SSE 流式返回
- Redis 会话记忆
- MySQL 事件日志回放
- 选择器定点修改
- patch 局部修改
- 一键本地部署
- Redisson 分布式限流
- 精选应用 Redis 缓存
- 单体 / 微服务结构拆分
项目地址
GitHub:
👉 https://github.com/LQF-dev/Zero-code
如果觉得有收获,麻烦友友们点个 Star 吧 谢谢 爱你们 ⭐
