@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.
- package/dist/index.d.ts +71 -281
- package/dist/index.js +291 -274
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +284 -263
- package/dist/index.mjs.map +1 -1
- package/dist/langgraph.d.ts +284 -0
- package/dist/langgraph.js +211 -0
- package/dist/langgraph.js.map +1 -0
- package/dist/langgraph.mjs +206 -0
- package/dist/langgraph.mjs.map +1 -0
- package/dist/v2/index.d.ts +1 -0
- package/dist/v2/index.js +7 -0
- package/dist/v2/index.js.map +1 -1
- package/dist/v2/index.mjs +1 -0
- package/dist/v2/index.mjs.map +1 -1
- package/package.json +48 -15
- package/src/langgraph.ts +1 -0
- package/src/lib/index.ts +41 -1
- package/src/lib/integrations/node-http/index.ts +129 -10
- package/src/lib/runtime/agent-integrations/{langgraph.agent.ts → langgraph/agent.ts} +5 -30
- package/src/lib/runtime/agent-integrations/langgraph/consts.ts +34 -0
- package/src/lib/runtime/agent-integrations/langgraph/index.ts +2 -0
- package/src/lib/runtime/copilot-runtime.ts +17 -40
- package/src/service-adapters/anthropic/anthropic-adapter.ts +16 -3
- package/src/service-adapters/bedrock/bedrock-adapter.ts +4 -1
- package/src/service-adapters/experimental/ollama/ollama-adapter.ts +2 -1
- package/src/service-adapters/google/google-genai-adapter.ts +9 -4
- package/src/service-adapters/groq/groq-adapter.ts +16 -3
- package/src/service-adapters/langchain/langchain-adapter.ts +5 -3
- package/src/service-adapters/langchain/langserve.ts +2 -1
- package/src/service-adapters/openai/openai-adapter.ts +17 -3
- package/src/service-adapters/openai/openai-assistant-adapter.ts +26 -11
- package/src/service-adapters/unify/unify-adapter.ts +3 -1
- package/src/v2/index.ts +1 -0
- 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"]}
|
package/dist/v2/index.d.ts
CHANGED
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
|
package/dist/v2/index.js.map
CHANGED
|
@@ -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
package/dist/v2/index.mjs.map
CHANGED
|
@@ -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.
|
|
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
|
-
"
|
|
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
|
-
"@
|
|
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.
|
|
74
|
+
"@copilotkit/shared": "1.50.0-beta.3"
|
|
78
75
|
},
|
|
79
76
|
"peerDependencies": {
|
|
80
|
-
"@
|
|
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": [
|
package/src/langgraph.ts
ADDED
|
@@ -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
|
-
|
|
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
|
|
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:
|
|
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
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
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
|
-
|
|
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) => {
|