@voyager-0x/agent-mcp
Version:
Voyager MCP Agent - A powerful Model Context Protocol agent
112 lines (111 loc) • 3.7 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.ChatManager = exports.AIChat = exports.AbortError = void 0;
const openai_1 = __importDefault(require("openai"));
const log_js_1 = require("./log.js");
const prompt_js_1 = require("./prompt.js");
const config_js_1 = require("./config.js");
class AbortError extends Error {
constructor(message) {
super(message);
this.name = "AbortError";
}
}
exports.AbortError = AbortError;
class AIChat {
addMessage(messageItem) {
log_js_1.log.info("对话:", messageItem);
this.messages.push(messageItem);
}
getMessages() {
return this.messages;
}
constructor(systemPrompt, session) {
this.messages = [];
this.session = session;
this.addMessage({
role: "system",
content: systemPrompt,
});
}
/**
* 流式对话,逐步推送内容
* @param usermessage 用户输入
* @returns 最终完整回复
*/
async chat(usermessage) {
// 创建新的 AbortController
const abortController = new AbortController();
const _cancel = () => {
abortController.abort();
};
const _chat = async (usermessage) => {
this.addMessage({
role: "user",
content: usermessage,
});
const config = config_js_1.aiConfigManager.getConfig();
const chatClient = new openai_1.default({
apiKey: config.apiKey,
baseURL: config.baseURL,
// 在浏览器环境时允许调用
...((typeof globalThis !== 'undefined' && 'window' in globalThis)
? { dangerouslyAllowBrowser: true }
: {}),
});
let reply = "";
// 向大模型进行流式问答
const stream = await chatClient.chat.completions.create({
model: config.model,
messages: this.messages,
stream: true,
}, {
signal: abortController.signal,
});
for await (const chunk of stream) {
// 检查中止信号
if (abortController.signal.aborted) {
throw new AbortError();
}
const delta = chunk.choices?.[0]?.delta?.content || "";
if (delta) {
reply += delta;
this.session.emit("reply", delta);
}
}
this.addMessage({ role: "assistant", content: reply });
return reply;
};
try {
this.session.on("cancel", _cancel);
const reply = await _chat(usermessage);
return reply;
}
finally {
this.session.off("cancel", _cancel);
}
}
}
exports.AIChat = AIChat;
class ChatManager {
constructor({ session }) {
this.session = session;
this.prompt = new prompt_js_1.Prompt();
}
createChat(system_propmt) {
const chatClient = new AIChat(system_propmt, this.session);
return chatClient;
}
async createMcpChat() {
const system_propmt = await this.prompt.buildMcpPrompt();
return this.createChat(system_propmt);
}
async createFixJsonChat() {
const system_propmt = await this.prompt.buildFixJsonPrompt();
return this.createChat(system_propmt);
}
}
exports.ChatManager = ChatManager;