@assistant-ui/react-google-adk 0.0.8 → 0.0.11
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 -34
- 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 -25
- 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 -34
- package/dist/useAdkRuntime.d.ts.map +1 -1
- package/dist/useAdkRuntime.js +219 -273
- package/dist/useAdkRuntime.js.map +1 -1
- package/package.json +8 -8
- package/src/useAdkRuntime.ts +6 -2
- 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
|
@@ -1,135 +1,100 @@
|
|
|
1
|
+
//#region src/server/adkEventStream.ts
|
|
1
2
|
const convertSdkPart = (part) => {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
result.executableCode = part.executableCode;
|
|
13
|
-
if ("codeExecutionResult" in part && part.codeExecutionResult)
|
|
14
|
-
result.codeExecutionResult = part.codeExecutionResult;
|
|
15
|
-
if ("inlineData" in part && part.inlineData)
|
|
16
|
-
result.inlineData = part.inlineData;
|
|
17
|
-
if ("fileData" in part && part.fileData)
|
|
18
|
-
result.fileData = part.fileData;
|
|
19
|
-
return result;
|
|
3
|
+
const result = {};
|
|
4
|
+
if ("text" in part && typeof part.text === "string") result.text = part.text;
|
|
5
|
+
if ("thought" in part && typeof part.thought === "boolean") result.thought = part.thought;
|
|
6
|
+
if ("functionCall" in part && part.functionCall) result.functionCall = part.functionCall;
|
|
7
|
+
if ("functionResponse" in part && part.functionResponse) result.functionResponse = part.functionResponse;
|
|
8
|
+
if ("executableCode" in part && part.executableCode) result.executableCode = part.executableCode;
|
|
9
|
+
if ("codeExecutionResult" in part && part.codeExecutionResult) result.codeExecutionResult = part.codeExecutionResult;
|
|
10
|
+
if ("inlineData" in part && part.inlineData) result.inlineData = part.inlineData;
|
|
11
|
+
if ("fileData" in part && part.fileData) result.fileData = part.fileData;
|
|
12
|
+
return result;
|
|
20
13
|
};
|
|
21
14
|
const convertSdkActions = (actions) => {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
if (actions.skipSummarization != null)
|
|
32
|
-
result.skipSummarization = actions.skipSummarization;
|
|
33
|
-
if (actions.requestedAuthConfigs != null)
|
|
34
|
-
result.requestedAuthConfigs = actions.requestedAuthConfigs;
|
|
35
|
-
if (actions.requestedToolConfirmations != null)
|
|
36
|
-
result.requestedToolConfirmations = actions.requestedToolConfirmations;
|
|
37
|
-
return result;
|
|
15
|
+
const result = {};
|
|
16
|
+
if (actions.stateDelta != null) result.stateDelta = actions.stateDelta;
|
|
17
|
+
if (actions.artifactDelta != null) result.artifactDelta = actions.artifactDelta;
|
|
18
|
+
if (actions.transferToAgent != null) result.transferToAgent = actions.transferToAgent;
|
|
19
|
+
if (actions.escalate != null) result.escalate = actions.escalate;
|
|
20
|
+
if (actions.skipSummarization != null) result.skipSummarization = actions.skipSummarization;
|
|
21
|
+
if (actions.requestedAuthConfigs != null) result.requestedAuthConfigs = actions.requestedAuthConfigs;
|
|
22
|
+
if (actions.requestedToolConfirmations != null) result.requestedToolConfirmations = actions.requestedToolConfirmations;
|
|
23
|
+
return result;
|
|
38
24
|
};
|
|
39
25
|
const convertSdkEvent = (event) => {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
}
|
|
65
|
-
if (event.actions)
|
|
66
|
-
result.actions = convertSdkActions(event.actions);
|
|
67
|
-
if (event.longRunningToolIds)
|
|
68
|
-
result.longRunningToolIds = event.longRunningToolIds;
|
|
69
|
-
if (event.errorCode != null)
|
|
70
|
-
result.errorCode = event.errorCode;
|
|
71
|
-
if (event.errorMessage != null)
|
|
72
|
-
result.errorMessage = event.errorMessage;
|
|
73
|
-
if (event.groundingMetadata != null)
|
|
74
|
-
result.groundingMetadata = event.groundingMetadata;
|
|
75
|
-
if (event.citationMetadata != null)
|
|
76
|
-
result.citationMetadata = event.citationMetadata;
|
|
77
|
-
if (event.usageMetadata != null)
|
|
78
|
-
result.usageMetadata = event.usageMetadata;
|
|
79
|
-
if (event.customMetadata != null)
|
|
80
|
-
result.customMetadata = event.customMetadata;
|
|
81
|
-
return result;
|
|
26
|
+
const result = { id: event.id ?? "" };
|
|
27
|
+
if (event.invocationId != null) result.invocationId = event.invocationId;
|
|
28
|
+
if (event.author != null) result.author = event.author;
|
|
29
|
+
if (event.branch != null) result.branch = event.branch;
|
|
30
|
+
if (event.partial != null) result.partial = event.partial;
|
|
31
|
+
if (event.turnComplete != null) result.turnComplete = event.turnComplete;
|
|
32
|
+
if (event.interrupted != null) result.interrupted = event.interrupted;
|
|
33
|
+
if (event.finishReason != null) result.finishReason = event.finishReason;
|
|
34
|
+
if (event.timestamp != null) result.timestamp = event.timestamp;
|
|
35
|
+
if (event.content) {
|
|
36
|
+
const content = {};
|
|
37
|
+
if (event.content.role != null) content.role = event.content.role;
|
|
38
|
+
if (event.content.parts) content.parts = event.content.parts.map(convertSdkPart);
|
|
39
|
+
result.content = content;
|
|
40
|
+
}
|
|
41
|
+
if (event.actions) result.actions = convertSdkActions(event.actions);
|
|
42
|
+
if (event.longRunningToolIds) result.longRunningToolIds = event.longRunningToolIds;
|
|
43
|
+
if (event.errorCode != null) result.errorCode = event.errorCode;
|
|
44
|
+
if (event.errorMessage != null) result.errorMessage = event.errorMessage;
|
|
45
|
+
if (event.groundingMetadata != null) result.groundingMetadata = event.groundingMetadata;
|
|
46
|
+
if (event.citationMetadata != null) result.citationMetadata = event.citationMetadata;
|
|
47
|
+
if (event.usageMetadata != null) result.usageMetadata = event.usageMetadata;
|
|
48
|
+
if (event.customMetadata != null) result.customMetadata = event.customMetadata;
|
|
49
|
+
return result;
|
|
82
50
|
};
|
|
83
51
|
/**
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
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
|
-
return new Response(stream, {
|
|
129
|
-
headers: {
|
|
130
|
-
"Content-Type": "text/event-stream",
|
|
131
|
-
"Cache-Control": "no-cache",
|
|
132
|
-
},
|
|
133
|
-
});
|
|
52
|
+
* Converts an AsyncGenerator of ADK SDK Events into an SSE Response.
|
|
53
|
+
*
|
|
54
|
+
* @example
|
|
55
|
+
* ```ts
|
|
56
|
+
* import { adkEventStream } from '@assistant-ui/react-google-adk/server';
|
|
57
|
+
* const events = runner.runAsync({ userId, sessionId, newMessage });
|
|
58
|
+
* return adkEventStream(events);
|
|
59
|
+
* ```
|
|
60
|
+
*/
|
|
61
|
+
const adkEventStream = (events, options) => {
|
|
62
|
+
const encoder = new TextEncoder();
|
|
63
|
+
let cancelled = false;
|
|
64
|
+
const stream = new ReadableStream({
|
|
65
|
+
async start(controller) {
|
|
66
|
+
controller.enqueue(encoder.encode(":ok\n\n"));
|
|
67
|
+
try {
|
|
68
|
+
for await (const event of events) {
|
|
69
|
+
if (cancelled) break;
|
|
70
|
+
const wireEvent = convertSdkEvent(event);
|
|
71
|
+
controller.enqueue(encoder.encode(`data: ${JSON.stringify(wireEvent)}\n\n`));
|
|
72
|
+
}
|
|
73
|
+
} catch (e) {
|
|
74
|
+
if (!cancelled) {
|
|
75
|
+
options?.onError?.(e);
|
|
76
|
+
const errorEvent = {
|
|
77
|
+
id: "",
|
|
78
|
+
errorCode: "STREAM_ERROR",
|
|
79
|
+
errorMessage: e instanceof Error ? e.message : "Unknown stream error"
|
|
80
|
+
};
|
|
81
|
+
controller.enqueue(encoder.encode(`data: ${JSON.stringify(errorEvent)}\n\n`));
|
|
82
|
+
}
|
|
83
|
+
} finally {
|
|
84
|
+
controller.close();
|
|
85
|
+
}
|
|
86
|
+
},
|
|
87
|
+
async cancel() {
|
|
88
|
+
cancelled = true;
|
|
89
|
+
await events.return?.(void 0);
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
return new Response(stream, { headers: {
|
|
93
|
+
"Content-Type": "text/event-stream",
|
|
94
|
+
"Cache-Control": "no-cache"
|
|
95
|
+
} });
|
|
134
96
|
};
|
|
97
|
+
//#endregion
|
|
98
|
+
export { adkEventStream };
|
|
99
|
+
|
|
135
100
|
//# sourceMappingURL=adkEventStream.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adkEventStream.js","
|
|
1
|
+
{"version":3,"file":"adkEventStream.js","names":[],"sources":["../../src/server/adkEventStream.ts"],"sourcesContent":["import type { AdkEvent, AdkEventActions, AdkEventPart } from \"../types\";\n\n/**\n * The ADK SDK Event type. Intentionally loose to avoid requiring @google/adk.\n */\ntype AdkSdkEvent = {\n id?: string;\n invocationId?: string;\n author?: string;\n branch?: string;\n partial?: boolean;\n turnComplete?: boolean;\n interrupted?: boolean;\n finishReason?: string;\n timestamp?: number;\n content?: {\n role?: string;\n parts?: Array<Record<string, unknown>>;\n };\n actions?: Record<string, unknown>;\n longRunningToolIds?: string[];\n errorCode?: string;\n errorMessage?: string;\n groundingMetadata?: unknown;\n citationMetadata?: unknown;\n usageMetadata?: unknown;\n customMetadata?: Record<string, unknown>;\n};\n\nconst convertSdkPart = (part: Record<string, unknown>): AdkEventPart => {\n const result: Record<string, unknown> = {};\n if (\"text\" in part && typeof part.text === \"string\") result.text = part.text;\n if (\"thought\" in part && typeof part.thought === \"boolean\")\n result.thought = part.thought;\n if (\"functionCall\" in part && part.functionCall)\n result.functionCall = part.functionCall;\n if (\"functionResponse\" in part && part.functionResponse)\n result.functionResponse = part.functionResponse;\n if (\"executableCode\" in part && part.executableCode)\n result.executableCode = part.executableCode;\n if (\"codeExecutionResult\" in part && part.codeExecutionResult)\n result.codeExecutionResult = part.codeExecutionResult;\n if (\"inlineData\" in part && part.inlineData)\n result.inlineData = part.inlineData;\n if (\"fileData\" in part && part.fileData) result.fileData = part.fileData;\n return result as AdkEventPart;\n};\n\nconst convertSdkActions = (\n actions: Record<string, unknown>,\n): AdkEventActions => {\n const result: Record<string, unknown> = {};\n if (actions.stateDelta != null) result.stateDelta = actions.stateDelta;\n if (actions.artifactDelta != null)\n result.artifactDelta = actions.artifactDelta;\n if (actions.transferToAgent != null)\n result.transferToAgent = actions.transferToAgent;\n if (actions.escalate != null) result.escalate = actions.escalate;\n if (actions.skipSummarization != null)\n result.skipSummarization = actions.skipSummarization;\n if (actions.requestedAuthConfigs != null)\n result.requestedAuthConfigs = actions.requestedAuthConfigs;\n if (actions.requestedToolConfirmations != null)\n result.requestedToolConfirmations = actions.requestedToolConfirmations;\n return result as AdkEventActions;\n};\n\nconst convertSdkEvent = (event: AdkSdkEvent): AdkEvent => {\n const result: Record<string, unknown> = { id: event.id ?? \"\" };\n if (event.invocationId != null) result.invocationId = event.invocationId;\n if (event.author != null) result.author = event.author;\n if (event.branch != null) result.branch = event.branch;\n if (event.partial != null) result.partial = event.partial;\n if (event.turnComplete != null) result.turnComplete = event.turnComplete;\n if (event.interrupted != null) result.interrupted = event.interrupted;\n if (event.finishReason != null) result.finishReason = event.finishReason;\n if (event.timestamp != null) result.timestamp = event.timestamp;\n if (event.content) {\n const content: Record<string, unknown> = {};\n if (event.content.role != null) content.role = event.content.role;\n if (event.content.parts)\n content.parts = event.content.parts.map(convertSdkPart);\n result.content = content;\n }\n if (event.actions) result.actions = convertSdkActions(event.actions);\n if (event.longRunningToolIds)\n result.longRunningToolIds = event.longRunningToolIds;\n if (event.errorCode != null) result.errorCode = event.errorCode;\n if (event.errorMessage != null) result.errorMessage = event.errorMessage;\n if (event.groundingMetadata != null)\n result.groundingMetadata = event.groundingMetadata;\n if (event.citationMetadata != null)\n result.citationMetadata = event.citationMetadata;\n if (event.usageMetadata != null) result.usageMetadata = event.usageMetadata;\n if (event.customMetadata != null)\n result.customMetadata = event.customMetadata;\n return result as AdkEvent;\n};\n\nexport type AdkEventStreamOptions = {\n onError?: (error: unknown) => void;\n};\n\n/**\n * Converts an AsyncGenerator of ADK SDK Events into an SSE Response.\n *\n * @example\n * ```ts\n * import { adkEventStream } from '@assistant-ui/react-google-adk/server';\n * const events = runner.runAsync({ userId, sessionId, newMessage });\n * return adkEventStream(events);\n * ```\n */\nexport const adkEventStream = (\n events: AsyncGenerator<AdkSdkEvent, void, undefined>,\n options?: AdkEventStreamOptions,\n): Response => {\n const encoder = new TextEncoder();\n let cancelled = false;\n const stream = new ReadableStream({\n async start(controller) {\n // Initial SSE comment to keep connection alive through proxies\n controller.enqueue(encoder.encode(\":ok\\n\\n\"));\n try {\n for await (const event of events) {\n if (cancelled) break;\n const wireEvent = convertSdkEvent(event);\n controller.enqueue(\n encoder.encode(`data: ${JSON.stringify(wireEvent)}\\n\\n`),\n );\n }\n } catch (e) {\n if (!cancelled) {\n options?.onError?.(e);\n const errorEvent: AdkEvent = {\n id: \"\",\n errorCode: \"STREAM_ERROR\",\n errorMessage:\n e instanceof Error ? e.message : \"Unknown stream error\",\n };\n controller.enqueue(\n encoder.encode(`data: ${JSON.stringify(errorEvent)}\\n\\n`),\n );\n }\n } finally {\n controller.close();\n }\n },\n async cancel() {\n cancelled = true;\n await events.return?.(undefined as any);\n },\n });\n\n return new Response(stream, {\n headers: {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n },\n });\n};\n"],"mappings":"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"}
|
|
@@ -1,30 +1,32 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { AdkEventStreamOptions } from "./adkEventStream.js";
|
|
2
|
+
|
|
3
|
+
//#region src/server/createAdkApiRoute.d.ts
|
|
2
4
|
/**
|
|
3
5
|
* Loose runner type matching the ADK SDK's Runner interface.
|
|
4
6
|
* Avoids requiring `@google/adk` as a dependency.
|
|
5
7
|
*/
|
|
6
8
|
type AdkRunner = {
|
|
7
|
-
|
|
9
|
+
runAsync(options: Record<string, unknown>): AsyncGenerator<any, void, undefined>;
|
|
8
10
|
};
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
11
|
+
type CreateAdkApiRouteOptions = {
|
|
12
|
+
/**
|
|
13
|
+
* ADK Runner instance.
|
|
14
|
+
*/
|
|
15
|
+
runner: AdkRunner;
|
|
16
|
+
/**
|
|
17
|
+
* User ID to use for the ADK session. Can be a static string
|
|
18
|
+
* or a function that extracts it from the request.
|
|
19
|
+
*/
|
|
20
|
+
userId: string | ((req: Request) => string | Promise<string>);
|
|
21
|
+
/**
|
|
22
|
+
* Session ID to use. Can be a static string or a function
|
|
23
|
+
* that extracts it from the request (e.g. from query params or headers).
|
|
24
|
+
*/
|
|
25
|
+
sessionId: string | ((req: Request) => string | Promise<string>);
|
|
26
|
+
/**
|
|
27
|
+
* Error handler for stream errors.
|
|
28
|
+
*/
|
|
29
|
+
onError?: AdkEventStreamOptions["onError"];
|
|
28
30
|
};
|
|
29
31
|
/**
|
|
30
32
|
* Creates a request handler that combines `parseAdkRequest`, `toAdkContent`,
|
|
@@ -42,6 +44,7 @@ export type CreateAdkApiRouteOptions = {
|
|
|
42
44
|
* });
|
|
43
45
|
* ```
|
|
44
46
|
*/
|
|
45
|
-
|
|
46
|
-
|
|
47
|
+
declare function createAdkApiRoute(options: CreateAdkApiRouteOptions): (req: Request) => Promise<Response>;
|
|
48
|
+
//#endregion
|
|
49
|
+
export { CreateAdkApiRouteOptions, createAdkApiRoute };
|
|
47
50
|
//# sourceMappingURL=createAdkApiRoute.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createAdkApiRoute.d.ts","
|
|
1
|
+
{"version":3,"file":"createAdkApiRoute.d.ts","names":[],"sources":["../../src/server/createAdkApiRoute.ts"],"mappings":";;;;;AAC8E;;KAMzE,SAAA;EACH,QAAA,CACE,OAAA,EAAS,MAAA,oBACR,cAAc;AAAA;AAAA,KAGP,wBAAA;EAJR;;;EAQF,MAAA,EAAQ,SAAA;EAJE;;;;EAUV,MAAA,aAAmB,GAAA,EAAK,OAAA,cAAqB,OAAA;EAAA;;;;EAM7C,SAAA,aAAsB,GAAA,EAAK,OAAA,cAAqB,OAAA;EAKjB;;;EAA/B,OAAA,GAAU,qBAAA;AAAA;;;;;;;;;;AAAqB;AAmBjC;;;;;;iBAAgB,iBAAA,CACd,OAAA,EAAS,wBAAA,IACP,GAAA,EAAK,OAAA,KAAY,OAAA,CAAQ,QAAA"}
|
|
@@ -1,41 +1,38 @@
|
|
|
1
|
-
import { parseAdkRequest, toAdkContent } from "./parseAdkRequest.js";
|
|
2
1
|
import { adkEventStream } from "./adkEventStream.js";
|
|
2
|
+
import { parseAdkRequest, toAdkContent } from "./parseAdkRequest.js";
|
|
3
|
+
//#region src/server/createAdkApiRoute.ts
|
|
3
4
|
/**
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
...(parsed.stateDelta != null && { stateDelta: parsed.stateDelta }),
|
|
34
|
-
...(parsed.config.runConfig != null && {
|
|
35
|
-
runConfig: parsed.config.runConfig,
|
|
36
|
-
}),
|
|
37
|
-
});
|
|
38
|
-
return adkEventStream(events, options.onError ? { onError: options.onError } : undefined);
|
|
39
|
-
};
|
|
5
|
+
* Creates a request handler that combines `parseAdkRequest`, `toAdkContent`,
|
|
6
|
+
* and `adkEventStream` into a single function.
|
|
7
|
+
*
|
|
8
|
+
* @example Next.js App Router
|
|
9
|
+
* ```ts
|
|
10
|
+
* import { createAdkApiRoute } from '@assistant-ui/react-google-adk/server';
|
|
11
|
+
* import { runner } from './agent';
|
|
12
|
+
*
|
|
13
|
+
* export const POST = createAdkApiRoute({
|
|
14
|
+
* runner,
|
|
15
|
+
* userId: "default-user",
|
|
16
|
+
* sessionId: (req) => new URL(req.url).searchParams.get("sessionId") ?? "default",
|
|
17
|
+
* });
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
function createAdkApiRoute(options) {
|
|
21
|
+
return async (req) => {
|
|
22
|
+
const parsed = await parseAdkRequest(req);
|
|
23
|
+
const newMessage = toAdkContent(parsed);
|
|
24
|
+
const userId = typeof options.userId === "function" ? await options.userId(req) : options.userId;
|
|
25
|
+
const sessionId = typeof options.sessionId === "function" ? await options.sessionId(req) : options.sessionId;
|
|
26
|
+
return adkEventStream(options.runner.runAsync({
|
|
27
|
+
userId,
|
|
28
|
+
sessionId,
|
|
29
|
+
newMessage,
|
|
30
|
+
...parsed.stateDelta != null && { stateDelta: parsed.stateDelta },
|
|
31
|
+
...parsed.config.runConfig != null && { runConfig: parsed.config.runConfig }
|
|
32
|
+
}), options.onError ? { onError: options.onError } : void 0);
|
|
33
|
+
};
|
|
40
34
|
}
|
|
35
|
+
//#endregion
|
|
36
|
+
export { createAdkApiRoute };
|
|
37
|
+
|
|
41
38
|
//# sourceMappingURL=createAdkApiRoute.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createAdkApiRoute.js","
|
|
1
|
+
{"version":3,"file":"createAdkApiRoute.js","names":[],"sources":["../../src/server/createAdkApiRoute.ts"],"sourcesContent":["import { parseAdkRequest, toAdkContent } from \"./parseAdkRequest\";\nimport { adkEventStream, type AdkEventStreamOptions } from \"./adkEventStream\";\n\n/**\n * Loose runner type matching the ADK SDK's Runner interface.\n * Avoids requiring `@google/adk` as a dependency.\n */\ntype AdkRunner = {\n runAsync(\n options: Record<string, unknown>,\n ): AsyncGenerator<any, void, undefined>;\n};\n\nexport type CreateAdkApiRouteOptions = {\n /**\n * ADK Runner instance.\n */\n runner: AdkRunner;\n\n /**\n * User ID to use for the ADK session. Can be a static string\n * or a function that extracts it from the request.\n */\n userId: string | ((req: Request) => string | Promise<string>);\n\n /**\n * Session ID to use. Can be a static string or a function\n * that extracts it from the request (e.g. from query params or headers).\n */\n sessionId: string | ((req: Request) => string | Promise<string>);\n\n /**\n * Error handler for stream errors.\n */\n onError?: AdkEventStreamOptions[\"onError\"];\n};\n\n/**\n * Creates a request handler that combines `parseAdkRequest`, `toAdkContent`,\n * and `adkEventStream` into a single function.\n *\n * @example Next.js App Router\n * ```ts\n * import { createAdkApiRoute } from '@assistant-ui/react-google-adk/server';\n * import { runner } from './agent';\n *\n * export const POST = createAdkApiRoute({\n * runner,\n * userId: \"default-user\",\n * sessionId: (req) => new URL(req.url).searchParams.get(\"sessionId\") ?? \"default\",\n * });\n * ```\n */\nexport function createAdkApiRoute(\n options: CreateAdkApiRouteOptions,\n): (req: Request) => Promise<Response> {\n return async (req: Request): Promise<Response> => {\n const parsed = await parseAdkRequest(req);\n const newMessage = toAdkContent(parsed);\n\n const userId =\n typeof options.userId === \"function\"\n ? await options.userId(req)\n : options.userId;\n\n const sessionId =\n typeof options.sessionId === \"function\"\n ? await options.sessionId(req)\n : options.sessionId;\n\n const events = options.runner.runAsync({\n userId,\n sessionId,\n newMessage,\n ...(parsed.stateDelta != null && { stateDelta: parsed.stateDelta }),\n ...(parsed.config.runConfig != null && {\n runConfig: parsed.config.runConfig,\n }),\n });\n\n return adkEventStream(\n events,\n options.onError ? { onError: options.onError } : undefined,\n );\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAqDA,SAAgB,kBACd,SACqC;CACrC,OAAO,OAAO,QAAoC;EAChD,MAAM,SAAS,MAAM,gBAAgB,GAAG;EACxC,MAAM,aAAa,aAAa,MAAM;EAEtC,MAAM,SACJ,OAAO,QAAQ,WAAW,aACtB,MAAM,QAAQ,OAAO,GAAG,IACxB,QAAQ;EAEd,MAAM,YACJ,OAAO,QAAQ,cAAc,aACzB,MAAM,QAAQ,UAAU,GAAG,IAC3B,QAAQ;EAYd,OAAO,eAVQ,QAAQ,OAAO,SAAS;GACrC;GACA;GACA;GACA,GAAI,OAAO,cAAc,QAAQ,EAAE,YAAY,OAAO,WAAW;GACjE,GAAI,OAAO,OAAO,aAAa,QAAQ,EACrC,WAAW,OAAO,OAAO,UAC3B;EACF,CAGO,GACL,QAAQ,UAAU,EAAE,SAAS,QAAQ,QAAQ,IAAI,KAAA,CACnD;CACF;AACF"}
|
package/dist/server/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import { AdkEventStreamOptions, adkEventStream } from "./adkEventStream.js";
|
|
2
|
+
import { CreateAdkApiRouteOptions, createAdkApiRoute } from "./createAdkApiRoute.js";
|
|
3
|
+
import { parseAdkRequest, toAdkContent } from "./parseAdkRequest.js";
|
|
4
|
+
export { type AdkEventStreamOptions, type CreateAdkApiRouteOptions, adkEventStream, createAdkApiRoute, parseAdkRequest, toAdkContent };
|
package/dist/server/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import { adkEventStream } from "./adkEventStream.js";
|
|
2
|
+
import { parseAdkRequest, toAdkContent } from "./parseAdkRequest.js";
|
|
3
|
+
import { createAdkApiRoute } from "./createAdkApiRoute.js";
|
|
4
|
+
export { adkEventStream, createAdkApiRoute, parseAdkRequest, toAdkContent };
|
|
@@ -1,18 +1,20 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { AdkSendMessageConfig } from "../types.js";
|
|
2
|
+
|
|
3
|
+
//#region src/server/parseAdkRequest.d.ts
|
|
2
4
|
type ParsedAdkRequest = {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
type: "message";
|
|
6
|
+
text: string;
|
|
7
|
+
parts?: Array<Record<string, unknown>> | undefined;
|
|
8
|
+
config: AdkSendMessageConfig;
|
|
9
|
+
stateDelta?: Record<string, unknown> | undefined;
|
|
8
10
|
} | {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
11
|
+
type: "tool-result";
|
|
12
|
+
toolCallId: string;
|
|
13
|
+
toolName: string;
|
|
14
|
+
result: unknown;
|
|
15
|
+
isError: boolean;
|
|
16
|
+
config: AdkSendMessageConfig;
|
|
17
|
+
stateDelta?: Record<string, unknown> | undefined;
|
|
16
18
|
};
|
|
17
19
|
/**
|
|
18
20
|
* Parses an incoming HTTP request into a structured ADK request.
|
|
@@ -35,7 +37,7 @@ type ParsedAdkRequest = {
|
|
|
35
37
|
* }
|
|
36
38
|
* ```
|
|
37
39
|
*/
|
|
38
|
-
|
|
40
|
+
declare const parseAdkRequest: (request: Request) => Promise<ParsedAdkRequest>;
|
|
39
41
|
/**
|
|
40
42
|
* Converts a parsed ADK request into a Google GenAI Content object
|
|
41
43
|
* suitable for `Runner.runAsync({ newMessage })`.
|
|
@@ -48,9 +50,10 @@ export declare const parseAdkRequest: (request: Request) => Promise<ParsedAdkReq
|
|
|
48
50
|
* return adkEventStream(events);
|
|
49
51
|
* ```
|
|
50
52
|
*/
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
53
|
+
declare const toAdkContent: (parsed: ParsedAdkRequest) => {
|
|
54
|
+
role: string;
|
|
55
|
+
parts: Array<Record<string, unknown>>;
|
|
54
56
|
};
|
|
55
|
-
|
|
57
|
+
//#endregion
|
|
58
|
+
export { parseAdkRequest, toAdkContent };
|
|
56
59
|
//# sourceMappingURL=parseAdkRequest.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parseAdkRequest.d.ts","
|
|
1
|
+
{"version":3,"file":"parseAdkRequest.d.ts","names":[],"sources":["../../src/server/parseAdkRequest.ts"],"mappings":";;;KAEK,gBAAA;EAEC,IAAA;EACA,IAAA;EACA,KAAA,GAAQ,KAAA,CAAM,MAAA;EACd,MAAA,EAAQ,oBAAA;EACR,UAAA,GAAa,MAAA;AAAA;EAGb,IAAA;EACA,UAAA;EACA,QAAA;EACA,MAAA;EACA,OAAA;EACA,MAAA,EAAQ,oBAAA;EACR,UAAA,GAAa,MAAA;AAAA;;;;;;;;;;;;;;;;;;AAAM;AAwBzB;;;cAAa,eAAA,GACX,OAAA,EAAS,OAAA,KACR,OAAA,CAAQ,gBAAA;;;;;;;;;;AAAgB;AAsD3B;;cAAa,YAAA,GACX,MAAA,EAAQ,gBAAA;EACL,IAAA;EAAc,KAAA,EAAO,KAAA,CAAM,MAAA;AAAA"}
|