@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,6 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export * from "./common.js";
@@ -0,0 +1,5 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
@@ -0,0 +1,67 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ class InMemoryMemoryService {
7
+ constructor() {
8
+ this.memories = [];
9
+ this.sessionEvents = {};
10
+ }
11
+ async addSessionToMemory(session) {
12
+ const userKey = getUserKey(session.appName, session.userId);
13
+ if (!this.sessionEvents[userKey]) {
14
+ this.sessionEvents[userKey] = {};
15
+ }
16
+ this.sessionEvents[userKey][session.id] = session.events.filter(
17
+ (event) => {
18
+ var _a, _b, _c;
19
+ return ((_c = (_b = (_a = event.content) == null ? void 0 : _a.parts) == null ? void 0 : _b.length) != null ? _c : 0) > 0;
20
+ }
21
+ );
22
+ }
23
+ async searchMemory(req) {
24
+ var _a, _b;
25
+ const userKey = getUserKey(req.appName, req.userId);
26
+ if (!this.sessionEvents[userKey]) {
27
+ return Promise.resolve({ memories: [] });
28
+ }
29
+ const wordsInQuery = req.query.toLowerCase().split(/\s+/);
30
+ const response = { memories: [] };
31
+ for (const sessionEvents of Object.values(this.sessionEvents[userKey])) {
32
+ for (const event of sessionEvents) {
33
+ if (!((_b = (_a = event.content) == null ? void 0 : _a.parts) == null ? void 0 : _b.length)) {
34
+ continue;
35
+ }
36
+ const joinedText = event.content.parts.map((part) => part.text).filter((text) => !!text).join(" ");
37
+ const wordsInEvent = extractWordsLower(joinedText);
38
+ if (!wordsInEvent.size) {
39
+ continue;
40
+ }
41
+ const matchQuery = wordsInQuery.some((queryWord) => wordsInEvent.has(queryWord));
42
+ if (matchQuery) {
43
+ response.memories.push({
44
+ content: event.content,
45
+ author: event.author,
46
+ timestamp: formatTimestamp(event.timestamp)
47
+ });
48
+ }
49
+ }
50
+ }
51
+ return response;
52
+ }
53
+ }
54
+ function getUserKey(appName, userId) {
55
+ return `${appName}/${userId}`;
56
+ }
57
+ function extractWordsLower(text) {
58
+ return new Set(
59
+ [...text.matchAll(/[A-Za-z]+/)].map((match) => match[0].toLowerCase())
60
+ );
61
+ }
62
+ function formatTimestamp(timestamp) {
63
+ return new Date(timestamp).toISOString();
64
+ }
65
+ export {
66
+ InMemoryMemoryService
67
+ };
@@ -0,0 +1,5 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
@@ -0,0 +1,47 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ class BaseLlm {
7
+ /**
8
+ * Creates an instance of BaseLLM.
9
+ *
10
+ * @param model The name of the LLM, e.g. gemini-1.5-flash or
11
+ * gemini-1.5-flash-001.
12
+ */
13
+ constructor(model) {
14
+ this.model = model;
15
+ }
16
+ /**
17
+ * Appends a user content, so that model can continue to output.
18
+ *
19
+ * @param llmRequest LlmRequest, the request to send to the LLM.
20
+ */
21
+ maybeAppendUserContent(llmRequest) {
22
+ var _a;
23
+ if (llmRequest.contents.length === 0) {
24
+ llmRequest.contents.push({
25
+ role: "user",
26
+ parts: [
27
+ { text: "Handle the requests as specified in the System Instruction." }
28
+ ]
29
+ });
30
+ }
31
+ if (((_a = llmRequest.contents[llmRequest.contents.length - 1]) == null ? void 0 : _a.role) !== "user") {
32
+ llmRequest.contents.push({
33
+ role: "user",
34
+ parts: [{
35
+ text: "Continue processing previous requests as instructed. Exit or provide a summary if no more outputs are needed."
36
+ }]
37
+ });
38
+ }
39
+ }
40
+ }
41
+ /**
42
+ * List of supported models in regex for LlmRegistry.
43
+ */
44
+ BaseLlm.supportedModels = [];
45
+ export {
46
+ BaseLlm
47
+ };
@@ -0,0 +1,5 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
@@ -0,0 +1,102 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { logger } from "../utils/logger.js";
7
+ class GeminiLlmConnection {
8
+ constructor(geminiSession) {
9
+ this.geminiSession = geminiSession;
10
+ }
11
+ /**
12
+ * Sends the conversation history to the gemini model.
13
+ *
14
+ * You call this method right after setting up the model connection.
15
+ * The model will respond if the last content is from user, otherwise it will
16
+ * wait for new user input before responding.
17
+ *
18
+ * @param history The conversation history to send to the model.
19
+ */
20
+ async sendHistory(history) {
21
+ const contents = history.filter(
22
+ (content) => {
23
+ var _a;
24
+ return content.parts && ((_a = content.parts[0]) == null ? void 0 : _a.text);
25
+ }
26
+ );
27
+ if (contents.length > 0) {
28
+ this.geminiSession.sendClientContent({
29
+ turns: contents,
30
+ turnComplete: contents[contents.length - 1].role === "user"
31
+ });
32
+ } else {
33
+ logger.info("no content is sent");
34
+ }
35
+ }
36
+ /**
37
+ * Sends a user content to the gemini model.
38
+ *
39
+ * The model will respond immediately upon receiving the content.
40
+ * If you send function responses, all parts in the content should be function
41
+ * responses.
42
+ *
43
+ * @param content The content to send to the model.
44
+ */
45
+ async sendContent(content) {
46
+ if (!content.parts) {
47
+ throw new Error("Content must have parts.");
48
+ }
49
+ if (content.parts[0].functionResponse) {
50
+ const functionResponses = content.parts.map((part) => part.functionResponse).filter((fr) => !!fr);
51
+ logger.debug("Sending LLM function response:", functionResponses);
52
+ this.geminiSession.sendToolResponse({
53
+ functionResponses
54
+ });
55
+ } else {
56
+ logger.debug("Sending LLM new content", content);
57
+ this.geminiSession.sendClientContent({
58
+ turns: [content],
59
+ turnComplete: true
60
+ });
61
+ }
62
+ }
63
+ /**
64
+ * Sends a chunk of audio or a frame of video to the model in realtime.
65
+ *
66
+ * @param blob The blob to send to the model.
67
+ */
68
+ async sendRealtime(blob) {
69
+ logger.debug("Sending LLM Blob:", blob);
70
+ this.geminiSession.sendRealtimeInput({ media: blob });
71
+ }
72
+ /**
73
+ * Builds a full text response.
74
+ *
75
+ * The text should not be partial and the returned LlmResponse is not be
76
+ * partial.
77
+ *
78
+ * @param text The text to be included in the response.
79
+ * @returns An LlmResponse containing the full text.
80
+ */
81
+ buildFullTextResponse(text) {
82
+ return {
83
+ content: {
84
+ role: "model",
85
+ parts: [{ text }]
86
+ }
87
+ };
88
+ }
89
+ // TODO(b/425992518): GenAI SDK inconsistent API, missing methods.
90
+ async *receive() {
91
+ throw new Error("Not Implemented.");
92
+ }
93
+ /**
94
+ * Closes the llm server connection.
95
+ */
96
+ async close() {
97
+ this.geminiSession.close();
98
+ }
99
+ }
100
+ export {
101
+ GeminiLlmConnection
102
+ };
@@ -0,0 +1,291 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { createPartFromText, FinishReason, GoogleGenAI } from "@google/genai";
7
+ import { isBrowser } from "../utils/env_aware_utils.js";
8
+ import { logger } from "../utils/logger.js";
9
+ import { GoogleLLMVariant } from "../utils/variant_utils.js";
10
+ import { version } from "../version.js";
11
+ import { BaseLlm } from "./base_llm.js";
12
+ import { GeminiLlmConnection } from "./gemini_llm_connection.js";
13
+ import { createLlmResponse } from "./llm_response.js";
14
+ const AGENT_ENGINE_TELEMETRY_TAG = "remote_reasoning_engine";
15
+ const AGENT_ENGINE_TELEMETRY_ENV_VARIABLE_NAME = "GOOGLE_CLOUD_AGENT_ENGINE_ID";
16
+ class Gemini extends BaseLlm {
17
+ /**
18
+ * @param params The parameters for creating a Gemini instance.
19
+ */
20
+ constructor({
21
+ model = "gemini-2.5-flash",
22
+ apiKey,
23
+ vertexai,
24
+ project,
25
+ location,
26
+ headers
27
+ } = {}) {
28
+ super(model);
29
+ this.project = project;
30
+ this.location = location;
31
+ this.apiKey = apiKey;
32
+ this.headers = headers;
33
+ const canReadEnv = typeof process === "object";
34
+ this.vertexai = !!vertexai;
35
+ if (!this.vertexai && canReadEnv) {
36
+ const vertexAIfromEnv = process.env["GOOGLE_GENAI_USE_VERTEXAI"];
37
+ if (vertexAIfromEnv) {
38
+ this.vertexai = vertexAIfromEnv.toLowerCase() === "true" || vertexAIfromEnv === "1";
39
+ }
40
+ }
41
+ if (this.vertexai) {
42
+ if (canReadEnv && !this.project) {
43
+ this.project = process.env["GOOGLE_CLOUD_PROJECT"];
44
+ }
45
+ if (canReadEnv && !this.location) {
46
+ this.location = process.env["GOOGLE_CLOUD_LOCATION"];
47
+ }
48
+ if (!this.project) {
49
+ throw new Error(
50
+ "VertexAI project must be provided via constructor or GOOGLE_CLOUD_PROJECT environment variable."
51
+ );
52
+ }
53
+ if (!this.location) {
54
+ throw new Error(
55
+ "VertexAI location must be provided via constructor or GOOGLE_CLOUD_LOCATION environment variable."
56
+ );
57
+ }
58
+ } else {
59
+ if (!this.apiKey && canReadEnv) {
60
+ this.apiKey = process.env["GOOGLE_GENAI_API_KEY"] || process.env["GEMINI_API_KEY"];
61
+ }
62
+ if (!this.apiKey) {
63
+ throw new Error(
64
+ "API key must be provided via constructor or GOOGLE_GENAI_API_KEY or GEMINI_API_KEY environment variable."
65
+ );
66
+ }
67
+ }
68
+ }
69
+ /**
70
+ * Sends a request to the Gemini model.
71
+ *
72
+ * @param llmRequest LlmRequest, the request to send to the Gemini model.
73
+ * @param stream bool = false, whether to do streaming call.
74
+ * @yields LlmResponse: The model response.
75
+ */
76
+ async *generateContentAsync(llmRequest, stream = false) {
77
+ var _a, _b, _c, _d, _e, _f, _g;
78
+ this.preprocessRequest(llmRequest);
79
+ this.maybeAppendUserContent(llmRequest);
80
+ logger.info(
81
+ `Sending out request, model: ${llmRequest.model}, backend: ${this.apiBackend}, stream: ${stream}`
82
+ );
83
+ if ((_a = llmRequest.config) == null ? void 0 : _a.httpOptions) {
84
+ llmRequest.config.httpOptions.headers = {
85
+ ...llmRequest.config.httpOptions.headers,
86
+ ...this.trackingHeaders
87
+ };
88
+ }
89
+ if (stream) {
90
+ const streamResult = await this.apiClient.models.generateContentStream({
91
+ model: (_b = llmRequest.model) != null ? _b : this.model,
92
+ contents: llmRequest.contents,
93
+ config: llmRequest.config
94
+ });
95
+ let thoughtText = "";
96
+ let text = "";
97
+ let usageMetadata;
98
+ let lastResponse;
99
+ for await (const response of streamResult) {
100
+ lastResponse = response;
101
+ const llmResponse = createLlmResponse(response);
102
+ usageMetadata = llmResponse.usageMetadata;
103
+ const firstPart = (_d = (_c = llmResponse.content) == null ? void 0 : _c.parts) == null ? void 0 : _d[0];
104
+ if (firstPart == null ? void 0 : firstPart.text) {
105
+ if ("thought" in firstPart && firstPart.thought) {
106
+ thoughtText += firstPart.text;
107
+ } else {
108
+ text += firstPart.text;
109
+ }
110
+ llmResponse.partial = true;
111
+ } else if ((thoughtText || text) && (!firstPart || !firstPart.inlineData)) {
112
+ const parts = [];
113
+ if (thoughtText) {
114
+ parts.push({ text: thoughtText, thought: true });
115
+ }
116
+ if (text) {
117
+ parts.push(createPartFromText(text));
118
+ }
119
+ yield {
120
+ content: {
121
+ role: "model",
122
+ parts
123
+ },
124
+ usageMetadata: llmResponse.usageMetadata
125
+ };
126
+ thoughtText = "";
127
+ text = "";
128
+ }
129
+ yield llmResponse;
130
+ }
131
+ if ((text || thoughtText) && ((_f = (_e = lastResponse == null ? void 0 : lastResponse.candidates) == null ? void 0 : _e[0]) == null ? void 0 : _f.finishReason) === FinishReason.STOP) {
132
+ const parts = [];
133
+ if (thoughtText) {
134
+ parts.push({ text: thoughtText, thought: true });
135
+ }
136
+ if (text) {
137
+ parts.push({ text });
138
+ }
139
+ yield {
140
+ content: {
141
+ role: "model",
142
+ parts
143
+ },
144
+ usageMetadata
145
+ };
146
+ }
147
+ } else {
148
+ const response = await this.apiClient.models.generateContent({
149
+ model: (_g = llmRequest.model) != null ? _g : this.model,
150
+ contents: llmRequest.contents,
151
+ config: llmRequest.config
152
+ });
153
+ yield createLlmResponse(response);
154
+ }
155
+ }
156
+ get apiClient() {
157
+ if (this._apiClient) {
158
+ return this._apiClient;
159
+ }
160
+ const combinedHeaders = {
161
+ ...this.trackingHeaders,
162
+ ...this.headers
163
+ };
164
+ if (this.vertexai) {
165
+ this._apiClient = new GoogleGenAI({
166
+ vertexai: this.vertexai,
167
+ project: this.project,
168
+ location: this.location,
169
+ httpOptions: { headers: combinedHeaders }
170
+ });
171
+ } else {
172
+ this._apiClient = new GoogleGenAI({
173
+ apiKey: this.apiKey,
174
+ httpOptions: { headers: combinedHeaders }
175
+ });
176
+ }
177
+ return this._apiClient;
178
+ }
179
+ get apiBackend() {
180
+ if (!this._apiBackend) {
181
+ this._apiBackend = this.apiClient.vertexai ? GoogleLLMVariant.VERTEX_AI : GoogleLLMVariant.GEMINI_API;
182
+ }
183
+ return this._apiBackend;
184
+ }
185
+ get trackingHeaders() {
186
+ if (!this._trackingHeaders) {
187
+ let frameworkLabel = `google-adk/${version}`;
188
+ if (!isBrowser() && process.env[AGENT_ENGINE_TELEMETRY_ENV_VARIABLE_NAME]) {
189
+ frameworkLabel = `${frameworkLabel}+${AGENT_ENGINE_TELEMETRY_TAG}`;
190
+ }
191
+ const languageLabel = `gl-typescript/${isBrowser() ? window.navigator.userAgent : process.version}`;
192
+ const versionHeaderValue = `${frameworkLabel} ${languageLabel}`;
193
+ this._trackingHeaders = {
194
+ "x-goog-api-client": versionHeaderValue,
195
+ "user-agent": versionHeaderValue
196
+ };
197
+ }
198
+ return this._trackingHeaders;
199
+ }
200
+ get liveApiVersion() {
201
+ if (!this._liveApiVersion) {
202
+ this._liveApiVersion = this.apiBackend === GoogleLLMVariant.VERTEX_AI ? "v1beta1" : "v1alpha";
203
+ }
204
+ return this._liveApiVersion;
205
+ }
206
+ get liveApiClient() {
207
+ if (!this._liveApiClient) {
208
+ this._liveApiClient = new GoogleGenAI({
209
+ apiKey: this.apiKey,
210
+ httpOptions: {
211
+ headers: this.trackingHeaders,
212
+ apiVersion: this.liveApiVersion
213
+ }
214
+ });
215
+ }
216
+ return this._liveApiClient;
217
+ }
218
+ /**
219
+ * Connects to the Gemini model and returns an llm connection.
220
+ *
221
+ * @param llmRequest LlmRequest, the request to send to the Gemini model.
222
+ * @returns BaseLlmConnection, the connection to the Gemini model.
223
+ */
224
+ async connect(llmRequest) {
225
+ var _a, _b, _c, _d;
226
+ if ((_a = llmRequest.liveConnectConfig) == null ? void 0 : _a.httpOptions) {
227
+ if (!llmRequest.liveConnectConfig.httpOptions.headers) {
228
+ llmRequest.liveConnectConfig.httpOptions.headers = {};
229
+ }
230
+ Object.assign(
231
+ llmRequest.liveConnectConfig.httpOptions.headers,
232
+ this.trackingHeaders
233
+ );
234
+ llmRequest.liveConnectConfig.httpOptions.apiVersion = this.liveApiVersion;
235
+ }
236
+ if ((_b = llmRequest.config) == null ? void 0 : _b.systemInstruction) {
237
+ llmRequest.liveConnectConfig.systemInstruction = {
238
+ role: "system",
239
+ // TODO - b/425992518: validate type casting works well.
240
+ parts: [createPartFromText(llmRequest.config.systemInstruction)]
241
+ };
242
+ }
243
+ llmRequest.liveConnectConfig.tools = (_c = llmRequest.config) == null ? void 0 : _c.tools;
244
+ const liveSession = await this.liveApiClient.live.connect({
245
+ model: (_d = llmRequest.model) != null ? _d : this.model,
246
+ config: llmRequest.liveConnectConfig,
247
+ callbacks: {
248
+ // TODO - b/425992518: GenAI SDK inconsistent API, missing methods.
249
+ onmessage: () => {
250
+ }
251
+ }
252
+ });
253
+ return new GeminiLlmConnection(liveSession);
254
+ }
255
+ preprocessRequest(llmRequest) {
256
+ if (this.apiBackend === GoogleLLMVariant.GEMINI_API) {
257
+ if (llmRequest.config) {
258
+ llmRequest.config.labels = void 0;
259
+ }
260
+ if (llmRequest.contents) {
261
+ for (const content of llmRequest.contents) {
262
+ if (!content.parts) continue;
263
+ for (const part of content.parts) {
264
+ removeDisplayNameIfPresent(part.inlineData);
265
+ removeDisplayNameIfPresent(part.fileData);
266
+ }
267
+ }
268
+ }
269
+ }
270
+ }
271
+ }
272
+ /**
273
+ * A list of model name patterns that are supported by this LLM.
274
+ *
275
+ * @returns A list of supported models.
276
+ */
277
+ Gemini.supportedModels = [
278
+ /gemini-.*/,
279
+ // fine-tuned vertex endpoint pattern
280
+ /projects\/.+\/locations\/.+\/endpoints\/.+/,
281
+ // vertex gemini long name
282
+ /projects\/.+\/locations\/.+\/publishers\/google\/models\/gemini.+/
283
+ ];
284
+ function removeDisplayNameIfPresent(dataObj) {
285
+ if (dataObj && dataObj.displayName) {
286
+ dataObj.displayName = void 0;
287
+ }
288
+ }
289
+ export {
290
+ Gemini
291
+ };
@@ -0,0 +1,50 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ function appendInstructions(llmRequest, instructions) {
7
+ if (!llmRequest.config) {
8
+ llmRequest.config = {};
9
+ }
10
+ const newInstructions = instructions.join("\n\n");
11
+ if (llmRequest.config.systemInstruction) {
12
+ llmRequest.config.systemInstruction += "\n\n" + newInstructions;
13
+ } else {
14
+ llmRequest.config.systemInstruction = newInstructions;
15
+ }
16
+ }
17
+ function appendTools(llmRequest, tools) {
18
+ if (!(tools == null ? void 0 : tools.length)) {
19
+ return;
20
+ }
21
+ const functionDeclarations = [];
22
+ for (const tool of tools) {
23
+ const declaration = tool._getDeclaration();
24
+ if (declaration) {
25
+ functionDeclarations.push(declaration);
26
+ llmRequest.toolsDict[tool.name] = tool;
27
+ }
28
+ }
29
+ if (functionDeclarations.length) {
30
+ if (!llmRequest.config) {
31
+ llmRequest.config = {};
32
+ }
33
+ if (!llmRequest.config.tools) {
34
+ llmRequest.config.tools = [];
35
+ }
36
+ llmRequest.config.tools.push({ functionDeclarations });
37
+ }
38
+ }
39
+ function setOutputSchema(llmRequest, schema) {
40
+ if (!llmRequest.config) {
41
+ llmRequest.config = {};
42
+ }
43
+ llmRequest.config.responseSchema = schema;
44
+ llmRequest.config.responseMimeType = "application/json";
45
+ }
46
+ export {
47
+ appendInstructions,
48
+ appendTools,
49
+ setOutputSchema
50
+ };
@@ -0,0 +1,41 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ function createLlmResponse(response) {
7
+ var _a;
8
+ const usageMetadata = response.usageMetadata;
9
+ if (response.candidates && response.candidates.length > 0) {
10
+ const candidate = response.candidates[0];
11
+ if (((_a = candidate.content) == null ? void 0 : _a.parts) && candidate.content.parts.length > 0) {
12
+ return {
13
+ content: candidate.content,
14
+ groundingMetadata: candidate.groundingMetadata,
15
+ usageMetadata,
16
+ finishReason: candidate.finishReason
17
+ };
18
+ }
19
+ return {
20
+ errorCode: candidate.finishReason,
21
+ errorMessage: candidate.finishMessage,
22
+ usageMetadata,
23
+ finishReason: candidate.finishReason
24
+ };
25
+ }
26
+ if (response.promptFeedback) {
27
+ return {
28
+ errorCode: response.promptFeedback.blockReason,
29
+ errorMessage: response.promptFeedback.blockReasonMessage,
30
+ usageMetadata
31
+ };
32
+ }
33
+ return {
34
+ errorCode: "UNKNOWN_ERROR",
35
+ errorMessage: "Unknown error.",
36
+ usageMetadata
37
+ };
38
+ }
39
+ export {
40
+ createLlmResponse
41
+ };