@voltagent/ag-ui 1.0.2 → 1.0.4
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 +41 -13
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +41 -13
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -69,6 +69,9 @@ var VoltAgentAGUI = class extends import_client.AbstractAgent {
|
|
|
69
69
|
const result = await this.agent.streamText(voltMessages, streamOptions);
|
|
70
70
|
for await (const part of result.fullStream) {
|
|
71
71
|
debugLog("fullStream part", { partType: part.type, id: part.id });
|
|
72
|
+
if ((part.type === "start" || part.type === "start-step") && part.messageId) {
|
|
73
|
+
currentMessageId = part.messageId;
|
|
74
|
+
}
|
|
72
75
|
const events = convertVoltStreamPartToEvents(part, currentMessageId);
|
|
73
76
|
if (!events) continue;
|
|
74
77
|
for (const event of events) {
|
|
@@ -201,16 +204,19 @@ var isAssistantMessage = /* @__PURE__ */ __name((message) => message.role === "a
|
|
|
201
204
|
var isSystemMessage = /* @__PURE__ */ __name((message) => message.role === "system", "isSystemMessage");
|
|
202
205
|
var isDeveloperMessage = /* @__PURE__ */ __name((message) => message.role === "developer", "isDeveloperMessage");
|
|
203
206
|
var isToolMessage = /* @__PURE__ */ __name((message) => message.role === "tool", "isToolMessage");
|
|
207
|
+
var VOLTAGENT_MESSAGE_METADATA_EVENT_NAME = "voltagent.message_metadata";
|
|
204
208
|
function convertAGUIMessagesToVoltMessages(messages) {
|
|
205
209
|
const toolNameById = /* @__PURE__ */ new Map();
|
|
206
|
-
|
|
210
|
+
const convertedMessages = [];
|
|
211
|
+
for (const msg of messages) {
|
|
207
212
|
const messageId = msg.id || generateId();
|
|
208
213
|
if (isUserMessage(msg)) {
|
|
209
|
-
|
|
214
|
+
convertedMessages.push({
|
|
210
215
|
id: messageId,
|
|
211
216
|
role: "user",
|
|
212
217
|
content: extractTextContent(msg.content)
|
|
213
|
-
};
|
|
218
|
+
});
|
|
219
|
+
continue;
|
|
214
220
|
}
|
|
215
221
|
if (isAssistantMessage(msg)) {
|
|
216
222
|
const parts = [];
|
|
@@ -228,22 +234,24 @@ function convertAGUIMessagesToVoltMessages(messages) {
|
|
|
228
234
|
args
|
|
229
235
|
});
|
|
230
236
|
}
|
|
231
|
-
|
|
237
|
+
convertedMessages.push({
|
|
232
238
|
id: messageId,
|
|
233
239
|
role: "assistant",
|
|
234
240
|
parts
|
|
235
|
-
};
|
|
241
|
+
});
|
|
242
|
+
continue;
|
|
236
243
|
}
|
|
237
244
|
if (isSystemMessage(msg) || isDeveloperMessage(msg)) {
|
|
238
|
-
|
|
245
|
+
convertedMessages.push({
|
|
239
246
|
id: messageId,
|
|
240
247
|
role: "system",
|
|
241
248
|
content: msg.content
|
|
242
|
-
};
|
|
249
|
+
});
|
|
250
|
+
continue;
|
|
243
251
|
}
|
|
244
252
|
if (isToolMessage(msg)) {
|
|
245
253
|
const toolName = msg.toolCallId ? toolNameById.get(msg.toolCallId) : void 0;
|
|
246
|
-
|
|
254
|
+
convertedMessages.push({
|
|
247
255
|
id: messageId,
|
|
248
256
|
role: "tool",
|
|
249
257
|
parts: [
|
|
@@ -254,14 +262,16 @@ function convertAGUIMessagesToVoltMessages(messages) {
|
|
|
254
262
|
output: safelyParseJson(msg.content)
|
|
255
263
|
}
|
|
256
264
|
]
|
|
257
|
-
};
|
|
265
|
+
});
|
|
266
|
+
continue;
|
|
258
267
|
}
|
|
259
|
-
|
|
268
|
+
convertedMessages.push({
|
|
260
269
|
id: messageId,
|
|
261
270
|
role: "assistant",
|
|
262
271
|
parts: [{ type: "text", text: (0, import_utils.safeStringify)(msg.content ?? "") }]
|
|
263
|
-
};
|
|
264
|
-
}
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
return convertedMessages;
|
|
265
275
|
}
|
|
266
276
|
__name(convertAGUIMessagesToVoltMessages, "convertAGUIMessagesToVoltMessages");
|
|
267
277
|
function extractTextContent(content) {
|
|
@@ -286,15 +296,33 @@ function safelyParseJson(value) {
|
|
|
286
296
|
__name(safelyParseJson, "safelyParseJson");
|
|
287
297
|
function convertVoltStreamPartToEvents(part, fallbackMessageId) {
|
|
288
298
|
const payload = part.payload ?? part;
|
|
299
|
+
const partType = part.type;
|
|
300
|
+
if (partType === "message-metadata") {
|
|
301
|
+
const messageId = part.messageId ?? payload.messageId ?? fallbackMessageId;
|
|
302
|
+
const messageMetadata = payload.messageMetadata ?? payload.metadata;
|
|
303
|
+
if (!messageMetadata || typeof messageMetadata !== "object") {
|
|
304
|
+
return null;
|
|
305
|
+
}
|
|
306
|
+
const customEvent = {
|
|
307
|
+
type: import_core.EventType.CUSTOM,
|
|
308
|
+
name: VOLTAGENT_MESSAGE_METADATA_EVENT_NAME,
|
|
309
|
+
value: {
|
|
310
|
+
messageId: messageId || void 0,
|
|
311
|
+
metadata: messageMetadata
|
|
312
|
+
}
|
|
313
|
+
};
|
|
314
|
+
return [customEvent];
|
|
315
|
+
}
|
|
289
316
|
switch (part.type) {
|
|
290
317
|
case "text-start": {
|
|
291
318
|
return null;
|
|
292
319
|
}
|
|
293
320
|
case "text-delta": {
|
|
321
|
+
const messageId = part.messageId ?? fallbackMessageId;
|
|
294
322
|
const event = {
|
|
295
323
|
type: import_core.EventType.TEXT_MESSAGE_CHUNK,
|
|
296
324
|
delta: part.text ?? "",
|
|
297
|
-
messageId
|
|
325
|
+
messageId,
|
|
298
326
|
role: "assistant"
|
|
299
327
|
};
|
|
300
328
|
return [event];
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/voltagent-agent.ts","../src/copilotkit.ts"],"sourcesContent":["export { VoltAgentAGUI, createVoltAgentAGUI } from \"./voltagent-agent\";\nexport {\n createCopilotKitHandler,\n registerCopilotKitRoutes,\n type CopilotKitHandlerOptions,\n type RegisterCopilotKitRoutesOptions,\n} from \"./copilotkit\";\n","import { AbstractAgent } from \"@ag-ui/client\";\nimport type {\n AssistantMessage,\n BaseEvent,\n DeveloperMessage,\n Message,\n RunAgentInput,\n RunErrorEvent,\n RunFinishedEvent,\n RunStartedEvent,\n StateSnapshotEvent,\n SystemMessage,\n TextMessageChunkEvent,\n TextMessageEndEvent,\n TextMessageStartEvent,\n ToolCallArgsEvent,\n ToolCallEndEvent,\n ToolCallResultEvent,\n ToolCallStartEvent,\n ToolMessage,\n UserMessage,\n} from \"@ag-ui/core\";\nimport { EventType } from \"@ag-ui/core\";\nimport type { StreamTextOptions, VoltAgentTextStreamPart } from \"@voltagent/core\";\nimport type { Agent } from \"@voltagent/core\";\nimport { safeStringify } from \"@voltagent/internal/utils\";\nimport { Observable } from \"rxjs\";\n\ntype AGUIContextValue = {\n state?: Record<string, unknown>;\n context?: RunAgentInput[\"context\"];\n forwardedProps?: RunAgentInput[\"forwardedProps\"];\n};\n\ntype VoltAgentAGUIConfig = {\n agent: Agent;\n /**\n * Optional function to derive userId for VoltAgent memory/telemetry.\n */\n deriveUserId?: (input: RunAgentInput) => string | undefined;\n};\n\nfunction debugLog(message: string, data?: Record<string, unknown>) {\n // eslint-disable-next-line no-console\n console.log(`[VoltAgentAGUI] ${message}`, data ?? {});\n}\n\n/**\n * VoltAgent adapter that speaks the AG-UI protocol.\n * and stream VoltAgent events as AG-UI BaseEvents.\n */\nexport class VoltAgentAGUI extends AbstractAgent {\n private readonly agent: Agent;\n private readonly deriveUserId?: VoltAgentAGUIConfig[\"deriveUserId\"];\n\n constructor(config: VoltAgentAGUIConfig) {\n super();\n this.agent = config.agent;\n this.deriveUserId = config.deriveUserId;\n }\n\n run(input: RunAgentInput): ReturnType<AbstractAgent[\"run\"]> {\n const stream$ = new Observable<BaseEvent>((subscriber) => {\n const abortController = new AbortController();\n let finishedSent = false;\n debugLog(\"run start\", { threadId: input.threadId, runId: input.runId });\n const runStarted: RunStartedEvent = {\n type: EventType.RUN_STARTED,\n threadId: input.threadId,\n runId: input.runId,\n };\n subscriber.next(runStarted);\n\n const run = async () => {\n let currentMessageId = generateId();\n\n try {\n await this.persistStateToWorkingMemory(input);\n\n const streamOptions = this.buildStreamOptions(input, abortController);\n const voltMessages = convertAGUIMessagesToVoltMessages(input.messages);\n\n debugLog(\"calling agent.streamText\", { messagesLength: voltMessages.length });\n const result = await this.agent.streamText(voltMessages as any, streamOptions);\n\n for await (const part of result.fullStream) {\n debugLog(\"fullStream part\", { partType: part.type, id: (part as any).id });\n const events = convertVoltStreamPartToEvents(part, currentMessageId);\n if (!events) continue;\n\n for (const event of events) {\n debugLog(\"emit event\", { type: event.type, messageId: (event as any).messageId });\n\n subscriber.next(event);\n if (\n (event.type === EventType.TEXT_MESSAGE_START ||\n event.type === EventType.TEXT_MESSAGE_CHUNK ||\n event.type === EventType.TEXT_MESSAGE_END) &&\n \"messageId\" in event &&\n event.messageId\n ) {\n currentMessageId = event.messageId;\n }\n }\n }\n\n const snapshotEvent = await this.readWorkingMemorySnapshot(input);\n if (snapshotEvent) {\n subscriber.next(snapshotEvent);\n }\n\n const finished: RunFinishedEvent = {\n type: EventType.RUN_FINISHED,\n threadId: input.threadId,\n runId: input.runId,\n };\n subscriber.next(finished);\n finishedSent = true;\n subscriber.complete();\n debugLog(\"run finished\", { threadId: input.threadId, runId: input.runId });\n } catch (error) {\n debugLog(\"run error\", {\n threadId: input.threadId,\n runId: input.runId,\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n });\n\n // Make sure any partial text messages are closed before finishing\n const runError: RunErrorEvent = {\n type: EventType.RUN_ERROR,\n message: error instanceof Error ? error.message : \"Unknown error\",\n };\n subscriber.next(runError);\n const finished: RunFinishedEvent = {\n type: EventType.RUN_FINISHED,\n threadId: input.threadId,\n runId: input.runId,\n };\n subscriber.next(finished);\n finishedSent = true;\n subscriber.complete();\n }\n };\n\n void run();\n\n return () => {\n debugLog(\"run abort/unsubscribe\", {\n threadId: input.threadId,\n runId: input.runId,\n finishedSent,\n });\n abortController.abort();\n if (!finishedSent) {\n const finished: RunFinishedEvent = {\n type: EventType.RUN_FINISHED,\n threadId: input.threadId,\n runId: input.runId,\n };\n subscriber.next(finished);\n finishedSent = true;\n subscriber.complete();\n }\n };\n });\n\n // Cast through unknown to avoid rxjs type mismatches across hoisted versions\n return stream$ as unknown as ReturnType<AbstractAgent[\"run\"]>;\n }\n\n private buildStreamOptions(\n input: RunAgentInput,\n abortController: AbortController,\n ): StreamTextOptions {\n const context = new Map<string, unknown>();\n const aguiContext: AGUIContextValue = {\n state: (input.state as Record<string, unknown>) || undefined,\n context: input.context,\n forwardedProps: input.forwardedProps,\n };\n\n context.set(\"agui:context\", aguiContext);\n\n return {\n abortSignal: abortController.signal,\n conversationId: input.threadId,\n userId: this.deriveUserId?.(input),\n context,\n };\n }\n\n private async persistStateToWorkingMemory(input: RunAgentInput): Promise<void> {\n const state = input.state;\n if (!state || typeof state !== \"object\" || Object.keys(state).length === 0) {\n return;\n }\n\n const memory = this.agent.getMemory?.();\n if (!memory) {\n return;\n }\n\n try {\n await memory.updateWorkingMemory({\n conversationId: input.threadId,\n content: safeStringify(state),\n });\n } catch (error) {\n // Non-fatal: working memory might be disabled or misconfigured\n console.debug?.(\"Failed to persist AG-UI state to working memory\", error);\n }\n }\n\n private async readWorkingMemorySnapshot(\n input: RunAgentInput,\n ): Promise<StateSnapshotEvent | undefined> {\n const memory = this.agent.getMemory?.();\n if (!memory) {\n return;\n }\n\n try {\n const raw = await memory.getWorkingMemory({\n conversationId: input.threadId,\n });\n\n if (!raw) {\n return;\n }\n\n let snapshot: unknown = raw;\n try {\n snapshot = JSON.parse(raw);\n } catch {\n // keep raw string\n }\n\n return {\n type: EventType.STATE_SNAPSHOT,\n snapshot,\n };\n } catch (error) {\n console.debug?.(\"Failed to read AG-UI working memory snapshot\", error);\n return;\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Message conversion helpers\n// ---------------------------------------------------------------------------\n\nconst isUserMessage = (message: Message): message is UserMessage => message.role === \"user\";\nconst isAssistantMessage = (message: Message): message is AssistantMessage =>\n message.role === \"assistant\";\nconst isSystemMessage = (message: Message): message is SystemMessage => message.role === \"system\";\nconst isDeveloperMessage = (message: Message): message is DeveloperMessage =>\n message.role === \"developer\";\nconst isToolMessage = (message: Message): message is ToolMessage => message.role === \"tool\";\n\ntype VoltUIPart =\n | { type: \"text\"; text: string }\n | { type: \"tool-call\"; toolCallId: string; toolName: string; args?: unknown }\n | { type: \"tool-result\"; toolCallId?: string; toolName?: string; output?: unknown };\n\ntype VoltUIMessage = {\n id: string;\n role: \"user\" | \"assistant\" | \"system\" | \"tool\";\n content?: string;\n parts?: VoltUIPart[];\n};\n\nfunction convertAGUIMessagesToVoltMessages(messages: Message[]): VoltUIMessage[] {\n const toolNameById = new Map<string, string>();\n\n return messages.map((msg) => {\n const messageId = msg.id || generateId();\n\n if (isUserMessage(msg)) {\n return {\n id: messageId,\n role: \"user\",\n content: extractTextContent(msg.content),\n };\n }\n\n if (isAssistantMessage(msg)) {\n const parts: VoltUIPart[] = [];\n const textContent = msg.content ? extractTextContent(msg.content) : \"\";\n if (textContent) {\n parts.push({ type: \"text\", text: textContent });\n }\n\n for (const call of msg.toolCalls ?? []) {\n const args = safelyParseJson(call.function.arguments);\n toolNameById.set(call.id, call.function.name);\n parts.push({\n type: \"tool-call\",\n toolCallId: call.id,\n toolName: call.function.name,\n args,\n });\n }\n\n return {\n id: messageId,\n role: \"assistant\",\n parts,\n };\n }\n\n if (isSystemMessage(msg) || isDeveloperMessage(msg)) {\n return {\n id: messageId,\n role: \"system\",\n content: msg.content,\n };\n }\n\n if (isToolMessage(msg)) {\n const toolName = msg.toolCallId ? toolNameById.get(msg.toolCallId) : undefined;\n return {\n id: messageId,\n role: \"tool\",\n parts: [\n {\n type: \"tool-result\",\n toolCallId: msg.toolCallId,\n toolName: toolName ?? \"tool\",\n output: safelyParseJson(msg.content),\n },\n ],\n };\n }\n\n // activity or any other custom role -> fold into assistant text\n return {\n id: messageId,\n role: \"assistant\",\n parts: [{ type: \"text\", text: safeStringify((msg as any).content ?? \"\") }],\n };\n });\n}\n\nfunction extractTextContent(content: UserMessage[\"content\"] | AssistantMessage[\"content\"]): string {\n if (!content) return \"\";\n if (typeof content === \"string\") return content;\n if (!Array.isArray(content)) return \"\";\n\n const parts = content as Array<Record<string, unknown>>;\n\n return parts\n .map((part: Record<string, unknown>) => {\n const textValue = typeof part.text === \"string\" ? (part.text as string) : \"\";\n return textValue;\n })\n .filter((text: string) => text.length > 0)\n .join(\"\\n\");\n}\n\nfunction safelyParseJson(value: string | unknown): unknown {\n if (typeof value !== \"string\") return value;\n try {\n return JSON.parse(value);\n } catch {\n return value;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Stream conversion helpers\n// ---------------------------------------------------------------------------\n\ntype StreamConversionResult =\n | TextMessageStartEvent\n | TextMessageChunkEvent\n | TextMessageEndEvent\n | ToolCallStartEvent\n | ToolCallEndEvent\n | ToolCallArgsEvent\n | ToolCallResultEvent;\n\nfunction convertVoltStreamPartToEvents(\n part: VoltAgentTextStreamPart,\n fallbackMessageId: string,\n): StreamConversionResult[] | null {\n const payload = (part as { payload?: Record<string, unknown> }).payload ?? part;\n\n switch (part.type) {\n case \"text-start\": {\n // Ignore explicit start; we'll synthesize start when first chunk/end arrives to avoid duplicates\n return null;\n }\n case \"text-delta\": {\n const event: TextMessageChunkEvent = {\n type: EventType.TEXT_MESSAGE_CHUNK,\n delta: part.text ?? \"\",\n messageId: part.id ?? fallbackMessageId,\n role: \"assistant\",\n };\n return [event];\n }\n case \"text-end\": {\n // Let transformChunks close the message; avoid emitting END without a START\n return null;\n }\n case \"tool-call\": {\n const toolCallId = (payload as { toolCallId?: string }).toolCallId ?? generateId();\n const toolName = (payload as { toolName?: string }).toolName ?? \"tool\";\n const rawArgs =\n (payload as { args?: unknown }).args ??\n (payload as { input?: unknown }).input ??\n (payload as { arguments?: unknown }).arguments;\n const argsEvent: ToolCallArgsEvent = {\n type: EventType.TOOL_CALL_ARGS,\n toolCallId,\n delta: safeStringify(rawArgs ?? {}),\n };\n const startEvent: ToolCallStartEvent = {\n type: EventType.TOOL_CALL_START,\n toolCallId,\n toolCallName: toolName,\n parentMessageId: fallbackMessageId,\n };\n const endEvent: ToolCallEndEvent = {\n type: EventType.TOOL_CALL_END,\n toolCallId,\n };\n return [startEvent, argsEvent, endEvent];\n }\n case \"tool-result\": {\n const rawResult =\n (payload as { result?: unknown }).result ??\n (payload as { output?: unknown }).output ??\n (payload as { data?: unknown }).data ??\n payload;\n const resultEvent: ToolCallResultEvent = {\n type: EventType.TOOL_CALL_RESULT,\n toolCallId: (payload as { toolCallId?: string }).toolCallId ?? generateId(),\n content: safeStringify(rawResult ?? {}),\n messageId: generateId(),\n role: \"tool\",\n };\n return [resultEvent];\n }\n case \"error\": {\n const errorEvent: TextMessageChunkEvent = {\n type: EventType.TEXT_MESSAGE_CHUNK,\n delta: `Error: ${(payload as { error?: unknown }).error}`,\n messageId: fallbackMessageId,\n role: \"assistant\",\n };\n return [errorEvent];\n }\n default:\n return null;\n }\n}\n\nexport function createVoltAgentAGUI(config: VoltAgentAGUIConfig): VoltAgentAGUI {\n return new VoltAgentAGUI(config);\n}\n\nfunction generateId(): string {\n const cryptoApi = typeof globalThis !== \"undefined\" ? (globalThis as any).crypto : undefined;\n if (cryptoApi && typeof cryptoApi.randomUUID === \"function\") {\n return cryptoApi.randomUUID();\n }\n\n const random = () => Math.floor(Math.random() * 0xffff);\n let uuid = \"\";\n uuid += random().toString(16).padStart(4, \"0\");\n uuid += random().toString(16).padStart(4, \"0\");\n uuid += \"-\";\n uuid += random().toString(16).padStart(4, \"0\");\n uuid += \"-\";\n uuid += ((random() & 0x0fff) | 0x4000).toString(16).padStart(4, \"0\");\n uuid += \"-\";\n uuid += ((random() & 0x3fff) | 0x8000).toString(16).padStart(4, \"0\");\n uuid += \"-\";\n uuid += random().toString(16).padStart(4, \"0\");\n uuid += random().toString(16).padStart(4, \"0\");\n uuid += random().toString(16).padStart(4, \"0\");\n return uuid;\n}\n","import { AbstractAgent } from \"@ag-ui/client\";\nimport type { RunAgentInput } from \"@ag-ui/core\";\nimport {\n CopilotRuntime,\n type CopilotServiceAdapter,\n ExperimentalEmptyAdapter,\n copilotRuntimeNextJSAppRouterEndpoint,\n} from \"@copilotkit/runtime\";\nimport type { Agent } from \"@voltagent/core\";\nimport { AgentRegistry } from \"@voltagent/core\";\nimport { createVoltAgentAGUI } from \"./voltagent-agent\";\n\nexport type CopilotKitHandlerOptions = {\n /**\n * Static map of AG-UI agents. Use either this or `loadAgents`.\n */\n agents?: Record<string, AbstractAgent>;\n /**\n * Lazy loader for AG-UI agents. If provided, it overrides `agents`.\n */\n loadAgents?: () => Promise<Record<string, AbstractAgent>> | Record<string, AbstractAgent>;\n /**\n * Optional service adapter. Defaults to ExperimentalEmptyAdapter.\n */\n serviceAdapter?: CopilotServiceAdapter;\n /**\n * Endpoint path used by CopilotKit clients. Defaults to \"/copilotkit\".\n */\n endpoint?: string;\n};\n\nexport type RegisterCopilotKitRoutesOptions = {\n /**\n * Hono-style app instance with `all(path, handler)` support.\n */\n app: {\n all: (path: string, handler: (c: any) => any) => any;\n post?: (path: string, handler: (c: any) => any) => any;\n };\n /**\n * VoltAgent agents to expose to CopilotKit. Will be wrapped lazily.\n */\n agents?: Record<string, Agent>;\n /**\n * Optional resource IDs to pick from the global AgentRegistry if `agents` is not provided.\n * If omitted and no agents are provided, all registered agents will be exposed.\n */\n resourceIds?: string[];\n /**\n * Path to mount CopilotKit endpoint. Defaults to \"/copilotkit\".\n */\n path?: string;\n};\n\n/**\n * Create a framework-agnostic fetch handler for CopilotKit that serves VoltAgent-backed AG-UI agents.\n *\n * @example\n * ```ts\n * import { createCopilotKitHandler } from \"@voltagent/ag-ui\";\n * import { createVoltAgentAGUI } from \"@voltagent/ag-ui\";\n * import { agent } from \"./agent\"; // VoltAgent instance\n *\n * const handler = createCopilotKitHandler({\n * agents: { assistant: createVoltAgentAGUI({ agent }) },\n * endpoint: \"/api/copilotkit\",\n * });\n *\n * export default {\n * fetch: handler,\n * };\n * ```\n */\nexport function createCopilotKitHandler(options: CopilotKitHandlerOptions) {\n const endpoint = options.endpoint ?? \"/copilotkit\";\n const serviceAdapter = options.serviceAdapter ?? new ExperimentalEmptyAdapter();\n\n return async (req: Request): Promise<Response> => {\n // We intentionally avoid logging request bodies to keep the handler silent in production.\n await req\n .clone()\n .text()\n .catch(() => undefined);\n\n const agents =\n (await options.loadAgents?.()) ??\n options.agents ??\n (() => {\n throw new Error(\"No agents provided to CopilotKit handler\");\n })();\n\n // Lightweight wrapper to add per-run/connect logging without touching the original agents\n const wrappedAgents: Record<string, AbstractAgent> = {};\n for (const [id, agent] of Object.entries(agents)) {\n wrappedAgents[id] = new (class extends AbstractAgent {\n run(input: RunAgentInput) {\n console.log(\"[CopilotKit] agent.run\", {\n agentId: id,\n threadId: input.threadId,\n runId: input.runId,\n });\n return (agent as AbstractAgent).run(input);\n }\n // Forward connect if the agent implements it\n connect(input: RunAgentInput) {\n console.log(\"[CopilotKit] agent.connect\", {\n agentId: id,\n threadId: input.threadId,\n runId: input.runId,\n });\n return (agent as any).connect?.(input);\n }\n clone() {\n return this;\n }\n })();\n }\n\n const runtime = new CopilotRuntime({ agents: wrappedAgents });\n\n const { handleRequest } = copilotRuntimeNextJSAppRouterEndpoint({\n runtime,\n serviceAdapter,\n endpoint,\n });\n\n let response: Response;\n try {\n response = await handleRequest(req);\n } catch (error) {\n console.error(\"[CopilotKit] handler failed\", {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n });\n throw error;\n }\n return response;\n };\n}\n\n/**\n * Convenience helper: register CopilotKit routes on a Hono-like app using VoltAgent agents.\n */\nexport function registerCopilotKitRoutes(options: RegisterCopilotKitRoutesOptions) {\n const path = options.path ?? \"/copilotkit\";\n const resolveAgents = (): Record<string, Agent> => {\n if (options.agents) return options.agents;\n const registry = AgentRegistry.getInstance();\n const ids = options.resourceIds;\n if (ids && ids.length > 0) {\n return Object.fromEntries(\n ids\n .map((id) => {\n const agent = registry.getAgent(id);\n return agent ? [id, agent] : undefined;\n })\n .filter(Boolean) as [string, Agent][],\n );\n }\n return Object.fromEntries(registry.getAllAgents().map((agent) => [agent.id, agent]));\n };\n\n const handler = createCopilotKitHandler({\n loadAgents: () =>\n Object.fromEntries(\n Object.entries(resolveAgents()).map(([id, agent]) => [id, createVoltAgentAGUI({ agent })]),\n ),\n endpoint: path,\n });\n\n const routeHandler = async (c: any) => {\n const method = c.req?.method;\n if (method && method !== \"POST\") {\n return c.json?.({ success: false, error: \"Use POST with CopilotKit runtime requests.\" }, 405);\n }\n\n try {\n return await handler(c.req?.raw ?? c.request ?? c);\n } catch (error) {\n console.error(\"[copilotkit] handler error\", error);\n return c.json?.(\n { success: false, error: \"CopilotKit handler failed\", detail: `${error}` },\n 500,\n );\n }\n };\n\n const register = (p: string) => {\n if (typeof options.app.post === \"function\") {\n options.app.post(p, routeHandler);\n } else {\n options.app.all(p, routeHandler);\n }\n };\n\n [path, `${path}/*`].forEach(register);\n // Deliberately no return; route registration side-effect only\n}\n"],"mappings":"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","names":["import_client","import_runtime","import_core"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/voltagent-agent.ts","../src/copilotkit.ts"],"sourcesContent":["export { VoltAgentAGUI, createVoltAgentAGUI } from \"./voltagent-agent\";\nexport {\n createCopilotKitHandler,\n registerCopilotKitRoutes,\n type CopilotKitHandlerOptions,\n type RegisterCopilotKitRoutesOptions,\n} from \"./copilotkit\";\n","import { AbstractAgent } from \"@ag-ui/client\";\nimport type {\n AssistantMessage,\n BaseEvent,\n CustomEvent,\n DeveloperMessage,\n Message,\n RunAgentInput,\n RunErrorEvent,\n RunFinishedEvent,\n RunStartedEvent,\n StateSnapshotEvent,\n SystemMessage,\n TextMessageChunkEvent,\n TextMessageEndEvent,\n TextMessageStartEvent,\n ToolCallArgsEvent,\n ToolCallEndEvent,\n ToolCallResultEvent,\n ToolCallStartEvent,\n ToolMessage,\n UserMessage,\n} from \"@ag-ui/core\";\nimport { EventType } from \"@ag-ui/core\";\nimport type { StreamTextOptions, VoltAgentTextStreamPart } from \"@voltagent/core\";\nimport type { Agent } from \"@voltagent/core\";\nimport { safeStringify } from \"@voltagent/internal/utils\";\nimport { Observable } from \"rxjs\";\n\ntype AGUIContextValue = {\n state?: Record<string, unknown>;\n context?: RunAgentInput[\"context\"];\n forwardedProps?: RunAgentInput[\"forwardedProps\"];\n};\n\ntype VoltAgentAGUIConfig = {\n agent: Agent;\n /**\n * Optional function to derive userId for VoltAgent memory/telemetry.\n */\n deriveUserId?: (input: RunAgentInput) => string | undefined;\n};\n\nfunction debugLog(message: string, data?: Record<string, unknown>) {\n // eslint-disable-next-line no-console\n console.log(`[VoltAgentAGUI] ${message}`, data ?? {});\n}\n\n/**\n * VoltAgent adapter that speaks the AG-UI protocol.\n * and stream VoltAgent events as AG-UI BaseEvents.\n */\nexport class VoltAgentAGUI extends AbstractAgent {\n private readonly agent: Agent;\n private readonly deriveUserId?: VoltAgentAGUIConfig[\"deriveUserId\"];\n\n constructor(config: VoltAgentAGUIConfig) {\n super();\n this.agent = config.agent;\n this.deriveUserId = config.deriveUserId;\n }\n\n run(input: RunAgentInput): ReturnType<AbstractAgent[\"run\"]> {\n const stream$ = new Observable<BaseEvent>((subscriber) => {\n const abortController = new AbortController();\n let finishedSent = false;\n debugLog(\"run start\", { threadId: input.threadId, runId: input.runId });\n const runStarted: RunStartedEvent = {\n type: EventType.RUN_STARTED,\n threadId: input.threadId,\n runId: input.runId,\n };\n subscriber.next(runStarted);\n\n const run = async () => {\n let currentMessageId = generateId();\n\n try {\n await this.persistStateToWorkingMemory(input);\n\n const streamOptions = this.buildStreamOptions(input, abortController);\n const voltMessages = convertAGUIMessagesToVoltMessages(input.messages);\n\n debugLog(\"calling agent.streamText\", { messagesLength: voltMessages.length });\n const result = await this.agent.streamText(voltMessages as any, streamOptions);\n\n for await (const part of result.fullStream) {\n debugLog(\"fullStream part\", { partType: part.type, id: (part as any).id });\n if ((part.type === \"start\" || part.type === \"start-step\") && part.messageId) {\n currentMessageId = part.messageId;\n }\n const events = convertVoltStreamPartToEvents(part, currentMessageId);\n if (!events) continue;\n\n for (const event of events) {\n debugLog(\"emit event\", { type: event.type, messageId: (event as any).messageId });\n\n subscriber.next(event);\n if (\n (event.type === EventType.TEXT_MESSAGE_START ||\n event.type === EventType.TEXT_MESSAGE_CHUNK ||\n event.type === EventType.TEXT_MESSAGE_END) &&\n \"messageId\" in event &&\n event.messageId\n ) {\n currentMessageId = event.messageId;\n }\n }\n }\n\n const snapshotEvent = await this.readWorkingMemorySnapshot(input);\n if (snapshotEvent) {\n subscriber.next(snapshotEvent);\n }\n\n const finished: RunFinishedEvent = {\n type: EventType.RUN_FINISHED,\n threadId: input.threadId,\n runId: input.runId,\n };\n subscriber.next(finished);\n finishedSent = true;\n subscriber.complete();\n debugLog(\"run finished\", { threadId: input.threadId, runId: input.runId });\n } catch (error) {\n debugLog(\"run error\", {\n threadId: input.threadId,\n runId: input.runId,\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n });\n\n // Make sure any partial text messages are closed before finishing\n const runError: RunErrorEvent = {\n type: EventType.RUN_ERROR,\n message: error instanceof Error ? error.message : \"Unknown error\",\n };\n subscriber.next(runError);\n const finished: RunFinishedEvent = {\n type: EventType.RUN_FINISHED,\n threadId: input.threadId,\n runId: input.runId,\n };\n subscriber.next(finished);\n finishedSent = true;\n subscriber.complete();\n }\n };\n\n void run();\n\n return () => {\n debugLog(\"run abort/unsubscribe\", {\n threadId: input.threadId,\n runId: input.runId,\n finishedSent,\n });\n abortController.abort();\n if (!finishedSent) {\n const finished: RunFinishedEvent = {\n type: EventType.RUN_FINISHED,\n threadId: input.threadId,\n runId: input.runId,\n };\n subscriber.next(finished);\n finishedSent = true;\n subscriber.complete();\n }\n };\n });\n\n // Cast through unknown to avoid rxjs type mismatches across hoisted versions\n return stream$ as unknown as ReturnType<AbstractAgent[\"run\"]>;\n }\n\n private buildStreamOptions(\n input: RunAgentInput,\n abortController: AbortController,\n ): StreamTextOptions {\n const context = new Map<string, unknown>();\n const aguiContext: AGUIContextValue = {\n state: (input.state as Record<string, unknown>) || undefined,\n context: input.context,\n forwardedProps: input.forwardedProps,\n };\n\n context.set(\"agui:context\", aguiContext);\n\n return {\n abortSignal: abortController.signal,\n conversationId: input.threadId,\n userId: this.deriveUserId?.(input),\n context,\n };\n }\n\n private async persistStateToWorkingMemory(input: RunAgentInput): Promise<void> {\n const state = input.state;\n if (!state || typeof state !== \"object\" || Object.keys(state).length === 0) {\n return;\n }\n\n const memory = this.agent.getMemory?.();\n if (!memory) {\n return;\n }\n\n try {\n await memory.updateWorkingMemory({\n conversationId: input.threadId,\n content: safeStringify(state),\n });\n } catch (error) {\n // Non-fatal: working memory might be disabled or misconfigured\n console.debug?.(\"Failed to persist AG-UI state to working memory\", error);\n }\n }\n\n private async readWorkingMemorySnapshot(\n input: RunAgentInput,\n ): Promise<StateSnapshotEvent | undefined> {\n const memory = this.agent.getMemory?.();\n if (!memory) {\n return;\n }\n\n try {\n const raw = await memory.getWorkingMemory({\n conversationId: input.threadId,\n });\n\n if (!raw) {\n return;\n }\n\n let snapshot: unknown = raw;\n try {\n snapshot = JSON.parse(raw);\n } catch {\n // keep raw string\n }\n\n return {\n type: EventType.STATE_SNAPSHOT,\n snapshot,\n };\n } catch (error) {\n console.debug?.(\"Failed to read AG-UI working memory snapshot\", error);\n return;\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Message conversion helpers\n// ---------------------------------------------------------------------------\n\nconst isUserMessage = (message: Message): message is UserMessage => message.role === \"user\";\nconst isAssistantMessage = (message: Message): message is AssistantMessage =>\n message.role === \"assistant\";\nconst isSystemMessage = (message: Message): message is SystemMessage => message.role === \"system\";\nconst isDeveloperMessage = (message: Message): message is DeveloperMessage =>\n message.role === \"developer\";\nconst isToolMessage = (message: Message): message is ToolMessage => message.role === \"tool\";\n\ntype VoltUIPart =\n | { type: \"text\"; text: string }\n | { type: \"tool-call\"; toolCallId: string; toolName: string; args?: unknown }\n | { type: \"tool-result\"; toolCallId?: string; toolName?: string; output?: unknown };\n\ntype VoltUIMessage = {\n id: string;\n role: \"user\" | \"assistant\" | \"system\" | \"tool\";\n content?: string;\n parts?: VoltUIPart[];\n};\n\nconst VOLTAGENT_MESSAGE_METADATA_EVENT_NAME = \"voltagent.message_metadata\";\nfunction convertAGUIMessagesToVoltMessages(messages: Message[]): VoltUIMessage[] {\n const toolNameById = new Map<string, string>();\n const convertedMessages: VoltUIMessage[] = [];\n\n for (const msg of messages) {\n const messageId = msg.id || generateId();\n\n if (isUserMessage(msg)) {\n convertedMessages.push({\n id: messageId,\n role: \"user\",\n content: extractTextContent(msg.content),\n });\n continue;\n }\n\n if (isAssistantMessage(msg)) {\n const parts: VoltUIPart[] = [];\n const textContent = msg.content ? extractTextContent(msg.content) : \"\";\n if (textContent) {\n parts.push({ type: \"text\", text: textContent });\n }\n\n for (const call of msg.toolCalls ?? []) {\n const args = safelyParseJson(call.function.arguments);\n toolNameById.set(call.id, call.function.name);\n parts.push({\n type: \"tool-call\",\n toolCallId: call.id,\n toolName: call.function.name,\n args,\n });\n }\n\n convertedMessages.push({\n id: messageId,\n role: \"assistant\",\n parts,\n });\n continue;\n }\n\n if (isSystemMessage(msg) || isDeveloperMessage(msg)) {\n convertedMessages.push({\n id: messageId,\n role: \"system\",\n content: msg.content,\n });\n continue;\n }\n\n if (isToolMessage(msg)) {\n const toolName = msg.toolCallId ? toolNameById.get(msg.toolCallId) : undefined;\n convertedMessages.push({\n id: messageId,\n role: \"tool\",\n parts: [\n {\n type: \"tool-result\",\n toolCallId: msg.toolCallId,\n toolName: toolName ?? \"tool\",\n output: safelyParseJson(msg.content),\n },\n ],\n });\n continue;\n }\n\n // activity or any other custom role -> fold into assistant text\n convertedMessages.push({\n id: messageId,\n role: \"assistant\",\n parts: [{ type: \"text\", text: safeStringify((msg as any).content ?? \"\") }],\n });\n }\n\n return convertedMessages;\n}\n\nfunction extractTextContent(content: UserMessage[\"content\"] | AssistantMessage[\"content\"]): string {\n if (!content) return \"\";\n if (typeof content === \"string\") return content;\n if (!Array.isArray(content)) return \"\";\n\n const parts = content as Array<Record<string, unknown>>;\n\n return parts\n .map((part: Record<string, unknown>) => {\n const textValue = typeof part.text === \"string\" ? (part.text as string) : \"\";\n return textValue;\n })\n .filter((text: string) => text.length > 0)\n .join(\"\\n\");\n}\n\nfunction safelyParseJson(value: string | unknown): unknown {\n if (typeof value !== \"string\") return value;\n try {\n return JSON.parse(value);\n } catch {\n return value;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Stream conversion helpers\n// ---------------------------------------------------------------------------\n\ntype StreamConversionResult =\n | TextMessageStartEvent\n | TextMessageChunkEvent\n | TextMessageEndEvent\n | CustomEvent\n | ToolCallStartEvent\n | ToolCallEndEvent\n | ToolCallArgsEvent\n | ToolCallResultEvent;\n\nfunction convertVoltStreamPartToEvents(\n part: VoltAgentTextStreamPart,\n fallbackMessageId: string,\n): StreamConversionResult[] | null {\n const payload = (part as { payload?: Record<string, unknown> }).payload ?? part;\n const partType = (part as { type: string }).type;\n\n if (partType === \"message-metadata\") {\n const messageId =\n (part as { messageId?: string }).messageId ??\n (payload as { messageId?: string }).messageId ??\n fallbackMessageId;\n const messageMetadata =\n (payload as { messageMetadata?: unknown }).messageMetadata ??\n (payload as { metadata?: unknown }).metadata;\n\n if (!messageMetadata || typeof messageMetadata !== \"object\") {\n return null;\n }\n\n // Best-practice carrier for app-specific metadata on AG-UI streams.\n const customEvent: CustomEvent = {\n type: EventType.CUSTOM,\n name: VOLTAGENT_MESSAGE_METADATA_EVENT_NAME,\n value: {\n messageId: messageId || undefined,\n metadata: messageMetadata,\n },\n };\n\n return [customEvent];\n }\n\n switch (part.type) {\n case \"text-start\": {\n // Ignore explicit start; we'll synthesize start when first chunk/end arrives to avoid duplicates\n return null;\n }\n case \"text-delta\": {\n const messageId = part.messageId ?? fallbackMessageId;\n const event: TextMessageChunkEvent = {\n type: EventType.TEXT_MESSAGE_CHUNK,\n delta: part.text ?? \"\",\n messageId,\n role: \"assistant\",\n };\n return [event];\n }\n case \"text-end\": {\n // Let transformChunks close the message; avoid emitting END without a START\n return null;\n }\n case \"tool-call\": {\n const toolCallId = (payload as { toolCallId?: string }).toolCallId ?? generateId();\n const toolName = (payload as { toolName?: string }).toolName ?? \"tool\";\n const rawArgs =\n (payload as { args?: unknown }).args ??\n (payload as { input?: unknown }).input ??\n (payload as { arguments?: unknown }).arguments;\n const argsEvent: ToolCallArgsEvent = {\n type: EventType.TOOL_CALL_ARGS,\n toolCallId,\n delta: safeStringify(rawArgs ?? {}),\n };\n const startEvent: ToolCallStartEvent = {\n type: EventType.TOOL_CALL_START,\n toolCallId,\n toolCallName: toolName,\n parentMessageId: fallbackMessageId,\n };\n const endEvent: ToolCallEndEvent = {\n type: EventType.TOOL_CALL_END,\n toolCallId,\n };\n return [startEvent, argsEvent, endEvent];\n }\n case \"tool-result\": {\n const rawResult =\n (payload as { result?: unknown }).result ??\n (payload as { output?: unknown }).output ??\n (payload as { data?: unknown }).data ??\n payload;\n const resultEvent: ToolCallResultEvent = {\n type: EventType.TOOL_CALL_RESULT,\n toolCallId: (payload as { toolCallId?: string }).toolCallId ?? generateId(),\n content: safeStringify(rawResult ?? {}),\n messageId: generateId(),\n role: \"tool\",\n };\n return [resultEvent];\n }\n case \"error\": {\n const errorEvent: TextMessageChunkEvent = {\n type: EventType.TEXT_MESSAGE_CHUNK,\n delta: `Error: ${(payload as { error?: unknown }).error}`,\n messageId: fallbackMessageId,\n role: \"assistant\",\n };\n return [errorEvent];\n }\n default:\n return null;\n }\n}\n\nexport function createVoltAgentAGUI(config: VoltAgentAGUIConfig): VoltAgentAGUI {\n return new VoltAgentAGUI(config);\n}\n\nfunction generateId(): string {\n const cryptoApi = typeof globalThis !== \"undefined\" ? (globalThis as any).crypto : undefined;\n if (cryptoApi && typeof cryptoApi.randomUUID === \"function\") {\n return cryptoApi.randomUUID();\n }\n\n const random = () => Math.floor(Math.random() * 0xffff);\n let uuid = \"\";\n uuid += random().toString(16).padStart(4, \"0\");\n uuid += random().toString(16).padStart(4, \"0\");\n uuid += \"-\";\n uuid += random().toString(16).padStart(4, \"0\");\n uuid += \"-\";\n uuid += ((random() & 0x0fff) | 0x4000).toString(16).padStart(4, \"0\");\n uuid += \"-\";\n uuid += ((random() & 0x3fff) | 0x8000).toString(16).padStart(4, \"0\");\n uuid += \"-\";\n uuid += random().toString(16).padStart(4, \"0\");\n uuid += random().toString(16).padStart(4, \"0\");\n uuid += random().toString(16).padStart(4, \"0\");\n return uuid;\n}\n","import { AbstractAgent } from \"@ag-ui/client\";\nimport type { RunAgentInput } from \"@ag-ui/core\";\nimport {\n CopilotRuntime,\n type CopilotServiceAdapter,\n ExperimentalEmptyAdapter,\n copilotRuntimeNextJSAppRouterEndpoint,\n} from \"@copilotkit/runtime\";\nimport type { Agent } from \"@voltagent/core\";\nimport { AgentRegistry } from \"@voltagent/core\";\nimport { createVoltAgentAGUI } from \"./voltagent-agent\";\n\nexport type CopilotKitHandlerOptions = {\n /**\n * Static map of AG-UI agents. Use either this or `loadAgents`.\n */\n agents?: Record<string, AbstractAgent>;\n /**\n * Lazy loader for AG-UI agents. If provided, it overrides `agents`.\n */\n loadAgents?: () => Promise<Record<string, AbstractAgent>> | Record<string, AbstractAgent>;\n /**\n * Optional service adapter. Defaults to ExperimentalEmptyAdapter.\n */\n serviceAdapter?: CopilotServiceAdapter;\n /**\n * Endpoint path used by CopilotKit clients. Defaults to \"/copilotkit\".\n */\n endpoint?: string;\n};\n\nexport type RegisterCopilotKitRoutesOptions = {\n /**\n * Hono-style app instance with `all(path, handler)` support.\n */\n app: {\n all: (path: string, handler: (c: any) => any) => any;\n post?: (path: string, handler: (c: any) => any) => any;\n };\n /**\n * VoltAgent agents to expose to CopilotKit. Will be wrapped lazily.\n */\n agents?: Record<string, Agent>;\n /**\n * Optional resource IDs to pick from the global AgentRegistry if `agents` is not provided.\n * If omitted and no agents are provided, all registered agents will be exposed.\n */\n resourceIds?: string[];\n /**\n * Path to mount CopilotKit endpoint. Defaults to \"/copilotkit\".\n */\n path?: string;\n};\n\n/**\n * Create a framework-agnostic fetch handler for CopilotKit that serves VoltAgent-backed AG-UI agents.\n *\n * @example\n * ```ts\n * import { createCopilotKitHandler } from \"@voltagent/ag-ui\";\n * import { createVoltAgentAGUI } from \"@voltagent/ag-ui\";\n * import { agent } from \"./agent\"; // VoltAgent instance\n *\n * const handler = createCopilotKitHandler({\n * agents: { assistant: createVoltAgentAGUI({ agent }) },\n * endpoint: \"/api/copilotkit\",\n * });\n *\n * export default {\n * fetch: handler,\n * };\n * ```\n */\nexport function createCopilotKitHandler(options: CopilotKitHandlerOptions) {\n const endpoint = options.endpoint ?? \"/copilotkit\";\n const serviceAdapter = options.serviceAdapter ?? new ExperimentalEmptyAdapter();\n\n return async (req: Request): Promise<Response> => {\n // We intentionally avoid logging request bodies to keep the handler silent in production.\n await req\n .clone()\n .text()\n .catch(() => undefined);\n\n const agents =\n (await options.loadAgents?.()) ??\n options.agents ??\n (() => {\n throw new Error(\"No agents provided to CopilotKit handler\");\n })();\n\n // Lightweight wrapper to add per-run/connect logging without touching the original agents\n const wrappedAgents: Record<string, AbstractAgent> = {};\n for (const [id, agent] of Object.entries(agents)) {\n wrappedAgents[id] = new (class extends AbstractAgent {\n run(input: RunAgentInput) {\n console.log(\"[CopilotKit] agent.run\", {\n agentId: id,\n threadId: input.threadId,\n runId: input.runId,\n });\n return (agent as AbstractAgent).run(input);\n }\n // Forward connect if the agent implements it\n connect(input: RunAgentInput) {\n console.log(\"[CopilotKit] agent.connect\", {\n agentId: id,\n threadId: input.threadId,\n runId: input.runId,\n });\n return (agent as any).connect?.(input);\n }\n clone() {\n return this;\n }\n })();\n }\n\n const runtime = new CopilotRuntime({ agents: wrappedAgents });\n\n const { handleRequest } = copilotRuntimeNextJSAppRouterEndpoint({\n runtime,\n serviceAdapter,\n endpoint,\n });\n\n let response: Response;\n try {\n response = await handleRequest(req);\n } catch (error) {\n console.error(\"[CopilotKit] handler failed\", {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n });\n throw error;\n }\n return response;\n };\n}\n\n/**\n * Convenience helper: register CopilotKit routes on a Hono-like app using VoltAgent agents.\n */\nexport function registerCopilotKitRoutes(options: RegisterCopilotKitRoutesOptions) {\n const path = options.path ?? \"/copilotkit\";\n const resolveAgents = (): Record<string, Agent> => {\n if (options.agents) return options.agents;\n const registry = AgentRegistry.getInstance();\n const ids = options.resourceIds;\n if (ids && ids.length > 0) {\n return Object.fromEntries(\n ids\n .map((id) => {\n const agent = registry.getAgent(id);\n return agent ? [id, agent] : undefined;\n })\n .filter(Boolean) as [string, Agent][],\n );\n }\n return Object.fromEntries(registry.getAllAgents().map((agent) => [agent.id, agent]));\n };\n\n const handler = createCopilotKitHandler({\n loadAgents: () =>\n Object.fromEntries(\n Object.entries(resolveAgents()).map(([id, agent]) => [id, createVoltAgentAGUI({ agent })]),\n ),\n endpoint: path,\n });\n\n const routeHandler = async (c: any) => {\n const method = c.req?.method;\n if (method && method !== \"POST\") {\n return c.json?.({ success: false, error: \"Use POST with CopilotKit runtime requests.\" }, 405);\n }\n\n try {\n return await handler(c.req?.raw ?? c.request ?? c);\n } catch (error) {\n console.error(\"[copilotkit] handler error\", error);\n return c.json?.(\n { success: false, error: \"CopilotKit handler failed\", detail: `${error}` },\n 500,\n );\n }\n };\n\n const register = (p: string) => {\n if (typeof options.app.post === \"function\") {\n options.app.post(p, routeHandler);\n } else {\n options.app.all(p, routeHandler);\n }\n };\n\n [path, `${path}/*`].forEach(register);\n // Deliberately no return; route registration side-effect only\n}\n"],"mappings":"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","names":["import_client","import_runtime","import_core"]}
|
package/dist/index.mjs
CHANGED
|
@@ -42,6 +42,9 @@ var VoltAgentAGUI = class extends AbstractAgent {
|
|
|
42
42
|
const result = await this.agent.streamText(voltMessages, streamOptions);
|
|
43
43
|
for await (const part of result.fullStream) {
|
|
44
44
|
debugLog("fullStream part", { partType: part.type, id: part.id });
|
|
45
|
+
if ((part.type === "start" || part.type === "start-step") && part.messageId) {
|
|
46
|
+
currentMessageId = part.messageId;
|
|
47
|
+
}
|
|
45
48
|
const events = convertVoltStreamPartToEvents(part, currentMessageId);
|
|
46
49
|
if (!events) continue;
|
|
47
50
|
for (const event of events) {
|
|
@@ -174,16 +177,19 @@ var isAssistantMessage = /* @__PURE__ */ __name((message) => message.role === "a
|
|
|
174
177
|
var isSystemMessage = /* @__PURE__ */ __name((message) => message.role === "system", "isSystemMessage");
|
|
175
178
|
var isDeveloperMessage = /* @__PURE__ */ __name((message) => message.role === "developer", "isDeveloperMessage");
|
|
176
179
|
var isToolMessage = /* @__PURE__ */ __name((message) => message.role === "tool", "isToolMessage");
|
|
180
|
+
var VOLTAGENT_MESSAGE_METADATA_EVENT_NAME = "voltagent.message_metadata";
|
|
177
181
|
function convertAGUIMessagesToVoltMessages(messages) {
|
|
178
182
|
const toolNameById = /* @__PURE__ */ new Map();
|
|
179
|
-
|
|
183
|
+
const convertedMessages = [];
|
|
184
|
+
for (const msg of messages) {
|
|
180
185
|
const messageId = msg.id || generateId();
|
|
181
186
|
if (isUserMessage(msg)) {
|
|
182
|
-
|
|
187
|
+
convertedMessages.push({
|
|
183
188
|
id: messageId,
|
|
184
189
|
role: "user",
|
|
185
190
|
content: extractTextContent(msg.content)
|
|
186
|
-
};
|
|
191
|
+
});
|
|
192
|
+
continue;
|
|
187
193
|
}
|
|
188
194
|
if (isAssistantMessage(msg)) {
|
|
189
195
|
const parts = [];
|
|
@@ -201,22 +207,24 @@ function convertAGUIMessagesToVoltMessages(messages) {
|
|
|
201
207
|
args
|
|
202
208
|
});
|
|
203
209
|
}
|
|
204
|
-
|
|
210
|
+
convertedMessages.push({
|
|
205
211
|
id: messageId,
|
|
206
212
|
role: "assistant",
|
|
207
213
|
parts
|
|
208
|
-
};
|
|
214
|
+
});
|
|
215
|
+
continue;
|
|
209
216
|
}
|
|
210
217
|
if (isSystemMessage(msg) || isDeveloperMessage(msg)) {
|
|
211
|
-
|
|
218
|
+
convertedMessages.push({
|
|
212
219
|
id: messageId,
|
|
213
220
|
role: "system",
|
|
214
221
|
content: msg.content
|
|
215
|
-
};
|
|
222
|
+
});
|
|
223
|
+
continue;
|
|
216
224
|
}
|
|
217
225
|
if (isToolMessage(msg)) {
|
|
218
226
|
const toolName = msg.toolCallId ? toolNameById.get(msg.toolCallId) : void 0;
|
|
219
|
-
|
|
227
|
+
convertedMessages.push({
|
|
220
228
|
id: messageId,
|
|
221
229
|
role: "tool",
|
|
222
230
|
parts: [
|
|
@@ -227,14 +235,16 @@ function convertAGUIMessagesToVoltMessages(messages) {
|
|
|
227
235
|
output: safelyParseJson(msg.content)
|
|
228
236
|
}
|
|
229
237
|
]
|
|
230
|
-
};
|
|
238
|
+
});
|
|
239
|
+
continue;
|
|
231
240
|
}
|
|
232
|
-
|
|
241
|
+
convertedMessages.push({
|
|
233
242
|
id: messageId,
|
|
234
243
|
role: "assistant",
|
|
235
244
|
parts: [{ type: "text", text: safeStringify(msg.content ?? "") }]
|
|
236
|
-
};
|
|
237
|
-
}
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
return convertedMessages;
|
|
238
248
|
}
|
|
239
249
|
__name(convertAGUIMessagesToVoltMessages, "convertAGUIMessagesToVoltMessages");
|
|
240
250
|
function extractTextContent(content) {
|
|
@@ -259,15 +269,33 @@ function safelyParseJson(value) {
|
|
|
259
269
|
__name(safelyParseJson, "safelyParseJson");
|
|
260
270
|
function convertVoltStreamPartToEvents(part, fallbackMessageId) {
|
|
261
271
|
const payload = part.payload ?? part;
|
|
272
|
+
const partType = part.type;
|
|
273
|
+
if (partType === "message-metadata") {
|
|
274
|
+
const messageId = part.messageId ?? payload.messageId ?? fallbackMessageId;
|
|
275
|
+
const messageMetadata = payload.messageMetadata ?? payload.metadata;
|
|
276
|
+
if (!messageMetadata || typeof messageMetadata !== "object") {
|
|
277
|
+
return null;
|
|
278
|
+
}
|
|
279
|
+
const customEvent = {
|
|
280
|
+
type: EventType.CUSTOM,
|
|
281
|
+
name: VOLTAGENT_MESSAGE_METADATA_EVENT_NAME,
|
|
282
|
+
value: {
|
|
283
|
+
messageId: messageId || void 0,
|
|
284
|
+
metadata: messageMetadata
|
|
285
|
+
}
|
|
286
|
+
};
|
|
287
|
+
return [customEvent];
|
|
288
|
+
}
|
|
262
289
|
switch (part.type) {
|
|
263
290
|
case "text-start": {
|
|
264
291
|
return null;
|
|
265
292
|
}
|
|
266
293
|
case "text-delta": {
|
|
294
|
+
const messageId = part.messageId ?? fallbackMessageId;
|
|
267
295
|
const event = {
|
|
268
296
|
type: EventType.TEXT_MESSAGE_CHUNK,
|
|
269
297
|
delta: part.text ?? "",
|
|
270
|
-
messageId
|
|
298
|
+
messageId,
|
|
271
299
|
role: "assistant"
|
|
272
300
|
};
|
|
273
301
|
return [event];
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/voltagent-agent.ts","../src/copilotkit.ts"],"sourcesContent":["import { AbstractAgent } from \"@ag-ui/client\";\nimport type {\n AssistantMessage,\n BaseEvent,\n DeveloperMessage,\n Message,\n RunAgentInput,\n RunErrorEvent,\n RunFinishedEvent,\n RunStartedEvent,\n StateSnapshotEvent,\n SystemMessage,\n TextMessageChunkEvent,\n TextMessageEndEvent,\n TextMessageStartEvent,\n ToolCallArgsEvent,\n ToolCallEndEvent,\n ToolCallResultEvent,\n ToolCallStartEvent,\n ToolMessage,\n UserMessage,\n} from \"@ag-ui/core\";\nimport { EventType } from \"@ag-ui/core\";\nimport type { StreamTextOptions, VoltAgentTextStreamPart } from \"@voltagent/core\";\nimport type { Agent } from \"@voltagent/core\";\nimport { safeStringify } from \"@voltagent/internal/utils\";\nimport { Observable } from \"rxjs\";\n\ntype AGUIContextValue = {\n state?: Record<string, unknown>;\n context?: RunAgentInput[\"context\"];\n forwardedProps?: RunAgentInput[\"forwardedProps\"];\n};\n\ntype VoltAgentAGUIConfig = {\n agent: Agent;\n /**\n * Optional function to derive userId for VoltAgent memory/telemetry.\n */\n deriveUserId?: (input: RunAgentInput) => string | undefined;\n};\n\nfunction debugLog(message: string, data?: Record<string, unknown>) {\n // eslint-disable-next-line no-console\n console.log(`[VoltAgentAGUI] ${message}`, data ?? {});\n}\n\n/**\n * VoltAgent adapter that speaks the AG-UI protocol.\n * and stream VoltAgent events as AG-UI BaseEvents.\n */\nexport class VoltAgentAGUI extends AbstractAgent {\n private readonly agent: Agent;\n private readonly deriveUserId?: VoltAgentAGUIConfig[\"deriveUserId\"];\n\n constructor(config: VoltAgentAGUIConfig) {\n super();\n this.agent = config.agent;\n this.deriveUserId = config.deriveUserId;\n }\n\n run(input: RunAgentInput): ReturnType<AbstractAgent[\"run\"]> {\n const stream$ = new Observable<BaseEvent>((subscriber) => {\n const abortController = new AbortController();\n let finishedSent = false;\n debugLog(\"run start\", { threadId: input.threadId, runId: input.runId });\n const runStarted: RunStartedEvent = {\n type: EventType.RUN_STARTED,\n threadId: input.threadId,\n runId: input.runId,\n };\n subscriber.next(runStarted);\n\n const run = async () => {\n let currentMessageId = generateId();\n\n try {\n await this.persistStateToWorkingMemory(input);\n\n const streamOptions = this.buildStreamOptions(input, abortController);\n const voltMessages = convertAGUIMessagesToVoltMessages(input.messages);\n\n debugLog(\"calling agent.streamText\", { messagesLength: voltMessages.length });\n const result = await this.agent.streamText(voltMessages as any, streamOptions);\n\n for await (const part of result.fullStream) {\n debugLog(\"fullStream part\", { partType: part.type, id: (part as any).id });\n const events = convertVoltStreamPartToEvents(part, currentMessageId);\n if (!events) continue;\n\n for (const event of events) {\n debugLog(\"emit event\", { type: event.type, messageId: (event as any).messageId });\n\n subscriber.next(event);\n if (\n (event.type === EventType.TEXT_MESSAGE_START ||\n event.type === EventType.TEXT_MESSAGE_CHUNK ||\n event.type === EventType.TEXT_MESSAGE_END) &&\n \"messageId\" in event &&\n event.messageId\n ) {\n currentMessageId = event.messageId;\n }\n }\n }\n\n const snapshotEvent = await this.readWorkingMemorySnapshot(input);\n if (snapshotEvent) {\n subscriber.next(snapshotEvent);\n }\n\n const finished: RunFinishedEvent = {\n type: EventType.RUN_FINISHED,\n threadId: input.threadId,\n runId: input.runId,\n };\n subscriber.next(finished);\n finishedSent = true;\n subscriber.complete();\n debugLog(\"run finished\", { threadId: input.threadId, runId: input.runId });\n } catch (error) {\n debugLog(\"run error\", {\n threadId: input.threadId,\n runId: input.runId,\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n });\n\n // Make sure any partial text messages are closed before finishing\n const runError: RunErrorEvent = {\n type: EventType.RUN_ERROR,\n message: error instanceof Error ? error.message : \"Unknown error\",\n };\n subscriber.next(runError);\n const finished: RunFinishedEvent = {\n type: EventType.RUN_FINISHED,\n threadId: input.threadId,\n runId: input.runId,\n };\n subscriber.next(finished);\n finishedSent = true;\n subscriber.complete();\n }\n };\n\n void run();\n\n return () => {\n debugLog(\"run abort/unsubscribe\", {\n threadId: input.threadId,\n runId: input.runId,\n finishedSent,\n });\n abortController.abort();\n if (!finishedSent) {\n const finished: RunFinishedEvent = {\n type: EventType.RUN_FINISHED,\n threadId: input.threadId,\n runId: input.runId,\n };\n subscriber.next(finished);\n finishedSent = true;\n subscriber.complete();\n }\n };\n });\n\n // Cast through unknown to avoid rxjs type mismatches across hoisted versions\n return stream$ as unknown as ReturnType<AbstractAgent[\"run\"]>;\n }\n\n private buildStreamOptions(\n input: RunAgentInput,\n abortController: AbortController,\n ): StreamTextOptions {\n const context = new Map<string, unknown>();\n const aguiContext: AGUIContextValue = {\n state: (input.state as Record<string, unknown>) || undefined,\n context: input.context,\n forwardedProps: input.forwardedProps,\n };\n\n context.set(\"agui:context\", aguiContext);\n\n return {\n abortSignal: abortController.signal,\n conversationId: input.threadId,\n userId: this.deriveUserId?.(input),\n context,\n };\n }\n\n private async persistStateToWorkingMemory(input: RunAgentInput): Promise<void> {\n const state = input.state;\n if (!state || typeof state !== \"object\" || Object.keys(state).length === 0) {\n return;\n }\n\n const memory = this.agent.getMemory?.();\n if (!memory) {\n return;\n }\n\n try {\n await memory.updateWorkingMemory({\n conversationId: input.threadId,\n content: safeStringify(state),\n });\n } catch (error) {\n // Non-fatal: working memory might be disabled or misconfigured\n console.debug?.(\"Failed to persist AG-UI state to working memory\", error);\n }\n }\n\n private async readWorkingMemorySnapshot(\n input: RunAgentInput,\n ): Promise<StateSnapshotEvent | undefined> {\n const memory = this.agent.getMemory?.();\n if (!memory) {\n return;\n }\n\n try {\n const raw = await memory.getWorkingMemory({\n conversationId: input.threadId,\n });\n\n if (!raw) {\n return;\n }\n\n let snapshot: unknown = raw;\n try {\n snapshot = JSON.parse(raw);\n } catch {\n // keep raw string\n }\n\n return {\n type: EventType.STATE_SNAPSHOT,\n snapshot,\n };\n } catch (error) {\n console.debug?.(\"Failed to read AG-UI working memory snapshot\", error);\n return;\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Message conversion helpers\n// ---------------------------------------------------------------------------\n\nconst isUserMessage = (message: Message): message is UserMessage => message.role === \"user\";\nconst isAssistantMessage = (message: Message): message is AssistantMessage =>\n message.role === \"assistant\";\nconst isSystemMessage = (message: Message): message is SystemMessage => message.role === \"system\";\nconst isDeveloperMessage = (message: Message): message is DeveloperMessage =>\n message.role === \"developer\";\nconst isToolMessage = (message: Message): message is ToolMessage => message.role === \"tool\";\n\ntype VoltUIPart =\n | { type: \"text\"; text: string }\n | { type: \"tool-call\"; toolCallId: string; toolName: string; args?: unknown }\n | { type: \"tool-result\"; toolCallId?: string; toolName?: string; output?: unknown };\n\ntype VoltUIMessage = {\n id: string;\n role: \"user\" | \"assistant\" | \"system\" | \"tool\";\n content?: string;\n parts?: VoltUIPart[];\n};\n\nfunction convertAGUIMessagesToVoltMessages(messages: Message[]): VoltUIMessage[] {\n const toolNameById = new Map<string, string>();\n\n return messages.map((msg) => {\n const messageId = msg.id || generateId();\n\n if (isUserMessage(msg)) {\n return {\n id: messageId,\n role: \"user\",\n content: extractTextContent(msg.content),\n };\n }\n\n if (isAssistantMessage(msg)) {\n const parts: VoltUIPart[] = [];\n const textContent = msg.content ? extractTextContent(msg.content) : \"\";\n if (textContent) {\n parts.push({ type: \"text\", text: textContent });\n }\n\n for (const call of msg.toolCalls ?? []) {\n const args = safelyParseJson(call.function.arguments);\n toolNameById.set(call.id, call.function.name);\n parts.push({\n type: \"tool-call\",\n toolCallId: call.id,\n toolName: call.function.name,\n args,\n });\n }\n\n return {\n id: messageId,\n role: \"assistant\",\n parts,\n };\n }\n\n if (isSystemMessage(msg) || isDeveloperMessage(msg)) {\n return {\n id: messageId,\n role: \"system\",\n content: msg.content,\n };\n }\n\n if (isToolMessage(msg)) {\n const toolName = msg.toolCallId ? toolNameById.get(msg.toolCallId) : undefined;\n return {\n id: messageId,\n role: \"tool\",\n parts: [\n {\n type: \"tool-result\",\n toolCallId: msg.toolCallId,\n toolName: toolName ?? \"tool\",\n output: safelyParseJson(msg.content),\n },\n ],\n };\n }\n\n // activity or any other custom role -> fold into assistant text\n return {\n id: messageId,\n role: \"assistant\",\n parts: [{ type: \"text\", text: safeStringify((msg as any).content ?? \"\") }],\n };\n });\n}\n\nfunction extractTextContent(content: UserMessage[\"content\"] | AssistantMessage[\"content\"]): string {\n if (!content) return \"\";\n if (typeof content === \"string\") return content;\n if (!Array.isArray(content)) return \"\";\n\n const parts = content as Array<Record<string, unknown>>;\n\n return parts\n .map((part: Record<string, unknown>) => {\n const textValue = typeof part.text === \"string\" ? (part.text as string) : \"\";\n return textValue;\n })\n .filter((text: string) => text.length > 0)\n .join(\"\\n\");\n}\n\nfunction safelyParseJson(value: string | unknown): unknown {\n if (typeof value !== \"string\") return value;\n try {\n return JSON.parse(value);\n } catch {\n return value;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Stream conversion helpers\n// ---------------------------------------------------------------------------\n\ntype StreamConversionResult =\n | TextMessageStartEvent\n | TextMessageChunkEvent\n | TextMessageEndEvent\n | ToolCallStartEvent\n | ToolCallEndEvent\n | ToolCallArgsEvent\n | ToolCallResultEvent;\n\nfunction convertVoltStreamPartToEvents(\n part: VoltAgentTextStreamPart,\n fallbackMessageId: string,\n): StreamConversionResult[] | null {\n const payload = (part as { payload?: Record<string, unknown> }).payload ?? part;\n\n switch (part.type) {\n case \"text-start\": {\n // Ignore explicit start; we'll synthesize start when first chunk/end arrives to avoid duplicates\n return null;\n }\n case \"text-delta\": {\n const event: TextMessageChunkEvent = {\n type: EventType.TEXT_MESSAGE_CHUNK,\n delta: part.text ?? \"\",\n messageId: part.id ?? fallbackMessageId,\n role: \"assistant\",\n };\n return [event];\n }\n case \"text-end\": {\n // Let transformChunks close the message; avoid emitting END without a START\n return null;\n }\n case \"tool-call\": {\n const toolCallId = (payload as { toolCallId?: string }).toolCallId ?? generateId();\n const toolName = (payload as { toolName?: string }).toolName ?? \"tool\";\n const rawArgs =\n (payload as { args?: unknown }).args ??\n (payload as { input?: unknown }).input ??\n (payload as { arguments?: unknown }).arguments;\n const argsEvent: ToolCallArgsEvent = {\n type: EventType.TOOL_CALL_ARGS,\n toolCallId,\n delta: safeStringify(rawArgs ?? {}),\n };\n const startEvent: ToolCallStartEvent = {\n type: EventType.TOOL_CALL_START,\n toolCallId,\n toolCallName: toolName,\n parentMessageId: fallbackMessageId,\n };\n const endEvent: ToolCallEndEvent = {\n type: EventType.TOOL_CALL_END,\n toolCallId,\n };\n return [startEvent, argsEvent, endEvent];\n }\n case \"tool-result\": {\n const rawResult =\n (payload as { result?: unknown }).result ??\n (payload as { output?: unknown }).output ??\n (payload as { data?: unknown }).data ??\n payload;\n const resultEvent: ToolCallResultEvent = {\n type: EventType.TOOL_CALL_RESULT,\n toolCallId: (payload as { toolCallId?: string }).toolCallId ?? generateId(),\n content: safeStringify(rawResult ?? {}),\n messageId: generateId(),\n role: \"tool\",\n };\n return [resultEvent];\n }\n case \"error\": {\n const errorEvent: TextMessageChunkEvent = {\n type: EventType.TEXT_MESSAGE_CHUNK,\n delta: `Error: ${(payload as { error?: unknown }).error}`,\n messageId: fallbackMessageId,\n role: \"assistant\",\n };\n return [errorEvent];\n }\n default:\n return null;\n }\n}\n\nexport function createVoltAgentAGUI(config: VoltAgentAGUIConfig): VoltAgentAGUI {\n return new VoltAgentAGUI(config);\n}\n\nfunction generateId(): string {\n const cryptoApi = typeof globalThis !== \"undefined\" ? (globalThis as any).crypto : undefined;\n if (cryptoApi && typeof cryptoApi.randomUUID === \"function\") {\n return cryptoApi.randomUUID();\n }\n\n const random = () => Math.floor(Math.random() * 0xffff);\n let uuid = \"\";\n uuid += random().toString(16).padStart(4, \"0\");\n uuid += random().toString(16).padStart(4, \"0\");\n uuid += \"-\";\n uuid += random().toString(16).padStart(4, \"0\");\n uuid += \"-\";\n uuid += ((random() & 0x0fff) | 0x4000).toString(16).padStart(4, \"0\");\n uuid += \"-\";\n uuid += ((random() & 0x3fff) | 0x8000).toString(16).padStart(4, \"0\");\n uuid += \"-\";\n uuid += random().toString(16).padStart(4, \"0\");\n uuid += random().toString(16).padStart(4, \"0\");\n uuid += random().toString(16).padStart(4, \"0\");\n return uuid;\n}\n","import { AbstractAgent } from \"@ag-ui/client\";\nimport type { RunAgentInput } from \"@ag-ui/core\";\nimport {\n CopilotRuntime,\n type CopilotServiceAdapter,\n ExperimentalEmptyAdapter,\n copilotRuntimeNextJSAppRouterEndpoint,\n} from \"@copilotkit/runtime\";\nimport type { Agent } from \"@voltagent/core\";\nimport { AgentRegistry } from \"@voltagent/core\";\nimport { createVoltAgentAGUI } from \"./voltagent-agent\";\n\nexport type CopilotKitHandlerOptions = {\n /**\n * Static map of AG-UI agents. Use either this or `loadAgents`.\n */\n agents?: Record<string, AbstractAgent>;\n /**\n * Lazy loader for AG-UI agents. If provided, it overrides `agents`.\n */\n loadAgents?: () => Promise<Record<string, AbstractAgent>> | Record<string, AbstractAgent>;\n /**\n * Optional service adapter. Defaults to ExperimentalEmptyAdapter.\n */\n serviceAdapter?: CopilotServiceAdapter;\n /**\n * Endpoint path used by CopilotKit clients. Defaults to \"/copilotkit\".\n */\n endpoint?: string;\n};\n\nexport type RegisterCopilotKitRoutesOptions = {\n /**\n * Hono-style app instance with `all(path, handler)` support.\n */\n app: {\n all: (path: string, handler: (c: any) => any) => any;\n post?: (path: string, handler: (c: any) => any) => any;\n };\n /**\n * VoltAgent agents to expose to CopilotKit. Will be wrapped lazily.\n */\n agents?: Record<string, Agent>;\n /**\n * Optional resource IDs to pick from the global AgentRegistry if `agents` is not provided.\n * If omitted and no agents are provided, all registered agents will be exposed.\n */\n resourceIds?: string[];\n /**\n * Path to mount CopilotKit endpoint. Defaults to \"/copilotkit\".\n */\n path?: string;\n};\n\n/**\n * Create a framework-agnostic fetch handler for CopilotKit that serves VoltAgent-backed AG-UI agents.\n *\n * @example\n * ```ts\n * import { createCopilotKitHandler } from \"@voltagent/ag-ui\";\n * import { createVoltAgentAGUI } from \"@voltagent/ag-ui\";\n * import { agent } from \"./agent\"; // VoltAgent instance\n *\n * const handler = createCopilotKitHandler({\n * agents: { assistant: createVoltAgentAGUI({ agent }) },\n * endpoint: \"/api/copilotkit\",\n * });\n *\n * export default {\n * fetch: handler,\n * };\n * ```\n */\nexport function createCopilotKitHandler(options: CopilotKitHandlerOptions) {\n const endpoint = options.endpoint ?? \"/copilotkit\";\n const serviceAdapter = options.serviceAdapter ?? new ExperimentalEmptyAdapter();\n\n return async (req: Request): Promise<Response> => {\n // We intentionally avoid logging request bodies to keep the handler silent in production.\n await req\n .clone()\n .text()\n .catch(() => undefined);\n\n const agents =\n (await options.loadAgents?.()) ??\n options.agents ??\n (() => {\n throw new Error(\"No agents provided to CopilotKit handler\");\n })();\n\n // Lightweight wrapper to add per-run/connect logging without touching the original agents\n const wrappedAgents: Record<string, AbstractAgent> = {};\n for (const [id, agent] of Object.entries(agents)) {\n wrappedAgents[id] = new (class extends AbstractAgent {\n run(input: RunAgentInput) {\n console.log(\"[CopilotKit] agent.run\", {\n agentId: id,\n threadId: input.threadId,\n runId: input.runId,\n });\n return (agent as AbstractAgent).run(input);\n }\n // Forward connect if the agent implements it\n connect(input: RunAgentInput) {\n console.log(\"[CopilotKit] agent.connect\", {\n agentId: id,\n threadId: input.threadId,\n runId: input.runId,\n });\n return (agent as any).connect?.(input);\n }\n clone() {\n return this;\n }\n })();\n }\n\n const runtime = new CopilotRuntime({ agents: wrappedAgents });\n\n const { handleRequest } = copilotRuntimeNextJSAppRouterEndpoint({\n runtime,\n serviceAdapter,\n endpoint,\n });\n\n let response: Response;\n try {\n response = await handleRequest(req);\n } catch (error) {\n console.error(\"[CopilotKit] handler failed\", {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n });\n throw error;\n }\n return response;\n };\n}\n\n/**\n * Convenience helper: register CopilotKit routes on a Hono-like app using VoltAgent agents.\n */\nexport function registerCopilotKitRoutes(options: RegisterCopilotKitRoutesOptions) {\n const path = options.path ?? \"/copilotkit\";\n const resolveAgents = (): Record<string, Agent> => {\n if (options.agents) return options.agents;\n const registry = AgentRegistry.getInstance();\n const ids = options.resourceIds;\n if (ids && ids.length > 0) {\n return Object.fromEntries(\n ids\n .map((id) => {\n const agent = registry.getAgent(id);\n return agent ? [id, agent] : undefined;\n })\n .filter(Boolean) as [string, Agent][],\n );\n }\n return Object.fromEntries(registry.getAllAgents().map((agent) => [agent.id, agent]));\n };\n\n const handler = createCopilotKitHandler({\n loadAgents: () =>\n Object.fromEntries(\n Object.entries(resolveAgents()).map(([id, agent]) => [id, createVoltAgentAGUI({ agent })]),\n ),\n endpoint: path,\n });\n\n const routeHandler = async (c: any) => {\n const method = c.req?.method;\n if (method && method !== \"POST\") {\n return c.json?.({ success: false, error: \"Use POST with CopilotKit runtime requests.\" }, 405);\n }\n\n try {\n return await handler(c.req?.raw ?? c.request ?? c);\n } catch (error) {\n console.error(\"[copilotkit] handler error\", error);\n return c.json?.(\n { success: false, error: \"CopilotKit handler failed\", detail: `${error}` },\n 500,\n );\n }\n };\n\n const register = (p: string) => {\n if (typeof options.app.post === \"function\") {\n options.app.post(p, routeHandler);\n } else {\n options.app.all(p, routeHandler);\n }\n };\n\n [path, `${path}/*`].forEach(register);\n // Deliberately no return; route registration side-effect only\n}\n"],"mappings":"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","names":["AbstractAgent","AbstractAgent"]}
|
|
1
|
+
{"version":3,"sources":["../src/voltagent-agent.ts","../src/copilotkit.ts"],"sourcesContent":["import { AbstractAgent } from \"@ag-ui/client\";\nimport type {\n AssistantMessage,\n BaseEvent,\n CustomEvent,\n DeveloperMessage,\n Message,\n RunAgentInput,\n RunErrorEvent,\n RunFinishedEvent,\n RunStartedEvent,\n StateSnapshotEvent,\n SystemMessage,\n TextMessageChunkEvent,\n TextMessageEndEvent,\n TextMessageStartEvent,\n ToolCallArgsEvent,\n ToolCallEndEvent,\n ToolCallResultEvent,\n ToolCallStartEvent,\n ToolMessage,\n UserMessage,\n} from \"@ag-ui/core\";\nimport { EventType } from \"@ag-ui/core\";\nimport type { StreamTextOptions, VoltAgentTextStreamPart } from \"@voltagent/core\";\nimport type { Agent } from \"@voltagent/core\";\nimport { safeStringify } from \"@voltagent/internal/utils\";\nimport { Observable } from \"rxjs\";\n\ntype AGUIContextValue = {\n state?: Record<string, unknown>;\n context?: RunAgentInput[\"context\"];\n forwardedProps?: RunAgentInput[\"forwardedProps\"];\n};\n\ntype VoltAgentAGUIConfig = {\n agent: Agent;\n /**\n * Optional function to derive userId for VoltAgent memory/telemetry.\n */\n deriveUserId?: (input: RunAgentInput) => string | undefined;\n};\n\nfunction debugLog(message: string, data?: Record<string, unknown>) {\n // eslint-disable-next-line no-console\n console.log(`[VoltAgentAGUI] ${message}`, data ?? {});\n}\n\n/**\n * VoltAgent adapter that speaks the AG-UI protocol.\n * and stream VoltAgent events as AG-UI BaseEvents.\n */\nexport class VoltAgentAGUI extends AbstractAgent {\n private readonly agent: Agent;\n private readonly deriveUserId?: VoltAgentAGUIConfig[\"deriveUserId\"];\n\n constructor(config: VoltAgentAGUIConfig) {\n super();\n this.agent = config.agent;\n this.deriveUserId = config.deriveUserId;\n }\n\n run(input: RunAgentInput): ReturnType<AbstractAgent[\"run\"]> {\n const stream$ = new Observable<BaseEvent>((subscriber) => {\n const abortController = new AbortController();\n let finishedSent = false;\n debugLog(\"run start\", { threadId: input.threadId, runId: input.runId });\n const runStarted: RunStartedEvent = {\n type: EventType.RUN_STARTED,\n threadId: input.threadId,\n runId: input.runId,\n };\n subscriber.next(runStarted);\n\n const run = async () => {\n let currentMessageId = generateId();\n\n try {\n await this.persistStateToWorkingMemory(input);\n\n const streamOptions = this.buildStreamOptions(input, abortController);\n const voltMessages = convertAGUIMessagesToVoltMessages(input.messages);\n\n debugLog(\"calling agent.streamText\", { messagesLength: voltMessages.length });\n const result = await this.agent.streamText(voltMessages as any, streamOptions);\n\n for await (const part of result.fullStream) {\n debugLog(\"fullStream part\", { partType: part.type, id: (part as any).id });\n if ((part.type === \"start\" || part.type === \"start-step\") && part.messageId) {\n currentMessageId = part.messageId;\n }\n const events = convertVoltStreamPartToEvents(part, currentMessageId);\n if (!events) continue;\n\n for (const event of events) {\n debugLog(\"emit event\", { type: event.type, messageId: (event as any).messageId });\n\n subscriber.next(event);\n if (\n (event.type === EventType.TEXT_MESSAGE_START ||\n event.type === EventType.TEXT_MESSAGE_CHUNK ||\n event.type === EventType.TEXT_MESSAGE_END) &&\n \"messageId\" in event &&\n event.messageId\n ) {\n currentMessageId = event.messageId;\n }\n }\n }\n\n const snapshotEvent = await this.readWorkingMemorySnapshot(input);\n if (snapshotEvent) {\n subscriber.next(snapshotEvent);\n }\n\n const finished: RunFinishedEvent = {\n type: EventType.RUN_FINISHED,\n threadId: input.threadId,\n runId: input.runId,\n };\n subscriber.next(finished);\n finishedSent = true;\n subscriber.complete();\n debugLog(\"run finished\", { threadId: input.threadId, runId: input.runId });\n } catch (error) {\n debugLog(\"run error\", {\n threadId: input.threadId,\n runId: input.runId,\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n });\n\n // Make sure any partial text messages are closed before finishing\n const runError: RunErrorEvent = {\n type: EventType.RUN_ERROR,\n message: error instanceof Error ? error.message : \"Unknown error\",\n };\n subscriber.next(runError);\n const finished: RunFinishedEvent = {\n type: EventType.RUN_FINISHED,\n threadId: input.threadId,\n runId: input.runId,\n };\n subscriber.next(finished);\n finishedSent = true;\n subscriber.complete();\n }\n };\n\n void run();\n\n return () => {\n debugLog(\"run abort/unsubscribe\", {\n threadId: input.threadId,\n runId: input.runId,\n finishedSent,\n });\n abortController.abort();\n if (!finishedSent) {\n const finished: RunFinishedEvent = {\n type: EventType.RUN_FINISHED,\n threadId: input.threadId,\n runId: input.runId,\n };\n subscriber.next(finished);\n finishedSent = true;\n subscriber.complete();\n }\n };\n });\n\n // Cast through unknown to avoid rxjs type mismatches across hoisted versions\n return stream$ as unknown as ReturnType<AbstractAgent[\"run\"]>;\n }\n\n private buildStreamOptions(\n input: RunAgentInput,\n abortController: AbortController,\n ): StreamTextOptions {\n const context = new Map<string, unknown>();\n const aguiContext: AGUIContextValue = {\n state: (input.state as Record<string, unknown>) || undefined,\n context: input.context,\n forwardedProps: input.forwardedProps,\n };\n\n context.set(\"agui:context\", aguiContext);\n\n return {\n abortSignal: abortController.signal,\n conversationId: input.threadId,\n userId: this.deriveUserId?.(input),\n context,\n };\n }\n\n private async persistStateToWorkingMemory(input: RunAgentInput): Promise<void> {\n const state = input.state;\n if (!state || typeof state !== \"object\" || Object.keys(state).length === 0) {\n return;\n }\n\n const memory = this.agent.getMemory?.();\n if (!memory) {\n return;\n }\n\n try {\n await memory.updateWorkingMemory({\n conversationId: input.threadId,\n content: safeStringify(state),\n });\n } catch (error) {\n // Non-fatal: working memory might be disabled or misconfigured\n console.debug?.(\"Failed to persist AG-UI state to working memory\", error);\n }\n }\n\n private async readWorkingMemorySnapshot(\n input: RunAgentInput,\n ): Promise<StateSnapshotEvent | undefined> {\n const memory = this.agent.getMemory?.();\n if (!memory) {\n return;\n }\n\n try {\n const raw = await memory.getWorkingMemory({\n conversationId: input.threadId,\n });\n\n if (!raw) {\n return;\n }\n\n let snapshot: unknown = raw;\n try {\n snapshot = JSON.parse(raw);\n } catch {\n // keep raw string\n }\n\n return {\n type: EventType.STATE_SNAPSHOT,\n snapshot,\n };\n } catch (error) {\n console.debug?.(\"Failed to read AG-UI working memory snapshot\", error);\n return;\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Message conversion helpers\n// ---------------------------------------------------------------------------\n\nconst isUserMessage = (message: Message): message is UserMessage => message.role === \"user\";\nconst isAssistantMessage = (message: Message): message is AssistantMessage =>\n message.role === \"assistant\";\nconst isSystemMessage = (message: Message): message is SystemMessage => message.role === \"system\";\nconst isDeveloperMessage = (message: Message): message is DeveloperMessage =>\n message.role === \"developer\";\nconst isToolMessage = (message: Message): message is ToolMessage => message.role === \"tool\";\n\ntype VoltUIPart =\n | { type: \"text\"; text: string }\n | { type: \"tool-call\"; toolCallId: string; toolName: string; args?: unknown }\n | { type: \"tool-result\"; toolCallId?: string; toolName?: string; output?: unknown };\n\ntype VoltUIMessage = {\n id: string;\n role: \"user\" | \"assistant\" | \"system\" | \"tool\";\n content?: string;\n parts?: VoltUIPart[];\n};\n\nconst VOLTAGENT_MESSAGE_METADATA_EVENT_NAME = \"voltagent.message_metadata\";\nfunction convertAGUIMessagesToVoltMessages(messages: Message[]): VoltUIMessage[] {\n const toolNameById = new Map<string, string>();\n const convertedMessages: VoltUIMessage[] = [];\n\n for (const msg of messages) {\n const messageId = msg.id || generateId();\n\n if (isUserMessage(msg)) {\n convertedMessages.push({\n id: messageId,\n role: \"user\",\n content: extractTextContent(msg.content),\n });\n continue;\n }\n\n if (isAssistantMessage(msg)) {\n const parts: VoltUIPart[] = [];\n const textContent = msg.content ? extractTextContent(msg.content) : \"\";\n if (textContent) {\n parts.push({ type: \"text\", text: textContent });\n }\n\n for (const call of msg.toolCalls ?? []) {\n const args = safelyParseJson(call.function.arguments);\n toolNameById.set(call.id, call.function.name);\n parts.push({\n type: \"tool-call\",\n toolCallId: call.id,\n toolName: call.function.name,\n args,\n });\n }\n\n convertedMessages.push({\n id: messageId,\n role: \"assistant\",\n parts,\n });\n continue;\n }\n\n if (isSystemMessage(msg) || isDeveloperMessage(msg)) {\n convertedMessages.push({\n id: messageId,\n role: \"system\",\n content: msg.content,\n });\n continue;\n }\n\n if (isToolMessage(msg)) {\n const toolName = msg.toolCallId ? toolNameById.get(msg.toolCallId) : undefined;\n convertedMessages.push({\n id: messageId,\n role: \"tool\",\n parts: [\n {\n type: \"tool-result\",\n toolCallId: msg.toolCallId,\n toolName: toolName ?? \"tool\",\n output: safelyParseJson(msg.content),\n },\n ],\n });\n continue;\n }\n\n // activity or any other custom role -> fold into assistant text\n convertedMessages.push({\n id: messageId,\n role: \"assistant\",\n parts: [{ type: \"text\", text: safeStringify((msg as any).content ?? \"\") }],\n });\n }\n\n return convertedMessages;\n}\n\nfunction extractTextContent(content: UserMessage[\"content\"] | AssistantMessage[\"content\"]): string {\n if (!content) return \"\";\n if (typeof content === \"string\") return content;\n if (!Array.isArray(content)) return \"\";\n\n const parts = content as Array<Record<string, unknown>>;\n\n return parts\n .map((part: Record<string, unknown>) => {\n const textValue = typeof part.text === \"string\" ? (part.text as string) : \"\";\n return textValue;\n })\n .filter((text: string) => text.length > 0)\n .join(\"\\n\");\n}\n\nfunction safelyParseJson(value: string | unknown): unknown {\n if (typeof value !== \"string\") return value;\n try {\n return JSON.parse(value);\n } catch {\n return value;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Stream conversion helpers\n// ---------------------------------------------------------------------------\n\ntype StreamConversionResult =\n | TextMessageStartEvent\n | TextMessageChunkEvent\n | TextMessageEndEvent\n | CustomEvent\n | ToolCallStartEvent\n | ToolCallEndEvent\n | ToolCallArgsEvent\n | ToolCallResultEvent;\n\nfunction convertVoltStreamPartToEvents(\n part: VoltAgentTextStreamPart,\n fallbackMessageId: string,\n): StreamConversionResult[] | null {\n const payload = (part as { payload?: Record<string, unknown> }).payload ?? part;\n const partType = (part as { type: string }).type;\n\n if (partType === \"message-metadata\") {\n const messageId =\n (part as { messageId?: string }).messageId ??\n (payload as { messageId?: string }).messageId ??\n fallbackMessageId;\n const messageMetadata =\n (payload as { messageMetadata?: unknown }).messageMetadata ??\n (payload as { metadata?: unknown }).metadata;\n\n if (!messageMetadata || typeof messageMetadata !== \"object\") {\n return null;\n }\n\n // Best-practice carrier for app-specific metadata on AG-UI streams.\n const customEvent: CustomEvent = {\n type: EventType.CUSTOM,\n name: VOLTAGENT_MESSAGE_METADATA_EVENT_NAME,\n value: {\n messageId: messageId || undefined,\n metadata: messageMetadata,\n },\n };\n\n return [customEvent];\n }\n\n switch (part.type) {\n case \"text-start\": {\n // Ignore explicit start; we'll synthesize start when first chunk/end arrives to avoid duplicates\n return null;\n }\n case \"text-delta\": {\n const messageId = part.messageId ?? fallbackMessageId;\n const event: TextMessageChunkEvent = {\n type: EventType.TEXT_MESSAGE_CHUNK,\n delta: part.text ?? \"\",\n messageId,\n role: \"assistant\",\n };\n return [event];\n }\n case \"text-end\": {\n // Let transformChunks close the message; avoid emitting END without a START\n return null;\n }\n case \"tool-call\": {\n const toolCallId = (payload as { toolCallId?: string }).toolCallId ?? generateId();\n const toolName = (payload as { toolName?: string }).toolName ?? \"tool\";\n const rawArgs =\n (payload as { args?: unknown }).args ??\n (payload as { input?: unknown }).input ??\n (payload as { arguments?: unknown }).arguments;\n const argsEvent: ToolCallArgsEvent = {\n type: EventType.TOOL_CALL_ARGS,\n toolCallId,\n delta: safeStringify(rawArgs ?? {}),\n };\n const startEvent: ToolCallStartEvent = {\n type: EventType.TOOL_CALL_START,\n toolCallId,\n toolCallName: toolName,\n parentMessageId: fallbackMessageId,\n };\n const endEvent: ToolCallEndEvent = {\n type: EventType.TOOL_CALL_END,\n toolCallId,\n };\n return [startEvent, argsEvent, endEvent];\n }\n case \"tool-result\": {\n const rawResult =\n (payload as { result?: unknown }).result ??\n (payload as { output?: unknown }).output ??\n (payload as { data?: unknown }).data ??\n payload;\n const resultEvent: ToolCallResultEvent = {\n type: EventType.TOOL_CALL_RESULT,\n toolCallId: (payload as { toolCallId?: string }).toolCallId ?? generateId(),\n content: safeStringify(rawResult ?? {}),\n messageId: generateId(),\n role: \"tool\",\n };\n return [resultEvent];\n }\n case \"error\": {\n const errorEvent: TextMessageChunkEvent = {\n type: EventType.TEXT_MESSAGE_CHUNK,\n delta: `Error: ${(payload as { error?: unknown }).error}`,\n messageId: fallbackMessageId,\n role: \"assistant\",\n };\n return [errorEvent];\n }\n default:\n return null;\n }\n}\n\nexport function createVoltAgentAGUI(config: VoltAgentAGUIConfig): VoltAgentAGUI {\n return new VoltAgentAGUI(config);\n}\n\nfunction generateId(): string {\n const cryptoApi = typeof globalThis !== \"undefined\" ? (globalThis as any).crypto : undefined;\n if (cryptoApi && typeof cryptoApi.randomUUID === \"function\") {\n return cryptoApi.randomUUID();\n }\n\n const random = () => Math.floor(Math.random() * 0xffff);\n let uuid = \"\";\n uuid += random().toString(16).padStart(4, \"0\");\n uuid += random().toString(16).padStart(4, \"0\");\n uuid += \"-\";\n uuid += random().toString(16).padStart(4, \"0\");\n uuid += \"-\";\n uuid += ((random() & 0x0fff) | 0x4000).toString(16).padStart(4, \"0\");\n uuid += \"-\";\n uuid += ((random() & 0x3fff) | 0x8000).toString(16).padStart(4, \"0\");\n uuid += \"-\";\n uuid += random().toString(16).padStart(4, \"0\");\n uuid += random().toString(16).padStart(4, \"0\");\n uuid += random().toString(16).padStart(4, \"0\");\n return uuid;\n}\n","import { AbstractAgent } from \"@ag-ui/client\";\nimport type { RunAgentInput } from \"@ag-ui/core\";\nimport {\n CopilotRuntime,\n type CopilotServiceAdapter,\n ExperimentalEmptyAdapter,\n copilotRuntimeNextJSAppRouterEndpoint,\n} from \"@copilotkit/runtime\";\nimport type { Agent } from \"@voltagent/core\";\nimport { AgentRegistry } from \"@voltagent/core\";\nimport { createVoltAgentAGUI } from \"./voltagent-agent\";\n\nexport type CopilotKitHandlerOptions = {\n /**\n * Static map of AG-UI agents. Use either this or `loadAgents`.\n */\n agents?: Record<string, AbstractAgent>;\n /**\n * Lazy loader for AG-UI agents. If provided, it overrides `agents`.\n */\n loadAgents?: () => Promise<Record<string, AbstractAgent>> | Record<string, AbstractAgent>;\n /**\n * Optional service adapter. Defaults to ExperimentalEmptyAdapter.\n */\n serviceAdapter?: CopilotServiceAdapter;\n /**\n * Endpoint path used by CopilotKit clients. Defaults to \"/copilotkit\".\n */\n endpoint?: string;\n};\n\nexport type RegisterCopilotKitRoutesOptions = {\n /**\n * Hono-style app instance with `all(path, handler)` support.\n */\n app: {\n all: (path: string, handler: (c: any) => any) => any;\n post?: (path: string, handler: (c: any) => any) => any;\n };\n /**\n * VoltAgent agents to expose to CopilotKit. Will be wrapped lazily.\n */\n agents?: Record<string, Agent>;\n /**\n * Optional resource IDs to pick from the global AgentRegistry if `agents` is not provided.\n * If omitted and no agents are provided, all registered agents will be exposed.\n */\n resourceIds?: string[];\n /**\n * Path to mount CopilotKit endpoint. Defaults to \"/copilotkit\".\n */\n path?: string;\n};\n\n/**\n * Create a framework-agnostic fetch handler for CopilotKit that serves VoltAgent-backed AG-UI agents.\n *\n * @example\n * ```ts\n * import { createCopilotKitHandler } from \"@voltagent/ag-ui\";\n * import { createVoltAgentAGUI } from \"@voltagent/ag-ui\";\n * import { agent } from \"./agent\"; // VoltAgent instance\n *\n * const handler = createCopilotKitHandler({\n * agents: { assistant: createVoltAgentAGUI({ agent }) },\n * endpoint: \"/api/copilotkit\",\n * });\n *\n * export default {\n * fetch: handler,\n * };\n * ```\n */\nexport function createCopilotKitHandler(options: CopilotKitHandlerOptions) {\n const endpoint = options.endpoint ?? \"/copilotkit\";\n const serviceAdapter = options.serviceAdapter ?? new ExperimentalEmptyAdapter();\n\n return async (req: Request): Promise<Response> => {\n // We intentionally avoid logging request bodies to keep the handler silent in production.\n await req\n .clone()\n .text()\n .catch(() => undefined);\n\n const agents =\n (await options.loadAgents?.()) ??\n options.agents ??\n (() => {\n throw new Error(\"No agents provided to CopilotKit handler\");\n })();\n\n // Lightweight wrapper to add per-run/connect logging without touching the original agents\n const wrappedAgents: Record<string, AbstractAgent> = {};\n for (const [id, agent] of Object.entries(agents)) {\n wrappedAgents[id] = new (class extends AbstractAgent {\n run(input: RunAgentInput) {\n console.log(\"[CopilotKit] agent.run\", {\n agentId: id,\n threadId: input.threadId,\n runId: input.runId,\n });\n return (agent as AbstractAgent).run(input);\n }\n // Forward connect if the agent implements it\n connect(input: RunAgentInput) {\n console.log(\"[CopilotKit] agent.connect\", {\n agentId: id,\n threadId: input.threadId,\n runId: input.runId,\n });\n return (agent as any).connect?.(input);\n }\n clone() {\n return this;\n }\n })();\n }\n\n const runtime = new CopilotRuntime({ agents: wrappedAgents });\n\n const { handleRequest } = copilotRuntimeNextJSAppRouterEndpoint({\n runtime,\n serviceAdapter,\n endpoint,\n });\n\n let response: Response;\n try {\n response = await handleRequest(req);\n } catch (error) {\n console.error(\"[CopilotKit] handler failed\", {\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n });\n throw error;\n }\n return response;\n };\n}\n\n/**\n * Convenience helper: register CopilotKit routes on a Hono-like app using VoltAgent agents.\n */\nexport function registerCopilotKitRoutes(options: RegisterCopilotKitRoutesOptions) {\n const path = options.path ?? \"/copilotkit\";\n const resolveAgents = (): Record<string, Agent> => {\n if (options.agents) return options.agents;\n const registry = AgentRegistry.getInstance();\n const ids = options.resourceIds;\n if (ids && ids.length > 0) {\n return Object.fromEntries(\n ids\n .map((id) => {\n const agent = registry.getAgent(id);\n return agent ? [id, agent] : undefined;\n })\n .filter(Boolean) as [string, Agent][],\n );\n }\n return Object.fromEntries(registry.getAllAgents().map((agent) => [agent.id, agent]));\n };\n\n const handler = createCopilotKitHandler({\n loadAgents: () =>\n Object.fromEntries(\n Object.entries(resolveAgents()).map(([id, agent]) => [id, createVoltAgentAGUI({ agent })]),\n ),\n endpoint: path,\n });\n\n const routeHandler = async (c: any) => {\n const method = c.req?.method;\n if (method && method !== \"POST\") {\n return c.json?.({ success: false, error: \"Use POST with CopilotKit runtime requests.\" }, 405);\n }\n\n try {\n return await handler(c.req?.raw ?? c.request ?? c);\n } catch (error) {\n console.error(\"[copilotkit] handler error\", error);\n return c.json?.(\n { success: false, error: \"CopilotKit handler failed\", detail: `${error}` },\n 500,\n );\n }\n };\n\n const register = (p: string) => {\n if (typeof options.app.post === \"function\") {\n options.app.post(p, routeHandler);\n } else {\n options.app.all(p, routeHandler);\n }\n };\n\n [path, `${path}/*`].forEach(register);\n // Deliberately no return; route registration side-effect only\n}\n"],"mappings":"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","names":["AbstractAgent","AbstractAgent"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@voltagent/ag-ui",
|
|
3
3
|
"description": "AG-UI adapter for VoltAgent agents and CopilotKit runtimes.",
|
|
4
|
-
"version": "1.0.
|
|
4
|
+
"version": "1.0.4",
|
|
5
5
|
"dependencies": {
|
|
6
6
|
"rxjs": "^7.8.1"
|
|
7
7
|
},
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
"@ag-ui/core": "^0.0.37",
|
|
11
11
|
"@copilotkit/runtime": "^1.50.0",
|
|
12
12
|
"@vitest/coverage-v8": "^3.2.4",
|
|
13
|
-
"@voltagent/core": "^2.
|
|
13
|
+
"@voltagent/core": "^2.4.2",
|
|
14
14
|
"@voltagent/internal": "^1.0.2",
|
|
15
15
|
"tsup": "^8.5.0",
|
|
16
16
|
"typescript": "^5.8.2",
|