@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.
Files changed (69) hide show
  1. package/README.md +15 -128
  2. package/dist/AdkClient.d.ts +30 -26
  3. package/dist/AdkClient.d.ts.map +1 -1
  4. package/dist/AdkClient.js +131 -165
  5. package/dist/AdkClient.js.map +1 -1
  6. package/dist/AdkEventAccumulator.d.ts +43 -39
  7. package/dist/AdkEventAccumulator.d.ts.map +1 -1
  8. package/dist/AdkEventAccumulator.js +446 -531
  9. package/dist/AdkEventAccumulator.js.map +1 -1
  10. package/dist/AdkSessionAdapter.d.ts +40 -37
  11. package/dist/AdkSessionAdapter.d.ts.map +1 -1
  12. package/dist/AdkSessionAdapter.js +134 -155
  13. package/dist/AdkSessionAdapter.js.map +1 -1
  14. package/dist/contentToParts.d.ts +6 -2
  15. package/dist/contentToParts.d.ts.map +1 -1
  16. package/dist/contentToParts.js +37 -34
  17. package/dist/contentToParts.js.map +1 -1
  18. package/dist/convertAdkMessages.d.ts +7 -3
  19. package/dist/convertAdkMessages.d.ts.map +1 -1
  20. package/dist/convertAdkMessages.js +93 -86
  21. package/dist/convertAdkMessages.js.map +1 -1
  22. package/dist/hooks.d.ts +38 -35
  23. package/dist/hooks.d.ts.map +1 -1
  24. package/dist/hooks.js +132 -155
  25. package/dist/hooks.js.map +1 -1
  26. package/dist/index.d.ts +10 -11
  27. package/dist/index.js +10 -10
  28. package/dist/server/adkEventStream.d.ts +27 -25
  29. package/dist/server/adkEventStream.d.ts.map +1 -1
  30. package/dist/server/adkEventStream.js +91 -126
  31. package/dist/server/adkEventStream.js.map +1 -1
  32. package/dist/server/createAdkApiRoute.d.ts +26 -23
  33. package/dist/server/createAdkApiRoute.d.ts.map +1 -1
  34. package/dist/server/createAdkApiRoute.js +34 -37
  35. package/dist/server/createAdkApiRoute.js.map +1 -1
  36. package/dist/server/index.d.ts +4 -4
  37. package/dist/server/index.js +4 -4
  38. package/dist/server/parseAdkRequest.d.ts +21 -18
  39. package/dist/server/parseAdkRequest.d.ts.map +1 -1
  40. package/dist/server/parseAdkRequest.js +80 -88
  41. package/dist/server/parseAdkRequest.js.map +1 -1
  42. package/dist/structuredEvents.d.ts +6 -2
  43. package/dist/structuredEvents.d.ts.map +1 -1
  44. package/dist/structuredEvents.js +70 -75
  45. package/dist/structuredEvents.js.map +1 -1
  46. package/dist/types.d.ts +231 -227
  47. package/dist/types.d.ts.map +1 -1
  48. package/dist/types.js +15 -12
  49. package/dist/types.js.map +1 -1
  50. package/dist/useAdkMessages.d.ts +32 -26
  51. package/dist/useAdkMessages.d.ts.map +1 -1
  52. package/dist/useAdkMessages.js +155 -182
  53. package/dist/useAdkMessages.js.map +1 -1
  54. package/dist/useAdkRuntime.d.ts +43 -35
  55. package/dist/useAdkRuntime.d.ts.map +1 -1
  56. package/dist/useAdkRuntime.js +195 -273
  57. package/dist/useAdkRuntime.js.map +1 -1
  58. package/package.json +8 -8
  59. package/src/AdkEventAccumulator.test.ts +5 -5
  60. package/src/AdkSessionAdapter.test.ts +7 -7
  61. package/src/convertAdkMessages.test.ts +16 -16
  62. package/src/hooks.ts +0 -2
  63. package/src/index.ts +3 -12
  64. package/src/useAdkMessages.ts +0 -1
  65. package/src/useAdkRuntime.ts +9 -43
  66. package/dist/index.d.ts.map +0 -1
  67. package/dist/index.js.map +0 -1
  68. package/dist/server/index.d.ts.map +0 -1
  69. package/dist/server/index.js.map +0 -1
@@ -84,8 +84,8 @@ describe("createAdkSessionAdapter - list", () => {
84
84
  });
85
85
  await adapter.list();
86
86
 
