@copilotkit/runtime 1.50.0-beta.2 → 1.50.0-beta.3

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.
Files changed (35) hide show
  1. package/dist/index.d.ts +71 -281
  2. package/dist/index.js +291 -274
  3. package/dist/index.js.map +1 -1
  4. package/dist/index.mjs +284 -263
  5. package/dist/index.mjs.map +1 -1
  6. package/dist/langgraph.d.ts +284 -0
  7. package/dist/langgraph.js +211 -0
  8. package/dist/langgraph.js.map +1 -0
  9. package/dist/langgraph.mjs +206 -0
  10. package/dist/langgraph.mjs.map +1 -0
  11. package/dist/v2/index.d.ts +1 -0
  12. package/dist/v2/index.js +7 -0
  13. package/dist/v2/index.js.map +1 -1
  14. package/dist/v2/index.mjs +1 -0
  15. package/dist/v2/index.mjs.map +1 -1
  16. package/package.json +48 -15
  17. package/src/langgraph.ts +1 -0
  18. package/src/lib/index.ts +41 -1
  19. package/src/lib/integrations/node-http/index.ts +129 -10
  20. package/src/lib/runtime/agent-integrations/{langgraph.agent.ts → langgraph/agent.ts} +5 -30
  21. package/src/lib/runtime/agent-integrations/langgraph/consts.ts +34 -0
  22. package/src/lib/runtime/agent-integrations/langgraph/index.ts +2 -0
  23. package/src/lib/runtime/copilot-runtime.ts +17 -40
  24. package/src/service-adapters/anthropic/anthropic-adapter.ts +16 -3
  25. package/src/service-adapters/bedrock/bedrock-adapter.ts +4 -1
  26. package/src/service-adapters/experimental/ollama/ollama-adapter.ts +2 -1
  27. package/src/service-adapters/google/google-genai-adapter.ts +9 -4
  28. package/src/service-adapters/groq/groq-adapter.ts +16 -3
  29. package/src/service-adapters/langchain/langchain-adapter.ts +5 -3
  30. package/src/service-adapters/langchain/langserve.ts +2 -1
  31. package/src/service-adapters/openai/openai-adapter.ts +17 -3
  32. package/src/service-adapters/openai/openai-assistant-adapter.ts +26 -11
  33. package/src/service-adapters/unify/unify-adapter.ts +3 -1
  34. package/src/v2/index.ts +1 -0
  35. package/tsup.config.ts +5 -2
