@google/adk 0.1.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 (311) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +9 -0
  3. package/dist/cjs/agents/active_streaming_tool.js +44 -0
  4. package/dist/cjs/agents/base_agent.js +245 -0
  5. package/dist/cjs/agents/base_llm_processor.js +44 -0
  6. package/dist/cjs/agents/callback_context.js +98 -0
  7. package/dist/cjs/agents/content_processor_utils.js +299 -0
  8. package/dist/cjs/agents/functions.js +394 -0
  9. package/dist/cjs/agents/instructions.js +110 -0
  10. package/dist/cjs/agents/invocation_context.js +109 -0
  11. package/dist/cjs/agents/live_request_queue.js +136 -0
  12. package/dist/cjs/agents/llm_agent.js +859 -0
  13. package/dist/cjs/agents/loop_agent.js +68 -0
  14. package/dist/cjs/agents/parallel_agent.js +78 -0
  15. package/dist/cjs/agents/readonly_context.js +68 -0
  16. package/dist/cjs/agents/run_config.js +74 -0
  17. package/dist/cjs/agents/sequential_agent.js +84 -0
  18. package/dist/cjs/agents/transcription_entry.js +27 -0
  19. package/dist/cjs/artifacts/base_artifact_service.js +27 -0
  20. package/dist/cjs/artifacts/in_memory_artifact_service.js +119 -0
  21. package/dist/cjs/auth/auth_credential.js +46 -0
  22. package/dist/cjs/auth/auth_handler.js +92 -0
  23. package/dist/cjs/auth/auth_schemes.js +62 -0
  24. package/dist/cjs/auth/auth_tool.js +27 -0
  25. package/dist/cjs/auth/credential_service/base_credential_service.js +27 -0
  26. package/dist/cjs/auth/credential_service/in_memory_credential_service.js +63 -0
  27. package/dist/cjs/code_executors/base_code_executor.js +76 -0
  28. package/dist/cjs/code_executors/built_in_code_executor.js +58 -0
  29. package/dist/cjs/code_executors/code_execution_utils.js +142 -0
  30. package/dist/cjs/code_executors/code_executor_context.js +198 -0
  31. package/dist/cjs/common.js +161 -0
  32. package/dist/cjs/events/event.js +107 -0
  33. package/dist/cjs/events/event_actions.js +83 -0
  34. package/dist/cjs/examples/base_example_provider.js +40 -0
  35. package/dist/cjs/examples/example.js +27 -0
  36. package/dist/cjs/examples/example_util.js +107 -0
  37. package/dist/cjs/index.js +40 -0
  38. package/dist/cjs/index.js.map +7 -0
  39. package/dist/cjs/index_web.js +33 -0
  40. package/dist/cjs/memory/base_memory_service.js +27 -0
  41. package/dist/cjs/memory/in_memory_memory_service.js +97 -0
  42. package/dist/cjs/memory/memory_entry.js +27 -0
  43. package/dist/cjs/models/base_llm.js +77 -0
  44. package/dist/cjs/models/base_llm_connection.js +27 -0
  45. package/dist/cjs/models/gemini_llm_connection.js +132 -0
  46. package/dist/cjs/models/google_llm.js +321 -0
  47. package/dist/cjs/models/llm_request.js +82 -0
  48. package/dist/cjs/models/llm_response.js +71 -0
  49. package/dist/cjs/models/registry.js +121 -0
  50. package/dist/cjs/package.json +1 -0
  51. package/dist/cjs/plugins/base_plugin.js +236 -0
  52. package/dist/cjs/plugins/logging_plugin.js +222 -0
  53. package/dist/cjs/plugins/plugin_manager.js +239 -0
  54. package/dist/cjs/plugins/security_plugin.js +153 -0
  55. package/dist/cjs/runner/in_memory_runner.js +58 -0
  56. package/dist/cjs/runner/runner.js +276 -0
  57. package/dist/cjs/sessions/base_session_service.js +71 -0
  58. package/dist/cjs/sessions/in_memory_session_service.js +184 -0
  59. package/dist/cjs/sessions/session.js +48 -0
  60. package/dist/cjs/sessions/state.js +101 -0
  61. package/dist/cjs/tools/agent_tool.js +134 -0
  62. package/dist/cjs/tools/base_tool.js +107 -0
  63. package/dist/cjs/tools/base_toolset.js +76 -0
  64. package/dist/cjs/tools/forwarding_artifact_service.js +71 -0
  65. package/dist/cjs/tools/function_tool.js +101 -0
  66. package/dist/cjs/tools/google_search_tool.js +76 -0
  67. package/dist/cjs/tools/long_running_tool.js +63 -0
  68. package/dist/cjs/tools/mcp/mcp_session_manager.js +65 -0
  69. package/dist/cjs/tools/mcp/mcp_tool.js +65 -0
  70. package/dist/cjs/tools/mcp/mcp_toolset.js +61 -0
  71. package/dist/cjs/tools/tool_confirmation.js +49 -0
  72. package/dist/cjs/tools/tool_context.js +129 -0
  73. package/dist/cjs/utils/deep_clone.js +44 -0
  74. package/dist/cjs/utils/env_aware_utils.js +83 -0
  75. package/dist/cjs/utils/gemini_schema_util.js +88 -0
  76. package/dist/cjs/utils/logger.js +121 -0
  77. package/dist/cjs/utils/model_name.js +64 -0
  78. package/dist/cjs/utils/simple_zod_to_json.js +191 -0
  79. package/dist/cjs/utils/variant_utils.js +55 -0
  80. package/dist/cjs/version.js +39 -0
  81. package/dist/esm/agents/active_streaming_tool.js +14 -0
  82. package/dist/esm/agents/base_agent.js +214 -0
  83. package/dist/esm/agents/base_llm_processor.js +13 -0
  84. package/dist/esm/agents/callback_context.js +68 -0
  85. package/dist/esm/agents/content_processor_utils.js +268 -0
  86. package/dist/esm/agents/functions.js +353 -0
  87. package/dist/esm/agents/instructions.js +80 -0
  88. package/dist/esm/agents/invocation_context.js +78 -0
  89. package/dist/esm/agents/live_request_queue.js +106 -0
  90. package/dist/esm/agents/llm_agent.js +828 -0
  91. package/dist/esm/agents/loop_agent.js +38 -0
  92. package/dist/esm/agents/parallel_agent.js +48 -0
  93. package/dist/esm/agents/readonly_context.js +38 -0
  94. package/dist/esm/agents/run_config.js +43 -0
  95. package/dist/esm/agents/sequential_agent.js +54 -0
  96. package/dist/esm/agents/transcription_entry.js +5 -0
  97. package/dist/esm/artifacts/base_artifact_service.js +5 -0
  98. package/dist/esm/artifacts/in_memory_artifact_service.js +89 -0
  99. package/dist/esm/auth/auth_credential.js +16 -0
  100. package/dist/esm/auth/auth_handler.js +62 -0
  101. package/dist/esm/auth/auth_schemes.js +31 -0
  102. package/dist/esm/auth/auth_tool.js +5 -0
  103. package/dist/esm/auth/credential_service/base_credential_service.js +5 -0
  104. package/dist/esm/auth/credential_service/in_memory_credential_service.js +33 -0
  105. package/dist/esm/code_executors/base_code_executor.js +46 -0
  106. package/dist/esm/code_executors/built_in_code_executor.js +28 -0
  107. package/dist/esm/code_executors/code_execution_utils.js +108 -0
  108. package/dist/esm/code_executors/code_executor_context.js +168 -0
  109. package/dist/esm/common.js +85 -0
  110. package/dist/esm/events/event.js +72 -0
  111. package/dist/esm/events/event_actions.js +52 -0
  112. package/dist/esm/examples/base_example_provider.js +10 -0
  113. package/dist/esm/examples/example.js +5 -0
  114. package/dist/esm/examples/example_util.js +76 -0
  115. package/dist/esm/index.js +40 -0
  116. package/dist/esm/index.js.map +7 -0
  117. package/dist/esm/index_web.js +6 -0
  118. package/dist/esm/memory/base_memory_service.js +5 -0
  119. package/dist/esm/memory/in_memory_memory_service.js +67 -0
  120. package/dist/esm/memory/memory_entry.js +5 -0
  121. package/dist/esm/models/base_llm.js +47 -0
  122. package/dist/esm/models/base_llm_connection.js +5 -0
  123. package/dist/esm/models/gemini_llm_connection.js +102 -0
  124. package/dist/esm/models/google_llm.js +291 -0
  125. package/dist/esm/models/llm_request.js +50 -0
  126. package/dist/esm/models/llm_response.js +41 -0
  127. package/dist/esm/models/registry.js +91 -0
  128. package/dist/esm/plugins/base_plugin.js +206 -0
  129. package/dist/esm/plugins/logging_plugin.js +192 -0
  130. package/dist/esm/plugins/plugin_manager.js +209 -0
  131. package/dist/esm/plugins/security_plugin.js +119 -0
  132. package/dist/esm/runner/in_memory_runner.js +28 -0
  133. package/dist/esm/runner/runner.js +246 -0
  134. package/dist/esm/sessions/base_session_service.js +41 -0
  135. package/dist/esm/sessions/in_memory_session_service.js +154 -0
  136. package/dist/esm/sessions/session.js +18 -0
  137. package/dist/esm/sessions/state.js +71 -0
  138. package/dist/esm/tools/agent_tool.js +104 -0
  139. package/dist/esm/tools/base_tool.js +77 -0
  140. package/dist/esm/tools/base_toolset.js +46 -0
  141. package/dist/esm/tools/forwarding_artifact_service.js +41 -0
  142. package/dist/esm/tools/function_tool.js +71 -0
  143. package/dist/esm/tools/google_search_tool.js +46 -0
  144. package/dist/esm/tools/long_running_tool.js +33 -0
  145. package/dist/esm/tools/mcp/mcp_session_manager.js +35 -0
  146. package/dist/esm/tools/mcp/mcp_tool.js +35 -0
  147. package/dist/esm/tools/mcp/mcp_toolset.js +31 -0
  148. package/dist/esm/tools/tool_confirmation.js +19 -0
  149. package/dist/esm/tools/tool_context.js +99 -0
  150. package/dist/esm/utils/deep_clone.js +14 -0
  151. package/dist/esm/utils/env_aware_utils.js +49 -0
  152. package/dist/esm/utils/gemini_schema_util.js +58 -0
  153. package/dist/esm/utils/logger.js +89 -0
  154. package/dist/esm/utils/model_name.js +31 -0
  155. package/dist/esm/utils/simple_zod_to_json.js +160 -0
  156. package/dist/esm/utils/variant_utils.js +24 -0
  157. package/dist/esm/version.js +9 -0
  158. package/dist/types/agents/active_streaming_tool.d.ts +29 -0
  159. package/dist/types/agents/base_agent.d.ts +167 -0
  160. package/dist/types/agents/base_llm_processor.d.ts +27 -0
  161. package/dist/types/agents/callback_context.d.ts +42 -0
  162. package/dist/types/agents/content_processor_utils.d.ts +36 -0
  163. package/dist/types/agents/functions.d.ts +90 -0
  164. package/dist/types/agents/instructions.d.ts +32 -0
  165. package/dist/types/agents/invocation_context.d.ts +155 -0
  166. package/dist/types/agents/live_request_queue.d.ts +67 -0
  167. package/dist/types/agents/llm_agent.d.ts +333 -0
  168. package/dist/types/agents/loop_agent.d.ts +31 -0
  169. package/dist/types/agents/parallel_agent.d.ts +21 -0
  170. package/dist/types/agents/readonly_context.d.ts +31 -0
  171. package/dist/types/agents/run_config.d.ts +76 -0
  172. package/dist/types/agents/sequential_agent.d.ts +26 -0
  173. package/dist/types/agents/transcription_entry.d.ts +17 -0
  174. package/dist/types/artifacts/base_artifact_service.d.ts +127 -0
  175. package/dist/types/artifacts/in_memory_artifact_service.d.ts +18 -0
  176. package/dist/types/auth/auth_credential.d.ts +227 -0
  177. package/dist/types/auth/auth_handler.d.ts +27 -0
  178. package/dist/types/auth/auth_schemes.d.ts +36 -0
  179. package/dist/types/auth/auth_tool.d.ts +51 -0
  180. package/dist/types/auth/credential_service/base_credential_service.d.ts +27 -0
  181. package/dist/types/auth/credential_service/in_memory_credential_service.d.ts +19 -0
  182. package/dist/types/code_executors/base_code_executor.d.ts +60 -0
  183. package/dist/types/code_executors/built_in_code_executor.d.ts +13 -0
  184. package/dist/types/code_executors/code_execution_utils.d.ts +99 -0
  185. package/dist/types/code_executors/code_executor_context.d.ts +92 -0
  186. package/dist/types/common.d.ts +51 -0
  187. package/dist/types/events/event.d.ts +81 -0
  188. package/dist/types/events/event_actions.d.ts +74 -0
  189. package/dist/types/examples/base_example_provider.d.ts +20 -0
  190. package/dist/types/examples/example.d.ts +19 -0
  191. package/dist/types/examples/example_util.d.ts +13 -0
  192. package/dist/types/index.d.ts +9 -0
  193. package/dist/types/index_web.d.ts +6 -0
  194. package/dist/types/memory/base_memory_service.d.ts +47 -0
  195. package/dist/types/memory/in_memory_memory_service.d.ts +18 -0
  196. package/dist/types/memory/memory_entry.d.ts +24 -0
  197. package/dist/types/models/base_llm.d.ts +46 -0
  198. package/dist/types/models/base_llm_connection.d.ts +51 -0
  199. package/dist/types/models/gemini_llm_connection.d.ts +54 -0
  200. package/dist/types/models/google_llm.d.ts +88 -0
  201. package/dist/types/models/llm_request.d.ts +49 -0
  202. package/dist/types/models/llm_response.d.ts +79 -0
  203. package/dist/types/models/registry.d.ts +45 -0
  204. package/dist/types/plugins/base_plugin.d.ts +310 -0
  205. package/dist/types/plugins/logging_plugin.d.ts +104 -0
  206. package/dist/types/plugins/plugin_manager.d.ts +155 -0
  207. package/dist/types/plugins/security_plugin.d.ts +60 -0
  208. package/dist/types/runner/in_memory_runner.d.ts +15 -0
  209. package/dist/types/runner/runner.d.ts +80 -0
  210. package/dist/types/sessions/base_session_service.d.ts +129 -0
  211. package/dist/types/sessions/in_memory_session_service.d.ts +32 -0
  212. package/dist/types/sessions/session.d.ts +46 -0
  213. package/dist/types/sessions/state.d.ts +57 -0
  214. package/dist/types/tools/agent_tool.d.ts +37 -0
  215. package/dist/types/tools/base_tool.d.ts +84 -0
  216. package/dist/types/tools/base_toolset.d.ts +64 -0
  217. package/dist/types/tools/forwarding_artifact_service.d.ts +21 -0
  218. package/dist/types/tools/function_tool.d.ts +48 -0
  219. package/dist/types/tools/google_search_tool.d.ts +18 -0
  220. package/dist/types/tools/long_running_tool.d.ts +18 -0
  221. package/dist/types/tools/mcp/mcp_session_manager.d.ts +57 -0
  222. package/dist/types/tools/mcp/mcp_tool.d.ts +30 -0
  223. package/dist/types/tools/mcp/mcp_toolset.d.ts +39 -0
  224. package/dist/types/tools/tool_confirmation.d.ts +25 -0
  225. package/dist/types/tools/tool_context.d.ts +63 -0
  226. package/dist/types/utils/deep_clone.d.ts +1 -0
  227. package/dist/types/utils/env_aware_utils.d.ts +31 -0
  228. package/dist/types/utils/gemini_schema_util.d.ts +23 -0
  229. package/dist/types/utils/logger.d.ts +41 -0
  230. package/dist/types/utils/model_name.d.ts +34 -0
  231. package/dist/types/utils/simple_zod_to_json.d.ts +12 -0
  232. package/dist/types/utils/variant_utils.d.ts +24 -0
  233. package/dist/types/version.d.ts +6 -0
  234. package/dist/web/agents/active_streaming_tool.js +14 -0
  235. package/dist/web/agents/base_agent.js +265 -0
  236. package/dist/web/agents/base_llm_processor.js +13 -0
  237. package/dist/web/agents/callback_context.js +68 -0
  238. package/dist/web/agents/content_processor_utils.js +268 -0
  239. package/dist/web/agents/functions.js +353 -0
  240. package/dist/web/agents/instructions.js +80 -0
  241. package/dist/web/agents/invocation_context.js +78 -0
  242. package/dist/web/agents/live_request_queue.js +124 -0
  243. package/dist/web/agents/llm_agent.js +973 -0
  244. package/dist/web/agents/loop_agent.js +71 -0
  245. package/dist/web/agents/parallel_agent.js +83 -0
  246. package/dist/web/agents/readonly_context.js +38 -0
  247. package/dist/web/agents/run_config.js +43 -0
  248. package/dist/web/agents/sequential_agent.js +99 -0
  249. package/dist/web/agents/transcription_entry.js +5 -0
  250. package/dist/web/artifacts/base_artifact_service.js +5 -0
  251. package/dist/web/artifacts/in_memory_artifact_service.js +89 -0
  252. package/dist/web/auth/auth_credential.js +16 -0
  253. package/dist/web/auth/auth_handler.js +62 -0
  254. package/dist/web/auth/auth_schemes.js +31 -0
  255. package/dist/web/auth/auth_tool.js +5 -0
  256. package/dist/web/auth/credential_service/base_credential_service.js +5 -0
  257. package/dist/web/auth/credential_service/in_memory_credential_service.js +33 -0
  258. package/dist/web/code_executors/base_code_executor.js +46 -0
  259. package/dist/web/code_executors/built_in_code_executor.js +28 -0
  260. package/dist/web/code_executors/code_execution_utils.js +105 -0
  261. package/dist/web/code_executors/code_executor_context.js +168 -0
  262. package/dist/web/common.js +85 -0
  263. package/dist/web/events/event.js +90 -0
  264. package/dist/web/events/event_actions.js +67 -0
  265. package/dist/web/examples/base_example_provider.js +10 -0
  266. package/dist/web/examples/example.js +5 -0
  267. package/dist/web/examples/example_util.js +75 -0
  268. package/dist/web/index.js +13 -0
  269. package/dist/web/index.js.map +7 -0
  270. package/dist/web/index_web.js +6 -0
  271. package/dist/web/memory/base_memory_service.js +5 -0
  272. package/dist/web/memory/in_memory_memory_service.js +67 -0
  273. package/dist/web/memory/memory_entry.js +5 -0
  274. package/dist/web/models/base_llm.js +47 -0
  275. package/dist/web/models/base_llm_connection.js +5 -0
  276. package/dist/web/models/gemini_llm_connection.js +120 -0
  277. package/dist/web/models/google_llm.js +332 -0
  278. package/dist/web/models/llm_request.js +50 -0
  279. package/dist/web/models/llm_response.js +41 -0
  280. package/dist/web/models/registry.js +91 -0
  281. package/dist/web/plugins/base_plugin.js +206 -0
  282. package/dist/web/plugins/logging_plugin.js +192 -0
  283. package/dist/web/plugins/plugin_manager.js +209 -0
  284. package/dist/web/plugins/security_plugin.js +119 -0
  285. package/dist/web/runner/in_memory_runner.js +28 -0
  286. package/dist/web/runner/runner.js +277 -0
  287. package/dist/web/sessions/base_session_service.js +41 -0
  288. package/dist/web/sessions/in_memory_session_service.js +154 -0
  289. package/dist/web/sessions/session.js +18 -0
  290. package/dist/web/sessions/state.js +87 -0
  291. package/dist/web/tools/agent_tool.js +118 -0
  292. package/dist/web/tools/base_tool.js +77 -0
  293. package/dist/web/tools/base_toolset.js +46 -0
  294. package/dist/web/tools/forwarding_artifact_service.js +41 -0
  295. package/dist/web/tools/function_tool.js +71 -0
  296. package/dist/web/tools/google_search_tool.js +46 -0
  297. package/dist/web/tools/long_running_tool.js +50 -0
  298. package/dist/web/tools/mcp/mcp_session_manager.js +35 -0
  299. package/dist/web/tools/mcp/mcp_tool.js +35 -0
  300. package/dist/web/tools/mcp/mcp_toolset.js +31 -0
  301. package/dist/web/tools/tool_confirmation.js +19 -0
  302. package/dist/web/tools/tool_context.js +99 -0
  303. package/dist/web/utils/deep_clone.js +14 -0
  304. package/dist/web/utils/env_aware_utils.js +49 -0
  305. package/dist/web/utils/gemini_schema_util.js +58 -0
  306. package/dist/web/utils/logger.js +89 -0
  307. package/dist/web/utils/model_name.js +31 -0
  308. package/dist/web/utils/simple_zod_to_json.js +174 -0
  309. package/dist/web/utils/variant_utils.js +24 -0
  310. package/dist/web/version.js +9 -0
  311. package/package.json +61 -0
