import "dotenv/config";
import { MemorySaver } from "@langchain/langgraph";
import { createAgent } from "langchain";
import { HumanMessage } from "@langchain/core/messages";
import { MultiServerMCPClient } from "@langchain/mcp-adapters";
import readline from "readline";
import { agentTools } from "./tools/index.js";
import { agentModel } from "./config/modelConfig.js";
import { mcpServersConfig } from "./config/mcpConfig.js";
const agentCheckpoint = new MemorySaver();
export const createAgentWithMCP = async () => {
try {
const hasMCPServers = Object.keys(mcpServersConfig).length > 0;
let allTools = [...agentTools];
if (hasMCPServers) {
const mcpClient = new MultiServerMCPClient(mcpServersConfig);
const mcpTools = await mcpClient.getTools();
console.log(
"Successfully loaded MCP tools:",
mcpTools.map((tool) => tool.name),
);
allTools = [...agentTools, ...mcpTools];
} else {
console.log("No MCP servers configured, using only local tools");
}
return createAgent({
model: agentModel,
tools: allTools,
checkpointSaver: agentCheckpoint,
});
} catch (error) {
return createAgent({
model: agentModel,
tools: agentTools,
checkpointSaver: agentCheckpoint,
});
}
};
export let agent;
async function runInteractiveTest() {
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
try {
const initializedAgent = await createAgentWithMCP();
console.log('Agent已初始化,开始交互式调试。输入"exit"退出。');
async function handleUserInput() {
rl.question("You: ", async (input) => {
if (input.toLowerCase() === "exit") {
console.log("再见!");
rl.close();
return;
}
try {
const result = await initializedAgent.invoke(
{ messages: [new HumanMessage(input)] },
{ configurable: { thread_id: "test" } },
);
console.log(
"Agent:",
result.messages
);
} catch (error) {
console.log("错误详情:", error);
}
handleUserInput();
});
}
handleUserInput();
} catch (error) {
console.log("错误详情:", error);
rl.close();
}
}
const importUrl = new URL(import.meta.url);
const processPath = new URL(`file://${process.argv[1]}`);
const isDirectRun = importUrl.href === processPath.href;
if (isDirectRun) {
runInteractiveTest();
} else {
createAgentWithMCP()
.then((instance) => {
agent = instance;
})
.catch((error) => {
console.error("Failed to initialize agent with MCP tools:", error);
});
}
async function runSimpleTest() {
const initializedAgent = await createAgentWithMCP();
const result = await initializedAgent.invoke(
{ messages: [new HumanMessage("你好,请介绍一下你自己")] },
{ configurable: { thread_id: "test" } },
);
console.log(result.messages[result.messages.length - 1].content);
}
*/