import {
EventType,
W,
from
} from "./chunk-IILPD2DB.js";
import "./chunk-A6PGQRKG.js";
import {
__publicField
} from "./chunk-EWTE5DHJ.js";
// node_modules/@shangzy/ag-ui-dify/dist/index.mjs
function difyMessagesToAgui(messages) {
return messages.map((msg) => ({
role: msg.role,
content: msg.content
}));
}
function aguiMessagesToDify(messages) {
return messages.map((msg) => ({
role: msg.role,
content: msg.content
}));
}
var DifyClient = class {
constructor(config) {
__publicField(this, "apiKey");
__publicField(this, "baseUrl");
this.apiKey = config.apiKey || "";
this.baseUrl = config.baseUrl || "";
}
async *streamChat(params) {
var _a;
const url = `${this.baseUrl}/chat-messages`;
const lastUserMessage = [...params.messages].reverse().find((msg) => msg.role === "user");
let body = {};
try {
body = JSON.parse(lastUserMessage == null ? void 0 : lastUserMessage.content);
} catch (error) {
body = {
inputs: {},
query: (lastUserMessage == null ? void 0 : lastUserMessage.content) || "",
response_mode: "streaming",
auto_generate_name: "true",
conversation_id: "",
// 如果需要保持对话上下文,这里需要传入
user: "ag-ui"
// 可以自定义用户标识
};
}
if (typeof body !== "object") {
body = {
inputs: {},
query: (lastUserMessage == null ? void 0 : lastUserMessage.content) || "",
response_mode: "streaming",
auto_generate_name: "true",
conversation_id: "",
// 如果需要保持对话上下文,这里需要传入
user: "ag-ui"
// 可以自定义用户标识
};
}
const response = await fetch(url, {
method: "POST",
headers: {
"Content-Type": "application/json",
"Authorization": `Bearer ${body.appKey || this.apiKey}`
},
body: JSON.stringify(
Object.assign(body, {
response_mode: "streaming",
auto_generate_name: "true"
})
)
});
if (!response.ok) {
console.error("Dify API 错误响应:", {
status: response.status,
statusText: response.statusText,
url: response.url
});
throw new Error(`Dify API error: ${response.statusText}`);
}
const reader = (_a = response.body) == null ? void 0 : _a.getReader();
if (!reader) {
throw new Error("Failed to get response reader");
}
const decoder = new TextDecoder();
let buffer = "";
while (true) {
const { done, value } = await reader.read();
if (done) break;
buffer += decoder.decode(value, { stream: true });
const lines = buffer.split("\n");
buffer = lines.pop() || "";
for (const line of lines) {
if (line.trim() === "") continue;
if (!line.startsWith("data: ")) continue;
try {
const data = JSON.parse(line.slice(6));
yield data;
} catch (e) {
console.error("Failed to parse Dify stream data:", e);
}
}
}
}
};
var DifyAgent = class extends W {
constructor(config) {
super();
__publicField(this, "difyClient");
__publicField(this, "showMetadata");
__publicField(this, "showAgentLog");
this.showMetadata = config.showMetadata || false;
this.showAgentLog = config.showAgentLog || false;
this.difyClient = new DifyClient(config);
}
run(input) {
return from(this.stream(input));
}
async *stream(input) {
var _a, _b, _c;
const difyMessages = aguiMessagesToDify(input.messages);
const difyTools = (_a = input.tools) == null ? void 0 : _a.map((tool) => ({
name: tool.name,
description: tool.description,
parameters: tool.parameters
}));
const difyStream = await this.difyClient.streamChat({
messages: difyMessages,
tools: difyTools
});
yield {
type: EventType.RUN_STARTED,
timestamp: (/* @__PURE__ */ new Date()).getTime(),
threadId: input.threadId,
runId: input.runId
};
let conversationId = "";
let message = true;
let logContent = "";
let roundCount = 1;
let isMessageStart = false;
for await (const chunk of difyStream) {
switch (chunk.event) {
case "agent_message":
// 文本消息
case "message":
if (!conversationId) {
conversationId = `${chunk.conversation_id}_${chunk.message_id}`;
if (!isMessageStart) {
yield {
type: EventType.TEXT_MESSAGE_START,
messageId: conversationId,
role: "assistant",
timestamp: (/* @__PURE__ */ new Date()).getTime()
};
isMessageStart = true;
}
}
if (chunk.answer) {
yield {
type: EventType.TEXT_MESSAGE_CONTENT,
messageId: conversationId,
delta: chunk.answer,
timestamp: (/* @__PURE__ */ new Date()).getTime()
};
}
break;
case "agent_log":
if (!this.showAgentLog) break;
if (!((_b = chunk.data) == null ? void 0 : _b.data)) break;
if (!conversationId) {
conversationId = `${chunk.conversation_id}_${chunk.message_id}`;
if (!isMessageStart) {
yield {
type: EventType.TEXT_MESSAGE_START,
messageId: conversationId,
role: "assistant",
timestamp: (/* @__PURE__ */ new Date()).getTime()
};
isMessageStart = true;
}
}
try {
const logData = chunk.data.data || {};
const label = chunk.data.label;
const status = chunk.data.status;
if (label.includes("Thought") && status === "success" && logData.action) {
let thoughtContent = logData.thought || "";
if (thoughtContent.startsWith("") && thoughtContent.endsWith("") && thoughtContent.slice(7, -8).includes("")) {
thoughtContent = thoughtContent.replace(/<\/think>\s*。\s*<\/think>/g, "");
thoughtContent = thoughtContent.slice(7, -8).trim();
}
if (thoughtContent) {
yield {
type: EventType.TEXT_MESSAGE_CONTENT,
messageId: conversationId,
delta: `
**AI思考过程:**
${thoughtContent}
`,
timestamp: (/* @__PURE__ */ new Date()).getTime()
};
}
} else if (label.includes("CALL") && status === "success" && logData.output) {
if ((_c = logData.tool_call_args) == null ? void 0 : _c.code) {
const language = logData.tool_call_args.language || "python";
logContent = `
\`\`\`${language}
${logData.tool_call_args.code.trim()}
\`\`\`
`;
}
try {
const output = JSON.parse(logData.output);
if (output.run_result) {
if (output.run_result.execution_time) {
logContent += `> 耗时:${output.run_result.execution_time.toFixed(2)}s
`;
}
if (output.run_result.stdout) {
logContent += `
输出:
\`\`\`plaintext
${output.run_result.stdout.trim()}
\`\`\`
`;
}
if (output.run_result.stderr) {
logContent += `
❌ 错误:
\`\`\`error
${output.run_result.stderr.trim()}
\`\`\`
`;
}
}
yield {
type: EventType.TEXT_MESSAGE_CONTENT,
messageId: conversationId,
delta: logContent,
timestamp: (/* @__PURE__ */ new Date()).getTime()
};
} catch (error) {
yield {
type: EventType.TEXT_MESSAGE_CONTENT,
messageId: conversationId,
delta: `
❌ **解析失败:** ${error.message}
`,
timestamp: (/* @__PURE__ */ new Date()).getTime()
};
}
} else if (label.includes("ROUND") && status === "start") {
yield {
type: EventType.TEXT_MESSAGE_CONTENT,
messageId: conversationId,
delta: `
### 第 ${roundCount} 轮思考
`,
timestamp: (/* @__PURE__ */ new Date()).getTime()
};
roundCount += 1;
} else if (label.includes("ROUND") && status === "success") {
yield {
type: EventType.TEXT_MESSAGE_CONTENT,
messageId: conversationId,
delta: `
`,
timestamp: (/* @__PURE__ */ new Date()).getTime()
};
}
} catch (error) {
console.error("处理Agent日志失败:", error);
yield {
type: EventType.TEXT_MESSAGE_CONTENT,
messageId: conversationId,
delta: `
❌ 处理执行日志失败: ${error.message}
`,
timestamp: (/* @__PURE__ */ new Date()).getTime()
};
}
break;
case "workflow_finished":
if (isMessageStart) {
message = false;
yield {
type: EventType.TEXT_MESSAGE_END,
messageId: conversationId,
timestamp: (/* @__PURE__ */ new Date()).getTime()
};
}
break;
case "message_end":
if (this.showMetadata) {
yield {
type: EventType.STATE_SNAPSHOT,
timestamp: (/* @__PURE__ */ new Date()).getTime(),
snapshot: {
name: "on_metadata",
metadata: chunk.metadata
}
};
}
if (message) {
if (isMessageStart) {
yield {
type: EventType.TEXT_MESSAGE_END,
messageId: conversationId,
timestamp: (/* @__PURE__ */ new Date()).getTime()
};
}
}
yield {
type: EventType.RUN_FINISHED,
timestamp: (/* @__PURE__ */ new Date()).getTime(),
threadId: input.threadId,
runId: input.runId
};
break;
}
}
}
};
export {
DifyAgent,
aguiMessagesToDify,
difyMessagesToAgui
};
//# sourceMappingURL=@shangzy_ag-ui-dify.js.map