Ohhnews

分类导航

$ cd ..
Baeldung原文

使用Spring AI的ChatResponseMetadata获取Anthropic API响应头中的速率限制信息

#spring ai#anthropic#速率限制#api元数据#java

[LOADING...]

1. 概述

Spring AI 的 ChatResponseMetadata 类公开了与聊天响应相关的元数据,包括模型信息以及其他与响应相关的详细信息。根据提供商和可用元数据的不同,这些信息还可能包含速率限制详情。

在本教程中,我们将探讨如何通过 Spring AI 访问 Anthropic 返回的速率限制元数据。同时,我们还将研究 getLimit() 方法如何公开这些信息。

2. Maven 依赖

首先,我们搭建一个简单的 Spring Boot AI 应用,并在 pom.xml 中添加 spring-boot-starter-web 和 spring-ai-starter-model-anthropic 依赖:

$ xml
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-starter-model-anthropic</artifactId>
</dependency>

spring-boot-starter-web 依赖提供 Spring MVC,并为我们的应用配置内嵌 Web 服务器。接下来,spring-ai-starter-model-anthropic 依赖将 Anthropic 的聊天模型与 Spring AI 集成。它允许我们通过 Spring AI 抽象与这些模型进行交互。

3. 获取速率限制元数据

首先,我们在 application.properties 文件中配置 Anthropic 模型:

$ properties
spring.ai.anthropic.api-key=${ANTHROPIC_API_KEY}
spring.ai.anthropic.chat.options.model=claude-sonnet-5-5
spring.ai.anthropic.chat.options.max-tokens=1024

这里,我们从 ANTHROPIC_API_KEY 环境变量中加载 Anthropic API 密钥。然后,我们指定要使用的模型,并设置模型在响应中可以生成的最大 token 数。在这个例子中,我们使用的是 claude-sonnet-5-5 模型。

3.1. MetadataResponse Record

接下来,我们定义一个 Java record 来表示应用返回的响应:

$ java
public record MetadataResponse(
  String model,
  Long requestsLimit,
  Long requestsRemaining,
  Duration tokensReset,
  Long tokensLimit,
  Long tokensRemaining,
  Integer promptTokens,
  Integer completionTokens,
  String content) {
}

在上面的代码中,我们为返回给客户端的数据提供了结构化表示,例如模型名称、速率限制信息、token 使用情况以及生成的输出。

3.2. 控制器类

接下来,我们创建一个控制器类,并注入 ChatClient 以初始化 ChatClient:

$ java
@RestController
public class ChatResponseMetaController {
    private final ChatClient chatClient;
    public ChatResponseMetaController(ChatClient.Builder builder) {
        this.chatClient = builder.build();
    }
}

在 ChatClient 初始化完成后,我们添加一个用于生成短篇故事的端点。同时,该端点还会返回相关的模型元数据、速率限制和 token 使用情况:

$ java
@GetMapping("/story-gen")
public MetadataResponse chat(@RequestParam(defaultValue = "Tell a story in less than 100 words") String message) {
    ChatResponse chatResponse = chatClient.prompt()
      .user(message)
      .call()
      .chatResponse();
    ChatResponseMetadata metadata = chatResponse.getMetadata();
    RateLimit rateLimit = metadata.getRateLimit();
    Usage usage = metadata.getUsage();
    AssistantMessage output = chatResponse.getResult().getOutput();
    return new MetadataResponse(
      metadata.getModel(),
      rateLimit.getRequestsLimit(),
      rateLimit.getRequestsRemaining(),
      rateLimit.getTokensReset(),
      rateLimit.getTokensLimit(),
      rateLimit.getTokensRemaining(),
      usage.getPromptTokens(),
      usage.getCompletionTokens(),
      output.getText());
}

这里,我们使用 ChatClient 将用户提示发送到配置好的 Anthropic 模型,并获取生成的 ChatResponse。然后,我们调用 getMetadata() 方法访问响应元数据。在元数据中,getRateLimit() 会返回一个 RateLimit 对象,其中包含提供商报告的请求限制和 token 限制。

我们还调用 getUsage() 来获取 token 使用信息,并从响应中提取生成的文本。最后,我们用这些值填充 MetadataResponse record,使端点能够在返回生成故事的同时,返回可用的速率限制和使用信息。

3.3. GET 请求

接下来,我们向 /story-gen 发起 GET 请求以查看响应:

$ cat
{
    "model": "claude-sonnet-5-5",
    "requestsLimit": 10000,
    "requestsRemaining": 9999,
    "tokensReset": "PT0S",
    "tokensLimit": 12000000,
    "tokensRemaining": 12000000,
    "promptTokens": 20,
    "completionTokens": 200,
    "content":"..."
}

在上面的输出中,请求限制为 10000,在本次请求之后还剩 9999 次请求。与 token 相关的字段显示了报告的 token 预算以及 token 限制重置前的时间。promptTokens 和 completionTokens 字段分别表示处理提示和生成响应所使用的 token 数。

4. 结论

在本文中,我们学习了如何使用 ChatResponseMetadata 类获取 Anthropic 聊天响应的速率限制元数据。我们通过 getRateLimit() 方法访问了 RateLimit 对象,并探讨了如何获取请求限制、剩余请求数、token 限制以及 token 使用信息。

示例的完整源代码可在 GitHub 上获取。

本文最初发表于 Baeldung。