一个强大的、统一的 AI 调用框架 Spring Boot Starter,支持多种 AI 引擎和 Provider。
- 🚀 开箱即用:添加依赖即可使用,无需复杂配置
- 🔌 多引擎支持:支持 Spring AI 和自定义 HTTP 引擎
- 🎯 统一接口:提供统一的 API,屏蔽底层差异
- 🔄 动态配置:支持从 JSON、数据库、配置中心动态加载 Provider
- ⚡ 流式响应:支持流式对话
- 🛠️ 中间件机制:支持重试、限流、日志等中间件
- 🔧 灵活扩展:易于扩展新的 AI Provider
<dependency>
<groupId>cn.lightr</groupId>
<artifactId>light-ai-spring-boot-starter</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>在你的项目 src/main/resources/ 目录下创建 ai-providers.json:
{
"providers": [
{
"id": "openai",
"type": "openai",
"name": "OpenAI",
"baseUrl": "https://api.openai.com/v1",
"apiKey": "your-api-key",
"model": "gpt-4",
"engineType": "spring-ai"
}
]
}@RestController
@RequestMapping("/api/chat")
public class ChatController {
@Autowired
private LightAIClient aiClient;
@PostMapping("/send")
public Mono<String> chat(@RequestBody String message) {
ChatRequest request = ChatRequest.builder()
.providerId("openai")
.messages(List.of(
ChatMessage.builder()
.role(MessageRole.USER)
.content(message)
.build()
))
.build();
return aiClient.chat(request)
.map(ChatMessage::getContent);
}
@GetMapping(value = "/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<String> chatStream(@RequestParam String message) {
ChatRequest request = ChatRequest.builder()
.providerId("openai")
.messages(List.of(
ChatMessage.builder()
.role(MessageRole.USER)
.content(message)
.build()
))
.build();
return aiClient.chatStream(request);
}
}- 默认位置:
src/main/resources/ai-providers.json - 自定义位置:通过
application.yml配置
lightr:
ai:
enabled: true
config:
source: json
file: classpath:config/my-providers.json
auto-init: true| 字段 | 必填 | 说明 |
|---|---|---|
id |
✅ | Provider 唯一标识 |
type |
✅ | Provider 类型(openai, zhipu等) |
baseUrl |
✅ | API 基础 URL |
apiKey |
✅ | API 密钥 |
model |
✅ | 默认模型 |
engineType |
❌ | 引擎类型(spring-ai 或 custom) |
详细配置说明请查看 配置指南
- ✅ OpenAI (GPT-4, GPT-3.5)
- ✅ 智谱 AI (GLM-4)
- ✅ Anthropic (Claude)
- ✅ 任何 OpenAI 兼容的 API
- spring-ai: 使用 Spring AI 框架(推荐)
- custom: 使用自定义 HTTP 引擎
your-project/
├── src/
│ └── main/
│ ├── java/
│ │ └── com/example/
│ │ └── ChatController.java
│ └── resources/
│ ├── application.yml
│ └── ai-providers.json ← 在这里配置
├── pom.xml
└── ...
// 创建对话
Conversation conversation = new Conversation("openai", "gpt-4");
conversation.setSystemPrompt("你是一个有帮助的AI助手");
// 发送消息
Mono<ChatMessage> response = aiClient.chatWithConversation(
conversation,
"你好,介绍一下你自己"
);ChatRequest request = ChatRequest.builder()
.providerId("openai")
.model("gpt-4-turbo") // 覆盖默认模型
.temperature(0.7) // 设置温度
.maxTokens(1000) // 设置最大token数
.messages(messages)
.build();// 检查单个 Provider
boolean available = aiClient.isProviderAvailable("openai");
// 获取所有可用的 Provider
List<String> providers = aiClient.getAvailableProviders();使用 Spring Profile 实现环境隔离:
# application-dev.yml
lightr:
ai:
config:
file: classpath:ai-providers-dev.json
# application-prod.yml
lightr:
ai:
config:
file: file:/etc/ai/providers-prod.jsonlightr:
ai:
providers:
- id: openai
api-key: ${OPENAI_API_KEY}ai-providers.json
**/ai-providers-*.json
!**/ai-providers-example.json
A: 请在你的项目 src/main/resources/ 目录下创建 ai-providers.json 文件。
A: 在 providers 数组中添加多个配置即可:
{
"providers": [
{ "id": "openai", ... },
{ "id": "zhipu", ... },
{ "id": "claude", ... }
]
}A: 只需修改 ChatRequest 中的 providerId 参数:
// 使用 OpenAI
request.setProviderId("openai");
// 切换到智谱 AI
request.setProviderId("zhipu");当看到以下错误时:
TransientAiException: 503 - The model is overloaded. Please try again later.
这是正常的业务异常,表示 OpenAI API 服务器暂时过载。建议实现以下处理方式:
import reactor.util.retry.Retry;
import java.time.Duration;
@PostMapping("/send")
public Mono<String> chat(@RequestBody String message) {
return aiClient.chat(request)
.map(ChatMessage::getContent)
.retryWhen(Retry.backoff(3, Duration.ofSeconds(2))
.filter(throwable -> throwable instanceof TransientAiException));
}@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(TransientAiException.class)
public ResponseEntity<Map<String, Object>> handleTransientAiException(
TransientAiException e) {
return ResponseEntity
.status(HttpStatus.SERVICE_UNAVAILABLE)
.body(Map.of(
"success", false,
"error", "AI服务暂时不可用,请稍后重试",
"code", "SERVICE_OVERLOADED"
));
}
}public Mono<String> chatWithFallback(String message) {
return aiClient.chat(createRequest("openai", message))
.map(ChatMessage::getContent)
.onErrorResume(e -> {
// 尝试备用 Provider
return aiClient.chat(createRequest("zhipu", message))
.map(ChatMessage::getContent);
})
.onErrorResume(e -> {
// 返回默认响应
return Mono.just("抱歉,服务暂时不可用");
});
}详细的错误处理指南请查看:错误处理指南
- Spring Boot 3.x
- Spring AI 1.1.0
- Reactor (响应式编程)
- Jackson (JSON处理)
- Lombok