05-对话机器人-会话历史

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) {};
posted @ 2025-07-23 01:48  DongCha  阅读(245)  评论(0)    收藏  举报