humanus.cpp/examples/chat_mem0/chat_mem0.cpp

115 lines
3.3 KiB
C++
Raw Normal View History

2025-03-26 19:28:02 +08:00
#include "agent/chatbot.h"
#include "logger.h"
#include "prompt.h"
#include "flow/flow_factory.h"
#include "memory/mem0/base.h"
#if defined (__unix__) || (defined (__APPLE__) && defined (__MACH__))
#include <signal.h>
#include <unistd.h>
#elif defined (_WIN32)
#define WIN32_LEAN_AND_MEAN
#ifndef NOMINMAX
#define NOMINMAX
#endif
#include <windows.h>
#include <signal.h>
#endif
using namespace humanus;
#if defined (__unix__) || (defined (__APPLE__) && defined (__MACH__)) || defined (_WIN32)
static void sigint_handler(int signo) {
if (signo == SIGINT) {
logger->info("Interrupted by user\n");
exit(0);
}
}
#endif
static bool readline_utf8(std::string & line, bool multiline_input) {
#if defined(_WIN32)
std::wstring wline;
if (!std::getline(std::wcin, wline)) {
// Input stream is bad or EOF received
line.clear();
GenerateConsoleCtrlEvent(CTRL_C_EVENT, 0);
return false;
}
int size_needed = WideCharToMultiByte(CP_UTF8, 0, &wline[0], (int)wline.size(), NULL, 0, NULL, NULL);
line.resize(size_needed);
WideCharToMultiByte(CP_UTF8, 0, &wline[0], (int)wline.size(), &line[0], size_needed, NULL, NULL);
#else
if (!std::getline(std::cin, line)) {
// Input stream is bad or EOF received
line.clear();
return false;
}
#endif
if (!line.empty()) {
char last = line.back();
if (last == '/') { // Always return control on '/' symbol
line.pop_back();
return false;
}
if (last == '\\') { // '\\' changes the default action
line.pop_back();
multiline_input = !multiline_input;
}
}
line += '\n';
// By default, continue input if multiline_input is set
return multiline_input;
}
int main() {
// ctrl+C handling
{
#if defined (__unix__) || (defined (__APPLE__) && defined (__MACH__))
struct sigaction sigint_action;
sigint_action.sa_handler = sigint_handler;
sigemptyset (&sigint_action.sa_mask);
sigint_action.sa_flags = 0;
sigaction(SIGINT, &sigint_action, NULL);
#elif defined (_WIN32)
auto console_ctrl_handler = +[](DWORD ctrl_type) -> BOOL {
return (ctrl_type == CTRL_C_EVENT) ? (sigint_handler(SIGINT), true) : false;
};
SetConsoleCtrlHandler(reinterpret_cast<PHANDLER_ROUTINE>(console_ctrl_handler), true);
SetConsoleCP(CP_UTF8);
SetConsoleOutputCP(CP_UTF8);
_setmode(_fileno(stdin), _O_WTEXT); // wide character input mode
#endif
}
auto memory_config = mem0::MemoryConfig();
memory_config.max_messages = 1;
memory_config.retrieval_limit = 10;
auto memory = std::make_shared<mem0::Memory>(memory_config);
memory->current_request = "Chat with the user";
Chatbot chatbot{
"chat_mem0", // name
"A chatbot agent that uses memory to remember conversation history", // description
"You are a helpful assistant.", // system_prompt
nullptr, // llm
memory // memory
};
while (true) {
std::cout << "> ";
std::string prompt;
readline_utf8(prompt, false);
if (prompt == "exit" || prompt == "exit\n") {
logger->info("Goodbye!");
break;
}
auto response = chatbot.run(prompt);
std::cout << response << std::endl;
}
}