@cloudbase/agent-adapter-adp 0.0.13 → 0.0.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -30,7 +30,10 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
30
30
  // src/index.ts
31
31
  var index_exports = {};
32
32
  __export(index_exports, {
33
- AdpAgent: () => AdpAgent
33
+ AdpAgent: () => AdpAgent,
34
+ AdpAgentError: () => AdpAgentError,
35
+ CurrentNodeStatus: () => CurrentNodeStatus,
36
+ ReplyMethod: () => ReplyMethod
34
37
  });
35
38
  module.exports = __toCommonJS(index_exports);
36
39
 
@@ -71,26 +74,85 @@ var MIME_TYPES = {
71
74
  "application/vnd.openxmlformats-officedocument.presentationml.presentation": "pptx"
72
75
  };
73
76
 
77
+ // src/types.ts
78
+ var ReplyMethod = /* @__PURE__ */ ((ReplyMethod2) => {
79
+ ReplyMethod2[ReplyMethod2["LLM_REPLY"] = 1] = "LLM_REPLY";
80
+ ReplyMethod2[ReplyMethod2["UNKNOWN_QUESTION_REPLY"] = 2] = "UNKNOWN_QUESTION_REPLY";
81
+ ReplyMethod2[ReplyMethod2["REJECT_QUESTION_REPLY"] = 3] = "REJECT_QUESTION_REPLY";
82
+ ReplyMethod2[ReplyMethod2["SENSITIVE_REPLY"] = 4] = "SENSITIVE_REPLY";
83
+ ReplyMethod2[ReplyMethod2["ADOPTED_QA_PRIORITY_REPLY"] = 5] = "ADOPTED_QA_PRIORITY_REPLY";
84
+ ReplyMethod2[ReplyMethod2["WELCOME_REPLY"] = 6] = "WELCOME_REPLY";
85
+ ReplyMethod2[ReplyMethod2["CONCURRENCY_LIMIT_REPLY"] = 7] = "CONCURRENCY_LIMIT_REPLY";
86
+ ReplyMethod2[ReplyMethod2["GLOBAL_INTERVENTION_KNOWLEDGE"] = 8] = "GLOBAL_INTERVENTION_KNOWLEDGE";
87
+ ReplyMethod2[ReplyMethod2["TASK_FLOW_REPLY"] = 9] = "TASK_FLOW_REPLY";
88
+ ReplyMethod2[ReplyMethod2["TASK_FLOW_ANSWER"] = 10] = "TASK_FLOW_ANSWER";
89
+ ReplyMethod2[ReplyMethod2["SEARCH_ENGINE_REPLY"] = 11] = "SEARCH_ENGINE_REPLY";
90
+ ReplyMethod2[ReplyMethod2["KNOWLEDGE_POLISHED_REPLY"] = 12] = "KNOWLEDGE_POLISHED_REPLY";
91
+ ReplyMethod2[ReplyMethod2["IMAGE_UNDERSTANDING_REPLY"] = 13] = "IMAGE_UNDERSTANDING_REPLY";
92
+ ReplyMethod2[ReplyMethod2["REALTIME_DOCUMENT_REPLY"] = 14] = "REALTIME_DOCUMENT_REPLY";
93
+ ReplyMethod2[ReplyMethod2["CLARIFICATION_CONFIRMATION_REPLY"] = 15] = "CLARIFICATION_CONFIRMATION_REPLY";
94
+ ReplyMethod2[ReplyMethod2["WORKFLOW_REPLY"] = 16] = "WORKFLOW_REPLY";
95
+ ReplyMethod2[ReplyMethod2["WORKFLOW_EXECUTION_END"] = 17] = "WORKFLOW_EXECUTION_END";
96
+ ReplyMethod2[ReplyMethod2["AGENT_REPLY"] = 18] = "AGENT_REPLY";
97
+ ReplyMethod2[ReplyMethod2["MULTI_INTENT_REPLY"] = 19] = "MULTI_INTENT_REPLY";
98
+ return ReplyMethod2;
99
+ })(ReplyMethod || {});
100
+ var CurrentNodeStatus = /* @__PURE__ */ ((CurrentNodeStatus2) => {
101
+ CurrentNodeStatus2[CurrentNodeStatus2["Pending"] = 0] = "Pending";
102
+ CurrentNodeStatus2[CurrentNodeStatus2["Running"] = 1] = "Running";
103
+ CurrentNodeStatus2[CurrentNodeStatus2["Succeeded"] = 2] = "Succeeded";
104
+ CurrentNodeStatus2[CurrentNodeStatus2["Failed"] = 3] = "Failed";
105
+ return CurrentNodeStatus2;
106
+ })(CurrentNodeStatus || {});
107
+
74
108
  // src/agent.ts
75
109
  var import_crypto = require("crypto");
76
110
  var import_tencentcloud_sdk_nodejs_lke = require("tencentcloud-sdk-nodejs-lke");
