UNPKG

dify-sdk

Version:
961 lines 46 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.DifyClient = exports.MIME_MAP = void 0; var tslib_1 = require("tslib"); var text_decoder_1 = tslib_1.__importDefault(require("../utils/text-decoder")); var http = tslib_1.__importStar(require("http")); var https = tslib_1.__importStar(require("https")); var url_1 = require("url"); exports.MIME_MAP = { // 文档类型 document: { mimeTypes: [ 'text/plain', // TXT 'text/markdown', // MD, MDX 'text/html', // HTML 'application/pdf', // PDF 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', // XLSX 'application/vnd.ms-excel', // XLS 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', // DOCX 'application/msword', // DOC 'text/csv', // CSV 'message/rfc822', // EML 'application/vnd.ms-outlook', // MSG 'application/vnd.openxmlformats-officedocument.presentationml.presentation', // PPTX 'application/vnd.ms-powerpoint', // PPT 'application/xml', // XML (通用) 'text/xml', // XML (特定) 'application/epub+zip', // EPUB ], extensions: [ '.txt', '.md', '.mdx', '.html', '.htm', '.pdf', '.xlsx', '.xls', '.docx', '.doc', '.csv', '.eml', '.msg', '.pptx', '.ppt', '.xml', '.epub', ], }, // 图片类型 image: { mimeTypes: [ 'image/jpeg', // JPG, JPEG 'image/png', // PNG 'image/gif', // GIF 'image/webp', // WEBP 'image/svg+xml', // SVG ], extensions: ['.jpg', '.jpeg', '.png', '.gif', '.webp', '.svg'], }, // 音频类型 audio: { mimeTypes: [ 'audio/mpeg', // MP3, MPGA (MPEG Audio Layer III) 'audio/mp4', // M4A 'audio/wav', // WAV 'audio/webm', // WEBM 'audio/amr', // AMR ], extensions: ['.mp3', '.mpga', '.m4a', '.wav', '.webm', '.amr'], }, // 视频类型 video: { mimeTypes: [ 'video/mp4', // MP4 'video/quicktime', // MOV 'video/mpeg', // MPEG 'audio/mpeg', // MPGA (复用音频类型,需注意) ], extensions: ['.mp4', '.mov', '.mpeg', '.mpg', '.mpe'], }, }; function omit(obj, keys) { return new Proxy(obj, { get: function (target, prop) { return keys.includes(prop) ? undefined : target[prop]; }, ownKeys: function (target) { return Object.keys(target).filter(function (key) { return !keys.includes(key); }); }, // 其他trap根据需要实现 }); } /** 检测是否为浏览器环境 */ var isBrowser = typeof window !== 'undefined' && typeof window.XMLHttpRequest !== 'undefined'; /** 支持浏览器/Node 的 HTTP 客户端 */ var DifyClient = /** @class */ (function () { function DifyClient(config) { this.config = tslib_1.__assign({ defaultHeaders: {} }, config); } DifyClient.prototype.getConfig = function () { return this.config; }; /** 获取会话列表 */ DifyClient.prototype.getConversations = function (params) { return tslib_1.__awaiter(this, void 0, void 0, function () { var query, url, response; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: query = new URLSearchParams({ user: params.user }); if (params.last_id) { query.set('last_id', params.last_id); } if (params.limit) { query.set('limit', String(params.limit)); } if (params.sort_by) { query.set('sort_by', params.sort_by); } url = "".concat(this.config.baseUrl, "/v1/conversations?").concat(query); return [4 /*yield*/, fetch(url, { headers: tslib_1.__assign({ Authorization: "Bearer ".concat(this.config.apiKey), Accept: 'application/json' }, this.config.defaultHeaders), method: 'GET', })]; case 1: response = _a.sent(); if (!response.ok) { throw new Error("Request failed: ".concat(response.status, " ").concat(response.statusText)); } return [2 /*return*/, response.json()]; } }); }); }; /** 获取消息列表 */ DifyClient.prototype.getMessages = function (params) { return tslib_1.__awaiter(this, void 0, void 0, function () { var query, url, response; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: query = new URLSearchParams({ conversation_id: params.conversation_id, user: params.user }); if (params.first_id) { query.set('first_id', params.first_id); } if (params.limit) { query.set('limit', String(params.limit)); } url = "".concat(this.config.baseUrl, "/v1/messages?").concat(query); return [4 /*yield*/, fetch(url, { headers: tslib_1.__assign({ Authorization: "Bearer ".concat(this.config.apiKey), Accept: 'application/json' }, this.config.defaultHeaders), method: 'GET', })]; case 1: response = _a.sent(); if (!response.ok) { throw new Error("Request failed: ".concat(response.status, " ").concat(response.statusText)); } return [2 /*return*/, response.json()]; } }); }); }; /** 发送消息 */ DifyClient.prototype.sendMessage = function (params) { var _a; return tslib_1.__awaiter(this, void 0, void 0, function () { var useReader, url, response, reader, chunks, buffer, _b, done, value; return tslib_1.__generator(this, function (_c) { switch (_c.label) { case 0: useReader = (function () { var _a; try { return ((_a = new Response(new ReadableStream()).body) === null || _a === void 0 ? void 0 : _a.getReader()) !== undefined; } catch (_b) { return false; } })(); if (!(!useReader && params.response_mode === 'streaming')) return [3 /*break*/, 2]; return [4 /*yield*/, this.handleStreamWithXHR(params)]; case 1: return [2 /*return*/, _c.sent()]; case 2: url = "".concat(this.config.baseUrl, "/v1/chat-messages"); return [4 /*yield*/, fetch(url, { method: 'POST', headers: tslib_1.__assign({ Authorization: "Bearer ".concat(this.config.apiKey), 'Content-Type': 'application/json' }, this.config.defaultHeaders), body: JSON.stringify(tslib_1.__assign({ inputs: {} }, params)), })]; case 3: response = _c.sent(); if (!response.ok) { throw new Error("Request failed: ".concat(response.status, " ").concat(response.statusText)); } if (!(params.response_mode === 'blocking')) return [3 /*break*/, 4]; return [2 /*return*/, response.json()]; case 4: reader = (_a = response.body) === null || _a === void 0 ? void 0 : _a.getReader(); chunks = []; buffer = ''; if (!reader) return [3 /*break*/, 7]; _c.label = 5; case 5: if (!true) return [3 /*break*/, 7]; return [4 /*yield*/, reader.read()]; case 6: _b = _c.sent(), done = _b.done, value = _b.value; // 将Buffer转换为字符串 if (value !== undefined) { buffer += text_decoder_1.default.decode(value, { stream: true }); } buffer = this.parseAndFlushBuffer({ buffer: buffer, chunks: chunks, params: params }); if (done) { // 最后一次解析(处理可能的残留数据) this.parseAndFlushBuffer({ buffer: buffer, chunks: chunks, params: params }); return [3 /*break*/, 7]; } return [3 /*break*/, 5]; case 7: return [2 /*return*/, chunks]; } }); }); }; DifyClient.prototype.parseAndFlushBuffer = function (options) { var buffer = options.buffer; var chunks = options.chunks; while (true) { var splitMark = '\n\n'; // 分割数据块(根据服务端规范调整分隔符) var chunkEnd = buffer.indexOf(splitMark); // 数据不完整,继续等待 if (chunkEnd === -1) break; var chunkData = buffer.slice(0, chunkEnd + splitMark.length); buffer = buffer.slice(chunkEnd + splitMark.length); // 解析JSON if (chunkData.trim().startsWith('data:')) { try { var chunk = JSON.parse(chunkData.replace(/^data: /, '')); if (typeof options.params.chunkCompletionCallback === 'function') { options.params.chunkCompletionCallback(chunk); } chunks.push(chunk); } catch (parseError) { console.error('Failed to parse chunk:', chunkData); throw new Error("Invalid chunk format: ".concat(chunkData)); } } } return buffer; }; /** * 处理流式响应,兼容浏览器(XMLHttpRequest)和Node.js(http/https)环境 */ DifyClient.prototype.handleStreamWithXHR = function (params) { var _this = this; // 浏览器环境使用XMLHttpRequest if (isBrowser) { return new Promise(function (resolve, reject) { var xhr = new XMLHttpRequest(); var url = "".concat(_this.config.baseUrl, "/v1/chat-messages"); xhr.open('POST', url, true); xhr.setRequestHeader('Authorization', "Bearer ".concat(_this.config.apiKey)); xhr.setRequestHeader('Content-Type', 'application/json'); _this.config.defaultHeaders && Object.keys(_this.config.defaultHeaders).forEach(function (key) { xhr.setRequestHeader(key, _this.config.defaultHeaders[key]); }); var buffer = ''; var chunks = []; var lastProcessedLength = 0; xhr.onprogress = function () { var newData = xhr.responseText.slice(lastProcessedLength); lastProcessedLength = xhr.responseText.length; buffer += newData; // 分割数据块(根据服务端规范调整分隔符) var splitMark = '\n\n'; while (true) { var chunkEnd = buffer.indexOf(splitMark); if (chunkEnd === -1) break; var chunkData = buffer.slice(0, chunkEnd + splitMark.length); buffer = buffer.slice(chunkEnd + splitMark.length); if (chunkData.trim().startsWith('data:')) { try { var chunk = JSON.parse(chunkData.replace(/^data: /, '')); if (typeof params.chunkCompletionCallback === 'function') { params.chunkCompletionCallback(chunk); } chunks.push(chunk); } catch (e) { console.error('Chunk parse error:', chunkData); } } } }; xhr.onloadend = function () { // 请求完成 if (xhr.status >= 400) { reject(new Error("Request failed: ".concat(xhr.statusText))); } else { resolve(chunks); } }; xhr.onerror = function () { reject(new Error('Network error')); }; // 发送请求 xhr.send(JSON.stringify(tslib_1.__assign({ inputs: {} }, params))); }); } // Node.js环境使用http/https模块 else { return new Promise(function (resolve, reject) { var url = new url_1.URL("".concat(_this.config.baseUrl, "/v1/chat-messages")); var protocol = url.protocol === 'https:' ? https : http; var body = JSON.stringify(tslib_1.__assign({ inputs: {} }, params)); var headers = tslib_1.__assign({ Authorization: "Bearer ".concat(_this.config.apiKey), 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(body) }, _this.config.defaultHeaders); var options = { hostname: url.hostname, port: url.port || (url.protocol === 'https:' ? 443 : 80), path: url.pathname + url.search, method: 'POST', headers: headers, }; var buffer = ''; var chunks = []; var req = protocol.request(options, function (res) { // 处理状态码错误 if (res.statusCode && res.statusCode >= 400) { reject(new Error("Request failed: ".concat(res.statusCode, " ").concat(res.statusMessage))); return; } // 处理流式响应 res.on('data', function (chunk) { buffer += chunk.toString(); // 分割数据块 var splitMark = '\n\n'; while (true) { var chunkEnd = buffer.indexOf(splitMark); if (chunkEnd === -1) break; var chunkData = buffer.slice(0, chunkEnd + splitMark.length); buffer = buffer.slice(chunkEnd + splitMark.length); if (chunkData.trim().startsWith('data:')) { try { var parsedChunk = JSON.parse(chunkData.replace(/^data: /, '')); if (typeof params.chunkCompletionCallback === 'function') { params.chunkCompletionCallback(parsedChunk); } chunks.push(parsedChunk); } catch (e) { console.error('Chunk parse error:', chunkData); } } } }); // 响应结束 res.on('end', function () { resolve(chunks); }); }); // 错误处理 req.on('error', function (error) { reject(new Error("Network error: ".concat(error.message))); }); // 发送请求体 req.write(body); req.end(); }); } }; /** * 停止响应 */ DifyClient.prototype.stopMessageResponse = function (params) { return tslib_1.__awaiter(this, void 0, void 0, function () { var url, response; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: url = "".concat(this.config.baseUrl, "/v1/chat-messages/").concat(params.task_id, "/stop"); return [4 /*yield*/, fetch(url, { method: 'POST', headers: tslib_1.__assign({ Authorization: "Bearer ".concat(this.config.apiKey), 'Content-Type': 'application/json' }, this.config.defaultHeaders), body: JSON.stringify({ user: params.user }), })]; case 1: response = _a.sent(); if (!response.ok) { throw new Error("Request failed: ".concat(response.status, " ").concat(response.statusText)); } return [2 /*return*/, response.json()]; } }); }); }; /** * 创建反馈 */ DifyClient.prototype.createMessageFeedback = function (params) { return tslib_1.__awaiter(this, void 0, void 0, function () { var url, response; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: url = "".concat(this.config.baseUrl, "/v1/messages/").concat(params.message_id, "/feedbacks"); return [4 /*yield*/, fetch(url, { method: 'POST', headers: tslib_1.__assign({ Authorization: "Bearer ".concat(this.config.apiKey), 'Content-Type': 'application/json' }, this.config.defaultHeaders), body: JSON.stringify(tslib_1.__assign({}, omit(params, ['message_id']))), })]; case 1: response = _a.sent(); if (!response.ok) { throw new Error("Request failed: ".concat(response.status, " ").concat(response.statusText)); } return [2 /*return*/, response.json()]; } }); }); }; /** * 获取建议问题列表 */ DifyClient.prototype.getMessageSuggests = function (params) { return tslib_1.__awaiter(this, void 0, void 0, function () { var url, response; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: url = "".concat(this.config.baseUrl, "/v1/messages/").concat(params.message_id, "/suggested?user=").concat(encodeURIComponent(params.user)); return [4 /*yield*/, fetch(url, { method: 'GET', headers: tslib_1.__assign({ Authorization: "Bearer ".concat(this.config.apiKey), 'Content-Type': 'application/json' }, this.config.defaultHeaders), })]; case 1: response = _a.sent(); if (!response.ok) { throw new Error("Request failed: ".concat(response.status, " ").concat(response.statusText)); } return [2 /*return*/, response.json()]; } }); }); }; /** * 删除会话 */ DifyClient.prototype.deleteConversation = function (params) { return tslib_1.__awaiter(this, void 0, void 0, function () { var url, response; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: url = "".concat(this.config.baseUrl, "/v1/conversations/").concat(params.conversation_id); return [4 /*yield*/, fetch(url, { method: 'DELETE', headers: tslib_1.__assign({ Authorization: "Bearer ".concat(this.config.apiKey), 'Content-Type': 'application/json' }, this.config.defaultHeaders), body: JSON.stringify({ user: params.user }), })]; case 1: response = _a.sent(); if (!response.ok) { throw new Error("Request failed: ".concat(response.status, " ").concat(response.statusText)); } return [2 /*return*/, response.json()]; } }); }); }; /** * 重命名会话 */ DifyClient.prototype.renameConversation = function (params) { return tslib_1.__awaiter(this, void 0, void 0, function () { var url, response; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: url = "".concat(this.config.baseUrl, "/v1/conversations/").concat(params.conversation_id, "/name"); return [4 /*yield*/, fetch(url, { method: 'POST', headers: tslib_1.__assign({ Authorization: "Bearer ".concat(this.config.apiKey), 'Content-Type': 'application/json' }, this.config.defaultHeaders), body: JSON.stringify({ name: params.name, auto_generate: params.auto_generate, user: params.user }), })]; case 1: response = _a.sent(); if (!response.ok) { throw new Error("Request failed: ".concat(response.status, " ").concat(response.statusText)); } return [2 /*return*/, response.json()]; } }); }); }; /** * 语音转文字 */ DifyClient.prototype.audioToText = function (params) { return tslib_1.__awaiter(this, void 0, void 0, function () { var url, formData, response; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: url = "".concat(this.config.baseUrl, "/v1/audio-to-text"); formData = new FormData(); formData.append('file', params.file); formData.append('user', params.user); return [4 /*yield*/, fetch(url, { method: 'POST', headers: tslib_1.__assign({ Authorization: "Bearer ".concat(this.config.apiKey) }, this.config.defaultHeaders), body: formData, })]; case 1: response = _a.sent(); if (!response.ok) { throw new Error("Request failed: ".concat(response.status, " ").concat(response.statusText)); } return [2 /*return*/, response.json()]; } }); }); }; /** * 文字转语音 */ DifyClient.prototype.textToAudio = function (params) { return tslib_1.__awaiter(this, void 0, void 0, function () { var url, response; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: url = "".concat(this.config.baseUrl, "/v1/text-to-audio"); return [4 /*yield*/, fetch(url, { method: 'POST', headers: tslib_1.__assign({ Authorization: "Bearer ".concat(this.config.apiKey), 'Content-Type': 'application/json' }, this.config.defaultHeaders), body: JSON.stringify(params), })]; case 1: response = _a.sent(); if (!response.ok) { throw new Error("Request failed: ".concat(response.status, " ").concat(response.statusText)); } return [2 /*return*/, response.blob()]; } }); }); }; /** * 获取应用参数 */ DifyClient.prototype.getParameters = function () { return tslib_1.__awaiter(this, void 0, void 0, function () { var url, response; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: url = "".concat(this.config.baseUrl, "/v1/parameters"); return [4 /*yield*/, fetch(url, { method: 'GET', headers: tslib_1.__assign({ Authorization: "Bearer ".concat(this.config.apiKey) }, this.config.defaultHeaders), })]; case 1: response = _a.sent(); if (!response.ok) { throw new Error("Request failed: ".concat(response.status, " ").concat(response.statusText)); } return [2 /*return*/, response.json()]; } }); }); }; /** 获取应用基本信息 */ DifyClient.prototype.getInfo = function () { return tslib_1.__awaiter(this, void 0, void 0, function () { var url, response; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: url = "".concat(this.config.baseUrl, "/v1/info"); return [4 /*yield*/, fetch(url, { method: 'GET', headers: tslib_1.__assign({ Authorization: "Bearer ".concat(this.config.apiKey) }, this.config.defaultHeaders), })]; case 1: response = _a.sent(); if (!response.ok) { throw new Error("Request failed: ".concat(response.status, " ").concat(response.statusText)); } return [2 /*return*/, response.json()]; } }); }); }; /** * 获取应用 Meta 信息 * - 用于获取工具icon */ DifyClient.prototype.getMeta = function () { return tslib_1.__awaiter(this, void 0, void 0, function () { var url, response; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: url = "".concat(this.config.baseUrl, "/v1/meta"); return [4 /*yield*/, fetch(url, { method: 'GET', headers: tslib_1.__assign({ Authorization: "Bearer ".concat(this.config.apiKey) }, this.config.defaultHeaders), })]; case 1: response = _a.sent(); if (!response.ok) { throw new Error("Request failed: ".concat(response.status, " ").concat(response.statusText)); } return [2 /*return*/, response.json()]; } }); }); }; /** * 运行 Workflow */ DifyClient.prototype.runWorkflow = function (params) { return tslib_1.__awaiter(this, void 0, void 0, function () { var url, isStreaming, response; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: url = "".concat(this.config.baseUrl, "/v1/workflows/run"); isStreaming = params.response_mode === 'streaming'; // 处理流式响应 if (isStreaming) { return [2 /*return*/, this.handleWorkflowStream(params, url)]; } return [4 /*yield*/, fetch(url, { method: 'POST', headers: tslib_1.__assign({ Authorization: "Bearer ".concat(this.config.apiKey), 'Content-Type': 'application/json' }, this.config.defaultHeaders), body: JSON.stringify(params), })]; case 1: response = _a.sent(); if (!response.ok) { throw new Error("Workflow failed: ".concat(response.status, " ").concat(response.statusText)); } return [2 /*return*/, response.json()]; } }); }); }; /** * 处理流式响应 */ DifyClient.prototype.handleWorkflowStream = function (params, url) { var _this = this; // 浏览器环境使用XMLHttpRequest if (isBrowser && typeof XMLHttpRequest !== 'undefined') { return new Promise(function (resolve, reject) { var xhr = new XMLHttpRequest(); xhr.open('POST', url, true); // 设置请求头 xhr.setRequestHeader('Authorization', "Bearer ".concat(_this.config.apiKey)); xhr.setRequestHeader('Content-Type', 'application/json'); if (_this.config.defaultHeaders) { Object.keys(_this.config.defaultHeaders).forEach(function (key) { xhr.setRequestHeader(key, _this.config.defaultHeaders[key]); }); } var buffer = ''; var chunks = []; var lastProcessedLength = 0; // 流式数据处理 xhr.onprogress = function () { var newData = xhr.responseText.slice(lastProcessedLength); lastProcessedLength = xhr.responseText.length; buffer += newData; // 事件分割处理(根据服务端规范使用 \n\n 分隔符) while (buffer.includes('\n\n')) { var chunkEnd = buffer.indexOf('\n\n'); var chunkStr = buffer.slice(0, chunkEnd); buffer = buffer.slice(chunkEnd + 2); if (chunkStr.startsWith('data:')) { try { var chunkData = JSON.parse(chunkStr.replace(/^data: /, '').trim()); chunks.push(chunkData); } catch (e) { console.error('Failed to parse workflow chunk:', chunkStr); } } } }; // 请求完成处理 xhr.onloadend = function () { if (xhr.status >= 400) { reject(new Error("Workflow failed: ".concat(xhr.status, " ").concat(xhr.statusText))); } else { resolve(chunks); } }; // 错误处理 xhr.onerror = function () { reject(new Error('Network error')); }; // 发送请求 xhr.send(JSON.stringify(params)); }); } // Node.js环境使用http/https模块 else { return new Promise(function (resolve, reject) { var requestUrl = new url_1.URL(url); var protocol = requestUrl.protocol === 'https:' ? https : http; var body = JSON.stringify(params); var headers = tslib_1.__assign({ Authorization: "Bearer ".concat(_this.config.apiKey), 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(body) }, _this.config.defaultHeaders); var options = { hostname: requestUrl.hostname, port: requestUrl.port || (requestUrl.protocol === 'https:' ? 443 : 80), path: requestUrl.pathname + requestUrl.search, method: 'POST', headers: headers, }; var buffer = ''; var chunks = []; var req = protocol.request(options, function (res) { if (res.statusCode && res.statusCode >= 400) { reject(new Error("Workflow failed: ".concat(res.statusCode, " ").concat(res.statusMessage))); return; } res.on('data', function (chunk) { buffer += chunk.toString(); while (buffer.includes('\n\n')) { var chunkEnd = buffer.indexOf('\n\n'); var chunkStr = buffer.slice(0, chunkEnd); buffer = buffer.slice(chunkEnd + 2); if (chunkStr.startsWith('data:')) { try { var chunkData = JSON.parse(chunkStr.replace(/^data: /, '').trim()); chunks.push(chunkData); } catch (e) { console.error('Failed to parse workflow chunk:', chunkStr); } } } }); res.on('end', function () { resolve(chunks); }); }); req.on('error', function (error) { reject(new Error("Network error: ".concat(error.message))); }); req.write(body); req.end(); }); } }; /** * 获取 Workflow 执行结果 */ DifyClient.prototype.getWorkflow = function (params) { return tslib_1.__awaiter(this, void 0, void 0, function () { var url, response; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: url = "".concat(this.config.baseUrl, "/v1/workflows/run/").concat(params.workflow_id); return [4 /*yield*/, fetch(url, { method: 'GET', headers: tslib_1.__assign({ Authorization: "Bearer ".concat(this.config.apiKey), 'Content-Type': 'application/json' }, this.config.defaultHeaders), })]; case 1: response = _a.sent(); if (!response.ok) { throw new Error("Request failed: ".concat(response.status, " ").concat(response.statusText)); } return [2 /*return*/, response.json()]; } }); }); }; /** * 停止 Workflow 任务 */ DifyClient.prototype.stopWorkflowTask = function (params) { return tslib_1.__awaiter(this, void 0, void 0, function () { var url, response; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: url = "".concat(this.config.baseUrl, "/v1/workflows/tasks/").concat(params.task_id, "/stop"); return [4 /*yield*/, fetch(url, { method: 'POST', headers: tslib_1.__assign({ Authorization: "Bearer ".concat(this.config.apiKey), 'Content-Type': 'application/json' }, this.config.defaultHeaders), body: JSON.stringify({ user: params.user }), })]; case 1: response = _a.sent(); if (!response.ok) { throw new Error("Request failed: ".concat(response.status, " ").concat(response.statusText)); } return [2 /*return*/, response.json()]; } }); }); }; /** * 获取 Workflow 日志 */ DifyClient.prototype.getWorkflowLogs = function (params) { return tslib_1.__awaiter(this, void 0, void 0, function () { var url, response; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: url = "".concat(this.config.baseUrl, "/v1/workflows/logs?keyword=").concat(params.keyword || '', "&status=").concat(params.status || '', "&page=").concat(params.page || 1, "&limit=").concat(params.limit || 20); return [4 /*yield*/, fetch(url, { method: 'GET', headers: tslib_1.__assign({ Authorization: "Bearer ".concat(this.config.apiKey), 'Content-Type': 'application/json' }, this.config.defaultHeaders), })]; case 1: response = _a.sent(); if (!response.ok) { throw new Error("Request failed: ".concat(response.status, " ").concat(response.statusText)); } return [2 /*return*/, response.json()]; } }); }); }; /** 上传文件 */ DifyClient.prototype.uploadFile = function (params) { return tslib_1.__awaiter(this, void 0, void 0, function () { var url, formData, response; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: url = "".concat(this.config.baseUrl, "/v1/files/upload"); formData = new FormData(); formData.append('file', params.file); formData.append('user', params.user); return [4 /*yield*/, fetch(url, { method: 'POST', headers: tslib_1.__assign({ Authorization: "Bearer ".concat(this.config.apiKey) }, this.config.defaultHeaders), body: formData, })]; case 1: response = _a.sent(); if (!response.ok) { throw new Error("Request failed: ".concat(response.status, " ").concat(response.statusText)); } return [2 /*return*/, response.json()]; } }); }); }; /** 发送文本生成消息 */ DifyClient.prototype.sendCompletionMessage = function (params) { var _a; return tslib_1.__awaiter(this, void 0, void 0, function () { var url, body, response, response, reader, chunks_1, buffer_1, processBuffer, _b, done, value; return tslib_1.__generator(this, function (_c) { switch (_c.label) { case 0: url = "".concat(this.config.baseUrl, "/v1/completion-messages"); body = { inputs: params.inputs || {}, response_mode: params.response_mode, user: params.user, files: params.files, }; if (!(params.response_mode === 'blocking')) return [3 /*break*/, 2]; return [4 /*yield*/, fetch(url, { method: 'POST', headers: tslib_1.__assign({ Authorization: "Bearer ".concat(this.config.apiKey), 'Content-Type': 'application/json' }, this.config.defaultHeaders), body: JSON.stringify(body), })]; case 1: response = _c.sent(); return [2 /*return*/, response.json()]; case 2: return [4 /*yield*/, fetch(url, { method: 'POST', headers: tslib_1.__assign({ Authorization: "Bearer ".concat(this.config.apiKey), 'Content-Type': 'application/json' }, this.config.defaultHeaders), body: JSON.stringify(body), })]; case 3: response = _c.sent(); reader = (_a = response.body) === null || _a === void 0 ? void 0 : _a.getReader(); chunks_1 = []; buffer_1 = ''; processBuffer = function () { var _a; while (true) { var terminatorIdx = buffer_1.indexOf('\n\n'); if (terminatorIdx === -1) break; var chunkStr = buffer_1.slice(0, terminatorIdx); buffer_1 = buffer_1.slice(terminatorIdx + 2); if (chunkStr.startsWith('data:')) { try { var chunk = JSON.parse(chunkStr.replace('data: ', '')); chunks_1.push(chunk); (_a = params.chunkCompletionCallback) === null || _a === void 0 ? void 0 : _a.call(params, chunk); } catch (e) { console.error('Chunk parse error:', chunkStr); } } } }; if (!reader) return [3 /*break*/, 6]; _c.label = 4; case 4: if (!true) return [3 /*break*/, 6]; return [4 /*yield*/, reader.read()]; case 5: _b = _c.sent(), done = _b.done, value = _b.value; if (done) { processBuffer(); // 处理剩余数据 return [3 /*break*/, 6]; } buffer_1 += text_decoder_1.default.decode(value); processBuffer(); return [3 /*break*/, 4]; case 6: return [2 /*return*/, chunks_1]; } }); }); }; /** 停止文本生成流式响应 */ DifyClient.prototype.stopCompletionMessage = function (params) { return tslib_1.__awaiter(this, void 0, void 0, function () { var url, response; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: url = "".concat(this.config.baseUrl, "/v1/completion-messages/").concat(params.task_id, "/stop"); return [4 /*yield*/, fetch(url, { method: 'POST', headers: tslib_1.__assign({ Authorization: "Bearer ".concat(this.config.apiKey), 'Content-Type': 'application/json' }, this.config.defaultHeaders), body: JSON.stringify({ user: params.user }), })]; case 1: response = _a.sent(); return [2 /*return*/, response.json()]; } }); }); }; return DifyClient; }()); exports.DifyClient = DifyClient; //# sourceMappingURL=dify.client.js.map