humanus.cpp/memory/base.h

62 lines
1.6 KiB
C
Raw Normal View History

2025-03-20 16:03:26 +08:00
#ifndef HUMANUS_MEMORY_BASE_H
#define HUMANUS_MEMORY_BASE_H
#include "schema.h"
namespace humanus {
2025-03-23 14:35:54 +08:00
struct BaseMemory {
2025-03-26 19:28:02 +08:00
std::deque<Message> messages;
2025-03-20 16:03:26 +08:00
// Add a message to the memory
virtual void add_message(const Message& message) {
messages.push_back(message);
}
// Add multiple messages to the memory
void add_messages(const std::vector<Message>& messages) {
for (const auto& message : messages) {
add_message(message);
}
}
// Clear all messages
2025-03-26 19:28:02 +08:00
virtual void clear() {
2025-03-20 16:03:26 +08:00
messages.clear();
}
virtual std::vector<Message> get_messages(const std::string& query = "") const {
2025-03-26 19:28:02 +08:00
std::vector<Message> result;
for (const auto& message : messages) {
result.push_back(message);
}
return result;
2025-03-20 16:03:26 +08:00
}
// Convert messages to list of dicts
json to_json_list() const {
json memory = json::array();
for (const auto& message : messages) {
memory.push_back(message.to_json());
}
return memory;
}
};
2025-03-23 14:35:54 +08:00
struct Memory : BaseMemory {
int max_messages;
2025-03-26 19:28:02 +08:00
Memory(int max_messages = 30) : max_messages(max_messages) {}
2025-03-23 14:35:54 +08:00
void add_message(const Message& message) override {
2025-03-26 19:28:02 +08:00
messages.push_back(message);
while (!messages.empty() && (messages.size() > max_messages || messages.front().role == "assistant" || messages.front().role == "tool")) {
2025-03-23 14:35:54 +08:00
// Ensure the first message is always a user or system message
2025-03-26 19:28:02 +08:00
messages.pop_front();
2025-03-23 14:35:54 +08:00
}
}
};
2025-03-20 16:03:26 +08:00
}
#endif // HUMANUS_MEMORY_BASE_H