@@ -0,0 +1,353 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { createEvent, getFunctionCalls } from "../events/event.js";
7
+ import { mergeEventActions } from "../events/event_actions.js";
8
+ import { ToolContext } from "../tools/tool_context.js";
9
+ import { randomUUID } from "../utils/env_aware_utils.js";
10
+ import { logger } from "../utils/logger.js";
11
+ const AF_FUNCTION_CALL_ID_PREFIX = "adk-";
12
+ const REQUEST_EUC_FUNCTION_CALL_NAME = "adk_request_credential";
13
+ const REQUEST_CONFIRMATION_FUNCTION_CALL_NAME = "adk_request_confirmation";
14
+ const functionsExportedForTestingOnly = {
15
+ handleFunctionCallList
16
+ };
17
+ function generateClientFunctionCallId() {
18
+ return "".concat(AF_FUNCTION_CALL_ID_PREFIX).concat(randomUUID());
19
+ }
20
+ function populateClientFunctionCallId(modelResponseEvent) {
21
+ const functionCalls = getFunctionCalls(modelResponseEvent);
22
+ if (!functionCalls) {
23
+ return;
24
+ }
25
+ for (const functionCall of functionCalls) {
26
+ if (!functionCall.id) {
27
+ functionCall.id = generateClientFunctionCallId();
28
+ }
29
+ }
30
+ }
31
+ function removeClientFunctionCallId(content) {
32
+ if (content && content.parts) {
33
+ for (const part of content.parts) {
34
+ if (part.functionCall && part.functionCall.id && part.functionCall.id.startsWith(AF_FUNCTION_CALL_ID_PREFIX)) {
35
+ part.functionCall.id = void 0;
36
+ }
37
+ if (part.functionResponse && part.functionResponse.id && part.functionResponse.id.startsWith(AF_FUNCTION_CALL_ID_PREFIX)) {
38
+ part.functionResponse.id = void 0;
39
+ }
40
+ }
41
+ }
42
+ }
43
+ function getLongRunningFunctionCalls(functionCalls, toolsDict) {
44
+ const longRunningToolIds = /* @__PURE__ */ new Set();
45
+ for (const functionCall of functionCalls) {
46
+ if (functionCall.name && functionCall.name in toolsDict && toolsDict[functionCall.name].isLongRunning && functionCall.id) {
47
+ longRunningToolIds.add(functionCall.id);
48
+ }
49
+ }
50
+ return longRunningToolIds;
51
+ }
52
+ function generateAuthEvent(invocationContext, functionResponseEvent) {
53
+ var _a;
54
+ if (!((_a = functionResponseEvent.actions) == null ? void 0 : _a.requestedAuthConfigs)) {
55
+ return void 0;
56
+ }
57
+ const parts = [];
58
+ const longRunningToolIds = /* @__PURE__ */ new Set();
59
+ for (const [functionCallId, authConfig] of Object.entries(
60
+ functionResponseEvent.actions.requestedAuthConfigs
61
+ )) {
62
+ const requestEucFunctionCall = {
63
+ name: REQUEST_EUC_FUNCTION_CALL_NAME,
64
+ args: {
65
+ "function_call_id": functionCallId,
66
+ "auth_config": authConfig
67
+ },
68
+ id: generateClientFunctionCallId()
69
+ };
70
+ longRunningToolIds.add(requestEucFunctionCall.id);
71
+ parts.push({ functionCall: requestEucFunctionCall });
72
+ }
73
+ return createEvent({
74
+ invocationId: invocationContext.invocationId,
75
+ author: invocationContext.agent.name,
76
+ branch: invocationContext.branch,
77
+ content: {
78
+ parts,
79
+ role: functionResponseEvent.content.role
80
+ },
81
+ longRunningToolIds: Array.from(longRunningToolIds)
82
+ });
83
+ }
84
+ function generateRequestConfirmationEvent({
85
+ invocationContext,
86
+ functionCallEvent,
87
+ functionResponseEvent
88
+ }) {
89
+ var _a, _b;
90
+ if (!((_a = functionResponseEvent.actions) == null ? void 0 : _a.requestedToolConfirmations)) {
91
+ return;
92
+ }
93
+ const parts = [];
94
+ const longRunningToolIds = /* @__PURE__ */ new Set();
95
+ const functionCalls = getFunctionCalls(functionCallEvent);
96
+ for (const [functionCallId, toolConfirmation] of Object.entries(
97
+ functionResponseEvent.actions.requestedToolConfirmations
98
+ )) {
99
+ const originalFunctionCall = (_b = functionCalls.find((call) => call.id === functionCallId)) != null ? _b : void 0;
100
+ if (!originalFunctionCall) {
101
+ continue;
102
+ }
103
+ const requestConfirmationFunctionCall = {
104
+ name: REQUEST_CONFIRMATION_FUNCTION_CALL_NAME,
105
+ args: {
106
+ "originalFunctionCall": originalFunctionCall,
107
+ "toolConfirmation": toolConfirmation
108
+ },
109
+ id: generateClientFunctionCallId()
110
+ };
111
+ longRunningToolIds.add(requestConfirmationFunctionCall.id);
112
+ parts.push({ functionCall: requestConfirmationFunctionCall });
113
+ }
114
+ return createEvent({
115
+ invocationId: invocationContext.invocationId,
116
+ author: invocationContext.agent.name,
117
+ branch: invocationContext.branch,
118
+ content: {
119
+ parts,
120
+ role: functionResponseEvent.content.role
121
+ },
122
+ longRunningToolIds: Array.from(longRunningToolIds)
123
+ });
124
+ }
125
+ async function callToolAsync(tool, args, toolContext) {
126
+ logger.debug("callToolAsync ".concat(tool.name));
127
+ return await tool.runAsync({ args, toolContext });
128
+ }
129
+ function buildResponseEvent(tool, functionResult, toolContext, invocationContext) {
130
+ let responseResult = functionResult;
131
+ if (typeof functionResult !== "object" || functionResult == null) {
132
+ responseResult = { result: functionResult };
133
+ }
134
+ const partFunctionResponse = {
135
+ functionResponse: {
136
+ name: tool.name,
137
+ response: responseResult,
138
+ id: toolContext.functionCallId
139
+ }
140
+ };
141
+ const content = {
142
+ role: "user",
143
+ parts: [partFunctionResponse]
144
+ };
145
+ return createEvent({
146
+ invocationId: invocationContext.invocationId,
147
+ author: invocationContext.agent.name,
148
+ content,
149
+ actions: toolContext.actions,
150
+ branch: invocationContext.branch
151
+ });
152
+ }
153
+ async function handleFunctionCallsAsync({
154
+ invocationContext,
155
+ functionCallEvent,
156
+ toolsDict,
157
+ beforeToolCallbacks,
158
+ afterToolCallbacks,
159
+ filters,
160
+ toolConfirmationDict
161
+ }) {
162
+ const functionCalls = getFunctionCalls(functionCallEvent);
163
+ return await handleFunctionCallList({
164
+ invocationContext,
165
+ functionCalls,
166
+ toolsDict,
167
+ beforeToolCallbacks,
168
+ afterToolCallbacks,
169
+ filters,
170
+ toolConfirmationDict
171
+ });
172
+ }
173
+ async function handleFunctionCallList({
174
+ invocationContext,
175
+ functionCalls,
176
+ toolsDict,
177
+ beforeToolCallbacks,
178
+ afterToolCallbacks,
179
+ filters,
180
+ toolConfirmationDict
181
+ }) {
182
+ var _a;
183
+ const functionResponseEvents = [];
184
+ const filteredFunctionCalls = functionCalls.filter((functionCall) => {
185
+ return !filters || functionCall.id && filters.has(functionCall.id);
186
+ });
187
+ for (const functionCall of filteredFunctionCalls) {
188
+ let toolConfirmation = void 0;
189
+ if (toolConfirmationDict && functionCall.id) {
190
+ toolConfirmation = toolConfirmationDict[functionCall.id];
191
+ }
192
+ const { tool, toolContext } = getToolAndContext(
193
+ {
194
+ invocationContext,
195
+ functionCall,
196
+ toolsDict,
197
+ toolConfirmation
198
+ }
199
+ );
200
+ logger.debug("execute_tool ".concat(tool.name));
201
+ const functionArgs = (_a = functionCall.args) != null ? _a : {};
202
+ let functionResponse = null;
203
+ functionResponse = await invocationContext.pluginManager.runBeforeToolCallback({
204
+ tool,
205
+ toolArgs: functionArgs,
206
+ toolContext
207
+ });
208
+ if (functionResponse == null) {
209
+ for (const callback of beforeToolCallbacks) {
210
+ functionResponse = await callback({
211
+ tool,
212
+ args: functionArgs,
213
+ context: toolContext
214
+ });
215
+ if (functionResponse) {
216
+ break;
217
+ }
218
+ }
219
+ }
220
+ if (functionResponse == null) {
221
+ try {
222
+ functionResponse = await callToolAsync(
223
+ tool,
224
+ functionArgs,
225
+ toolContext
226
+ );
227
+ } catch (e) {
228
+ if (e instanceof Error) {
229
+ const onToolErrorResponse = await invocationContext.pluginManager.runOnToolErrorCallback(
230
+ {
231
+ tool,
232
+ toolArgs: functionArgs,
233
+ toolContext,
234
+ error: e
235
+ }
236
+ );
237
+ if (onToolErrorResponse) {
238
+ functionResponse = onToolErrorResponse;
239
+ }
240
+ } else {
241
+ logger.error("Unknown error on tool execution type", e);
242
+ throw e;
243
+ }
244
+ }
245
+ }
246
+ let alteredFunctionResponse = await invocationContext.pluginManager.runAfterToolCallback({
247
+ tool,
248
+ toolArgs: functionArgs,
249
+ toolContext,
250
+ result: functionResponse
251
+ });
252
+ if (alteredFunctionResponse == null) {
253
+ for (const callback of afterToolCallbacks) {
254
+ alteredFunctionResponse = await callback({
255
+ tool,
256
+ args: functionArgs,
257
+ context: toolContext,
258
+ response: functionResponse
259
+ });
260
+ if (alteredFunctionResponse) {
261
+ break;
262
+ }
263
+ }
264
+ }
265
+ if (alteredFunctionResponse != null) {
266
+ functionResponse = alteredFunctionResponse;
267
+ }
268
+ if (tool.isLongRunning && !functionResponse) {
269
+ continue;
270
+ }
271
+ const functionResponseEvent = buildResponseEvent(
272
+ tool,
273
+ functionResponse,
274
+ toolContext,
275
+ invocationContext
276
+ );
277
+ logger.debug("traceToolCall", {
278
+ tool: tool.name,
279
+ args: functionArgs,
280
+ functionResponseEvent: functionResponseEvent.id
281
+ });
282
+ functionResponseEvents.push(functionResponseEvent);
283
+ }
284
+ if (!functionResponseEvents.length) {
285
+ return null;
286
+ }
287
+ const mergedEvent = mergeParallelFunctionResponseEvents(functionResponseEvents);
288
+ if (functionResponseEvents.length > 1) {
289
+ logger.debug("execute_tool (merged)");
290
+ logger.debug("traceMergedToolCalls", {
291
+ responseEventId: mergedEvent.id,
292
+ functionResponseEvent: mergedEvent.id
293
+ });
294
+ }
295
+ return mergedEvent;
296
+ }
297
+ function getToolAndContext({
298
+ invocationContext,
299
+ functionCall,
300
+ toolsDict,
301
+ toolConfirmation
302
+ }) {
303
+ if (!functionCall.name || !(functionCall.name in toolsDict)) {
304
+ throw new Error(
305
+ "Function ".concat(functionCall.name, " is not found in the toolsDict.")
306
+ );
307
+ }
308
+ const toolContext = new ToolContext({
309
+ invocationContext,
310
+ functionCallId: functionCall.id || void 0,
311
+ toolConfirmation
312
+ });
313
+ const tool = toolsDict[functionCall.name];
314
+ return { tool, toolContext };
315
+ }
316
+ function mergeParallelFunctionResponseEvents(functionResponseEvents) {
317
+ if (!functionResponseEvents.length) {
318
+ throw new Error("No function response events provided.");
319
+ }
320
+ if (functionResponseEvents.length === 1) {
321
+ return functionResponseEvents[0];
322
+ }
323
+ const mergedParts = [];
324
+ for (const event of functionResponseEvents) {
325
+ if (event.content && event.content.parts) {
326
+ mergedParts.push(...event.content.parts);
327
+ }
328
+ }
329
+ const baseEvent = functionResponseEvents[0];
330
+ const actionsList = functionResponseEvents.map((event) => event.actions || {});
331
+ const mergedActions = mergeEventActions(actionsList);
332
+ return createEvent({
333
+ author: baseEvent.author,
334
+ branch: baseEvent.branch,
335
+ content: { role: "user", parts: mergedParts },
336
+ actions: mergedActions,
337
+ timestamp: baseEvent.timestamp
338
+ });
339
+ }
340
+ export {
341
+ REQUEST_CONFIRMATION_FUNCTION_CALL_NAME,
342
+ REQUEST_EUC_FUNCTION_CALL_NAME,
343
+ functionsExportedForTestingOnly,
344
+ generateAuthEvent,
345
+ generateClientFunctionCallId,
346
+ generateRequestConfirmationEvent,
347
+ getLongRunningFunctionCalls,
348
+ handleFunctionCallList,
349
+ handleFunctionCallsAsync,
350
+ mergeParallelFunctionResponseEvents,
351
+ populateClientFunctionCallId,
352
+ removeClientFunctionCallId
353
+ };
@@ -0,0 +1,80 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { State } from "../sessions/state.js";
7
+ async function injectSessionState(template, readonlyContext) {
8
+ const invocationContext = readonlyContext.invocationContext;
9
+ async function replaceMatchedKeyWithItsValue(match) {
10
+ let key = match[0].replace(/^\{+/, "").replace(/\}+$/, "").trim();
11
+ const isOptional = key.endsWith("?");
12
+ if (isOptional) {
13
+ key = key.slice(0, -1);
14
+ }
15
+ if (key.startsWith("artifact.")) {
16
+ const fileName = key.substring("artifact.".length);
17
+ if (invocationContext.artifactService === void 0) {
18
+ throw new Error("Artifact service is not initialized.");
19
+ }
20
+ const artifact = await invocationContext.artifactService.loadArtifact({
21
+ appName: invocationContext.session.appName,
22
+ userId: invocationContext.session.userId,
23
+ sessionId: invocationContext.session.id,
24
+ filename: fileName
25
+ });
26
+ if (!artifact) {
27
+ throw new Error("Artifact ".concat(fileName, " not found."));
28
+ }
29
+ return String(artifact);
30
+ }
31
+ if (!isValidStateName(key)) {
32
+ return match[0];
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
+ const pattern = /\{+[^{}]*}+/g;
43
+ const result = [];
44
+ let lastEnd = 0;
45
+ const matches = template.matchAll(pattern);
46
+ for (const match of matches) {
47
+ result.push(template.slice(lastEnd, match.index));
48
+ const replacement = await replaceMatchedKeyWithItsValue(match);
49
+ result.push(replacement);
50
+ lastEnd = match.index + match[0].length;
51
+ }
52
+ result.push(template.slice(lastEnd));
53
+ return result.join("");
54
+ }
55
+ const isIdentifierPattern = /* @__PURE__ */ (() => {
56
+ return /^[a-zA-Z_][a-zA-Z0-9_]*$/;
57
+ })();
58
+ function isIdentifier(s) {
59
+ if (s === "" || s === void 0) {
60
+ return false;
61
+ }
62
+ return isIdentifierPattern.test(s);
63
+ }
64
+ const VALID_PREFIXES = [State.APP_PREFIX, State.USER_PREFIX, State.TEMP_PREFIX];
65
+ function isValidStateName(variableName) {
66
+ const parts = variableName.split(":");
67
+ if (parts.length === 0 || parts.length > 2) {
68
+ return false;
69
+ }
70
+ if (parts.length === 1) {
71
+ return isIdentifier(variableName);
72
+ }
73
+ if (VALID_PREFIXES.includes(parts[0] + ":")) {
74
+ return isIdentifier(parts[1]);
75
+ }
76
+ return false;
77
+ }
78
+ export {
79
+ injectSessionState
80
+ };
@@ -0,0 +1,78 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { randomUUID } from "../utils/env_aware_utils.js";
7
+ class InvocationCostManager {
8
+ constructor() {
9
+ this.numberOfLlmCalls = 0;
10
+ }
11
+ /**
12
+ * Increments the number of llm calls and enforces the limit.
13
+ *
14
+ * @param runConfig the run config of the invocation.
15
+ * @throws If number of llm calls made exceed the set threshold.
16
+ */
17
+ incrementAndEnforceLlmCallsLimit(runConfig) {
18
+ this.numberOfLlmCalls++;
19
+ if (runConfig && runConfig.maxLlmCalls > 0 && this.numberOfLlmCalls > runConfig.maxLlmCalls) {
20
+ throw new Error(
21
+ "Max number of llm calls limit of ".concat(runConfig.maxLlmCalls, " exceeded")
22
+ );
23
+ }
24
+ }
25
+ }
26
+ class InvocationContext {
27
+ /**
28
+ * @param params The parameters for creating an invocation context.
29
+ */
30
+ constructor(params) {
31
+ /**
32
+ * A container to keep track of different kinds of costs incurred as a part of
33
+ * this invocation.
34
+ */
35
+ this.invocationCostManager = new InvocationCostManager();
36
+ this.artifactService = params.artifactService;
37
+ this.sessionService = params.sessionService;
38
+ this.memoryService = params.memoryService;
39
+ this.invocationId = params.invocationId;
40
+ this.branch = params.branch;
41
+ this.agent = params.agent;
42
+ this.userContent = params.userContent;
43
+ this.session = params.session;
44
+ this.endInvocation = params.endInvocation || false;
45
+ this.transcriptionCache = params.transcriptionCache;
46
+ this.runConfig = params.runConfig;
47
+ this.liveRequestQueue = params.liveRequestQueue;
48
+ this.activeStreamingTools = params.activeStreamingTools;
49
+ this.pluginManager = params.pluginManager;
50
+ }
51
+ /**
52
+ * The app name of the current session.
53
+ */
54
+ get appName() {
55
+ return this.session.appName;
56
+ }
57
+ /**
58
+ * The user ID of the current session.
59
+ */
60
+ get userId() {
61
+ return this.session.userId;
62
+ }
63
+ /**
64
+ * Tracks number of llm calls made.
65
+ *
66
+ * @throws If number of llm calls made exceed the set threshold.
67
+ */
68
+ incrementLlmCallCount() {
69
+ this.invocationCostManager.incrementAndEnforceLlmCallsLimit(this.runConfig);
70
+ }
71
+ }
72
+ function newInvocationContextId() {
73
+ return "e-".concat(randomUUID());
74
+ }
75
+ export {
76
+ InvocationContext,
77
+ newInvocationContextId
78
+ };
@@ -0,0 +1,124 @@
1
+ var __knownSymbol = (name, symbol) => (symbol = Symbol[name]) ? symbol : Symbol.for("Symbol." + name);
2
+ var __await = function(promise, isYieldStar) {
3
+ this[0] = promise;
4
+ this[1] = isYieldStar;
5
+ };
6
+ var __asyncGenerator = (__this, __arguments, generator) => {
7
+ var resume = (k, v, yes, no) => {
8
+ try {
9
+ var x = generator[k](v), isAwait = (v = x.value) instanceof __await, done = x.done;
10
+ Promise.resolve(isAwait ? v[0] : v).then((y) => isAwait ? resume(k === "return" ? k : "next", v[1] ? { done: y.done, value: y.value } : y, yes, no) : yes({ value: y, done })).catch((e) => resume("throw", e, yes, no));
11
+ } catch (e) {
12
+ no(e);
13
+ }
14
+ }, method = (k) => it[k] = (x) => new Promise((yes, no) => resume(k, x, yes, no)), it = {};
15
+ return generator = generator.apply(__this, __arguments), it[__knownSymbol("asyncIterator")] = () => it, method("next"), method("throw"), method("return"), it;
16
+ };
17
+ /**
18
+ * @license
19
+ * Copyright 2025 Google LLC
20
+ * SPDX-License-Identifier: Apache-2.0
21
+ */
22
+ class LiveRequestQueue {
23
+ constructor() {
24
+ // Keeps track of the data that are waiting to be sent.
25
+ this.queue = [];
26
+ // Keeps track of the promises that are waiting for data.
27
+ this.resolveFnFifoQueue = [];
28
+ this.isClosed = false;
29
+ }
30
+ /**
31
+ * Adds a request to the queue. If there is a pending `get()` call, it
32
+ * will be resolved with the given request.
33
+ * @param req The request to send.
34
+ */
35
+ send(req) {
36
+ if (this.isClosed) {
37
+ throw new Error("Cannot send to a closed queue.");
38
+ }
39
+ if (this.resolveFnFifoQueue.length > 0) {
40
+ const resolve = this.resolveFnFifoQueue.shift();
41
+ resolve(req);
42
+ } else {
43
+ this.queue.push(req);
44
+ }
45
+ }
46
+ /**
47
+ * Retrieves a request from the queue. If the queue is empty, it will
48
+ * wait until a request is available.
49
+ * @returns A promise that resolves with the next available request.
50
+ */
51
+ async get() {
52
+ if (this.queue.length > 0) {
53
+ return this.queue.shift();
54
+ }
55
+ if (this.isClosed) {
56
+ return { close: true };
57
+ }
58
+ return new Promise((resolve) => {
59
+ this.resolveFnFifoQueue.push(resolve);
60
+ });
61
+ }
62
+ /**
63
+ * Sends a close signal to the queue.
64
+ */
65
+ close() {
66
+ if (this.isClosed) {
67
+ return;
68
+ }
69
+ this.isClosed = true;
70
+ while (this.resolveFnFifoQueue.length > 0 && this.queue.length > 0) {
71
+ const resolve = this.resolveFnFifoQueue.shift();
72
+ const req = this.queue.shift();
73
+ resolve(req);
74
+ }
75
+ const closeRequest = { close: true };
76
+ while (this.resolveFnFifoQueue.length > 0) {
77
+ const resolve = this.resolveFnFifoQueue.shift();
78
+ resolve(closeRequest);
79
+ }
80
+ }
81
+ /**
82
+ * Sends a content object to the queue.
83
+ * @param content The content to send.
84
+ */
85
+ sendContent(content) {
86
+ this.send({ content });
87
+ }
88
+ /**
89
+ * Sends a blob to the model in realtime mode.
90
+ * @param blob The blob to send.
91
+ */
92
+ sendRealtime(blob) {
93
+ this.send({ blob });
94
+ }
95
+ /**
96
+ * Sends an activity start signal to mark the beginning of user input.
97
+ */
98
+ sendActivityStart() {
99
+ this.send({ activityStart: {} });
100
+ }
101
+ /**
102
+ * Sends an activity end signal to mark the end of user input.
103
+ */
104
+ sendActivityEnd() {
105
+ this.send({ activityEnd: {} });
106
+ }
107
+ /**
108
+ * Implements the async iterator protocol.
109
+ */
110
+ [Symbol.asyncIterator]() {
111
+ return __asyncGenerator(this, null, function* () {
112
+ while (true) {
113
+ const request = yield new __await(this.get());
114
+ yield request;
115
+ if (request.close) {
116
+ break;
117
+ }
118
+ }
119
+ });
120
+ }
121
+ }
122
+ export {
123
+ LiveRequestQueue
124
+ };