UNPKG

@voyager-0x/agent-mcp

Version:

Voyager MCP Agent - A powerful Model Context Protocol agent

112 lines (111 loc) 3.7 kB
"use strict"; 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;