87
- const init = mockFetch.mock.calls[0]![1];
88
- expect((init?.headers as Record<string, string>).Authorization).toBe(
87
+ const init = mockFetch.mock.calls[0]![1]!;
88
+ expect((init.headers as Record<string, string>).Authorization).toBe(
89
89
  "Bearer tok",
90
90
  );
91
91
  });
@@ -101,8 +101,8 @@ describe("createAdkSessionAdapter - list", () => {
101
101
  });
102
102
  await adapter.list();
103
103
 
104
- const init = mockFetch.mock.calls[0]![1];
105
- expect((init?.headers as Record<string, string>)["X-Dynamic"]).toBe("val");
104
+ const init = mockFetch.mock.calls[0]![1]!;
105
+ expect((init.headers as Record<string, string>)["X-Dynamic"]).toBe("val");
106
106
  });
107
107
  });
108
108
 
@@ -212,7 +212,7 @@ describe("createAdkSessionAdapter - no-op methods", () => {
212
212
  describe("createAdkSessionAdapter - generateTitle", () => {
213
213
  it("returns an empty ReadableStream", async () => {
214
214
  const { adapter } = createAdkSessionAdapter(baseOptions);
215
- const result = await adapter.generateTitle("s1");
215
+ const result = await adapter.generateTitle("s1", []);
216
216
  expect(result).toBeInstanceOf(ReadableStream);
217
217
  });
218
218
  });
@@ -332,8 +332,8 @@ describe("createAdkSessionAdapter - load", () => {
332
332
  });
333
333
  await load("s1");
334
334
 
335
- const init = mockFetch.mock.calls[0]![1];
336
- expect((init?.headers as Record<string, string>).Authorization).toBe(
335
+ const init = mockFetch.mock.calls[0]![1]!;
336
+ expect((init.headers as Record<string, string>).Authorization).toBe(
337
337
  "Bearer tok",
338
338
  );
339
339
  });
@@ -5,7 +5,7 @@ import type { AdkMessage } from "./types";
5
5
  describe("convertAdkMessage - human messages", () => {
6
6
  it("converts a human message with string content to user role", () => {
7
7
  const msg: AdkMessage = { id: "m1", type: "human", content: "Hello" };
8
- const result = convertAdkMessage(msg);
8
+ const result = convertAdkMessage(msg, {});
9
9
  expect(result).toMatchObject({
10
10
  role: "user",
11
11
  id: "m1",
@@ -19,7 +19,7 @@ describe("convertAdkMessage - human messages", () => {
19
19
  type: "human",
20
20
  content: [{ type: "text", text: "Hello" }],
21
21
  };
22
- const result = convertAdkMessage(msg);
22
+ const result = convertAdkMessage(msg, {});
23
23
  expect(result).toMatchObject({
24
24
  role: "user",
25
25
  content: [{ type: "text", text: "Hello" }],
@@ -34,7 +34,7 @@ describe("convertAdkMessage - ai messages", () => {
34
34
  type: "ai",
35
35
  content: [{ type: "text", text: "Hi there" }],
36
36
  };
37
- const result = convertAdkMessage(msg);
37
+ const result = convertAdkMessage(msg, {});
38
38
  expect(result).toMatchObject({
39
39
  role: "assistant",
40
40
  id: "m1",
@@ -48,7 +48,7 @@ describe("convertAdkMessage - ai messages", () => {
48
48
  type: "ai",
49
49
  content: [{ type: "reasoning", text: "Let me think..." }],
50
50
  };
51
- const result = convertAdkMessage(msg);
51
+ const result = convertAdkMessage(msg, {});
52
52
  expect(result).toMatchObject({
53
53
  content: [{ type: "reasoning", text: "Let me think..." }],
54
54
  });
@@ -60,7 +60,7 @@ describe("convertAdkMessage - ai messages", () => {
60
60
  type: "ai",
61
61
  content: [{ type: "image", mimeType: "image/png", data: "abc123" }],
62
62
  };
63
- const result = convertAdkMessage(msg);
63
+ const result = convertAdkMessage(msg, {});
64
64
  expect(result).toMatchObject({
65
65
  content: [{ type: "image", image: "data:image/png;base64,abc123" }],
66
66
  });
@@ -72,7 +72,7 @@ describe("convertAdkMessage - ai messages", () => {
72
72
  type: "ai",
73
73
  content: [{ type: "image_url", url: "https://example.com/img.png" }],
74
74
  };
75
- const result = convertAdkMessage(msg);
75
+ const result = convertAdkMessage(msg, {});
76
76
  expect(result).toMatchObject({
77
77
  content: [{ type: "image", image: "https://example.com/img.png" }],
78
78
  });
@@ -91,7 +91,7 @@ describe("convertAdkMessage - ai messages", () => {
91
91
  },
92
92
  ],
93
93
  };
94
- const result = convertAdkMessage(msg);
94
+ const result = convertAdkMessage(msg, {});
95
95
  expect(result).toMatchObject({
96
96
  content: [
97
97
  {
@@ -116,7 +116,7 @@ describe("convertAdkMessage - ai messages", () => {
116
116
  },
117
117
  ],
118
118
  };
119
- const result = convertAdkMessage(msg);
119
+ const result = convertAdkMessage(msg, {});
120
120
  expect(result).toMatchObject({
121
121
  content: [
122
122
  {
@@ -137,7 +137,7 @@ describe("convertAdkMessage - ai messages", () => {
137
137
  type: "ai",
138
138
  content: [{ type: "code", code: "print(1)", language: "python" }],
139
139
  };
140
- const result = convertAdkMessage(msg);
140
+ const result = convertAdkMessage(msg, {});
141
141
  expect(result).toMatchObject({
142
142
  content: [
143
143
  {
@@ -155,7 +155,7 @@ describe("convertAdkMessage - ai messages", () => {
155
155
  type: "ai",
156
156
  content: [{ type: "code_result", output: "1", outcome: "OUTCOME_OK" }],
157
157
  };
158
- const result = convertAdkMessage(msg);
158
+ const result = convertAdkMessage(msg, {});
159
159
  expect(result).toMatchObject({
160
160
  content: [
161
161
  {
@@ -174,7 +174,7 @@ describe("convertAdkMessage - ai messages", () => {
174
174
  content: [],
175
175
  tool_calls: [{ id: "tc-1", name: "search", args: { q: "test" } }],
176
176
  };
177
- const result = convertAdkMessage(msg);
177
+ const result = convertAdkMessage(msg, {});
178
178
  expect(result).toMatchObject({
179
179
  content: [
180
180
  {
@@ -194,7 +194,7 @@ describe("convertAdkMessage - ai messages", () => {
194
194
  content: [{ type: "text", text: "done" }],
195
195
  status: { type: "complete", reason: "stop" },
196
196
  };
197
- const result = convertAdkMessage(msg);
197
+ const result = convertAdkMessage(msg, {});
198
198
  expect(result).toMatchObject({
199
199
  status: { type: "complete", reason: "stop" },
200
200
  });
@@ -208,7 +208,7 @@ describe("convertAdkMessage - ai messages", () => {
208
208
  author: "search_agent",
209
209
  branch: "root.search_agent",
210
210
  };
211
- const result = convertAdkMessage(msg);
211
+ const result = convertAdkMessage(msg, {});
212
212
  expect(result).toMatchObject({
213
213
  metadata: {
214
214
  custom: { author: "search_agent", branch: "root.search_agent" },
@@ -222,7 +222,7 @@ describe("convertAdkMessage - ai messages", () => {
222
222
  type: "ai",
223
223
  content: [{ type: "text", text: "hi" }],
224
224
  };
225
- const result = convertAdkMessage(msg);
225
+ const result = convertAdkMessage(msg, {});
226
226
  expect(result).not.toHaveProperty("metadata");
227
227
  });
228
228
  });
@@ -237,7 +237,7 @@ describe("convertAdkMessage - tool messages", () => {
237
237
  content: '{"results":[]}',
238
238
  status: "success",
239
239
  };
240
- const result = convertAdkMessage(msg);
240
+ const result = convertAdkMessage(msg, {});
241
241
  expect(result).toMatchObject({
242
242
  role: "tool",
243
243
  toolCallId: "tc-1",
@@ -256,7 +256,7 @@ describe("convertAdkMessage - tool messages", () => {
256
256
  content: "Failed",
257
257
  status: "error",
258
258
  };
259
- const result = convertAdkMessage(msg);
259
+ const result = convertAdkMessage(msg, {});
260
260
  expect(result).toMatchObject({ isError: true });
261
261
  });
262
262
  });
package/src/hooks.ts CHANGED
@@ -1,5 +1,3 @@
1
- /// <reference types="@assistant-ui/core/store" />
2
-
3
1
  import { useAui, useAuiState } from "@assistant-ui/store";
4
2
  import { v4 as uuidv4 } from "uuid";
5
3
  import type { ReadonlyJSONValue } from "assistant-stream/utils";
package/src/index.ts CHANGED
@@ -1,12 +1,6 @@
1
- export {
2
- useAdkRuntime,
3
- type UseAdkRuntimeOptions,
4
- } from "./useAdkRuntime";
1
+ export { useAdkRuntime, type UseAdkRuntimeOptions } from "./useAdkRuntime";
5
2
 
6
- export {
7
- useAdkMessages,
8
- type UseAdkMessagesOptions,
9
- } from "./useAdkMessages";
3
+ export { useAdkMessages, type UseAdkMessagesOptions } from "./useAdkMessages";
10
4
 
11
5
  export { convertAdkMessage } from "./convertAdkMessages";
12
6
 
@@ -37,10 +31,7 @@ export { toAdkStructuredEvents } from "./structuredEvents";
37
31
 
38
32
  export { AdkEventAccumulator } from "./AdkEventAccumulator";
39
33
 
40
- export {
41
- createAdkStream,
42
- type CreateAdkStreamOptions,
43
- } from "./AdkClient";
34
+ export { createAdkStream, type CreateAdkStreamOptions } from "./AdkClient";
44
35
 
45
36
  export {
46
37
  createAdkSessionAdapter,
@@ -1,4 +1,3 @@
1
- /// <reference types="@assistant-ui/core/store" />
2
1
  import { useState, useCallback, useRef, useMemo } from "react";
3
2
  import { v4 as uuidv4 } from "uuid";
4
3
  import { useAui } from "@assistant-ui/store";
@@ -1,4 +1,3 @@
1
- /// <reference types="@assistant-ui/core/store" />
2
1
  import { useEffect, useRef, useState } from "react";
3
2
  import {
4
3
  getExternalStoreMessages,
@@ -8,14 +7,13 @@ import {
8
7
  type SpeechSynthesisAdapter,
9
8
  type AppendMessage,
10
9
  type ThreadMessage,
10
+ type ToolExecutionStatus,
11
11
  } from "@assistant-ui/core";
12
12
  import {
13
- type ToolExecutionStatus,
14
13
  useCloudThreadListAdapter,
15
14
  useRemoteThreadListRuntime,
16
15
  useExternalMessageConverter,
17
16
  useExternalStoreRuntime,
18
- useToolInvocations,
19
17
  } from "@assistant-ui/core/react";
20
18
  import { useAui } from "@assistant-ui/store";
21
19
  import type { AssistantCloud } from "assistant-cloud";
@@ -58,8 +56,12 @@ export const getMessageContent = (msg: AppendMessage) => {
58
56
  throw new Error("Tool call appends are not supported.");
59
57
 
60
58
  default: {
61
- const _exhaustiveCheck: "reasoning" | "source" | "audio" | "data" =
62
- type;
59
+ const _exhaustiveCheck:
60
+ | "reasoning"
61
+ | "source"
62
+ | "audio"
63
+ | "data"
64
+ | "generative-ui" = type;
63
65
  throw new Error(
64
66
  `Unsupported append message part type: ${_exhaustiveCheck}`,
65
67
  );
@@ -231,41 +233,12 @@ const useAdkRuntimeImpl = ({
231
233
  const threadMessagesRef = useRef(threadMessages);
232
234
  threadMessagesRef.current = threadMessages;
233
235
 
234
- // biome-ignore lint/correctness/useHookAtTopLevel: intentional conditional/nested hook usage
235
- const [runtimeRef] = useState(() => ({
236
- get current() {
237
- return runtime;
238
- },
239
- }));
240
-
241
- // biome-ignore lint/correctness/useHookAtTopLevel: intentional conditional/nested hook usage
242
- const toolInvocations = useToolInvocations({
243
- state: { messages: threadMessages, isRunning: effectiveIsRunning },
244
- getTools: () => runtimeRef.current.thread.getModelContext().tools,
245
- onResult: (command) => {
246
- if (command.type === "add-tool-result") {
247
- void handleSendMessage(
248
- [
249
- {
250
- id: uuidv4(),
251
- type: "tool",
252
- name: command.toolName,
253
- tool_call_id: command.toolCallId,
254
- content: JSON.stringify(command.result),
255
- status: command.isError ? "error" : "success",
256
- },
257
- ],
258
- {},
259
- );
260
- }
261
- },
262
- setToolStatuses,
263
- });
264
-
265
236
  // biome-ignore lint/correctness/useHookAtTopLevel: intentional conditional/nested hook usage
266
237
  const runtime = useExternalStoreRuntime({
267
238
  isRunning: effectiveIsRunning,
268
239
  messages: threadMessages,
240
+ unstable_enableToolInvocations: true,
241
+ setToolStatuses,
269
242
  adapters: { attachments, dictation, feedback, speech },
270
243
  extras: {
271
244
  [symbolAdkRuntimeExtras]: true,
@@ -280,8 +253,6 @@ const useAdkRuntimeImpl = ({
280
253
  send: handleSendMessage,
281
254
  } satisfies AdkRuntimeExtras,
282
255
  onNew: async (msg) => {
283
- await toolInvocations.abort();
284
-
285
256
  const cancellations =
286
257
  autoCancelPendingToolCalls !== false
287
258
  ? getPendingCancellations(messages, longRunningToolIds)
@@ -301,7 +272,6 @@ const useAdkRuntimeImpl = ({
301
272
  },
302
273
  onEdit: getCheckpointId
303
274
  ? async (msg) => {
304
- await toolInvocations.abort();
305
275
  const truncated = truncateAdkMessages(
306
276
  threadMessagesRef.current,
307
277
  msg.parentId,
@@ -328,7 +298,6 @@ const useAdkRuntimeImpl = ({
328
298
  : undefined,
329
299
  onReload: getCheckpointId
330
300
  ? async (parentId, config) => {
331
- await toolInvocations.abort();
332
301
  const truncated = truncateAdkMessages(
333
302
  threadMessagesRef.current,
334
303
  parentId,
@@ -366,12 +335,9 @@ const useAdkRuntimeImpl = ({
366
335
  {},
367
336
  );
368
337
  },
369
- onResumeToolCall: (options) =>
370
- toolInvocations.resume(options.toolCallId, options.payload),
371
338
  onCancel: unstable_allowCancellation
372
339
  ? async () => {
373
340
  cancel();
374
- await toolInvocations.abort();
375
341
  }
376
342
  : undefined,
377
343
  });
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,KAAK,oBAAoB,GAC1B,2BAAwB;AAEzB,OAAO,EACL,cAAc,EACd,KAAK,qBAAqB,GAC3B,4BAAyB;AAE1B,OAAO,EAAE,iBAAiB,EAAE,gCAA6B;AAEzD,YAAY,EACV,QAAQ,EACR,YAAY,EACZ,eAAe,EACf,UAAU,EACV,qBAAqB,EACrB,WAAW,EACX,mBAAmB,EACnB,iBAAiB,EACjB,qBAAqB,EACrB,cAAc,EACd,kBAAkB,EAClB,YAAY,EACZ,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,wBAAwB,EACxB,0BAA0B,GAC3B,mBAAgB;AAEjB,OAAO,EAAE,YAAY,EAAE,mBAAgB;AAEvC,OAAO,EAAE,qBAAqB,EAAE,8BAA2B;AAE3D,OAAO,EAAE,mBAAmB,EAAE,iCAA8B;AAE5D,OAAO,EACL,eAAe,EACf,KAAK,sBAAsB,GAC5B,uBAAoB;AAErB,OAAO,EACL,uBAAuB,EACvB,KAAK,wBAAwB,EAC7B,KAAK,eAAe,GACrB,+BAA4B;AAE7B,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,UAAU,EACV,wBAAwB,EACxB,uBAAuB,EACvB,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,qBAAqB,EACrB,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,eAAe,GAChB,mBAAgB"}
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,GAEd,2BAAwB;AAEzB,OAAO,EACL,cAAc,GAEf,4BAAyB;AAE1B,OAAO,EAAE,iBAAiB,EAAE,gCAA6B;AAuBzD,OAAO,EAAE,YAAY,EAAE,mBAAgB;AAEvC,OAAO,EAAE,qBAAqB,EAAE,8BAA2B;AAE3D,OAAO,EAAE,mBAAmB,EAAE,iCAA8B;AAE5D,OAAO,EACL,eAAe,GAEhB,uBAAoB;AAErB,OAAO,EACL,uBAAuB,GAGxB,+BAA4B;AAE7B,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,UAAU,EACV,wBAAwB,EACxB,uBAAuB,EACvB,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,qBAAqB,EACrB,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,eAAe,GAChB,mBAAgB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,KAAK,qBAAqB,EAAE,4BAAyB;AAC9E,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,6BAA0B;AAClE,OAAO,EACL,iBAAiB,EACjB,KAAK,wBAAwB,GAC9B,+BAA4B"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAA8B,4BAAyB;AAC9E,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,6BAA0B;AAClE,OAAO,EACL,iBAAiB,GAElB,+BAA4B"}