[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-81671":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":15,"stars7d":16,"stars30d":16,"stars90d":15,"forks30d":15,"starsTrendScore":15,"compositeScore":17,"rankGlobal":10,"rankLanguage":10,"license":10,"archived":18,"fork":18,"defaultBranch":19,"hasWiki":20,"hasPages":18,"topics":21,"createdAt":10,"pushedAt":10,"updatedAt":22,"readmeContent":23,"aiSummary":24,"trendingCount":15,"starSnapshotCount":15,"syncStatus":13,"lastSyncTime":25,"discoverSource":26},81671,"ai-app-generation","lywnl\u002Fai-app-generation","lywnl","基于Spring Boot 3 + LangChain4j的AI零代码应用生成平台。通过用户输入自然语言，由AI Agent 自动执行多源上下文增强、代码生成、项目构建的完整工作流，可一键部署为可访问的Web应用。并结合多级缓存、异步处理、安全护轨等多种优化策略，保证系统的高性能与稳定性","",null,"Java",38,2,4,0,1,1.43,false,"master",true,[],"2026-06-12 02:04:18","\u003Cdiv align=\"center\">\n\n# AI App Generation\n\n**一句话需求 → 可部署 Web 应用** · 基于 LangChain4j 的 AI 全栈零代码（NoCode）应用生成平台\n\n[![Java](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FJava-25-ED8B00?logo=openjdk&logoColor=white)](https:\u002F\u002Fopenjdk.org\u002F)\n[![Spring Boot](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FSpring%20Boot-3.5.4-6DB33F?logo=springboot&logoColor=white)](https:\u002F\u002Fspring.io\u002Fprojects\u002Fspring-boot)\n[![LangChain4j](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FLangChain4j-1.1.0-1C3C3C?logo=langchain&logoColor=white)](https:\u002F\u002Fdocs.langchain4j.dev\u002F)\n[![Vue](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FVue-3.5-4FC08D?logo=vuedotjs&logoColor=white)](https:\u002F\u002Fvuejs.org\u002F)\n[![Vite](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FVite-7.0-646CFF?logo=vite&logoColor=white)](https:\u002F\u002Fvitejs.dev\u002F)\n[![Docker](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FDocker-Compose-2496ED?logo=docker&logoColor=white)](https:\u002F\u002Fdocs.docker.com\u002Fcompose\u002F)\n[![License](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FLicense-MIT-yellow.svg)](#-许可证)\n[![PRs Welcome](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FPRs-welcome-brightgreen.svg)](#-参与贡献)\n\n[功能特性](#-核心特性) · [架构设计](#-系统架构) · [快速开始](#-快速开始) · [项目结构](#-项目结构) · [核心模块](#-核心模块解析) · [API 文档](#-api-文档) · [部署](#-生产部署)\n\n\u003C\u002Fdiv>\n\n---\n\n## 项目简介\n\n`ai-app-generation` 是一个面向 C 端开发者与产品同学的 **AI 驱动应用生成平台**，对标美团 NoCode、Bolt.new、Lovable 等同类型产品。用户只需用自然语言描述应用需求，平台即可：\n\n1. **AI 智能识别**应当生成什么形态的代码（单文件 HTML \u002F 多文件项目 \u002F Vue 完整工程）\n2. **检索 RAG 模板库**为大模型注入高质量上下文片段，提升生成稳定性\n3. **流式输出**生成过程，实时反馈代码片段、工具调用、思考过程\n4. **一键部署**生成产物到平台静态服务，并支持代码 ZIP 下载\n\n平台内置：智能路由、检索增强（RAG）、Agent 工具调用、Prompt 安全护栏、流式 SSE、对象存储、网页截图、应用市场、可观测监控等完整能力。\n\n---\n\n## 核心特性\n\n| 能力 | 说明 |\n| :--- | :--- |\n| 三种代码生成模式 | `HTML` 单文件 \u002F `MULTI_FILE` 多文件 \u002F `VUE_PROJECT` Vue 工程 |\n| AI 智能路由 | 由 Qwen-Turbo 自动判断需求适合的生成模式 |\n| RAG 检索增强 | PgVector 向量检索 + DashScope `text-embedding-v4` + `gte-rerank-v2` 二次重排 |\n| Agent 工具调用 | Vue 工程模式下 AI 自主调用 `FileWrite\u002FRead\u002FModify\u002FDelete\u002FDirRead\u002FExit` 6 类工具完成多文件项目搭建 |\n| 图片采集 Agent | 首条消息自动调度 `Pexels 图片搜索` + `阿里 wan2.2 Logo 生成` + `Mermaid 流程图` + `unDraw 插画` 4 类工具，并行收集封面\u002FLogo\u002F插图素材 |\n| 流式 SSE | Reactor `Flux\u003CServerSentEvent>` + 自定义工具调用流解析器（字符级状态机） |\n| Prompt 安全护栏 | 注解 `@PromptSafetyCheck` + AOP 切面 + LangChain4j `InputGuardrail` 双重拦截 |\n| 一键部署 | `deployKey` 标识 + Nginx 静态托管，生成产物即时可访问 |\n| 代码下载 | 生成目录打包为 ZIP，支持完整工程导出 |\n| 网页截图 | Selenium + Chromium + WebDriverManager 容器内自动截屏，封面同步上传腾讯云 COS |\n| 应用市场 | 精选作品（priority 排序）+ 我的应用 + 管理员后台，分页缓存 + 游标查询 |\n| 对话历史 | 按 `appId + createTime` 联合索引的游标分页 |\n| 双层缓存 | Caffeine 本地缓存 + Redis 分布式缓存 + Spring `@Cacheable` 自动失效 |\n| 可观测 | Spring Actuator + Micrometer + Prometheus + Grafana AI 模型可观测看板 |\n| 用户体系 | Spring Session + Redis 持久化（30 天）+ AOP `@AuthCheck` 角色拦截 |\n\n---\n\n## 系统架构\n\n```\n┌──────────────────────────────────────────────────────────────────────┐\n│                         浏览器（Vue 3 + AntDV）                        │\n└──────────────┬─────────────────────────────────────┬─────────────────┘\n               │ \u002Fapi (HTTP \u002F SSE)                   │ \u002Fstatic (生成产物)\n┌──────────────▼─────────────────┐    ┌──────────────▼─────────────────┐\n│  Spring Boot 3.5.4 (port 9025) │    │     Nginx (静态资源 \u002F 部署托管)   │\n│ ┌────────────────────────────┐ │    └────────────────────────────────┘\n│ │  Controller (App \u002F User \u002F  │ │\n│ │  ChatHistory \u002F Health)     │ │\n│ ├────────────────────────────┤ │\n│ │  AppService (业务编排)       │ │\n│ │  ├─ AiCodeGenTypeRouting   │──── Qwen-Turbo（路由分类）\n│ │  ├─ AiCodeGeneratorFacade  │\n│ │  │   ├─ RAG Retrieval      │──── PgVector + Rerank\n│ │  │   ├─ Image Collection   │──── DashScope + Pexels（并行 Agent）\n│ │  │   └─ Code Generator     │──── DeepSeek-Chat（主生成）\n│ │  ├─ ScreenshotService      │──── Selenium + Chromium\n│ │  └─ ProjectDownload        │──── Hutool ZipUtil\n│ ├────────────────────────────┤ │\n│ │  Guardrail (Prompt 安全)    │\n│ │  AOP (@AuthCheck)          │\n│ │  Cache (Caffeine + Redis)  │\n│ └────────────────────────────┘ │\n└─┬────────┬────────┬────────┬──┘\n  │        │        │        │\n  ▼        ▼        ▼        ▼\nMySQL    Redis    PgVector  COS\n(业务)   (Session) (RAG)    (封面截图)\n\n┌────────────────────────────┐    ┌──────────────────────────────────┐\n│  Prometheus (port 9090)    │ ─► │  Grafana (port 3000)             │\n│  抓取 \u002Factuator\u002Fprometheus  │    │  AI Model Observability Dashboard │\n└────────────────────────────┘    └──────────────────────────────────┘\n```\n\n**核心数据流（流式生成）**\n\n```\nUser Prompt\n   │\n   ▼\n[Prompt 安全护栏] ─► [AI 智能路由：Qwen-Turbo] ─► [图片采集 Agent (并行 4 工具)]\n                                                        │\n                                                        ▼\n                              [RAG 检索 → Rerank → 拼接片段]\n                                                        │\n                                                        ▼\n                          [DeepSeek 流式生成] ── SSE Flux ──► 浏览器\n                                  │\n                                  ▼\n                          [代码解析 → 文件落盘 → Vue 工程构建]\n                                  │\n                                  ▼\n                          [Selenium 截屏 → COS 上传 → 更新封面]\n```\n\n---\n\n## 技术栈\n\n### 后端\n\n| 类别 | 选型 | 版本 |\n| :--- | :--- | :--- |\n| 语言 \u002F 框架 | Java \u002F Spring Boot | 25 \u002F 3.5.4 |\n| AI 编排 | LangChain4j (含 OpenAI Starter \u002F Reactor \u002F PgVector) | 1.1.0 |\n| Agent 工作流 | LangGraph4j | 1.6.0-rc2 |\n| AI 模型 | DeepSeek（主生成）+ 阿里 DashScope（路由 \u002F Embedding \u002F Rerank \u002F 文生图） | - |\n| ORM | MyBatis-Flex（含 codegen） | 1.11.0 |\n| 数据库 | MySQL 8.0.40 + PostgreSQL 16 (pgvector) | - |\n| 缓存 \u002F Session | Redis 7.0.15 + Redisson + Spring Session + Caffeine | - |\n| API 文档 | Knife4j (OpenAPI 3) | 4.4.0 |\n| 网页截图 | Selenium + WebDriverManager | 4.33.0 \u002F 6.1.0 |\n| 对象存储 | 腾讯云 COS SDK | 5.6.227 |\n| 工具库 | Hutool \u002F Lombok | 5.8.38 \u002F - |\n| 监控 | Spring Actuator + Micrometer Prometheus | - |\n\n### 前端\n\n| 类别 | 选型 |\n| :--- | :--- |\n| 框架 | Vue 3.5 + Composition API |\n| 构建 | Vite 7 |\n| 状态管理 | Pinia 3 |\n| UI 组件库 | Ant Design Vue 4.2 |\n| 路由 | Vue Router 4 |\n| 类型 | TypeScript 5.8 |\n| HTTP | Axios 1.11 |\n| 类型生成 | `@umijs\u002Fopenapi`（基于 OpenAPI 自动生成 TS 接口） |\n| Markdown | markdown-it + highlight.js |\n\n### 基础设施\n\n| 类别 | 选型 |\n| :--- | :--- |\n| 容器化 | Docker + Docker Compose |\n| 反向代理 | Nginx |\n| 监控可视化 | Prometheus + Grafana |\n| 数据库迁移 | Flyway 风格 SQL（`V1__hnsw_index.sql` 等） |\n\n---\n\n## 快速开始\n\n### 环境要求\n\n| 依赖 | 最低版本 | 备注 |\n| :--- | :--- | :--- |\n| JDK | 25 | 项目使用 Java 25 特性（switch pattern） |\n| Maven | 3.9+ | 或直接使用项目自带 `mvnw` |\n| Node.js | 20 LTS+ | 前端构建 |\n| MySQL | 8.0+ | 端口默认 `3406`（可改） |\n| Redis | 7.0+ | 端口 `6379`，需开启 ACL |\n| PostgreSQL | 16 + pgvector | 端口 `5432`，库 `ai_codegen_rag` |\n\n### 必需的 API Key\n\n启动前请准备好以下 Key（写入环境变量）：\n\n| 变量名 | 用途 | 申请地址 |\n| :--- | :--- | :--- |\n| `DEEPSEEK_API_KEY` | 主代码生成 \u002F 推理 | https:\u002F\u002Fplatform.deepseek.com |\n| `DASHSCOPE_API_KEY` | 智能路由 \u002F Embedding \u002F Rerank \u002F 文生图 | https:\u002F\u002Fdashscope.aliyun.com |\n| `PEXELS_API_KEY` | 免费图片素材搜索 | https:\u002F\u002Fwww.pexels.com\u002Fapi |\n| `COS_HOST` \u002F `TEN_SERCET_ID` \u002F `TEN_SECRET_KEY` | 腾讯云 COS 对象存储 | https:\u002F\u002Fconsole.cloud.tencent.com\u002Fcos |\n\n### 1. 克隆仓库\n\n```bash\ngit clone https:\u002F\u002Fgitee.com\u002Flywynl\u002Fai-app-generation.git\ncd ai-app-generation\n```\n\n### 2. 初始化数据库\n\n```bash\n# MySQL：执行 sql\u002Fschema.sql\nmysql -u root -p \u003C sql\u002Fschema.sql\n\n# PostgreSQL：启用 pgvector 扩展\npsql -U admin -d ai_codegen_rag -f prod\u002Fpostgres\u002Finit\u002F01-enable-pgvector.sql\n```\n\n### 3. 配置环境变量\n\n将 API Key 注入到环境变量（PowerShell 示例）：\n\n```powershell\n$env:DEEPSEEK_API_KEY=\"sk-xxx\"\n$env:DASHSCOPE_API_KEY=\"sk-xxx\"\n$env:PEXELS_API_KEY=\"xxx\"\n$env:COS_HOST=\"https:\u002F\u002Fxxx.cos.ap-beijing.myqcloud.com\"\n$env:TEN_SERCET_ID=\"xxx\"\n$env:TEN_SECRET_KEY=\"xxx\"\n```\n\n> **温馨提示**：`application.yml` 中数据库密码默认为开发期占位 `lyw666`，请上线前改成自己的安全密码或迁移到环境变量。\n\n### 4. 启动后端\n\n```bash\n# Windows\nmvnw.cmd spring-boot:run\n\n# Linux \u002F macOS\n.\u002Fmvnw spring-boot:run\n```\n\n启动成功后访问：\n\n- API 文档（Knife4j）：\u003Chttp:\u002F\u002Flocalhost:9025\u002Fapi\u002Fdoc.html>\n- 健康检查：\u003Chttp:\u002F\u002Flocalhost:9025\u002Fapi\u002Factuator\u002Fhealth>\n- Prometheus 指标：\u003Chttp:\u002F\u002Flocalhost:9025\u002Fapi\u002Factuator\u002Fprometheus>\n\n### 5. 启动前端\n\n```bash\ncd ai-app-generation-frontend\nnpm install\nnpm run dev\n```\n\n前端默认 \u003Chttp:\u002F\u002Flocalhost:5173>，已通过 Vite 代理转发到后端 `\u002Fapi`。\n\n---\n\n## 项目结构\n\n```\nai-app-generation\u002F\n├── ai-app-generation-frontend\u002F         # Vue 3 前端（独立子项目）\n│   ├── src\u002F\n│   │   ├── api\u002F                        # OpenAPI 自动生成的 TS 接口\n│   │   ├── components\u002F                 # 通用组件\n│   │   ├── pages\u002F                      # 路由页面（编辑器、应用市场、登录等）\n│   │   ├── stores\u002F                     # Pinia 状态\n│   │   └── router\u002F                     # Vue Router\n│   ├── package.json\n│   └── vite.config.ts\n│\n├── src\u002Fmain\u002Fjava\u002Fcom\u002Flyw\u002Fappgeneration\u002F\n│   ├── AiAppGenerationApplication.java # 启动类（@EnableCaching + @MapperScan）\n│   │\n│   ├── ai\u002F                             # AI 能力层（核心）\n│   │   ├── AiCodeGeneratorService.java         # AI Service 接口（@SystemMessage \u002F @UserMessage）\n│   │   ├── AiGeneratorServiceFactory.java      # 按 appId + 类型构建独立 AI 实例（含工具\u002F记忆）\n│   │   ├── AiCodeGenTypeRoutingService.java    # 智能路由：自动选择 HTML\u002F多文件\u002FVue\n│   │   ├── AiCodeGenTypeRoutingServiceFactory.java\n│   │   ├── model\u002F                              # AI 响应数据结构（HtmlCodeResult, MultiFileCodeResult）\n│   │   │   └── message\u002F                        # 流式消息：AiResponse \u002F ToolRequest \u002F ToolExecuted \u002F ...\n│   │   ├── parser\u002F\n│   │   │   └── ToolRequestStreamParser.java    # 工具调用流解析器（字符级状态机）\n│   │   ├── tools\u002F                              # Vue 工程模式下的 Agent 工具\n│   │   │   ├── BaseTool.java                   # 工具基类\n│   │   │   ├── FileWriteTool \u002F FileReadTool\n│   │   │   ├── FileModifyTool \u002F FileDeleteTool\n│   │   │   ├── FileDirReadTool                 # 目录读取\n│   │   │   └── ExitTool                        # AI 主动退出循环\n│   │   ├── image\u002F                              # 图片采集 Agent\n│   │   │   ├── ImageCollectionService.java     # 入口：增强 Prompt\n│   │   │   ├── ImageCollectionPlanService.java # 编排器：解析 4 类工具的并行计划\n│   │   │   ├── ImageCollectionPromptBuilder.java\n│   │   │   ├── ImageCollectionExecutorConfig.java  # 自定义线程池\n│   │   │   ├── tools\u002F\n│   │   │   │   ├── ImageSearchTool.java        # Pexels 搜索\n│   │   │   │   ├── LogoGeneratorTool.java      # 阿里 wan2.2 文生图\n│   │   │   │   ├── MermaidDiagramTool.java     # mmdc CLI 渲染流程图\n│   │   │   │   └── UndrawIllustrationTool.java # unDraw 插画\n│   │   │   └── model\u002F                          # ImageCategoryEnum \u002F ImageCollectionPlan \u002F ImageResource\n│   │   └── guardrail\u002F                          # Prompt 安全护栏\n│   │       ├── PromptSafetyValidator.java\n│   │       ├── PromptSafetyRules.java\n│   │       ├── PromptSafetyInputGuardrail.java # LangChain4j InputGuardrail\n│   │       ├── annotation\u002FPromptSafetyCheck.java\n│   │       └── aspect\u002FPromptSafetyAspect.java  # AOP 切面\n│   │\n│   ├── core\u002F                           # 代码生成核心引擎\n│   │   ├── AiCodeGeneratorFacade.java          # 统一门面（同步 + 流式）\n│   │   ├── parser\u002F                             # 代码解析器（HTML \u002F 多文件 \u002F Executor）\n│   │   ├── saver\u002F                              # 文件落盘模板（HTML \u002F 多文件 \u002F Executor）\n│   │   ├── handler\u002F                            # 流处理器（SimpleText \u002F JsonMessage \u002F Executor）\n│   │   └── builder\u002FVueProjectBuilder.java      # Vue 工程后置构建（npm install \u002F build）\n│   │\n│   ├── controller\u002F\n│   │   ├── AppController.java                  # 应用 CRUD \u002F 流式生成 \u002F 部署 \u002F 下载\n│   │   ├── UserController.java                 # 用户 CRUD \u002F 登录 \u002F 当前用户\n│   │   ├── ChatHistoryController.java          # 对话历史游标查询\n│   │   ├── StaticResourceController.java       # 部署产物静态服务\n│   │   └── HealthController.java\n│   │\n│   ├── service\u002F\n│   │   ├── AppService \u002F UserService \u002F ChatHistoryService\n│   │   ├── ScreenshotService                   # Selenium 截屏\n│   │   ├── ProjectDownloadService              # ZIP 下载\n│   │   └── rag\u002F                                # RAG 检索增强\n│   │       ├── RagRetrievalService.java        # 向量召回（带降级）\n│   │       ├── RagRerankService.java           # gte-rerank-v2 二次重排\n│   │       ├── RagPromptAssembler.java         # 提示词拼接\n│   │       ├── ingest\u002FTemplateIngestService.java  # 模板嵌入入库\n│   │       ├── exception\u002FRerankException.java\n│   │       └── model\u002F                          # TemplateDoc \u002F RetrievedSnippet\n│   │\n│   ├── config\u002F                         # Spring 配置\n│   │   ├── CorsConfig \u002F JsonConfig \u002F CosClientConfig\n│   │   ├── RoutingAiModelConfig                # 多 AI 模型 Bean 装配\n│   │   ├── StreamingChatModelConfig\n│   │   ├── ReasoningStreamingChatModelConfig\n│   │   ├── RedisChatMemoryStoreConfig          # 对话记忆存储\n│   │   ├── RedisCacheManagerConfig             # Redis Cache\n│   │   ├── RagConfig + RagProperties           # RAG 配置类\n│   │   └── ...\n│   │\n│   ├── manger\u002F                         # Manager 层（注：包名为 manger 非 manager，源码原状）\n│   │   ├── CosManager.java                     # 腾讯云 COS 上传\n│   │   ├── ToolManager.java                    # AI 工具集中注册\n│   │   └── AppFileStateManager.java            # 应用文件状态管理\n│   │\n│   ├── aop\u002FAuthInterceptor.java        # 权限拦截切面\n│   ├── annotation\u002FAuthCheck.java       # @AuthCheck 注解\n│   ├── exception\u002F                      # 业务异常 \u002F 错误码 \u002F ThrowUtils\n│   ├── common\u002F                         # BaseResponse \u002F ResultUtils \u002F PageRequest\n│   ├── constants\u002F                      # AppConstant \u002F UserConstant \u002F RagConstants\n│   ├── model\u002F                          # entity \u002F dto \u002F vo \u002F enums\n│   ├── mapper\u002F                         # MyBatis-Flex Mapper\n│   ├── generator\u002FMyBatisCodeGenerator  # 代码生成器（开发期工具）\n│   └── utils\u002FSpringContextUtil \u002F CacheKeyUtils\n│\n├── src\u002Fmain\u002Fresources\u002F\n│   ├── application.yml                 # 主配置（DeepSeek \u002F Qwen \u002F Redis \u002F MySQL \u002F RAG）\n│   └── db\u002Fmigration\u002FV1__hnsw_index.sql # PgVector HNSW 索引\n│\n├── embed_text\u002F                         # RAG 模板库（30+ 已策展模板）\n│   ├── html\u002F                           # 纯 HTML 模板（landing-hero \u002F pricing-table \u002F ...）\n│   ├── multi-file\u002F                     # 多文件模板（todo-app \u002F weather-search \u002F ...）\n│   └── vue-project\u002F                    # Vue 工程模板（login-form \u002F dashboard \u002F ...）\n│\n├── prod\u002F                               # 生产部署目录（独立可发布）\n│   ├── docker-compose.yml              # 7 容器编排\n│   ├── docker\u002F\n│   │   ├── Dockerfile.backend          # 后端镜像（含 Chromium \u002F mermaid-cli）\n│   │   ├── Dockerfile.nginx\n│   │   └── Dockerfile.postgres\n│   ├── nginx\u002Fnginx.conf\n│   ├── redis\u002Fusers.acl                 # Redis ACL\n│   ├── postgres\u002Finit\u002F                  # pgvector 初始化\n│   ├── prometheus\u002Fprometheus.yml\n│   ├── grafana\u002F                        # 数据源、仪表盘自动 provision\n│   ├── sql\u002Fschema.sql\n│   ├── embed_text\u002F                     # 同步 RAG 模板库\n│   ├── artifacts\u002F                      # 构建产物（jar + 前端 dist）\n│   ├── build-artifacts.ps1             # 一键打包脚本\n│   ├── deploy.ps1\n│   ├── .env.example\n│   └── README.md                       # 部署文档\n│\n├── sql\u002Fschema.sql                      # 业务表结构（user \u002F app \u002F chat_history）\n├── docs\u002F                               # 设计文档（图片采集并发设计等）\n├── docker\u002F                             # 开发环境 Docker\n└── pom.xml\n```\n\n---\n\n## 核心模块解析\n\n### 1. AI 智能路由\n\n**类**：`ai\u002FAiCodeGenTypeRoutingService.java`\n\n调用 Qwen-Turbo（轻量 + 低成本）对用户的需求做分类，自动判定应当走哪条生成流水线：\n\n```\n用户输入 ─► Qwen-Turbo 分类 ─► CodeGenTypeEnum\n                                ├─ HTML          单文件页面\n                                ├─ MULTI_FILE    HTML + CSS + JS 多文件\n                                └─ VUE_PROJECT   完整 Vue 3 工程\n```\n\n**为什么这样设计**：不同形态的应用对模型的要求不同，单文件 HTML 用一次 chat 就够了，Vue 工程则需要文件级 Agent 来反复读写。先分类，再选择对应的 AI Service 与系统提示词，能显著降低 Token 消耗与生成失败率。\n\n### 2. RAG 检索增强（Retrieval-Augmented Generation）\n\n**模块**：`service\u002Frag\u002F`\n\n完整流水线：\n\n```\n用户 prompt ──► [Embedding: text-embedding-v4 (1024 维)]\n                       │\n                       ▼\n              [PgVector HNSW 召回 top-K=10] (RagRetrievalService)\n                       │\n                       ▼\n              [gte-rerank-v2 重排 → top-K=3] (RagRerankService)\n                       │\n                       ▼\n              [拼接到用户消息前] (RagPromptAssembler)\n                       │\n                       ▼\n              [DeepSeek 主生成]\n```\n\n**关键决策**：\n- 召回阶段最低分阈值放宽到 `0.30`，给 rerank 足够候选池\n- 整条链路有降级保护：检索\u002F重排任意一步失败都不影响主生成（`RagRetrievalService` 内部 try-catch）\n- 模板提示词上下文预算 `4000` 字符（约 2000 token），避免挤占用户 prompt 空间\n\n### 3. Vue 工程模式 · Agent 工具调用\n\n**类**：`AiCodeGeneratorFacade.processTokenStream()` + `ai\u002Ftools\u002F*`\n\nVue 工程不能用一次性 chat 生成（结构复杂、文件多），改用 LangChain4j `TokenStream` + 工具调用：\n\n| 工具 | 作用 |\n| :--- | :--- |\n| `FileWriteTool` | 创建\u002F覆盖文件 |\n| `FileReadTool` | 读取已生成文件内容 |\n| `FileModifyTool` | 局部修改（避免整文件重写） |\n| `FileDeleteTool` | 删除文件 |\n| `FileDirReadTool` | 列出工程目录 |\n| `ExitTool` | AI 主动判断完成、退出循环 |\n\n**流式工具调用解析器**：`ai\u002Fparser\u002FToolRequestStreamParser.java`\n\n每个 tool call id 维护独立的字符级状态机，处理 LLM 流式吐出参数 JSON 时的字段级 delta 推送（`KEY_READY` → `DELTA` → `VALUE_READY`），让前端实时渲染\"正在写入哪个文件\"，体验接近 Cursor \u002F Bolt.new。\n\n### 4. 图片采集 Agent\n\n**模块**：`ai\u002Fimage\u002F`\n\n仅在 **首条消息** 触发（`isFirstMessage = true`），通过自定义线程池 `ImageCollectionExecutorConfig` 并行调度 4 类工具：\n\n| 工具 | 数据源 | 用途 |\n| :--- | :--- | :--- |\n| `ImageSearchTool` | Pexels API | 真实场景照片（背景\u002F产品图） |\n| `LogoGeneratorTool` | 阿里 DashScope `wan2.2-t2i-flash` | 文生图，定制 Logo |\n| `MermaidDiagramTool` | mermaid-cli (`mmdc`) | 流程图 \u002F 架构图渲染 |\n| `UndrawIllustrationTool` | unDraw | SVG 风格插画 |\n\n收集结果会被拼接到原 prompt，让大模型在生成代码时能直接引用真实素材 URL。\n\n### 5. Prompt 安全护栏\n\n**模块**：`ai\u002Fguardrail\u002F`\n\n三道防线：\n\n1. **注解 + AOP 切面**：`@PromptSafetyCheck` 标记需要校验的方法，`PromptSafetyAspect` 在调用前静态规则匹配\n2. **LangChain4j InputGuardrail**：`PromptSafetyInputGuardrail` 在 AI Service 入口拦截\n3. **规则集中管理**：`PromptSafetyRules` 统一维护黑词、注入特征、长度上限\n\n### 6. 流式 SSE 协议\n\n**控制器**：`AppController.chatToGenCode()` 返回 `Flux\u003CServerSentEvent\u003CString>>`\n\n```\nGET \u002Fapi\u002Fapp\u002Fchat\u002Fgen\u002Fcode?appId=1&message=做一个待办应用\nContent-Type: text\u002Fevent-stream\n\ndata: {\"d\":\"\u003C!DOCTYPE html>\"}\ndata: {\"d\":\"\u003Chtml>\"}\nevent: tool_request\ndata: {\"toolName\":\"FileWriteTool\",\"arguments\":\"...\"}\nevent: business-error\ndata: {\"error\":true,\"code\":50000,\"message\":\"...\"}\nevent: done\ndata: \n```\n\n- 单条消息体用 `{\"d\": \"片段\"}` 包装，前端只需读 `d` 字段拼接\n- `business-error` 事件统一承载业务异常（含错误码）\n- Reactor `Flux.create` + `onErrorResume` 保证流不中断\n\n### 7. 数据库设计\n\n**MySQL 业务库** `ai_app_generation`：\n\n| 表 | 关键字段 | 索引设计 |\n| :--- | :--- | :--- |\n| `user` | userAccount(uk) \u002F userRole \u002F userAvatar | `uk_userAccount` 唯一，`idx_userName` 提速搜索 |\n| `app` | initPrompt \u002F codeGenType \u002F deployKey(uk) \u002F priority \u002F userId | `uk_deployKey` 保证部署标识唯一，`idx_userId` 加速我的列表 |\n| `chat_history` | message \u002F messageType (user\u002Fai) \u002F appId \u002F userId | **`idx_appId_createTime` 联合索引** —— 游标分页核心 |\n\n**PostgreSQL 向量库** `ai_codegen_rag`：\n\n- pgvector 1024 维向量列\n- HNSW 索引（`V1__hnsw_index.sql`），近邻检索 O(log n)\n\n---\n\n## API 文档\n\n启动后端后访问 Knife4j：\n\n```\nhttp:\u002F\u002Flocalhost:9025\u002Fapi\u002Fdoc.html\n```\n\n主要接口分组：\n\n| 模块 | 路径前缀 | 核心接口 |\n| :--- | :--- | :--- |\n| 应用 | `\u002Fapi\u002Fapp` | `POST \u002Fadd` 创建 · `GET \u002Fchat\u002Fgen\u002Fcode` 流式生成（SSE） · `POST \u002Fdeploy` 部署 · `GET \u002Fdownload\u002F{appId}` 下载 ZIP · `POST \u002Fgood\u002Flist\u002Fpage\u002Fvo` 精选 |\n| 用户 | `\u002Fapi\u002Fuser` | `POST \u002Fregister` · `POST \u002Flogin` · `GET \u002Fget\u002Flogin` 当前用户 |\n| 对话 | `\u002Fapi\u002FchatHistory` | `POST \u002Flist\u002Fmy\u002Fpage` 我的对话游标分页 |\n| 静态 | `\u002Fapi\u002Fstatic\u002F**` | 部署产物访问 |\n| 监控 | `\u002Fapi\u002Factuator\u002F{health,info,prometheus}` | 健康 \u002F 指标 |\n\n---\n\n## 配置说明\n\n主配置文件 `src\u002Fmain\u002Fresources\u002Fapplication.yml` 关键项：\n\n```yaml\nserver:\n  port: 9025\n  servlet:\n    context-path: \u002Fapi\n\nspring:\n  mvc.async.request-timeout: 600000   # SSE 流式接口异步超时：10 分钟\n  session:\n    store-type: redis\n    timeout: 2592000                  # 30 天\n\nlangchain4j:\n  open-ai:\n    chat-model:                       # 主生成\n      base-url: https:\u002F\u002Fapi.deepseek.com\n      model-name: deepseek-chat\n    streaming-chat-model:             # 流式生成\n    reasoning-streaming-chat-model:   # 推理任务\n    routing-chat-model:               # 路由分类（Qwen-Turbo）\n      base-url: https:\u002F\u002Fdashscope.aliyuncs.com\u002Fcompatible-mode\u002Fv1\n\nrag:\n  enabled: true\n  templates-dir: D:\u002Fai-app-generation\u002Fembed_text   # 模板库根目录\n  ingest.enabled: false                            # 模板入库开关（手动触发）\n  pgvector: { host: localhost, port: 5432, database: ai_codegen_rag }\n  embedding: { model-name: text-embedding-v4, dimension: 1024 }\n  retrieval: { top-k: 3, min-score: 0.30 }\n  rerank: { enabled: true, model-name: gte-rerank-v2, top-n: 10 }\n  prompt: { max-context-chars: 4000 }\n```\n\n---\n\n## 生产部署\n\n完整部署文档：[`prod\u002FREADME.md`](.\u002Fprod\u002FREADME.md)\n\n### 一键部署（Docker Compose）\n\n```bash\n# 1. 本地打包前后端产物到 prod\u002Fartifacts\u002F\n.\\prod\\build-artifacts.ps1\n\n# 2. 上传 prod 目录到服务器（例如 \u002Fopt\u002Fai-app-generation\u002Fprod）\n\n# 3. 服务器进入 prod 目录\ncd \u002Fopt\u002Fai-app-generation\u002Fprod\ncp .env.example .env\n# 编辑 .env 填入 API Key、数据库密码\n\n# 4. 一键启动\ndocker compose --env-file .env up -d\n```\n\n### 端口映射\n\n| 服务 | 容器端口 | 主机端口（默认） | 用途 |\n| :--- | :--- | :--- | :--- |\n| Nginx | 100 | `${NGINX_HOST_PORT}` 100 | 业务总入口（前端 + 部署产物） |\n| Backend | 9025 | `${BACKEND_HOST_PORT}` 9025 | Spring Boot API |\n| MySQL | 3306 | - | 业务数据 |\n| Redis | 6379 | - | Session \u002F 缓存 |\n| PostgreSQL | 5432 | - | RAG 向量库 |\n| Prometheus | 9090 | `${PROMETHEUS_HOST_PORT}` 9090 | 指标采集 |\n| Grafana | 3000 | `${GRAFANA_HOST_PORT}` 3000 | 可视化看板 |\n\n### 健康检查\n\n```bash\ndocker compose ps\ndocker compose logs -f backend\ncurl http:\u002F\u002Flocalhost:9025\u002Fapi\u002Factuator\u002Fhealth\n```\n\n---\n\n## 监控与可观测性\n\n预置 Grafana 看板 `prod\u002Fgrafana\u002Fdashboards\u002Fai-model-observability-dashboard.json`，开箱即用：\n\n- 模型调用 QPS \u002F 平均延迟 \u002F P99\n- Token 消耗（输入 \u002F 输出）\n- 工具调用次数 \u002F 成功率\n- RAG 检索命中率 \u002F 重排耗时\n- JVM \u002F HikariCP \u002F Redis 连接池\n\n访问：\u003Chttp:\u002F\u002Flocalhost:3000>（默认账号 `admin \u002F lyw666`，请上线前修改）\n\n---\n\n## 路线图\n\n- [x] 三种代码生成模式（HTML \u002F 多文件 \u002F Vue）\n- [x] AI 智能路由\n- [x] RAG 模板检索 + Rerank\n- [x] 流式 SSE + 工具调用流解析\n- [x] 图片采集 Agent（4 工具并行）\n- [x] Prompt 安全护栏\n- [x] 一键部署 + 代码下载\n- [x] Docker Compose 全栈部署 + Grafana 监控\n- [ ] 多模型支持（接入 Claude、GPT-4、月之暗面等）\n- [ ] 应用模板市场（社区共享）\n- [ ] 在线协作编辑\n- [ ] 端到端 E2E 测试覆盖\n\n---\n\n## 参与贡献\n\n1. Fork 本仓库\n2. 新建特性分支：`git checkout -b feat\u002Fyour-feature`\n3. 提交代码（遵循 [约定式提交](https:\u002F\u002Fwww.conventionalcommits.org\u002Fzh-hans\u002F)）：\n   - `feat:` 新功能\n   - `fix:` Bug 修复\n   - `refactor:` 重构\n   - `docs:` 文档\n   - `chore:` 杂项\n4. 推送分支并提交 Pull Request\n\n> 提交代码前请确保通过 `mvn clean verify` 与前端 `npm run lint`。\n\n---\n\n## 许可证\n\n本项目采用 [MIT License](LICENSE)。\n\n---\n\n## 致谢\n\n本项目站在以下优秀开源项目的肩膀上：\n\n- [Spring Boot](https:\u002F\u002Fspring.io\u002Fprojects\u002Fspring-boot)\n- [LangChain4j](https:\u002F\u002Fdocs.langchain4j.dev\u002F) · 强大的 Java AI 编排框架\n- [LangGraph4j](https:\u002F\u002Fgithub.com\u002Fbsorrentino\u002Flanggraph4j) · Agent 工作流\n- [MyBatis-Flex](https:\u002F\u002Fmybatis-flex.com\u002F) · 优雅的 ORM\n- [Vue.js](https:\u002F\u002Fvuejs.org\u002F) · 渐进式前端框架\n- [Ant Design Vue](https:\u002F\u002Fantdv.com\u002F) · 企业级 UI 组件\n- [pgvector](https:\u002F\u002Fgithub.com\u002Fpgvector\u002Fpgvector) · PostgreSQL 向量扩展\n- [DeepSeek](https:\u002F\u002Fwww.deepseek.com\u002F) · 高性价比代码生成模型\n- [阿里云 DashScope](https:\u002F\u002Fdashscope.aliyun.com\u002F) · 通义千问 \u002F Embedding \u002F Rerank\n- [Hutool](https:\u002F\u002Fhutool.cn\u002F) · Java 工具集\n\n---\n\n\u003Cdiv align=\"center\">\n\n**如果这个项目对你有帮助，欢迎 Star 支持一下！**\n\nMade with ♥ by [@lywynl](https:\u002F\u002Fgitee.com\u002Flywynl)\n\n\u003C\u002Fdiv>\n","`ai-app-generation` 是一个基于 Spring Boot 3 和 LangChain4j 的 AI 驱动零代码应用生成平台，用户通过自然语言输入需求，即可自动生成并一键部署为可访问的 Web 应用。其核心功能包括智能识别代码生成模式、多源上下文增强、流式输出生成过程以及一键部署和下载生成的应用。该平台采用了多种优化策略如多级缓存、异步处理和安全护轨等，确保系统的高性能与稳定性。适用于需要快速开发和部署简单Web应用的场景，特别适合对编程不熟悉的业务人员或希望提高开发效率的技术团队使用。","2026-06-11 04:05:54","CREATED_QUERY"]