@google/adk 1.2.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (190) hide show
  1. package/dist/cjs/agents/base_agent.js +19 -1
  2. package/dist/cjs/agents/instructions.js +81 -33
  3. package/dist/cjs/agents/invocation_context.js +0 -1
  4. package/dist/cjs/agents/llm_agent.js +52 -5
  5. package/dist/cjs/agents/processors/agent_transfer_llm_request_processor.js +7 -0
  6. package/dist/cjs/agents/processors/basic_llm_request_processor.js +8 -1
  7. package/dist/cjs/agents/processors/content_processor_utils.js +37 -24
  8. package/dist/cjs/agents/processors/content_request_processor.js +7 -0
  9. package/dist/cjs/agents/processors/context_compactor_request_processor.js +12 -0
  10. package/dist/cjs/agents/processors/identity_llm_request_processor.js +7 -0
  11. package/dist/cjs/agents/processors/instructions_llm_request_processor.js +5 -0
  12. package/dist/cjs/agents/processors/request_confirmation_llm_request_processor.js +9 -1
  13. package/dist/cjs/agents/processors/tool_filter_request_processor.js +7 -1
  14. package/dist/cjs/auth/auth_preprocessor.js +12 -10
  15. package/dist/cjs/auth/oauth2/oauth2_discovery.js +1 -1
  16. package/dist/cjs/code_executors/code_executor_context.js +7 -7
  17. package/dist/cjs/common.js +39 -0
  18. package/dist/cjs/context/summarizers/llm_summarizer.js +11 -0
  19. package/dist/cjs/context/token_based_context_compactor.js +1 -1
  20. package/dist/cjs/events/event.js +1 -1
  21. package/dist/cjs/integrations/agent_registry/agent_registry_mcp_toolset.js +21 -2
  22. package/dist/cjs/models/gemini_llm_connection.js +62 -19
  23. package/dist/cjs/models/google_llm.js +26 -8
  24. package/dist/cjs/plugins/security_plugin.js +16 -0
  25. package/dist/cjs/sessions/base_session_service.js +13 -2
  26. package/dist/cjs/sessions/database_session_service.js +2 -2
  27. package/dist/cjs/sessions/db/schema.js +45 -10
  28. package/dist/cjs/sessions/in_memory_session_service.js +2 -1
  29. package/dist/cjs/sessions/vertex_ai_session_service.js +2 -1
  30. package/dist/cjs/skills/gcp_skill_registry.js +104 -0
  31. package/dist/cjs/skills/loader.js +65 -0
  32. package/dist/cjs/skills/skill_registry.js +27 -0
  33. package/dist/cjs/tools/openapi_tool/openapi_spec_parser/openapi_spec_parser.js +232 -0
  34. package/dist/cjs/tools/openapi_tool/openapi_spec_parser/operation_parser.js +224 -0
  35. package/dist/cjs/tools/openapi_tool/openapi_spec_parser/tool_auth_handler.js +127 -0
  36. package/dist/cjs/tools/openapi_tool/openapi_toolset.js +133 -0
  37. package/dist/cjs/tools/openapi_tool/rest_api_tool.js +256 -0
  38. package/dist/cjs/tools/skill/load_skill_resource_tool.js +25 -3
  39. package/dist/cjs/tools/skill/load_skill_tool.js +12 -1
  40. package/dist/cjs/tools/skill/run_skill_script_tool.js +12 -1
  41. package/dist/cjs/tools/skill/search_skills_tool.js +108 -0
  42. package/dist/cjs/tools/skill/skill_toolset.js +40 -5
  43. package/dist/cjs/utils/async_queue.js +88 -0
  44. package/dist/cjs/utils/case_utils.js +53 -0
  45. package/dist/cjs/utils/env_aware_utils.js +4 -0
  46. package/dist/cjs/utils/live_connection_utils.js +284 -0
  47. package/dist/cjs/utils/model_name.js +9 -0
  48. package/dist/cjs/utils/streaming_utils.js +9 -8
  49. package/dist/cjs/version.js +1 -1
  50. package/dist/esm/agents/base_agent.js +19 -1
  51. package/dist/esm/agents/instructions.js +81 -33
  52. package/dist/esm/agents/invocation_context.js +0 -1
  53. package/dist/esm/agents/llm_agent.js +53 -5
  54. package/dist/esm/agents/processors/agent_transfer_llm_request_processor.js +7 -0
  55. package/dist/esm/agents/processors/basic_llm_request_processor.js +8 -1
  56. package/dist/esm/agents/processors/content_processor_utils.js +35 -23
  57. package/dist/esm/agents/processors/content_request_processor.js +7 -0
  58. package/dist/esm/agents/processors/context_compactor_request_processor.js +12 -0
  59. package/dist/esm/agents/processors/identity_llm_request_processor.js +7 -0
  60. package/dist/esm/agents/processors/instructions_llm_request_processor.js +5 -0
  61. package/dist/esm/agents/processors/request_confirmation_llm_request_processor.js +9 -1
  62. package/dist/esm/agents/processors/tool_filter_request_processor.js +7 -1
  63. package/dist/esm/auth/auth_preprocessor.js +12 -10
  64. package/dist/esm/auth/oauth2/oauth2_discovery.js +1 -1
  65. package/dist/esm/code_executors/code_executor_context.js +7 -7
  66. package/dist/esm/common.js +33 -1
  67. package/dist/esm/context/summarizers/llm_summarizer.js +11 -0
  68. package/dist/esm/context/token_based_context_compactor.js +1 -1
  69. package/dist/esm/events/event.js +1 -1
  70. package/dist/esm/integrations/agent_registry/agent_registry_mcp_toolset.js +21 -2
  71. package/dist/esm/models/gemini_llm_connection.js +62 -19
  72. package/dist/esm/models/google_llm.js +26 -8
  73. package/dist/esm/plugins/security_plugin.js +16 -0
  74. package/dist/esm/sessions/base_session_service.js +11 -1
  75. package/dist/esm/sessions/database_session_service.js +2 -2
  76. package/dist/esm/sessions/db/schema.js +44 -10
  77. package/dist/esm/sessions/in_memory_session_service.js +4 -2
  78. package/dist/esm/sessions/vertex_ai_session_service.js +4 -2
  79. package/dist/esm/skills/gcp_skill_registry.js +78 -0
  80. package/dist/esm/skills/loader.js +64 -0
  81. package/dist/esm/skills/skill_registry.js +7 -0
  82. package/dist/esm/tools/openapi_tool/openapi_spec_parser/openapi_spec_parser.js +206 -0
  83. package/dist/esm/tools/openapi_tool/openapi_spec_parser/operation_parser.js +198 -0
  84. package/dist/esm/tools/openapi_tool/openapi_spec_parser/tool_auth_handler.js +101 -0
  85. package/dist/esm/tools/openapi_tool/openapi_toolset.js +97 -0
  86. package/dist/esm/tools/openapi_tool/rest_api_tool.js +229 -0
  87. package/dist/esm/tools/skill/load_skill_resource_tool.js +25 -3
  88. package/dist/esm/tools/skill/load_skill_tool.js +12 -1
  89. package/dist/esm/tools/skill/run_skill_script_tool.js +12 -1
  90. package/dist/esm/tools/skill/search_skills_tool.js +82 -0
  91. package/dist/esm/tools/skill/skill_toolset.js +40 -5
  92. package/dist/esm/utils/async_queue.js +60 -0
  93. package/dist/esm/utils/case_utils.js +25 -0
  94. package/dist/esm/utils/env_aware_utils.js +4 -0
  95. package/dist/esm/utils/live_connection_utils.js +256 -0
  96. package/dist/esm/utils/model_name.js +8 -0
  97. package/dist/esm/utils/streaming_utils.js +9 -8
  98. package/dist/esm/version.js +1 -1
  99. package/dist/types/a2a/a2a_remote_agent_utils.d.ts +29 -4
  100. package/dist/types/a2a/event_converter_utils.d.ts +14 -1
  101. package/dist/types/a2a/metadata_converter_utils.d.ts +18 -0
  102. package/dist/types/a2a/part_converter_utils.d.ts +51 -6
  103. package/dist/types/agents/invocation_context.d.ts +0 -9
  104. package/dist/types/agents/llm_agent.d.ts +14 -0
  105. package/dist/types/agents/processors/agent_transfer_llm_request_processor.d.ts +14 -0
  106. package/dist/types/agents/processors/basic_llm_request_processor.d.ts +7 -0
  107. package/dist/types/agents/processors/content_processor_utils.d.ts +26 -0
  108. package/dist/types/agents/processors/content_request_processor.d.ts +16 -0
  109. package/dist/types/agents/processors/context_compactor_request_processor.d.ts +12 -0
  110. package/dist/types/agents/processors/identity_llm_request_processor.d.ts +7 -0
  111. package/dist/types/agents/processors/request_confirmation_llm_request_processor.d.ts +9 -1
  112. package/dist/types/agents/processors/tool_filter_request_processor.d.ts +12 -1
  113. package/dist/types/common.d.ts +15 -1
  114. package/dist/types/context/summarizers/llm_summarizer.d.ts +17 -0
  115. package/dist/types/events/event_actions.d.ts +1 -2
  116. package/dist/types/integrations/agent_registry/agent_registry_mcp_toolset.d.ts +21 -2
  117. package/dist/types/models/base_llm_connection.d.ts +10 -0
  118. package/dist/types/models/gemini_llm_connection.d.ts +15 -4
  119. package/dist/types/models/llm_response.d.ts +10 -1
  120. package/dist/types/plugins/security_plugin.d.ts +30 -0
  121. package/dist/types/sessions/base_session_service.d.ts +4 -0
  122. package/dist/types/sessions/db/schema.d.ts +1 -0
  123. package/dist/types/skills/gcp_skill_registry.d.ts +24 -0
  124. package/dist/types/skills/loader.d.ts +7 -0
  125. package/dist/types/skills/skill.d.ts +1 -1
  126. package/dist/types/skills/skill_registry.d.ts +29 -0
  127. package/dist/types/tools/openapi_tool/openapi_spec_parser/openapi_spec_parser.d.ts +34 -0
  128. package/dist/types/tools/openapi_tool/openapi_spec_parser/operation_parser.d.ts +59 -0
  129. package/dist/types/tools/openapi_tool/openapi_spec_parser/tool_auth_handler.d.ts +23 -0
  130. package/dist/types/tools/openapi_tool/openapi_toolset.d.ts +27 -0
  131. package/dist/types/tools/openapi_tool/rest_api_tool.d.ts +50 -0
  132. package/dist/types/tools/skill/load_skill_resource_tool.d.ts +1 -1
  133. package/dist/types/tools/skill/search_skills_tool.d.ts +14 -0
  134. package/dist/types/tools/skill/skill_toolset.d.ts +5 -0
  135. package/dist/types/utils/async_queue.d.ts +18 -0
  136. package/dist/types/utils/case_utils.d.ts +12 -0
  137. package/dist/types/utils/live_connection_utils.d.ts +30 -0
  138. package/dist/types/utils/model_name.d.ts +7 -0
  139. package/dist/types/utils/streaming_utils.d.ts +0 -1
  140. package/dist/types/version.d.ts +1 -1
  141. package/dist/web/agents/base_agent.js +31 -1
  142. package/dist/web/agents/instructions.js +81 -33
  143. package/dist/web/agents/invocation_context.js +0 -1
  144. package/dist/web/agents/llm_agent.js +53 -5
  145. package/dist/web/agents/processors/agent_transfer_llm_request_processor.js +7 -0
  146. package/dist/web/agents/processors/basic_llm_request_processor.js +8 -1
  147. package/dist/web/agents/processors/content_processor_utils.js +53 -23
  148. package/dist/web/agents/processors/content_request_processor.js +7 -0
  149. package/dist/web/agents/processors/context_compactor_request_processor.js +12 -0
  150. package/dist/web/agents/processors/identity_llm_request_processor.js +7 -0
  151. package/dist/web/agents/processors/instructions_llm_request_processor.js +5 -0
  152. package/dist/web/agents/processors/request_confirmation_llm_request_processor.js +9 -1
  153. package/dist/web/agents/processors/tool_filter_request_processor.js +7 -1
  154. package/dist/web/auth/auth_preprocessor.js +12 -10
  155. package/dist/web/auth/oauth2/oauth2_discovery.js +1 -1
  156. package/dist/web/code_executors/code_executor_context.js +7 -7
  157. package/dist/web/common.js +33 -1
  158. package/dist/web/context/summarizers/llm_summarizer.js +11 -0
  159. package/dist/web/context/token_based_context_compactor.js +1 -1
  160. package/dist/web/events/event.js +1 -1
  161. package/dist/web/integrations/agent_registry/agent_registry_mcp_toolset.js +21 -2
  162. package/dist/web/models/gemini_llm_connection.js +75 -19
  163. package/dist/web/models/google_llm.js +26 -8
  164. package/dist/web/plugins/security_plugin.js +16 -0
  165. package/dist/web/sessions/base_session_service.js +11 -1
  166. package/dist/web/sessions/database_session_service.js +2 -2
  167. package/dist/web/sessions/db/schema.js +44 -10
  168. package/dist/web/sessions/in_memory_session_service.js +4 -2
  169. package/dist/web/sessions/vertex_ai_session_service.js +4 -2
  170. package/dist/web/skills/gcp_skill_registry.js +78 -0
  171. package/dist/web/skills/loader.js +64 -0
  172. package/dist/web/skills/skill_registry.js +7 -0
  173. package/dist/web/tools/openapi_tool/openapi_spec_parser/openapi_spec_parser.js +221 -0
  174. package/dist/web/tools/openapi_tool/openapi_spec_parser/operation_parser.js +198 -0
  175. package/dist/web/tools/openapi_tool/openapi_spec_parser/tool_auth_handler.js +101 -0
  176. package/dist/web/tools/openapi_tool/openapi_toolset.js +97 -0
  177. package/dist/web/tools/openapi_tool/rest_api_tool.js +229 -0
  178. package/dist/web/tools/skill/load_skill_resource_tool.js +25 -3
  179. package/dist/web/tools/skill/load_skill_tool.js +12 -1
  180. package/dist/web/tools/skill/run_skill_script_tool.js +12 -1
  181. package/dist/web/tools/skill/search_skills_tool.js +82 -0
  182. package/dist/web/tools/skill/skill_toolset.js +40 -5
  183. package/dist/web/utils/async_queue.js +60 -0
  184. package/dist/web/utils/case_utils.js +25 -0
  185. package/dist/web/utils/env_aware_utils.js +4 -0
  186. package/dist/web/utils/live_connection_utils.js +254 -0
  187. package/dist/web/utils/model_name.js +8 -0
  188. package/dist/web/utils/streaming_utils.js +9 -8
  189. package/dist/web/version.js +1 -1
  190. package/package.json +3 -1
