|
1 | 1 | package com.javaaidev.agent;
|
2 | 2 |
|
3 | 3 | import com.javaaidev.chatagent.model.ChatRequest;
|
4 |
| -import com.javaaidev.chatagent.model.ChatResponse; |
5 |
| -import com.javaaidev.chatagent.model.TextContentPart; |
6 |
| -import com.javaaidev.chatagent.model.ThreadAssistantMessage; |
7 |
| -import com.javaaidev.chatagent.model.ThreadUserMessage; |
8 |
| -import java.util.List; |
9 |
| -import java.util.stream.Stream; |
10 | 4 | import org.springframework.ai.chat.client.ChatClient;
|
11 |
| -import org.springframework.ai.chat.messages.AssistantMessage; |
12 | 5 | import org.springframework.ai.chat.messages.Message;
|
13 |
| -import org.springframework.ai.chat.messages.UserMessage; |
| 6 | +import org.springframework.http.codec.ServerSentEvent; |
14 | 7 | import org.springframework.web.bind.annotation.PostMapping;
|
15 | 8 | import org.springframework.web.bind.annotation.RequestBody;
|
16 | 9 | import org.springframework.web.bind.annotation.RequestMapping;
|
17 | 10 | import org.springframework.web.bind.annotation.RestController;
|
| 11 | +import reactor.core.publisher.Flux; |
18 | 12 |
|
19 | 13 | @RestController
|
20 | 14 | @RequestMapping("/chat")
|
21 |
| -public class ChatAgentController { |
| 15 | +public class ChatAgentController extends AbstractChatAgentController { |
22 | 16 |
|
23 |
| - private static final String SYSTEM_TEXT = "You are a chef who is proficient in various cuisines. Please answer users' questions about cooking."; |
24 | 17 | private final ChatClient chatClient;
|
25 | 18 |
|
26 | 19 | public ChatAgentController(ChatClient.Builder builder) {
|
27 | 20 | chatClient = builder.build();
|
28 | 21 | }
|
29 | 22 |
|
30 | 23 | @PostMapping
|
31 |
| - public ChatResponse chat(@RequestBody ChatRequest request) { |
| 24 | + public Flux<ServerSentEvent<String>> chat(@RequestBody ChatRequest request) { |
32 | 25 | if (request == null) {
|
33 |
| - return new ChatResponse(List.of()); |
| 26 | + return Flux.empty(); |
34 | 27 | }
|
35 |
| - var messages = request.messages().stream().flatMap(message -> { |
36 |
| - if (message instanceof ThreadUserMessage userMessage) { |
37 |
| - return userMessage.content().stream().map(part -> { |
38 |
| - if (part instanceof TextContentPart(String text)) { |
39 |
| - return new UserMessage(text); |
40 |
| - } |
41 |
| - return null; |
42 |
| - }); |
43 |
| - } else if (message instanceof ThreadAssistantMessage assistantMessage) { |
44 |
| - return assistantMessage.content().stream().map(part -> { |
45 |
| - if (part instanceof TextContentPart(String text)) { |
46 |
| - return new AssistantMessage(text); |
47 |
| - } |
48 |
| - return null; |
49 |
| - }); |
50 |
| - } |
51 |
| - return Stream.of(); |
52 |
| - }).toList(); |
| 28 | + var messages = chatRequestToMessages(request); |
53 | 29 | var output = chatClient.prompt().system(SYSTEM_TEXT)
|
54 | 30 | .messages(messages.toArray(new Message[0]))
|
55 | 31 | .call()
|
56 | 32 | .content();
|
57 |
| - return new ChatResponse(List.of(new TextContentPart(output))); |
| 33 | + return Flux.just(ServerSentEvent.<String>builder() |
| 34 | + .data("#" + output + "#") |
| 35 | + .build()); |
58 | 36 | }
|
59 | 37 | }
|
0 commit comments