humanus.cpp/examples/mcp/humanus_mcp.cpp

85 lines
2.4 KiB
C++

#include "agent/mcp.h"
#include "logger.h"
#include "prompt.h"
#include "flow/flow_factory.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) {
// make sure all logs are flushed
logger->info("Interrupted by user\n");
logger->flush();
_exit(130);
}
}
#endif
int main(int argc, char* argv[]) {
// 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
}
if (argc <= 1) {
std::cout << "Usage: " << argv[0] << " <mcp_server1> <mcp_server2>..." << std::endl;
return 0;
}
std::vector<std::string> mcp_servers;
for (int i = 1; i < argc; i++) {
mcp_servers.emplace_back(argv[i]);
}
MCPAgent agent = MCPAgent(
mcp_servers
);
while (true) {
if (agent.current_step == agent.max_steps) {
std::cout << "Automatically paused after " << agent.max_steps << " steps." << std::endl;
std::cout << "Enter your prompt (enter an empty line to resume or 'exit' to quit): ";
agent.reset(false);
} else {
std::cout << "Enter your prompt (or 'exit' to quit): ";
}
std::string prompt;
readline_utf8(prompt, false);
if (prompt == "exit") {
logger->info("Goodbye!");
break;
}
logger->info("Processing your request: " + prompt);
agent.run(prompt);
}
}