@assistant-ui/react-google-adk 0.0.10 → 0.0.12
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/README.md +15 -128
- package/dist/AdkClient.d.ts +30 -26
- package/dist/AdkClient.d.ts.map +1 -1
- package/dist/AdkClient.js +131 -165
- package/dist/AdkClient.js.map +1 -1
- package/dist/AdkEventAccumulator.d.ts +43 -39
- package/dist/AdkEventAccumulator.d.ts.map +1 -1
- package/dist/AdkEventAccumulator.js +446 -531
- package/dist/AdkEventAccumulator.js.map +1 -1
- package/dist/AdkSessionAdapter.d.ts +40 -37
- package/dist/AdkSessionAdapter.d.ts.map +1 -1
- package/dist/AdkSessionAdapter.js +134 -155
- package/dist/AdkSessionAdapter.js.map +1 -1
- package/dist/contentToParts.d.ts +6 -2
- package/dist/contentToParts.d.ts.map +1 -1
- package/dist/contentToParts.js +37 -34
- package/dist/contentToParts.js.map +1 -1
- package/dist/convertAdkMessages.d.ts +7 -3
- package/dist/convertAdkMessages.d.ts.map +1 -1
- package/dist/convertAdkMessages.js +93 -86
- package/dist/convertAdkMessages.js.map +1 -1
- package/dist/hooks.d.ts +38 -35
- package/dist/hooks.d.ts.map +1 -1
- package/dist/hooks.js +132 -155
- package/dist/hooks.js.map +1 -1
- package/dist/index.d.ts +10 -11
- package/dist/index.js +10 -10
- package/dist/server/adkEventStream.d.ts +27 -25
- package/dist/server/adkEventStream.d.ts.map +1 -1
- package/dist/server/adkEventStream.js +91 -126
- package/dist/server/adkEventStream.js.map +1 -1
- package/dist/server/createAdkApiRoute.d.ts +26 -23
- package/dist/server/createAdkApiRoute.d.ts.map +1 -1
- package/dist/server/createAdkApiRoute.js +34 -37
- package/dist/server/createAdkApiRoute.js.map +1 -1
- package/dist/server/index.d.ts +4 -4
- package/dist/server/index.js +4 -4
- package/dist/server/parseAdkRequest.d.ts +21 -18
- package/dist/server/parseAdkRequest.d.ts.map +1 -1
- package/dist/server/parseAdkRequest.js +80 -88
- package/dist/server/parseAdkRequest.js.map +1 -1
- package/dist/structuredEvents.d.ts +6 -2
- package/dist/structuredEvents.d.ts.map +1 -1
- package/dist/structuredEvents.js +70 -75
- package/dist/structuredEvents.js.map +1 -1
- package/dist/types.d.ts +231 -227
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +15 -12
- package/dist/types.js.map +1 -1
- package/dist/useAdkMessages.d.ts +32 -26
- package/dist/useAdkMessages.d.ts.map +1 -1
- package/dist/useAdkMessages.js +155 -182
- package/dist/useAdkMessages.js.map +1 -1
- package/dist/useAdkRuntime.d.ts +43 -35
- package/dist/useAdkRuntime.d.ts.map +1 -1
- package/dist/useAdkRuntime.js +195 -273
- package/dist/useAdkRuntime.js.map +1 -1
- package/package.json +8 -8
- package/src/AdkEventAccumulator.test.ts +5 -5
- package/src/AdkSessionAdapter.test.ts +7 -7
- package/src/convertAdkMessages.test.ts +16 -16
- package/src/hooks.ts +0 -2
- package/src/index.ts +3 -12
- package/src/useAdkMessages.ts +0 -1
- package/src/useAdkRuntime.ts +9 -43
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/server/index.d.ts.map +0 -1
- package/dist/server/index.js.map +0 -1
package/dist/useAdkRuntime.js
CHANGED
|
@@ -1,286 +1,208 @@
|
|
|
1
|
-
/// <reference types="@assistant-ui/core/store" />
|
|
2
|
-
import { useEffect, useRef, useState } from "react";
|
|
3
|
-
import { getExternalStoreMessages, } from "@assistant-ui/core";
|
|
4
|
-
import { useCloudThreadListAdapter, useRemoteThreadListRuntime, useExternalMessageConverter, useExternalStoreRuntime, useToolInvocations, } from "@assistant-ui/core/react";
|
|
5
|
-
import { useAui } from "@assistant-ui/store";
|
|
6
|
-
import { useAdkMessages } from "./useAdkMessages.js";
|
|
7
1
|
import { convertAdkMessage } from "./convertAdkMessages.js";
|
|
8
2
|
import { symbolAdkRuntimeExtras } from "./hooks.js";
|
|
9
|
-
import {
|
|
3
|
+
import { useAdkMessages } from "./useAdkMessages.js";
|
|
4
|
+
import { v4 } from "uuid";
|
|
5
|
+
import { useAui } from "@assistant-ui/store";
|
|
6
|
+
import { useEffect, useRef, useState } from "react";
|
|
7
|
+
import { getExternalStoreMessages } from "@assistant-ui/core";
|
|
8
|
+
import { useCloudThreadListAdapter, useExternalMessageConverter, useExternalStoreRuntime, useRemoteThreadListRuntime } from "@assistant-ui/core/react";
|
|
9
|
+
//#region src/useAdkRuntime.ts
|
|
10
10
|
/** @internal — exported for unit tests. */
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
});
|
|
38
|
-
if (content.length === 1 && content[0]?.type === "text") {
|
|
39
|
-
return content[0].text ?? "";
|
|
40
|
-
}
|
|
41
|
-
return content;
|
|
11
|
+
const getMessageContent = (msg) => {
|
|
12
|
+
const content = [...msg.content, ...msg.attachments?.flatMap((a) => a.content) ?? []].map((part) => {
|
|
13
|
+
const type = part.type;
|
|
14
|
+
switch (type) {
|
|
15
|
+
case "text": return {
|
|
16
|
+
type: "text",
|
|
17
|
+
text: part.text
|
|
18
|
+
};
|
|
19
|
+
case "image": return {
|
|
20
|
+
type: "image_url",
|
|
21
|
+
url: part.image
|
|
22
|
+
};
|
|
23
|
+
case "file": return {
|
|
24
|
+
type: "file",
|
|
25
|
+
mimeType: part.mimeType,
|
|
26
|
+
data: part.data,
|
|
27
|
+
...part.filename != null && { filename: part.filename }
|
|
28
|
+
};
|
|
29
|
+
case "tool-call": throw new Error("Tool call appends are not supported.");
|
|
30
|
+
default: throw new Error(`Unsupported append message part type: ${type}`);
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
if (content.length === 1 && content[0]?.type === "text") return content[0].text ?? "";
|
|
34
|
+
return content;
|
|
42
35
|
};
|
|
43
36
|
/** @internal — exported for unit tests. */
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
}
|
|
52
|
-
if (msg.type === "tool") {
|
|
53
|
-
pending.delete(msg.tool_call_id);
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
return [...pending.values()];
|
|
37
|
+
const getPendingToolCalls = (messages) => {
|
|
38
|
+
const pending = /* @__PURE__ */ new Map();
|
|
39
|
+
for (const msg of messages) {
|
|
40
|
+
if (msg.type === "ai" && msg.tool_calls) for (const tc of msg.tool_calls) pending.set(tc.id, tc);
|
|
41
|
+
if (msg.type === "tool") pending.delete(msg.tool_call_id);
|
|
42
|
+
}
|
|
43
|
+
return [...pending.values()];
|
|
57
44
|
};
|
|
58
45
|
/**
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
status: "error",
|
|
78
|
-
}));
|
|
46
|
+
* @internal — exported for unit tests.
|
|
47
|
+
*
|
|
48
|
+
* Returns `{cancelled: true}` tool responses for pending tool calls when the
|
|
49
|
+
* user sends a new turn, EXCEPT for HITL interrupts marked via
|
|
50
|
+
* `long_running_tool_ids` (`adk_request_input`, `adk_request_confirmation`,
|
|
51
|
+
* `adk_request_credential`). Those must be answered through a dedicated tool
|
|
52
|
+
* UI + submit helper, not auto-cancelled.
|
|
53
|
+
*/
|
|
54
|
+
const getPendingCancellations = (messages, longRunningToolIds) => {
|
|
55
|
+
const longRunningSet = new Set(longRunningToolIds);
|
|
56
|
+
return getPendingToolCalls(messages).filter((t) => !longRunningSet.has(t.id)).map((t) => ({
|
|
57
|
+
id: v4(),
|
|
58
|
+
type: "tool",
|
|
59
|
+
name: t.name,
|
|
60
|
+
tool_call_id: t.id,
|
|
61
|
+
content: JSON.stringify({ cancelled: true }),
|
|
62
|
+
status: "error"
|
|
63
|
+
}));
|
|
79
64
|
};
|
|
80
65
|
const truncateAdkMessages = (threadMessages, parentId) => {
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
for (let i = 0; i <= parentIndex && i < threadMessages.length; i++) {
|
|
88
|
-
truncated.push(...getExternalStoreMessages(threadMessages[i]));
|
|
89
|
-
}
|
|
90
|
-
return truncated;
|
|
66
|
+
if (parentId === null) return [];
|
|
67
|
+
const parentIndex = threadMessages.findIndex((m) => m.id === parentId);
|
|
68
|
+
if (parentIndex === -1) return [];
|
|
69
|
+
const truncated = [];
|
|
70
|
+
for (let i = 0; i <= parentIndex && i < threadMessages.length; i++) truncated.push(...getExternalStoreMessages(threadMessages[i]));
|
|
71
|
+
return truncated;
|
|
91
72
|
};
|
|
92
|
-
const useAdkRuntimeImpl = ({ autoCancelPendingToolCalls, adapters: { attachments, dictation, feedback, speech } = {}, unstable_allowCancellation, stream, load, getCheckpointId, eventHandlers
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
? async (parentId, config) => {
|
|
205
|
-
await toolInvocations.abort();
|
|
206
|
-
const truncated = truncateAdkMessages(threadMessagesRef.current, parentId);
|
|
207
|
-
replaceMessages(truncated);
|
|
208
|
-
const externalId = aui.threadListItem().getState().externalId;
|
|
209
|
-
const checkpointId = externalId
|
|
210
|
-
? await getCheckpointId(externalId, truncated)
|
|
211
|
-
: null;
|
|
212
|
-
return handleSendMessage([], {
|
|
213
|
-
runConfig: config.runConfig,
|
|
214
|
-
...(checkpointId && { checkpointId }),
|
|
215
|
-
});
|
|
216
|
-
}
|
|
217
|
-
: undefined,
|
|
218
|
-
onAddToolResult: async ({ toolCallId, toolName, result, isError, artifact, }) => {
|
|
219
|
-
await handleSendMessage([
|
|
220
|
-
{
|
|
221
|
-
id: uuidv4(),
|
|
222
|
-
type: "tool",
|
|
223
|
-
name: toolName,
|
|
224
|
-
tool_call_id: toolCallId,
|
|
225
|
-
content: JSON.stringify(result),
|
|
226
|
-
artifact,
|
|
227
|
-
status: isError ? "error" : "success",
|
|
228
|
-
},
|
|
229
|
-
], {});
|
|
230
|
-
},
|
|
231
|
-
onResumeToolCall: (options) => toolInvocations.resume(options.toolCallId, options.payload),
|
|
232
|
-
onCancel: unstable_allowCancellation
|
|
233
|
-
? async () => {
|
|
234
|
-
cancel();
|
|
235
|
-
await toolInvocations.abort();
|
|
236
|
-
}
|
|
237
|
-
: undefined,
|
|
238
|
-
});
|
|
239
|
-
{
|
|
240
|
-
// biome-ignore lint/correctness/useHookAtTopLevel: intentional conditional/nested hook usage
|
|
241
|
-
const loadRef = useRef(load);
|
|
242
|
-
// biome-ignore lint/correctness/useHookAtTopLevel: intentional conditional/nested hook usage
|
|
243
|
-
useEffect(() => {
|
|
244
|
-
loadRef.current = load;
|
|
245
|
-
});
|
|
246
|
-
// biome-ignore lint/correctness/useHookAtTopLevel: intentional conditional/nested hook usage
|
|
247
|
-
useEffect(() => {
|
|
248
|
-
const loadFn = loadRef.current;
|
|
249
|
-
if (!loadFn)
|
|
250
|
-
return;
|
|
251
|
-
const externalId = aui.threadListItem().getState().externalId;
|
|
252
|
-
if (externalId == null)
|
|
253
|
-
return;
|
|
254
|
-
loadFn(externalId).then(({ messages: msgs }) => {
|
|
255
|
-
replaceMessages(msgs);
|
|
256
|
-
}, (e) => {
|
|
257
|
-
console.warn("Failed to load ADK session:", e);
|
|
258
|
-
});
|
|
259
|
-
}, [aui, replaceMessages]);
|
|
260
|
-
}
|
|
261
|
-
return runtime;
|
|
73
|
+
const useAdkRuntimeImpl = ({ autoCancelPendingToolCalls, adapters: { attachments, dictation, feedback, speech } = {}, unstable_allowCancellation, stream, load, getCheckpointId, eventHandlers }) => {
|
|
74
|
+
const aui = useAui();
|
|
75
|
+
const { messages, stateDelta, agentInfo, longRunningToolIds, artifactDelta, toolConfirmations, authRequests, escalated, messageMetadata, sendMessage, cancel, replaceMessages } = useAdkMessages({
|
|
76
|
+
stream,
|
|
77
|
+
...eventHandlers && { eventHandlers }
|
|
78
|
+
});
|
|
79
|
+
const [isRunning, setIsRunning] = useState(false);
|
|
80
|
+
const [toolStatuses, setToolStatuses] = useState({});
|
|
81
|
+
const hasExecutingTools = Object.values(toolStatuses).some((s) => s?.type === "executing");
|
|
82
|
+
const effectiveIsRunning = isRunning || hasExecutingTools;
|
|
83
|
+
const handleSendMessage = async (msgs, config) => {
|
|
84
|
+
try {
|
|
85
|
+
setIsRunning(true);
|
|
86
|
+
await sendMessage(msgs, config);
|
|
87
|
+
} finally {
|
|
88
|
+
setIsRunning(false);
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
const threadMessages = useExternalMessageConverter({
|
|
92
|
+
callback: convertAdkMessage,
|
|
93
|
+
messages,
|
|
94
|
+
isRunning: effectiveIsRunning
|
|
95
|
+
});
|
|
96
|
+
const threadMessagesRef = useRef(threadMessages);
|
|
97
|
+
threadMessagesRef.current = threadMessages;
|
|
98
|
+
const runtime = useExternalStoreRuntime({
|
|
99
|
+
isRunning: effectiveIsRunning,
|
|
100
|
+
messages: threadMessages,
|
|
101
|
+
unstable_enableToolInvocations: true,
|
|
102
|
+
setToolStatuses,
|
|
103
|
+
adapters: {
|
|
104
|
+
attachments,
|
|
105
|
+
dictation,
|
|
106
|
+
feedback,
|
|
107
|
+
speech
|
|
108
|
+
},
|
|
109
|
+
extras: {
|
|
110
|
+
[symbolAdkRuntimeExtras]: true,
|
|
111
|
+
agentInfo,
|
|
112
|
+
stateDelta,
|
|
113
|
+
artifactDelta,
|
|
114
|
+
longRunningToolIds,
|
|
115
|
+
toolConfirmations,
|
|
116
|
+
authRequests,
|
|
117
|
+
escalated,
|
|
118
|
+
messageMetadata,
|
|
119
|
+
send: handleSendMessage
|
|
120
|
+
},
|
|
121
|
+
onNew: async (msg) => {
|
|
122
|
+
return handleSendMessage([...autoCancelPendingToolCalls !== false ? getPendingCancellations(messages, longRunningToolIds) : [], {
|
|
123
|
+
id: v4(),
|
|
124
|
+
type: "human",
|
|
125
|
+
content: getMessageContent(msg)
|
|
126
|
+
}], { runConfig: msg.runConfig });
|
|
127
|
+
},
|
|
128
|
+
onEdit: getCheckpointId ? async (msg) => {
|
|
129
|
+
const truncated = truncateAdkMessages(threadMessagesRef.current, msg.parentId);
|
|
130
|
+
replaceMessages(truncated);
|
|
131
|
+
const externalId = aui.threadListItem().getState().externalId;
|
|
132
|
+
const checkpointId = externalId ? await getCheckpointId(externalId, truncated) : null;
|
|
133
|
+
return handleSendMessage([{
|
|
134
|
+
id: v4(),
|
|
135
|
+
type: "human",
|
|
136
|
+
content: getMessageContent(msg)
|
|
137
|
+
}], {
|
|
138
|
+
runConfig: msg.runConfig,
|
|
139
|
+
...checkpointId && { checkpointId }
|
|
140
|
+
});
|
|
141
|
+
} : void 0,
|
|
142
|
+
onReload: getCheckpointId ? async (parentId, config) => {
|
|
143
|
+
const truncated = truncateAdkMessages(threadMessagesRef.current, parentId);
|
|
144
|
+
replaceMessages(truncated);
|
|
145
|
+
const externalId = aui.threadListItem().getState().externalId;
|
|
146
|
+
const checkpointId = externalId ? await getCheckpointId(externalId, truncated) : null;
|
|
147
|
+
return handleSendMessage([], {
|
|
148
|
+
runConfig: config.runConfig,
|
|
149
|
+
...checkpointId && { checkpointId }
|
|
150
|
+
});
|
|
151
|
+
} : void 0,
|
|
152
|
+
onAddToolResult: async ({ toolCallId, toolName, result, isError, artifact }) => {
|
|
153
|
+
await handleSendMessage([{
|
|
154
|
+
id: v4(),
|
|
155
|
+
type: "tool",
|
|
156
|
+
name: toolName,
|
|
157
|
+
tool_call_id: toolCallId,
|
|
158
|
+
content: JSON.stringify(result),
|
|
159
|
+
artifact,
|
|
160
|
+
status: isError ? "error" : "success"
|
|
161
|
+
}], {});
|
|
162
|
+
},
|
|
163
|
+
onCancel: unstable_allowCancellation ? async () => {
|
|
164
|
+
cancel();
|
|
165
|
+
} : void 0
|
|
166
|
+
});
|
|
167
|
+
{
|
|
168
|
+
const loadRef = useRef(load);
|
|
169
|
+
useEffect(() => {
|
|
170
|
+
loadRef.current = load;
|
|
171
|
+
});
|
|
172
|
+
useEffect(() => {
|
|
173
|
+
const loadFn = loadRef.current;
|
|
174
|
+
if (!loadFn) return;
|
|
175
|
+
const externalId = aui.threadListItem().getState().externalId;
|
|
176
|
+
if (externalId == null) return;
|
|
177
|
+
loadFn(externalId).then(({ messages: msgs }) => {
|
|
178
|
+
replaceMessages(msgs);
|
|
179
|
+
}, (e) => {
|
|
180
|
+
console.warn("Failed to load ADK session:", e);
|
|
181
|
+
});
|
|
182
|
+
}, [aui, replaceMessages]);
|
|
183
|
+
}
|
|
184
|
+
return runtime;
|
|
262
185
|
};
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
},
|
|
282
|
-
adapter,
|
|
283
|
-
allowNesting: true,
|
|
284
|
-
});
|
|
186
|
+
const useAdkRuntime = ({ cloud, sessionAdapter, create, delete: deleteFn, ...options }) => {
|
|
187
|
+
const aui = useAui();
|
|
188
|
+
const cloudAdapter = useCloudThreadListAdapter({
|
|
189
|
+
cloud,
|
|
190
|
+
create: async () => {
|
|
191
|
+
if (create) return create();
|
|
192
|
+
if (aui.threadListItem.source) return aui.threadListItem().initialize();
|
|
193
|
+
return { externalId: void 0 };
|
|
194
|
+
},
|
|
195
|
+
delete: deleteFn
|
|
196
|
+
});
|
|
197
|
+
return useRemoteThreadListRuntime({
|
|
198
|
+
runtimeHook: function RuntimeHook() {
|
|
199
|
+
return useAdkRuntimeImpl(options);
|
|
200
|
+
},
|
|
201
|
+
adapter: sessionAdapter ?? cloudAdapter,
|
|
202
|
+
allowNesting: true
|
|
203
|
+
});
|
|
285
204
|
};
|
|
205
|
+
//#endregion
|
|
206
|
+
export { getMessageContent, getPendingCancellations, getPendingToolCalls, useAdkRuntime };
|
|
207
|
+
|
|
286
208
|
//# sourceMappingURL=useAdkRuntime.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAdkRuntime.js","sourceRoot":"","sources":["../src/useAdkRuntime.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useAdkRuntime.js","names":["_exhaustiveCheck","uuidv4"],"sources":["../src/useAdkRuntime.ts"],"sourcesContent":["import { useEffect, useRef, useState } from \"react\";\nimport {\n getExternalStoreMessages,\n type AttachmentAdapter,\n type DictationAdapter,\n type FeedbackAdapter,\n type SpeechSynthesisAdapter,\n type AppendMessage,\n type ThreadMessage,\n type ToolExecutionStatus,\n} from \"@assistant-ui/core\";\nimport {\n useCloudThreadListAdapter,\n useRemoteThreadListRuntime,\n useExternalMessageConverter,\n useExternalStoreRuntime,\n} from \"@assistant-ui/core/react\";\nimport { useAui } from \"@assistant-ui/store\";\nimport type { AssistantCloud } from \"assistant-cloud\";\nimport type { RemoteThreadListAdapter } from \"@assistant-ui/core\";\nimport type {\n AdkMessage,\n AdkSendMessageConfig,\n AdkStreamCallback,\n OnAdkErrorCallback,\n OnAdkCustomEventCallback,\n OnAdkAgentTransferCallback,\n} from \"./types\";\nimport { useAdkMessages } from \"./useAdkMessages\";\nimport { convertAdkMessage } from \"./convertAdkMessages\";\nimport { symbolAdkRuntimeExtras, type AdkRuntimeExtras } from \"./hooks\";\nimport { v4 as uuidv4 } from \"uuid\";\n\n/** @internal — exported for unit tests. */\nexport const getMessageContent = (msg: AppendMessage) => {\n const allContent = [\n ...msg.content,\n ...(msg.attachments?.flatMap((a) => a.content) ?? []),\n ];\n const content = allContent.map((part) => {\n const type = part.type;\n switch (type) {\n case \"text\":\n return { type: \"text\" as const, text: part.text };\n case \"image\":\n return { type: \"image_url\" as const, url: part.image };\n case \"file\":\n return {\n type: \"file\" as const,\n mimeType: part.mimeType,\n data: part.data,\n ...(part.filename != null && { filename: part.filename }),\n };\n\n case \"tool-call\":\n throw new Error(\"Tool call appends are not supported.\");\n\n default: {\n const _exhaustiveCheck:\n | \"reasoning\"\n | \"source\"\n | \"audio\"\n | \"data\"\n | \"generative-ui\" = type;\n throw new Error(\n `Unsupported append message part type: ${_exhaustiveCheck}`,\n );\n }\n }\n });\n\n if (content.length === 1 && content[0]?.type === \"text\") {\n return content[0].text ?? \"\";\n }\n\n return content;\n};\n\n/** @internal — exported for unit tests. */\nexport const getPendingToolCalls = (messages: AdkMessage[]) => {\n const pending = new Map<string, { id: string; name: string }>();\n for (const msg of messages) {\n if (msg.type === \"ai\" && msg.tool_calls) {\n for (const tc of msg.tool_calls) {\n pending.set(tc.id, tc);\n }\n }\n if (msg.type === \"tool\") {\n pending.delete(msg.tool_call_id);\n }\n }\n return [...pending.values()];\n};\n\n/**\n * @internal — exported for unit tests.\n *\n * Returns `{cancelled: true}` tool responses for pending tool calls when the\n * user sends a new turn, EXCEPT for HITL interrupts marked via\n * `long_running_tool_ids` (`adk_request_input`, `adk_request_confirmation`,\n * `adk_request_credential`). Those must be answered through a dedicated tool\n * UI + submit helper, not auto-cancelled.\n */\nexport const getPendingCancellations = (\n messages: AdkMessage[],\n longRunningToolIds: readonly string[],\n): Array<AdkMessage & { type: \"tool\" }> => {\n const longRunningSet = new Set(longRunningToolIds);\n return getPendingToolCalls(messages)\n .filter((t) => !longRunningSet.has(t.id))\n .map(\n (t) =>\n ({\n id: uuidv4(),\n type: \"tool\",\n name: t.name,\n tool_call_id: t.id,\n content: JSON.stringify({ cancelled: true }),\n status: \"error\",\n }) satisfies AdkMessage & { type: \"tool\" },\n );\n};\n\nconst truncateAdkMessages = (\n threadMessages: readonly ThreadMessage[],\n parentId: string | null,\n): AdkMessage[] => {\n if (parentId === null) return [];\n const parentIndex = threadMessages.findIndex((m) => m.id === parentId);\n if (parentIndex === -1) return [];\n const truncated: AdkMessage[] = [];\n for (let i = 0; i <= parentIndex && i < threadMessages.length; i++) {\n truncated.push(...getExternalStoreMessages<AdkMessage>(threadMessages[i]!));\n }\n return truncated;\n};\n\nexport type UseAdkRuntimeOptions = {\n stream: AdkStreamCallback;\n autoCancelPendingToolCalls?: boolean | undefined;\n unstable_allowCancellation?: boolean | undefined;\n getCheckpointId?: (\n threadId: string,\n parentMessages: AdkMessage[],\n ) => Promise<string | null>;\n load?: (threadId: string) => Promise<{ messages: AdkMessage[] }>;\n create?: () => Promise<{ externalId: string }>;\n delete?: (threadId: string) => Promise<void>;\n adapters?:\n | {\n attachments?: AttachmentAdapter;\n speech?: SpeechSynthesisAdapter;\n dictation?: DictationAdapter;\n feedback?: FeedbackAdapter;\n }\n | undefined;\n eventHandlers?:\n | {\n onError?: OnAdkErrorCallback;\n onCustomEvent?: OnAdkCustomEventCallback;\n onAgentTransfer?: OnAdkAgentTransferCallback;\n }\n | undefined;\n cloud?: AssistantCloud | undefined;\n /**\n * A `RemoteThreadListAdapter` to use instead of the cloud adapter.\n * Use with `createAdkSessionAdapter` for ADK session-backed persistence.\n */\n sessionAdapter?: RemoteThreadListAdapter | undefined;\n};\n\nconst useAdkRuntimeImpl = ({\n autoCancelPendingToolCalls,\n adapters: { attachments, dictation, feedback, speech } = {},\n unstable_allowCancellation,\n stream,\n load,\n getCheckpointId,\n eventHandlers,\n}: UseAdkRuntimeOptions) => {\n // biome-ignore lint/correctness/useHookAtTopLevel: intentional conditional/nested hook usage\n const aui = useAui();\n const {\n messages,\n stateDelta,\n agentInfo,\n longRunningToolIds,\n artifactDelta,\n toolConfirmations,\n authRequests,\n escalated,\n messageMetadata,\n sendMessage,\n cancel,\n replaceMessages,\n // biome-ignore lint/correctness/useHookAtTopLevel: intentional conditional/nested hook usage\n } = useAdkMessages({\n stream,\n ...(eventHandlers && { eventHandlers }),\n });\n\n // biome-ignore lint/correctness/useHookAtTopLevel: intentional conditional/nested hook usage\n const [isRunning, setIsRunning] = useState(false);\n // biome-ignore lint/correctness/useHookAtTopLevel: intentional conditional/nested hook usage\n const [toolStatuses, setToolStatuses] = useState<\n Record<string, ToolExecutionStatus>\n >({});\n const hasExecutingTools = Object.values(toolStatuses).some(\n (s) => s?.type === \"executing\",\n );\n const effectiveIsRunning = isRunning || hasExecutingTools;\n\n const handleSendMessage = async (\n msgs: AdkMessage[],\n config: AdkSendMessageConfig,\n ) => {\n try {\n setIsRunning(true);\n await sendMessage(msgs, config);\n } finally {\n setIsRunning(false);\n }\n };\n\n // biome-ignore lint/correctness/useHookAtTopLevel: intentional conditional/nested hook usage\n const threadMessages = useExternalMessageConverter({\n callback: convertAdkMessage,\n messages,\n isRunning: effectiveIsRunning,\n });\n\n // biome-ignore lint/correctness/useHookAtTopLevel: intentional conditional/nested hook usage\n const threadMessagesRef = useRef(threadMessages);\n threadMessagesRef.current = threadMessages;\n\n // biome-ignore lint/correctness/useHookAtTopLevel: intentional conditional/nested hook usage\n const runtime = useExternalStoreRuntime({\n isRunning: effectiveIsRunning,\n messages: threadMessages,\n unstable_enableToolInvocations: true,\n setToolStatuses,\n adapters: { attachments, dictation, feedback, speech },\n extras: {\n [symbolAdkRuntimeExtras]: true,\n agentInfo,\n stateDelta,\n artifactDelta,\n longRunningToolIds,\n toolConfirmations,\n authRequests,\n escalated,\n messageMetadata,\n send: handleSendMessage,\n } satisfies AdkRuntimeExtras,\n onNew: async (msg) => {\n const cancellations =\n autoCancelPendingToolCalls !== false\n ? getPendingCancellations(messages, longRunningToolIds)\n : [];\n\n return handleSendMessage(\n [\n ...cancellations,\n {\n id: uuidv4(),\n type: \"human\",\n content: getMessageContent(msg),\n },\n ],\n { runConfig: msg.runConfig },\n );\n },\n onEdit: getCheckpointId\n ? async (msg) => {\n const truncated = truncateAdkMessages(\n threadMessagesRef.current,\n msg.parentId,\n );\n replaceMessages(truncated);\n const externalId = aui.threadListItem().getState().externalId;\n const checkpointId = externalId\n ? await getCheckpointId(externalId, truncated)\n : null;\n return handleSendMessage(\n [\n {\n id: uuidv4(),\n type: \"human\",\n content: getMessageContent(msg),\n },\n ],\n {\n runConfig: msg.runConfig,\n ...(checkpointId && { checkpointId }),\n },\n );\n }\n : undefined,\n onReload: getCheckpointId\n ? async (parentId, config) => {\n const truncated = truncateAdkMessages(\n threadMessagesRef.current,\n parentId,\n );\n replaceMessages(truncated);\n const externalId = aui.threadListItem().getState().externalId;\n const checkpointId = externalId\n ? await getCheckpointId(externalId, truncated)\n : null;\n return handleSendMessage([], {\n runConfig: config.runConfig,\n ...(checkpointId && { checkpointId }),\n });\n }\n : undefined,\n onAddToolResult: async ({\n toolCallId,\n toolName,\n result,\n isError,\n artifact,\n }) => {\n await handleSendMessage(\n [\n {\n id: uuidv4(),\n type: \"tool\",\n name: toolName,\n tool_call_id: toolCallId,\n content: JSON.stringify(result),\n artifact,\n status: isError ? \"error\" : \"success\",\n },\n ],\n {},\n );\n },\n onCancel: unstable_allowCancellation\n ? async () => {\n cancel();\n }\n : undefined,\n });\n\n {\n // biome-ignore lint/correctness/useHookAtTopLevel: intentional conditional/nested hook usage\n const loadRef = useRef(load);\n // biome-ignore lint/correctness/useHookAtTopLevel: intentional conditional/nested hook usage\n useEffect(() => {\n loadRef.current = load;\n });\n\n // biome-ignore lint/correctness/useHookAtTopLevel: intentional conditional/nested hook usage\n useEffect(() => {\n const loadFn = loadRef.current;\n if (!loadFn) return;\n\n const externalId = aui.threadListItem().getState().externalId;\n if (externalId == null) return;\n\n loadFn(externalId).then(\n ({ messages: msgs }) => {\n replaceMessages(msgs);\n },\n (e) => {\n console.warn(\"Failed to load ADK session:\", e);\n },\n );\n }, [aui, replaceMessages]);\n }\n\n return runtime;\n};\n\nexport const useAdkRuntime = ({\n cloud,\n sessionAdapter,\n create,\n delete: deleteFn,\n ...options\n}: UseAdkRuntimeOptions) => {\n const aui = useAui();\n const cloudAdapter = useCloudThreadListAdapter({\n cloud,\n create: async () => {\n if (create) return create();\n if (aui.threadListItem.source) return aui.threadListItem().initialize();\n return { externalId: undefined };\n },\n delete: deleteFn,\n });\n\n const adapter = sessionAdapter ?? cloudAdapter;\n\n return useRemoteThreadListRuntime({\n runtimeHook: function RuntimeHook() {\n // biome-ignore lint/correctness/useHookAtTopLevel: intentional conditional/nested hook usage\n return useAdkRuntimeImpl(options);\n },\n adapter,\n allowNesting: true,\n });\n};\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@assistant-ui/react-google-adk",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.12",
|
|
4
4
|
"description": "Google ADK adapter for assistant-ui",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"google-adk",
|
|
@@ -34,10 +34,10 @@
|
|
|
34
34
|
],
|
|
35
35
|
"sideEffects": false,
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"@assistant-ui/core": "^0.2.
|
|
38
|
-
"@assistant-ui/store": "^0.2.
|
|
37
|
+
"@assistant-ui/core": "^0.2.5",
|
|
38
|
+
"@assistant-ui/store": "^0.2.12",
|
|
39
39
|
"assistant-cloud": "*",
|
|
40
|
-
"assistant-stream": "^0.3.
|
|
40
|
+
"assistant-stream": "^0.3.16",
|
|
41
41
|
"uuid": "^14.0.0"
|
|
42
42
|
},
|
|
43
43
|
"peerDependencies": {
|
|
@@ -54,11 +54,11 @@
|
|
|
54
54
|
}
|
|
55
55
|
},
|
|
56
56
|
"devDependencies": {
|
|
57
|
-
"@types/react": "^19.2.
|
|
57
|
+
"@types/react": "^19.2.15",
|
|
58
58
|
"@types/uuid": "^11.0.0",
|
|
59
|
-
"react": "^19.2.
|
|
60
|
-
"vitest": "^4.1.
|
|
61
|
-
"@assistant-ui/x-buildutils": "0.0.
|
|
59
|
+
"react": "^19.2.6",
|
|
60
|
+
"vitest": "^4.1.7",
|
|
61
|
+
"@assistant-ui/x-buildutils": "0.0.9"
|
|
62
62
|
},
|
|
63
63
|
"publishConfig": {
|
|
64
64
|
"access": "public",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { describe, it, expect } from "vitest";
|
|
2
2
|
import { AdkEventAccumulator } from "./AdkEventAccumulator";
|
|
3
|
-
import type { AdkEvent, AdkMessage } from "./types";
|
|
3
|
+
import type { AdkEvent, AdkMessage, AdkMessageContentPart } from "./types";
|
|
4
4
|
|
|
5
5
|
const makeEvent = (overrides: Partial<AdkEvent> = {}): AdkEvent => ({
|
|
6
6
|
id: "evt-1",
|
|
@@ -568,10 +568,9 @@ describe("AdkEventAccumulator - HITL requires-action", () => {
|
|
|
568
568
|
);
|
|
569
569
|
expect(aiMsg).toBeDefined();
|
|
570
570
|
expect(aiMsg!.tool_calls).toHaveLength(1);
|
|
571
|
+
const parts = aiMsg!.content as AdkMessageContentPart[];
|
|
571
572
|
expect(
|
|
572
|
-
|
|
573
|
-
(c) => c.type === "text" && c.text.includes("Let me ask"),
|
|
574
|
-
),
|
|
573
|
+
parts.some((c) => c.type === "text" && c.text.includes("Let me ask")),
|
|
575
574
|
).toBe(true);
|
|
576
575
|
expect(aiMsg!.status).toBeUndefined();
|
|
577
576
|
});
|
|
@@ -599,7 +598,8 @@ describe("AdkEventAccumulator - HITL requires-action", () => {
|
|
|
599
598
|
);
|
|
600
599
|
|
|
601
600
|
const aiMsg = msgs[0] as AdkMessage & { type: "ai" };
|
|
602
|
-
|
|
601
|
+
const parts = aiMsg.content as AdkMessageContentPart[];
|
|
602
|
+
expect(parts.some((c) => c.type === "text")).toBe(true);
|
|
603
603
|
expect(aiMsg.tool_calls).toHaveLength(1);
|
|
604
604
|
expect(aiMsg.tool_calls![0]!.id).toBe("mixed-tc-1");
|
|
605
605
|
expect(aiMsg.status).toBeUndefined();
|