Under-Utils
stable 1.0.2 1.0.3-SNAPSHOT
starter

AI Starter

under-utils-ai-starter

Spring Boot AI 自动装配入口,按配置创建默认或多个命名 AiClient。

依赖

under-utils-ai-starter Maven 坐标
<dependency>
    <groupId>io.github.yexianglun-d</groupId>
    <artifactId>under-utils-ai-starter</artifactId>
    <version>1.0.2</version>
</dependency>

适用场景

需要在 Spring Boot 服务中通过配置接入 OpenAI-compatible 模型的项目。

能力边界

文档来源 under-utils-ai-starter/README.md
API 入口 查看 AI Starter 相关 API
设计约束 保留失败语义、配置 key 和 public API 兼容性说明,不以营销描述替代真实边界。

README 同步内容

来源:under-utils-ai-starter/README.md,构建时自动读取并渲染。

Spring Boot 自动装配入口,用于按配置创建默认 AiClient

本 starter 只依赖 under-utils-ai 和 Spring Boot autoconfigure,不会被 under-utils-starter 聚合引入。需要 AI 能力的项目应显式引入该坐标。

依赖

<dependency>
    <groupId>io.github.yexianglun-d</groupId>
    <artifactId>under-utils-ai-starter</artifactId>
    <version>1.0.2</version>
</dependency>

配置

默认不会创建 AiClient,需要显式启用:

under:
  utils:
    ai:
      enabled: true
      provider: openai-compatible
      base-url: https://api.example.com/v1
      api-key: ${AI_API_KEY}
      model: your-model-name
      timeout: 30s
      max-retries: 0
      retry-interval: 0ms

使用:

@Service
public class SummaryService {

    private final AiClient aiClient;

    public SummaryService(AiClient aiClient) {
        this.aiClient = aiClient;
    }

    public String summarize(String content) {
        return aiClient.chat(ChatRequest.user("请总结:" + content)).text();
    }
}

多模型配置:

该能力位于当前 1.0.3-SNAPSHOT 开发周期,正式发布后再使用对应稳定版本坐标。

under:
  utils:
    ai:
      enabled: true
      default-client: deepseek
      timeout: 30s
      clients:
        deepseek:
          provider: openai-compatible
          base-url: https://api.deepseek.example/v1
          api-key: ${DEEPSEEK_API_KEY}
          model: deepseek-chat
        qwen:
          provider: openai-compatible
          base-url: https://dashscope-compatible.example/v1
          api-key: ${QWEN_API_KEY}
          model: qwen-plus

使用命名客户端:

@Service
public class ModelRouter {

    private final AiClientRegistry aiClients;

    public ModelRouter(AiClientRegistry aiClients) {
        this.aiClients = aiClients;
    }

    public String askQwen(String prompt) {
        return aiClients.get("qwen").chat(ChatRequest.user(prompt)).text();
    }
}

顶层 providerbase-urlapi-keymodeltimeoutmax-retriesretry-intervaltemperaturemax-tokensheaders 可作为命名客户端默认值;单个客户端配置会覆盖同名字段。未配置 clients 时,starter 会继续按旧的顶层配置创建名为 default 的客户端。

自动装配规则

  • under.utils.ai.enabled=true 时才创建默认 AiClient
  • 默认内置 openai-compatible provider。
  • 配置 under.utils.ai.clients.<name>.* 时会创建 AiClientRegistry,并将默认客户端作为 AiClient Bean 暴露。
  • 如需非兼容协议,可声明自定义 AiClientProvider Bean,并将顶层或命名客户端的 provider 设置为该 provider 名称。
  • 用户自定义 AiClient Bean 时,自动装配会退让,不再强制创建注册表。
  • api-key 为空时不会发送 Authorization header,适合本地兼容服务。

流式响应

默认创建的 OpenAiCompatibleAiClient 同时实现 StreamingAiClient,可用于 SSE 流式输出:

if (aiClient instanceof StreamingAiClient streamingAiClient) {
    try (ChatStream stream = streamingAiClient.streamChat(ChatRequest.user("请逐步输出"))) {
        stream.stream()
                .filter(ChatStreamEvent::hasText)
                .forEach(event -> System.out.print(event.text()));
    }
}