@@ -0,0 +1,206 @@
1
+ import { map } from 'rxjs';
2
+ import { LangGraphAgent as LangGraphAgent$1 } from '@ag-ui/langgraph';
3
+ export { LangGraphHttpAgent } from '@ag-ui/langgraph';
4
+ import { EventType } from '@ag-ui/client';
5
+
6
+ var __defProp = Object.defineProperty;
7
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
8
+
9
+ // src/lib/runtime/agent-integrations/langgraph/consts.ts
10
+ var CustomEventNames;
11
+ (function(CustomEventNames3) {
12
+ CustomEventNames3["CopilotKitManuallyEmitMessage"] = "copilotkit_manually_emit_message";
13
+ CustomEventNames3["CopilotKitManuallyEmitToolCall"] = "copilotkit_manually_emit_tool_call";
14
+ CustomEventNames3["CopilotKitManuallyEmitIntermediateState"] = "copilotkit_manually_emit_intermediate_state";
15
+ CustomEventNames3["CopilotKitExit"] = "copilotkit_exit";
16
+ })(CustomEventNames || (CustomEventNames = {}));
17
+
18
+ // src/agents/langgraph/events.ts
19
+ var LangGraphEventTypes;
20
+ (function(LangGraphEventTypes2) {
21
+ LangGraphEventTypes2["OnChainStart"] = "on_chain_start";
22
+ LangGraphEventTypes2["OnChainStream"] = "on_chain_stream";
23
+ LangGraphEventTypes2["OnChainEnd"] = "on_chain_end";
24
+ LangGraphEventTypes2["OnChatModelStart"] = "on_chat_model_start";
25
+ LangGraphEventTypes2["OnChatModelStream"] = "on_chat_model_stream";
26
+ LangGraphEventTypes2["OnChatModelEnd"] = "on_chat_model_end";
27
+ LangGraphEventTypes2["OnToolStart"] = "on_tool_start";
28
+ LangGraphEventTypes2["OnToolEnd"] = "on_tool_end";
29
+ LangGraphEventTypes2["OnCopilotKitStateSync"] = "on_copilotkit_state_sync";
30
+ LangGraphEventTypes2["OnCopilotKitEmitMessage"] = "on_copilotkit_emit_message";
31
+ LangGraphEventTypes2["OnCopilotKitEmitToolCall"] = "on_copilotkit_emit_tool_call";
32
+ LangGraphEventTypes2["OnCustomEvent"] = "on_custom_event";
33
+ LangGraphEventTypes2["OnInterrupt"] = "on_interrupt";
34
+ LangGraphEventTypes2["OnCopilotKitInterrupt"] = "on_copilotkit_interrupt";
35
+ LangGraphEventTypes2["OnCopilotKitError"] = "on_copilotkit_error";
36
+ })(LangGraphEventTypes || (LangGraphEventTypes = {}));
37
+ var MetaEventNames;
38
+ (function(MetaEventNames2) {
39
+ MetaEventNames2["LangGraphInterruptEvent"] = "LangGraphInterruptEvent";
40
+ MetaEventNames2["CopilotKitLangGraphInterruptEvent"] = "CopilotKitLangGraphInterruptEvent";
41
+ })(MetaEventNames || (MetaEventNames = {}));
42
+ var CustomEventNames2;
43
+ (function(CustomEventNames3) {
44
+ CustomEventNames3["CopilotKitManuallyEmitMessage"] = "copilotkit_manually_emit_message";
45
+ CustomEventNames3["CopilotKitManuallyEmitToolCall"] = "copilotkit_manually_emit_tool_call";
46
+ CustomEventNames3["CopilotKitManuallyEmitIntermediateState"] = "copilotkit_manually_emit_intermediate_state";
47
+ CustomEventNames3["CopilotKitExit"] = "copilotkit_exit";
48
+ })(CustomEventNames2 || (CustomEventNames2 = {}));
49
+ var LangGraphAgent = class extends LangGraphAgent$1 {
50
+ constructor(config) {
51
+ super(config);
52
+ }
53
+ // @ts-ignore
54
+ clone() {
55
+ return new LangGraphAgent(this.config);
56
+ }
57
+ dispatchEvent(event) {
58
+ if (event.type === EventType.CUSTOM) {
59
+ const customEvent = event;
60
+ if (customEvent.name === CustomEventNames.CopilotKitManuallyEmitMessage) {
61
+ this.subscriber.next({
62
+ type: EventType.TEXT_MESSAGE_START,
63
+ role: "assistant",
64
+ messageId: customEvent.value.message_id,
65
+ rawEvent: event
66
+ });
67
+ this.subscriber.next({
68
+ type: EventType.TEXT_MESSAGE_CONTENT,
69
+ messageId: customEvent.value.message_id,
70
+ delta: customEvent.value.message,
71
+ rawEvent: event
72
+ });
73
+ this.subscriber.next({
74
+ type: EventType.TEXT_MESSAGE_END,
75
+ messageId: customEvent.value.message_id,
76
+ rawEvent: event
77
+ });
78
+ return true;
79
+ }
80
+ if (customEvent.name === CustomEventNames.CopilotKitManuallyEmitToolCall) {
81
+ this.subscriber.next({
82
+ type: EventType.TOOL_CALL_START,
83
+ toolCallId: customEvent.value.id,
84
+ toolCallName: customEvent.value.name,
85
+ parentMessageId: customEvent.value.id,
86
+ rawEvent: event
87
+ });
88
+ this.subscriber.next({
89
+ type: EventType.TOOL_CALL_ARGS,
90
+ toolCallId: customEvent.value.id,
91
+ delta: customEvent.value.args,
92
+ rawEvent: event
93
+ });
94
+ this.subscriber.next({
95
+ type: EventType.TOOL_CALL_END,
96
+ toolCallId: customEvent.value.id,
97
+ rawEvent: event
98
+ });
99
+ return true;
100
+ }
101
+ if (customEvent.name === CustomEventNames.CopilotKitManuallyEmitIntermediateState) {
102
+ this.activeRun.manuallyEmittedState = customEvent.value;
103
+ this.dispatchEvent({
104
+ type: EventType.STATE_SNAPSHOT,
105
+ snapshot: this.getStateSnapshot({
106
+ values: this.activeRun.manuallyEmittedState
107
+ }),
108
+ rawEvent: event
109
+ });
110
+ return true;
111
+ }
112
+ if (customEvent.name === CustomEventNames.CopilotKitExit) {
113
+ this.subscriber.next({
114
+ type: EventType.CUSTOM,
115
+ name: "Exit",
116
+ value: true
117
+ });
118
+ return true;
119
+ }
120
+ }
121
+ const rawEvent = event.rawEvent;
122
+ if (!rawEvent) {
123
+ this.subscriber.next(event);
124
+ return true;
125
+ }
126
+ const isMessageEvent = event.type === EventType.TEXT_MESSAGE_START || event.type === EventType.TEXT_MESSAGE_CONTENT || event.type === EventType.TEXT_MESSAGE_END;
127
+ const isToolEvent = event.type === EventType.TOOL_CALL_START || event.type === EventType.TOOL_CALL_ARGS || event.type === EventType.TOOL_CALL_END;
128
+ if ("copilotkit:emit-tool-calls" in (rawEvent.metadata || {})) {
129
+ if (rawEvent.metadata["copilotkit:emit-tool-calls"] === false && isToolEvent) {
130
+ return false;
131
+ }
132
+ }
133
+ if ("copilotkit:emit-messages" in (rawEvent.metadata || {})) {
134
+ if (rawEvent.metadata["copilotkit:emit-messages"] === false && isMessageEvent) {
135
+ return false;
136
+ }
137
+ }
138
+ this.subscriber.next(event);
139
+ return true;
140
+ }
141
+ // @ts-ignore
142
+ run(input) {
143
+ return super.run(input).pipe(map((processedEvent) => {
144
+ var _a, _b, _c, _d, _e;
145
+ if (processedEvent.type === EventType.RAW) {
146
+ const event = processedEvent.event ?? processedEvent.rawEvent;
147
+ const eventType = event.event;
148
+ const toolCallData = (_c = (_b = (_a = event.data) == null ? void 0 : _a.chunk) == null ? void 0 : _b.tool_call_chunks) == null ? void 0 : _c[0];
149
+ const toolCallUsedToPredictState = (_e = (_d = event.metadata) == null ? void 0 : _d["copilotkit:emit-intermediate-state"]) == null ? void 0 : _e.some((predictStateTool) => predictStateTool.tool === (toolCallData == null ? void 0 : toolCallData.name));
150
+ if (eventType === LangGraphEventTypes.OnChatModelStream && toolCallUsedToPredictState) {
151
+ return {
152
+ type: EventType.CUSTOM,
153
+ name: "PredictState",
154
+ value: event.metadata["copilotkit:emit-intermediate-state"]
155
+ };
156
+ }
157
+ }
158
+ return processedEvent;
159
+ }));
160
+ }
161
+ langGraphDefaultMergeState(state, messages, input) {
162
+ const aguiMergedState = super.langGraphDefaultMergeState(state, messages, input);
163
+ const { tools: returnedTools, "ag-ui": agui } = aguiMergedState;
164
+ const rawCombinedTools = [
165
+ ...returnedTools ?? [],
166
+ ...(agui == null ? void 0 : agui.tools) ?? []
167
+ ];
168
+ const combinedTools = Array.from(new Map(rawCombinedTools.map((t) => [
169
+ (t == null ? void 0 : t.id) ?? (t == null ? void 0 : t.name) ?? (t == null ? void 0 : t.key) ?? JSON.stringify(t),
170
+ t
171
+ ])).values());
172
+ return {
173
+ ...aguiMergedState,
174
+ copilotkit: {
175
+ actions: combinedTools,
176
+ context: (agui == null ? void 0 : agui.context) ?? []
177
+ }
178
+ };
179
+ }
180
+ async getSchemaKeys() {
181
+ const CONSTANT_KEYS = [
182
+ "copilotkit"
183
+ ];
184
+ const schemaKeys = await super.getSchemaKeys();
185
+ return {
186
+ config: schemaKeys.config,
187
+ input: schemaKeys.input ? [
188
+ ...schemaKeys.input,
189
+ ...CONSTANT_KEYS
190
+ ] : null,
191
+ output: schemaKeys.output ? [
192
+ ...schemaKeys.output,
193
+ ...CONSTANT_KEYS
194
+ ] : null,
195
+ context: schemaKeys.context ? [
196
+ ...schemaKeys.context,
197
+ ...CONSTANT_KEYS
198
+ ] : null
199
+ };
200
+ }
201
+ };
202
+ __name(LangGraphAgent, "LangGraphAgent");
203
+
204
+ export { CustomEventNames, LangGraphAgent };
205
+ //# sourceMappingURL=out.js.map
206
+ //# sourceMappingURL=langgraph.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/runtime/agent-integrations/langgraph/consts.ts","../src/lib/runtime/agent-integrations/langgraph/agent.ts","../src/agents/langgraph/events.ts"],"names":["CustomEventNames","map","LangGraphEventTypes","MetaEventNames","LangGraphAgent","AGUILangGraphAgent","LangGraphHttpAgent","EventType","constructor","config","clone","dispatchEvent","event","type","CUSTOM","customEvent","name","CopilotKitManuallyEmitMessage","subscriber","next","TEXT_MESSAGE_START","role","messageId","value","message_id","rawEvent","TEXT_MESSAGE_CONTENT","delta","message","TEXT_MESSAGE_END","CopilotKitManuallyEmitToolCall","TOOL_CALL_START","toolCallId","id","toolCallName","parentMessageId","TOOL_CALL_ARGS","args","TOOL_CALL_END","CopilotKitManuallyEmitIntermediateState","activeRun","manuallyEmittedState","STATE_SNAPSHOT","snapshot","getStateSnapshot","values","CopilotKitExit","isMessageEvent","isToolEvent","metadata","run","input","pipe","processedEvent","RAW","eventType","toolCallData","data","chunk","tool_call_chunks","toolCallUsedToPredictState","some","predictStateTool","tool","OnChatModelStream","langGraphDefaultMergeState","state","messages","aguiMergedState","tools","returnedTools","agui","rawCombinedTools","combinedTools","Array","from","Map","t","key","JSON","stringify","copilotkit","actions","context","getSchemaKeys","CONSTANT_KEYS","schemaKeys","output"],"mappings":"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","sourcesContent":["/**\n * Constants for LangGraph integration.\n * This file is separate from langgraph.agent.ts to avoid pulling in @ag-ui/langgraph\n * when only these constants are needed.\n */\n\nimport {\n TextMessageStartEvent,\n TextMessageContentEvent,\n TextMessageEndEvent,\n ToolCallStartEvent,\n ToolCallArgsEvent,\n ToolCallEndEvent,\n} from \"@ag-ui/client\";\n\nexport type TextMessageEvents =\n | TextMessageStartEvent\n | TextMessageContentEvent\n | TextMessageEndEvent;\n\nexport type ToolCallEvents = ToolCallStartEvent | ToolCallArgsEvent | ToolCallEndEvent;\n\nexport enum CustomEventNames {\n CopilotKitManuallyEmitMessage = \"copilotkit_manually_emit_message\",\n CopilotKitManuallyEmitToolCall = \"copilotkit_manually_emit_tool_call\",\n CopilotKitManuallyEmitIntermediateState = \"copilotkit_manually_emit_intermediate_state\",\n CopilotKitExit = \"copilotkit_exit\",\n}\n\nexport interface PredictStateTool {\n tool: string;\n state_key: string;\n tool_argument: string;\n}\n","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 { CustomEventNames, TextMessageEvents, ToolCallEvents, PredictStateTool } from \"./consts\";\nexport { CustomEventNames };\n\nexport class LangGraphAgent extends AGUILangGraphAgent {\n constructor(config: LangGraphAgentConfig) {\n super(config);\n }\n\n // @ts-ignore\n public clone() {\n return new LangGraphAgent(this.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 (customEvent.name === CustomEventNames.CopilotKitManuallyEmitToolCall) {\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 (customEvent.name === CustomEventNames.CopilotKitManuallyEmitIntermediateState) {\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 (rawEvent.metadata[\"copilotkit:emit-tool-calls\"] === false && isToolEvent) {\n return false;\n }\n }\n if (\"copilotkit:emit-messages\" in (rawEvent.metadata || {})) {\n if (rawEvent.metadata[\"copilotkit:emit-messages\"] === false && isMessageEvent) {\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 = (processedEvent as RawEvent).event ?? (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) => predictStateTool.tool === toolCallData?.name,\n );\n\n if (eventType === LangGraphEventTypes.OnChatModelStream && toolCallUsedToPredictState) {\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(state, messages, input);\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) => [t?.id ?? t?.name ?? t?.key ?? JSON.stringify(t), t]),\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 ? [...schemaKeys.output, ...CONSTANT_KEYS] : null,\n context: schemaKeys.context ? [...schemaKeys.context, ...CONSTANT_KEYS] : null,\n };\n }\n}\n\nexport { LangGraphHttpAgent };\n","import { ActionExecutionMessage, ResultMessage, TextMessage } from \"../../graphql/types/converted\";\n\nexport enum LangGraphEventTypes {\n OnChainStart = \"on_chain_start\",\n OnChainStream = \"on_chain_stream\",\n OnChainEnd = \"on_chain_end\",\n OnChatModelStart = \"on_chat_model_start\",\n OnChatModelStream = \"on_chat_model_stream\",\n OnChatModelEnd = \"on_chat_model_end\",\n OnToolStart = \"on_tool_start\",\n OnToolEnd = \"on_tool_end\",\n OnCopilotKitStateSync = \"on_copilotkit_state_sync\",\n OnCopilotKitEmitMessage = \"on_copilotkit_emit_message\",\n OnCopilotKitEmitToolCall = \"on_copilotkit_emit_tool_call\",\n OnCustomEvent = \"on_custom_event\",\n OnInterrupt = \"on_interrupt\",\n OnCopilotKitInterrupt = \"on_copilotkit_interrupt\",\n OnCopilotKitError = \"on_copilotkit_error\",\n}\n\nexport enum MetaEventNames {\n LangGraphInterruptEvent = \"LangGraphInterruptEvent\",\n CopilotKitLangGraphInterruptEvent = \"CopilotKitLangGraphInterruptEvent\",\n}\n\nexport enum CustomEventNames {\n CopilotKitManuallyEmitMessage = \"copilotkit_manually_emit_message\",\n CopilotKitManuallyEmitToolCall = \"copilotkit_manually_emit_tool_call\",\n CopilotKitManuallyEmitIntermediateState = \"copilotkit_manually_emit_intermediate_state\",\n CopilotKitExit = \"copilotkit_exit\",\n}\n\ntype LangGraphOnCopilotKitStateSyncEvent = {\n event: LangGraphEventTypes.OnCopilotKitStateSync;\n thread_id: string;\n agent_name: string;\n node_name: string;\n run_id: string;\n active: boolean;\n role: string;\n state: any;\n running: boolean;\n};\n\ntype LangGraphOnChainStartEvent = {\n event: LangGraphEventTypes.OnChainStart;\n run_id: string;\n name: string;\n tags: string[];\n metadata: { thread_id: string };\n data: {\n input: any;\n };\n parent_ids: string[];\n};\n\ntype LangGraphOnChainEndEvent = {\n event: LangGraphEventTypes.OnChainEnd;\n name: string;\n run_id: string;\n tags: string[];\n metadata: {\n thread_id: string;\n langgraph_step: number;\n langgraph_node: string;\n langgraph_triggers: string[];\n langgraph_task_idx: number;\n thread_ts: string;\n };\n data: {\n input: any;\n output: any;\n };\n parent_ids: string[];\n};\n\ntype LangGraphOnChatModelStartEvent = {\n event: LangGraphEventTypes.OnChatModelStart;\n name: string;\n run_id: string;\n tags: string[];\n metadata: {\n thread_id: string;\n langgraph_step: number;\n langgraph_node: string;\n langgraph_triggers: string[];\n langgraph_task_idx: number;\n thread_ts: string;\n ls_provider: string;\n ls_model_name: string;\n ls_model_type: string;\n ls_temperature: number;\n };\n data: {\n input: {\n messages: {\n lc: number;\n type: string;\n id: string[];\n kwargs: {\n content: string;\n type: string;\n id: string;\n };\n }[][];\n };\n };\n parent_ids: string[];\n};\n\ntype LangGraphOnChatModelStreamEvent = {\n event: LangGraphEventTypes.OnChatModelStream;\n name: string;\n run_id: string;\n tags: string[];\n metadata: {\n thread_id: string;\n langgraph_step: number;\n langgraph_node: string;\n langgraph_triggers: string[];\n langgraph_task_idx: number;\n thread_ts: string;\n ls_provider: string;\n ls_model_name: string;\n ls_model_type: string;\n ls_temperature: number;\n };\n data: {\n chunk: {\n lc: number;\n type: string;\n id: string;\n kwargs: {\n content: string | { text: string; type: string; index: number }[];\n additional_kwargs: {\n tool_calls: {\n index: number;\n id: string;\n function: { arguments: string; name: string };\n type: string;\n }[];\n };\n type: string;\n id: string;\n tool_calls: { name: string; args: {}; id: string; type: string }[];\n tool_call_chunks: {\n name: string;\n args: string;\n id: string;\n index: number;\n type: string;\n }[];\n invalid_tool_calls: any[];\n };\n };\n };\n parent_ids: string[];\n};\n\ntype LangGraphOnChatModelEndEvent = {\n event: LangGraphEventTypes.OnChatModelEnd;\n name: string;\n run_id: string;\n tags: string[];\n metadata: {\n thread_id: string;\n langgraph_step: number;\n langgraph_node: string;\n langgraph_triggers: string[];\n langgraph_task_idx: number;\n thread_ts: string;\n ls_provider: string;\n ls_model_name: string;\n ls_model_type: string;\n ls_temperature: number;\n };\n data: {\n input: any;\n output: {\n generations: {\n text: string;\n generation_info: {\n finish_reason: string;\n model_name: string;\n system_fingerprint: string;\n };\n type: string;\n message: {\n lc: number;\n type: string;\n id: string[];\n kwargs: {\n content: string;\n additional_kwargs: {\n tool_calls: {\n index: number;\n id: string;\n function: { arguments: string; name: string };\n type: string;\n }[];\n };\n response_metadata: {\n finish_reason: string;\n model_name: string;\n system_fingerprint: string;\n };\n type: string;\n id: string;\n tool_calls: { name: string; args: { query: string }; id: string; type: string }[];\n invalid_tool_calls: any[];\n };\n };\n }[][];\n llm_output: any;\n run: any;\n };\n };\n parent_ids: string[];\n};\n\ntype LangGraphOnChainStreamEvent = {\n event: LangGraphEventTypes.OnChainStream;\n name: string;\n run_id: string;\n tags: string[];\n metadata: {\n thread_id: string;\n langgraph_step?: number;\n langgraph_node?: string;\n langgraph_triggers?: string[];\n langgraph_task_idx?: number;\n thread_ts?: string;\n };\n data: {\n chunk: {\n messages: {\n lc: number;\n type: string;\n id: string[];\n kwargs: {\n content: string;\n additional_kwargs?: {\n tool_calls?: {\n index: number;\n id: string;\n function: { arguments: string; name: string };\n type: string;\n }[];\n };\n response_metadata?: {\n finish_reason: string;\n model_name: string;\n system_fingerprint: string;\n };\n type: string;\n id: string;\n tool_calls?: { name: string; args: { query: string }; id: string; type: string }[];\n invalid_tool_calls?: any[];\n };\n }[];\n };\n };\n parent_ids: string[];\n};\n\ntype LangGraphOnToolStartEvent = {\n event: LangGraphEventTypes.OnToolStart;\n name: string;\n run_id: string;\n tags: string[];\n metadata: {\n thread_id: string;\n langgraph_step: number;\n langgraph_node: string;\n langgraph_triggers: string[];\n langgraph_task_idx: number;\n thread_ts: string;\n };\n data: {\n input: {\n query: string;\n };\n };\n parent_ids: string[];\n};\n\ntype LangGraphOnToolEndEvent = {\n event: LangGraphEventTypes.OnToolEnd;\n name: string;\n run_id: string;\n tags: string[];\n metadata: {\n thread_id: string;\n langgraph_step: number;\n langgraph_node: string;\n langgraph_triggers: string[];\n langgraph_task_idx: number;\n thread_ts: string;\n };\n data: {\n input: {\n query: string;\n };\n output: {\n lc: number;\n type: string;\n id: string[];\n kwargs: {\n content: string[];\n type: string;\n name: string;\n tool_call_id: string;\n status: string;\n };\n };\n };\n parent_ids: string[];\n};\n\ntype LangGraphOnCustomEvent = {\n event: LangGraphEventTypes.OnCustomEvent;\n run_id: string;\n name: string;\n tags: string[];\n metadata: {\n thread_id: string;\n langgraph_step: number;\n langgraph_node: string;\n langgraph_triggers: string[];\n langgraph_path: [string, string];\n langgraph_checkpoint_ns: string;\n checkpoint_ns: string;\n };\n data: any;\n parent_ids: string[];\n};\n\ninterface LangGraphInterruptEvent {\n event: LangGraphEventTypes.OnInterrupt;\n value: string;\n}\n\ninterface CopilotKitLangGraphInterruptEvent {\n event: LangGraphEventTypes.OnCopilotKitInterrupt;\n data: { value: string; messages: (TextMessage | ActionExecutionMessage | ResultMessage)[] };\n}\n\ninterface CopilotKitLangGraphErrorEvent {\n event: LangGraphEventTypes.OnCopilotKitError;\n data: {\n error: {\n message: string;\n type: string;\n agent_name: string;\n status_code?: number;\n response_data?: any;\n };\n thread_id: string;\n agent_name: string;\n node_name: string;\n };\n}\n\nexport type LangGraphEvent =\n | LangGraphOnChainStartEvent\n | LangGraphOnChainStreamEvent\n | LangGraphOnChainEndEvent\n | LangGraphOnChatModelStartEvent\n | LangGraphOnChatModelStreamEvent\n | LangGraphOnChatModelEndEvent\n | LangGraphOnToolStartEvent\n | LangGraphOnToolEndEvent\n | LangGraphOnCopilotKitStateSyncEvent\n | LangGraphOnCustomEvent\n | LangGraphInterruptEvent\n | CopilotKitLangGraphInterruptEvent\n | CopilotKitLangGraphErrorEvent;\n"]}
@@ -1 +1,2 @@
1
1
  export * from '@copilotkitnext/runtime';
