05 对话机器人 会话历史
1. 查询会话历史记录列表
| 查询会话历史记录列表 |
| 请求方式 |
GET |
| 请求路径 |
/ai/chatList |
| 请求参数 |
|
| 返回值 |
[
{ "id": 1, "title": "对话标题1" },
{ "id": 2, "title": "对话标题2" }
]
|
2. 查询会话历史记录详情
| 查询会话历史记录详情 |
| 请求方式 |
GET |
| 请求路径 |
ai/chatDetail?chatId=${chatId} |
| 请求参数 |
chatId:会话id |
| 返回值 |
[
{
"id": 101,
"role": "user",
"content": "你好"
},
{
"id": 102,
"role": "ai",
"content": "你好,有什么可以帮您?"
}
]
|
3. 添加 ChatHistoryRepository 接口
public interface ChatHistoryRepository {
// 保存会话记录
void save(String chatId);
// 查询会话记录
List<String> get();
}
4. 添加 InMemoryChatHistoryRepository 实现类
@Component
public class InMemoryChatHistoryRepository implements ChatHistoryRepository{
private final List<String> chatHistory = new ArrayList<>();
@Override
public void save(String chatId) {
if(!chatHistory.contains(chatId)){
chatHistory.add(chatId);
}
}
@Override
public List<String> get() {
return chatHistory;
}
}
5. 修改 ChatController
// 普通对话(流式)
@RequestMapping(value = "/chatStream", produces = "text/html;charset=utf-8")
public Flux<String> chatStream(String prompt, String chatId) {
// 保存用户id
chatHistoryRepository.save(chatId);
return chatClient.prompt()
.user(prompt)
.advisors(a -> a.param(ChatMemory.CONVERSATION_ID, chatId))
.stream()
.content();
}
// 获取对话列表
@RequestMapping("/chatList")
public List<ChatItem> chatList() {
List<String> list = chatHistoryRepository.get();
List<ChatItem> chatItems = new ArrayList<>();
list.forEach(chat -> {
List<ChatHistory> histories = chatDetail(chat);
ChatItem chatItem = new ChatItem(chat, "对话", histories);
chatItems.add(chatItem);
});
return chatItems;
}
// 获取对话详情
@RequestMapping("/chatDetail")
public List<ChatHistory> chatDetail(@RequestParam String chatId) {
List<Message> messages = chatMemory.get(chatId);
List<ChatHistory> histories = new ArrayList<>();
for (int i = 0; i < messages.size(); i++) {
Message message = messages.get(i);
ChatHistory chatHistory = new ChatHistory(i, message.getMetadata().get("messageType").toString().toLowerCase(Locale.ROOT), message.getText());
histories.add(chatHistory);
}
return histories;
}
record ChatItem(String id, String title, List<ChatHistory> messages) {};
record ChatHistory(int id, String role, String content) {};