@assistant-ui/react-google-adk 0.0.29 → 0.0.31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AdkClient.d.ts +2 -3
- package/dist/AdkClient.d.ts.map +1 -1
- package/dist/AdkClient.js +2 -1
- package/dist/AdkClient.js.map +1 -1
- package/dist/AdkEventAccumulator.d.ts +4 -6
- package/dist/AdkEventAccumulator.d.ts.map +1 -1
- package/dist/AdkEventAccumulator.js +80 -95
- package/dist/AdkEventAccumulator.js.map +1 -1
- package/dist/AdkSessionAdapter.d.ts +7 -4
- package/dist/AdkSessionAdapter.d.ts.map +1 -1
- package/dist/AdkSessionAdapter.js +7 -4
- package/dist/AdkSessionAdapter.js.map +1 -1
- package/dist/adkExtras.d.ts +1 -2
- package/dist/adkExtras.d.ts.map +1 -1
- package/dist/adkToolApproval.d.ts +6 -7
- package/dist/adkToolApproval.d.ts.map +1 -1
- package/dist/adkToolApproval.js +1 -3
- package/dist/adkToolApproval.js.map +1 -1
- package/dist/contentToParts.d.ts +1 -2
- package/dist/contentToParts.d.ts.map +1 -1
- package/dist/convertAdkMessages.d.ts +2 -3
- package/dist/convertAdkMessages.d.ts.map +1 -1
- package/dist/convertToAdkMessages.d.ts +15 -7
- package/dist/convertToAdkMessages.d.ts.map +1 -1
- package/dist/convertToAdkMessages.js +20 -6
- package/dist/convertToAdkMessages.js.map +1 -1
- package/dist/hooks.d.ts +15 -16
- package/dist/hooks.d.ts.map +1 -1
- package/dist/hooks.js +1 -1
- package/dist/normalizeAdkPart.d.ts +4 -0
- package/dist/normalizeAdkPart.d.ts.map +1 -0
- package/dist/normalizeAdkPart.js +31 -0
- package/dist/normalizeAdkPart.js.map +1 -0
- package/dist/parseAdkEvent.d.ts +1 -2
- package/dist/parseAdkEvent.d.ts.map +1 -1
- package/dist/sdkIdentity.d.ts +5 -0
- package/dist/sdkIdentity.d.ts.map +1 -0
- package/dist/sdkIdentity.js +9 -0
- package/dist/sdkIdentity.js.map +1 -0
- package/dist/server/adkEventStream.d.ts +2 -3
- package/dist/server/adkEventStream.d.ts.map +1 -1
- package/dist/server/createAdkApiRoute.d.ts +2 -3
- package/dist/server/createAdkApiRoute.d.ts.map +1 -1
- package/dist/server/parseAdkRequest.d.ts +2 -3
- package/dist/server/parseAdkRequest.d.ts.map +1 -1
- package/dist/server/parseAdkRequest.js +2 -1
- package/dist/server/parseAdkRequest.js.map +1 -1
- package/dist/structuredEvents.d.ts +1 -2
- package/dist/structuredEvents.d.ts.map +1 -1
- package/dist/structuredEvents.js +1 -1
- package/dist/structuredEvents.js.map +1 -1
- package/dist/toAdkFunctionResponse.d.ts +5 -0
- package/dist/toAdkFunctionResponse.d.ts.map +1 -0
- package/dist/toAdkFunctionResponse.js +11 -0
- package/dist/toAdkFunctionResponse.js.map +1 -0
- package/dist/trimTrailingSlashes.d.ts +1 -2
- package/dist/trimTrailingSlashes.d.ts.map +1 -1
- package/dist/types.d.ts +22 -23
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/useAdkMessages.d.ts +2 -3
- package/dist/useAdkMessages.d.ts.map +1 -1
- package/dist/useAdkMessages.js +16 -5
- package/dist/useAdkMessages.js.map +1 -1
- package/dist/useAdkRuntime.d.ts +2 -3
- package/dist/useAdkRuntime.d.ts.map +1 -1
- package/dist/useAdkRuntime.js +3 -1
- package/dist/useAdkRuntime.js.map +1 -1
- package/package.json +10 -9
- package/src/AdkClient.test.ts +139 -2
- package/src/AdkClient.ts +2 -1
- package/src/AdkEventAccumulator.test.ts +588 -11
- package/src/AdkEventAccumulator.ts +85 -130
- package/src/AdkSessionAdapter.test.ts +355 -1
- package/src/AdkSessionAdapter.ts +24 -5
- package/src/adkToolApproval.test.ts +0 -4
- package/src/adkToolApproval.ts +1 -3
- package/src/convertToAdkMessages.test.ts +70 -0
- package/src/convertToAdkMessages.ts +19 -4
- package/src/normalizeAdkPart.ts +35 -0
- package/src/sdkIdentity.ts +9 -0
- package/src/server/parseAdkRequest.test.ts +63 -0
- package/src/server/parseAdkRequest.ts +2 -1
- package/src/structuredEvents.test.ts +69 -0
- package/src/structuredEvents.ts +4 -1
- package/src/toAdkFunctionResponse.test.ts +46 -0
- package/src/toAdkFunctionResponse.ts +18 -0
- package/src/types.ts +1 -1
- package/src/useAdkMessages.test.ts +249 -2
- package/src/useAdkMessages.ts +24 -6
- package/src/useAdkRuntime.replacement.test.tsx +11 -7
- package/src/useAdkRuntime.ts +2 -0
- package/src/useAdkRuntimeApproval.test.tsx +0 -1
|
@@ -7,7 +7,7 @@ import { AdkEventStreamOptions } from "./adkEventStream.js";
|
|
|
7
7
|
type AdkRunner = {
|
|
8
8
|
runAsync(options: Record<string, unknown>): AsyncGenerator<any, void, undefined>;
|
|
9
9
|
};
|
|
10
|
-
type CreateAdkApiRouteOptions = {
|
|
10
|
+
export type CreateAdkApiRouteOptions = {
|
|
11
11
|
/**
|
|
12
12
|
* ADK Runner instance.
|
|
13
13
|
*/
|
|
@@ -43,7 +43,6 @@ type CreateAdkApiRouteOptions = {
|
|
|
43
43
|
* });
|
|
44
44
|
* ```
|
|
45
45
|
*/
|
|
46
|
-
declare function createAdkApiRoute(options: CreateAdkApiRouteOptions): (req: Request) => Promise<Response>;
|
|
46
|
+
export declare function createAdkApiRoute(options: CreateAdkApiRouteOptions): (req: Request) => Promise<Response>;
|
|
47
47
|
//#endregion
|
|
48
|
-
export { CreateAdkApiRouteOptions, createAdkApiRoute };
|
|
49
48
|
//# sourceMappingURL=createAdkApiRoute.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createAdkApiRoute.d.ts","names":[],"sources":["../../src/server/createAdkApiRoute.ts"],"mappings":";;;;;;KAOK;EACH,SACE,SAAS,0BACR;;
|
|
1
|
+
{"version":3,"file":"createAdkApiRoute.d.ts","names":[],"sources":["../../src/server/createAdkApiRoute.ts"],"mappings":";;;;;;KAOK;EACH,SACE,SAAS,0BACR;;YAGO;;;;EAIV,QAAQ;;;;;EAMR,mBAAmB,KAAK,qBAAqB;;;;;EAM7C,sBAAsB,KAAK,qBAAqB;;;;EAKhD,UAAU;;;;;;;;;;;;;;;;;;wBAmBI,kBACd,SAAS,4BACP,KAAK,YAAY,QAAQ"}
|
|
@@ -36,7 +36,7 @@ type ParsedAdkRequest = {
|
|
|
36
36
|
* }
|
|
37
37
|
* ```
|
|
38
38
|
*/
|
|
39
|
-
declare const parseAdkRequest: (request: Request) => Promise<ParsedAdkRequest>;
|
|
39
|
+
export declare const parseAdkRequest: (request: Request) => Promise<ParsedAdkRequest>;
|
|
40
40
|
/**
|
|
41
41
|
* Converts a parsed ADK request into a Google GenAI Content object
|
|
42
42
|
* suitable for `Runner.runAsync({ newMessage })`.
|
|
@@ -49,10 +49,9 @@ declare const parseAdkRequest: (request: Request) => Promise<ParsedAdkRequest>;
|
|
|
49
49
|
* return adkEventStream(events);
|
|
50
50
|
* ```
|
|
51
51
|
*/
|
|
52
|
-
declare const toAdkContent: (parsed: ParsedAdkRequest) => {
|
|
52
|
+
export declare const toAdkContent: (parsed: ParsedAdkRequest) => {
|
|
53
53
|
role: string;
|
|
54
54
|
parts: Array<Record<string, unknown>>;
|
|
55
55
|
};
|
|
56
56
|
//#endregion
|
|
57
|
-
export { parseAdkRequest, toAdkContent };
|
|
58
57
|
//# sourceMappingURL=parseAdkRequest.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parseAdkRequest.d.ts","names":[],"sources":["../../src/server/parseAdkRequest.ts"],"mappings":";;
|
|
1
|
+
{"version":3,"file":"parseAdkRequest.d.ts","names":[],"sources":["../../src/server/parseAdkRequest.ts"],"mappings":";;KAIK;EAEC;EACA;EACA,QAAQ,MAAM;EACd,QAAQ;EACR,aAAa;;EAGb;EACA;EACA;EACA;EACA;EACA,QAAQ;EACR,aAAa;;;;;;;;;;;;;;;;;;;;;;;qBA6HN,kBACX,SAAS,YACR,QAAQ;;;;;;;;;;;;;qBAsFE,eACX,QAAQ;EACL;EAAc,OAAO,MAAM"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { toAdkFunctionResponse } from "../toAdkFunctionResponse.js";
|
|
1
2
|
import { isRecord } from "@assistant-ui/core/internal";
|
|
2
3
|
//#region src/server/parseAdkRequest.ts
|
|
3
4
|
const invalidField = (field, expectation) => /* @__PURE__ */ new Error(`Invalid Google ADK proxy request field "${field}": expected ${expectation}.`);
|
|
@@ -133,7 +134,7 @@ const toAdkContent = (parsed) => {
|
|
|
133
134
|
parts: [{ functionResponse: {
|
|
134
135
|
name: parsed.toolName,
|
|
135
136
|
id: parsed.toolCallId,
|
|
136
|
-
response: parsed.result
|
|
137
|
+
response: toAdkFunctionResponse(parsed.result, parsed.isError)
|
|
137
138
|
} }]
|
|
138
139
|
};
|
|
139
140
|
if (parsed.parts?.length) return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parseAdkRequest.js","names":[],"sources":["../../src/server/parseAdkRequest.ts"],"sourcesContent":["import { isRecord } from \"@assistant-ui/core/internal\";\nimport type { AdkSendMessageConfig } from \"../types\";\n\ntype ParsedAdkRequest =\n | {\n type: \"message\";\n text: string;\n parts?: Array<Record<string, unknown>> | undefined;\n config: AdkSendMessageConfig;\n stateDelta?: Record<string, unknown> | undefined;\n }\n | {\n type: \"tool-result\";\n toolCallId: string;\n toolName: string;\n result: unknown;\n isError: boolean;\n config: AdkSendMessageConfig;\n stateDelta?: Record<string, unknown> | undefined;\n };\n\nconst invalidField = (field: string, expectation: string): Error =>\n new Error(\n `Invalid Google ADK proxy request field \"${field}\": expected ${expectation}.`,\n );\n\nconst readString = (body: Record<string, unknown>, field: string): string => {\n const value = body[field];\n if (typeof value !== \"string\") throw invalidField(field, \"a string\");\n return value;\n};\n\nconst readOptionalString = (\n body: Record<string, unknown>,\n field: string,\n): string | undefined => {\n const value = body[field];\n if (value === undefined) return undefined;\n if (typeof value !== \"string\") throw invalidField(field, \"a string\");\n return value;\n};\n\nconst validateOptionalPartString = (\n part: Record<string, unknown>,\n key: string,\n field: string,\n) => {\n if (part[key] !== undefined && typeof part[key] !== \"string\") {\n throw invalidField(field, \"a string\");\n }\n};\n\n// Nested fields are validated only when present: ADK serializes with\n// exclude_none semantics and the Part vocabulary grows upstream, so absent\n// fields and unknown part kinds pass through to the runner untouched.\nconst validatePart = (part: Record<string, unknown>, index: number) => {\n const field = (name: string) => `parts[${index}].${name}`;\n if (Object.keys(part).length === 0) {\n throw invalidField(`parts[${index}]`, \"a non-empty part object\");\n }\n if (part.thought !== undefined && typeof part.thought !== \"boolean\") {\n throw invalidField(field(\"thought\"), \"a boolean\");\n }\n if (part.text !== undefined && typeof part.text !== \"string\") {\n throw invalidField(field(\"text\"), \"a string\");\n }\n\n const validateRecordField = (\n key: string,\n validateContent: (content: Record<string, unknown>) => void,\n ) => {\n const value = part[key];\n if (value === undefined) return;\n if (!isRecord(value)) throw invalidField(field(key), \"an object\");\n validateContent(value);\n };\n\n validateRecordField(\"functionCall\", (content) => {\n validateOptionalPartString(content, \"name\", field(\"functionCall.name\"));\n validateOptionalPartString(content, \"id\", field(\"functionCall.id\"));\n if (content.args !== undefined && !isRecord(content.args)) {\n throw invalidField(field(\"functionCall.args\"), \"an object\");\n }\n });\n validateRecordField(\"functionResponse\", (content) => {\n validateOptionalPartString(content, \"name\", field(\"functionResponse.name\"));\n validateOptionalPartString(content, \"id\", field(\"functionResponse.id\"));\n });\n validateRecordField(\"executableCode\", (content) => {\n validateOptionalPartString(content, \"code\", field(\"executableCode.code\"));\n validateOptionalPartString(\n content,\n \"language\",\n field(\"executableCode.language\"),\n );\n });\n validateRecordField(\"codeExecutionResult\", (content) => {\n validateOptionalPartString(\n content,\n \"output\",\n field(\"codeExecutionResult.output\"),\n );\n validateOptionalPartString(\n content,\n \"outcome\",\n field(\"codeExecutionResult.outcome\"),\n );\n });\n validateRecordField(\"inlineData\", (content) => {\n validateOptionalPartString(\n content,\n \"mimeType\",\n field(\"inlineData.mimeType\"),\n );\n validateOptionalPartString(content, \"data\", field(\"inlineData.data\"));\n });\n validateRecordField(\"fileData\", (content) => {\n validateOptionalPartString(content, \"fileUri\", field(\"fileData.fileUri\"));\n validateOptionalPartString(content, \"mimeType\", field(\"fileData.mimeType\"));\n });\n};\n\n/**\n * Parses an incoming HTTP request into a structured ADK request.\n *\n * Supports two request shapes:\n *\n * 1. User message:\n * ```json\n * { \"message\": \"Hello\", \"runConfig\": {}, \"stateDelta\": {} }\n * ```\n *\n * 2. Tool result:\n * ```json\n * {\n * \"type\": \"tool-result\",\n * \"toolCallId\": \"call_123\",\n * \"toolName\": \"search\",\n * \"result\": { ... },\n * \"isError\": false\n * }\n * ```\n */\nexport const parseAdkRequest = async (\n request: Request,\n): Promise<ParsedAdkRequest> => {\n let body: unknown;\n try {\n body = await request.json();\n } catch {\n throw new Error(\n 'Invalid JSON in Google ADK proxy request body. Expected a JSON object like {\"message\":\"Hello\"} or {\"type\":\"tool-result\",...}.',\n );\n }\n\n if (!isRecord(body)) {\n throw new Error(\"Google ADK proxy request body must be a JSON object\");\n }\n\n const config: AdkSendMessageConfig = {};\n if (body.runConfig !== undefined) config.runConfig = body.runConfig;\n const checkpointId = readOptionalString(body, \"checkpointId\");\n if (checkpointId !== undefined) config.checkpointId = checkpointId;\n\n const stateDelta = body.stateDelta;\n if (stateDelta !== undefined && !isRecord(stateDelta)) {\n throw invalidField(\"stateDelta\", \"an object\");\n }\n\n if (body.type === \"tool-result\") {\n if (!(\"result\" in body)) {\n throw invalidField(\"result\", \"a value\");\n }\n if (body.isError !== undefined && typeof body.isError !== \"boolean\") {\n throw invalidField(\"isError\", \"a boolean\");\n }\n return {\n type: \"tool-result\",\n toolCallId: readString(body, \"toolCallId\"),\n toolName: readString(body, \"toolName\"),\n result: body.result,\n isError: body.isError ?? false,\n config,\n ...(stateDelta != null && { stateDelta }),\n };\n }\n\n if (body.type !== undefined && body.type !== \"message\") {\n throw invalidField(\"type\", '\"message\", \"tool-result\", or omitted');\n }\n\n const text = body.message;\n if (text !== undefined && typeof text !== \"string\") {\n throw invalidField(\"message\", \"a string\");\n }\n\n const parts = body.parts;\n if (\n parts !== undefined &&\n (!Array.isArray(parts) || !parts.every(isRecord))\n ) {\n throw invalidField(\"parts\", \"an array of objects\");\n }\n parts?.forEach(validatePart);\n if (!(\"message\" in body) && !(\"parts\" in body)) {\n throw new Error(\n 'Invalid Google ADK proxy request: expected a \"message\" string or a \"parts\" array.',\n );\n }\n\n return {\n type: \"message\",\n text: text ?? \"\",\n ...(parts !== undefined && { parts }),\n config,\n ...(stateDelta != null && { stateDelta }),\n };\n};\n\n/**\n * Converts a parsed ADK request into a Google GenAI Content object\n * suitable for `Runner.runAsync({ newMessage })`.\n *\n * @example\n * ```ts\n * const parsed = await parseAdkRequest(req);\n * const newMessage = toAdkContent(parsed);\n * const events = runner.runAsync({ userId, sessionId, newMessage, stateDelta: parsed.stateDelta });\n * return adkEventStream(events);\n * ```\n */\nexport const toAdkContent = (\n parsed: ParsedAdkRequest,\n): { role: string; parts: Array<Record<string, unknown>> } => {\n if (parsed.type === \"tool-result\") {\n return {\n role: \"user\",\n parts: [\n {\n functionResponse: {\n name: parsed.toolName,\n id: parsed.toolCallId,\n response: parsed.result,\n },\n },\n ],\n };\n }\n\n // If raw parts are provided (multimodal), use them directly\n if (parsed.parts?.length) {\n return { role: \"user\", parts: parsed.parts };\n }\n\n return { role: \"user\", parts: [{ text: parsed.text }] };\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"parseAdkRequest.js","names":[],"sources":["../../src/server/parseAdkRequest.ts"],"sourcesContent":["import { isRecord } from \"@assistant-ui/core/internal\";\nimport type { AdkSendMessageConfig } from \"../types\";\nimport { toAdkFunctionResponse } from \"../toAdkFunctionResponse\";\n\ntype ParsedAdkRequest =\n | {\n type: \"message\";\n text: string;\n parts?: Array<Record<string, unknown>> | undefined;\n config: AdkSendMessageConfig;\n stateDelta?: Record<string, unknown> | undefined;\n }\n | {\n type: \"tool-result\";\n toolCallId: string;\n toolName: string;\n result: unknown;\n isError: boolean;\n config: AdkSendMessageConfig;\n stateDelta?: Record<string, unknown> | undefined;\n };\n\nconst invalidField = (field: string, expectation: string): Error =>\n new Error(\n `Invalid Google ADK proxy request field \"${field}\": expected ${expectation}.`,\n );\n\nconst readString = (body: Record<string, unknown>, field: string): string => {\n const value = body[field];\n if (typeof value !== \"string\") throw invalidField(field, \"a string\");\n return value;\n};\n\nconst readOptionalString = (\n body: Record<string, unknown>,\n field: string,\n): string | undefined => {\n const value = body[field];\n if (value === undefined) return undefined;\n if (typeof value !== \"string\") throw invalidField(field, \"a string\");\n return value;\n};\n\nconst validateOptionalPartString = (\n part: Record<string, unknown>,\n key: string,\n field: string,\n) => {\n if (part[key] !== undefined && typeof part[key] !== \"string\") {\n throw invalidField(field, \"a string\");\n }\n};\n\n// Nested fields are validated only when present: ADK serializes with\n// exclude_none semantics and the Part vocabulary grows upstream, so absent\n// fields and unknown part kinds pass through to the runner untouched.\nconst validatePart = (part: Record<string, unknown>, index: number) => {\n const field = (name: string) => `parts[${index}].${name}`;\n if (Object.keys(part).length === 0) {\n throw invalidField(`parts[${index}]`, \"a non-empty part object\");\n }\n if (part.thought !== undefined && typeof part.thought !== \"boolean\") {\n throw invalidField(field(\"thought\"), \"a boolean\");\n }\n if (part.text !== undefined && typeof part.text !== \"string\") {\n throw invalidField(field(\"text\"), \"a string\");\n }\n\n const validateRecordField = (\n key: string,\n validateContent: (content: Record<string, unknown>) => void,\n ) => {\n const value = part[key];\n if (value === undefined) return;\n if (!isRecord(value)) throw invalidField(field(key), \"an object\");\n validateContent(value);\n };\n\n validateRecordField(\"functionCall\", (content) => {\n validateOptionalPartString(content, \"name\", field(\"functionCall.name\"));\n validateOptionalPartString(content, \"id\", field(\"functionCall.id\"));\n if (content.args !== undefined && !isRecord(content.args)) {\n throw invalidField(field(\"functionCall.args\"), \"an object\");\n }\n });\n validateRecordField(\"functionResponse\", (content) => {\n validateOptionalPartString(content, \"name\", field(\"functionResponse.name\"));\n validateOptionalPartString(content, \"id\", field(\"functionResponse.id\"));\n });\n validateRecordField(\"executableCode\", (content) => {\n validateOptionalPartString(content, \"code\", field(\"executableCode.code\"));\n validateOptionalPartString(\n content,\n \"language\",\n field(\"executableCode.language\"),\n );\n });\n validateRecordField(\"codeExecutionResult\", (content) => {\n validateOptionalPartString(\n content,\n \"output\",\n field(\"codeExecutionResult.output\"),\n );\n validateOptionalPartString(\n content,\n \"outcome\",\n field(\"codeExecutionResult.outcome\"),\n );\n });\n validateRecordField(\"inlineData\", (content) => {\n validateOptionalPartString(\n content,\n \"mimeType\",\n field(\"inlineData.mimeType\"),\n );\n validateOptionalPartString(content, \"data\", field(\"inlineData.data\"));\n });\n validateRecordField(\"fileData\", (content) => {\n validateOptionalPartString(content, \"fileUri\", field(\"fileData.fileUri\"));\n validateOptionalPartString(content, \"mimeType\", field(\"fileData.mimeType\"));\n });\n};\n\n/**\n * Parses an incoming HTTP request into a structured ADK request.\n *\n * Supports two request shapes:\n *\n * 1. User message:\n * ```json\n * { \"message\": \"Hello\", \"runConfig\": {}, \"stateDelta\": {} }\n * ```\n *\n * 2. Tool result:\n * ```json\n * {\n * \"type\": \"tool-result\",\n * \"toolCallId\": \"call_123\",\n * \"toolName\": \"search\",\n * \"result\": { ... },\n * \"isError\": false\n * }\n * ```\n */\nexport const parseAdkRequest = async (\n request: Request,\n): Promise<ParsedAdkRequest> => {\n let body: unknown;\n try {\n body = await request.json();\n } catch {\n throw new Error(\n 'Invalid JSON in Google ADK proxy request body. Expected a JSON object like {\"message\":\"Hello\"} or {\"type\":\"tool-result\",...}.',\n );\n }\n\n if (!isRecord(body)) {\n throw new Error(\"Google ADK proxy request body must be a JSON object\");\n }\n\n const config: AdkSendMessageConfig = {};\n if (body.runConfig !== undefined) config.runConfig = body.runConfig;\n const checkpointId = readOptionalString(body, \"checkpointId\");\n if (checkpointId !== undefined) config.checkpointId = checkpointId;\n\n const stateDelta = body.stateDelta;\n if (stateDelta !== undefined && !isRecord(stateDelta)) {\n throw invalidField(\"stateDelta\", \"an object\");\n }\n\n if (body.type === \"tool-result\") {\n if (!(\"result\" in body)) {\n throw invalidField(\"result\", \"a value\");\n }\n if (body.isError !== undefined && typeof body.isError !== \"boolean\") {\n throw invalidField(\"isError\", \"a boolean\");\n }\n return {\n type: \"tool-result\",\n toolCallId: readString(body, \"toolCallId\"),\n toolName: readString(body, \"toolName\"),\n result: body.result,\n isError: body.isError ?? false,\n config,\n ...(stateDelta != null && { stateDelta }),\n };\n }\n\n if (body.type !== undefined && body.type !== \"message\") {\n throw invalidField(\"type\", '\"message\", \"tool-result\", or omitted');\n }\n\n const text = body.message;\n if (text !== undefined && typeof text !== \"string\") {\n throw invalidField(\"message\", \"a string\");\n }\n\n const parts = body.parts;\n if (\n parts !== undefined &&\n (!Array.isArray(parts) || !parts.every(isRecord))\n ) {\n throw invalidField(\"parts\", \"an array of objects\");\n }\n parts?.forEach(validatePart);\n if (!(\"message\" in body) && !(\"parts\" in body)) {\n throw new Error(\n 'Invalid Google ADK proxy request: expected a \"message\" string or a \"parts\" array.',\n );\n }\n\n return {\n type: \"message\",\n text: text ?? \"\",\n ...(parts !== undefined && { parts }),\n config,\n ...(stateDelta != null && { stateDelta }),\n };\n};\n\n/**\n * Converts a parsed ADK request into a Google GenAI Content object\n * suitable for `Runner.runAsync({ newMessage })`.\n *\n * @example\n * ```ts\n * const parsed = await parseAdkRequest(req);\n * const newMessage = toAdkContent(parsed);\n * const events = runner.runAsync({ userId, sessionId, newMessage, stateDelta: parsed.stateDelta });\n * return adkEventStream(events);\n * ```\n */\nexport const toAdkContent = (\n parsed: ParsedAdkRequest,\n): { role: string; parts: Array<Record<string, unknown>> } => {\n if (parsed.type === \"tool-result\") {\n return {\n role: \"user\",\n parts: [\n {\n functionResponse: {\n name: parsed.toolName,\n id: parsed.toolCallId,\n response: toAdkFunctionResponse(parsed.result, parsed.isError),\n },\n },\n ],\n };\n }\n\n // If raw parts are provided (multimodal), use them directly\n if (parsed.parts?.length) {\n return { role: \"user\", parts: parsed.parts };\n }\n\n return { role: \"user\", parts: [{ text: parsed.text }] };\n};\n"],"mappings":"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"}
|
|
@@ -4,7 +4,6 @@ import { AdkEvent, AdkStructuredEvent } from "./types.js";
|
|
|
4
4
|
* Converts a raw `AdkEvent` into an array of structured, typed events.
|
|
5
5
|
* Useful for building custom event renderers.
|
|
6
6
|
*/
|
|
7
|
-
declare function toAdkStructuredEvents(event: AdkEvent): AdkStructuredEvent[];
|
|
7
|
+
export declare function toAdkStructuredEvents(event: AdkEvent): AdkStructuredEvent[];
|
|
8
8
|
//#endregion
|
|
9
|
-
export { toAdkStructuredEvents };
|
|
10
9
|
//# sourceMappingURL=structuredEvents.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"structuredEvents.d.ts","names":[],"sources":["../src/structuredEvents.ts"],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"structuredEvents.d.ts","names":[],"sources":["../src/structuredEvents.ts"],"mappings":";;;;;;wBAOgB,sBAAsB,OAAO,WAAW"}
|
package/dist/structuredEvents.js
CHANGED
|
@@ -29,7 +29,7 @@ function toAdkStructuredEvents(event) {
|
|
|
29
29
|
type: "tool_call",
|
|
30
30
|
call: {
|
|
31
31
|
name: part.functionCall.name,
|
|
32
|
-
args: part.functionCall.args
|
|
32
|
+
args: part.functionCall.args ?? {}
|
|
33
33
|
}
|
|
34
34
|
};
|
|
35
35
|
if (part.functionCall.id != null) call.call.id = part.functionCall.id;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"structuredEvents.js","names":[],"sources":["../src/structuredEvents.ts"],"sourcesContent":["import type { AdkEvent, AdkStructuredEvent } from \"./types\";\nimport { isFinalResponse } from \"./AdkEventAccumulator\";\n\n/**\n * Converts a raw `AdkEvent` into an array of structured, typed events.\n * Useful for building custom event renderers.\n */\nexport function toAdkStructuredEvents(event: AdkEvent): AdkStructuredEvent[] {\n const result: AdkStructuredEvent[] = [];\n\n if (event.errorCode || event.errorMessage) {\n const err: AdkStructuredEvent & { type: \"error\" } = { type: \"error\" };\n if (event.errorCode != null) err.errorCode = event.errorCode;\n if (event.errorMessage != null) err.errorMessage = event.errorMessage;\n result.push(err);\n }\n\n const parts = event.content?.parts;\n if (parts) {\n for (const part of parts) {\n if (part.text != null) {\n if (part.thought) {\n result.push({ type: \"thought\", content: part.text });\n } else {\n result.push({ type: \"content\", content: part.text });\n }\n }\n if (part.functionCall) {\n const call: AdkStructuredEvent & { type: \"tool_call\" } = {\n type: \"tool_call\",\n call: {
|
|
1
|
+
{"version":3,"file":"structuredEvents.js","names":[],"sources":["../src/structuredEvents.ts"],"sourcesContent":["import type { AdkEvent, AdkStructuredEvent } from \"./types\";\nimport { isFinalResponse } from \"./AdkEventAccumulator\";\n\n/**\n * Converts a raw `AdkEvent` into an array of structured, typed events.\n * Useful for building custom event renderers.\n */\nexport function toAdkStructuredEvents(event: AdkEvent): AdkStructuredEvent[] {\n const result: AdkStructuredEvent[] = [];\n\n if (event.errorCode || event.errorMessage) {\n const err: AdkStructuredEvent & { type: \"error\" } = { type: \"error\" };\n if (event.errorCode != null) err.errorCode = event.errorCode;\n if (event.errorMessage != null) err.errorMessage = event.errorMessage;\n result.push(err);\n }\n\n const parts = event.content?.parts;\n if (parts) {\n for (const part of parts) {\n if (part.text != null) {\n if (part.thought) {\n result.push({ type: \"thought\", content: part.text });\n } else {\n result.push({ type: \"content\", content: part.text });\n }\n }\n if (part.functionCall) {\n const call: AdkStructuredEvent & { type: \"tool_call\" } = {\n type: \"tool_call\",\n call: {\n name: part.functionCall.name,\n args: part.functionCall.args ?? {},\n },\n };\n if (part.functionCall.id != null) call.call.id = part.functionCall.id;\n result.push(call);\n }\n if (part.functionResponse) {\n const tr: AdkStructuredEvent & { type: \"tool_result\" } = {\n type: \"tool_result\",\n result: {\n name: part.functionResponse.name,\n response: part.functionResponse.response,\n },\n };\n if (part.functionResponse.id != null)\n tr.result.id = part.functionResponse.id;\n result.push(tr);\n }\n if (part.executableCode) {\n const ce: AdkStructuredEvent & { type: \"call_code\" } = {\n type: \"call_code\",\n code: { code: part.executableCode.code },\n };\n if (part.executableCode.language != null)\n ce.code.language = part.executableCode.language;\n result.push(ce);\n }\n if (part.codeExecutionResult) {\n const cr: AdkStructuredEvent & { type: \"code_result\" } = {\n type: \"code_result\",\n result: { output: part.codeExecutionResult.output },\n };\n if (part.codeExecutionResult.outcome != null)\n cr.result.outcome = part.codeExecutionResult.outcome;\n result.push(cr);\n }\n }\n }\n\n if (event.actions?.requestedToolConfirmations) {\n result.push({\n type: \"tool_confirmation\",\n confirmations: event.actions.requestedToolConfirmations,\n });\n }\n\n if (isFinalResponse(event) && result.length === 0) {\n result.push({ type: \"finished\" });\n }\n\n return result;\n}\n"],"mappings":";;;;;;AAOA,SAAgB,sBAAsB,OAAuC;CAC3E,MAAM,SAA+B,CAAC;CAEtC,IAAI,MAAM,aAAa,MAAM,cAAc;EACzC,MAAM,MAA8C,EAAE,MAAM,QAAQ;EACpE,IAAI,MAAM,aAAa,MAAM,IAAI,YAAY,MAAM;EACnD,IAAI,MAAM,gBAAgB,MAAM,IAAI,eAAe,MAAM;EACzD,OAAO,KAAK,GAAG;CACjB;CAEA,MAAM,QAAQ,MAAM,SAAS;CAC7B,IAAI,OACF,KAAK,MAAM,QAAQ,OAAO;EACxB,IAAI,KAAK,QAAQ,MAAM;GACrB,IAAI,KAAK,SACP,OAAO,KAAK;IAAE,MAAM;IAAW,SAAS,KAAK;GAAK,CAAC;QAEnD,OAAO,KAAK;IAAE,MAAM;IAAW,SAAS,KAAK;GAAK,CAAC;EAEvD;EACA,IAAI,KAAK,cAAc;GACrB,MAAM,OAAmD;IACvD,MAAM;IACN,MAAM;KACJ,MAAM,KAAK,aAAa;KACxB,MAAM,KAAK,aAAa,QAAQ,CAAC;IACnC;GACF;GACA,IAAI,KAAK,aAAa,MAAM,MAAM,KAAK,KAAK,KAAK,KAAK,aAAa;GACnE,OAAO,KAAK,IAAI;EAClB;EACA,IAAI,KAAK,kBAAkB;GACzB,MAAM,KAAmD;IACvD,MAAM;IACN,QAAQ;KACN,MAAM,KAAK,iBAAiB;KAC5B,UAAU,KAAK,iBAAiB;IAClC;GACF;GACA,IAAI,KAAK,iBAAiB,MAAM,MAC9B,GAAG,OAAO,KAAK,KAAK,iBAAiB;GACvC,OAAO,KAAK,EAAE;EAChB;EACA,IAAI,KAAK,gBAAgB;GACvB,MAAM,KAAiD;IACrD,MAAM;IACN,MAAM,EAAE,MAAM,KAAK,eAAe,KAAK;GACzC;GACA,IAAI,KAAK,eAAe,YAAY,MAClC,GAAG,KAAK,WAAW,KAAK,eAAe;GACzC,OAAO,KAAK,EAAE;EAChB;EACA,IAAI,KAAK,qBAAqB;GAC5B,MAAM,KAAmD;IACvD,MAAM;IACN,QAAQ,EAAE,QAAQ,KAAK,oBAAoB,OAAO;GACpD;GACA,IAAI,KAAK,oBAAoB,WAAW,MACtC,GAAG,OAAO,UAAU,KAAK,oBAAoB;GAC/C,OAAO,KAAK,EAAE;EAChB;CACF;CAGF,IAAI,MAAM,SAAS,4BACjB,OAAO,KAAK;EACV,MAAM;EACN,eAAe,MAAM,QAAQ;CAC/B,CAAC;CAGH,IAAI,gBAAgB,KAAK,KAAK,OAAO,WAAW,GAC9C,OAAO,KAAK,EAAE,MAAM,WAAW,CAAC;CAGlC,OAAO;AACT"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
//#region src/toAdkFunctionResponse.d.ts
|
|
2
|
+
export declare const isAdkFunctionError: (response: unknown) => boolean;
|
|
3
|
+
export declare const toAdkFunctionResponse: (result: unknown, isError?: boolean) => Record<string, unknown>;
|
|
4
|
+
//#endregion
|
|
5
|
+
//# sourceMappingURL=toAdkFunctionResponse.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toAdkFunctionResponse.d.ts","names":[],"sources":["../src/toAdkFunctionResponse.ts"],"mappings":";qBAEa,qBAAsB;qBAKtB,wBACX,iBACA,sBACC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { isRecord } from "@assistant-ui/core/internal";
|
|
2
|
+
//#region src/toAdkFunctionResponse.ts
|
|
3
|
+
const isAdkFunctionError = (response) => isRecord(response) && Object.hasOwn(response, "error") && response.error !== void 0;
|
|
4
|
+
const toAdkFunctionResponse = (result, isError = false) => {
|
|
5
|
+
if (isError && !isAdkFunctionError(result)) return { error: result ?? null };
|
|
6
|
+
return Array.isArray(result) ? { results: result } : isRecord(result) ? result : { result };
|
|
7
|
+
};
|
|
8
|
+
//#endregion
|
|
9
|
+
export { isAdkFunctionError, toAdkFunctionResponse };
|
|
10
|
+
|
|
11
|
+
//# sourceMappingURL=toAdkFunctionResponse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toAdkFunctionResponse.js","names":[],"sources":["../src/toAdkFunctionResponse.ts"],"sourcesContent":["import { isRecord } from \"@assistant-ui/core/internal\";\n\nexport const isAdkFunctionError = (response: unknown): boolean =>\n isRecord(response) &&\n Object.hasOwn(response, \"error\") &&\n response.error !== undefined;\n\nexport const toAdkFunctionResponse = (\n result: unknown,\n isError = false,\n): Record<string, unknown> => {\n if (isError && !isAdkFunctionError(result)) return { error: result ?? null };\n return Array.isArray(result)\n ? { results: result }\n : isRecord(result)\n ? result\n : { result };\n};\n"],"mappings":";;AAEA,MAAa,sBAAsB,aACjC,SAAS,QAAQ,KACjB,OAAO,OAAO,UAAU,OAAO,KAC/B,SAAS,UAAU,KAAA;AAErB,MAAa,yBACX,QACA,UAAU,UACkB;CAC5B,IAAI,WAAW,CAAC,mBAAmB,MAAM,GAAG,OAAO,EAAE,OAAO,UAAU,KAAK;CAC3E,OAAO,MAAM,QAAQ,MAAM,IACvB,EAAE,SAAS,OAAO,IAClB,SAAS,MAAM,IACb,SACA,EAAE,OAAO;AACjB"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
//#region src/trimTrailingSlashes.d.ts
|
|
2
|
-
declare const trimTrailingSlashes: (value: string) => string;
|
|
2
|
+
export declare const trimTrailingSlashes: (value: string) => string;
|
|
3
3
|
//#endregion
|
|
4
|
-
export { trimTrailingSlashes };
|
|
5
4
|
//# sourceMappingURL=trimTrailingSlashes.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trimTrailingSlashes.d.ts","names":[],"sources":["../src/trimTrailingSlashes.ts"],"mappings":";
|
|
1
|
+
{"version":3,"file":"trimTrailingSlashes.d.ts","names":[],"sources":["../src/trimTrailingSlashes.ts"],"mappings":";qBAAa,sBAAuB"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { ReadonlyJSONObject } from "assistant-stream/utils";
|
|
2
2
|
import { MessageStatus } from "@assistant-ui/core";
|
|
3
3
|
//#region src/types.d.ts
|
|
4
|
-
type AdkEventPart = {
|
|
4
|
+
export type AdkEventPart = {
|
|
5
5
|
text?: string;
|
|
6
6
|
thought?: boolean;
|
|
7
7
|
functionCall?: {
|
|
8
8
|
name: string;
|
|
9
9
|
id?: string;
|
|
10
|
-
args
|
|
10
|
+
args?: Record<string, unknown>;
|
|
11
11
|
};
|
|
12
12
|
functionResponse?: {
|
|
13
13
|
name: string;
|
|
@@ -31,7 +31,7 @@ type AdkEventPart = {
|
|
|
31
31
|
mimeType?: string;
|
|
32
32
|
};
|
|
33
33
|
};
|
|
34
|
-
type AdkEventActions = {
|
|
34
|
+
export type AdkEventActions = {
|
|
35
35
|
stateDelta?: Record<string, unknown> | undefined;
|
|
36
36
|
artifactDelta?: Record<string, number> | undefined;
|
|
37
37
|
transferToAgent?: string | undefined;
|
|
@@ -40,7 +40,7 @@ type AdkEventActions = {
|
|
|
40
40
|
requestedAuthConfigs?: Record<string, unknown> | undefined;
|
|
41
41
|
requestedToolConfirmations?: Record<string, unknown> | undefined;
|
|
42
42
|
};
|
|
43
|
-
type AdkEvent = {
|
|
43
|
+
export type AdkEvent = {
|
|
44
44
|
id: string;
|
|
45
45
|
invocationId?: string | undefined;
|
|
46
46
|
author?: string | undefined;
|
|
@@ -63,13 +63,13 @@ type AdkEvent = {
|
|
|
63
63
|
usageMetadata?: unknown;
|
|
64
64
|
customMetadata?: Record<string, unknown> | undefined;
|
|
65
65
|
};
|
|
66
|
-
type AdkToolCall = {
|
|
66
|
+
export type AdkToolCall = {
|
|
67
67
|
id: string;
|
|
68
68
|
name: string;
|
|
69
69
|
args: ReadonlyJSONObject;
|
|
70
70
|
argsText?: string;
|
|
71
71
|
};
|
|
72
|
-
type AdkMessage = {
|
|
72
|
+
export type AdkMessage = {
|
|
73
73
|
id: string;
|
|
74
74
|
type: "human";
|
|
75
75
|
content: string | AdkMessageContentPart[];
|
|
@@ -90,7 +90,7 @@ type AdkMessage = {
|
|
|
90
90
|
status?: "success" | "error" | undefined;
|
|
91
91
|
artifact?: unknown;
|
|
92
92
|
};
|
|
93
|
-
type AdkMessageContentPart = {
|
|
93
|
+
export type AdkMessageContentPart = {
|
|
94
94
|
type: "text";
|
|
95
95
|
text: string;
|
|
96
96
|
} | {
|
|
@@ -124,7 +124,7 @@ type AdkMessageContentPart = {
|
|
|
124
124
|
type: "activity";
|
|
125
125
|
message: string;
|
|
126
126
|
};
|
|
127
|
-
type AdkToolConfirmation = {
|
|
127
|
+
export type AdkToolConfirmation = {
|
|
128
128
|
toolCallId: string;
|
|
129
129
|
toolName: string;
|
|
130
130
|
args: Record<string, unknown>;
|
|
@@ -132,8 +132,8 @@ type AdkToolConfirmation = {
|
|
|
132
132
|
confirmed: boolean;
|
|
133
133
|
payload?: unknown;
|
|
134
134
|
};
|
|
135
|
-
type AdkAuthCredentialType = "apiKey" | "http" | "oauth2" | "openIdConnect" | "serviceAccount";
|
|
136
|
-
type AdkAuthCredential = {
|
|
135
|
+
export type AdkAuthCredentialType = "apiKey" | "http" | "oauth2" | "openIdConnect" | "serviceAccount";
|
|
136
|
+
export type AdkAuthCredential = {
|
|
137
137
|
authType: AdkAuthCredentialType;
|
|
138
138
|
resourceRef?: string | undefined;
|
|
139
139
|
apiKey?: string | undefined;
|
|
@@ -160,16 +160,16 @@ type AdkAuthCredential = {
|
|
|
160
160
|
} | undefined;
|
|
161
161
|
serviceAccount?: unknown;
|
|
162
162
|
};
|
|
163
|
-
type AdkAuthRequest = {
|
|
163
|
+
export type AdkAuthRequest = {
|
|
164
164
|
toolCallId: string;
|
|
165
165
|
authConfig: unknown;
|
|
166
166
|
};
|
|
167
|
-
type AdkMessageMetadata = {
|
|
167
|
+
export type AdkMessageMetadata = {
|
|
168
168
|
groundingMetadata?: unknown;
|
|
169
169
|
citationMetadata?: unknown;
|
|
170
170
|
usageMetadata?: unknown;
|
|
171
171
|
};
|
|
172
|
-
type AdkRunConfig = {
|
|
172
|
+
export type AdkRunConfig = {
|
|
173
173
|
streamingMode?: "none" | "sse" | "bidi" | undefined;
|
|
174
174
|
pauseOnToolCalls?: boolean | undefined;
|
|
175
175
|
maxLlmCalls?: number | undefined;
|
|
@@ -183,7 +183,7 @@ type AdkRunConfig = {
|
|
|
183
183
|
proactivity?: unknown;
|
|
184
184
|
realtimeInputConfig?: unknown;
|
|
185
185
|
};
|
|
186
|
-
type AdkSendMessageConfig = {
|
|
186
|
+
export type AdkSendMessageConfig = {
|
|
187
187
|
/**
|
|
188
188
|
* ADK RunConfig. Typed as `unknown` for compatibility with
|
|
189
189
|
* assistant-ui core's RunConfig type. Use `AdkRunConfig` when
|
|
@@ -193,7 +193,7 @@ type AdkSendMessageConfig = {
|
|
|
193
193
|
checkpointId?: string | undefined;
|
|
194
194
|
stateDelta?: Record<string, unknown> | undefined;
|
|
195
195
|
};
|
|
196
|
-
declare const AdkEventType: {
|
|
196
|
+
export declare const AdkEventType: {
|
|
197
197
|
readonly THOUGHT: "thought";
|
|
198
198
|
readonly CONTENT: "content";
|
|
199
199
|
readonly TOOL_CALL: "tool_call";
|
|
@@ -205,7 +205,7 @@ declare const AdkEventType: {
|
|
|
205
205
|
readonly TOOL_CONFIRMATION: "tool_confirmation";
|
|
206
206
|
readonly FINISHED: "finished";
|
|
207
207
|
};
|
|
208
|
-
type AdkStructuredEvent = {
|
|
208
|
+
export type AdkStructuredEvent = {
|
|
209
209
|
type: "thought";
|
|
210
210
|
content: string;
|
|
211
211
|
} | {
|
|
@@ -250,18 +250,18 @@ type AdkStructuredEvent = {
|
|
|
250
250
|
} | {
|
|
251
251
|
type: "finished";
|
|
252
252
|
};
|
|
253
|
-
type AdkStreamCallback = (messages: AdkMessage[], config: AdkSendMessageConfig & {
|
|
253
|
+
export type AdkStreamCallback = (messages: AdkMessage[], config: AdkSendMessageConfig & {
|
|
254
254
|
abortSignal: AbortSignal;
|
|
255
255
|
initialize: () => Promise<{
|
|
256
256
|
remoteId: string;
|
|
257
257
|
externalId: string | undefined;
|
|
258
258
|
}>;
|
|
259
259
|
}) => Promise<AsyncGenerator<AdkEvent>> | AsyncGenerator<AdkEvent>;
|
|
260
|
-
type OnAdkErrorCallback = (error: unknown) => void | Promise<void>;
|
|
261
|
-
type OnAdkCustomEventCallback = (type: string, data: unknown) => void | Promise<void>;
|
|
262
|
-
type OnAdkAgentTransferCallback = (toAgent: string) => void | Promise<void>;
|
|
260
|
+
export type OnAdkErrorCallback = (error: unknown) => void | Promise<void>;
|
|
261
|
+
export type OnAdkCustomEventCallback = (type: string, data: unknown) => void | Promise<void>;
|
|
262
|
+
export type OnAdkAgentTransferCallback = (toAgent: string) => void | Promise<void>;
|
|
263
263
|
/** Private state and actions `useAdkRuntime` exposes through `thread.extras`. */
|
|
264
|
-
type AdkRuntimeExtras = {
|
|
264
|
+
export type AdkRuntimeExtras = {
|
|
265
265
|
send: (messages: AdkMessage[], config: AdkSendMessageConfig) => Promise<void>;
|
|
266
266
|
agentInfo: {
|
|
267
267
|
name?: string | undefined;
|
|
@@ -282,7 +282,7 @@ type AdkRuntimeExtras = {
|
|
|
282
282
|
* clears it, since a snapshot that cannot describe the state is not evidence
|
|
283
283
|
* that the state survived.
|
|
284
284
|
*/
|
|
285
|
-
type AdkThreadSnapshot = {
|
|
285
|
+
export type AdkThreadSnapshot = {
|
|
286
286
|
messages: AdkMessage[];
|
|
287
287
|
longRunningToolIds?: string[] | undefined;
|
|
288
288
|
toolConfirmations?: AdkToolConfirmation[] | undefined;
|
|
@@ -297,5 +297,4 @@ type AdkThreadSnapshot = {
|
|
|
297
297
|
} | undefined;
|
|
298
298
|
};
|
|
299
299
|
//#endregion
|
|
300
|
-
export { AdkAuthCredential, AdkAuthCredentialType, AdkAuthRequest, AdkEvent, AdkEventActions, AdkEventPart, AdkEventType, AdkMessage, AdkMessageContentPart, AdkMessageMetadata, AdkRunConfig, AdkRuntimeExtras, AdkSendMessageConfig, AdkStreamCallback, AdkStructuredEvent, AdkThreadSnapshot, AdkToolCall, AdkToolConfirmation, OnAdkAgentTransferCallback, OnAdkCustomEventCallback, OnAdkErrorCallback };
|
|
301
300
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","names":[],"sources":["../src/types.ts"],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"types.d.ts","names":[],"sources":["../src/types.ts"],"mappings":";;;YAKY;EACV;EACA;EACA;IACE;IACA;IACA,OAAO;;EAET;IACE;IACA;IACA;;EAEF;IACE;IACA;;EAEF;IACE;IACA;;EAEF;IACE;IACA;;EAEF;IACE;IACA;;;YAIQ;EACV,aAAa;EACb,gBAAgB;EAChB;EACA;EACA;EACA,uBAAuB;EACvB,6BAA6B;;YAGnB;EACV;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;IAEM;IACA,QAAQ;;EAGd,UAAU;EACV;EACA;EACA;EACA;EACA;EACA;EACA,iBAAiB;;YAKP;EACV;EACA;EACA,MAAM;EACN;;YAGU;EAEN;EACA;EACA,kBAAkB;;EAGlB;EACA;EACA,kBAAkB;EAClB,aAAa;EACb;EACA;EACA,SAAS;;EAGT;EACA;EACA;EACA;EACA;EACA;EACA;;YAGM;EACN;EAAc;;EACd;EAAmB;;EACnB;EAAe;EAAkB;;EACjC;EAAmB;;EAEnB;EACA;EACA;EACA;;EAGA;EACA;EACA;;EAEA;EAAc;EAAc;;EAC5B;EAAqB;EAAgB;;EACrC;EAAkB;;YAIZ;EACV;EACA;EACA,MAAM;EACN;EACA;EACA;;YAGU;YAOA;EACV,UAAU;EACV;EACA;EACA;IAEM;IACA;MACE;MACA;MACA;;;EAIR;IAEM;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAGN;;YAGU;EACV;EACA;;YAGU;EACV;EACA;EACA;;YAKU;EACV;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;YAKU;;;;;;EAMV;EACA;EACA,aAAa;;qBAKF;;;;;;;;;;;;YAaD;EACN;EAAiB;;EACjB;EAAiB;;EAEjB;EACA;IAAQ;IAAc;IAAa,MAAM;;;EAGzC;EACA;IAAU;IAAc;IAAa;;;EAErC;EAAmB;IAAQ;IAAc;;;EACzC;EAAqB;IAAU;IAAgB;;;EAC/C;EAAe;EAAoB;;EACnC;EAAkB;;EAElB;EACA,eAAe;;EAEf;;YAEM,qBACV,UAAU,cACV,QAAQ;EACN,aAAa;EACb,kBAAkB;IAChB;IACA;;MAGD,QAAQ,eAAe,aAAa,eAAe;YAI5C,sBAAsB,0BAA0B;YAEhD,4BACV,cACA,yBACU;YAEA,8BACV,2BACU;;YAGA;EACV,OAAO,UAAU,cAAc,QAAQ,yBAAyB;EAChE;IAAa;IAA2B;;EACxC,YAAY;EACZ,eAAe;EACf;EACA,mBAAmB;EACnB,cAAc;EACd;EACA,iBAAiB,YAAY;;;;;;;;;YAUnB;EACV,UAAU;EACV;EACA,oBAAoB;EACpB,eAAe;EACf;EACA,kBAAkB,YAAY;EAC9B,aAAa;EACb,gBAAgB;EAChB;IACM;IAA2B"}
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","names":[],"sources":["../src/types.ts"],"sourcesContent":["import type { MessageStatus } from \"@assistant-ui/core\";\nimport type { ReadonlyJSONObject } from \"assistant-stream/utils\";\n\n// ── ADK Event wire types (lightweight, no @google/adk dependency) ──\n\nexport type AdkEventPart = {\n text?: string;\n thought?: boolean;\n functionCall?: {\n name: string;\n id?: string;\n args
|
|
1
|
+
{"version":3,"file":"types.js","names":[],"sources":["../src/types.ts"],"sourcesContent":["import type { MessageStatus } from \"@assistant-ui/core\";\nimport type { ReadonlyJSONObject } from \"assistant-stream/utils\";\n\n// ── ADK Event wire types (lightweight, no @google/adk dependency) ──\n\nexport type AdkEventPart = {\n text?: string;\n thought?: boolean;\n functionCall?: {\n name: string;\n id?: string;\n args?: Record<string, unknown>;\n };\n functionResponse?: {\n name: string;\n id?: string;\n response: unknown;\n };\n executableCode?: {\n code: string;\n language?: string;\n };\n codeExecutionResult?: {\n output: string;\n outcome?: string;\n };\n inlineData?: {\n mimeType: string;\n data: string;\n };\n fileData?: {\n fileUri: string;\n mimeType?: string;\n };\n};\n\nexport type AdkEventActions = {\n stateDelta?: Record<string, unknown> | undefined;\n artifactDelta?: Record<string, number> | undefined;\n transferToAgent?: string | undefined;\n escalate?: boolean | undefined;\n skipSummarization?: boolean | undefined;\n requestedAuthConfigs?: Record<string, unknown> | undefined;\n requestedToolConfirmations?: Record<string, unknown> | undefined;\n};\n\nexport type AdkEvent = {\n id: string;\n invocationId?: string | undefined;\n author?: string | undefined;\n branch?: string | undefined;\n partial?: boolean | undefined;\n turnComplete?: boolean | undefined;\n interrupted?: boolean | undefined;\n finishReason?: string | undefined;\n timestamp?: number | undefined;\n content?:\n | {\n role?: string | undefined;\n parts?: AdkEventPart[] | undefined;\n }\n | undefined;\n actions?: AdkEventActions | undefined;\n longRunningToolIds?: string[] | undefined;\n errorCode?: string | undefined;\n errorMessage?: string | undefined;\n groundingMetadata?: unknown;\n citationMetadata?: unknown;\n usageMetadata?: unknown;\n customMetadata?: Record<string, unknown> | undefined;\n};\n\n// ── ADK Message types (accumulated from events) ──\n\nexport type AdkToolCall = {\n id: string;\n name: string;\n args: ReadonlyJSONObject;\n argsText?: string;\n};\n\nexport type AdkMessage =\n | {\n id: string;\n type: \"human\";\n content: string | AdkMessageContentPart[];\n }\n | {\n id: string;\n type: \"ai\";\n content: string | AdkMessageContentPart[];\n tool_calls?: AdkToolCall[] | undefined;\n author?: string | undefined;\n branch?: string | undefined;\n status?: MessageStatus | undefined;\n }\n | {\n id: string;\n type: \"tool\";\n content: string;\n tool_call_id: string;\n name: string;\n status?: \"success\" | \"error\" | undefined;\n artifact?: unknown;\n };\n\nexport type AdkMessageContentPart =\n | { type: \"text\"; text: string }\n | { type: \"reasoning\"; text: string }\n | { type: \"image\"; mimeType: string; data: string }\n | { type: \"image_url\"; url: string }\n | {\n type: \"file\";\n mimeType: string;\n data: string;\n filename?: string | undefined;\n }\n | {\n type: \"file_url\";\n url: string;\n mimeType?: string | undefined;\n }\n | { type: \"code\"; code: string; language: string }\n | { type: \"code_result\"; output: string; outcome: string }\n | { type: \"activity\"; message: string };\n\n// ── ADK-specific state types ──\n\nexport type AdkToolConfirmation = {\n toolCallId: string;\n toolName: string;\n args: Record<string, unknown>;\n hint: string;\n confirmed: boolean;\n payload?: unknown;\n};\n\nexport type AdkAuthCredentialType =\n | \"apiKey\"\n | \"http\"\n | \"oauth2\"\n | \"openIdConnect\"\n | \"serviceAccount\";\n\nexport type AdkAuthCredential = {\n authType: AdkAuthCredentialType;\n resourceRef?: string | undefined;\n apiKey?: string | undefined;\n http?:\n | {\n scheme: string;\n credentials: {\n username?: string;\n password?: string;\n token?: string;\n };\n }\n | undefined;\n oauth2?:\n | {\n clientId?: string;\n clientSecret?: string;\n authUri?: string;\n state?: string;\n redirectUri?: string;\n authResponseUri?: string;\n authCode?: string;\n accessToken?: string;\n refreshToken?: string;\n expiresAt?: number;\n expiresIn?: number;\n }\n | undefined;\n serviceAccount?: unknown;\n};\n\nexport type AdkAuthRequest = {\n toolCallId: string;\n authConfig: unknown;\n};\n\nexport type AdkMessageMetadata = {\n groundingMetadata?: unknown;\n citationMetadata?: unknown;\n usageMetadata?: unknown;\n};\n\n// ── RunConfig ──\n\nexport type AdkRunConfig = {\n streamingMode?: \"none\" | \"sse\" | \"bidi\" | undefined;\n pauseOnToolCalls?: boolean | undefined;\n maxLlmCalls?: number | undefined;\n saveInputBlobsAsArtifacts?: boolean | undefined;\n supportCfc?: boolean | undefined;\n speechConfig?: unknown;\n responseModalities?: string[] | undefined;\n outputAudioTranscription?: unknown;\n inputAudioTranscription?: unknown;\n enableAffectiveDialog?: boolean | undefined;\n proactivity?: unknown;\n realtimeInputConfig?: unknown;\n};\n\n// ── Stream callback types ──\n\nexport type AdkSendMessageConfig = {\n /**\n * ADK RunConfig. Typed as `unknown` for compatibility with\n * assistant-ui core's RunConfig type. Use `AdkRunConfig` when\n * constructing configs manually for type safety.\n */\n runConfig?: unknown;\n checkpointId?: string | undefined;\n stateDelta?: Record<string, unknown> | undefined;\n};\n\n// ── Structured events ──\n\nexport const AdkEventType = {\n THOUGHT: \"thought\",\n CONTENT: \"content\",\n TOOL_CALL: \"tool_call\",\n TOOL_RESULT: \"tool_result\",\n CALL_CODE: \"call_code\",\n CODE_RESULT: \"code_result\",\n ERROR: \"error\",\n ACTIVITY: \"activity\",\n TOOL_CONFIRMATION: \"tool_confirmation\",\n FINISHED: \"finished\",\n} as const;\n\nexport type AdkStructuredEvent =\n | { type: \"thought\"; content: string }\n | { type: \"content\"; content: string }\n | {\n type: \"tool_call\";\n call: { name: string; id?: string; args: Record<string, unknown> };\n }\n | {\n type: \"tool_result\";\n result: { name: string; id?: string; response: unknown };\n }\n | { type: \"call_code\"; code: { code: string; language?: string } }\n | { type: \"code_result\"; result: { output: string; outcome?: string } }\n | { type: \"error\"; errorCode?: string; errorMessage?: string }\n | { type: \"activity\"; message: string }\n | {\n type: \"tool_confirmation\";\n confirmations: Record<string, unknown>;\n }\n | { type: \"finished\" };\n\nexport type AdkStreamCallback = (\n messages: AdkMessage[],\n config: AdkSendMessageConfig & {\n abortSignal: AbortSignal;\n initialize: () => Promise<{\n remoteId: string;\n externalId: string | undefined;\n }>;\n },\n) => Promise<AsyncGenerator<AdkEvent>> | AsyncGenerator<AdkEvent>;\n\n// ── Event handler callbacks ──\n\nexport type OnAdkErrorCallback = (error: unknown) => void | Promise<void>;\n\nexport type OnAdkCustomEventCallback = (\n type: string,\n data: unknown,\n) => void | Promise<void>;\n\nexport type OnAdkAgentTransferCallback = (\n toAgent: string,\n) => void | Promise<void>;\n\n/** Private state and actions `useAdkRuntime` exposes through `thread.extras`. */\nexport type AdkRuntimeExtras = {\n send: (messages: AdkMessage[], config: AdkSendMessageConfig) => Promise<void>;\n agentInfo: { name?: string | undefined; branch?: string | undefined };\n stateDelta: Record<string, unknown>;\n artifactDelta: Record<string, number>;\n longRunningToolIds: string[];\n toolConfirmations: AdkToolConfirmation[];\n authRequests: AdkAuthRequest[];\n escalated: boolean;\n messageMetadata: Map<string, AdkMessageMetadata>;\n};\n\n/**\n * What a session load reconstructs. The messages are the whole thread; the\n * rest is the per-turn state the events imply, which a caller that replays\n * them through {@link AdkEventAccumulator} already has. Omitting a field\n * clears it, since a snapshot that cannot describe the state is not evidence\n * that the state survived.\n */\nexport type AdkThreadSnapshot = {\n messages: AdkMessage[];\n longRunningToolIds?: string[] | undefined;\n toolConfirmations?: AdkToolConfirmation[] | undefined;\n authRequests?: AdkAuthRequest[] | undefined;\n escalated?: boolean | undefined;\n messageMetadata?: Map<string, AdkMessageMetadata> | undefined;\n stateDelta?: Record<string, unknown> | undefined;\n artifactDelta?: Record<string, number> | undefined;\n agentInfo?:\n | { name?: string | undefined; branch?: string | undefined }\n | undefined;\n};\n"],"mappings":";AA2NA,MAAa,eAAe;CAC1B,SAAS;CACT,SAAS;CACT,WAAW;CACX,aAAa;CACb,WAAW;CACX,aAAa;CACb,OAAO;CACP,UAAU;CACV,mBAAmB;CACnB,UAAU;AACZ"}
|
package/dist/useAdkMessages.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { AdkAuthRequest, AdkMessage, AdkMessageMetadata, AdkSendMessageConfig, AdkStreamCallback, AdkThreadSnapshot, AdkToolConfirmation, OnAdkAgentTransferCallback, OnAdkCustomEventCallback, OnAdkErrorCallback } from "./types.js";
|
|
2
2
|
//#region src/useAdkMessages.d.ts
|
|
3
|
-
type UseAdkMessagesOptions = {
|
|
3
|
+
export type UseAdkMessagesOptions = {
|
|
4
4
|
stream: AdkStreamCallback;
|
|
5
5
|
eventHandlers?: {
|
|
6
6
|
onError?: OnAdkErrorCallback;
|
|
@@ -8,7 +8,7 @@ type UseAdkMessagesOptions = {
|
|
|
8
8
|
onAgentTransfer?: OnAdkAgentTransferCallback;
|
|
9
9
|
};
|
|
10
10
|
};
|
|
11
|
-
declare const useAdkMessages: ({ stream, eventHandlers }: UseAdkMessagesOptions) => {
|
|
11
|
+
export declare const useAdkMessages: ({ stream, eventHandlers }: UseAdkMessagesOptions) => {
|
|
12
12
|
messages: AdkMessage[];
|
|
13
13
|
stateDelta: Record<string, unknown>;
|
|
14
14
|
agentInfo: {
|
|
@@ -28,5 +28,4 @@ declare const useAdkMessages: ({ stream, eventHandlers }: UseAdkMessagesOptions)
|
|
|
28
28
|
applySnapshot: (snapshot: AdkThreadSnapshot) => void;
|
|
29
29
|
};
|
|
30
30
|
//#endregion
|
|
31
|
-
export { UseAdkMessagesOptions, useAdkMessages };
|
|
32
31
|
//# sourceMappingURL=useAdkMessages.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAdkMessages.d.ts","names":[],"sources":["../src/useAdkMessages.ts"],"mappings":";;
|
|
1
|
+
{"version":3,"file":"useAdkMessages.d.ts","names":[],"sources":["../src/useAdkMessages.ts"],"mappings":";;YAgCY;EACV,QAAQ;EACR;IACE,UAAU;IACV,gBAAgB;IAChB,kBAAkB;;;qBAcT,mBAAkB,QAAA,iBAG5B;;;;IAIQ;IACE;;;;;;;;EAsFW,cAAA,aAAA,cAAY,QAAU,yBAAoB;;EAvDhB,cAAA,MAAA;EAmCvC,kBAAA,MAAA;EAnBI,gBAAA,UAAA"}
|
package/dist/useAdkMessages.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { contentToParts } from "./contentToParts.js";
|
|
2
|
+
import { toAdkFunctionResponse } from "./toAdkFunctionResponse.js";
|
|
2
3
|
import { AdkEventAccumulator } from "./AdkEventAccumulator.js";
|
|
3
4
|
import { abortableIterable, invokeUserCallback, openAbortableIterable } from "@assistant-ui/core/internal";
|
|
4
5
|
import { generateId } from "@assistant-ui/core";
|
|
@@ -12,7 +13,7 @@ const useAdkMessages = ({ stream, eventHandlers }) => {
|
|
|
12
13
|
const [messages, _setMessages] = useState([]);
|
|
13
14
|
const [stateDelta, setStateDelta] = useState({});
|
|
14
15
|
const [agentInfo, setAgentInfo] = useState({});
|
|
15
|
-
const [longRunningToolIds,
|
|
16
|
+
const [longRunningToolIds, _setLongRunningToolIds] = useState([]);
|
|
16
17
|
const [artifactDelta, setArtifactDelta] = useState({});
|
|
17
18
|
const [toolConfirmations, setToolConfirmations] = useState([]);
|
|
18
19
|
const [authRequests, setAuthRequests] = useState([]);
|
|
@@ -20,6 +21,7 @@ const useAdkMessages = ({ stream, eventHandlers }) => {
|
|
|
20
21
|
const [messageMetadata, setMessageMetadata] = useState(/* @__PURE__ */ new Map());
|
|
21
22
|
const lastTransferToAgentRef = useRef(void 0);
|
|
22
23
|
const messagesRef = useRef(messages);
|
|
24
|
+
const longRunningToolIdsRef = useRef(longRunningToolIds);
|
|
23
25
|
const stateDeltaRef = useRef(stateDelta);
|
|
24
26
|
useInsertionEffect(() => {
|
|
25
27
|
stateDeltaRef.current = stateDelta;
|
|
@@ -36,6 +38,10 @@ const useAdkMessages = ({ stream, eventHandlers }) => {
|
|
|
36
38
|
messagesRef.current = msgs;
|
|
37
39
|
_setMessages(msgs);
|
|
38
40
|
}, []);
|
|
41
|
+
const setLongRunningToolIds = useCallback((ids) => {
|
|
42
|
+
longRunningToolIdsRef.current = ids;
|
|
43
|
+
_setLongRunningToolIds(ids);
|
|
44
|
+
}, []);
|
|
39
45
|
/**
|
|
40
46
|
* Swap the thread over to a loaded snapshot in one commit. Unlike
|
|
41
47
|
* {@link replaceMessages} this never passes through a cleared state, so a
|
|
@@ -52,7 +58,7 @@ const useAdkMessages = ({ stream, eventHandlers }) => {
|
|
|
52
58
|
setStateDelta(snapshot.stateDelta ?? {});
|
|
53
59
|
setArtifactDelta(snapshot.artifactDelta ?? {});
|
|
54
60
|
setAgentInfo(snapshot.agentInfo ?? {});
|
|
55
|
-
}, [setMessagesImmediate]);
|
|
61
|
+
}, [setLongRunningToolIds, setMessagesImmediate]);
|
|
56
62
|
const replaceMessages = useCallback((msgs) => {
|
|
57
63
|
setMessagesImmediate(msgs);
|
|
58
64
|
setLongRunningToolIds([]);
|
|
@@ -60,7 +66,7 @@ const useAdkMessages = ({ stream, eventHandlers }) => {
|
|
|
60
66
|
setAuthRequests([]);
|
|
61
67
|
setEscalated(false);
|
|
62
68
|
setMessageMetadata(/* @__PURE__ */ new Map());
|
|
63
|
-
}, [setMessagesImmediate]);
|
|
69
|
+
}, [setLongRunningToolIds, setMessagesImmediate]);
|
|
64
70
|
const abortControllerRef = useRef(null);
|
|
65
71
|
const { onError, onCustomEvent, onAgentTransfer } = useMemo(() => eventHandlers ?? {}, [eventHandlers]);
|
|
66
72
|
const aui = useAui();
|
|
@@ -70,9 +76,13 @@ const useAdkMessages = ({ stream, eventHandlers }) => {
|
|
|
70
76
|
id: generateId()
|
|
71
77
|
});
|
|
72
78
|
const resentIds = new Set(newMessagesWithId.map((m) => m.id));
|
|
73
|
-
const
|
|
79
|
+
const answeredToolCallIds = new Set(newMessagesWithId.flatMap((m) => m.type === "tool" ? [m.tool_call_id] : []));
|
|
80
|
+
const accumulator = new AdkEventAccumulator(messagesRef.current.filter((m) => !resentIds.has(m.id)), longRunningToolIdsRef.current.filter((id) => !answeredToolCallIds.has(id)));
|
|
74
81
|
for (const event of messagesToEvents(newMessagesWithId)) accumulator.processEvent(event);
|
|
75
82
|
setMessagesImmediate(accumulator.getMessages());
|
|
83
|
+
setLongRunningToolIds(accumulator.getLongRunningToolIds());
|
|
84
|
+
setToolConfirmations(accumulator.getToolConfirmations());
|
|
85
|
+
setAuthRequests(accumulator.getAuthRequests());
|
|
76
86
|
abortControllerRef.current?.abort();
|
|
77
87
|
const abortController = new AbortController();
|
|
78
88
|
abortControllerRef.current = abortController;
|
|
@@ -122,6 +132,7 @@ const useAdkMessages = ({ stream, eventHandlers }) => {
|
|
|
122
132
|
}, [
|
|
123
133
|
aui,
|
|
124
134
|
setMessagesImmediate,
|
|
135
|
+
setLongRunningToolIds,
|
|
125
136
|
stream,
|
|
126
137
|
onError,
|
|
127
138
|
onCustomEvent,
|
|
@@ -208,7 +219,7 @@ const messageToEvent = (msg) => {
|
|
|
208
219
|
parts: [{ functionResponse: {
|
|
209
220
|
name: msg.name,
|
|
210
221
|
id: msg.tool_call_id,
|
|
211
|
-
response
|
|
222
|
+
response: toAdkFunctionResponse(response, msg.status === "error")
|
|
212
223
|
} }]
|
|
213
224
|
}
|
|
214
225
|
};
|