2
+ export * from '@copilotkitnext/agent';
package/dist/v2/index.js CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  require('reflect-metadata');
4
4
  var runtime = require('@copilotkitnext/runtime');
5
+ var agent = require('@copilotkitnext/agent');
5
6
 
6
7
 
7
8
 
@@ -11,5 +12,11 @@ Object.keys(runtime).forEach(function (k) {
11
12
  get: function () { return runtime[k]; }
12
13
  });
13
14
  });
15
+ Object.keys(agent).forEach(function (k) {
16
+ if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
17
+ enumerable: true,
18
+ get: function () { return agent[k]; }
19
+ });
20
+ });
14
21
  //# sourceMappingURL=out.js.map
15
22
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/v2/index.ts"],"names":[],"mappings":";AAAA,OAAO;AACP,cAAc","sourcesContent":["import \"reflect-metadata\";\nexport * from \"@copilotkitnext/runtime\";\n"]}
1
+ {"version":3,"sources":["../../src/v2/index.ts"],"names":[],"mappings":";AAAA,OAAO;AACP,cAAc;AACd,cAAc","sourcesContent":["import \"reflect-metadata\";\nexport * from \"@copilotkitnext/runtime\";\nexport * from \"@copilotkitnext/agent\";\n"]}
package/dist/v2/index.mjs CHANGED
@@ -1,4 +1,5 @@
1
1
  import 'reflect-metadata';
