|
16 | 16 |
|
17 | 17 | package org.springframework.ai.anthropic;
|
18 | 18 |
|
19 |
| -import java.util.ArrayList; |
20 |
| -import java.util.Base64; |
21 |
| -import java.util.HashMap; |
22 |
| -import java.util.List; |
23 |
| -import java.util.Map; |
24 |
| -import java.util.Set; |
| 19 | +import java.util.*; |
25 | 20 | import java.util.stream.Collectors;
|
26 | 21 |
|
27 | 22 | import com.fasterxml.jackson.core.type.TypeReference;
|
|
30 | 25 | import io.micrometer.observation.contextpropagation.ObservationThreadLocalAccessor;
|
31 | 26 | import org.slf4j.Logger;
|
32 | 27 | import org.slf4j.LoggerFactory;
|
| 28 | +import org.springframework.ai.chat.messages.*; |
33 | 29 | import reactor.core.publisher.Flux;
|
34 | 30 | import reactor.core.publisher.Mono;
|
35 | 31 | import reactor.core.scheduler.Schedulers;
|
|
43 | 39 | import org.springframework.ai.anthropic.api.AnthropicApi.ContentBlock.Type;
|
44 | 40 | import org.springframework.ai.anthropic.api.AnthropicApi.Role;
|
45 | 41 | import org.springframework.ai.anthropic.api.AnthropicCacheType;
|
46 |
| -import org.springframework.ai.chat.messages.AbstractMessage; |
47 |
| -import org.springframework.ai.chat.messages.AssistantMessage; |
48 |
| -import org.springframework.ai.chat.messages.MessageType; |
49 |
| -import org.springframework.ai.chat.messages.ToolResponseMessage; |
50 |
| -import org.springframework.ai.chat.messages.UserMessage; |
51 | 42 | import org.springframework.ai.chat.metadata.ChatGenerationMetadata;
|
52 | 43 | import org.springframework.ai.chat.metadata.ChatResponseMetadata;
|
53 | 44 | import org.springframework.ai.chat.metadata.DefaultUsage;
|
@@ -429,14 +420,20 @@ private Map<String, String> mergeHttpHeaders(Map<String, String> runtimeHttpHead
|
429 | 420 |
|
430 | 421 | ChatCompletionRequest createRequest(Prompt prompt, boolean stream) {
|
431 | 422 |
|
| 423 | + Optional<Message> lastMessage = prompt.getInstructions() |
| 424 | + .stream() |
| 425 | + .filter(message -> message.getMessageType() != MessageType.SYSTEM) |
| 426 | + .findFirst(); |
| 427 | + |
432 | 428 | List<AnthropicMessage> userMessages = prompt.getInstructions()
|
433 | 429 | .stream()
|
434 | 430 | .filter(message -> message.getMessageType() != MessageType.SYSTEM)
|
435 | 431 | .map(message -> {
|
436 | 432 | if (message.getMessageType() == MessageType.USER) {
|
437 | 433 | AbstractMessage abstractMessage = (AbstractMessage) message;
|
438 | 434 | List<ContentBlock> contents;
|
439 |
| - if (abstractMessage.getCache() != null) { |
| 435 | + boolean isLastItem = lastMessage.filter(message::equals).isPresent(); |
| 436 | + if (isLastItem && abstractMessage.getCache() != null) { |
440 | 437 | AnthropicCacheType cacheType = AnthropicCacheType.valueOf(abstractMessage.getCache());
|
441 | 438 | contents = new ArrayList<>(
|
442 | 439 | List.of(new ContentBlock(message.getText(), cacheType.cacheControl())));
|
|
0 commit comments