@@ -0,0 +1,50 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { FunctionDeclaration } from '@google/genai';
7
+ import { OpenAPIV3 } from 'openapi-types';
8
+ import { ReadonlyContext } from '../../agents/readonly_context.js';
9
+ import { AuthCredential } from '../../auth/auth_credential.js';
10
+ import { BaseTool, RunAsyncToolRequest } from '../base_tool.js';
11
+ import { ApiParameter } from './openapi_spec_parser/operation_parser.js';
12
+ import { OperationEndpoint } from './openapi_spec_parser/openapi_spec_parser.js';
13
+ export declare class RestApiTool extends BaseTool {
14
+ private readonly endpoint;
15
+ private readonly operation;
16
+ private authScheme?;
17
+ private authCredential?;
18
+ private operationParser;
19
+ private headerProvider?;
20
+ private credentialKey?;
21
+ constructor(name: string, description: string, endpoint: OperationEndpoint, operation: OpenAPIV3.OperationObject, authScheme?: OpenAPIV3.SecuritySchemeObject | undefined, authCredential?: AuthCredential | undefined, options?: {
22
+ preservePropertyNames?: boolean;
23
+ headerProvider?: (context: ReadonlyContext) => Record<string, string>;
24
+ credentialKey?: string;
25
+ });
26
+ configureAuthScheme(authScheme: OpenAPIV3.SecuritySchemeObject): void;
27
+ configureAuthCredential(authCredential: AuthCredential): void;
28
+ configureCredentialKey(credentialKey: string): void;
29
+ _getDeclaration(): FunctionDeclaration;
30
+ runAsync(request: RunAsyncToolRequest): Promise<unknown>;
31
+ }
32
+ export interface PreparedParams {
33
+ url: string;
34
+ headers: Record<string, string>;
35
+ body: unknown;
36
+ bodyData: Record<string, unknown>;
37
+ }
38
+ export declare function prepareRequestParams(endpoint: OperationEndpoint, parameters: ApiParameter[], args: Record<string, unknown>): PreparedParams;
39
+ export declare function prepareRequestBody(requestBody: OpenAPIV3.RequestBodyObject | OpenAPIV3.ReferenceObject | undefined, body: unknown, bodyData: Record<string, unknown>, headers: Record<string, string>): unknown;
40
+ export declare function createRestApiTool(parsed: {
41
+ name: string;
42
+ description: string;
43
+ endpoint: OperationEndpoint;
44
+ operation: OpenAPIV3.OperationObject;
45
+ authScheme?: OpenAPIV3.SecuritySchemeObject;
46
+ }, options?: {
47
+ preservePropertyNames?: boolean;
48
+ headerProvider?: (context: ReadonlyContext) => Record<string, string>;
49
+ credentialKey?: string;
50
+ }): RestApiTool;
@@ -10,6 +10,6 @@ export declare class LoadSkillResourceTool extends BaseTool {
10
10
  private toolset;
11
11
  constructor(toolset: SkillToolset);
12
12
  _getDeclaration(): FunctionDeclaration;
13
- runAsync({ args }: RunAsyncToolRequest): Promise<unknown>;
13
+ runAsync({ args, toolContext, }: RunAsyncToolRequest): Promise<unknown>;
14
14
  processLlmRequest(request: ToolProcessLlmRequest): Promise<void>;
15
15
  }
