# spring-ai-lab **Repository Path**: x_bao/spring-ai-lab ## Basic Information - **Project Name**: spring-ai-lab - **Description**: Spring AI Lab 是基于 Spring AI 构建的企业级 AI 应用快速开发框架,提供开箱即用的场景化 Starter,封装 RAG 知识库、智能对话、多智能体协作、代码审查、数据分析等通用能力,以注解驱动、约定大于配置的 Spring 生态风格,让 Java 开发者零门槛快速搭建生产级 AI 应用。 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 2 - **Created**: 2026-08-28 - **Last Updated**: 2026-08-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Spring AI Lab > 基于 Spring AI 的 AI 应用快速开发工具箱 > > Spring AI Lab — AI scenario starters for Spring Boot. Chat, RAG, multi-agent, code review, and more — each available as a drop-in dependency with auto-configured REST APIs. Zero boilerplate, production-ready. > > **Spring AI Application Rapid Development Toolkit** --- ## 目录 - [项目简介](#项目简介) - [核心特性](#核心特性) - [快速开始](#快速开始) - [外部接入指南](#外部接入指南) - [模块结构](#模块结构) - [架构设计](#架构设计) - [API 参考](#api-参考) - [配置参考](#配置参考) - [可观测性](#可观测性) - [技术栈](#技术栈) - [贡献指南](#贡献指南) - [作者](#作者) --- ## 项目简介 Spring AI Lab 是一套基于 Spring AI 的 AI 应用快速开发工具箱,将 AI 应用开发中反复出现的通用逻辑封装为即插即用的**场景模板**,让开发者关注业务而非基础设施。 ### 设计原则 - **约定优于配置** — 每个场景模板默认就能跑,只需配 API Key - **渐进式** — 可以只用一个 Starter,也可以组合多个 - **不重新发明轮子** — 底层 100% 基于 Spring AI 官方 API,只做组合和封装 - **可独立运行** — 每个场景模板是独立模块,不依赖其他场景 - **核心只定义抽象** — Core 模块不含重量级第三方库实现 ### 与 Spring AI 的关系 ``` Spring AI (官方) ├── ChatClient ────┐ ├── Tool Calling ───┤ ├── RAG / Vector ───┤── Spring AI Lab (本项目) ├── MCP ────────────┤ │ └── Advisors ───────┘ ├── 场景模板 (组合官方能力为即用产品) ├── 统一配置 (简化多模型管理) ├── 对话记忆 (上下文持久化,支持 TTL 过期) ├── 文档处理 (PDF/Word/Markdown/HTML → Embedding) ├── 模型路由 (多模型切换、降级、成本控制) ├── 可观测性 (Token 统计、延迟监控、Mircometer 导出) ├── 容错降级 (重试 → 熔断 → 降级 三级防护) └── 安全防护 (令牌桶限流) ``` --- ## 核心特性 ### 场景模板 | # | 场景 | 注解 | API 路径 | 说明 | |---|------|------|----------|------| | 1 | 通用对话 | `@EnableChatAgent` | `/api/chat` | 多轮对话 + 流式输出 + 记忆管理 | | 2 | RAG 问答 | `@EnableRagQa` | `/api/rag` | 文档 ETL → 向量检索 → 生成回答 | | 3 | 多 Agent 协作 | `@EnableMultiAgent` | `/api/multi-agent` | 顺序/并行/路由/辩论 四种协作模式 | | 4 | 代码审查 | `@EnableCodeReview` | `/api/code-review` | Git Diff 解析 + 多维度 AI 审查 | | 5 | 数据分析 | `@EnableDataAnalysis` | `/api/data-analysis` | 自然语言 → SQL → AI 分析报告 | | 6 | 智能客服 | `@EnableCustomerService` | `/api/cs` | 意图识别 + 多轮对话 + 知识库 | | 7 | MCP Server | `@EnableMcp` | `/mcp/sse` | MCP 协议服务端,JSON-RPC + SSE | ### 基础设施 - **🔀 多模型路由** — 支持多模型动态切换,按场景/成本/延迟自动选择,支持主备降级 - **🧠 对话记忆** — 内存/Redis 两种实现,支持 TTL 过期、定时清理、会话列表查询 - **📄 文档处理** — PDF/Word/Markdown/HTML/TXT 五格式加载,固定大小/段落/语义三种切分策略 - **🎯 Skill 系统** — 多源加载(classpath 内置 + 外部目录 + REST API 动态注册),热加载、语义路由、文件变更监听,支持生产环境零停机修改 Skill - **🛡️ 容错降级** — 重试(指数退避)→ 熔断器(Resilience4j)→ 降级(Fallback Advisor)三级防护 - **📊 可观测性** — Token 统计、延迟监控、错误率、文档/工具调用指标,Mircometer → Prometheus/Grafana - **🔒 安全防护** — 令牌桶限流器,接口级速率限制 --- ## 快速开始 ### 环境要求 - JDK 17+ - Maven 3.9+ - 一个 OpenAI 兼容的 API Key(如 MiMo、DashScope、OpenAI 等) > **验证环境**:本项目所有场景模板均通过小米 MiMo 模型(`mimo-v2-pro`)完成功能验证,包括 69 个单元测试和 27 个集成测试全部通过。只要你的模型兼容 OpenAI Chat Completions 协议,即可直接使用。 ### 1. 添加依赖 ```xml com.liziye spring-ai-lab-bom 1.0.0 pom import com.liziye spring-ai-lab-scenario-chat ``` ### 2. 配置 application.yml ```yaml spring: ai: dashscope: api-key: ${DASHSCOPE_API_KEY} base-url: https://your-api-endpoint.com/v1/chat/completions model: your-model-name max-tokens: 2048 temperature: 0.7 lab: memory: type: in-memory # in-memory / redis max-history: 20 # 最大历史消息数 ttl-minutes: 30 # 会话过期时间 observation: token-tracking: true latency-tracking: true metrics-export: true ``` ### 3. 一键启用 只要依赖存在于 Classpath 上,Spring Boot 的 `AutoConfiguration.imports` 机制自动装配所有组件。`@EnableXxx` 注解是可选的显式声明: ```java // 方式一:不写任何注解,Spring Boot 自动装配 @SpringBootApplication public class MyApp { public static void main(String[] args) { SpringApplication.run(MyApp.class, args); } } // 方式二:加注解,意图更清晰(非必需) @SpringBootApplication @EnableChatAgent public class MyApp { public static void main(String[] args) { SpringApplication.run(MyApp.class, args); } } ``` 启动后访问 `http://localhost:8080/api/chat`,发送 POST 请求即可开始对话: ```json { "conversationId": "可选,不传则自动生成", "userInput": "你好,请介绍一下你自己" } ``` ### 4. 组合多个场景 同时引入多个场景依赖,所有端点自动注册: ```xml com.liziye spring-ai-lab-scenario-chat com.liziye spring-ai-lab-scenario-rag com.liziye spring-ai-lab-scenario-code-review ``` 每个场景互不干扰,各自注册独立的 REST API。 --- --- ## 外部接入指南 无需编写任何 Java 代码即可将 Spring AI Lab 场景模板集成到你自己的 Spring Boot 项目中。 ### 接入原理 本项目的每个模块都使用了 **Spring Boot 3.x 标准 `AutoConfiguration.imports` 机制**。每个模块的 `META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports` 文件申明了自动配置类: | 模块 | 注册的自动配置类 | |------|----------------| | `spring-ai-lab-core` | `LabAutoConfiguration` | | `spring-ai-lab-scenario-chat` | `ChatAgentAutoConfiguration` | | `spring-ai-lab-scenario-rag` | `RagQaAutoConfiguration` | | `spring-ai-lab-scenario-multi-agent` | `MultiAgentAutoConfiguration` | | `spring-ai-lab-scenario-code-review` | `CodeReviewAutoConfiguration` | | `spring-ai-lab-scenario-data-analysis` | `DataAnalysisAutoConfiguration` | | `spring-ai-lab-scenario-customer-service` | `CustomerServiceAutoConfiguration` | | `spring-ai-lab-scenario-mcp` | `McpAutoConfiguration` | **一旦 jar 进入 Classpath,Spring Boot 启动时会自动扫描并装配这些配置类。** 控制器 (Controller)、服务、Agent 等 Bean 全由框架管理,无需业务方手动创建。 ### 接入步骤 #### 第 1 步:引入 BOM(统一版本管理) ```xml com.liziye spring-ai-lab-bom 1.0.0 pom import ``` BOM 不仅统一管理 Spring AI Lab 自身的模块版本,还统一了 Spring AI、Resilience4j、PDFBox、POI 等第三方依赖的版本,避免外部项目出现版本冲突。 #### 第 2 步:按需引入场景依赖 ```xml com.liziye spring-ai-lab-scenario-chat com.liziye spring-ai-lab-scenario-rag ``` > `spring-ai-lab-core` 会自动作为传递依赖引入,无需显式声明。 #### 第 3 步:配置 API Key 在 `application.yml` 中添加: ```yaml spring: ai: dashscope: api-key: ${DASHSCOPE_API_KEY:your-api-key-here} base-url: https://your-endpoint.com/v1/chat/completions model: your-model-name ``` > 支持通过环境变量 `DASHSCOPE_API_KEY` 注入,避免密钥写入配置文件。 #### 第 4 步:启动并调用 启动你的 Spring Boot 应用,无需编写任何 Java 代码。以下端点自动可用: | 引入的依赖 | 自动注册的端点 | |-----------|---------------| | `spring-ai-lab-scenario-chat` | `POST /api/chat`、`POST /api/chat/stream`、`GET /api/chat/health` | | `spring-ai-lab-scenario-rag` | `POST /api/rag/ask`、`POST /api/rag/ask/stream`、`POST /api/documents/upload` | | `spring-ai-lab-scenario-multi-agent` | `POST /api/multi-agent/execute`、`POST /api/multi-agent/execute/stream` | | `spring-ai-lab-scenario-code-review` | `POST /api/code-review/submit`、`POST /api/code-review/snippet` | | `spring-ai-lab-scenario-data-analysis` | `POST /api/data-analysis/query`、`POST /api/data-analysis/generate-sql` | | `spring-ai-lab-scenario-customer-service` | `POST /api/cs/chat`、`GET /api/cs/session/{id}/count` | | `spring-ai-lab-scenario-mcp` | `GET /mcp/sse`、`POST /mcp/message` | ### 关于 `@EnableXxx` 注解 项目中的 `@EnableChatAgent`、`@EnableRagQa` 等注解通过 `@Import` 显式引入对应的 `AutoConfiguration` 类。由于 `AutoConfiguration.imports` 文件已经做了同样的事,**这些注解在正常情况下不是必需的**。它们主要用于以下场景: - **兜底方案**:当 `spring.boot.enableautoconfiguration=false` 时手动激活 - **意图声明**:在启动类上添加注解,让代码意图更加明确 ```java // 以下两种写法等价,二者选一即可: // 写法 A:不加注解,依赖 AutoConfiguration.imports 自动装配 @SpringBootApplication public class MyApp { } // 写法 B:显式声明注解(可选,非必需) @SpringBootApplication @EnableChatAgent @EnableRagQa public class MyApp { } ``` ### 完整示例 一个典型的外部项目,只需 3 个文件即可拥有 AI 对话 + 知识库问答能力: **① `pom.xml`** ```xml com.liziye spring-ai-lab-bom 1.0.0 pom import org.springframework.boot spring-boot-starter-web com.liziye spring-ai-lab-scenario-chat com.liziye spring-ai-lab-scenario-rag ``` **② `application.yml`** ```yaml spring: ai: dashscope: api-key: ${DASHSCOPE_API_KEY} base-url: https://token-plan-cn.xiaomimimo.com/v1/chat/completions model: mimo-v2-pro lab: memory: type: in-memory max-history: 20 ttl-minutes: 30 ``` **③ `MyApp.java`** ```java @SpringBootApplication public class MyApp { public static void main(String[] args) { SpringApplication.run(MyApp.class, args); } } ``` 启动后即可调用 `POST /api/chat` 和 `POST /api/rag/ask` 等端点。 ### 可选依赖 某些能力需要额外可选依赖: | 能力 | 额外依赖 | 说明 | |------|---------|------| | Redis 记忆 | `spring-boot-starter-data-redis` + Redis 服务 | memory.type 切换为 redis | | 文档处理 | 自动传递(`spring-ai-lab-document`) | RAG 场景已包含 | | Prometheus 导出 | `micrometer-registry-prometheus` | 配合 `metrics-export: true` | ```xml org.springframework.boot spring-boot-starter-data-redis ``` ```yaml spring: ai: lab: memory: type: redis ``` --- ## 模块结构 ### 项目总览 ``` spring-ai-lab/ ├── pom.xml # 根 POM(聚合 + 统一版本管理) │ ├── spring-ai-lab-bom/ # BOM — 统一版本控制 │ ├── spring-ai-lab-core/ # 核心抽象(接口 + 通用实现) │ ├── config/ # 配置属性绑定 │ ├── model/ # 通用数据模型(AgentRequest/Response 等) │ ├── memory/ # 对话记忆(InMemory + Redis 实现) │ ├── orchestrator/ # ★ 编排层(BaseOrchestrator 模板方法) │ ├── routing/ # 模型路由(ModelRouter + ProviderManager) │ ├── advisor/ # Advisor 增强(重试/降级/日志/Token) │ ├── resilience/ # 熔断器 + 降级管理器 │ ├── observation/ # 可观测性(Mircometer 指标) │ ├── security/ # 安全(令牌桶限流) │ ├── document/ # 文档接口(Loader/ChunkStrategy) │ ├── exception/ # 异常定义 + 全局异常处理 │ └── llm/ # LLM 实现(DashScopeChatModel) │ ├── spring-ai-lab-document/ # 文档处理实现(独立模块) │ ├── loader/ # PDF / Word / Markdown / TXT / Web │ └── chunk/ # 固定大小 / 段落 / 语义切分 │ ├── spring-ai-lab-scenario-chat/ # 场景 1:通用对话 Agent ├── spring-ai-lab-scenario-rag/ # 场景 2:RAG 知识库问答 ├── spring-ai-lab-scenario-multi-agent/ # 场景 3:多 Agent 协作 ├── spring-ai-lab-scenario-code-review/ # 场景 4:代码审查助手 ├── spring-ai-lab-scenario-data-analysis/ # 场景 5:数据分析 NL2SQL ├── spring-ai-lab-scenario-customer-service/ # 场景 6:智能客服 ├── spring-ai-lab-scenario-mcp/ # 场景 7:MCP Server │ ├── spring-ai-lab-test/ # 测试工具(Mock 组件 + 测试基类) └── docs/ # 项目文档 ``` ### 模块依赖关系 ``` spring-ai-lab-bom (版本管理) | ┌───────────────────┼───────────────────┐ | | | spring-ai-lab-core spring-ai-lab-* spring-ai-lab-test (仅接口+抽象) (各场景模板) (测试工具) | | spring-ai-lab-document | (文档处理实现) | | | └───────┬───────────┘ | Spring AI (官方) ``` **关键设计说明**: - `spring-ai-lab-document` 从 Core 独立 — 无文档处理需求时不引入 pdfbox/poi 等重量级依赖 - 所有第三方模型/向量库依赖标记 `optional`,用户按需引入 - 场景模板通过 `@ConditionalOnClass` 条件装配,避免 `ClassNotFoundException` --- ## 架构设计 Spring AI Lab 采用五层架构,依赖自上而下单向流动: ``` 场景模板层 → 编排层 → 能力层 → Spring AI 基础层 → 基础设施 ``` ### 场景模板层 面向最终用户的"产品"形态。每个模板通过 `@EnableXxx` 注解一键激活,提供开箱即用的 HTTP API: | 模板 | 核心类 | |------|--------| | Chat | `ChatController` + `SimpleChatAgent` | | RAG | `RagQaController` + `RagAgentOrchestrator` + `EtlPipeline` | | Multi-Agent | `MultiAgentController` + `MultiAgentOrchestrator` | | Code Review | `CodeReviewController` + `CodeReviewAgent` + `GitDiffParser` | | Data Analysis | `DataAnalysisController` + `DataAnalysisAgent` + `SqlGenerator` | | Customer Service | `CustomerServiceController` + `CustomerServiceOrchestrator` + `IntentClassifier` | | MCP | `McpSseController` + `McpJsonRpcHandler` + `McpToolRegistry` | ### 编排层 框架内核,封装所有场景共用的编排逻辑。核心设计模式为**模板方法模式**: ``` BaseOrchestrator │ ├── execute() 定义编排骨架 │ ├── preProcess() 子类可覆盖,预处理上下文 │ ├── doExecute() ★ 抽象方法,子类实现核心逻辑 │ ├── postProcess() 子类可覆盖,后处理结果 │ ├── updateMemory() 自动保存对话历史 │ └── recordMetrics() 自动记录指标 │ └── 自动处理:记忆管理 | Token 统计 | 延迟监控 | 异常兜底 | 统一日志 ``` 子类只需实现 `doExecute()` 中的场景差异化逻辑。 **以 RAG 场景为例**(`RagAgentOrchestrator` 继承 `BaseOrchestrator`): 1. 向量检索(`VectorStore.similaritySearch`) 2. 组装 RAG Prompt 3. 调用 ChatClient 记忆、指标、日志由基类自动处理,子类无需关心。 ### 能力层 可复用的横向技术能力,按需组合: | 能力 | 组件 | 说明 | |------|------|------| | 对话记忆 | `ConversationMemory` / `InMemoryConversationMemory` / `RedisConversationMemory` | 多轮对话上下文管理,TTL 过期 | | 模型路由 | `ModelProviderManager` + `ModelRouter` | 多模型动态切换、主备降级 | | 重试降级 | `RetryAdvisor` + `FallbackAdvisor` + `CircuitBreakerManager` | 指数退避重试、熔断、降级 | | 文档处理 | `DocumentLoader` + `ChunkStrategy` | PDF/Word/MD/HTML/TXT 加载与切分 | | 工具注册 | `ToolRegistry` | 实现 Spring AI `ToolRegistrar` 接口 | | 可观测性 | `TokenMetrics` / `LatencyMetrics` / `ErrorMetrics` / `DocumentMetrics` / `ToolCallMetrics` | Mircometer 指标导出 | ### 基础层 100% 基于 Spring AI 官方 API:`ChatClient`、`VectorStore`、`EmbeddingModel`、`ToolCallback`、`MCP Client` 等。框架不做任何魔改或 Fork。 --- ## API 参考 ### 统一响应格式 所有 API 使用 `ApiResult` 统一包装: ```json { "code": 200, "message": "success", "data": { "content": "AI 的回复内容...", "conversationId": "conv_abc123", "toolCalls": [], "metadata": { "tokens": 1523, "latencyMs": 2300, "model": "mimo-v2-pro" }, "fallback": false }, "timestamp": "2026-05-27T10:30:00Z" } ``` ### 所有 API 端点 | 场景 | 方法 | 路径 | 说明 | |------|------|------|------| | Chat | `POST` | `/api/chat` | 同步对话 | | Chat | `POST` | `/api/chat/stream` | 流式对话 (SSE) | | Chat | `GET` | `/api/chat/health` | 健康检查 | | RAG | `POST` | `/api/rag/ask` | 知识库问答 | | RAG | `POST` | `/api/rag/ask/stream` | 流式知识库问答 | | RAG | `GET` | `/api/rag/config` | 查询 RAG 配置 | | RAG | `POST` | `/api/documents/upload` | 上传文档 | | RAG | `GET` | `/api/documents/progress` | 查询文档处理进度 | | Multi-Agent | `POST` | `/api/multi-agent/execute` | 多 Agent 协作执行 | | Multi-Agent | `POST` | `/api/multi-agent/execute/stream` | 流式多 Agent 协作 | | Multi-Agent | `GET` | `/api/multi-agent/modes` | 查询协作模式 | | Multi-Agent | `GET` | `/api/multi-agent/health` | 健康检查 | | Code Review | `POST` | `/api/code-review/submit` | 提交代码审查任务 | | Code Review | `POST` | `/api/code-review/snippet` | 审查代码片段 | | Code Review | `GET` | `/api/code-review/health` | 健康检查 | | Data Analysis | `POST` | `/api/data-analysis/query` | 自然语言数据查询 | | Data Analysis | `POST` | `/api/data-analysis/generate-sql` | 生成 SQL | | Data Analysis | `GET` | `/api/data-analysis/schema` | 查询数据表结构 | | Data Analysis | `GET` | `/api/data-analysis/health` | 健康检查 | | Customer Service | `POST` | `/api/cs/chat` | 客服对话 | | Customer Service | `GET` | `/api/cs/session/{id}/count` | 查询会话消息数 | | MCP | `GET` | `/mcp/sse` | MCP SSE 连接 | | MCP | `POST` | `/mcp/message` | MCP 消息处理 | | MCP | `GET` | `/mcp/sse/sessions/count` | 活跃会话数 | ### 流式响应 (SSE) 流式接口返回标准 SSE 事件流,包含以下事件类型: | event | 说明 | |-------|------| | `message` | AI 回复内容片段 | | `tool_call` | 工具调用开始 | | `tool_result` | 工具调用结果 | | `metadata` | 元数据汇总(Token/延迟) | | `done` | 流结束标记 | ### 错误响应 ```json { "code": 500, "message": "模型调用失败: 请求超时", "data": null, "error": { "type": "MODEL_TIMEOUT", "detail": "API 请求超时,已尝试重试 3 次后触发降级", "timestamp": "2026-05-27T10:30:00Z" } } ``` --- ## 配置参考 ### 全局配置 ```yaml spring: ai: dashscope: api-key: ${DASHSCOPE_API_KEY} # API Key base-url: https://your-endpoint/v1/chat/completions model: your-model-name max-tokens: 2048 temperature: 0.7 connect-timeout: 30 read-timeout: 120 lab: # 记忆管理 memory: type: in-memory # in-memory / redis max-history: 20 ttl-minutes: 30 cleanup-interval-minutes: 60 redis: # Redis 模式配置 host: localhost port: 6379 key-prefix: "ailab:memory:" # 模型路由 model-group: default: primary # 默认模型组 fallback: backup # 降级模型组 # 容错 retry: enabled: true max-attempts: 3 backoff-strategy: exponential # fixed / exponential initial-delay-ms: 1000 max-delay-ms: 10000 multiplier: 2.0 fallback: enabled: true fallback-response: "抱歉,AI 服务暂时不可用,请稍后重试。" circuit-breaker: enabled: true failure-rate-threshold: 50 wait-duration-in-open-state: 60s sliding-window-size: 10 # 可观测性 observation: token-tracking: true latency-tracking: true metrics-export: true export-prefix: "ai_lab" # 安全 security: rate-limit: enabled: true chat: permits-per-second: 10 rag: permits-per-second: 5 # Skill 系统 skill: enabled: true directory: skills # 内置 Skill classpath 路径(JAR 内兜底) external-dir: ./custom-skills # 外部可写目录(生产环境核心配置) auto-init: true # 首次启动时自动将内置 Skill 复制到外部目录 enable-management: false # 是否启用 REST API 管理端点 hot-reload: true # 监听外部目录文件变更自动刷新 routing-strategy: semantic # 路由策略:semantic / keyword / llm similarity-threshold: 0.1 # 语义匹配相似度阈值(0-1) max-matched-skills: 3 # 每次请求最多匹配的 Skill 数 ``` ### 多环境配置 ```yaml # application-dev.yml — 开发环境 spring: ai: dashscope: base-url: http://localhost:11434/v1/chat/completions # 本地 Ollama model: qwen2.5:7b lab: retry: max-attempts: 1 circuit-breaker: enabled: false # application-prod.yml — 生产环境 spring: ai: dashscope: api-key: ${PROD_API_KEY} lab: memory: type: redis retry: max-attempts: 3 circuit-breaker: enabled: true ``` --- ## 可观测性 Spring AI Lab 集成 Micrometer,支持 Prometheus + Grafana 监控。 ### 内置指标 | 指标类别 | 指标名(Mircometer 前缀 `ai_lab_`) | 说明 | |----------|-------------------------------------|------| | Token | `tokens_total`, `tokens_per_request`, `tokens_by_model` | Token 消耗统计 | | 延迟 | `latency_seconds`, `latency_by_scenario` | 请求延迟分布 | | 错误 | `errors_total{type="..."}` | 按错误类型统计 | | 文档 | `documents_loaded_total`, `vectors_stored_total`, `etl_duration_seconds` | ETL 处理统计 | | 工具调用 | `tool_calls_total{tool="...", status="..."}`, `tool_call_duration_seconds` | 工具调用统计 | ### Grafana Dashboard ```yaml management: endpoints: web: exposure: include: health,info,prometheus,metrics ``` Grafana Dashboard JSON 配置文件见 `docs/grafana-dashboard.json`。 --- ## 技术栈 | 类别 | 技术 | 版本 | |------|------|------| | 基础框架 | Spring Boot | 3.4.5 | | AI 框架 | Spring AI | 1.1.5 | | JDK | Java | 17+ | | 构建 | Maven | 3.9+ | | 容错 | Resilience4j | 2.3.0 | | 监控 | Micrometer | 1.14.3 | | PDF 解析 | Apache PDFBox | 3.0.4 | | Word 解析 | Apache POI | 5.4.0 | | 网页抓取 | Jsoup | 1.18.1 | | Git 操作 | JGit | (optional) | | 测试 | JUnit 5 + Mockito | 5.14.2 | --- ## 贡献指南 欢迎提交 Issue 和 Pull Request! ### 开发流程 1. Fork 本仓库 2. 创建特性分支 (`git checkout -b feature/amazing-feature`) 3. 编写代码并通过测试 (`mvn test`) 4. 提交变更 (`git commit -m 'feat: add amazing feature'`) 5. 推送到分支 (`git push origin feature/amazing-feature`) 6. 创建 Pull Request ### 代码规范 - 遵循 JDK 源码 Javadoc 风格:类注释含 `@author` / `@since`,公共方法含 `@param` / `@return` / `@throws` - 使用 Lombok 简化代码(`@Slf4j`、`@Data`、`@RequiredArgsConstructor` 等) - 所有场景模板通过 `BaseOrchestrator` 继承,子类只实现 `doExecute()` 方法 - 日志格式:`log.info("[MODULE] key1={} key2={}", v1, v2);` --- ## 作者 **李子叶 (liziye)** --- > **Made with ❤️ for the Spring AI community** --- ## 版本更新 ### v0.3.0 (2026-05-31) **Skill 系统增强:多源加载与 REST API 管理** - 🎯 **多源 Skill 加载**:支持三层优先级加载 —— REST API 动态注册 > 外部文件目录 > classpath 内置,同名 Skill 高优先级覆盖低优先级 - 📁 **外部目录支持**:新增 `external-dir` 配置,用户只需指定一个可写文件系统目录即可随时新增/修改 Skill 文件,无需重新打包部署 - 🔄 **自动初始化**:新增 `auto-init` 选项,首次启动时自动将 JAR 内置 Skill 复制到外部目录,适合生产环境首次部署 - 🌐 **REST API 管理端点**:新增 `SkillManageController`,提供 5 个管理端点(`GET/POST/DELETE /api/skills/**`、`POST /api/skills/reload`),支持运行时 CRUD 管理 Skill - 🗂️ **内置 Skill 打包进 JAR**:将内置 Skill `.md` 文件复制到 `spring-ai-lab-core/src/main/resources/skills/`,确保发布到私服后仍可作为兜底来源 - ⚙️ **新增配置项**:`external-dir`、`auto-init`、`enable-management`(详见配置参考) - ✅ **零 lint 错误,全部 42 个单元测试通过** ### v0.2.0 - 初始场景模板:Chat、RAG、Multi-Agent、Code Review、Data Analysis、Customer Service、MCP Server - 基础设施:多模型路由、对话记忆、文档处理、容错降级、可观测性、安全限流