@assistant-ui/react-google-adk 0.0.1
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/LICENSE +21 -0
- package/README.md +156 -0
- package/dist/AdkClient.d.ts +45 -0
- package/dist/AdkClient.d.ts.map +1 -0
- package/dist/AdkClient.js +204 -0
- package/dist/AdkClient.js.map +1 -0
- package/dist/AdkEventAccumulator.d.ts +45 -0
- package/dist/AdkEventAccumulator.d.ts.map +1 -0
- package/dist/AdkEventAccumulator.js +508 -0
- package/dist/AdkEventAccumulator.js.map +1 -0
- package/dist/AdkSessionAdapter.d.ts +61 -0
- package/dist/AdkSessionAdapter.d.ts.map +1 -0
- package/dist/AdkSessionAdapter.js +159 -0
- package/dist/AdkSessionAdapter.js.map +1 -0
- package/dist/convertAdkMessages.d.ts +4 -0
- package/dist/convertAdkMessages.d.ts.map +1 -0
- package/dist/convertAdkMessages.js +75 -0
- package/dist/convertAdkMessages.js.map +1 -0
- package/dist/hooks.d.ts +50 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +173 -0
- package/dist/hooks.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/server/adkEventStream.d.ts +42 -0
- package/dist/server/adkEventStream.d.ts.map +1 -0
- package/dist/server/adkEventStream.js +135 -0
- package/dist/server/adkEventStream.js.map +1 -0
- package/dist/server/createAdkApiRoute.d.ts +47 -0
- package/dist/server/createAdkApiRoute.d.ts.map +1 -0
- package/dist/server/createAdkApiRoute.js +41 -0
- package/dist/server/createAdkApiRoute.js.map +1 -0
- package/dist/server/index.d.ts +4 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +4 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/parseAdkRequest.d.ts +56 -0
- package/dist/server/parseAdkRequest.d.ts.map +1 -0
- package/dist/server/parseAdkRequest.js +93 -0
- package/dist/server/parseAdkRequest.js.map +1 -0
- package/dist/structuredEvents.d.ts +7 -0
- package/dist/structuredEvents.d.ts.map +1 -0
- package/dist/structuredEvents.js +79 -0
- package/dist/structuredEvents.js.map +1 -0
- package/dist/types.d.ts +253 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +14 -0
- package/dist/types.js.map +1 -0
- package/dist/useAdkMessages.d.ts +28 -0
- package/dist/useAdkMessages.d.ts.map +1 -0
- package/dist/useAdkMessages.js +198 -0
- package/dist/useAdkMessages.js.map +1 -0
- package/dist/useAdkRuntime.d.ts +36 -0
- package/dist/useAdkRuntime.d.ts.map +1 -0
- package/dist/useAdkRuntime.js +252 -0
- package/dist/useAdkRuntime.js.map +1 -0
- package/package.json +83 -0
- package/server/package.json +4 -0
- package/src/AdkClient.test.ts +662 -0
- package/src/AdkClient.ts +274 -0
- package/src/AdkEventAccumulator.test.ts +591 -0
- package/src/AdkEventAccumulator.ts +602 -0
- package/src/AdkSessionAdapter.test.ts +362 -0
- package/src/AdkSessionAdapter.ts +245 -0
- package/src/convertAdkMessages.test.ts +209 -0
- package/src/convertAdkMessages.ts +93 -0
- package/src/hooks.ts +217 -0
- package/src/index.ts +66 -0
- package/src/server/adkEventStream.test.ts +78 -0
- package/src/server/adkEventStream.ts +161 -0
- package/src/server/createAdkApiRoute.test.ts +370 -0
- package/src/server/createAdkApiRoute.ts +86 -0
- package/src/server/index.ts +6 -0
- package/src/server/parseAdkRequest.test.ts +152 -0
- package/src/server/parseAdkRequest.ts +122 -0
- package/src/structuredEvents.ts +81 -0
- package/src/types.ts +265 -0
- package/src/useAdkMessages.ts +259 -0
- package/src/useAdkRuntime.ts +398 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 AgentbaseAI Inc.
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
# @assistant-ui/react-google-adk
|
|
2
|
+
|
|
3
|
+
Google ADK (Agent Development Kit) adapter for [assistant-ui](https://www.assistant-ui.com/).
|
|
4
|
+
|
|
5
|
+
Connects Google ADK JS agents to assistant-ui's React runtime with streaming, tool calls, multi-agent support, tool confirmations, auth flows, and session state management.
|
|
6
|
+
|
|
7
|
+
## Installation
|
|
8
|
+
|
|
9
|
+
```sh
|
|
10
|
+
npm install @assistant-ui/react @assistant-ui/react-google-adk
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Quick Start
|
|
14
|
+
|
|
15
|
+
### Proxy Mode (with a Next.js API Route)
|
|
16
|
+
|
|
17
|
+
**Server** (`app/api/adk/route.ts`):
|
|
18
|
+
|
|
19
|
+
```typescript
|
|
20
|
+
import { createAdkApiRoute } from "@assistant-ui/react-google-adk/server";
|
|
21
|
+
import { runner } from "./agent";
|
|
22
|
+
|
|
23
|
+
export const POST = createAdkApiRoute({
|
|
24
|
+
runner,
|
|
25
|
+
userId: "default-user",
|
|
26
|
+
sessionId: (req) =>
|
|
27
|
+
new URL(req.url).searchParams.get("sessionId") ?? "default",
|
|
28
|
+
});
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
**Client:**
|
|
32
|
+
|
|
33
|
+
```tsx
|
|
34
|
+
import { useAdkRuntime, createAdkStream } from "@assistant-ui/react-google-adk";
|
|
35
|
+
|
|
36
|
+
const runtime = useAdkRuntime({
|
|
37
|
+
stream: createAdkStream({ api: "/api/adk" }),
|
|
38
|
+
});
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### Direct Mode (connecting to an ADK server)
|
|
42
|
+
|
|
43
|
+
```tsx
|
|
44
|
+
import {
|
|
45
|
+
useAdkRuntime,
|
|
46
|
+
createAdkStream,
|
|
47
|
+
createAdkSessionAdapter,
|
|
48
|
+
} from "@assistant-ui/react-google-adk";
|
|
49
|
+
|
|
50
|
+
const { adapter, load } = createAdkSessionAdapter({
|
|
51
|
+
apiUrl: "http://localhost:8000",
|
|
52
|
+
appName: "my-app",
|
|
53
|
+
userId: "user-1",
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
const runtime = useAdkRuntime({
|
|
57
|
+
stream: createAdkStream({
|
|
58
|
+
api: "http://localhost:8000",
|
|
59
|
+
appName: "my-app",
|
|
60
|
+
userId: "user-1",
|
|
61
|
+
}),
|
|
62
|
+
sessionAdapter: adapter,
|
|
63
|
+
load,
|
|
64
|
+
});
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## API Reference
|
|
68
|
+
|
|
69
|
+
### Client Exports
|
|
70
|
+
|
|
71
|
+
#### `createAdkStream(options)`
|
|
72
|
+
|
|
73
|
+
Creates an `AdkStreamCallback` that connects to an ADK endpoint via SSE.
|
|
74
|
+
|
|
75
|
+
| Option | Type | Description |
|
|
76
|
+
|--------|------|-------------|
|
|
77
|
+
| `api` | `string` | URL to POST to (proxy route or ADK server base URL) |
|
|
78
|
+
| `appName` | `string?` | ADK app name (enables direct mode when set) |
|
|
79
|
+
| `userId` | `string?` | ADK user ID (required with `appName`) |
|
|
80
|
+
| `headers` | `Record<string, string> \| (() => ...)` | Static or dynamic request headers |
|
|
81
|
+
|
|
82
|
+
#### `createAdkSessionAdapter(options)`
|
|
83
|
+
|
|
84
|
+
Creates a `RemoteThreadListAdapter` backed by ADK's session REST API.
|
|
85
|
+
|
|
86
|
+
Returns `{ adapter, load }` where `load` reconstructs messages from session events.
|
|
87
|
+
|
|
88
|
+
| Option | Type | Description |
|
|
89
|
+
|--------|------|-------------|
|
|
90
|
+
| `apiUrl` | `string` | ADK server base URL |
|
|
91
|
+
| `appName` | `string` | ADK app name |
|
|
92
|
+
| `userId` | `string` | ADK user ID |
|
|
93
|
+
| `headers` | `Record<string, string> \| (() => ...)` | Static or dynamic request headers |
|
|
94
|
+
|
|
95
|
+
#### `useAdkRuntime(options)`
|
|
96
|
+
|
|
97
|
+
Main hook that creates a full `AssistantRuntime`.
|
|
98
|
+
|
|
99
|
+
| Option | Type | Description |
|
|
100
|
+
|--------|------|-------------|
|
|
101
|
+
| `stream` | `AdkStreamCallback` | Stream callback (use `createAdkStream`) |
|
|
102
|
+
| `sessionAdapter` | `RemoteThreadListAdapter?` | Alternative to `cloud` for thread persistence |
|
|
103
|
+
| `cloud` | `AssistantCloud?` | Cloud adapter for thread persistence |
|
|
104
|
+
| `load` | `(threadId: string) => Promise<{messages}>` | Load thread history |
|
|
105
|
+
| `autoCancelPendingToolCalls` | `boolean?` | Auto-cancel pending tools on new message (default: true) |
|
|
106
|
+
| `unstable_allowCancellation` | `boolean?` | Enable stream cancellation |
|
|
107
|
+
| `getCheckpointId` | `(threadId, messages) => Promise<string?>` | Enable edit/reload |
|
|
108
|
+
| `adapters` | `{attachments?, speech?, feedback?}` | Optional adapters |
|
|
109
|
+
| `eventHandlers` | `{onError?, onCustomEvent?, onAgentTransfer?}` | Event callbacks |
|
|
110
|
+
|
|
111
|
+
### Hooks
|
|
112
|
+
|
|
113
|
+
| Hook | Description |
|
|
114
|
+
|------|-------------|
|
|
115
|
+
| `useAdkAgentInfo()` | Current agent name and branch path |
|
|
116
|
+
| `useAdkSessionState()` | Accumulated session state delta |
|
|
117
|
+
| `useAdkSend()` | Send raw ADK messages |
|
|
118
|
+
| `useAdkLongRunningToolIds()` | Pending tool IDs awaiting input |
|
|
119
|
+
| `useAdkToolConfirmations()` | Tool confirmation requests |
|
|
120
|
+
| `useAdkAuthRequests()` | Auth credential requests |
|
|
121
|
+
| `useAdkArtifacts()` | Artifact delta (filename → version) |
|
|
122
|
+
| `useAdkEscalation()` | Escalation flag |
|
|
123
|
+
| `useAdkMessageMetadata()` | Per-message grounding/citation/usage |
|
|
124
|
+
|
|
125
|
+
### Server Exports (`/server`)
|
|
126
|
+
|
|
127
|
+
#### `createAdkApiRoute(options)`
|
|
128
|
+
|
|
129
|
+
One-liner API route handler combining request parsing and SSE streaming.
|
|
130
|
+
|
|
131
|
+
| Option | Type | Description |
|
|
132
|
+
|--------|------|-------------|
|
|
133
|
+
| `runner` | `AdkRunner` | ADK Runner instance |
|
|
134
|
+
| `userId` | `string \| (req) => string` | Static or dynamic user ID |
|
|
135
|
+
| `sessionId` | `string \| (req) => string` | Static or dynamic session ID |
|
|
136
|
+
| `onError` | `(error) => void` | Error handler |
|
|
137
|
+
|
|
138
|
+
#### `adkEventStream(events, options?)`
|
|
139
|
+
|
|
140
|
+
Converts an ADK event async generator into an SSE `Response`.
|
|
141
|
+
|
|
142
|
+
#### `parseAdkRequest(request)`
|
|
143
|
+
|
|
144
|
+
Parses an incoming HTTP request into a structured ADK request.
|
|
145
|
+
|
|
146
|
+
#### `toAdkContent(parsed)`
|
|
147
|
+
|
|
148
|
+
Converts a parsed request into a Google GenAI `Content` object.
|
|
149
|
+
|
|
150
|
+
## Documentation
|
|
151
|
+
|
|
152
|
+
See the [full documentation](https://www.assistant-ui.com/docs/runtimes/google-adk) for setup guides, advanced APIs, and examples.
|
|
153
|
+
|
|
154
|
+
## License
|
|
155
|
+
|
|
156
|
+
MIT
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { AdkStreamCallback } from "./types.js";
|
|
2
|
+
export type CreateAdkStreamOptions = {
|
|
3
|
+
/**
|
|
4
|
+
* URL to POST to. Either a proxy route (e.g. "/api/adk") or
|
|
5
|
+
* an ADK server base URL (e.g. "http://localhost:8000").
|
|
6
|
+
*
|
|
7
|
+
* When `appName` and `userId` are provided, POSTs to `${api}/run_sse`
|
|
8
|
+
* in ADK-native format. Otherwise POSTs directly to `api` in proxy format
|
|
9
|
+
* (compatible with `parseAdkRequest`).
|
|
10
|
+
*/
|
|
11
|
+
api: string;
|
|
12
|
+
/**
|
|
13
|
+
* ADK application name. When provided along with `userId`,
|
|
14
|
+
* enables direct connection to an ADK server.
|
|
15
|
+
*/
|
|
16
|
+
appName?: string | undefined;
|
|
17
|
+
/**
|
|
18
|
+
* ADK user ID. Required when `appName` is provided.
|
|
19
|
+
*/
|
|
20
|
+
userId?: string | undefined;
|
|
21
|
+
/**
|
|
22
|
+
* Extra headers to send with every request.
|
|
23
|
+
* Can be a static object or an async function for dynamic auth tokens.
|
|
24
|
+
*/
|
|
25
|
+
headers?: Record<string, string> | (() => Record<string, string> | Promise<Record<string, string>>) | undefined;
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Creates an `AdkStreamCallback` that connects to an ADK endpoint.
|
|
29
|
+
*
|
|
30
|
+
* @example Proxy mode (with a Next.js API route)
|
|
31
|
+
* ```ts
|
|
32
|
+
* const stream = createAdkStream({ api: "/api/adk" });
|
|
33
|
+
* ```
|
|
34
|
+
*
|
|
35
|
+
* @example Direct mode (connecting to ADK server)
|
|
36
|
+
* ```ts
|
|
37
|
+
* const stream = createAdkStream({
|
|
38
|
+
* api: "http://localhost:8000",
|
|
39
|
+
* appName: "my-app",
|
|
40
|
+
* userId: "user-1",
|
|
41
|
+
* });
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
export declare function createAdkStream(options: CreateAdkStreamOptions): AdkStreamCallback;
|
|
45
|
+
//# sourceMappingURL=AdkClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AdkClient.d.ts","sourceRoot":"","sources":["../src/AdkClient.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAIV,iBAAiB,EAClB,mBAAgB;AAEjB,MAAM,MAAM,sBAAsB,GAAG;IACnC;;;;;;;OAOG;IACH,GAAG,EAAE,MAAM,CAAC;IAEZ;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAE7B;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAE5B;;;OAGG;IACH,OAAO,CAAC,EACJ,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACtB,CAAC,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,GAChE,SAAS,CAAC;CACf,CAAC;AAEF;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,sBAAsB,GAC9B,iBAAiB,CA0CnB"}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Creates an `AdkStreamCallback` that connects to an ADK endpoint.
|
|
3
|
+
*
|
|
4
|
+
* @example Proxy mode (with a Next.js API route)
|
|
5
|
+
* ```ts
|
|
6
|
+
* const stream = createAdkStream({ api: "/api/adk" });
|
|
7
|
+
* ```
|
|
8
|
+
*
|
|
9
|
+
* @example Direct mode (connecting to ADK server)
|
|
10
|
+
* ```ts
|
|
11
|
+
* const stream = createAdkStream({
|
|
12
|
+
* api: "http://localhost:8000",
|
|
13
|
+
* appName: "my-app",
|
|
14
|
+
* userId: "user-1",
|
|
15
|
+
* });
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
export function createAdkStream(options) {
|
|
19
|
+
const isDirect = options.appName != null;
|
|
20
|
+
return async function* (messages, config) {
|
|
21
|
+
const headers = await resolveHeaders(options.headers);
|
|
22
|
+
let url;
|
|
23
|
+
let body;
|
|
24
|
+
if (isDirect) {
|
|
25
|
+
// Direct mode: POST to ADK server's /run_sse
|
|
26
|
+
url = `${options.api}/run_sse`;
|
|
27
|
+
const { externalId } = await config.initialize();
|
|
28
|
+
body = {
|
|
29
|
+
appName: options.appName,
|
|
30
|
+
userId: options.userId,
|
|
31
|
+
sessionId: externalId,
|
|
32
|
+
newMessage: messagesToContent(messages),
|
|
33
|
+
streaming: true,
|
|
34
|
+
...(config.stateDelta != null && { stateDelta: config.stateDelta }),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
// Proxy mode: POST in parseAdkRequest-compatible format
|
|
39
|
+
url = options.api;
|
|
40
|
+
body = messagesToProxyBody(messages, config);
|
|
41
|
+
}
|
|
42
|
+
const response = await fetch(url, {
|
|
43
|
+
method: "POST",
|
|
44
|
+
headers: { "Content-Type": "application/json", ...headers },
|
|
45
|
+
body: JSON.stringify(body),
|
|
46
|
+
signal: config.abortSignal,
|
|
47
|
+
});
|
|
48
|
+
if (!response.ok) {
|
|
49
|
+
throw new Error(`ADK request failed: ${response.status} ${response.statusText}`);
|
|
50
|
+
}
|
|
51
|
+
yield* parseSSEResponse(response);
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
// ── Internal helpers ──
|
|
55
|
+
async function resolveHeaders(headers) {
|
|
56
|
+
if (!headers)
|
|
57
|
+
return {};
|
|
58
|
+
if (typeof headers === "function")
|
|
59
|
+
return await headers();
|
|
60
|
+
return headers;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Converts AdkMessage[] (new messages) into ADK Content format
|
|
64
|
+
* for the direct `/run_sse` endpoint.
|
|
65
|
+
*/
|
|
66
|
+
function messagesToContent(messages) {
|
|
67
|
+
const parts = [];
|
|
68
|
+
for (const msg of messages) {
|
|
69
|
+
if (msg.type === "human") {
|
|
70
|
+
for (const part of contentToParts(msg.content)) {
|
|
71
|
+
parts.push(part);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
else if (msg.type === "tool") {
|
|
75
|
+
let response;
|
|
76
|
+
try {
|
|
77
|
+
response = JSON.parse(msg.content);
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
response = msg.content;
|
|
81
|
+
}
|
|
82
|
+
parts.push({
|
|
83
|
+
functionResponse: {
|
|
84
|
+
name: msg.name,
|
|
85
|
+
id: msg.tool_call_id,
|
|
86
|
+
response,
|
|
87
|
+
},
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
if (parts.length === 0) {
|
|
92
|
+
parts.push({ text: "" });
|
|
93
|
+
}
|
|
94
|
+
return { role: "user", parts };
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Converts AdkMessage[] into the proxy request body format
|
|
98
|
+
* (compatible with `parseAdkRequest`).
|
|
99
|
+
*/
|
|
100
|
+
function messagesToProxyBody(messages, config) {
|
|
101
|
+
const body = {};
|
|
102
|
+
if (config.runConfig != null)
|
|
103
|
+
body.runConfig = config.runConfig;
|
|
104
|
+
if (config.checkpointId != null)
|
|
105
|
+
body.checkpointId = config.checkpointId;
|
|
106
|
+
if (config.stateDelta != null)
|
|
107
|
+
body.stateDelta = config.stateDelta;
|
|
108
|
+
// Check if there's a tool result
|
|
109
|
+
const toolMsg = messages.find((m) => m.type === "tool");
|
|
110
|
+
if (toolMsg && toolMsg.type === "tool") {
|
|
111
|
+
// If there are also other messages (e.g. cancellations), send as parts
|
|
112
|
+
if (messages.length > 1) {
|
|
113
|
+
body.parts = messagesToContent(messages).parts;
|
|
114
|
+
return body;
|
|
115
|
+
}
|
|
116
|
+
let result;
|
|
117
|
+
try {
|
|
118
|
+
result = JSON.parse(toolMsg.content);
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
result = toolMsg.content;
|
|
122
|
+
}
|
|
123
|
+
body.type = "tool-result";
|
|
124
|
+
body.toolCallId = toolMsg.tool_call_id;
|
|
125
|
+
body.toolName = toolMsg.name;
|
|
126
|
+
body.result = result;
|
|
127
|
+
body.isError = toolMsg.status === "error";
|
|
128
|
+
return body;
|
|
129
|
+
}
|
|
130
|
+
// Human message(s) - possibly with cancellation tool results prepended
|
|
131
|
+
if (messages.length === 1 && messages[0].type === "human") {
|
|
132
|
+
const msg = messages[0];
|
|
133
|
+
if (typeof msg.content === "string") {
|
|
134
|
+
body.message = msg.content;
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
body.parts = contentToParts(msg.content);
|
|
138
|
+
}
|
|
139
|
+
return body;
|
|
140
|
+
}
|
|
141
|
+
// Multiple messages (e.g. cancellations + human): send as parts array
|
|
142
|
+
body.parts = messagesToContent(messages).parts;
|
|
143
|
+
return body;
|
|
144
|
+
}
|
|
145
|
+
function contentToParts(content) {
|
|
146
|
+
if (typeof content === "string")
|
|
147
|
+
return [{ text: content }];
|
|
148
|
+
return content.map((part) => {
|
|
149
|
+
switch (part.type) {
|
|
150
|
+
case "text":
|
|
151
|
+
return { text: part.text };
|
|
152
|
+
case "reasoning":
|
|
153
|
+
return { text: part.text, thought: true };
|
|
154
|
+
case "image":
|
|
155
|
+
return { inlineData: { mimeType: part.mimeType, data: part.data } };
|
|
156
|
+
case "image_url":
|
|
157
|
+
return { fileData: { fileUri: part.url } };
|
|
158
|
+
case "code":
|
|
159
|
+
return {
|
|
160
|
+
executableCode: { code: part.code, language: part.language },
|
|
161
|
+
};
|
|
162
|
+
case "code_result":
|
|
163
|
+
return {
|
|
164
|
+
codeExecutionResult: { output: part.output, outcome: part.outcome },
|
|
165
|
+
};
|
|
166
|
+
default:
|
|
167
|
+
return { text: "" };
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
async function* parseSSEResponse(response) {
|
|
172
|
+
const reader = response.body.getReader();
|
|
173
|
+
const decoder = new TextDecoder();
|
|
174
|
+
let buffer = "";
|
|
175
|
+
try {
|
|
176
|
+
while (true) {
|
|
177
|
+
const { done, value } = await reader.read();
|
|
178
|
+
if (done)
|
|
179
|
+
break;
|
|
180
|
+
buffer += decoder.decode(value, { stream: true });
|
|
181
|
+
const parts = buffer.split("\n\n");
|
|
182
|
+
buffer = parts.pop() ?? "";
|
|
183
|
+
for (const part of parts) {
|
|
184
|
+
for (const line of part.split("\n")) {
|
|
185
|
+
if (line.startsWith("data: ")) {
|
|
186
|
+
yield JSON.parse(line.slice(6));
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
// Handle remaining buffer
|
|
192
|
+
if (buffer.trim()) {
|
|
193
|
+
for (const line of buffer.split("\n")) {
|
|
194
|
+
if (line.startsWith("data: ")) {
|
|
195
|
+
yield JSON.parse(line.slice(6));
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
finally {
|
|
201
|
+
reader.releaseLock();
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
//# sourceMappingURL=AdkClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AdkClient.js","sourceRoot":"","sources":["../src/AdkClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { AdkEvent, AdkMessage, AdkToolConfirmation, AdkAuthRequest, AdkMessageMetadata } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Checks if an event is a final response using the same logic as ADK's
|
|
4
|
+
* `isFinalResponse()`.
|
|
5
|
+
*/
|
|
6
|
+
export declare const isFinalResponse: (event: AdkEvent) => boolean;
|
|
7
|
+
export declare class AdkEventAccumulator {
|
|
8
|
+
private messagesMap;
|
|
9
|
+
private currentMessageId;
|
|
10
|
+
private partialTextBuffer;
|
|
11
|
+
private partialReasoningBuffer;
|
|
12
|
+
private accumulatedStateDelta;
|
|
13
|
+
private accumulatedArtifactDelta;
|
|
14
|
+
private lastAgentInfo;
|
|
15
|
+
private lastTransferToAgent;
|
|
16
|
+
private pendingLongRunningToolIds;
|
|
17
|
+
private toolConfirmations;
|
|
18
|
+
private authRequests;
|
|
19
|
+
private escalated;
|
|
20
|
+
private messageMetadataMap;
|
|
21
|
+
constructor(initialMessages?: AdkMessage[]);
|
|
22
|
+
processEvent(rawEvent: AdkEvent): AdkMessage[];
|
|
23
|
+
private processPart;
|
|
24
|
+
private trackMessageMetadata;
|
|
25
|
+
private getContentArray;
|
|
26
|
+
private getOrCreateAiMessage;
|
|
27
|
+
private appendContent;
|
|
28
|
+
private replaceLastTextContent;
|
|
29
|
+
private replaceLastReasoningContent;
|
|
30
|
+
private finalizeCurrentMessage;
|
|
31
|
+
getMessages(): AdkMessage[];
|
|
32
|
+
getStateDelta(): Record<string, unknown>;
|
|
33
|
+
getArtifactDelta(): Record<string, number>;
|
|
34
|
+
getAgentInfo(): {
|
|
35
|
+
name?: string | undefined;
|
|
36
|
+
branch?: string | undefined;
|
|
37
|
+
};
|
|
38
|
+
getLastTransferToAgent(): string | undefined;
|
|
39
|
+
getLongRunningToolIds(): string[];
|
|
40
|
+
getToolConfirmations(): AdkToolConfirmation[];
|
|
41
|
+
getAuthRequests(): AdkAuthRequest[];
|
|
42
|
+
isEscalated(): boolean;
|
|
43
|
+
getMessageMetadata(): Map<string, AdkMessageMetadata>;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=AdkEventAccumulator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AdkEventAccumulator.d.ts","sourceRoot":"","sources":["../src/AdkEventAccumulator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,QAAQ,EAER,UAAU,EAGV,mBAAmB,EACnB,cAAc,EACd,kBAAkB,EACnB,mBAAgB;AAQjB;;;GAGG;AACH,eAAO,MAAM,eAAe,GAAI,OAAO,QAAQ,KAAG,OAgBjD,CAAC;AAqHF,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,WAAW,CAAiC;IACpD,OAAO,CAAC,gBAAgB,CAAuB;IAC/C,OAAO,CAAC,iBAAiB,CAAM;IAC/B,OAAO,CAAC,sBAAsB,CAAM;IACpC,OAAO,CAAC,qBAAqB,CAA+B;IAC5D,OAAO,CAAC,wBAAwB,CAA8B;IAC9D,OAAO,CAAC,aAAa,CAGd;IACP,OAAO,CAAC,mBAAmB,CAAqB;IAChD,OAAO,CAAC,yBAAyB,CAAgB;IACjD,OAAO,CAAC,iBAAiB,CAA6B;IACtD,OAAO,CAAC,YAAY,CAAwB;IAC5C,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,kBAAkB,CAAyC;gBACvD,eAAe,CAAC,EAAE,UAAU,EAAE;IAQ1C,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG,UAAU,EAAE;IA8I9C,OAAO,CAAC,WAAW;IAqJnB,OAAO,CAAC,oBAAoB;IAmB5B,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,oBAAoB;IAuB5B,OAAO,CAAC,aAAa;IASrB,OAAO,CAAC,sBAAsB;IAY9B,OAAO,CAAC,2BAA2B;IAenC,OAAO,CAAC,sBAAsB;IAM9B,WAAW,IAAI,UAAU,EAAE;IAI3B,aAAa,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAIxC,gBAAgB,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAI1C,YAAY,IAAI;QAAE,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE;IAI1E,sBAAsB,IAAI,MAAM,GAAG,SAAS;IAI5C,qBAAqB,IAAI,MAAM,EAAE;IAIjC,oBAAoB,IAAI,mBAAmB,EAAE;IAI7C,eAAe,IAAI,cAAc,EAAE;IAInC,WAAW,IAAI,OAAO;IAItB,kBAAkB,IAAI,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC;CAGtD"}
|