@@ -0,0 +1,14 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { FunctionDeclaration } from '@google/genai';
7
+ import { BaseTool, RunAsyncToolRequest } from '../base_tool.js';
8
+ import { SkillToolset } from './skill_toolset.js';
9
+ export declare class SearchSkillsTool extends BaseTool {
10
+ private toolset;
11
+ constructor(toolset: SkillToolset);
12
+ _getDeclaration(): FunctionDeclaration;
13
+ runAsync({ args }: RunAsyncToolRequest): Promise<unknown>;
14
+ }
@@ -8,6 +8,7 @@ import { ReadonlyContext } from '../../agents/readonly_context.js';
8
8
  import { BaseCodeExecutor } from '../../code_executors/base_code_executor.js';
9
9
  import { LlmRequest } from '../../models/llm_request.js';
10
10
  import { Skill } from '../../skills/skill.js';
11
+ import { SkillRegistry } from '../../skills/skill_registry.js';
11
12
  import { BaseTool } from '../base_tool.js';
12
13
  import { BaseToolset } from '../base_toolset.js';
13
14
  export declare class SkillToolset extends BaseToolset {
@@ -15,14 +16,18 @@ export declare class SkillToolset extends BaseToolset {
15
16
  private tools;
16
17
  additionalTools: Array<BaseTool | BaseToolset>;
17
18
  codeExecutor?: BaseCodeExecutor;
19
+ registry?: SkillRegistry;
18
20
  private toolCache;
21
+ private fetchedSkillCache;
19
22
  constructor(skills: Record<string, Skill> | Skill[], options?: {
20
23
  codeExecutor?: BaseCodeExecutor;
21
24
  additionalTools?: Array<BaseTool | BaseToolset>;
25
+ registry?: SkillRegistry;
22
26
  });
23
27
  getTools(context?: ReadonlyContext): Promise<BaseTool[]>;
24
28
  close(): Promise<void>;
25
29
  getSkill(name: string): Skill | undefined;
30
+ getOrFetchSkill(name: string, invocationId?: string): Promise<Skill | undefined>;
26
31
  processLlmRequest(toolContext: Context, llmRequest: LlmRequest): Promise<void>;
27
32
  private resolveAdditionalTools;
28
33
  }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ /**
7
+ * A generic, async-safe queue that implements AsyncIterable.
8
+ */
9
+ export declare class AsyncQueue<T> implements AsyncIterable<T> {
10
+ private queue;
11
+ private resolvers;
12
+ private closed;
13
+ private errorVal?;
14
+ push(value: T): void;
15
+ error(err: unknown): void;
16
+ close(): void;
17
+ [Symbol.asyncIterator](): AsyncIterator<T>;
18
+ }
@@ -0,0 +1,12 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ /**
7
+ * Recursively converts snake_case keys of an object to camelCase.
8
+ *
9
+ * @param val The value to convert.
10
+ * @returns The converted value.
11
+ */
12
+ export declare function camelCaseKeys(val: unknown): unknown;
@@ -0,0 +1,30 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { LiveServerMessage } from '@google/genai';
7
+ import { LlmResponse } from '../models/llm_response.js';
8
+ /**
9
+ * Aggregator and mapper for Gemini Live WebSocket server messages.
10
+ *
11
+ * Translates incoming raw WebSocket server messages (push stream) into unified
12
+ * agent-consumable LlmResponse objects (pull stream), managing transcription buffers,
13
+ * grounding metadata, text segments, and tool calls.
14
+ */
15
+ export declare class LiveResponseAggregator {
16
+ private readonly modelVersion?;
17
+ private text;
18
+ private isThought;
19
+ private toolCallParts;
20
+ private pendingGroundingMetadata;
21
+ private inputTranscriptionText;
22
+ private outputTranscriptionText;
23
+ constructor(modelVersion?: string | undefined);
24
+ processMessage(message: LiveServerMessage): Generator<LlmResponse, void, void>;
25
+ /**
26
+ * Flushes any remaining aggregated components when the connection is closed.
27
+ */
28
+ close(): Generator<LlmResponse, void, void>;
29
+ private buildFullTextResponse;
30
+ }
@@ -32,6 +32,13 @@ export declare function isGemini1Model(modelString: string): boolean;
32
32
  * @return true if it's a Gemini 2.x model, false otherwise.
33
33
  */
34
34
  export declare function isGemini2OrAbove(modelString: string): boolean;
35
+ /**
36
+ * Check if the model is a Gemini 3.x Flash Live model.
37
+ *
38
+ * @param modelString Either a simple model name or path-based model name
39
+ * @return true if it's a Gemini 3.x Flash Live model, false otherwise.
40
+ */
41
+ export declare function isGemini3xFlashLive(modelString: string | undefined): boolean;
35
42
  /**
36
43
  * Returns True when Gemini model-id validation should be bypassed.
37
44
  */
@@ -19,7 +19,6 @@ export declare class StreamingResponseAggregator {
19
19
  private response?;
20
20
  private finishReason?;
21
21
  private lastThoughtSignature;
22
- private sawFunctionCall;
23
22
  private readonly strategy;
24
23
  constructor(isProgressiveMode?: boolean);
25
24
  processResponse(response: GenerateContentResponse): AsyncGenerator<LlmResponse, void, void>;
@@ -3,4 +3,4 @@
3
3
  * Copyright 2025 Google LLC
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
- export declare const version = "1.2.0";
6
+ export declare const version = "1.3.0";
@@ -184,10 +184,40 @@ class BaseAgent {
184
184
  this,
185
185
  function() {
186
186
  return __asyncGenerator(this, null, function* () {
187
+ var _a2, _b;
188
+ const context2 = this.createInvocationContext(parentContext);
189
+ const beforeAgentCallbackEvent = yield new __await(this.handleBeforeAgentCallback(context2));
190
+ if (beforeAgentCallbackEvent) {
191
+ yield beforeAgentCallbackEvent;
192
+ }
193
+ if (context2.endInvocation || ((_a2 = parentContext.abortSignal) == null ? void 0 : _a2.aborted)) {
194
+ return;
195
+ }
196
+ try {
197
+ for (var iter = __forAwait(this.runLiveImpl(context2)), more, temp, error; more = !(temp = yield new __await(iter.next())).done; more = false) {
198
+ const event = temp.value;
199
+ yield event;
200
+ }
201
+ } catch (temp) {
202
+ error = [temp];
203
+ } finally {
204
+ try {
205
+ more && (temp = iter.return) && (yield new __await(temp.call(iter)));
206
+ } finally {
207
+ if (error)
208
+ throw error[0];
209
+ }
210
+ }
211
+ if (context2.endInvocation || ((_b = parentContext.abortSignal) == null ? void 0 : _b.aborted)) {
212
+ return;
213
+ }
214
+ const afterAgentCallbackEvent = yield new __await(this.handleAfterAgentCallback(context2));
215
+ if (afterAgentCallbackEvent) {
216
+ yield afterAgentCallbackEvent;
217
+ }
187
218
  });
188
219
  }
189
220
  ));
190
- throw new Error("Live mode is not implemented yet.");
191
221
  } finally {
192
222
  span.end();
193
223
  }