111
+ var AdpAgentError = class extends Error {
112
+ constructor(message, code) {
113
+ super(message);
114
+ this.name = "AdpAgentError";
115
+ if (code) this.code = code;
116
+ }
117
+ };
77
118
  var AdpAgent = class extends import_client.AbstractAgent {
78
119
  constructor(config) {
79
120
  super(config);
80
121
  this.adpConfig = config.adpConfig;
81
122
  this.reqAppClient = import_axios.default.create({
82
- baseURL: "https://wss.lke.cloud.tencent.com"
123
+ baseURL: this.adpConfig.request?.baseUrl || "https://wss.lke.cloud.tencent.com"
83
124
  });
84
125
  const LkeClient = import_tencentcloud_sdk_nodejs_lke.lke.v20231130.Client;
85
- const credential = this.adpConfig.credential;
86
126
  this.reqLkeClient = new LkeClient({
87
- credential: credential ? credential : {
88
- secretId: credential?.secretId || process.env.TENCENTCLOUD_SECRETID,
89
- secretKey: credential?.secretKey || process.env.TENCENTCLOUD_SECRETKEY,
90
- token: credential?.token || process.env.TENCENTCLOUD_SESSIONTOKEN
127
+ credential: {
128
+ secretId: this.adpConfig.credential?.secretId || process.env.TENCENTCLOUD_SECRETID,
129
+ secretKey: this.adpConfig.credential?.secretKey || process.env.TENCENTCLOUD_SECRETKEY,
130
+ token: this.adpConfig.credential?.token || process.env.TENCENTCLOUD_SESSIONTOKEN
91
131
  }
92
132
  });
93
133
  }
134
+ generateRequestBody({
135
+ message,
136
+ fileInfos,
137
+ runId,
138
+ threadId,
139
+ forwardedProps
140
+ }) {
141
+ const requestBody = {
142
+ incremental: true,
143
+ stream: "enable",
144
+ ...this.adpConfig.request?.body || {},
145
+ ...forwardedProps || {},
146
+ botAppKey: this.adpConfig.appKey || this.adpConfig.request?.body?.botAppKey || process.env.ADP_APP_KEY,
147
+ visitorBizId: forwardedProps?.visitorBizId || (0, import_crypto.randomUUID)(),
148
+ requestId: runId,
149
+ sessionId: threadId || (0, import_crypto.randomUUID)(),
150
+ content: message,
151
+ fileInfos
152
+ };
153
+ return requestBody;
154
+ }
155
+ // @ts-ignore
94
156
  run(input) {
95
157
  return new import_rxjs.Observable((subscriber) => {
96
158
  this._run(subscriber, input);
@@ -105,14 +167,18 @@ var AdpAgent = class extends import_client.AbstractAgent {
105
167
  threadId
106
168
  });
107
169
  if (!this.adpConfig.appKey && !process.env.ADP_APP_KEY) {
108
- throw new Error(
109
- "ADP app key is required, check your env variables or config passed with the adapter"
170
+ throw new AdpAgentError(
171
+ "ADP app key is required, check your env variables or config passed with the adapter",
172
+ "MISSING_APP_KEY"
110
173
  );
111
174
  }
112
175
  const { messages: docExtractedMessages, fileInfos } = await extractDocuments(messages, this.adpConfig, this.reqLkeClient);
113
176
  const { message, trimmed } = convertAGUIMessagesToAdpMessages(docExtractedMessages);
114
177
  if (!message) {
115
- throw new Error("Message content format error, or empty content");
178
+ throw new AdpAgentError(
179
+ "Message content format error, or empty content",
180
+ "INVALID_MESSAGE_CONTENT"
181
+ );
116
182
  }
117
183
  if (trimmed > 0) {
118
184
  subscriber.next({
@@ -123,20 +189,15 @@ var AdpAgent = class extends import_client.AbstractAgent {
123
189
  }
124
190
  });
125
191
  }
126
- const requestBody = {
127
- requestId: runId,
128
- content: message,
192
+ const requestBody = this.generateRequestBody({
193
+ message,
129
194
  fileInfos,
130
- botAppKey: this.adpConfig.appKey || process.env.ADP_APP_KEY,
131
- sessionId: threadId,
132
- visitorBizId: forwardedProps?.userId || (0, import_crypto.randomUUID)(),
133
- incremental: true,
134
- stream: "enable",
135
- customVariables: forwardedProps?.customVariables || {},
136
- ...this.adpConfig.request
137
- };
195
+ runId,
196
+ threadId,
197
+ forwardedProps
198
+ });
138
199
  const response = await this.reqAppClient.post(
139
- "/v1/qbot/chat/sse",
200
+ this.adpConfig.request?.endpoint || "/v1/qbot/chat/sse",
140
201
  camelToSnakeKeys(requestBody),
141
202
  { responseType: "stream" }
142
203
  );
@@ -164,13 +225,19 @@ var AdpAgent = class extends import_client.AbstractAgent {
164
225
  try {
165
226
  data = JSON.parse(event.data);
166
227
  } catch (e) {
167
- throw new Error(`ADP returned invalid data: ${event.data}`);
228
+ throw new AdpAgentError(
229
+ `ADP returned invalid data: ${event.data}`,
230
+ "INVALID_DATA"
231
+ );
168
232
  }
169
233
  switch (data.type) {
170
234
  case "reply": {
171
235
  if (data.payload.is_from_self) {
172
236
  if (data.payload.is_evil) {
173
- throw new Error("Message filtered by ADP");
237
+ throw new AdpAgentError(
238
+ "Message filtered by ADP",
239
+ "FILTERED_MESSAGE"
240
+ );
174
241
  } else {
175
242
  continue;
176
243
  }
@@ -293,12 +360,14 @@ var AdpAgent = class extends import_client.AbstractAgent {
293
360
  break;
294
361
  }
295
362
  case "error": {
296
- throw new Error(
297
- `ADP returned error: ${JSON.stringify(data.payload?.error || data.error)}`
363
+ console.error(JSON.stringify(data));
364
+ throw new AdpAgentError(
365
+ data.error.message,
366
+ `ADP_ERROR_${data.error.code}` || "ADP_ERROR_0"
298
367
  );
299
368
  }
300
369
  case "token_stat": {
301
- console.log(JSON.stringify(data, null, 2));
370
+ console.debug(JSON.stringify(data));
302
371
  break;
303
372
  }
304
373
  case "reference": {
@@ -328,9 +397,20 @@ var AdpAgent = class extends import_client.AbstractAgent {
328
397
  }
329
398
  subscriber.complete();
330
399
  } catch (e) {
400
+ console.error(JSON.stringify(e));
401
+ let code = "UNKNOWN_ERROR";
402
+ let message = JSON.stringify(e);
403
+ if (e instanceof import_axios.AxiosError) {
404
+ code = e.code || "REQUEST_ERROR";
405
+ message = e.message;
406
+ } else if (e instanceof AdpAgentError) {
407
+ code = e.code || "AGENT_ERROR";
408
+ message = e.message;
409
+ }
331
410
  subscriber.next({
332
411
  type: import_client.EventType.RUN_ERROR,
333
- message: e?.message || JSON.stringify(e)
412
+ code,
413
+ message: `Sorry, an error occurred while running the agent: Error code ${code}, ${message}`
334
414
  });
335
415
  subscriber.complete();
336
416
  }
@@ -397,6 +477,9 @@ async function extractDocuments(messages, config, reqLkeClient) {
397
477
  }
398
478
  // Annotate the CommonJS export names for ESM import in node:
399
479
  0 && (module.exports = {
400
- AdpAgent
480
+ AdpAgent,
481
+ AdpAgentError,
482
+ CurrentNodeStatus,
483
+ ReplyMethod
401
484
  });
402
485
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/agent.ts","../src/utils.ts","../src/constant.ts"],"sourcesContent":["export * from \"./agent\";\n","import {\n RunAgentInput,\n Message,\n BaseEvent,\n EventType,\n RunStartedEvent,\n RunFinishedEvent,\n RunErrorEvent,\n TextMessageChunkEvent,\n ToolCallStartEvent,\n ToolCallArgsEvent,\n ToolCallEndEvent,\n ToolCallResultEvent,\n AbstractAgent,\n AgentConfig,\n UserMessage,\n BinaryInputContent,\n ThinkingStartEvent,\n ThinkingTextMessageStartEvent,\n ThinkingTextMessageContentEvent,\n ThinkingTextMessageEndEvent,\n ThinkingEndEvent,\n} from \"@ag-ui/client\";\nimport { Observable, Subscriber } from \"rxjs\";\nimport axios, { AxiosInstance } from \"axios\";\nimport { camelToSnakeKeys } from \"./utils\";\nimport { MIME_TYPES } from \"./constant\";\nimport {\n AdpConfig,\n AdpChatRequest,\n AdpChunk,\n ReplyMethod,\n CurrentNodeStatus,\n FileInfo,\n} from \"./types\";\nimport { randomUUID } from \"crypto\";\nimport { lke } from \"tencentcloud-sdk-nodejs-lke\";\nimport COS from \"cos-nodejs-sdk-v5\";\n\nexport class AdpAgent extends AbstractAgent {\n private adpConfig: AdpConfig;\n private reqAppClient: AxiosInstance;\n private reqLkeClient: InstanceType<typeof lke.v20231130.Client>;\n\n constructor(config: AgentConfig & { adpConfig: AdpConfig }) {\n super(config);\n this.adpConfig = config.adpConfig;\n this.reqAppClient = axios.create({\n baseURL: \"https://wss.lke.cloud.tencent.com\",\n });\n const LkeClient = lke.v20231130.Client;\n\n const credential = this.adpConfig.credential;\n this.reqLkeClient = new LkeClient({\n credential: credential\n ? credential\n : {\n secretId:\n (credential as Required<AdpConfig[\"credential\"]>)?.secretId ||\n process.env.TENCENTCLOUD_SECRETID,\n secretKey:\n (credential as Required<AdpConfig[\"credential\"]>)?.secretKey ||\n process.env.TENCENTCLOUD_SECRETKEY,\n token:\n (credential as Required<AdpConfig[\"credential\"]>)?.token ||\n process.env.TENCENTCLOUD_SESSIONTOKEN,\n },\n });\n }\n\n run(input: RunAgentInput) {\n return new Observable<BaseEvent>((subscriber) => {\n this._run(subscriber, input);\n });\n }\n\n private async _run(subscriber: Subscriber<BaseEvent>, input: RunAgentInput) {\n try {\n const { messages, runId, threadId, forwardedProps } = input;\n\n subscriber.next({\n type: EventType.RUN_STARTED,\n runId,\n threadId,\n } as RunStartedEvent);\n\n if (!this.adpConfig.appKey && !process.env.ADP_APP_KEY) {\n throw new Error(\n \"ADP app key is required, check your env variables or config passed with the adapter\"\n );\n }\n\n // try {\n // const historyRes = await this.reqLkeClient.GetMsgRecord({\n // SessionId: threadId,\n // Type: 5,\n // Count: this.adpConfig.historyCount || 30,\n // })\n // const histories = historyRes.Records;\n // if (histories) {\n\n // }\n // } catch (e) {\n // throw new Error(`Get history failed: ${e}`);\n // }\n\n const { messages: docExtractedMessages, fileInfos } =\n await extractDocuments(messages, this.adpConfig, this.reqLkeClient);\n const { message, trimmed } =\n convertAGUIMessagesToAdpMessages(docExtractedMessages);\n if (!message) {\n throw new Error(\"Message content format error, or empty content\");\n }\n if (trimmed > 0) {\n subscriber.next({\n type: EventType.RAW,\n rawEvent: {\n message: `ADP handles message history itself, so that a total of ${trimmed} messages before and including last assistant message will be trimmed.`,\n type: \"warn\",\n },\n });\n }\n\n const requestBody: AdpChatRequest = {\n requestId: runId,\n content: message,\n fileInfos,\n botAppKey: this.adpConfig.appKey || process.env.ADP_APP_KEY!,\n sessionId: threadId,\n visitorBizId: forwardedProps?.userId || randomUUID(),\n incremental: true,\n stream: \"enable\",\n customVariables: forwardedProps?.customVariables || {},\n ...this.adpConfig.request,\n };\n\n // console.log(camelToSnakeKeys(requestBody));\n\n const response = await this.reqAppClient.post(\n \"/v1/qbot/chat/sse\",\n camelToSnakeKeys(requestBody),\n { responseType: \"stream\" }\n );\n\n const sseStream: ReadableStream<Uint8Array> = response.data;\n let buffer = \"\";\n let interruptRequested = false;\n let thinkingStart = false;\n let thinkingMessageSet = new Set<string>();\n\n for await (const chunk of sseStream) {\n buffer += chunk.toString();\n\n const parts = buffer.split(\"\\n\\n\");\n buffer = parts.pop() || \"\";\n\n for (const part of parts) {\n if (!part.trim()) continue;\n\n const event = { data: \"\", event: \"\" };\n\n for (const line of part.split(\"\\n\")) {\n if (line.startsWith(\"data:\")) {\n event.data += line.slice(5);\n } else if (line.startsWith(\"event:\")) {\n event.event = line.slice(6);\n }\n }\n\n if (event.data) {\n let data: AdpChunk;\n try {\n data = JSON.parse(event.data);\n } catch (e) {\n throw new Error(`ADP returned invalid data: ${event.data}`);\n }\n\n switch (data.type) {\n case \"reply\": {\n // console.log(JSON.stringify(data, null, 2));\n\n if (data.payload.is_from_self) {\n if (data.payload.is_evil) {\n throw new Error(\"Message filtered by ADP\");\n } else {\n continue;\n }\n }\n const messageId = data.payload.record_id;\n const isFinal = data.payload.is_final;\n data.payload.content = data.payload.content.replace(\n /\\\\n/g,\n \"\\n\\n\"\n );\n\n switch (data.payload.reply_method) {\n case ReplyMethod.LLM_REPLY: {\n subscriber.next({\n type: EventType.TEXT_MESSAGE_CHUNK,\n messageId,\n delta: data.payload.content,\n } as TextMessageChunkEvent);\n break;\n }\n case ReplyMethod.WORKFLOW_REPLY: {\n subscriber.next({\n type: EventType.TEXT_MESSAGE_CHUNK,\n messageId,\n delta: data.payload.content,\n } as TextMessageChunkEvent);\n if (\n isFinal &&\n data.payload.work_flow &&\n [\n CurrentNodeStatus.Pending,\n CurrentNodeStatus.Running,\n ].includes(data.payload.work_flow.current_node.Status)\n ) {\n subscriber.next({\n type: EventType.TOOL_CALL_START,\n toolCallId: data.payload.work_flow!.current_node.NodeID,\n toolCallName: `${data.payload.work_flow!.workflow_name}-${data.payload.work_flow!.current_node.NodeName}`,\n parentMessageId: messageId,\n } as ToolCallStartEvent);\n subscriber.next({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: data.payload.work_flow!.current_node.NodeID,\n delta:\n data.payload.work_flow!.current_node.Input || \"{}\",\n } as ToolCallArgsEvent);\n subscriber.next({\n type: EventType.TOOL_CALL_END,\n toolCallId: data.payload.work_flow!.current_node.NodeID,\n } as ToolCallEndEvent);\n interruptRequested = true;\n }\n break;\n }\n case ReplyMethod.WORKFLOW_EXECUTION_END: {\n subscriber.next({\n type: EventType.TOOL_CALL_RESULT,\n messageId,\n toolCallId: data.payload.work_flow!.current_node.NodeID,\n content: (data.payload.work_flow?.outputs || []).join(\n \"\\n\\n\"\n ),\n } as ToolCallResultEvent);\n subscriber.next({\n type: EventType.TEXT_MESSAGE_CHUNK,\n messageId,\n delta: data.payload.content,\n } as TextMessageChunkEvent);\n break;\n }\n default: {\n subscriber.next({\n type: EventType.TEXT_MESSAGE_CHUNK,\n messageId,\n delta: data.payload.content,\n } as TextMessageChunkEvent);\n break;\n }\n }\n break;\n }\n case \"thought\": {\n const messageId = data.payload.record_id;\n if (!thinkingStart) {\n thinkingStart = true;\n subscriber.next({\n type: EventType.THINKING_START,\n messageId,\n } as ThinkingStartEvent);\n }\n data.payload.procedures.forEach((procedure) => {\n if (!thinkingMessageSet.has(messageId)) {\n thinkingMessageSet.add(messageId);\n subscriber.next({\n type: EventType.THINKING_TEXT_MESSAGE_START,\n messageId,\n delta: procedure.debugging.content,\n } as ThinkingTextMessageStartEvent);\n } else {\n if (procedure.status === \"processing\") {\n subscriber.next({\n type: EventType.THINKING_TEXT_MESSAGE_CONTENT,\n messageId,\n delta: procedure.debugging.content,\n } as ThinkingTextMessageContentEvent);\n } else {\n thinkingMessageSet.delete(messageId);\n subscriber.next({\n type: EventType.THINKING_TEXT_MESSAGE_END,\n messageId,\n } as ThinkingTextMessageEndEvent);\n }\n }\n });\n const allFinished = data.payload.procedures.every(\n (procedure) => procedure.status !== \"processing\"\n );\n if (allFinished) {\n thinkingStart = false;\n thinkingMessageSet.clear();\n subscriber.next({\n type: EventType.THINKING_END,\n messageId,\n } as ThinkingEndEvent);\n }\n break;\n }\n case \"error\": {\n throw new Error(\n `ADP returned error: ${JSON.stringify(data.payload?.error || (data as any).error)}`\n );\n }\n case \"token_stat\": {\n console.log(JSON.stringify(data, null, 2));\n break;\n }\n case \"reference\": {\n // TODO: Reference event\n break;\n }\n default: {\n break;\n }\n }\n }\n }\n }\n\n // Necessary?\n if (interruptRequested) {\n subscriber.next({\n type: EventType.RUN_FINISHED,\n runId,\n threadId,\n outcome: \"interrupt\",\n interrupt: {},\n } as RunFinishedEvent);\n } else {\n subscriber.next({\n type: EventType.RUN_FINISHED,\n threadId,\n runId,\n } as RunFinishedEvent);\n }\n subscriber.complete();\n } catch (e: any) {\n subscriber.next({\n type: EventType.RUN_ERROR,\n message: e?.message || JSON.stringify(e),\n } as RunErrorEvent);\n subscriber.complete();\n }\n }\n}\n\nfunction convertAGUIMessagesToAdpMessages(messages: Message[]): {\n message: string;\n trimmed: number;\n} {\n let result = \"\";\n let trimmed = messages.length;\n for (const message of messages.reverse()) {\n if (message.role === \"assistant\") {\n break;\n }\n if (message.role === \"user\") {\n trimmed--;\n let content = \"\";\n if (typeof message.content === \"string\") {\n content = message.content;\n } else {\n content = message.content\n .reduce((acc, cur) => {\n if (cur.type === \"text\") {\n return acc + `${cur.text} `;\n } else if (cur.type === \"binary\") {\n // TODO: Upload to COS\n return acc + `![${cur.filename}](${cur.url}) `;\n } else {\n return acc;\n }\n }, \"\")\n .trim();\n }\n result = `${message.role}: ${content}\\n${result}`;\n } else {\n result = `${message.role}: ${message.content}\\n${result}`;\n }\n }\n return { message: result.trim(), trimmed };\n}\n\nasync function extractDocuments(\n messages: Message[],\n config: AdpConfig,\n reqLkeClient: InstanceType<typeof lke.v20231130.Client>\n) {\n // Document Parse\n const documentFiles: BinaryInputContent[] = [];\n const newMessages = messages.map((msg) => {\n if (msg.role === \"user\" && Array.isArray(msg.content)) {\n let newContent: UserMessage[\"content\"] = [];\n msg.content.forEach((item) => {\n if (item.type === \"text\") {\n newContent.push(item);\n } else if (item.type === \"binary\") {\n if (Object.keys(MIME_TYPES).includes(item.mimeType)) {\n documentFiles.push(item);\n }\n }\n });\n return {\n ...msg,\n content: newContent,\n };\n } else return msg;\n });\n const documentAddresses = [];\n const fileInfos: FileInfo[] = [];\n // if (documentFiles.length) {\n // try {\n // const bizIdRes = await reqLkeClient.DescribeRobotBizIDByAppKey({\n // AppKey: config.appKey || process.env.ADP_APP_KEY!,\n // });\n // const storageCredRes = await reqLkeClient.DescribeStorageCredential({\n // BotBizId: bizIdRes.BotBizId,\n // });\n // const cosCredId = storageCredRes.Credentials?.TmpSecretId;\n // const cosCredKey = storageCredRes.Credentials?.TmpSecretKey;\n // const cosClient = new COS({\n // SecretId: cosCredId,\n // SecretKey: cosCredKey,\n // SessionToken: storageCredRes.Credentials?.SessionToken,\n // });\n // for (const file of documentFiles) {\n // }\n // } catch (e) {}\n // }\n return {\n messages: newMessages,\n fileInfos,\n };\n}\n\nfunction getCosCredentialParams(extName: string) {}\n","/**\n * 将小驼峰字符串转换为下划线格式\n * 例如: \"userName\" -> \"user_name\"\n */\nfunction camelToSnake(str: string): string {\n return str.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`);\n}\n\n/**\n * 递归地将对象的所有小驼峰属性名转换为下划线格式\n */\nexport function camelToSnakeKeys<T>(obj: T): T {\n if (obj === null || obj === undefined) {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => camelToSnakeKeys(item)) as T;\n }\n\n if (typeof obj === \"object\") {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n const snakeKey = camelToSnake(key);\n result[snakeKey] = camelToSnakeKeys(value);\n }\n return result as T;\n }\n\n return obj;\n}\n","export const MIME_TYPES = {\n \"text/plain\": \"txt\",\n \"application/msword\": \"doc\",\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\":\n \"docx\",\n \"application/pdf\": \"pdf\",\n \"application/vnd.ms-powerpoint\": \"ppt\",\n \"application/vnd.openxmlformats-officedocument.presentationml.presentation\":\n \"pptx\",\n};\n"],"mappings":"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","names":["axios"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/agent.ts","../src/utils.ts","../src/constant.ts","../src/types.ts"],"sourcesContent":["export * from \"./agent\";\n\nexport * from \"./types\";\n","import {\n RunAgentInput,\n Message,\n BaseEvent,\n EventType,\n RunStartedEvent,\n RunFinishedEvent,\n RunErrorEvent,\n TextMessageChunkEvent,\n ToolCallStartEvent,\n ToolCallArgsEvent,\n ToolCallEndEvent,\n ToolCallResultEvent,\n AbstractAgent,\n AgentConfig,\n UserMessage,\n BinaryInputContent,\n ThinkingStartEvent,\n ThinkingTextMessageStartEvent,\n ThinkingTextMessageContentEvent,\n ThinkingTextMessageEndEvent,\n ThinkingEndEvent,\n} from \"@ag-ui/client\";\nimport { Observable, Subscriber } from \"rxjs\";\nimport axios, { AxiosError, AxiosInstance } from \"axios\";\nimport { camelToSnakeKeys } from \"./utils\";\nimport { MIME_TYPES } from \"./constant\";\nimport {\n AdpConfig,\n AdpChatRequest,\n AdpChunk,\n ReplyMethod,\n CurrentNodeStatus,\n FileInfo,\n} from \"./types\";\nimport { randomUUID } from \"crypto\";\nimport { lke } from \"tencentcloud-sdk-nodejs-lke\";\n// import COS from \"cos-nodejs-sdk-v5\";\n\nexport class AdpAgentError extends Error {\n code?: string;\n constructor(message: string, code?: string) {\n super(message);\n this.name = \"AdpAgentError\";\n if (code) this.code = code;\n }\n}\n\nexport class AdpAgent extends AbstractAgent {\n private reqAppClient: AxiosInstance;\n private reqLkeClient: InstanceType<typeof lke.v20231130.Client>;\n protected adpConfig: AdpConfig;\n\n constructor(config: AgentConfig & { adpConfig: AdpConfig }) {\n super(config);\n this.adpConfig = config.adpConfig;\n this.reqAppClient = axios.create({\n baseURL:\n this.adpConfig.request?.baseUrl || \"https://wss.lke.cloud.tencent.com\",\n });\n const LkeClient = lke.v20231130.Client;\n this.reqLkeClient = new LkeClient({\n credential: {\n secretId:\n this.adpConfig.credential?.secretId ||\n process.env.TENCENTCLOUD_SECRETID,\n secretKey:\n this.adpConfig.credential?.secretKey ||\n process.env.TENCENTCLOUD_SECRETKEY,\n token:\n this.adpConfig.credential?.token ||\n process.env.TENCENTCLOUD_SESSIONTOKEN,\n },\n });\n }\n\n generateRequestBody({\n message,\n fileInfos,\n runId,\n threadId,\n forwardedProps,\n }: {\n message: string;\n fileInfos: FileInfo[];\n runId: string;\n threadId: string;\n forwardedProps: Record<string, string>;\n }): AdpChatRequest {\n const requestBody: AdpChatRequest = {\n incremental: true,\n stream: \"enable\",\n ...(this.adpConfig.request?.body || {}),\n ...(forwardedProps || {}),\n\n botAppKey:\n this.adpConfig.appKey ||\n this.adpConfig.request?.body?.botAppKey ||\n process.env.ADP_APP_KEY!,\n visitorBizId: forwardedProps?.visitorBizId || randomUUID(),\n requestId: runId,\n sessionId: threadId || randomUUID(),\n content: message,\n fileInfos,\n };\n return requestBody;\n }\n\n // @ts-ignore\n run(input: RunAgentInput) {\n return new Observable<BaseEvent>((subscriber) => {\n this._run(subscriber, input);\n });\n }\n\n private async _run(subscriber: Subscriber<BaseEvent>, input: RunAgentInput) {\n try {\n const { messages, runId, threadId, forwardedProps } = input;\n\n subscriber.next({\n type: EventType.RUN_STARTED,\n runId,\n threadId,\n } as RunStartedEvent);\n\n if (!this.adpConfig.appKey && !process.env.ADP_APP_KEY) {\n throw new AdpAgentError(\n \"ADP app key is required, check your env variables or config passed with the adapter\",\n \"MISSING_APP_KEY\"\n );\n }\n\n // try {\n // const historyRes = await this.reqLkeClient.GetMsgRecord({\n // SessionId: threadId,\n // Type: 5,\n // Count: this.adpConfig.historyCount || 30,\n // })\n // const histories = historyRes.Records;\n // if (histories) {\n\n // }\n // } catch (e) {\n // throw new Error(`Get history failed: ${e}`);\n // }\n\n const { messages: docExtractedMessages, fileInfos } =\n await extractDocuments(messages, this.adpConfig, this.reqLkeClient);\n const { message, trimmed } =\n convertAGUIMessagesToAdpMessages(docExtractedMessages);\n if (!message) {\n throw new AdpAgentError(\n \"Message content format error, or empty content\",\n \"INVALID_MESSAGE_CONTENT\"\n );\n }\n if (trimmed > 0) {\n subscriber.next({\n type: EventType.RAW,\n rawEvent: {\n message: `ADP handles message history itself, so that a total of ${trimmed} messages before and including last assistant message will be trimmed.`,\n type: \"warn\",\n },\n });\n }\n\n const requestBody: AdpChatRequest = this.generateRequestBody({\n message,\n fileInfos,\n runId,\n threadId,\n forwardedProps,\n });\n\n // console.log(camelToSnakeKeys(requestBody));\n\n const response = await this.reqAppClient.post(\n this.adpConfig.request?.endpoint || \"/v1/qbot/chat/sse\",\n camelToSnakeKeys(requestBody),\n { responseType: \"stream\" }\n );\n\n const sseStream: ReadableStream<Uint8Array> = response.data;\n let buffer = \"\";\n let interruptRequested = false;\n let thinkingStart = false;\n let thinkingMessageSet = new Set<string>();\n\n for await (const chunk of sseStream) {\n buffer += chunk.toString();\n\n const parts = buffer.split(\"\\n\\n\");\n buffer = parts.pop() || \"\";\n\n for (const part of parts) {\n if (!part.trim()) continue;\n\n const event = { data: \"\", event: \"\" };\n\n for (const line of part.split(\"\\n\")) {\n if (line.startsWith(\"data:\")) {\n event.data += line.slice(5);\n } else if (line.startsWith(\"event:\")) {\n event.event = line.slice(6);\n }\n }\n\n if (event.data) {\n let data: AdpChunk;\n try {\n data = JSON.parse(event.data);\n } catch (e) {\n throw new AdpAgentError(\n `ADP returned invalid data: ${event.data}`,\n \"INVALID_DATA\"\n );\n }\n\n switch (data.type) {\n case \"reply\": {\n // console.log(JSON.stringify(data, null, 2));\n\n if (data.payload.is_from_self) {\n if (data.payload.is_evil) {\n throw new AdpAgentError(\n \"Message filtered by ADP\",\n \"FILTERED_MESSAGE\"\n );\n } else {\n continue;\n }\n }\n const messageId = data.payload.record_id;\n const isFinal = data.payload.is_final;\n data.payload.content = data.payload.content.replace(\n /\\\\n/g,\n \"\\n\\n\"\n );\n\n switch (data.payload.reply_method) {\n case ReplyMethod.LLM_REPLY: {\n subscriber.next({\n type: EventType.TEXT_MESSAGE_CHUNK,\n messageId,\n delta: data.payload.content,\n } as TextMessageChunkEvent);\n break;\n }\n case ReplyMethod.WORKFLOW_REPLY: {\n subscriber.next({\n type: EventType.TEXT_MESSAGE_CHUNK,\n messageId,\n delta: data.payload.content,\n } as TextMessageChunkEvent);\n if (\n isFinal &&\n data.payload.work_flow &&\n [\n CurrentNodeStatus.Pending,\n CurrentNodeStatus.Running,\n ].includes(data.payload.work_flow.current_node.Status)\n ) {\n subscriber.next({\n type: EventType.TOOL_CALL_START,\n toolCallId: data.payload.work_flow!.current_node.NodeID,\n toolCallName: `${data.payload.work_flow!.workflow_name}-${data.payload.work_flow!.current_node.NodeName}`,\n parentMessageId: messageId,\n } as ToolCallStartEvent);\n subscriber.next({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: data.payload.work_flow!.current_node.NodeID,\n delta:\n data.payload.work_flow!.current_node.Input || \"{}\",\n } as ToolCallArgsEvent);\n subscriber.next({\n type: EventType.TOOL_CALL_END,\n toolCallId: data.payload.work_flow!.current_node.NodeID,\n } as ToolCallEndEvent);\n interruptRequested = true;\n }\n break;\n }\n case ReplyMethod.WORKFLOW_EXECUTION_END: {\n subscriber.next({\n type: EventType.TOOL_CALL_RESULT,\n messageId,\n toolCallId: data.payload.work_flow!.current_node.NodeID,\n content: (data.payload.work_flow?.outputs || []).join(\n \"\\n\\n\"\n ),\n } as ToolCallResultEvent);\n subscriber.next({\n type: EventType.TEXT_MESSAGE_CHUNK,\n messageId,\n delta: data.payload.content,\n } as TextMessageChunkEvent);\n break;\n }\n default: {\n subscriber.next({\n type: EventType.TEXT_MESSAGE_CHUNK,\n messageId,\n delta: data.payload.content,\n } as TextMessageChunkEvent);\n break;\n }\n }\n break;\n }\n case \"thought\": {\n const messageId = data.payload.record_id;\n if (!thinkingStart) {\n thinkingStart = true;\n subscriber.next({\n type: EventType.THINKING_START,\n messageId,\n } as ThinkingStartEvent);\n }\n data.payload.procedures.forEach((procedure) => {\n if (!thinkingMessageSet.has(messageId)) {\n thinkingMessageSet.add(messageId);\n subscriber.next({\n type: EventType.THINKING_TEXT_MESSAGE_START,\n messageId,\n delta: procedure.debugging.content,\n } as ThinkingTextMessageStartEvent);\n } else {\n if (procedure.status === \"processing\") {\n subscriber.next({\n type: EventType.THINKING_TEXT_MESSAGE_CONTENT,\n messageId,\n delta: procedure.debugging.content,\n } as ThinkingTextMessageContentEvent);\n } else {\n thinkingMessageSet.delete(messageId);\n subscriber.next({\n type: EventType.THINKING_TEXT_MESSAGE_END,\n messageId,\n } as ThinkingTextMessageEndEvent);\n }\n }\n });\n const allFinished = data.payload.procedures.every(\n (procedure) => procedure.status !== \"processing\"\n );\n if (allFinished) {\n thinkingStart = false;\n thinkingMessageSet.clear();\n subscriber.next({\n type: EventType.THINKING_END,\n messageId,\n } as ThinkingEndEvent);\n }\n break;\n }\n case \"error\": {\n console.error(JSON.stringify(data));\n throw new AdpAgentError(\n data.error.message,\n `ADP_ERROR_${data.error.code}` || \"ADP_ERROR_0\"\n );\n }\n case \"token_stat\": {\n console.debug(JSON.stringify(data));\n break;\n }\n case \"reference\": {\n // TODO: Reference event\n break;\n }\n default: {\n break;\n }\n }\n }\n }\n }\n\n if (interruptRequested) {\n subscriber.next({\n type: EventType.RUN_FINISHED,\n runId,\n threadId,\n outcome: \"interrupt\",\n interrupt: {},\n } as RunFinishedEvent);\n } else {\n subscriber.next({\n type: EventType.RUN_FINISHED,\n threadId,\n runId,\n } as RunFinishedEvent);\n }\n subscriber.complete();\n } catch (e: unknown) {\n console.error(JSON.stringify(e));\n let code = \"UNKNOWN_ERROR\";\n let message = JSON.stringify(e);\n if (e instanceof AxiosError) {\n code = e.code || \"REQUEST_ERROR\";\n message = e.message;\n } else if (e instanceof AdpAgentError) {\n code = e.code || \"AGENT_ERROR\";\n message = e.message;\n }\n subscriber.next({\n type: EventType.RUN_ERROR,\n code,\n message: `Sorry, an error occurred while running the agent: Error code ${code}, ${message}`,\n } as RunErrorEvent);\n subscriber.complete();\n }\n }\n}\n\nfunction convertAGUIMessagesToAdpMessages(messages: Message[]): {\n message: string;\n trimmed: number;\n} {\n let result = \"\";\n let trimmed = messages.length;\n for (const message of messages.reverse()) {\n if (message.role === \"assistant\") {\n break;\n }\n if (message.role === \"user\") {\n trimmed--;\n let content = \"\";\n if (typeof message.content === \"string\") {\n content = message.content;\n } else {\n content = message.content\n .reduce((acc, cur) => {\n if (cur.type === \"text\") {\n return acc + `${cur.text} `;\n } else if (cur.type === \"binary\") {\n // TODO: Upload to COS\n return acc + `![${cur.filename}](${cur.url}) `;\n } else {\n return acc;\n }\n }, \"\")\n .trim();\n }\n result = `${message.role}: ${content}\\n${result}`;\n } else {\n result = `${message.role}: ${message.content}\\n${result}`;\n }\n }\n return { message: result.trim(), trimmed };\n}\n\nasync function extractDocuments(\n messages: Message[],\n config: AdpConfig,\n reqLkeClient: InstanceType<typeof lke.v20231130.Client>\n) {\n // Document Parse\n const documentFiles: BinaryInputContent[] = [];\n const newMessages = messages.map((msg) => {\n if (msg.role === \"user\" && Array.isArray(msg.content)) {\n let newContent: UserMessage[\"content\"] = [];\n msg.content.forEach((item) => {\n if (item.type === \"text\") {\n newContent.push(item);\n } else if (item.type === \"binary\") {\n if (Object.keys(MIME_TYPES).includes(item.mimeType)) {\n documentFiles.push(item);\n }\n }\n });\n return {\n ...msg,\n content: newContent,\n };\n } else return msg;\n });\n const documentAddresses = [];\n const fileInfos: FileInfo[] = [];\n // if (documentFiles.length) {\n // try {\n // const bizIdRes = await reqLkeClient.DescribeRobotBizIDByAppKey({\n // AppKey: config.appKey || process.env.ADP_APP_KEY!,\n // });\n // const storageCredRes = await reqLkeClient.DescribeStorageCredential({\n // BotBizId: bizIdRes.BotBizId,\n // });\n // const cosCredId = storageCredRes.Credentials?.TmpSecretId;\n // const cosCredKey = storageCredRes.Credentials?.TmpSecretKey;\n // const cosClient = new COS({\n // SecretId: cosCredId,\n // SecretKey: cosCredKey,\n // SessionToken: storageCredRes.Credentials?.SessionToken,\n // });\n // for (const file of documentFiles) {\n // }\n // } catch (e) {}\n // }\n return {\n messages: newMessages,\n fileInfos,\n };\n}\n\nfunction getCosCredentialParams(extName: string) {}\n","/**\n * 将小驼峰字符串转换为下划线格式\n * 例如: \"userName\" -> \"user_name\"\n */\nfunction camelToSnake(str: string): string {\n return str.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`);\n}\n\n/**\n * 递归地将对象的所有小驼峰属性名转换为下划线格式\n */\nexport function camelToSnakeKeys<T>(obj: T): T {\n if (obj === null || obj === undefined) {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => camelToSnakeKeys(item)) as T;\n }\n\n if (typeof obj === \"object\") {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n const snakeKey = camelToSnake(key);\n result[snakeKey] = camelToSnakeKeys(value);\n }\n return result as T;\n }\n\n return obj;\n}\n","export const MIME_TYPES = {\n \"text/plain\": \"txt\",\n \"application/msword\": \"doc\",\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\":\n \"docx\",\n \"application/pdf\": \"pdf\",\n \"application/vnd.ms-powerpoint\": \"ppt\",\n \"application/vnd.openxmlformats-officedocument.presentationml.presentation\":\n \"pptx\",\n};\n","/**\n * 文件信息\n */\nexport interface FileInfo {\n /** 文件名称 */\n fileName: string;\n\n /** 文件大小(实时文档解析接口返回) */\n fileSize: string;\n\n /** 文件 URL(实时文档解析接口返回) */\n fileUrl: string;\n\n /** 文件类型 */\n fileType: string;\n\n /** 文档 ID(实时文档解析接口返回) */\n docId: string;\n\n /** 扩展参数 */\n [key: string]: any;\n}\n\n/**\n * ADP 对话请求参数\n */\nexport interface AdpChatRequest {\n /** 请求 ID,用于标识一个请求 */\n requestId?: string;\n\n /** 消息内容 */\n content: string;\n\n /** 文件信息 */\n fileInfos?: FileInfo[];\n\n /** 会话 ID,用于标识一个会话 */\n sessionId: string;\n\n /** 应用密钥 */\n botAppKey: string;\n\n /** 访客 ID,标识当前接入会话的用户 */\n visitorBizId: string;\n\n /** 流式回复频率控制,控制应用回包频率 */\n streamingThrottle?: number;\n\n /** 自定义参数,用于传递参数给工作流或设置知识库检索范围 */\n customVariables?: Record<string, string>;\n\n /** 角色指令(提示词) */\n systemRole?: string;\n\n /** 控制回复事件和思考事件中的 content 是否是增量输出 */\n incremental?: boolean;\n\n /** 是否开启联网搜索:空字符串-跟随配置 / enable / disable */\n searchNetwork?: \"\" | \"enable\" | \"disable\";\n\n /** 指定模型名称 */\n modelName?: string;\n\n /** 是否开启流式传输:空字符串-跟随配置 / enable / disable */\n stream?: \"\" | \"enable\" | \"disable\";\n\n /** 是否开启工作流:空字符串-跟随配置 / enable / disable */\n workflowStatus?: \"\" | \"enable\" | \"disable\";\n\n /** 扩展参数 */\n [key: string]: any;\n}\n\nexport type AdpConfig = {\n request?: {\n baseUrl?: string;\n endpoint?: string;\n body?: Partial<AdpChatRequest>;\n };\n historyCount?: number;\n appKey?: string;\n credential?: {\n secretId?: string;\n secretKey?: string;\n token?: string;\n };\n};\n\nexport type AdpChunk =\n | { type: \"reply\"; payload: ReplyEvent; message_id: string }\n | { type: \"thought\"; payload: ThoughtEvent; message_id: string }\n | { type: \"token_stat\"; payload: TokenStatEvent; message_id: string }\n | { type: \"reference\"; payload: ReferenceEvent; message_id: string }\n | { type: \"error\"; error: ErrorInfo };\n\n// 回复事件类型定义\nexport interface ReplyEvent {\n request_id: string; // 请求 ID,用于标识一个请求\n content: string; // 消息内容\n file_infos: FileInfo[]; // 文件信息\n record_id: string; // 消息唯一 ID\n related_record_id: string; // 关联的消息唯一 ID\n session_id: string; // 会话 ID\n is_from_self: boolean; // 消息是否由自己发出\n can_rating: boolean; // 该消息记录是否能评价\n timestamp: number; // 消息时间戳(秒级)\n is_final: boolean; // 消息是否已输出完\n is_evil: boolean; // 是否命中敏感内容\n is_llm_generated: boolean; // 是否为模型生成内容\n reply_method: ReplyMethod; // 回复方式\n knowledge?: Knowledge[]; // 命中的知识\n option_cards?: string[]; // 选项卡,任务流程专有\n custom_params?: string[]; // 用户自定义业务参数\n task_flow?: TaskFlow; // 任务流程调试信息\n work_flow?: WorkFlow; // 工作流调试信息\n quote_infos?: QuoteInfo[]; // 引用信息\n}\n\n// 回复方式枚举\nexport enum ReplyMethod {\n LLM_REPLY = 1,\n UNKNOWN_QUESTION_REPLY = 2,\n REJECT_QUESTION_REPLY = 3,\n SENSITIVE_REPLY = 4,\n ADOPTED_QA_PRIORITY_REPLY = 5,\n WELCOME_REPLY = 6,\n CONCURRENCY_LIMIT_REPLY = 7,\n GLOBAL_INTERVENTION_KNOWLEDGE = 8,\n TASK_FLOW_REPLY = 9,\n TASK_FLOW_ANSWER = 10,\n SEARCH_ENGINE_REPLY = 11,\n KNOWLEDGE_POLISHED_REPLY = 12,\n IMAGE_UNDERSTANDING_REPLY = 13,\n REALTIME_DOCUMENT_REPLY = 14,\n CLARIFICATION_CONFIRMATION_REPLY = 15,\n WORKFLOW_REPLY = 16,\n WORKFLOW_EXECUTION_END = 17,\n AGENT_REPLY = 18,\n MULTI_INTENT_REPLY = 19,\n}\n\n// 命中的知识类型\nexport interface Knowledge {\n id: string; // 命中的知识 ID\n type: number; // 命中的知识类型: 1: 问答, 2: 文档片段\n seg_id?: string; // 片段 ID\n}\n\n// 任务流调试信息\nexport interface TaskFlow {\n task_flow_name: string; // 任务流程名称\n task_flow_id: string; // 任务流程 ID\n query_rewrite: string; // 问题改写结果\n hit_intent: string; // 命中的意图\n slot_info: Record<string, any>; // 运行时收集的槽位信息\n api_response: Record<string, any>; // API 节点的返回信息\n type: number; // 任务流程回复类型\n}\n\n// 工作流调试信息\nexport interface WorkFlow {\n workflow_name: string; // 工作流名称\n workflow_id: string; // 工作流ID\n workflow_run_id: string; // 工作流运行ID\n option_cards: string[]; // 选项卡\n current_node: CurrentNode; // 当前节点信息\n outputs: Array<string>; // 输出结果\n}\n\nexport enum CurrentNodeStatus {\n Pending = 0,\n Running = 1,\n Succeeded = 2,\n Failed = 3,\n}\n\n// 当前工作流节点信息\nexport interface CurrentNode {\n NodeID: string; // 节点ID\n NodeType: number; // 节点类型\n NodeName: string; // 节点名称\n Status: CurrentNodeStatus; // 状态\n Input: string; // 节点的输入\n Output: string; // 节点的最终输出\n TaskOutput: string; // 任务的输出\n FailMessage: string; // 异常信息\n CostMilliSeconds: string; // 节点的总耗时\n Reply: string; // 当前节点的回复内容\n BelongNodeID: string; // 节点所属工作流被引用时的引用节点的ID\n StatisticInfo: StatisticInfo; // LLM 统计信息\n}\n\n// LLM 统计信息\nexport interface StatisticInfo {\n ModelName: string; // 模型名称\n FirstTokenCost: number; // 首token耗时\n TotalCost: number; // 推理总耗时\n InputTokens: number; // 输入token数量\n OutputTokens: number; // 输出token数量\n TotalTokens: number; // 输入+输出总token\n}\n\n// 引用信息\nexport interface QuoteInfo {\n index: number; // 引用的角标索引\n position: number; // 在回复内容中的位置\n}\n\n// token统计事件类型定义\nexport interface TokenStatEvent {\n session_id: string; // 会话 id\n request_id: string; // 对应发送事件对应的请求 id\n record_id: string; // 对应发送事件对应的消息记录 id\n status_summary: \"processing\" | \"success\" | \"failed\"; // 本轮对话状态\n status_summary_title: string; // 本轮对话状态描述\n elapsed: number; // 本轮调用耗时, 单位 ms\n token_count: number; // 本轮请求消耗 token 数\n procedures: TokenStatProcedure[]; // 调用过程列表\n}\n\n// token统计调用过程\nexport interface TokenStatProcedure {\n name: string; // 英文名\n title: string; // 调用过程描述\n status: \"processing\" | \"success\" | \"failed\"; // 调用过程状态\n input_count: number; // 当次过程输入消耗 token 数\n output_count: number; // 当次过程输出消耗 token 数\n count: number; // 当次过程消耗总 token 数\n}\n\n// 参考来源事件类型定义\nexport interface ReferenceEvent {\n record_id: string; // 消息唯一 ID\n references: Reference[]; // 参考来源\n}\n\n// 参考来源\nexport interface Reference {\n id: string | number; // 参考来源ID\n type: number; // 参考来源类型: 1:问答, 2:文档片段, 4:联网检索到的内容\n url?: string; // 参考来源链接(仅参考来源类型为文档片段时使用)\n name: string; // 参考来源名称\n doc_id: number; // 参考来源文档 ID\n doc_biz_id: number; // 参考来源文档业务 ID\n doc_name: string; // 参考来源文档名称\n qa_biz_id: string; // 参考来源问答业务 ID\n}\n\n// 错误信息\nexport interface ErrorInfo {\n code: number; // 错误码\n message: string; // 错误信息\n}\n\n// 思考事件类型定义\nexport interface ThoughtEvent {\n elapsed: number; // 本轮调用耗时, 单位 ms\n is_workflow: boolean; // 是否工作流\n procedures: ThoughtProcedure[]; // 调用过程列表\n record_id: string; // 对应发送事件对应的消息记录 id\n request_id: string; // 对应发送事件对应的请求 id\n session_id: string; // 会话 id\n trace_id: string; // 链路 id\n workflow_name: string; // 工作流名称\n}\n\n// 思考调用过程\nexport interface ThoughtProcedure {\n debugging: Debugging; // 调试过程信息\n index: number; // 过程索引\n name: string; // 英文名\n title: string; // 调用过程描述\n status: \"processing\" | \"success\" | \"failed\"; // 状态\n icon: string; // 图标\n switch: string; // 是否切换Agent\n workflow_name: string; // 工作流名称\n plugin_type: number; // 插件类型: 0: 自定义插件; 1: 官方插件; 2: 工作流\n elapsed: number; // 当前请求执行时间, 单位 ms\n}\n\n// 调试过程信息\nexport interface Debugging {\n content: string; // 调试过程中输出的内容\n}\n"],"mappings":"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","names":["ReplyMethod","CurrentNodeStatus","axios"]}
package/dist/index.mjs CHANGED
@@ -4,7 +4,7 @@ import {
4
4
  AbstractAgent
5
5
  } from "@ag-ui/client";
6
6
  import { Observable } from "rxjs";
7
- import axios from "axios";
7
+ import axios, { AxiosError } from "axios";
8
8
 
9
9
  // src/utils.ts
10
10
  function camelToSnake(str) {
@@ -38,26 +38,85 @@ var MIME_TYPES = {
38
38
  "application/vnd.openxmlformats-officedocument.presentationml.presentation": "pptx"
39
39
  };
40
40
 
41
+ // src/types.ts
42
+ var ReplyMethod = /* @__PURE__ */ ((ReplyMethod2) => {
43
+ ReplyMethod2[ReplyMethod2["LLM_REPLY"] = 1] = "LLM_REPLY";
44
+ ReplyMethod2[ReplyMethod2["UNKNOWN_QUESTION_REPLY"] = 2] = "UNKNOWN_QUESTION_REPLY";
45
+ ReplyMethod2[ReplyMethod2["REJECT_QUESTION_REPLY"] = 3] = "REJECT_QUESTION_REPLY";
46
+ ReplyMethod2[ReplyMethod2["SENSITIVE_REPLY"] = 4] = "SENSITIVE_REPLY";
47
+ ReplyMethod2[ReplyMethod2["ADOPTED_QA_PRIORITY_REPLY"] = 5] = "ADOPTED_QA_PRIORITY_REPLY";
48
+ ReplyMethod2[ReplyMethod2["WELCOME_REPLY"] = 6] = "WELCOME_REPLY";
49
+ ReplyMethod2[ReplyMethod2["CONCURRENCY_LIMIT_REPLY"] = 7] = "CONCURRENCY_LIMIT_REPLY";
50
+ ReplyMethod2[ReplyMethod2["GLOBAL_INTERVENTION_KNOWLEDGE"] = 8] = "GLOBAL_INTERVENTION_KNOWLEDGE";
51
+ ReplyMethod2[ReplyMethod2["TASK_FLOW_REPLY"] = 9] = "TASK_FLOW_REPLY";
52
+ ReplyMethod2[ReplyMethod2["TASK_FLOW_ANSWER"] = 10] = "TASK_FLOW_ANSWER";
53
+ ReplyMethod2[ReplyMethod2["SEARCH_ENGINE_REPLY"] = 11] = "SEARCH_ENGINE_REPLY";
54
+ ReplyMethod2[ReplyMethod2["KNOWLEDGE_POLISHED_REPLY"] = 12] = "KNOWLEDGE_POLISHED_REPLY";
55
+ ReplyMethod2[ReplyMethod2["IMAGE_UNDERSTANDING_REPLY"] = 13] = "IMAGE_UNDERSTANDING_REPLY";
56
+ ReplyMethod2[ReplyMethod2["REALTIME_DOCUMENT_REPLY"] = 14] = "REALTIME_DOCUMENT_REPLY";
57
+ ReplyMethod2[ReplyMethod2["CLARIFICATION_CONFIRMATION_REPLY"] = 15] = "CLARIFICATION_CONFIRMATION_REPLY";
58
+ ReplyMethod2[ReplyMethod2["WORKFLOW_REPLY"] = 16] = "WORKFLOW_REPLY";
59
+ ReplyMethod2[ReplyMethod2["WORKFLOW_EXECUTION_END"] = 17] = "WORKFLOW_EXECUTION_END";
60
+ ReplyMethod2[ReplyMethod2["AGENT_REPLY"] = 18] = "AGENT_REPLY";
61
+ ReplyMethod2[ReplyMethod2["MULTI_INTENT_REPLY"] = 19] = "MULTI_INTENT_REPLY";
62
+ return ReplyMethod2;
63
+ })(ReplyMethod || {});
64
+ var CurrentNodeStatus = /* @__PURE__ */ ((CurrentNodeStatus2) => {
65
+ CurrentNodeStatus2[CurrentNodeStatus2["Pending"] = 0] = "Pending";
66
+ CurrentNodeStatus2[CurrentNodeStatus2["Running"] = 1] = "Running";
67
+ CurrentNodeStatus2[CurrentNodeStatus2["Succeeded"] = 2] = "Succeeded";
68
+ CurrentNodeStatus2[CurrentNodeStatus2["Failed"] = 3] = "Failed";
69
+ return CurrentNodeStatus2;
70
+ })(CurrentNodeStatus || {});
71
+
41
72
  // src/agent.ts
42
73
  import { randomUUID } from "crypto";
43
74
  import { lke } from "tencentcloud-sdk-nodejs-lke";
75
+ var AdpAgentError = class extends Error {
76
+ constructor(message, code) {
77
+ super(message);
78
+ this.name = "AdpAgentError";
79
+ if (code) this.code = code;
80
+ }
81
+ };
44
82
  var AdpAgent = class extends AbstractAgent {
45
83
  constructor(config) {
46
84
  super(config);
47
85
  this.adpConfig = config.adpConfig;
48
86
  this.reqAppClient = axios.create({
49
- baseURL: "https://wss.lke.cloud.tencent.com"
87
+ baseURL: this.adpConfig.request?.baseUrl || "https://wss.lke.cloud.tencent.com"
50
88
  });
51
89
  const LkeClient = lke.v20231130.Client;
52
- const credential = this.adpConfig.credential;
53
90
  this.reqLkeClient = new LkeClient({
54
- credential: credential ? credential : {
55
- secretId: credential?.secretId || process.env.TENCENTCLOUD_SECRETID,
56
- secretKey: credential?.secretKey || process.env.TENCENTCLOUD_SECRETKEY,
57
- token: credential?.token || process.env.TENCENTCLOUD_SESSIONTOKEN
91
+ credential: {
92
+ secretId: this.adpConfig.credential?.secretId || process.env.TENCENTCLOUD_SECRETID,
93
+ secretKey: this.adpConfig.credential?.secretKey || process.env.TENCENTCLOUD_SECRETKEY,
94
+ token: this.adpConfig.credential?.token || process.env.TENCENTCLOUD_SESSIONTOKEN
58
95
  }
59
96
  });
60
97
  }
98
+ generateRequestBody({
99
+ message,
100
+ fileInfos,
101
+ runId,
102
+ threadId,
103
+ forwardedProps
104
+ }) {
105
+ const requestBody = {
106
+ incremental: true,
107
+ stream: "enable",
108
+ ...this.adpConfig.request?.body || {},
109
+ ...forwardedProps || {},
110
+ botAppKey: this.adpConfig.appKey || this.adpConfig.request?.body?.botAppKey || process.env.ADP_APP_KEY,
111
+ visitorBizId: forwardedProps?.visitorBizId || randomUUID(),
112
+ requestId: runId,
113
+ sessionId: threadId || randomUUID(),
114
+ content: message,
115
+ fileInfos
116
+ };
117
+ return requestBody;
118
+ }
119
+ // @ts-ignore
61
120
  run(input) {
62
121
  return new Observable((subscriber) => {
63
122
  this._run(subscriber, input);
@@ -72,14 +131,18 @@ var AdpAgent = class extends AbstractAgent {
72
131
  threadId
73
132
  });
74
133
  if (!this.adpConfig.appKey && !process.env.ADP_APP_KEY) {
75
- throw new Error(
76
- "ADP app key is required, check your env variables or config passed with the adapter"
134
+ throw new AdpAgentError(
135
+ "ADP app key is required, check your env variables or config passed with the adapter",
136
+ "MISSING_APP_KEY"
77
137
  );
78
138
  }
79
139
  const { messages: docExtractedMessages, fileInfos } = await extractDocuments(messages, this.adpConfig, this.reqLkeClient);
80
140
  const { message, trimmed } = convertAGUIMessagesToAdpMessages(docExtractedMessages);
81
141
  if (!message) {
82
- throw new Error("Message content format error, or empty content");
142
+ throw new AdpAgentError(
143
+ "Message content format error, or empty content",
144
+ "INVALID_MESSAGE_CONTENT"
145
+ );
83
146
  }
84
147
  if (trimmed > 0) {
85
148
  subscriber.next({
@@ -90,20 +153,15 @@ var AdpAgent = class extends AbstractAgent {
90
153
  }
91
154
  });
92
155
  }
93
- const requestBody = {
94
- requestId: runId,
95
- content: message,
156
+ const requestBody = this.generateRequestBody({
157
+ message,
96
158
  fileInfos,
97
- botAppKey: this.adpConfig.appKey || process.env.ADP_APP_KEY,
98
- sessionId: threadId,
99
- visitorBizId: forwardedProps?.userId || randomUUID(),
100
- incremental: true,
101
- stream: "enable",
102
- customVariables: forwardedProps?.customVariables || {},
103
- ...this.adpConfig.request
104
- };
159
+ runId,
160
+ threadId,
161
+ forwardedProps
162
+ });
105
163
  const response = await this.reqAppClient.post(
106
- "/v1/qbot/chat/sse",
164
+ this.adpConfig.request?.endpoint || "/v1/qbot/chat/sse",
107
165
  camelToSnakeKeys(requestBody),
108
166
  { responseType: "stream" }
109
167
  );
@@ -131,13 +189,19 @@ var AdpAgent = class extends AbstractAgent {
131
189
  try {
132
190
  data = JSON.parse(event.data);
133
191
  } catch (e) {
134
- throw new Error(`ADP returned invalid data: ${event.data}`);
192
+ throw new AdpAgentError(
193
+ `ADP returned invalid data: ${event.data}`,
194
+ "INVALID_DATA"
195
+ );
135
196
  }
136
197
  switch (data.type) {
137
198
  case "reply": {
138
199
  if (data.payload.is_from_self) {
139
200
  if (data.payload.is_evil) {
140
- throw new Error("Message filtered by ADP");
201
+ throw new AdpAgentError(
202
+ "Message filtered by ADP",
203
+ "FILTERED_MESSAGE"
204
+ );
141
205
  } else {
142
206
  continue;
143
207
  }
@@ -260,12 +324,14 @@ var AdpAgent = class extends AbstractAgent {
260
324
  break;
261
325
  }
262
326
  case "error": {
263
- throw new Error(
264
- `ADP returned error: ${JSON.stringify(data.payload?.error || data.error)}`
327
+ console.error(JSON.stringify(data));
328
+ throw new AdpAgentError(
329
+ data.error.message,
330
+ `ADP_ERROR_${data.error.code}` || "ADP_ERROR_0"
265
331
  );
266
332
  }
267
333
  case "token_stat": {
268
- console.log(JSON.stringify(data, null, 2));
334
+ console.debug(JSON.stringify(data));
269
335
  break;
270
336
  }
271
337
  case "reference": {
@@ -295,9 +361,20 @@ var AdpAgent = class extends AbstractAgent {
295
361
  }
296
362
  subscriber.complete();
297
363
  } catch (e) {
364
+ console.error(JSON.stringify(e));
365
+ let code = "UNKNOWN_ERROR";
366
+ let message = JSON.stringify(e);
367
+ if (e instanceof AxiosError) {
368
+ code = e.code || "REQUEST_ERROR";
369
+ message = e.message;
370
+ } else if (e instanceof AdpAgentError) {
371
+ code = e.code || "AGENT_ERROR";
372
+ message = e.message;
373
+ }
298
374
  subscriber.next({
299
375
  type: EventType.RUN_ERROR,
300
- message: e?.message || JSON.stringify(e)
376
+ code,
377
+ message: `Sorry, an error occurred while running the agent: Error code ${code}, ${message}`
301
378
  });
302
379
  subscriber.complete();
303
380
  }
@@ -363,6 +440,9 @@ async function extractDocuments(messages, config, reqLkeClient) {
363
440
  };
364
441
  }
365
442
  export {
366
- AdpAgent
443
+ AdpAgent,
444
+ AdpAgentError,
445
+ CurrentNodeStatus,
446
+ ReplyMethod
367
447
  };
368
448
  //# sourceMappingURL=index.mjs.map