@copilotkit/runtime 0.0.0-fix-global-styles-20260220090200 → 0.0.0-fix-langgraphhttpagent-loadagentstate-20260220224632
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/CHANGELOG.md +6 -4
- package/dist/langgraph.cjs +5 -3
- package/dist/langgraph.d.cts +3 -1
- package/dist/langgraph.d.mts +3 -1
- package/dist/langgraph.mjs +3 -1
- package/dist/lib/runtime/agent-integrations/langgraph/agent.cjs +14 -0
- package/dist/lib/runtime/agent-integrations/langgraph/agent.cjs.map +1 -1
- package/dist/lib/runtime/agent-integrations/langgraph/agent.d.cts +22 -4
- package/dist/lib/runtime/agent-integrations/langgraph/agent.d.cts.map +1 -1
- package/dist/lib/runtime/agent-integrations/langgraph/agent.d.mts +22 -4
- package/dist/lib/runtime/agent-integrations/langgraph/agent.d.mts.map +1 -1
- package/dist/lib/runtime/agent-integrations/langgraph/agent.mjs +14 -1
- package/dist/lib/runtime/agent-integrations/langgraph/agent.mjs.map +1 -1
- package/dist/lib/runtime/agent-integrations/langgraph/convert-messages.cjs +62 -0
- package/dist/lib/runtime/agent-integrations/langgraph/convert-messages.cjs.map +1 -0
- package/dist/lib/runtime/agent-integrations/langgraph/convert-messages.d.cts +15 -0
- package/dist/lib/runtime/agent-integrations/langgraph/convert-messages.d.cts.map +1 -0
- package/dist/lib/runtime/agent-integrations/langgraph/convert-messages.d.mts +15 -0
- package/dist/lib/runtime/agent-integrations/langgraph/convert-messages.d.mts.map +1 -0
- package/dist/lib/runtime/agent-integrations/langgraph/convert-messages.mjs +61 -0
- package/dist/lib/runtime/agent-integrations/langgraph/convert-messages.mjs.map +1 -0
- package/dist/lib/runtime/agent-integrations/langgraph/index.d.cts +3 -1
- package/dist/lib/runtime/agent-integrations/langgraph/index.d.mts +3 -1
- package/dist/lib/runtime/agent-integrations/langgraph/load-state.cjs +80 -0
- package/dist/lib/runtime/agent-integrations/langgraph/load-state.cjs.map +1 -0
- package/dist/lib/runtime/agent-integrations/langgraph/load-state.d.cts +21 -0
- package/dist/lib/runtime/agent-integrations/langgraph/load-state.d.cts.map +1 -0
- package/dist/lib/runtime/agent-integrations/langgraph/load-state.d.mts +21 -0
- package/dist/lib/runtime/agent-integrations/langgraph/load-state.d.mts.map +1 -0
- package/dist/lib/runtime/agent-integrations/langgraph/load-state.mjs +79 -0
- package/dist/lib/runtime/agent-integrations/langgraph/load-state.mjs.map +1 -0
- package/dist/lib/runtime/copilot-runtime.d.cts +4 -4
- package/dist/lib/runtime/copilot-runtime.d.cts.map +1 -1
- package/dist/lib/runtime/copilot-runtime.d.mts +4 -4
- package/dist/lib/runtime/copilot-runtime.d.mts.map +1 -1
- package/dist/package.cjs +2 -1
- package/dist/package.mjs +2 -1
- package/package.json +11 -10
- package/src/lib/runtime/agent-integrations/langgraph/agent.ts +31 -2
- package/src/lib/runtime/agent-integrations/langgraph/convert-messages.test.ts +206 -0
- package/src/lib/runtime/agent-integrations/langgraph/convert-messages.ts +86 -0
- package/src/lib/runtime/agent-integrations/langgraph/index.ts +2 -0
- package/src/lib/runtime/agent-integrations/langgraph/load-state.test.ts +167 -0
- package/src/lib/runtime/agent-integrations/langgraph/load-state.ts +136 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
# @copilotkit/runtime
|
|
2
2
|
|
|
3
|
-
## 0.0.0-fix-
|
|
3
|
+
## 0.0.0-fix-langgraphhttpagent-loadagentstate-20260220224632
|
|
4
4
|
|
|
5
5
|
### Patch Changes
|
|
6
6
|
|
|
7
|
+
- 3334faf: feat(runtime): add thread rehydration support for LangGraph agents
|
|
7
8
|
- ef0f539: Add reasoning support and default components for reasoning messages
|
|
9
|
+
- Updated dependencies [3334faf]
|
|
8
10
|
- Updated dependencies [ef0f539]
|
|
9
|
-
- @copilotkitnext/runtime@0.0.0-fix-
|
|
10
|
-
- @copilotkit/shared@0.0.0-fix-
|
|
11
|
-
- @copilotkitnext/agent@0.0.0-fix-
|
|
11
|
+
- @copilotkitnext/runtime@0.0.0-fix-langgraphhttpagent-loadagentstate-20260220224632
|
|
12
|
+
- @copilotkit/shared@0.0.0-fix-langgraphhttpagent-loadagentstate-20260220224632
|
|
13
|
+
- @copilotkitnext/agent@0.0.0-fix-langgraphhttpagent-loadagentstate-20260220224632
|
|
12
14
|
|
|
13
15
|
## 1.51.5-next.3
|
|
14
16
|
|
package/dist/langgraph.cjs
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
require("reflect-metadata");
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
3
|
-
const require_runtime = require('./_virtual/_rolldown/runtime.cjs');
|
|
4
3
|
const require_consts = require('./lib/runtime/agent-integrations/langgraph/consts.cjs');
|
|
5
4
|
const require_agent = require('./lib/runtime/agent-integrations/langgraph/agent.cjs');
|
|
6
|
-
|
|
5
|
+
const require_convert_messages = require('./lib/runtime/agent-integrations/langgraph/convert-messages.cjs');
|
|
6
|
+
const require_load_state = require('./lib/runtime/agent-integrations/langgraph/load-state.cjs');
|
|
7
7
|
|
|
8
8
|
exports.CustomEventNames = require_consts.CustomEventNames;
|
|
9
9
|
exports.LangGraphAgent = require_agent.LangGraphAgent;
|
|
10
|
-
exports.LangGraphHttpAgent =
|
|
10
|
+
exports.LangGraphHttpAgent = require_agent.LangGraphHttpAgent;
|
|
11
|
+
exports.convertLangGraphMessages = require_convert_messages.convertLangGraphMessages;
|
|
12
|
+
exports.loadLangGraphPostgresState = require_load_state.loadLangGraphPostgresState;
|
package/dist/langgraph.d.cts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
|
|
2
2
|
import { CustomEventNames, PredictStateTool, TextMessageEvents, ToolCallEvents } from "./lib/runtime/agent-integrations/langgraph/consts.cjs";
|
|
3
3
|
import { LangGraphAgent, LangGraphHttpAgent } from "./lib/runtime/agent-integrations/langgraph/agent.cjs";
|
|
4
|
+
import { convertLangGraphMessages } from "./lib/runtime/agent-integrations/langgraph/convert-messages.cjs";
|
|
5
|
+
import { PostgresClient, loadLangGraphPostgresState } from "./lib/runtime/agent-integrations/langgraph/load-state.cjs";
|
|
4
6
|
import "./lib/runtime/agent-integrations/langgraph/index.cjs";
|
|
5
|
-
export { CustomEventNames, LangGraphAgent, LangGraphHttpAgent, PredictStateTool, TextMessageEvents, ToolCallEvents };
|
|
7
|
+
export { CustomEventNames, LangGraphAgent, LangGraphHttpAgent, PostgresClient, PredictStateTool, TextMessageEvents, ToolCallEvents, convertLangGraphMessages, loadLangGraphPostgresState };
|
package/dist/langgraph.d.mts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import "reflect-metadata";
|
|
2
2
|
import { CustomEventNames, PredictStateTool, TextMessageEvents, ToolCallEvents } from "./lib/runtime/agent-integrations/langgraph/consts.mjs";
|
|
3
3
|
import { LangGraphAgent, LangGraphHttpAgent } from "./lib/runtime/agent-integrations/langgraph/agent.mjs";
|
|
4
|
+
import { convertLangGraphMessages } from "./lib/runtime/agent-integrations/langgraph/convert-messages.mjs";
|
|
5
|
+
import { PostgresClient, loadLangGraphPostgresState } from "./lib/runtime/agent-integrations/langgraph/load-state.mjs";
|
|
4
6
|
import "./lib/runtime/agent-integrations/langgraph/index.mjs";
|
|
5
|
-
export { CustomEventNames, LangGraphAgent, LangGraphHttpAgent, PredictStateTool, TextMessageEvents, ToolCallEvents };
|
|
7
|
+
export { CustomEventNames, LangGraphAgent, LangGraphHttpAgent, PostgresClient, PredictStateTool, TextMessageEvents, ToolCallEvents, convertLangGraphMessages, loadLangGraphPostgresState };
|
package/dist/langgraph.mjs
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import "reflect-metadata";
|
|
2
2
|
import { CustomEventNames } from "./lib/runtime/agent-integrations/langgraph/consts.mjs";
|
|
3
3
|
import { LangGraphAgent, LangGraphHttpAgent } from "./lib/runtime/agent-integrations/langgraph/agent.mjs";
|
|
4
|
+
import { convertLangGraphMessages } from "./lib/runtime/agent-integrations/langgraph/convert-messages.mjs";
|
|
5
|
+
import { loadLangGraphPostgresState } from "./lib/runtime/agent-integrations/langgraph/load-state.mjs";
|
|
4
6
|
|
|
5
|
-
export { CustomEventNames, LangGraphAgent, LangGraphHttpAgent };
|
|
7
|
+
export { CustomEventNames, LangGraphAgent, LangGraphHttpAgent, convertLangGraphMessages, loadLangGraphPostgresState };
|
|
@@ -128,8 +128,22 @@ var LangGraphAgent = class extends _ag_ui_langgraph.LangGraphAgent {
|
|
|
128
128
|
context: schemaKeys.context ? [...schemaKeys.context, ...CONSTANT_KEYS] : null
|
|
129
129
|
};
|
|
130
130
|
}
|
|
131
|
+
async loadState(threadId) {
|
|
132
|
+
return { state: (await this.client.threads.getState(threadId)).values };
|
|
133
|
+
}
|
|
134
|
+
};
|
|
135
|
+
var LangGraphHttpAgent = class extends _ag_ui_langgraph.LangGraphHttpAgent {
|
|
136
|
+
constructor(config) {
|
|
137
|
+
super(config);
|
|
138
|
+
this._loadState = config.loadState;
|
|
139
|
+
}
|
|
140
|
+
async loadState(threadId, headers) {
|
|
141
|
+
if (!this._loadState) return null;
|
|
142
|
+
return this._loadState(threadId, headers);
|
|
143
|
+
}
|
|
131
144
|
};
|
|
132
145
|
|
|
133
146
|
//#endregion
|
|
134
147
|
exports.LangGraphAgent = LangGraphAgent;
|
|
148
|
+
exports.LangGraphHttpAgent = LangGraphHttpAgent;
|
|
135
149
|
//# sourceMappingURL=agent.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.cjs","names":["AGUILangGraphAgent","EventType","CustomEventNames","LangGraphEventTypes"],"sources":["../../../../../src/lib/runtime/agent-integrations/langgraph/agent.ts"],"sourcesContent":["import { map } from \"rxjs\";\nimport { LangGraphEventTypes } from \"../../../../agents/langgraph/events\";\nimport { RawEvent } from \"@ag-ui/core\";\nimport {\n LangGraphAgent as AGUILangGraphAgent,\n LangGraphHttpAgent,\n type LangGraphAgentConfig,\n ProcessedEvents,\n SchemaKeys,\n type State,\n StateEnrichment,\n} from \"@ag-ui/langgraph\";\nimport { Message as LangGraphMessage } from \"@langchain/langgraph-sdk/dist/types.messages\";\nimport { ThreadState } from \"@langchain/langgraph-sdk\";\n\ninterface CopilotKitStateEnrichment {\n copilotkit: {\n actions: StateEnrichment[\"ag-ui\"][\"tools\"];\n context: StateEnrichment[\"ag-ui\"][\"context\"];\n };\n}\n\nimport { RunAgentInput, EventType, CustomEvent } from \"@ag-ui/client\";\n\n// Import and re-export from separate file to maintain API compatibility\nimport {\n CustomEventNames,\n TextMessageEvents,\n ToolCallEvents,\n PredictStateTool,\n} from \"./consts\";\nexport { CustomEventNames };\n\nexport class LangGraphAgent extends AGUILangGraphAgent {\n constructor(config: LangGraphAgentConfig) {\n super(config);\n }\n\n dispatchEvent(event: ProcessedEvents) {\n if (event.type === EventType.CUSTOM) {\n // const event = processedEvent as unknown as CustomEvent;\n const customEvent = event as unknown as CustomEvent;\n\n if (customEvent.name === CustomEventNames.CopilotKitManuallyEmitMessage) {\n this.subscriber.next({\n type: EventType.TEXT_MESSAGE_START,\n role: \"assistant\",\n messageId: customEvent.value.message_id,\n rawEvent: event,\n });\n this.subscriber.next({\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId: customEvent.value.message_id,\n delta: customEvent.value.message,\n rawEvent: event,\n });\n this.subscriber.next({\n type: EventType.TEXT_MESSAGE_END,\n messageId: customEvent.value.message_id,\n rawEvent: event,\n });\n return true;\n }\n\n if (\n customEvent.name === CustomEventNames.CopilotKitManuallyEmitToolCall\n ) {\n this.subscriber.next({\n type: EventType.TOOL_CALL_START,\n toolCallId: customEvent.value.id,\n toolCallName: customEvent.value.name,\n parentMessageId: customEvent.value.id,\n rawEvent: event,\n });\n this.subscriber.next({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: customEvent.value.id,\n delta: customEvent.value.args,\n rawEvent: event,\n });\n this.subscriber.next({\n type: EventType.TOOL_CALL_END,\n toolCallId: customEvent.value.id,\n rawEvent: event,\n });\n return true;\n }\n\n if (\n customEvent.name ===\n CustomEventNames.CopilotKitManuallyEmitIntermediateState\n ) {\n this.activeRun.manuallyEmittedState = customEvent.value;\n this.dispatchEvent({\n type: EventType.STATE_SNAPSHOT,\n snapshot: this.getStateSnapshot({\n values: this.activeRun.manuallyEmittedState,\n } as ThreadState<State>),\n rawEvent: event,\n });\n return true;\n }\n\n if (customEvent.name === CustomEventNames.CopilotKitExit) {\n this.subscriber.next({\n type: EventType.CUSTOM,\n name: \"Exit\",\n value: true,\n });\n return true;\n }\n }\n\n // Intercept all text message and tool call events and check if should disable\n const rawEvent = (event as ToolCallEvents | TextMessageEvents).rawEvent;\n if (!rawEvent) {\n this.subscriber.next(event);\n return true;\n }\n\n const isMessageEvent =\n event.type === EventType.TEXT_MESSAGE_START ||\n event.type === EventType.TEXT_MESSAGE_CONTENT ||\n event.type === EventType.TEXT_MESSAGE_END;\n const isToolEvent =\n event.type === EventType.TOOL_CALL_START ||\n event.type === EventType.TOOL_CALL_ARGS ||\n event.type === EventType.TOOL_CALL_END;\n if (\"copilotkit:emit-tool-calls\" in (rawEvent.metadata || {})) {\n if (\n rawEvent.metadata[\"copilotkit:emit-tool-calls\"] === false &&\n isToolEvent\n ) {\n return false;\n }\n }\n if (\"copilotkit:emit-messages\" in (rawEvent.metadata || {})) {\n if (\n rawEvent.metadata[\"copilotkit:emit-messages\"] === false &&\n isMessageEvent\n ) {\n return false;\n }\n }\n\n this.subscriber.next(event);\n return true;\n }\n\n // @ts-ignore\n run(input: RunAgentInput) {\n return super.run(input).pipe(\n map((processedEvent) => {\n // Turn raw event into emit state snapshot from tool call event\n if (processedEvent.type === EventType.RAW) {\n // Get the LangGraph event from the AGUI event.\n const event =\n (processedEvent as RawEvent).event ??\n (processedEvent as RawEvent).rawEvent;\n\n const eventType = event.event;\n const toolCallData = event.data?.chunk?.tool_call_chunks?.[0];\n const toolCallUsedToPredictState = event.metadata?.[\n \"copilotkit:emit-intermediate-state\"\n ]?.some(\n (predictStateTool: PredictStateTool) =>\n predictStateTool.tool === toolCallData?.name,\n );\n\n if (\n eventType === LangGraphEventTypes.OnChatModelStream &&\n toolCallUsedToPredictState\n ) {\n return {\n type: EventType.CUSTOM,\n name: \"PredictState\",\n value: event.metadata[\"copilotkit:emit-intermediate-state\"],\n };\n }\n }\n\n return processedEvent;\n }),\n );\n }\n\n langGraphDefaultMergeState(\n state: State,\n messages: LangGraphMessage[],\n input: RunAgentInput,\n ): State<StateEnrichment & CopilotKitStateEnrichment> {\n const aguiMergedState = super.langGraphDefaultMergeState(\n state,\n messages,\n input,\n );\n const { tools: returnedTools, \"ag-ui\": agui } = aguiMergedState;\n // tolerate undefined and de-duplicate by stable key (id | name | key)\n const rawCombinedTools = [\n ...((returnedTools as any[]) ?? []),\n ...((agui?.tools as any[]) ?? []),\n ];\n const combinedTools = Array.from(\n new Map(\n rawCombinedTools.map((t: any) => [\n t?.id ?? t?.name ?? t?.key ?? JSON.stringify(t),\n t,\n ]),\n ).values(),\n );\n\n return {\n ...aguiMergedState,\n copilotkit: {\n actions: combinedTools,\n context: agui?.context ?? [],\n },\n };\n }\n\n async getSchemaKeys(): Promise<SchemaKeys> {\n const CONSTANT_KEYS = [\"copilotkit\"];\n const schemaKeys = await super.getSchemaKeys();\n return {\n config: schemaKeys.config,\n input: schemaKeys.input ? [...schemaKeys.input, ...CONSTANT_KEYS] : null,\n output: schemaKeys.output\n ? [...schemaKeys.output, ...CONSTANT_KEYS]\n : null,\n context: schemaKeys.context\n ? [...schemaKeys.context, ...CONSTANT_KEYS]\n : null,\n };\n }\n}\n\nexport { LangGraphHttpAgent };\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"agent.cjs","names":["AGUILangGraphAgent","EventType","CustomEventNames","LangGraphEventTypes","AGUILangGraphHttpAgent"],"sources":["../../../../../src/lib/runtime/agent-integrations/langgraph/agent.ts"],"sourcesContent":["import { map } from \"rxjs\";\nimport { LangGraphEventTypes } from \"../../../../agents/langgraph/events\";\nimport { RawEvent } from \"@ag-ui/core\";\nimport {\n LangGraphAgent as AGUILangGraphAgent,\n LangGraphHttpAgent as AGUILangGraphHttpAgent,\n type LangGraphAgentConfig,\n ProcessedEvents,\n SchemaKeys,\n type State,\n StateEnrichment,\n} from \"@ag-ui/langgraph\";\nimport type { HttpAgentConfig, Message } from \"@ag-ui/client\";\nimport { Message as LangGraphMessage } from \"@langchain/langgraph-sdk/dist/types.messages\";\nimport { ThreadState } from \"@langchain/langgraph-sdk\";\n\ninterface CopilotKitStateEnrichment {\n copilotkit: {\n actions: StateEnrichment[\"ag-ui\"][\"tools\"];\n context: StateEnrichment[\"ag-ui\"][\"context\"];\n };\n}\n\nimport { RunAgentInput, EventType, CustomEvent } from \"@ag-ui/client\";\n\n// Import and re-export from separate file to maintain API compatibility\nimport {\n CustomEventNames,\n TextMessageEvents,\n ToolCallEvents,\n PredictStateTool,\n} from \"./consts\";\nexport { CustomEventNames };\n\nexport class LangGraphAgent extends AGUILangGraphAgent {\n constructor(config: LangGraphAgentConfig) {\n super(config);\n }\n\n dispatchEvent(event: ProcessedEvents) {\n if (event.type === EventType.CUSTOM) {\n // const event = processedEvent as unknown as CustomEvent;\n const customEvent = event as unknown as CustomEvent;\n\n if (customEvent.name === CustomEventNames.CopilotKitManuallyEmitMessage) {\n this.subscriber.next({\n type: EventType.TEXT_MESSAGE_START,\n role: \"assistant\",\n messageId: customEvent.value.message_id,\n rawEvent: event,\n });\n this.subscriber.next({\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId: customEvent.value.message_id,\n delta: customEvent.value.message,\n rawEvent: event,\n });\n this.subscriber.next({\n type: EventType.TEXT_MESSAGE_END,\n messageId: customEvent.value.message_id,\n rawEvent: event,\n });\n return true;\n }\n\n if (\n customEvent.name === CustomEventNames.CopilotKitManuallyEmitToolCall\n ) {\n this.subscriber.next({\n type: EventType.TOOL_CALL_START,\n toolCallId: customEvent.value.id,\n toolCallName: customEvent.value.name,\n parentMessageId: customEvent.value.id,\n rawEvent: event,\n });\n this.subscriber.next({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: customEvent.value.id,\n delta: customEvent.value.args,\n rawEvent: event,\n });\n this.subscriber.next({\n type: EventType.TOOL_CALL_END,\n toolCallId: customEvent.value.id,\n rawEvent: event,\n });\n return true;\n }\n\n if (\n customEvent.name ===\n CustomEventNames.CopilotKitManuallyEmitIntermediateState\n ) {\n this.activeRun.manuallyEmittedState = customEvent.value;\n this.dispatchEvent({\n type: EventType.STATE_SNAPSHOT,\n snapshot: this.getStateSnapshot({\n values: this.activeRun.manuallyEmittedState,\n } as ThreadState<State>),\n rawEvent: event,\n });\n return true;\n }\n\n if (customEvent.name === CustomEventNames.CopilotKitExit) {\n this.subscriber.next({\n type: EventType.CUSTOM,\n name: \"Exit\",\n value: true,\n });\n return true;\n }\n }\n\n // Intercept all text message and tool call events and check if should disable\n const rawEvent = (event as ToolCallEvents | TextMessageEvents).rawEvent;\n if (!rawEvent) {\n this.subscriber.next(event);\n return true;\n }\n\n const isMessageEvent =\n event.type === EventType.TEXT_MESSAGE_START ||\n event.type === EventType.TEXT_MESSAGE_CONTENT ||\n event.type === EventType.TEXT_MESSAGE_END;\n const isToolEvent =\n event.type === EventType.TOOL_CALL_START ||\n event.type === EventType.TOOL_CALL_ARGS ||\n event.type === EventType.TOOL_CALL_END;\n if (\"copilotkit:emit-tool-calls\" in (rawEvent.metadata || {})) {\n if (\n rawEvent.metadata[\"copilotkit:emit-tool-calls\"] === false &&\n isToolEvent\n ) {\n return false;\n }\n }\n if (\"copilotkit:emit-messages\" in (rawEvent.metadata || {})) {\n if (\n rawEvent.metadata[\"copilotkit:emit-messages\"] === false &&\n isMessageEvent\n ) {\n return false;\n }\n }\n\n this.subscriber.next(event);\n return true;\n }\n\n // @ts-ignore\n run(input: RunAgentInput) {\n return super.run(input).pipe(\n map((processedEvent) => {\n // Turn raw event into emit state snapshot from tool call event\n if (processedEvent.type === EventType.RAW) {\n // Get the LangGraph event from the AGUI event.\n const event =\n (processedEvent as RawEvent).event ??\n (processedEvent as RawEvent).rawEvent;\n\n const eventType = event.event;\n const toolCallData = event.data?.chunk?.tool_call_chunks?.[0];\n const toolCallUsedToPredictState = event.metadata?.[\n \"copilotkit:emit-intermediate-state\"\n ]?.some(\n (predictStateTool: PredictStateTool) =>\n predictStateTool.tool === toolCallData?.name,\n );\n\n if (\n eventType === LangGraphEventTypes.OnChatModelStream &&\n toolCallUsedToPredictState\n ) {\n return {\n type: EventType.CUSTOM,\n name: \"PredictState\",\n value: event.metadata[\"copilotkit:emit-intermediate-state\"],\n };\n }\n }\n\n return processedEvent;\n }),\n );\n }\n\n langGraphDefaultMergeState(\n state: State,\n messages: LangGraphMessage[],\n input: RunAgentInput,\n ): State<StateEnrichment & CopilotKitStateEnrichment> {\n const aguiMergedState = super.langGraphDefaultMergeState(\n state,\n messages,\n input,\n );\n const { tools: returnedTools, \"ag-ui\": agui } = aguiMergedState;\n // tolerate undefined and de-duplicate by stable key (id | name | key)\n const rawCombinedTools = [\n ...((returnedTools as any[]) ?? []),\n ...((agui?.tools as any[]) ?? []),\n ];\n const combinedTools = Array.from(\n new Map(\n rawCombinedTools.map((t: any) => [\n t?.id ?? t?.name ?? t?.key ?? JSON.stringify(t),\n t,\n ]),\n ).values(),\n );\n\n return {\n ...aguiMergedState,\n copilotkit: {\n actions: combinedTools,\n context: agui?.context ?? [],\n },\n };\n }\n\n async getSchemaKeys(): Promise<SchemaKeys> {\n const CONSTANT_KEYS = [\"copilotkit\"];\n const schemaKeys = await super.getSchemaKeys();\n return {\n config: schemaKeys.config,\n input: schemaKeys.input ? [...schemaKeys.input, ...CONSTANT_KEYS] : null,\n output: schemaKeys.output\n ? [...schemaKeys.output, ...CONSTANT_KEYS]\n : null,\n context: schemaKeys.context\n ? [...schemaKeys.context, ...CONSTANT_KEYS]\n : null,\n };\n }\n\n async loadState(threadId: string) {\n const threadState = await this.client.threads.getState(threadId);\n return {\n state: threadState.values as Record<string, any>,\n };\n }\n}\n\ntype LoadStateFn = (\n threadId: string,\n headers?: Record<string, string>,\n) => Promise<{ state: Record<string, any>; messages?: Message[] } | null>;\n\ninterface LangGraphHttpAgentConfig extends HttpAgentConfig {\n loadState?: LoadStateFn;\n}\n\nexport class LangGraphHttpAgent extends AGUILangGraphHttpAgent {\n private _loadState?: LoadStateFn;\n\n constructor(config: LangGraphHttpAgentConfig) {\n super(config);\n this._loadState = config.loadState;\n }\n\n async loadState(threadId: string, headers?: Record<string, string>) {\n if (!this._loadState) return null;\n return this._loadState(threadId, headers);\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
|
|
2
2
|
import { CustomEventNames } from "./consts.cjs";
|
|
3
3
|
import * as rxjs from "rxjs";
|
|
4
|
-
import { EventType, RunAgentInput } from "@ag-ui/client";
|
|
4
|
+
import { EventType, HttpAgentConfig, Message, RunAgentInput } from "@ag-ui/client";
|
|
5
5
|
import * as zod from "zod";
|
|
6
6
|
import { LangGraphAgent, LangGraphAgentConfig, LangGraphHttpAgent, ProcessedEvents, SchemaKeys, State, StateEnrichment } from "@ag-ui/langgraph";
|
|
7
|
-
import { Message } from "@langchain/langgraph-sdk/dist/types.messages";
|
|
7
|
+
import { Message as Message$1 } from "@langchain/langgraph-sdk/dist/types.messages";
|
|
8
8
|
|
|
9
9
|
//#region src/lib/runtime/agent-integrations/langgraph/agent.d.ts
|
|
10
10
|
interface CopilotKitStateEnrichment {
|
|
@@ -843,9 +843,27 @@ declare class LangGraphAgent$1 extends LangGraphAgent {
|
|
|
843
843
|
name: string;
|
|
844
844
|
value: any;
|
|
845
845
|
}>;
|
|
846
|
-
langGraphDefaultMergeState(state: State, messages: Message[], input: RunAgentInput): State<StateEnrichment & CopilotKitStateEnrichment>;
|
|
846
|
+
langGraphDefaultMergeState(state: State, messages: Message$1[], input: RunAgentInput): State<StateEnrichment & CopilotKitStateEnrichment>;
|
|
847
847
|
getSchemaKeys(): Promise<SchemaKeys>;
|
|
848
|
+
loadState(threadId: string): Promise<{
|
|
849
|
+
state: Record<string, any>;
|
|
850
|
+
}>;
|
|
851
|
+
}
|
|
852
|
+
type LoadStateFn = (threadId: string, headers?: Record<string, string>) => Promise<{
|
|
853
|
+
state: Record<string, any>;
|
|
854
|
+
messages?: Message[];
|
|
855
|
+
} | null>;
|
|
856
|
+
interface LangGraphHttpAgentConfig extends HttpAgentConfig {
|
|
857
|
+
loadState?: LoadStateFn;
|
|
858
|
+
}
|
|
859
|
+
declare class LangGraphHttpAgent$1 extends LangGraphHttpAgent {
|
|
860
|
+
private _loadState?;
|
|
861
|
+
constructor(config: LangGraphHttpAgentConfig);
|
|
862
|
+
loadState(threadId: string, headers?: Record<string, string>): Promise<{
|
|
863
|
+
state: Record<string, any>;
|
|
864
|
+
messages?: Message[];
|
|
865
|
+
}>;
|
|
848
866
|
}
|
|
849
867
|
//#endregion
|
|
850
|
-
export { LangGraphAgent$1 as LangGraphAgent, LangGraphHttpAgent };
|
|
868
|
+
export { LangGraphAgent$1 as LangGraphAgent, LangGraphHttpAgent$1 as LangGraphHttpAgent };
|
|
851
869
|
//# sourceMappingURL=agent.d.cts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.d.cts","names":[],"sources":["../../../../../src/lib/runtime/agent-integrations/langgraph/agent.ts"],"mappings":";;;;;;;;;
|
|
1
|
+
{"version":3,"file":"agent.d.cts","names":[],"sources":["../../../../../src/lib/runtime/agent-integrations/langgraph/agent.ts"],"mappings":";;;;;;;;;UAgBU,yBAAA;EACR,UAAA;IACE,OAAA,EAAS,eAAA;IACT,OAAA,EAAS,eAAA;EAAA;AAAA;AAAA,cAeA,gBAAA,SAAuB,cAAA;cACtB,MAAA,EAAQ,oBAAA;EAIpB,aAAA,CAAc,KAAA,EAAO,eAAA;EAgHrB,GAAA,CAAI,KAAA,EAAO,aAAA,QAAa,UAAA,KAAA,gBAAA;+BAAA,GAAA,CAAA,SAAA;;;;;;;+BAAA,GAAA,CAAA,SAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoCxB,0BAAA,CACE,KAAA,EAAO,KAAA,EACP,QAAA,EAAU,SAAA,IACV,KAAA,EAAO,aAAA,GACN,KAAA,CAAM,eAAA,GAAkB,yBAAA;EA8BrB,aAAA,CAAA,GAAiB,OAAA,CAAQ,UAAA;EAezB,SAAA,CAAU,QAAA,WAAgB,OAAA;WAGC,MAAA;EAAA;AAAA;AAAA,KAK9B,WAAA,IACH,QAAA,UACA,OAAA,GAAU,MAAA,qBACP,OAAA;EAAU,KAAA,EAAO,MAAA;EAAqB,QAAA,GAAW,OAAA;AAAA;AAAA,UAE5C,wBAAA,SAAiC,eAAA;EACzC,SAAA,GAAY,WAAA;AAAA;AAAA,cAGD,oBAAA,SAA2B,kBAAA;EAAA,QAC9B,UAAA;cAEI,MAAA,EAAQ,wBAAA;EAKd,SAAA,CAAU,QAAA,UAAkB,OAAA,GAAU,MAAA,mBAAsB,OAAA;WAd9C,MAAA;eAAgC,OAAA;EAAA;AAAA"}
|
|
@@ -2,9 +2,9 @@ import "reflect-metadata";
|
|
|
2
2
|
import { CustomEventNames } from "./consts.mjs";
|
|
3
3
|
import * as rxjs from "rxjs";
|
|
4
4
|
import { LangGraphAgent, LangGraphAgentConfig, LangGraphHttpAgent, ProcessedEvents, SchemaKeys, State, StateEnrichment } from "@ag-ui/langgraph";
|
|
5
|
-
import { EventType, RunAgentInput } from "@ag-ui/client";
|
|
5
|
+
import { EventType, HttpAgentConfig, Message, RunAgentInput } from "@ag-ui/client";
|
|
6
6
|
import * as zod from "zod";
|
|
7
|
-
import { Message } from "@langchain/langgraph-sdk/dist/types.messages";
|
|
7
|
+
import { Message as Message$1 } from "@langchain/langgraph-sdk/dist/types.messages";
|
|
8
8
|
|
|
9
9
|
//#region src/lib/runtime/agent-integrations/langgraph/agent.d.ts
|
|
10
10
|
interface CopilotKitStateEnrichment {
|
|
@@ -843,9 +843,27 @@ declare class LangGraphAgent$1 extends LangGraphAgent {
|
|
|
843
843
|
name: string;
|
|
844
844
|
value: any;
|
|
845
845
|
}>;
|
|
846
|
-
langGraphDefaultMergeState(state: State, messages: Message[], input: RunAgentInput): State<StateEnrichment & CopilotKitStateEnrichment>;
|
|
846
|
+
langGraphDefaultMergeState(state: State, messages: Message$1[], input: RunAgentInput): State<StateEnrichment & CopilotKitStateEnrichment>;
|
|
847
847
|
getSchemaKeys(): Promise<SchemaKeys>;
|
|
848
|
+
loadState(threadId: string): Promise<{
|
|
849
|
+
state: Record<string, any>;
|
|
850
|
+
}>;
|
|
851
|
+
}
|
|
852
|
+
type LoadStateFn = (threadId: string, headers?: Record<string, string>) => Promise<{
|
|
853
|
+
state: Record<string, any>;
|
|
854
|
+
messages?: Message[];
|
|
855
|
+
} | null>;
|
|
856
|
+
interface LangGraphHttpAgentConfig extends HttpAgentConfig {
|
|
857
|
+
loadState?: LoadStateFn;
|
|
858
|
+
}
|
|
859
|
+
declare class LangGraphHttpAgent$1 extends LangGraphHttpAgent {
|
|
860
|
+
private _loadState?;
|
|
861
|
+
constructor(config: LangGraphHttpAgentConfig);
|
|
862
|
+
loadState(threadId: string, headers?: Record<string, string>): Promise<{
|
|
863
|
+
state: Record<string, any>;
|
|
864
|
+
messages?: Message[];
|
|
865
|
+
}>;
|
|
848
866
|
}
|
|
849
867
|
//#endregion
|
|
850
|
-
export { LangGraphAgent$1 as LangGraphAgent, LangGraphHttpAgent };
|
|
868
|
+
export { LangGraphAgent$1 as LangGraphAgent, LangGraphHttpAgent$1 as LangGraphHttpAgent };
|
|
851
869
|
//# sourceMappingURL=agent.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.d.mts","names":[],"sources":["../../../../../src/lib/runtime/agent-integrations/langgraph/agent.ts"],"mappings":";;;;;;;;;
|
|
1
|
+
{"version":3,"file":"agent.d.mts","names":[],"sources":["../../../../../src/lib/runtime/agent-integrations/langgraph/agent.ts"],"mappings":";;;;;;;;;UAgBU,yBAAA;EACR,UAAA;IACE,OAAA,EAAS,eAAA;IACT,OAAA,EAAS,eAAA;EAAA;AAAA;AAAA,cAeA,gBAAA,SAAuB,cAAA;cACtB,MAAA,EAAQ,oBAAA;EAIpB,aAAA,CAAc,KAAA,EAAO,eAAA;EAgHrB,GAAA,CAAI,KAAA,EAAO,aAAA,QAAa,UAAA,KAAA,gBAAA;+BAAA,GAAA,CAAA,SAAA;;;;;;;+BAAA,GAAA,CAAA,SAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoCxB,0BAAA,CACE,KAAA,EAAO,KAAA,EACP,QAAA,EAAU,SAAA,IACV,KAAA,EAAO,aAAA,GACN,KAAA,CAAM,eAAA,GAAkB,yBAAA;EA8BrB,aAAA,CAAA,GAAiB,OAAA,CAAQ,UAAA;EAezB,SAAA,CAAU,QAAA,WAAgB,OAAA;WAGC,MAAA;EAAA;AAAA;AAAA,KAK9B,WAAA,IACH,QAAA,UACA,OAAA,GAAU,MAAA,qBACP,OAAA;EAAU,KAAA,EAAO,MAAA;EAAqB,QAAA,GAAW,OAAA;AAAA;AAAA,UAE5C,wBAAA,SAAiC,eAAA;EACzC,SAAA,GAAY,WAAA;AAAA;AAAA,cAGD,oBAAA,SAA2B,kBAAA;EAAA,QAC9B,UAAA;cAEI,MAAA,EAAQ,wBAAA;EAKd,SAAA,CAAU,QAAA,UAAkB,OAAA,GAAU,MAAA,mBAAsB,OAAA;WAd9C,MAAA;eAAgC,OAAA;EAAA;AAAA"}
|
|
@@ -127,8 +127,21 @@ var LangGraphAgent$1 = class extends LangGraphAgent {
|
|
|
127
127
|
context: schemaKeys.context ? [...schemaKeys.context, ...CONSTANT_KEYS] : null
|
|
128
128
|
};
|
|
129
129
|
}
|
|
130
|
+
async loadState(threadId) {
|
|
131
|
+
return { state: (await this.client.threads.getState(threadId)).values };
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
var LangGraphHttpAgent$1 = class extends LangGraphHttpAgent {
|
|
135
|
+
constructor(config) {
|
|
136
|
+
super(config);
|
|
137
|
+
this._loadState = config.loadState;
|
|
138
|
+
}
|
|
139
|
+
async loadState(threadId, headers) {
|
|
140
|
+
if (!this._loadState) return null;
|
|
141
|
+
return this._loadState(threadId, headers);
|
|
142
|
+
}
|
|
130
143
|
};
|
|
131
144
|
|
|
132
145
|
//#endregion
|
|
133
|
-
export { LangGraphAgent$1 as LangGraphAgent, LangGraphHttpAgent };
|
|
146
|
+
export { LangGraphAgent$1 as LangGraphAgent, LangGraphHttpAgent$1 as LangGraphHttpAgent };
|
|
134
147
|
//# sourceMappingURL=agent.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.mjs","names":["LangGraphAgent","AGUILangGraphAgent"],"sources":["../../../../../src/lib/runtime/agent-integrations/langgraph/agent.ts"],"sourcesContent":["import { map } from \"rxjs\";\nimport { LangGraphEventTypes } from \"../../../../agents/langgraph/events\";\nimport { RawEvent } from \"@ag-ui/core\";\nimport {\n LangGraphAgent as AGUILangGraphAgent,\n LangGraphHttpAgent,\n type LangGraphAgentConfig,\n ProcessedEvents,\n SchemaKeys,\n type State,\n StateEnrichment,\n} from \"@ag-ui/langgraph\";\nimport { Message as LangGraphMessage } from \"@langchain/langgraph-sdk/dist/types.messages\";\nimport { ThreadState } from \"@langchain/langgraph-sdk\";\n\ninterface CopilotKitStateEnrichment {\n copilotkit: {\n actions: StateEnrichment[\"ag-ui\"][\"tools\"];\n context: StateEnrichment[\"ag-ui\"][\"context\"];\n };\n}\n\nimport { RunAgentInput, EventType, CustomEvent } from \"@ag-ui/client\";\n\n// Import and re-export from separate file to maintain API compatibility\nimport {\n CustomEventNames,\n TextMessageEvents,\n ToolCallEvents,\n PredictStateTool,\n} from \"./consts\";\nexport { CustomEventNames };\n\nexport class LangGraphAgent extends AGUILangGraphAgent {\n constructor(config: LangGraphAgentConfig) {\n super(config);\n }\n\n dispatchEvent(event: ProcessedEvents) {\n if (event.type === EventType.CUSTOM) {\n // const event = processedEvent as unknown as CustomEvent;\n const customEvent = event as unknown as CustomEvent;\n\n if (customEvent.name === CustomEventNames.CopilotKitManuallyEmitMessage) {\n this.subscriber.next({\n type: EventType.TEXT_MESSAGE_START,\n role: \"assistant\",\n messageId: customEvent.value.message_id,\n rawEvent: event,\n });\n this.subscriber.next({\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId: customEvent.value.message_id,\n delta: customEvent.value.message,\n rawEvent: event,\n });\n this.subscriber.next({\n type: EventType.TEXT_MESSAGE_END,\n messageId: customEvent.value.message_id,\n rawEvent: event,\n });\n return true;\n }\n\n if (\n customEvent.name === CustomEventNames.CopilotKitManuallyEmitToolCall\n ) {\n this.subscriber.next({\n type: EventType.TOOL_CALL_START,\n toolCallId: customEvent.value.id,\n toolCallName: customEvent.value.name,\n parentMessageId: customEvent.value.id,\n rawEvent: event,\n });\n this.subscriber.next({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: customEvent.value.id,\n delta: customEvent.value.args,\n rawEvent: event,\n });\n this.subscriber.next({\n type: EventType.TOOL_CALL_END,\n toolCallId: customEvent.value.id,\n rawEvent: event,\n });\n return true;\n }\n\n if (\n customEvent.name ===\n CustomEventNames.CopilotKitManuallyEmitIntermediateState\n ) {\n this.activeRun.manuallyEmittedState = customEvent.value;\n this.dispatchEvent({\n type: EventType.STATE_SNAPSHOT,\n snapshot: this.getStateSnapshot({\n values: this.activeRun.manuallyEmittedState,\n } as ThreadState<State>),\n rawEvent: event,\n });\n return true;\n }\n\n if (customEvent.name === CustomEventNames.CopilotKitExit) {\n this.subscriber.next({\n type: EventType.CUSTOM,\n name: \"Exit\",\n value: true,\n });\n return true;\n }\n }\n\n // Intercept all text message and tool call events and check if should disable\n const rawEvent = (event as ToolCallEvents | TextMessageEvents).rawEvent;\n if (!rawEvent) {\n this.subscriber.next(event);\n return true;\n }\n\n const isMessageEvent =\n event.type === EventType.TEXT_MESSAGE_START ||\n event.type === EventType.TEXT_MESSAGE_CONTENT ||\n event.type === EventType.TEXT_MESSAGE_END;\n const isToolEvent =\n event.type === EventType.TOOL_CALL_START ||\n event.type === EventType.TOOL_CALL_ARGS ||\n event.type === EventType.TOOL_CALL_END;\n if (\"copilotkit:emit-tool-calls\" in (rawEvent.metadata || {})) {\n if (\n rawEvent.metadata[\"copilotkit:emit-tool-calls\"] === false &&\n isToolEvent\n ) {\n return false;\n }\n }\n if (\"copilotkit:emit-messages\" in (rawEvent.metadata || {})) {\n if (\n rawEvent.metadata[\"copilotkit:emit-messages\"] === false &&\n isMessageEvent\n ) {\n return false;\n }\n }\n\n this.subscriber.next(event);\n return true;\n }\n\n // @ts-ignore\n run(input: RunAgentInput) {\n return super.run(input).pipe(\n map((processedEvent) => {\n // Turn raw event into emit state snapshot from tool call event\n if (processedEvent.type === EventType.RAW) {\n // Get the LangGraph event from the AGUI event.\n const event =\n (processedEvent as RawEvent).event ??\n (processedEvent as RawEvent).rawEvent;\n\n const eventType = event.event;\n const toolCallData = event.data?.chunk?.tool_call_chunks?.[0];\n const toolCallUsedToPredictState = event.metadata?.[\n \"copilotkit:emit-intermediate-state\"\n ]?.some(\n (predictStateTool: PredictStateTool) =>\n predictStateTool.tool === toolCallData?.name,\n );\n\n if (\n eventType === LangGraphEventTypes.OnChatModelStream &&\n toolCallUsedToPredictState\n ) {\n return {\n type: EventType.CUSTOM,\n name: \"PredictState\",\n value: event.metadata[\"copilotkit:emit-intermediate-state\"],\n };\n }\n }\n\n return processedEvent;\n }),\n );\n }\n\n langGraphDefaultMergeState(\n state: State,\n messages: LangGraphMessage[],\n input: RunAgentInput,\n ): State<StateEnrichment & CopilotKitStateEnrichment> {\n const aguiMergedState = super.langGraphDefaultMergeState(\n state,\n messages,\n input,\n );\n const { tools: returnedTools, \"ag-ui\": agui } = aguiMergedState;\n // tolerate undefined and de-duplicate by stable key (id | name | key)\n const rawCombinedTools = [\n ...((returnedTools as any[]) ?? []),\n ...((agui?.tools as any[]) ?? []),\n ];\n const combinedTools = Array.from(\n new Map(\n rawCombinedTools.map((t: any) => [\n t?.id ?? t?.name ?? t?.key ?? JSON.stringify(t),\n t,\n ]),\n ).values(),\n );\n\n return {\n ...aguiMergedState,\n copilotkit: {\n actions: combinedTools,\n context: agui?.context ?? [],\n },\n };\n }\n\n async getSchemaKeys(): Promise<SchemaKeys> {\n const CONSTANT_KEYS = [\"copilotkit\"];\n const schemaKeys = await super.getSchemaKeys();\n return {\n config: schemaKeys.config,\n input: schemaKeys.input ? [...schemaKeys.input, ...CONSTANT_KEYS] : null,\n output: schemaKeys.output\n ? [...schemaKeys.output, ...CONSTANT_KEYS]\n : null,\n context: schemaKeys.context\n ? [...schemaKeys.context, ...CONSTANT_KEYS]\n : null,\n };\n }\n}\n\nexport { LangGraphHttpAgent };\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"agent.mjs","names":["LangGraphAgent","AGUILangGraphAgent","LangGraphHttpAgent","AGUILangGraphHttpAgent"],"sources":["../../../../../src/lib/runtime/agent-integrations/langgraph/agent.ts"],"sourcesContent":["import { map } from \"rxjs\";\nimport { LangGraphEventTypes } from \"../../../../agents/langgraph/events\";\nimport { RawEvent } from \"@ag-ui/core\";\nimport {\n LangGraphAgent as AGUILangGraphAgent,\n LangGraphHttpAgent as AGUILangGraphHttpAgent,\n type LangGraphAgentConfig,\n ProcessedEvents,\n SchemaKeys,\n type State,\n StateEnrichment,\n} from \"@ag-ui/langgraph\";\nimport type { HttpAgentConfig, Message } from \"@ag-ui/client\";\nimport { Message as LangGraphMessage } from \"@langchain/langgraph-sdk/dist/types.messages\";\nimport { ThreadState } from \"@langchain/langgraph-sdk\";\n\ninterface CopilotKitStateEnrichment {\n copilotkit: {\n actions: StateEnrichment[\"ag-ui\"][\"tools\"];\n context: StateEnrichment[\"ag-ui\"][\"context\"];\n };\n}\n\nimport { RunAgentInput, EventType, CustomEvent } from \"@ag-ui/client\";\n\n// Import and re-export from separate file to maintain API compatibility\nimport {\n CustomEventNames,\n TextMessageEvents,\n ToolCallEvents,\n PredictStateTool,\n} from \"./consts\";\nexport { CustomEventNames };\n\nexport class LangGraphAgent extends AGUILangGraphAgent {\n constructor(config: LangGraphAgentConfig) {\n super(config);\n }\n\n dispatchEvent(event: ProcessedEvents) {\n if (event.type === EventType.CUSTOM) {\n // const event = processedEvent as unknown as CustomEvent;\n const customEvent = event as unknown as CustomEvent;\n\n if (customEvent.name === CustomEventNames.CopilotKitManuallyEmitMessage) {\n this.subscriber.next({\n type: EventType.TEXT_MESSAGE_START,\n role: \"assistant\",\n messageId: customEvent.value.message_id,\n rawEvent: event,\n });\n this.subscriber.next({\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId: customEvent.value.message_id,\n delta: customEvent.value.message,\n rawEvent: event,\n });\n this.subscriber.next({\n type: EventType.TEXT_MESSAGE_END,\n messageId: customEvent.value.message_id,\n rawEvent: event,\n });\n return true;\n }\n\n if (\n customEvent.name === CustomEventNames.CopilotKitManuallyEmitToolCall\n ) {\n this.subscriber.next({\n type: EventType.TOOL_CALL_START,\n toolCallId: customEvent.value.id,\n toolCallName: customEvent.value.name,\n parentMessageId: customEvent.value.id,\n rawEvent: event,\n });\n this.subscriber.next({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: customEvent.value.id,\n delta: customEvent.value.args,\n rawEvent: event,\n });\n this.subscriber.next({\n type: EventType.TOOL_CALL_END,\n toolCallId: customEvent.value.id,\n rawEvent: event,\n });\n return true;\n }\n\n if (\n customEvent.name ===\n CustomEventNames.CopilotKitManuallyEmitIntermediateState\n ) {\n this.activeRun.manuallyEmittedState = customEvent.value;\n this.dispatchEvent({\n type: EventType.STATE_SNAPSHOT,\n snapshot: this.getStateSnapshot({\n values: this.activeRun.manuallyEmittedState,\n } as ThreadState<State>),\n rawEvent: event,\n });\n return true;\n }\n\n if (customEvent.name === CustomEventNames.CopilotKitExit) {\n this.subscriber.next({\n type: EventType.CUSTOM,\n name: \"Exit\",\n value: true,\n });\n return true;\n }\n }\n\n // Intercept all text message and tool call events and check if should disable\n const rawEvent = (event as ToolCallEvents | TextMessageEvents).rawEvent;\n if (!rawEvent) {\n this.subscriber.next(event);\n return true;\n }\n\n const isMessageEvent =\n event.type === EventType.TEXT_MESSAGE_START ||\n event.type === EventType.TEXT_MESSAGE_CONTENT ||\n event.type === EventType.TEXT_MESSAGE_END;\n const isToolEvent =\n event.type === EventType.TOOL_CALL_START ||\n event.type === EventType.TOOL_CALL_ARGS ||\n event.type === EventType.TOOL_CALL_END;\n if (\"copilotkit:emit-tool-calls\" in (rawEvent.metadata || {})) {\n if (\n rawEvent.metadata[\"copilotkit:emit-tool-calls\"] === false &&\n isToolEvent\n ) {\n return false;\n }\n }\n if (\"copilotkit:emit-messages\" in (rawEvent.metadata || {})) {\n if (\n rawEvent.metadata[\"copilotkit:emit-messages\"] === false &&\n isMessageEvent\n ) {\n return false;\n }\n }\n\n this.subscriber.next(event);\n return true;\n }\n\n // @ts-ignore\n run(input: RunAgentInput) {\n return super.run(input).pipe(\n map((processedEvent) => {\n // Turn raw event into emit state snapshot from tool call event\n if (processedEvent.type === EventType.RAW) {\n // Get the LangGraph event from the AGUI event.\n const event =\n (processedEvent as RawEvent).event ??\n (processedEvent as RawEvent).rawEvent;\n\n const eventType = event.event;\n const toolCallData = event.data?.chunk?.tool_call_chunks?.[0];\n const toolCallUsedToPredictState = event.metadata?.[\n \"copilotkit:emit-intermediate-state\"\n ]?.some(\n (predictStateTool: PredictStateTool) =>\n predictStateTool.tool === toolCallData?.name,\n );\n\n if (\n eventType === LangGraphEventTypes.OnChatModelStream &&\n toolCallUsedToPredictState\n ) {\n return {\n type: EventType.CUSTOM,\n name: \"PredictState\",\n value: event.metadata[\"copilotkit:emit-intermediate-state\"],\n };\n }\n }\n\n return processedEvent;\n }),\n );\n }\n\n langGraphDefaultMergeState(\n state: State,\n messages: LangGraphMessage[],\n input: RunAgentInput,\n ): State<StateEnrichment & CopilotKitStateEnrichment> {\n const aguiMergedState = super.langGraphDefaultMergeState(\n state,\n messages,\n input,\n );\n const { tools: returnedTools, \"ag-ui\": agui } = aguiMergedState;\n // tolerate undefined and de-duplicate by stable key (id | name | key)\n const rawCombinedTools = [\n ...((returnedTools as any[]) ?? []),\n ...((agui?.tools as any[]) ?? []),\n ];\n const combinedTools = Array.from(\n new Map(\n rawCombinedTools.map((t: any) => [\n t?.id ?? t?.name ?? t?.key ?? JSON.stringify(t),\n t,\n ]),\n ).values(),\n );\n\n return {\n ...aguiMergedState,\n copilotkit: {\n actions: combinedTools,\n context: agui?.context ?? [],\n },\n };\n }\n\n async getSchemaKeys(): Promise<SchemaKeys> {\n const CONSTANT_KEYS = [\"copilotkit\"];\n const schemaKeys = await super.getSchemaKeys();\n return {\n config: schemaKeys.config,\n input: schemaKeys.input ? [...schemaKeys.input, ...CONSTANT_KEYS] : null,\n output: schemaKeys.output\n ? [...schemaKeys.output, ...CONSTANT_KEYS]\n : null,\n context: schemaKeys.context\n ? [...schemaKeys.context, ...CONSTANT_KEYS]\n : null,\n };\n }\n\n async loadState(threadId: string) {\n const threadState = await this.client.threads.getState(threadId);\n return {\n state: threadState.values as Record<string, any>,\n };\n }\n}\n\ntype LoadStateFn = (\n threadId: string,\n headers?: Record<string, string>,\n) => Promise<{ state: Record<string, any>; messages?: Message[] } | null>;\n\ninterface LangGraphHttpAgentConfig extends HttpAgentConfig {\n loadState?: LoadStateFn;\n}\n\nexport class LangGraphHttpAgent extends AGUILangGraphHttpAgent {\n private _loadState?: LoadStateFn;\n\n constructor(config: LangGraphHttpAgentConfig) {\n super(config);\n this._loadState = config.loadState;\n }\n\n async loadState(threadId: string, headers?: Record<string, string>) {\n if (!this._loadState) return null;\n return this._loadState(threadId, headers);\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
require("reflect-metadata");
|
|
2
|
+
|
|
3
|
+
//#region src/lib/runtime/agent-integrations/langgraph/convert-messages.ts
|
|
4
|
+
/**
|
|
5
|
+
* Convert an array of LangGraph messages to AG-UI Message format.
|
|
6
|
+
*
|
|
7
|
+
* LangGraph messages use `type` ("human", "ai", "tool", "system") while
|
|
8
|
+
* AG-UI uses `role` ("user", "assistant", "tool", "system") with different
|
|
9
|
+
* required fields per role.
|
|
10
|
+
*/
|
|
11
|
+
function convertLangGraphMessages(messages) {
|
|
12
|
+
return messages.map((msg) => {
|
|
13
|
+
const msgType = msg.type;
|
|
14
|
+
if (msgType === "tool") return {
|
|
15
|
+
id: msg.id,
|
|
16
|
+
role: "tool",
|
|
17
|
+
content: typeof msg.content === "string" ? msg.content : JSON.stringify(msg.content ?? ""),
|
|
18
|
+
toolCallId: msg.tool_call_id ?? msg.id
|
|
19
|
+
};
|
|
20
|
+
if (msgType === "human") {
|
|
21
|
+
let content;
|
|
22
|
+
if (typeof msg.content === "string") content = msg.content;
|
|
23
|
+
else if (Array.isArray(msg.content)) content = msg.content.filter((p) => p.type === "text").map((p) => p.text).join("") || "";
|
|
24
|
+
else content = String(msg.content ?? "");
|
|
25
|
+
return {
|
|
26
|
+
id: msg.id,
|
|
27
|
+
role: "user",
|
|
28
|
+
content
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
if (msgType === "ai") {
|
|
32
|
+
const base = {
|
|
33
|
+
id: msg.id,
|
|
34
|
+
role: "assistant"
|
|
35
|
+
};
|
|
36
|
+
if (typeof msg.content === "string" && msg.content.length > 0) base.content = msg.content;
|
|
37
|
+
else if (Array.isArray(msg.content)) {
|
|
38
|
+
const text = msg.content.filter((p) => p.type === "text").map((p) => p.text).join("");
|
|
39
|
+
if (text.length > 0) base.content = text;
|
|
40
|
+
}
|
|
41
|
+
if (msg.tool_calls?.length) base.toolCalls = msg.tool_calls.map((tc) => ({
|
|
42
|
+
id: tc.id,
|
|
43
|
+
type: "function",
|
|
44
|
+
function: {
|
|
45
|
+
name: tc.name,
|
|
46
|
+
arguments: typeof tc.args === "string" ? tc.args : JSON.stringify(tc.args)
|
|
47
|
+
}
|
|
48
|
+
}));
|
|
49
|
+
return base;
|
|
50
|
+
}
|
|
51
|
+
if (msgType === "system") return {
|
|
52
|
+
id: msg.id,
|
|
53
|
+
role: "system",
|
|
54
|
+
content: typeof msg.content === "string" ? msg.content : JSON.stringify(msg.content ?? "")
|
|
55
|
+
};
|
|
56
|
+
return null;
|
|
57
|
+
}).filter((msg) => msg !== null);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
//#endregion
|
|
61
|
+
exports.convertLangGraphMessages = convertLangGraphMessages;
|
|
62
|
+
//# sourceMappingURL=convert-messages.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"convert-messages.cjs","names":[],"sources":["../../../../../src/lib/runtime/agent-integrations/langgraph/convert-messages.ts"],"sourcesContent":["import type { Message } from \"@ag-ui/client\";\n\n/**\n * Convert an array of LangGraph messages to AG-UI Message format.\n *\n * LangGraph messages use `type` (\"human\", \"ai\", \"tool\", \"system\") while\n * AG-UI uses `role` (\"user\", \"assistant\", \"tool\", \"system\") with different\n * required fields per role.\n */\nexport function convertLangGraphMessages(messages: any[]): Message[] {\n return messages\n .map((msg: any): Message | null => {\n const msgType: string = msg.type;\n\n if (msgType === \"tool\") {\n return {\n id: msg.id,\n role: \"tool\" as const,\n content:\n typeof msg.content === \"string\"\n ? msg.content\n : JSON.stringify(msg.content ?? \"\"),\n toolCallId: msg.tool_call_id ?? msg.id,\n };\n }\n\n if (msgType === \"human\") {\n let content: string;\n if (typeof msg.content === \"string\") {\n content = msg.content;\n } else if (Array.isArray(msg.content)) {\n content =\n msg.content\n .filter((p: any) => p.type === \"text\")\n .map((p: any) => p.text)\n .join(\"\") || \"\";\n } else {\n content = String(msg.content ?? \"\");\n }\n return { id: msg.id, role: \"user\" as const, content };\n }\n\n if (msgType === \"ai\") {\n const base: Record<string, unknown> = {\n id: msg.id,\n role: \"assistant\" as const,\n };\n if (typeof msg.content === \"string\" && msg.content.length > 0) {\n base.content = msg.content;\n } else if (Array.isArray(msg.content)) {\n const text = msg.content\n .filter((p: any) => p.type === \"text\")\n .map((p: any) => p.text)\n .join(\"\");\n if (text.length > 0) base.content = text;\n }\n if (msg.tool_calls?.length) {\n base.toolCalls = msg.tool_calls.map((tc: any) => ({\n id: tc.id,\n type: \"function\" as const,\n function: {\n name: tc.name,\n arguments:\n typeof tc.args === \"string\" ? tc.args : JSON.stringify(tc.args),\n },\n }));\n }\n return base as Message;\n }\n\n if (msgType === \"system\") {\n return {\n id: msg.id,\n role: \"system\" as const,\n content:\n typeof msg.content === \"string\"\n ? msg.content\n : JSON.stringify(msg.content ?? \"\"),\n };\n }\n\n // Unknown type - return null to be filtered\n return null;\n })\n .filter((msg): msg is Message => msg !== null);\n}\n"],"mappings":";;;;;;;;;;AASA,SAAgB,yBAAyB,UAA4B;AACnE,QAAO,SACJ,KAAK,QAA6B;EACjC,MAAM,UAAkB,IAAI;AAE5B,MAAI,YAAY,OACd,QAAO;GACL,IAAI,IAAI;GACR,MAAM;GACN,SACE,OAAO,IAAI,YAAY,WACnB,IAAI,UACJ,KAAK,UAAU,IAAI,WAAW,GAAG;GACvC,YAAY,IAAI,gBAAgB,IAAI;GACrC;AAGH,MAAI,YAAY,SAAS;GACvB,IAAI;AACJ,OAAI,OAAO,IAAI,YAAY,SACzB,WAAU,IAAI;YACL,MAAM,QAAQ,IAAI,QAAQ,CACnC,WACE,IAAI,QACD,QAAQ,MAAW,EAAE,SAAS,OAAO,CACrC,KAAK,MAAW,EAAE,KAAK,CACvB,KAAK,GAAG,IAAI;OAEjB,WAAU,OAAO,IAAI,WAAW,GAAG;AAErC,UAAO;IAAE,IAAI,IAAI;IAAI,MAAM;IAAiB;IAAS;;AAGvD,MAAI,YAAY,MAAM;GACpB,MAAM,OAAgC;IACpC,IAAI,IAAI;IACR,MAAM;IACP;AACD,OAAI,OAAO,IAAI,YAAY,YAAY,IAAI,QAAQ,SAAS,EAC1D,MAAK,UAAU,IAAI;YACV,MAAM,QAAQ,IAAI,QAAQ,EAAE;IACrC,MAAM,OAAO,IAAI,QACd,QAAQ,MAAW,EAAE,SAAS,OAAO,CACrC,KAAK,MAAW,EAAE,KAAK,CACvB,KAAK,GAAG;AACX,QAAI,KAAK,SAAS,EAAG,MAAK,UAAU;;AAEtC,OAAI,IAAI,YAAY,OAClB,MAAK,YAAY,IAAI,WAAW,KAAK,QAAa;IAChD,IAAI,GAAG;IACP,MAAM;IACN,UAAU;KACR,MAAM,GAAG;KACT,WACE,OAAO,GAAG,SAAS,WAAW,GAAG,OAAO,KAAK,UAAU,GAAG,KAAK;KAClE;IACF,EAAE;AAEL,UAAO;;AAGT,MAAI,YAAY,SACd,QAAO;GACL,IAAI,IAAI;GACR,MAAM;GACN,SACE,OAAO,IAAI,YAAY,WACnB,IAAI,UACJ,KAAK,UAAU,IAAI,WAAW,GAAG;GACxC;AAIH,SAAO;GACP,CACD,QAAQ,QAAwB,QAAQ,KAAK"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
|
|
2
|
+
import { Message } from "@ag-ui/client";
|
|
3
|
+
|
|
4
|
+
//#region src/lib/runtime/agent-integrations/langgraph/convert-messages.d.ts
|
|
5
|
+
/**
|
|
6
|
+
* Convert an array of LangGraph messages to AG-UI Message format.
|
|
7
|
+
*
|
|
8
|
+
* LangGraph messages use `type` ("human", "ai", "tool", "system") while
|
|
9
|
+
* AG-UI uses `role` ("user", "assistant", "tool", "system") with different
|
|
10
|
+
* required fields per role.
|
|
11
|
+
*/
|
|
12
|
+
declare function convertLangGraphMessages(messages: any[]): Message[];
|
|
13
|
+
//#endregion
|
|
14
|
+
export { convertLangGraphMessages };
|
|
15
|
+
//# sourceMappingURL=convert-messages.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"convert-messages.d.cts","names":[],"sources":["../../../../../src/lib/runtime/agent-integrations/langgraph/convert-messages.ts"],"mappings":";;;;;;AASA;;;;;iBAAgB,wBAAA,CAAyB,QAAA,UAAkB,OAAA"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import "reflect-metadata";
|
|
2
|
+
import { Message } from "@ag-ui/client";
|
|
3
|
+
|
|
4
|
+
//#region src/lib/runtime/agent-integrations/langgraph/convert-messages.d.ts
|
|
5
|
+
/**
|
|
6
|
+
* Convert an array of LangGraph messages to AG-UI Message format.
|
|
7
|
+
*
|
|
8
|
+
* LangGraph messages use `type` ("human", "ai", "tool", "system") while
|
|
9
|
+
* AG-UI uses `role` ("user", "assistant", "tool", "system") with different
|
|
10
|
+
* required fields per role.
|
|
11
|
+
*/
|
|
12
|
+
declare function convertLangGraphMessages(messages: any[]): Message[];
|
|
13
|
+
//#endregion
|
|
14
|
+
export { convertLangGraphMessages };
|
|
15
|
+
//# sourceMappingURL=convert-messages.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"convert-messages.d.mts","names":[],"sources":["../../../../../src/lib/runtime/agent-integrations/langgraph/convert-messages.ts"],"mappings":";;;;;;AASA;;;;;iBAAgB,wBAAA,CAAyB,QAAA,UAAkB,OAAA"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import "reflect-metadata";
|
|
2
|
+
//#region src/lib/runtime/agent-integrations/langgraph/convert-messages.ts
|
|
3
|
+
/**
|
|
4
|
+
* Convert an array of LangGraph messages to AG-UI Message format.
|
|
5
|
+
*
|
|
6
|
+
* LangGraph messages use `type` ("human", "ai", "tool", "system") while
|
|
7
|
+
* AG-UI uses `role` ("user", "assistant", "tool", "system") with different
|
|
8
|
+
* required fields per role.
|
|
9
|
+
*/
|
|
10
|
+
function convertLangGraphMessages(messages) {
|
|
11
|
+
return messages.map((msg) => {
|
|
12
|
+
const msgType = msg.type;
|
|
13
|
+
if (msgType === "tool") return {
|
|
14
|
+
id: msg.id,
|
|
15
|
+
role: "tool",
|
|
16
|
+
content: typeof msg.content === "string" ? msg.content : JSON.stringify(msg.content ?? ""),
|
|
17
|
+
toolCallId: msg.tool_call_id ?? msg.id
|
|
18
|
+
};
|
|
19
|
+
if (msgType === "human") {
|
|
20
|
+
let content;
|
|
21
|
+
if (typeof msg.content === "string") content = msg.content;
|
|
22
|
+
else if (Array.isArray(msg.content)) content = msg.content.filter((p) => p.type === "text").map((p) => p.text).join("") || "";
|
|
23
|
+
else content = String(msg.content ?? "");
|
|
24
|
+
return {
|
|
25
|
+
id: msg.id,
|
|
26
|
+
role: "user",
|
|
27
|
+
content
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
if (msgType === "ai") {
|
|
31
|
+
const base = {
|
|
32
|
+
id: msg.id,
|
|
33
|
+
role: "assistant"
|
|
34
|
+
};
|
|
35
|
+
if (typeof msg.content === "string" && msg.content.length > 0) base.content = msg.content;
|
|
36
|
+
else if (Array.isArray(msg.content)) {
|
|
37
|
+
const text = msg.content.filter((p) => p.type === "text").map((p) => p.text).join("");
|
|
38
|
+
if (text.length > 0) base.content = text;
|
|
39
|
+
}
|
|
40
|
+
if (msg.tool_calls?.length) base.toolCalls = msg.tool_calls.map((tc) => ({
|
|
41
|
+
id: tc.id,
|
|
42
|
+
type: "function",
|
|
43
|
+
function: {
|
|
44
|
+
name: tc.name,
|
|
45
|
+
arguments: typeof tc.args === "string" ? tc.args : JSON.stringify(tc.args)
|
|
46
|
+
}
|
|
47
|
+
}));
|
|
48
|
+
return base;
|
|
49
|
+
}
|
|
50
|
+
if (msgType === "system") return {
|
|
51
|
+
id: msg.id,
|
|
52
|
+
role: "system",
|
|
53
|
+
content: typeof msg.content === "string" ? msg.content : JSON.stringify(msg.content ?? "")
|
|
54
|
+
};
|
|
55
|
+
return null;
|
|
56
|
+
}).filter((msg) => msg !== null);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
//#endregion
|
|
60
|
+
export { convertLangGraphMessages };
|
|
61
|
+
//# sourceMappingURL=convert-messages.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"convert-messages.mjs","names":[],"sources":["../../../../../src/lib/runtime/agent-integrations/langgraph/convert-messages.ts"],"sourcesContent":["import type { Message } from \"@ag-ui/client\";\n\n/**\n * Convert an array of LangGraph messages to AG-UI Message format.\n *\n * LangGraph messages use `type` (\"human\", \"ai\", \"tool\", \"system\") while\n * AG-UI uses `role` (\"user\", \"assistant\", \"tool\", \"system\") with different\n * required fields per role.\n */\nexport function convertLangGraphMessages(messages: any[]): Message[] {\n return messages\n .map((msg: any): Message | null => {\n const msgType: string = msg.type;\n\n if (msgType === \"tool\") {\n return {\n id: msg.id,\n role: \"tool\" as const,\n content:\n typeof msg.content === \"string\"\n ? msg.content\n : JSON.stringify(msg.content ?? \"\"),\n toolCallId: msg.tool_call_id ?? msg.id,\n };\n }\n\n if (msgType === \"human\") {\n let content: string;\n if (typeof msg.content === \"string\") {\n content = msg.content;\n } else if (Array.isArray(msg.content)) {\n content =\n msg.content\n .filter((p: any) => p.type === \"text\")\n .map((p: any) => p.text)\n .join(\"\") || \"\";\n } else {\n content = String(msg.content ?? \"\");\n }\n return { id: msg.id, role: \"user\" as const, content };\n }\n\n if (msgType === \"ai\") {\n const base: Record<string, unknown> = {\n id: msg.id,\n role: \"assistant\" as const,\n };\n if (typeof msg.content === \"string\" && msg.content.length > 0) {\n base.content = msg.content;\n } else if (Array.isArray(msg.content)) {\n const text = msg.content\n .filter((p: any) => p.type === \"text\")\n .map((p: any) => p.text)\n .join(\"\");\n if (text.length > 0) base.content = text;\n }\n if (msg.tool_calls?.length) {\n base.toolCalls = msg.tool_calls.map((tc: any) => ({\n id: tc.id,\n type: \"function\" as const,\n function: {\n name: tc.name,\n arguments:\n typeof tc.args === \"string\" ? tc.args : JSON.stringify(tc.args),\n },\n }));\n }\n return base as Message;\n }\n\n if (msgType === \"system\") {\n return {\n id: msg.id,\n role: \"system\" as const,\n content:\n typeof msg.content === \"string\"\n ? msg.content\n : JSON.stringify(msg.content ?? \"\"),\n };\n }\n\n // Unknown type - return null to be filtered\n return null;\n })\n .filter((msg): msg is Message => msg !== null);\n}\n"],"mappings":";;;;;;;;;AASA,SAAgB,yBAAyB,UAA4B;AACnE,QAAO,SACJ,KAAK,QAA6B;EACjC,MAAM,UAAkB,IAAI;AAE5B,MAAI,YAAY,OACd,QAAO;GACL,IAAI,IAAI;GACR,MAAM;GACN,SACE,OAAO,IAAI,YAAY,WACnB,IAAI,UACJ,KAAK,UAAU,IAAI,WAAW,GAAG;GACvC,YAAY,IAAI,gBAAgB,IAAI;GACrC;AAGH,MAAI,YAAY,SAAS;GACvB,IAAI;AACJ,OAAI,OAAO,IAAI,YAAY,SACzB,WAAU,IAAI;YACL,MAAM,QAAQ,IAAI,QAAQ,CACnC,WACE,IAAI,QACD,QAAQ,MAAW,EAAE,SAAS,OAAO,CACrC,KAAK,MAAW,EAAE,KAAK,CACvB,KAAK,GAAG,IAAI;OAEjB,WAAU,OAAO,IAAI,WAAW,GAAG;AAErC,UAAO;IAAE,IAAI,IAAI;IAAI,MAAM;IAAiB;IAAS;;AAGvD,MAAI,YAAY,MAAM;GACpB,MAAM,OAAgC;IACpC,IAAI,IAAI;IACR,MAAM;IACP;AACD,OAAI,OAAO,IAAI,YAAY,YAAY,IAAI,QAAQ,SAAS,EAC1D,MAAK,UAAU,IAAI;YACV,MAAM,QAAQ,IAAI,QAAQ,EAAE;IACrC,MAAM,OAAO,IAAI,QACd,QAAQ,MAAW,EAAE,SAAS,OAAO,CACrC,KAAK,MAAW,EAAE,KAAK,CACvB,KAAK,GAAG;AACX,QAAI,KAAK,SAAS,EAAG,MAAK,UAAU;;AAEtC,OAAI,IAAI,YAAY,OAClB,MAAK,YAAY,IAAI,WAAW,KAAK,QAAa;IAChD,IAAI,GAAG;IACP,MAAM;IACN,UAAU;KACR,MAAM,GAAG;KACT,WACE,OAAO,GAAG,SAAS,WAAW,GAAG,OAAO,KAAK,UAAU,GAAG,KAAK;KAClE;IACF,EAAE;AAEL,UAAO;;AAGT,MAAI,YAAY,SACd,QAAO;GACL,IAAI,IAAI;GACR,MAAM;GACN,SACE,OAAO,IAAI,YAAY,WACnB,IAAI,UACJ,KAAK,UAAU,IAAI,WAAW,GAAG;GACxC;AAIH,SAAO;GACP,CACD,QAAQ,QAAwB,QAAQ,KAAK"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
1
|
|
|
2
2
|
import { CustomEventNames, PredictStateTool, TextMessageEvents, ToolCallEvents } from "./consts.cjs";
|
|
3
|
-
import { LangGraphAgent, LangGraphHttpAgent } from "./agent.cjs";
|
|
3
|
+
import { LangGraphAgent, LangGraphHttpAgent } from "./agent.cjs";
|
|
4
|
+
import { convertLangGraphMessages } from "./convert-messages.cjs";
|
|
5
|
+
import { PostgresClient, loadLangGraphPostgresState } from "./load-state.cjs";
|
|
@@ -1,3 +1,5 @@
|
|
|
1
1
|
import "reflect-metadata";
|
|
2
2
|
import { CustomEventNames, PredictStateTool, TextMessageEvents, ToolCallEvents } from "./consts.mjs";
|
|
3
|
-
import { LangGraphAgent, LangGraphHttpAgent } from "./agent.mjs";
|
|
3
|
+
import { LangGraphAgent, LangGraphHttpAgent } from "./agent.mjs";
|
|
4
|
+
import { convertLangGraphMessages } from "./convert-messages.mjs";
|
|
5
|
+
import { PostgresClient, loadLangGraphPostgresState } from "./load-state.mjs";
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
require("reflect-metadata");
|
|
2
|
+
const require_runtime = require('../../../../_virtual/_rolldown/runtime.cjs');
|
|
3
|
+
let _msgpack_msgpack = require("@msgpack/msgpack");
|
|
4
|
+
|
|
5
|
+
//#region src/lib/runtime/agent-integrations/langgraph/load-state.ts
|
|
6
|
+
const extensionCodec = new _msgpack_msgpack.ExtensionCodec();
|
|
7
|
+
const noEncode = () => new Uint8Array(0);
|
|
8
|
+
for (const type of [
|
|
9
|
+
0,
|
|
10
|
+
1,
|
|
11
|
+
2
|
|
12
|
+
]) extensionCodec.register({
|
|
13
|
+
type,
|
|
14
|
+
encode: noEncode,
|
|
15
|
+
decode: (data) => {
|
|
16
|
+
const tup = (0, _msgpack_msgpack.decode)(data, { extensionCodec });
|
|
17
|
+
return tup[2] ?? tup[1];
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
extensionCodec.register({
|
|
21
|
+
type: 3,
|
|
22
|
+
encode: noEncode,
|
|
23
|
+
decode: (data) => {
|
|
24
|
+
const tup = (0, _msgpack_msgpack.decode)(data, { extensionCodec });
|
|
25
|
+
return tup[3] ?? tup[2];
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
for (const type of [4, 5]) extensionCodec.register({
|
|
29
|
+
type,
|
|
30
|
+
encode: noEncode,
|
|
31
|
+
decode: (data) => {
|
|
32
|
+
const tup = (0, _msgpack_msgpack.decode)(data, { extensionCodec });
|
|
33
|
+
return tup[2] ?? tup[1];
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
function decodeMsgpack(buf) {
|
|
37
|
+
return (0, _msgpack_msgpack.decode)(buf, { extensionCodec });
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Query LangGraph's PostgreSQL checkpoint tables and reconstruct the thread's
|
|
41
|
+
* channel_values (the agent state).
|
|
42
|
+
*
|
|
43
|
+
* Returns `null` when no checkpoint exists for the given `threadId`.
|
|
44
|
+
*/
|
|
45
|
+
async function loadLangGraphPostgresState(threadId, client) {
|
|
46
|
+
const { rows } = await client.query(`SELECT
|
|
47
|
+
checkpoint,
|
|
48
|
+
(
|
|
49
|
+
SELECT array_agg(array[bl.channel::bytea, bl.type::bytea, bl.blob])
|
|
50
|
+
FROM jsonb_each_text(checkpoint -> 'channel_versions') cv
|
|
51
|
+
INNER JOIN checkpoint_blobs bl
|
|
52
|
+
ON bl.thread_id = checkpoints.thread_id
|
|
53
|
+
AND bl.checkpoint_ns = checkpoints.checkpoint_ns
|
|
54
|
+
AND bl.channel = cv.key
|
|
55
|
+
AND bl.version = cv.value
|
|
56
|
+
) AS channel_values
|
|
57
|
+
FROM checkpoints
|
|
58
|
+
WHERE thread_id = $1 AND checkpoint_ns = ''
|
|
59
|
+
ORDER BY checkpoint_id DESC
|
|
60
|
+
LIMIT 1`, [threadId]);
|
|
61
|
+
if (rows.length === 0) return null;
|
|
62
|
+
const row = rows[0];
|
|
63
|
+
const state = { ...row.checkpoint.channel_values ?? {} };
|
|
64
|
+
const blobRows = row.channel_values;
|
|
65
|
+
if (blobRows) for (const triple of blobRows) {
|
|
66
|
+
const channel = triple[0].toString("utf-8");
|
|
67
|
+
const type = triple[1].toString("utf-8");
|
|
68
|
+
const blob = triple[2];
|
|
69
|
+
try {
|
|
70
|
+
if (type === "msgpack" && blob) state[channel] = decodeMsgpack(blob);
|
|
71
|
+
else if (type === "json" && blob) state[channel] = JSON.parse(blob.toString("utf-8"));
|
|
72
|
+
else if (type === "bytes" && blob) state[channel] = blob;
|
|
73
|
+
} catch {}
|
|
74
|
+
}
|
|
75
|
+
return state;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
//#endregion
|
|
79
|
+
exports.loadLangGraphPostgresState = loadLangGraphPostgresState;
|
|
80
|
+
//# sourceMappingURL=load-state.cjs.map
|