2
2
  export * from '@copilotkitnext/runtime';
3
+ export * from '@copilotkitnext/agent';
3
4
  //# sourceMappingURL=out.js.map
4
5
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/v2/index.ts"],"names":[],"mappings":";AAAA,OAAO;AACP,cAAc","sourcesContent":["import \"reflect-metadata\";\nexport * from \"@copilotkitnext/runtime\";\n"]}
1
+ {"version":3,"sources":["../../src/v2/index.ts"],"names":[],"mappings":";AAAA,OAAO;AACP,cAAc;AACd,cAAc","sourcesContent":["import \"reflect-metadata\";\nexport * from \"@copilotkitnext/runtime\";\nexport * from \"@copilotkitnext/agent\";\n"]}
package/package.json CHANGED
@@ -9,7 +9,7 @@
9
9
  "publishConfig": {
10
10
  "access": "public"
11
11
  },
12
- "version": "1.50.0-beta.2",
12
+ "version": "1.50.0-beta.3",
13
13
  "sideEffects": false,
14
14
  "main": "./dist/index.js",
15
15
  "module": "./dist/index.mjs",
@@ -23,6 +23,11 @@
23
23
  "import": "./dist/v2/index.mjs",
24
24
  "require": "./dist/v2/index.js",
25
25
  "types": "./dist/v2/index.d.ts"