@@ -6,50 +6,98 @@ const require = topLevelCreateRequire(import.meta.url);
6
6
  * SPDX-License-Identifier: Apache-2.0
7
7
  */
8
8
  import { State } from "../sessions/state.js";
9
- async function injectSessionState(template, readonlyContext) {
9
+ const ARTIFACT_PREFIX = "artifact.";
10
+ async function resolveKey(key, isOptional, rawMatch, readonlyContext) {
10
11
  const invocationContext = readonlyContext.invocationContext;
11
- async function replaceMatchedKeyWithItsValue(match) {
12
- let key = match[0].replace(/^\{+/, "").replace(/\}+$/, "").trim();
12
+ if (key.startsWith(ARTIFACT_PREFIX)) {
13
+ const fileName = key.substring(ARTIFACT_PREFIX.length);
14
+ if (invocationContext.artifactService === void 0) {
15
+ throw new Error("Artifact service is not initialized.");
16
+ }
17
+ const artifact = await invocationContext.artifactService.loadArtifact({
18
+ appName: invocationContext.session.appName,
19
+ userId: invocationContext.session.userId,
20
+ sessionId: invocationContext.session.id,
21
+ filename: fileName
22
+ });
23
+ if (!artifact) {
24
+ if (isOptional) {
25
+ return "";
26
+ }
27
+ throw new Error("Artifact ".concat(fileName, " not found."));
28
+ }
29
+ return String(artifact);
30
+ }
31
+ if (!isValidStateName(key)) {
32
+ return rawMatch;
33
+ }
34
+ if (key in invocationContext.session.state) {
35
+ return String(invocationContext.session.state[key]);
36
+ }
37
+ if (isOptional) {
38
+ return "";
39
+ }
40
+ throw new Error("Context variable not found: `".concat(key, "`."));
41
+ }
42
+ async function injectSessionState(template, readonlyContext) {
43
+ const pattern = /\{+[^{}]*}+/g;
44
+ const matches = Array.from(template.matchAll(pattern));
45
+ if (matches.length === 0) {
46
+ return template;
47
+ }
48
+ const parsedMatches = matches.map((match) => {
49
+ const raw = match[0];
50
+ let key = raw.replace(/^\{+/, "").replace(/\}+$/, "").trim();
13
51
  const isOptional = key.endsWith("?");
14
52
  if (isOptional) {
15
53
  key = key.slice(0, -1);
16
54
  }
17
- if (key.startsWith("artifact.")) {
18
- const fileName = key.substring("artifact.".length);
19
- if (invocationContext.artifactService === void 0) {
20
- throw new Error("Artifact service is not initialized.");
55
+ const isValid = key.startsWith(ARTIFACT_PREFIX) || isValidStateName(key);
56
+ return {
57
+ raw,
58
+ key,
59
+ isOptional,
60
+ isValid,
61
+ index: match.index
62
+ };
63
+ });
64
+ const uniqueKeys = /* @__PURE__ */ new Map();
65
+ for (const pm of parsedMatches) {
66
+ if (!pm.isValid) {
67
+ continue;
68
+ }
69
+ const existing = uniqueKeys.get(pm.key);
70
+ if (existing) {
71
+ if (existing.isOptional && !pm.isOptional) {
72
+ existing.isOptional = false;
21
73
  }
22
- const artifact = await invocationContext.artifactService.loadArtifact({
23
- appName: invocationContext.session.appName,
24
- userId: invocationContext.session.userId,
25
- sessionId: invocationContext.session.id,
26
- filename: fileName
74
+ } else {
75
+ uniqueKeys.set(pm.key, {
76
+ key: pm.key,
77
+ isOptional: pm.isOptional,
78
+ raw: pm.raw
27
79
  });
28
- if (!artifact) {
29
- throw new Error("Artifact ".concat(fileName, " not found."));
30
- }
31
- return String(artifact);
32
- }
33
- if (!isValidStateName(key)) {
34
- return match[0];
35
- }
36
- if (key in invocationContext.session.state) {
37
- return String(invocationContext.session.state[key]);
38
80
  }
39
- if (isOptional) {
40
- return "";
41
- }
42
- throw new Error("Context variable not found: `".concat(key, "`."));
43
81
  }
44
- const pattern = /\{+[^{}]*}+/g;
82
+ const resolutions = /* @__PURE__ */ new Map();
83
+ for (const info of uniqueKeys.values()) {
84
+ resolutions.set(
85
+ info.key,
86
+ resolveKey(info.key, info.isOptional, info.raw, readonlyContext)
87
+ );
88
+ }
89
+ await Promise.all(resolutions.values());
45
90
  const result = [];
46
91
  let lastEnd = 0;
47
- const matches = template.matchAll(pattern);
48
- for (const match of matches) {
49
- result.push(template.slice(lastEnd, match.index));
50
- const replacement = await replaceMatchedKeyWithItsValue(match);
51
- result.push(replacement);
52
- lastEnd = match.index + match[0].length;
92
+ for (const pm of parsedMatches) {
93
+ result.push(template.slice(lastEnd, pm.index));
94
+ if (pm.isValid) {
95
+ const replacement = await resolutions.get(pm.key);
96
+ result.push(replacement);
97
+ } else {
98
+ result.push(pm.raw);
99
+ }
100
+ lastEnd = pm.index + pm.raw.length;
53
101
  }
54
102
  result.push(template.slice(lastEnd));
55
103
  return result.join("");
@@ -46,7 +46,6 @@ class InvocationContext {
46
46
  this.endInvocation = params.endInvocation || false;
47
47
  this.transcriptionCache = params.transcriptionCache;
48
48
  this.runConfig = params.runConfig;
49
- this.liveRequestQueue = params.liveRequestQueue;
50
49
  this.activeStreamingTools = params.activeStreamingTools;
51
50
  this.pluginManager = params.pluginManager;
52
51
  this.abortSignal = params.abortSignal;
@@ -71,10 +71,12 @@ var __forAwait = (obj, it, method) => (it = obj[__knownSymbol("asyncIterator")])
71
71
  */
72
72
  var _a, _b;
73
73
  import { context, trace } from "@opentelemetry/api";
74
+ import { FunctionTool } from "../tools/function_tool.js";
74
75
  import {
75
76
  createEvent,
76
77
  createNewEventId,
77
78
  getFunctionCalls,
79
+ getFunctionResponses,
78
80
  isFinalResponse
79
81
  } from "../events/event.js";
80
82
  import { isBaseLlm } from "../models/base_llm.js";
@@ -96,6 +98,7 @@ import {
96
98
  handleFunctionCallsAsync,
97
99
  populateClientFunctionCallId
98
100
  } from "./functions.js";
101
+ import { AUTH_PREPROCESSOR } from "../auth/auth_preprocessor.js";
99
102
  import { AGENT_TRANSFER_LLM_REQUEST_PROCESSOR } from "./processors/agent_transfer_llm_request_processor.js";
100
103
  import { BASIC_LLM_REQUEST_PROCESSOR } from "./processors/basic_llm_request_processor.js";
101
104
  import { CODE_EXECUTION_REQUEST_PROCESSOR } from "./processors/code_execution_request_processor.js";
@@ -142,6 +145,7 @@ class LlmAgent extends (_b = BaseAgent, _a = LLM_AGENT_SIGNATURE_SYMBOL, _b) {
142
145
  this.codeExecutor = config.codeExecutor;
143
146
  this.requestProcessors = (_g = config.requestProcessors) != null ? _g : [
144
147
  BASIC_LLM_REQUEST_PROCESSOR,
148
+ AUTH_PREPROCESSOR,
145
149
  IDENTITY_LLM_REQUEST_PROCESSOR,
146
150
  INSTRUCTIONS_LLM_REQUEST_PROCESSOR,
147
151
  REQUEST_CONFIRMATION_LLM_REQUEST_PROCESSOR,
@@ -368,9 +372,10 @@ class LlmAgent extends (_b = BaseAgent, _a = LLM_AGENT_SIGNATURE_SYMBOL, _b) {
368
372
  }
369
373
  runAsyncImpl(context2) {
370
374
  return __asyncGenerator(this, null, function* () {
371
- var _a2;
375
+ var _a2, _b2;
372
376
  while (true) {
373
377
  let lastEvent = void 0;
378
+ let stepHadToolCalls = false;
374
379
  try {
375
380
  for (var iter = __forAwait(this.runOneStepAsync(context2)), more, temp, error; more = !(temp = yield new __await(iter.next())).done; more = false) {
376
381
  const event = temp.value;
@@ -378,6 +383,9 @@ class LlmAgent extends (_b = BaseAgent, _a = LLM_AGENT_SIGNATURE_SYMBOL, _b) {
378
383
  return;
379
384
  }
380
385
  lastEvent = event;
386
+ if (getFunctionCalls(event).length > 0 || getFunctionResponses(event).length > 0) {
387
+ stepHadToolCalls = true;
388
+ }
381
389
  this.maybeSaveOutputToState(event);
382
390
  yield event;
383
391
  }
@@ -391,7 +399,11 @@ class LlmAgent extends (_b = BaseAgent, _a = LLM_AGENT_SIGNATURE_SYMBOL, _b) {
391
399
  throw error[0];
392
400
  }
393
401
  }
394
- if (!lastEvent || isFinalResponse(lastEvent)) {
402
+ if (!lastEvent) {
403
+ break;
404
+ }
405
+ const isEmptyMetadataEvent = lastEvent.author === this.name && !lastEvent.partial && (!((_b2 = lastEvent.content) == null ? void 0 : _b2.parts) || lastEvent.content.parts.length === 0);
406
+ if (isFinalResponse(lastEvent) && !(isEmptyMetadataEvent && stepHadToolCalls)) {
395
407
  break;
396
408
  }
397
409
  if (lastEvent.partial) {
@@ -431,6 +443,20 @@ class LlmAgent extends (_b = BaseAgent, _a = LLM_AGENT_SIGNATURE_SYMBOL, _b) {
431
443
  // --------------------------------------------------------------------------
432
444
  // #START LlmFlow Logic
433
445
  // --------------------------------------------------------------------------
446
+ /**
447
+ * Runs the bidirectional (live) flow for this agent.
448
+ *
449
+ * Establishes a live connection to the model, drains the invocation's
450
+ * `liveRequestQueue` into the connection on a parallel task, and yields
451
+ * events derived from server messages until the queue closes, the model
452
+ * finishes, or an agent transfer occurs.
453
+ *
454
+ * If the live connection drops (network failure, server `goAway`) and a
455
+ * session resumption handle has been observed, the flow transparently
456
+ * reconnects using that handle up to {@link MAX_LIVE_RECONNECT_ATTEMPTS}
457
+ * times. Subsequent reconnects skip `sendHistory` because the server
458
+ * already holds the conversation state associated with the handle.
459
+ */
434
460
  // eslint-disable-next-line require-yield
435
461
  runLiveFlow(_invocationContext) {
436
462
  return __asyncGenerator(this, null, function* () {
@@ -469,13 +495,28 @@ class LlmAgent extends (_b = BaseAgent, _a = LLM_AGENT_SIGNATURE_SYMBOL, _b) {
469
495
  }
470
496
  }
471
497
  }
472
- for (const toolUnion of this.tools) {
498
+ const allTools = [...this.tools];
499
+ if (this.outputSchema && allTools.length > 0) {
500
+ const setModelResponseTool = new FunctionTool({
501
+ name: "set_model_response",
502
+ description: "Call this tool to submit your final response conforming to the output schema. Use this tool only when you have collected all the information and are ready to return the final answer.",
503
+ parameters: this.outputSchema,
504
+ execute: async (args, toolContext) => {
505
+ if (toolContext) {
506
+ toolContext.actions.skipSummarization = true;
507
+ }
508
+ return JSON.stringify(args);
509
+ }
510
+ });
511
+ allTools.push(setModelResponseTool);
512
+ }
513
+ for (const toolUnion of allTools) {
473
514
  const toolContext = new Context({ invocationContext });
474
515
  const tools = (yield new __await(convertToolUnionToTools(
475
516
  toolUnion,
476
517
  new ReadonlyContext(invocationContext)
477
518
  ))).filter((tool) => {
478
- return !llmRequest.allowedTools || llmRequest.allowedTools.includes(tool.name);
519
+ return !llmRequest.allowedTools || llmRequest.allowedTools.includes(tool.name) || tool.name === "set_model_response";
479
520
  });
480
521
  for (const tool of tools) {
481
522
  yield new __await(tool.processLlmRequest({ toolContext, llmRequest }));
@@ -594,7 +635,14 @@ class LlmAgent extends (_b = BaseAgent, _a = LLM_AGENT_SIGNATURE_SYMBOL, _b) {
594
635
  const mergedEvent = createEvent(__spreadValues(__spreadValues({}, modelResponseEvent), llmResponse));
595
636
  if (mergedEvent.content) {
596
637
  const functionCalls = getFunctionCalls(mergedEvent);
597
- if (functionCalls == null ? void 0 : functionCalls.length) {
638
+ const setModelResponseCall = functionCalls.find(
639
+ (call) => call.name === "set_model_response"
640
+ );
641
+ if (setModelResponseCall) {
642
+ const args = setModelResponseCall.args;
643
+ mergedEvent.content.parts = [{ text: JSON.stringify(args) }];
644
+ mergedEvent.actions.skipSummarization = true;
645
+ } else if (functionCalls && functionCalls.length) {
598
646
  populateClientFunctionCallId(mergedEvent);
599
647
  mergedEvent.longRunningToolIds = Array.from(
600
648
  getLongRunningFunctionCalls(functionCalls, llmRequest.toolsDict)
@@ -46,6 +46,13 @@ class AgentTransferLlmRequestProcessor extends BaseLlmRequestProcessor {
46
46
  }
47
47
  });
48
48
  }
49
+ /**
50
+ * Appends transfer instructions and registers the `transfer_to_agent` tool
51
+ * when the agent has reachable transfer targets.
52
+ *
53
+ * @param invocationContext - The current invocation context.
54
+ * @param llmRequest - The request to augment with transfer instructions and the transfer tool.
55
+ */
49
56
  // eslint-disable-next-line require-yield
50
57
  runAsync(invocationContext, llmRequest) {
51
58
  return __asyncGenerator(this, null, function* () {
@@ -41,6 +41,13 @@ import { setOutputSchema } from "../../models/llm_request.js";
41
41
  import { isLlmAgent } from "../llm_agent.js";
42
42
  import { BaseLlmRequestProcessor } from "./base_llm_processor.js";
43
43
  class BasicLlmRequestProcessor extends BaseLlmRequestProcessor {
44
+ /**
45
+ * Populates model name, generation config, output schema, and live connect
46
+ * settings on the request from the agent and run config.
47
+ *
48
+ * @param invocationContext - The current invocation context.
49
+ * @param llmRequest - The request object to populate in place.
50
+ */
44
51
  // eslint-disable-next-line require-yield
45
52
  runAsync(invocationContext, llmRequest) {
46
53
  return __asyncGenerator(this, null, function* () {
@@ -51,7 +58,7 @@ class BasicLlmRequestProcessor extends BaseLlmRequestProcessor {
51
58
  }
52
59
  llmRequest.model = agent.canonicalModel.model;
53
60
  llmRequest.config = __spreadValues({}, (_a = agent.generateContentConfig) != null ? _a : {});
54
- if (agent.outputSchema) {
61
+ if (agent.outputSchema && (!agent.tools || agent.tools.length === 0)) {
55
62
  setOutputSchema(llmRequest, agent.outputSchema);
56
63
  }
57
64
  if (invocationContext.runConfig) {