26
+ },
27
+ "./langgraph": {
28
+ "import": "./dist/langgraph.mjs",
29
+ "require": "./dist/langgraph.js",
30
+ "types": "./dist/langgraph.d.ts"
26
31
  }
27
32
  },
28
33
  "types": "./dist/index.d.ts",
@@ -41,29 +46,21 @@
41
46
  "tsup": "^6.7.0",
42
47
  "typescript": "^5.2.3",
43
48
  "vitest": "^3.2.4",
44
- "zod-to-json-schema": "^3.23.5",
45
- "eslint-config-custom": "1.4.6",
46
- "tsconfig": "1.4.6"
49
+ "tsconfig": "1.4.6",
50
+ "eslint-config-custom": "1.4.6"
47
51
  },
48
52
  "dependencies": {
49
- "@anthropic-ai/sdk": "^0.57.0",
50
53
  "@copilotkitnext/agent": "0.0.23",
51
54
  "@copilotkitnext/runtime": "0.0.23",
52
55
  "@graphql-yoga/plugin-defer-stream": "^3.3.1",
53
- "@langchain/aws": "^0.1.9",
54
- "@langchain/community": "^0.3.29",
56
+ "@hono/node-server": "^1.13.5",
55
57
  "@langchain/core": "^0.3.38",
56
- "@langchain/google-gauth": "^0.1.0",
57
- "@langchain/langgraph-sdk": "^0.0.70",
58
- "@langchain/openai": "^0.4.2",
59
58
  "@scarf/scarf": "^1.3.0",
60
59
  "class-transformer": "^0.5.1",
61
60
  "class-validator": "^0.14.1",
62
61
  "graphql": "^16.8.1",
63
62
  "graphql-scalars": "^1.23.0",
64
63
  "graphql-yoga": "^5.3.1",
65
- "groq-sdk": "^0.5.0",
66
- "@hono/node-server": "^1.13.5",
67
64
  "hono": "^4.10.3",
68
65
  "langchain": "^0.3.3",
69
66
  "openai": "^4.85.1",
@@ -74,18 +71,54 @@
74
71
  "rxjs": "7.8.1",
75
72
  "type-graphql": "2.0.0-rc.1",
76
73
  "zod": "^3.23.3",
77
- "@copilotkit/shared": "1.50.0-beta.2"
74
+ "@copilotkit/shared": "1.50.0-beta.3"
78
75
  },
79
76
  "peerDependencies": {
80
- "@ag-ui/client": ">=0.0.39",
77
+ "@anthropic-ai/sdk": "^0.57.0",
78
+ "@ag-ui/client": "^0.0.41",
81
79
  "@ag-ui/core": ">=0.0.39",
82
80
  "@ag-ui/encoder": ">=0.0.39",
83
81
  "@ag-ui/langgraph": ">=0.0.18",
84
- "@ag-ui/proto": ">=0.0.39"
82
+ "@ag-ui/proto": ">=0.0.39",
83
+ "@langchain/aws": "^0.1.9",
84
+ "@langchain/community": "^0.3.58",
85
+ "@langchain/google-gauth": "^0.1.0",
86
+ "@langchain/langgraph-sdk": "^0.0.70",
87
+ "@langchain/openai": "^0.4.2",
88
+ "groq-sdk": "^0.5.0",
89
+ "langchain": "^0.3.3",
90
+ "openai": "^4.85.1"
85
91
  },
86
92
  "peerDependenciesMeta": {
93
+ "@anthropic-ai/sdk": {
94
+ "optional": true
95
+ },
87
96
  "@ag-ui/langgraph": {
88
97
  "optional": true
98
+ },
99
+ "@langchain/aws": {
100
+ "optional": true
101
+ },
102
+ "@langchain/community": {
103
+ "optional": true
104
+ },
105
+ "@langchain/google-gauth": {
106
+ "optional": true
107
+ },
108
+ "@langchain/langgraph-sdk": {
109
+ "optional": true
110
+ },
111
+ "@langchain/openai": {
112
+ "optional": true
113
+ },
114
+ "groq-sdk": {
115
+ "optional": true
116
+ },
117
+ "langchain": {
118
+ "optional": true
119
+ },
120
+ "openai": {
121
+ "optional": true
89
122
  }
90
123
  },
91
124
  "keywords": [
@@ -0,0 +1 @@
1
+ export * from "./lib/runtime/agent-integrations/langgraph";
package/src/lib/index.ts CHANGED
@@ -8,4 +8,44 @@ export * from "./integrations";
8
8
  export * from "./logger";
9
9
  export * from "./runtime/copilot-runtime";
10
10
  export * from "./runtime/mcp-tools-utils";
11
- export * from "./runtime/agent-integrations/langgraph.agent";
11
+
12
+ // The below re-exports "dummy" classes and types, to get a deprecation warning redirecting the users to import these from the correct, new route
13
+
14
+ /**
15
+ * @deprecated LangGraphAgent import from @copilotkit/runtime is deprecated. Please import it from @copilotkit/runtime/langgraph instead
16
+ */
17
+ export class LangGraphAgent {
18
+ constructor() {
19
+ throw new Error(
20
+ "LangGraphAgent import from @copilotkit/runtime is deprecated. Please import it from @copilotkit/runtime/langgraph instead",
21
+ );
22
+ }
23
+ }
24
+
25
+ /**
26
+ * @deprecated LangGraphHttpAgent import from @copilotkit/runtime is deprecated. Please import it from @copilotkit/runtime/langgraph instead
27
+ */
28
+ export class LangGraphHttpAgent {
29
+ constructor() {
30
+ throw new Error(
31
+ "LangGraphHttpAgent import from @copilotkit/runtime is deprecated. Please import it from @copilotkit/runtime/langgraph instead",
32
+ );
33
+ }
34
+ }
35
+
36
+ /**
37
+ * @deprecated TextMessageEvents import from @copilotkit/runtime is deprecated. Please import it from @copilotkit/runtime/langgraph instead
38
+ */
39
+ export type TextMessageEvents = any;
40
+ /**
41
+ * @deprecated ToolCallEvents import from @copilotkit/runtime is deprecated. Please import it from @copilotkit/runtime/langgraph instead
42
+ */
43
+ export type ToolCallEvents = any;
44
+ /**
45
+ * @deprecated CustomEventNames import from @copilotkit/runtime is deprecated. Please import it from @copilotkit/runtime/langgraph instead
46
+ */
47
+ export type CustomEventNames = any;
48
+ /**
49
+ * @deprecated PredictStateTool import from @copilotkit/runtime is deprecated. Please import it from @copilotkit/runtime/langgraph instead
50
+ */
51
+ export type PredictStateTool = any;
@@ -4,6 +4,8 @@ import { createCopilotEndpointSingleRoute } from "@copilotkitnext/runtime";
4
4
  import { IncomingMessage, ServerResponse } from "http";
5
5
  import { Readable } from "node:stream";
6
6
 
7
+ type IncomingWithBody = IncomingMessage & { body?: unknown; complete?: boolean };
8
+
7
9
  export function readableStreamToNodeStream(webStream: ReadableStream): Readable {
8
10
  const reader = webStream.getReader();
9
11
 
@@ -24,7 +26,10 @@ export function readableStreamToNodeStream(webStream: ReadableStream): Readable
24
26
  }
25
27
 
26
28
  function getFullUrl(req: IncomingMessage): string {
27
- const path = req.url || "/";
29
+ const expressPath =
30
+ (req as any).originalUrl ??
31
+ ((req as any).baseUrl ? `${(req as any).baseUrl}${req.url ?? ""}` : undefined);
32
+ const path = expressPath || req.url || "/";
28
33
  const host =
29
34
  (req.headers["x-forwarded-host"] as string) || (req.headers.host as string) || "localhost";
30
35
  const proto =
@@ -34,6 +39,61 @@ function getFullUrl(req: IncomingMessage): string {
34
39
  return `${proto}://${host}${path}`;
35
40
  }
36
41
 
42
+ function toHeaders(rawHeaders: IncomingMessage["headers"]): Headers {
43
+ const headers = new Headers();
44
+
45
+ for (const [key, value] of Object.entries(rawHeaders)) {
46
+ if (value === undefined) continue;
47
+
48
+ if (Array.isArray(value)) {
49
+ value.forEach((entry) => headers.append(key, entry));
50
+ continue;
51
+ }
52
+
53
+ headers.append(key, value);
54
+ }
55
+
56
+ return headers;
57
+ }
58
+
59
+ function isStreamConsumed(req: IncomingWithBody): boolean {
60
+ const readableState = (req as any)._readableState;
61
+
62
+ return Boolean(
63
+ req.readableEnded || req.complete || readableState?.ended || readableState?.endEmitted,
64
+ );
65
+ }
66
+
67
+ function synthesizeBodyFromParsedBody(
68
+ parsedBody: unknown,
69
+ headers: Headers,
70
+ ): { body: BodyInit | null; contentType?: string } {
71
+ if (parsedBody === null || parsedBody === undefined) {
72
+ return { body: null };
73
+ }
74
+
75
+ if (parsedBody instanceof Buffer || parsedBody instanceof Uint8Array) {
76
+ return { body: parsedBody };
77
+ }
78
+
79
+ if (typeof parsedBody === "string") {
80
+ return { body: parsedBody, contentType: headers.get("content-type") ?? "text/plain" };
81
+ }
82
+
83
+ return {
84
+ body: JSON.stringify(parsedBody),
85
+ contentType: "application/json",
86
+ };
87
+ }
88
+
89
+ function isDisturbedOrLockedError(error: unknown): boolean {
90
+ return (
91
+ error instanceof TypeError &&
92
+ typeof error.message === "string" &&
93
+ (error.message.includes("disturbed") || error.message.includes("locked"))
94
+ );
95
+ }
96
+
37
97
  export function copilotRuntimeNodeHttpEndpoint(options: CreateCopilotRuntimeServerOptions) {
38
98
  const commonConfig = getCommonConfig(options);
39
99
 
@@ -64,19 +124,78 @@ export function copilotRuntimeNodeHttpEndpoint(options: CreateCopilotRuntimeServ
64
124
  basePath: options.baseUrl ?? options.endpoint,
65
125
  });
66
126
 
67
- return async function handler(req: IncomingMessage, res: ServerResponse) {
127
+ return async function handler(req: IncomingWithBody, res: ServerResponse) {
68
128
  const url = getFullUrl(req);
69
129
  const hasBody = req.method !== "GET" && req.method !== "HEAD";
70
130
 
71
- const request = new Request(url, {
72
- method: req.method,
73
- headers: req.headers as any,
74
- body: hasBody ? (req as any) : undefined,
75
- // Node/undici extension
76
- duplex: hasBody ? "half" : undefined,
77
- } as any);
131
+ const baseHeaders = toHeaders(req.headers);
132
+ const parsedBody = req.body;
133
+
134
+ const streamConsumed = isStreamConsumed(req) || parsedBody !== undefined;
135
+ const canStream = hasBody && !streamConsumed;
78
136
 
79
- const response = await honoApp.fetch(request);
137
+ let requestBody: BodyInit | null | undefined = undefined;
138
+ let useDuplex = false;
139
+
140
+ if (hasBody && canStream) {
141
+ requestBody = req as unknown as BodyInit;
142
+ useDuplex = true;
143
+ }
144
+
145
+ if (hasBody && streamConsumed) {
146
+ if (parsedBody !== undefined) {
147
+ const synthesized = synthesizeBodyFromParsedBody(parsedBody, baseHeaders);
148
+ requestBody = synthesized.body ?? undefined;
149
+ baseHeaders.delete("content-length");
150
+
151
+ if (synthesized.contentType) {
152
+ baseHeaders.set("content-type", synthesized.contentType);
153
+ }
154
+
155
+ logger.debug("Request stream already consumed; using parsed req.body to rebuild request.");
156
+ } else {
157
+ logger.warn("Request stream consumed with no available body; sending empty payload.");
158
+ requestBody = undefined;
159
+ }
160
+ }
161
+
162
+ const buildRequest = (body: BodyInit | null | undefined, headers: Headers, duplex: boolean) =>
163
+ new Request(url, {
164
+ method: req.method,
165
+ headers,
166
+ body,
167
+ duplex: duplex ? "half" : undefined,
168
+ } as RequestInit);
169
+
170
+ let response: Response;
171
+ try {
172
+ response = await honoApp.fetch(buildRequest(requestBody, baseHeaders, useDuplex));
173
+ } catch (error) {
174
+ if (isDisturbedOrLockedError(error) && hasBody) {
175
+ logger.warn(
176
+ "Encountered disturbed/locked request body; rebuilding request using parsed body or empty payload.",
177
+ );
178
+
179
+ const fallbackHeaders = new Headers(baseHeaders);
180
+ let fallbackBody: BodyInit | null | undefined;
181
+
182
+ if (parsedBody !== undefined) {
183
+ const synthesized = synthesizeBodyFromParsedBody(parsedBody, fallbackHeaders);
184
+ fallbackBody = synthesized.body ?? undefined;
185
+ fallbackHeaders.delete("content-length");
186
+
187
+ if (synthesized.contentType) {
188
+ fallbackHeaders.set("content-type", synthesized.contentType);
189
+ }
190
+ } else {
191
+ fallbackBody = undefined;
192
+ }
193
+
194
+ response = await honoApp.fetch(buildRequest(fallbackBody, fallbackHeaders, false));
195
+ } else {
196
+ throw error;
197
+ }
198
+ }
80
199
 
81
200
  res.statusCode = response.status;
82
201
  response.headers.forEach((value, key) => {