@google/adk 0.2.4 → 0.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 (191) hide show
  1. package/dist/cjs/agents/base_agent.js +52 -24
  2. package/dist/cjs/agents/callback_context.js +4 -1
  3. package/dist/cjs/agents/content_processor_utils.js +15 -7
  4. package/dist/cjs/agents/functions.js +79 -29
  5. package/dist/cjs/agents/invocation_context.js +3 -1
  6. package/dist/cjs/agents/llm_agent.js +188 -108
  7. package/dist/cjs/agents/loop_agent.js +18 -6
  8. package/dist/cjs/agents/parallel_agent.js +20 -7
  9. package/dist/cjs/agents/readonly_context.js +4 -1
  10. package/dist/cjs/agents/sequential_agent.js +34 -12
  11. package/dist/cjs/artifacts/gcs_artifact_service.js +28 -20
  12. package/dist/cjs/artifacts/in_memory_artifact_service.js +18 -4
  13. package/dist/cjs/auth/auth_handler.js +3 -1
  14. package/dist/cjs/code_executors/base_code_executor.js +14 -2
  15. package/dist/cjs/code_executors/built_in_code_executor.js +21 -5
  16. package/dist/cjs/code_executors/code_executor_context.js +5 -5
  17. package/dist/cjs/common.js +45 -0
  18. package/dist/cjs/events/event.js +1 -3
  19. package/dist/cjs/examples/base_example_provider.js +18 -2
  20. package/dist/cjs/examples/example_util.js +1 -1
  21. package/dist/cjs/index.js +19 -19
  22. package/dist/cjs/index.js.map +4 -4
  23. package/dist/cjs/memory/in_memory_memory_service.js +3 -1
  24. package/dist/cjs/models/base_llm.js +8 -4
  25. package/dist/cjs/models/gemini_llm_connection.js +1 -0
  26. package/dist/cjs/models/google_llm.js +3 -3
  27. package/dist/cjs/plugins/base_plugin.js +71 -49
  28. package/dist/cjs/plugins/logging_plugin.js +50 -13
  29. package/dist/cjs/plugins/plugin_manager.js +56 -24
  30. package/dist/cjs/plugins/security_plugin.js +5 -2
  31. package/dist/cjs/runner/runner.js +126 -101
  32. package/dist/cjs/sessions/in_memory_session_service.js +38 -14
  33. package/dist/cjs/telemetry/google_cloud.js +7 -9
  34. package/dist/cjs/telemetry/setup.js +15 -7
  35. package/dist/cjs/telemetry/tracing.js +37 -15
  36. package/dist/cjs/tools/agent_tool.js +26 -13
  37. package/dist/cjs/tools/base_tool.js +19 -7
  38. package/dist/cjs/tools/forwarding_artifact_service.js +1 -1
  39. package/dist/cjs/tools/function_tool.js +15 -7
  40. package/dist/cjs/tools/google_search_tool.js +8 -4
  41. package/dist/cjs/tools/mcp/mcp_session_manager.js +16 -10
  42. package/dist/cjs/tools/mcp/mcp_tool.js +1 -3
  43. package/dist/cjs/tools/mcp/mcp_toolset.js +1 -1
  44. package/dist/cjs/tools/tool_context.js +4 -9
  45. package/dist/cjs/utils/env_aware_utils.js +1 -1
  46. package/dist/cjs/utils/gemini_schema_util.js +10 -4
  47. package/dist/cjs/utils/logger.js +47 -3
  48. package/dist/cjs/utils/simple_zod_to_json.js +100 -141
  49. package/dist/cjs/utils/variant_utils.js +1 -1
  50. package/dist/cjs/version.js +1 -1
  51. package/dist/esm/agents/base_agent.js +57 -25
  52. package/dist/esm/agents/callback_context.js +4 -1
  53. package/dist/esm/agents/content_processor_utils.js +25 -9
  54. package/dist/esm/agents/functions.js +83 -29
  55. package/dist/esm/agents/invocation_context.js +3 -1
  56. package/dist/esm/agents/llm_agent.js +228 -116
  57. package/dist/esm/agents/loop_agent.js +16 -5
  58. package/dist/esm/agents/parallel_agent.js +18 -6
  59. package/dist/esm/agents/readonly_context.js +4 -1
  60. package/dist/esm/agents/sequential_agent.js +33 -12
  61. package/dist/esm/artifacts/gcs_artifact_service.js +28 -20
  62. package/dist/esm/artifacts/in_memory_artifact_service.js +18 -4
  63. package/dist/esm/auth/auth_handler.js +3 -1
  64. package/dist/esm/code_executors/base_code_executor.js +12 -1
  65. package/dist/esm/code_executors/built_in_code_executor.js +19 -4
  66. package/dist/esm/code_executors/code_executor_context.js +5 -5
  67. package/dist/esm/common.js +56 -11
  68. package/dist/esm/events/event.js +1 -3
  69. package/dist/esm/examples/base_example_provider.js +16 -1
  70. package/dist/esm/examples/example_util.js +4 -2
  71. package/dist/esm/index.js +19 -19
  72. package/dist/esm/index.js.map +4 -4
  73. package/dist/esm/memory/in_memory_memory_service.js +3 -1
  74. package/dist/esm/models/base_llm.js +8 -4
  75. package/dist/esm/models/gemini_llm_connection.js +1 -0
  76. package/dist/esm/models/google_llm.js +8 -4
  77. package/dist/esm/plugins/base_plugin.js +71 -49
  78. package/dist/esm/plugins/logging_plugin.js +55 -14
  79. package/dist/esm/plugins/plugin_manager.js +56 -24
  80. package/dist/esm/plugins/security_plugin.js +5 -2
  81. package/dist/esm/runner/runner.js +139 -105
  82. package/dist/esm/sessions/in_memory_session_service.js +41 -15
  83. package/dist/esm/telemetry/google_cloud.js +7 -9
  84. package/dist/esm/telemetry/setup.js +23 -9
  85. package/dist/esm/telemetry/tracing.js +37 -15
  86. package/dist/esm/tools/agent_tool.js +25 -13
  87. package/dist/esm/tools/base_tool.js +17 -6
  88. package/dist/esm/tools/forwarding_artifact_service.js +1 -1
  89. package/dist/esm/tools/function_tool.js +13 -8
  90. package/dist/esm/tools/google_search_tool.js +6 -3
  91. package/dist/esm/tools/long_running_tool.js +3 -1
  92. package/dist/esm/tools/mcp/mcp_session_manager.js +22 -12
  93. package/dist/esm/tools/mcp/mcp_tool.js +1 -3
  94. package/dist/esm/tools/mcp/mcp_toolset.js +1 -1
  95. package/dist/esm/tools/tool_context.js +4 -9
  96. package/dist/esm/utils/env_aware_utils.js +1 -1
  97. package/dist/esm/utils/gemini_schema_util.js +10 -4
  98. package/dist/esm/utils/logger.js +43 -2
  99. package/dist/esm/utils/simple_zod_to_json.js +102 -141
  100. package/dist/esm/utils/variant_utils.js +1 -1
  101. package/dist/esm/version.js +1 -1
  102. package/dist/types/agents/base_agent.d.ts +16 -4
  103. package/dist/types/agents/callback_context.d.ts +1 -1
  104. package/dist/types/agents/invocation_context.d.ts +4 -2
  105. package/dist/types/agents/llm_agent.d.ts +43 -31
  106. package/dist/types/agents/loop_agent.d.ts +17 -1
  107. package/dist/types/agents/parallel_agent.d.ts +17 -1
  108. package/dist/types/agents/sequential_agent.d.ts +17 -1
  109. package/dist/types/artifacts/in_memory_artifact_service.d.ts +3 -3
  110. package/dist/types/auth/auth_schemes.d.ts +5 -2
  111. package/dist/types/code_executors/base_code_executor.d.ts +14 -0
  112. package/dist/types/code_executors/built_in_code_executor.d.ts +20 -1
  113. package/dist/types/code_executors/code_executor_context.d.ts +2 -4
  114. package/dist/types/common.d.ts +40 -15
  115. package/dist/types/examples/base_example_provider.d.ts +16 -0
  116. package/dist/types/index.d.ts +3 -3
  117. package/dist/types/models/base_llm_connection.d.ts +1 -1
  118. package/dist/types/models/llm_response.d.ts +1 -1
  119. package/dist/types/plugins/base_plugin.d.ts +50 -40
  120. package/dist/types/plugins/logging_plugin.d.ts +12 -12
  121. package/dist/types/plugins/plugin_manager.d.ts +12 -12
  122. package/dist/types/plugins/security_plugin.d.ts +1 -1
  123. package/dist/types/runner/runner.d.ts +18 -10
  124. package/dist/types/sessions/in_memory_session_service.d.ts +5 -5
  125. package/dist/types/telemetry/setup.d.ts +1 -1
  126. package/dist/types/telemetry/tracing.d.ts +7 -6
  127. package/dist/types/tools/agent_tool.d.ts +15 -1
  128. package/dist/types/tools/base_tool.d.ts +15 -1
  129. package/dist/types/tools/base_toolset.d.ts +2 -1
  130. package/dist/types/tools/forwarding_artifact_service.d.ts +2 -2
  131. package/dist/types/tools/function_tool.d.ts +18 -4
  132. package/dist/types/tools/google_search_tool.d.ts +5 -6
  133. package/dist/types/tools/mcp/mcp_session_manager.d.ts +10 -3
  134. package/dist/types/tools/mcp/mcp_toolset.d.ts +1 -2
  135. package/dist/types/tools/tool_context.d.ts +1 -1
  136. package/dist/types/utils/gemini_schema_util.d.ts +4 -12
  137. package/dist/types/utils/logger.d.ts +11 -10
  138. package/dist/types/utils/simple_zod_to_json.d.ts +5 -4
  139. package/dist/types/version.d.ts +1 -1
  140. package/dist/web/agents/base_agent.js +103 -36
  141. package/dist/web/agents/callback_context.js +4 -1
  142. package/dist/web/agents/content_processor_utils.js +25 -9
  143. package/dist/web/agents/functions.js +83 -29
  144. package/dist/web/agents/invocation_context.js +3 -1
  145. package/dist/web/agents/llm_agent.js +282 -137
  146. package/dist/web/agents/loop_agent.js +16 -5
  147. package/dist/web/agents/parallel_agent.js +18 -6
  148. package/dist/web/agents/readonly_context.js +4 -1
  149. package/dist/web/agents/sequential_agent.js +33 -12
  150. package/dist/web/artifacts/gcs_artifact_service.js +25 -17
  151. package/dist/web/artifacts/in_memory_artifact_service.js +18 -4
  152. package/dist/web/auth/auth_handler.js +3 -1
  153. package/dist/web/code_executors/base_code_executor.js +12 -1
  154. package/dist/web/code_executors/built_in_code_executor.js +19 -4
  155. package/dist/web/code_executors/code_executor_context.js +5 -5
  156. package/dist/web/common.js +56 -11
  157. package/dist/web/events/event.js +1 -3
  158. package/dist/web/examples/base_example_provider.js +16 -1
  159. package/dist/web/examples/example_util.js +4 -2
  160. package/dist/web/index.js +1 -1
  161. package/dist/web/index.js.map +4 -4
  162. package/dist/web/memory/in_memory_memory_service.js +3 -1
  163. package/dist/web/models/base_llm.js +8 -4
  164. package/dist/web/models/gemini_llm_connection.js +1 -0
  165. package/dist/web/models/google_llm.js +8 -4
  166. package/dist/web/plugins/base_plugin.js +71 -49
  167. package/dist/web/plugins/logging_plugin.js +55 -14
  168. package/dist/web/plugins/plugin_manager.js +56 -24
  169. package/dist/web/plugins/security_plugin.js +5 -2
  170. package/dist/web/runner/runner.js +186 -119
  171. package/dist/web/sessions/in_memory_session_service.js +41 -15
  172. package/dist/web/telemetry/google_cloud.js +7 -9
  173. package/dist/web/telemetry/setup.js +23 -9
  174. package/dist/web/telemetry/tracing.js +37 -15
  175. package/dist/web/tools/agent_tool.js +25 -13
  176. package/dist/web/tools/base_tool.js +17 -6
  177. package/dist/web/tools/forwarding_artifact_service.js +1 -1
  178. package/dist/web/tools/function_tool.js +13 -8
  179. package/dist/web/tools/google_search_tool.js +6 -3
  180. package/dist/web/tools/long_running_tool.js +3 -1
  181. package/dist/web/tools/mcp/mcp_session_manager.js +22 -12
  182. package/dist/web/tools/mcp/mcp_tool.js +1 -3
  183. package/dist/web/tools/mcp/mcp_toolset.js +1 -1
  184. package/dist/web/tools/tool_context.js +4 -9
  185. package/dist/web/utils/env_aware_utils.js +1 -1
  186. package/dist/web/utils/gemini_schema_util.js +10 -4
  187. package/dist/web/utils/logger.js +43 -2
  188. package/dist/web/utils/simple_zod_to_json.js +102 -155
  189. package/dist/web/utils/variant_utils.js +1 -1
  190. package/dist/web/version.js +1 -1
  191. package/package.json +5 -3
@@ -4,14 +4,24 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
  import { createPartFromText } from "@google/genai";
7
- import { trace } from "@opentelemetry/api";
8
- import { InvocationContext, newInvocationContextId } from "../agents/invocation_context.js";
9
- import { LlmAgent } from "../agents/llm_agent.js";
7
+ import { context, trace } from "@opentelemetry/api";
8
+ import {
9
+ InvocationContext,
10
+ newInvocationContextId
11
+ } from "../agents/invocation_context.js";
12
+ import { isLlmAgent } from "../agents/llm_agent.js";
10
13
  import { createRunConfig } from "../agents/run_config.js";
11
- import { BuiltInCodeExecutor } from "../code_executors/built_in_code_executor.js";
14
+ import {
15
+ BuiltInCodeExecutor,
16
+ isBuiltInCodeExecutor
17
+ } from "../code_executors/built_in_code_executor.js";
12
18
  import { createEvent, getFunctionCalls } from "../events/event.js";
13
19
  import { createEventActions } from "../events/event_actions.js";
14
20
  import { PluginManager } from "../plugins/plugin_manager.js";
21
+ import {
22
+ runAsyncGeneratorWithOtelContext,
23
+ tracer
24
+ } from "../telemetry/tracing.js";
15
25
  import { logger } from "../utils/logger.js";
16
26
  import { isGemini2OrAbove } from "../utils/model_name.js";
17
27
  class Runner {
@@ -29,112 +39,132 @@ class Runner {
29
39
  * Runs the agent with the given message, and returns an async generator of
30
40
  * events.
31
41
  *
32
- * @param userId The user ID of the session.
33
- * @param sessionId The session ID of the session.
34
- * @param newMessage A new message to append to the session.
35
- * @param stateDelta An optional state delta to apply to the session.
36
- * @param runConfig The run config for the agent.
42
+ * @param params.userId The user ID of the session.
43
+ * @param params.sessionId The session ID of the session.
44
+ * @param params.newMessage A new message to append to the session.
45
+ * @param params.stateDelta An optional state delta to apply to the session.
46
+ * @param params.runConfig The run config for the agent.
37
47
  * @yields The events generated by the agent.
38
48
  */
39
49
  // TODO - b/425992518: user, sessionId, and runConfig can be internalized.
40
- async *runAsync({
41
- userId,
42
- sessionId,
43
- newMessage,
44
- stateDelta,
45
- runConfig
46
- }) {
47
- var _a;
48
- runConfig = createRunConfig(runConfig);
49
- const span = trace.getTracer("gcp.vertex.agent").startSpan("invocation");
50
+ async *runAsync(params) {
51
+ const { userId, sessionId, stateDelta } = params;
52
+ const runConfig = createRunConfig(params.runConfig);
53
+ let newMessage = params.newMessage;
54
+ const span = tracer.startSpan("invocation");
55
+ const ctx = trace.setSpan(context.active(), span);
50
56
  try {
51
- const session = await this.sessionService.getSession({ appName: this.appName, userId, sessionId });
52
- if (!session) {
53
- if (!this.appName) {
54
- throw new Error(
55
- `Session lookup failed: appName must be provided in runner constructor`
56
- );
57
- }
58
- throw new Error(`Session not found: ${sessionId}`);
59
- }
60
- if (runConfig.supportCfc && this.agent instanceof LlmAgent) {
61
- const modelName = this.agent.canonicalModel.model;
62
- if (!isGemini2OrAbove(modelName)) {
63
- throw new Error(`CFC is not supported for model: ${modelName} in agent: ${this.agent.name}`);
64
- }
65
- if (!(this.agent.codeExecutor instanceof BuiltInCodeExecutor)) {
66
- this.agent.codeExecutor = new BuiltInCodeExecutor();
67
- }
68
- }
69
- const invocationContext = new InvocationContext({
70
- artifactService: this.artifactService,
71
- sessionService: this.sessionService,
72
- memoryService: this.memoryService,
73
- credentialService: this.credentialService,
74
- invocationId: newInvocationContextId(),
75
- agent: this.agent,
76
- session,
77
- userContent: newMessage,
78
- runConfig,
79
- pluginManager: this.pluginManager
80
- });
81
- const pluginUserMessage = await this.pluginManager.runOnUserMessageCallback({
82
- userMessage: newMessage,
83
- invocationContext
84
- });
85
- if (pluginUserMessage) {
86
- newMessage = pluginUserMessage;
87
- }
88
- if (newMessage) {
89
- if (!((_a = newMessage.parts) == null ? void 0 : _a.length)) {
90
- throw new Error("No parts in the newMessage.");
91
- }
92
- if (runConfig.saveInputBlobsAsArtifacts) {
93
- await this.saveArtifacts(
94
- invocationContext.invocationId,
95
- session.userId,
96
- session.id,
97
- newMessage
98
- );
99
- }
100
- await this.sessionService.appendEvent({
101
- session,
102
- event: createEvent({
103
- invocationId: invocationContext.invocationId,
104
- author: "user",
105
- actions: stateDelta ? createEventActions({ stateDelta }) : void 0,
106
- content: newMessage
107
- })
108
- });
109
- }
110
- invocationContext.agent = this.determineAgentForResumption(session, this.agent);
111
- const beforeRunCallbackResponse = await this.pluginManager.runBeforeRunCallback({ invocationContext });
112
- if (beforeRunCallbackResponse) {
113
- const earlyExitEvent = createEvent({
114
- invocationId: invocationContext.invocationId,
115
- author: "model",
116
- content: beforeRunCallbackResponse
117
- });
118
- await this.sessionService.appendEvent({ session, event: earlyExitEvent });
119
- yield earlyExitEvent;
120
- } else {
121
- for await (const event of invocationContext.agent.runAsync(
122
- invocationContext
123
- )) {
124
- if (!event.partial) {
125
- await this.sessionService.appendEvent({ session, event });
57
+ yield* runAsyncGeneratorWithOtelContext(
58
+ ctx,
59
+ this,
60
+ async function* () {
61
+ var _a;
62
+ const session = await this.sessionService.getSession({
63
+ appName: this.appName,
64
+ userId,
65
+ sessionId
66
+ });
67
+ if (!session) {
68
+ if (!this.appName) {
69
+ throw new Error(
70
+ `Session lookup failed: appName must be provided in runner constructor`
71
+ );
72
+ }
73
+ throw new Error(`Session not found: ${sessionId}`);
126
74
  }
127
- const modifiedEvent = await this.pluginManager.runOnEventCallback(
128
- { invocationContext, event }
75
+ if (runConfig.supportCfc && isLlmAgent(this.agent)) {
76
+ const modelName = this.agent.canonicalModel.model;
77
+ if (!isGemini2OrAbove(modelName)) {
78
+ throw new Error(
79
+ `CFC is not supported for model: ${modelName} in agent: ${this.agent.name}`
80
+ );
81
+ }
82
+ if (!isBuiltInCodeExecutor(this.agent.codeExecutor)) {
83
+ this.agent.codeExecutor = new BuiltInCodeExecutor();
84
+ }
85
+ }
86
+ const invocationContext = new InvocationContext({
87
+ artifactService: this.artifactService,
88
+ sessionService: this.sessionService,
89
+ memoryService: this.memoryService,
90
+ credentialService: this.credentialService,
91
+ invocationId: newInvocationContextId(),
92
+ agent: this.agent,
93
+ session,
94
+ userContent: newMessage,
95
+ runConfig,
96
+ pluginManager: this.pluginManager
97
+ });
98
+ const pluginUserMessage = await this.pluginManager.runOnUserMessageCallback({
99
+ userMessage: newMessage,
100
+ invocationContext
101
+ });
102
+ if (pluginUserMessage) {
103
+ newMessage = pluginUserMessage;
104
+ }
105
+ if (newMessage) {
106
+ if (!((_a = newMessage.parts) == null ? void 0 : _a.length)) {
107
+ throw new Error("No parts in the newMessage.");
108
+ }
109
+ if (runConfig.saveInputBlobsAsArtifacts) {
110
+ await this.saveArtifacts(
111
+ invocationContext.invocationId,
112
+ session.userId,
113
+ session.id,
114
+ newMessage
115
+ );
116
+ }
117
+ await this.sessionService.appendEvent({
118
+ session,
119
+ event: createEvent({
120
+ invocationId: invocationContext.invocationId,
121
+ author: "user",
122
+ actions: stateDelta ? createEventActions({ stateDelta }) : void 0,
123
+ content: newMessage
124
+ })
125
+ });
126
+ }
127
+ invocationContext.agent = this.determineAgentForResumption(
128
+ session,
129
+ this.agent
129
130
  );
130
- if (modifiedEvent) {
131
- yield modifiedEvent;
132
- } else {
133
- yield event;
131
+ if (newMessage) {
132
+ const beforeRunCallbackResponse = await this.pluginManager.runBeforeRunCallback({
133
+ invocationContext
134
+ });
135
+ if (beforeRunCallbackResponse) {
136
+ const earlyExitEvent = createEvent({
137
+ invocationId: invocationContext.invocationId,
138
+ author: "model",
139
+ content: beforeRunCallbackResponse
140
+ });
141
+ await this.sessionService.appendEvent({
142
+ session,
143
+ event: earlyExitEvent
144
+ });
145
+ yield earlyExitEvent;
146
+ } else {
147
+ for await (const event of invocationContext.agent.runAsync(
148
+ invocationContext
149
+ )) {
150
+ if (!event.partial) {
151
+ await this.sessionService.appendEvent({ session, event });
152
+ }
153
+ const modifiedEvent = await this.pluginManager.runOnEventCallback({
154
+ invocationContext,
155
+ event
156
+ });
157
+ if (modifiedEvent) {
158
+ yield modifiedEvent;
159
+ } else {
160
+ yield event;
161
+ }
162
+ }
163
+ await this.pluginManager.runAfterRunCallback({ invocationContext });
164
+ }
134
165
  }
135
166
  }
136
- }
137
- await this.pluginManager.runAfterRunCallback({ invocationContext });
167
+ );
138
168
  } finally {
139
169
  span.end();
140
170
  }
@@ -193,7 +223,9 @@ class Runner {
193
223
  }
194
224
  const agent = rootAgent.findSubAgent(event2.author);
195
225
  if (!agent) {
196
- logger.warn(`Event from an unknown agent: ${event2.author}, event id: ${event2.id}`);
226
+ logger.warn(
227
+ `Event from an unknown agent: ${event2.author}, event id: ${event2.id}`
228
+ );
197
229
  continue;
198
230
  }
199
231
  if (this.isRoutableLlmAgent(agent)) {
@@ -216,7 +248,7 @@ class Runner {
216
248
  isRoutableLlmAgent(agentToRun) {
217
249
  let agent = agentToRun;
218
250
  while (agent) {
219
- if (!(agent instanceof LlmAgent)) {
251
+ if (!isLlmAgent(agent)) {
220
252
  return false;
221
253
  }
222
254
  if (agent.disallowTransferToParent) {
@@ -234,7 +266,9 @@ function findEventByLastFunctionResponseId(events) {
234
266
  return null;
235
267
  }
236
268
  const lastEvent = events[events.length - 1];
237
- const functionCallId = (_d = (_c = (_b = (_a = lastEvent.content) == null ? void 0 : _a.parts) == null ? void 0 : _b.find((part) => part.functionResponse)) == null ? void 0 : _c.functionResponse) == null ? void 0 : _d.id;
269
+ const functionCallId = (_d = (_c = (_b = (_a = lastEvent.content) == null ? void 0 : _a.parts) == null ? void 0 : _b.find(
270
+ (part) => part.functionResponse
271
+ )) == null ? void 0 : _c.functionResponse) == null ? void 0 : _d.id;
238
272
  if (!functionCallId) {
239
273
  return null;
240
274
  }
@@ -6,7 +6,9 @@
6
6
  import { cloneDeep } from "lodash-es";
7
7
  import { randomUUID } from "../utils/env_aware_utils.js";
8
8
  import { logger } from "../utils/logger.js";
9
- import { BaseSessionService } from "./base_session_service.js";
9
+ import {
10
+ BaseSessionService
11
+ } from "./base_session_service.js";
10
12
  import { createSession } from "./session.js";
11
13
  import { State } from "./state.js";
12
14
  class InMemorySessionService extends BaseSessionService {
@@ -26,7 +28,12 @@ class InMemorySessionService extends BaseSessionService {
26
28
  */
27
29
  this.appState = {};
28
30
  }
29
- createSession({ appName, userId, state, sessionId }) {
31
+ createSession({
32
+ appName,
33
+ userId,
34
+ state,
35
+ sessionId
36
+ }) {
30
37
  const session = createSession({
31
38
  id: sessionId || randomUUID(),
32
39
  appName,
@@ -46,7 +53,12 @@ class InMemorySessionService extends BaseSessionService {
46
53
  this.mergeState(appName, userId, cloneDeep(session))
47
54
  );
48
55
  }
49
- getSession({ appName, userId, sessionId, config }) {
56
+ getSession({
57
+ appName,
58
+ userId,
59
+ sessionId,
60
+ config
61
+ }) {
50
62
  if (!this.sessions[appName] || !this.sessions[appName][userId] || !this.sessions[appName][userId][sessionId]) {
51
63
  return Promise.resolve(void 0);
52
64
  }
@@ -54,7 +66,9 @@ class InMemorySessionService extends BaseSessionService {
54
66
  const copiedSession = cloneDeep(session);
55
67
  if (config) {
56
68
  if (config.numRecentEvents) {
57
- copiedSession.events = copiedSession.events.slice(-config.numRecentEvents);
69
+ copiedSession.events = copiedSession.events.slice(
70
+ -config.numRecentEvents
71
+ );
58
72
  }
59
73
  if (config.afterTimestamp) {
60
74
  let i = copiedSession.events.length - 1;
@@ -71,31 +85,43 @@ class InMemorySessionService extends BaseSessionService {
71
85
  }
72
86
  return Promise.resolve(this.mergeState(appName, userId, copiedSession));
73
87
  }
74
- listSessions({ appName, userId }) {
88
+ listSessions({
89
+ appName,
90
+ userId
91
+ }) {
75
92
  if (!this.sessions[appName] || !this.sessions[appName][userId]) {
76
93
  return Promise.resolve({ sessions: [] });
77
94
  }
78
95
  const sessionsWithoutEvents = [];
79
96
  for (const session of Object.values(this.sessions[appName][userId])) {
80
- sessionsWithoutEvents.push(createSession({
81
- id: session.id,
82
- appName: session.appName,
83
- userId: session.userId,
84
- state: {},
85
- events: [],
86
- lastUpdateTime: session.lastUpdateTime
87
- }));
97
+ sessionsWithoutEvents.push(
98
+ createSession({
99
+ id: session.id,
100
+ appName: session.appName,
101
+ userId: session.userId,
102
+ state: {},
103
+ events: [],
104
+ lastUpdateTime: session.lastUpdateTime
105
+ })
106
+ );
88
107
  }
89
108
  return Promise.resolve({ sessions: sessionsWithoutEvents });
90
109
  }
91
- async deleteSession({ appName, userId, sessionId }) {
110
+ async deleteSession({
111
+ appName,
112
+ userId,
113
+ sessionId
114
+ }) {
92
115
  const session = await this.getSession({ appName, userId, sessionId });
93
116
  if (!session) {
94
117
  return;
95
118
  }
96
119
  delete this.sessions[appName][userId][sessionId];
97
120
  }
98
- async appendEvent({ session, event }) {
121
+ async appendEvent({
122
+ session,
123
+ event
124
+ }) {
99
125
  await super.appendEvent({ session, event });
100
126
  session.lastUpdateTime = event.timestamp;
101
127
  const appName = session.appName;
@@ -3,13 +3,13 @@
3
3
  * Copyright 2025 Google LLC
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
- import { GoogleAuth } from "google-auth-library";
7
- import { PeriodicExportingMetricReader } from "@opentelemetry/sdk-metrics";
8
- import { detectResources } from "@opentelemetry/resources";
9
- import { gcpDetector } from "@opentelemetry/resource-detector-gcp";
6
+ import { MetricExporter } from "@google-cloud/opentelemetry-cloud-monitoring-exporter";
10
7
  import { TraceExporter } from "@google-cloud/opentelemetry-cloud-trace-exporter";
8
+ import { gcpDetector } from "@opentelemetry/resource-detector-gcp";
9
+ import { detectResources } from "@opentelemetry/resources";
10
+ import { PeriodicExportingMetricReader } from "@opentelemetry/sdk-metrics";
11
11
  import { BatchSpanProcessor } from "@opentelemetry/sdk-trace-base";
12
- import { MetricExporter } from "@google-cloud/opentelemetry-cloud-monitoring-exporter";
12
+ import { GoogleAuth } from "google-auth-library";
13
13
  import { logger } from "../utils/logger.js";
14
14
  const GCP_PROJECT_ERROR_MESSAGE = "Cannot determine GCP Project. OTel GCP Exporters cannot be set up. Please make sure to log into correct GCP Project.";
15
15
  async function getGcpProjectId() {
@@ -17,7 +17,7 @@ async function getGcpProjectId() {
17
17
  const auth = new GoogleAuth();
18
18
  const projectId = await auth.getProjectId();
19
19
  return projectId || void 0;
20
- } catch (error) {
20
+ } catch (_e) {
21
21
  return void 0;
22
22
  }
23
23
  }
@@ -33,9 +33,7 @@ async function getGcpExporters(config = {}) {
33
33
  return {};
34
34
  }
35
35
  return {
36
- spanProcessors: enableTracing ? [
37
- new BatchSpanProcessor(new TraceExporter({ projectId }))
38
- ] : [],
36
+ spanProcessors: enableTracing ? [new BatchSpanProcessor(new TraceExporter({ projectId }))] : [],
39
37
  metricReaders: enableMetrics ? [
40
38
  new PeriodicExportingMetricReader({
41
39
  exporter: new MetricExporter({ projectId }),
@@ -3,22 +3,32 @@
3
3
  * Copyright 2025 Google LLC
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
- import { trace, metrics } from "@opentelemetry/api";
6
+ import { metrics, trace } from "@opentelemetry/api";
7
7
  import { logs } from "@opentelemetry/api-logs";
8
- import { LoggerProvider, BatchLogRecordProcessor } from "@opentelemetry/sdk-logs";
9
- import { MeterProvider, PeriodicExportingMetricReader } from "@opentelemetry/sdk-metrics";
8
+ import { OTLPLogExporter } from "@opentelemetry/exporter-logs-otlp-http";
9
+ import { OTLPMetricExporter } from "@opentelemetry/exporter-metrics-otlp-http";
10
+ import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-http";
10
11
  import { detectResources } from "@opentelemetry/resources";
12
+ import {
13
+ BatchLogRecordProcessor,
14
+ LoggerProvider
15
+ } from "@opentelemetry/sdk-logs";
16
+ import {
17
+ MeterProvider,
18
+ PeriodicExportingMetricReader
19
+ } from "@opentelemetry/sdk-metrics";
11
20
  import { BatchSpanProcessor } from "@opentelemetry/sdk-trace-base";
12
21
  import { NodeTracerProvider } from "@opentelemetry/sdk-trace-node";
13
- import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-http";
14
- import { OTLPMetricExporter } from "@opentelemetry/exporter-metrics-otlp-http";
15
- import { OTLPLogExporter } from "@opentelemetry/exporter-logs-otlp-http";
16
22
  function maybeSetOtelProviders(otelHooksToSetup = [], otelResource) {
17
23
  const resource = otelResource || getOtelResource();
18
24
  const allHooks = [...otelHooksToSetup, getOtelExporters()];
19
- const spanProcessors = allHooks.flatMap((hooks) => hooks.spanProcessors || []);
25
+ const spanProcessors = allHooks.flatMap(
26
+ (hooks) => hooks.spanProcessors || []
27
+ );
20
28
  const metricReaders = allHooks.flatMap((hooks) => hooks.metricReaders || []);
21
- const logRecordProcessors = allHooks.flatMap((hooks) => hooks.logRecordProcessors || []);
29
+ const logRecordProcessors = allHooks.flatMap(
30
+ (hooks) => hooks.logRecordProcessors || []
31
+ );
22
32
  if (spanProcessors.length > 0) {
23
33
  const tracerProvider = new NodeTracerProvider({
24
34
  resource,
@@ -58,7 +68,11 @@ function getOtelExporters(config = getOtelExportersConfig()) {
58
68
  const { enableTracing, enableMetrics, enableLogging } = config;
59
69
  return {
60
70
  spanProcessors: enableTracing ? [new BatchSpanProcessor(new OTLPTraceExporter())] : [],
61
- metricReaders: enableMetrics ? [new PeriodicExportingMetricReader({ exporter: new OTLPMetricExporter() })] : [],
71
+ metricReaders: enableMetrics ? [
72
+ new PeriodicExportingMetricReader({
73
+ exporter: new OTLPMetricExporter()
74
+ })
75
+ ] : [],
62
76
  logRecordProcessors: enableLogging ? [new BatchLogRecordProcessor(new OTLPLogExporter())] : []
63
77
  };
64
78
  }
@@ -3,7 +3,7 @@
3
3
  * Copyright 2025 Google LLC
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
- import { trace, context } from "@opentelemetry/api";
6
+ import { context, trace } from "@opentelemetry/api";
7
7
  import { version } from "../version.js";
8
8
  const GEN_AI_AGENT_DESCRIPTION = "gen_ai.agent.description";
9
9
  const GEN_AI_AGENT_NAME = "gen_ai.agent.name";
@@ -13,14 +13,11 @@ const GEN_AI_TOOL_CALL_ID = "gen_ai.tool.call.id";
13
13
  const GEN_AI_TOOL_DESCRIPTION = "gen_ai.tool.description";
14
14
  const GEN_AI_TOOL_NAME = "gen_ai.tool.name";
15
15
  const GEN_AI_TOOL_TYPE = "gen_ai.tool.type";
16
- const tracer = trace.getTracer(
17
- "gcp.vertex.agent",
18
- version
19
- );
16
+ const tracer = trace.getTracer("gcp.vertex.agent", version);
20
17
  function safeJsonSerialize(obj) {
21
18
  try {
22
19
  return JSON.stringify(obj);
23
- } catch (error) {
20
+ } catch (_e) {
24
21
  return "<not serializable>";
25
22
  }
26
23
  }
@@ -97,7 +94,10 @@ function traceMergedToolCalls({
97
94
  "gcp.vertex.agent.llm_request": "{}",
98
95
  "gcp.vertex.agent.llm_response": "{}"
99
96
  });
100
- span.setAttribute("gcp.vertex.agent.tool_response", shouldAddRequestResponseToSpans() ? safeJsonSerialize(functionResponseEvent) : "{}");
97
+ span.setAttribute(
98
+ "gcp.vertex.agent.tool_response",
99
+ shouldAddRequestResponseToSpans() ? safeJsonSerialize(functionResponseEvent) : "{}"
100
+ );
101
101
  }
102
102
  function traceCallLlm({
103
103
  invocationContext,
@@ -121,14 +121,26 @@ function traceCallLlm({
121
121
  span.setAttribute("gen_ai.request.top_p", llmRequest.config.topP);
122
122
  }
123
123
  if (((_b = llmRequest.config) == null ? void 0 : _b.maxOutputTokens) !== void 0) {
124
- span.setAttribute("gen_ai.request.max_tokens", llmRequest.config.maxOutputTokens);
124
+ span.setAttribute(
125
+ "gen_ai.request.max_tokens",
126
+ llmRequest.config.maxOutputTokens
127
+ );
125
128
  }
126
- span.setAttribute("gcp.vertex.agent.llm_response", shouldAddRequestResponseToSpans() ? safeJsonSerialize(llmResponse) : "{}");
129
+ span.setAttribute(
130
+ "gcp.vertex.agent.llm_response",
131
+ shouldAddRequestResponseToSpans() ? safeJsonSerialize(llmResponse) : "{}"
132
+ );
127
133
  if (llmResponse.usageMetadata) {
128
- span.setAttribute("gen_ai.usage.input_tokens", llmResponse.usageMetadata.promptTokenCount || 0);
134
+ span.setAttribute(
135
+ "gen_ai.usage.input_tokens",
136
+ llmResponse.usageMetadata.promptTokenCount || 0
137
+ );
129
138
  }
130
139
  if ((_c = llmResponse.usageMetadata) == null ? void 0 : _c.candidatesTokenCount) {
131
- span.setAttribute("gen_ai.usage.output_tokens", llmResponse.usageMetadata.candidatesTokenCount);
140
+ span.setAttribute(
141
+ "gen_ai.usage.output_tokens",
142
+ llmResponse.usageMetadata.candidatesTokenCount
143
+ );
132
144
  }
133
145
  if (llmResponse.finishReason) {
134
146
  const finishReasonValue = typeof llmResponse.finishReason === "string" ? llmResponse.finishReason.toLowerCase() : String(llmResponse.finishReason).toLowerCase();
@@ -146,7 +158,10 @@ function traceSendData({
146
158
  "gcp.vertex.agent.invocation_id": invocationContext.invocationId,
147
159
  "gcp.vertex.agent.event_id": eventId
148
160
  });
149
- span.setAttribute("gcp.vertex.agent.data", shouldAddRequestResponseToSpans() ? safeJsonSerialize(data) : "{}");
161
+ span.setAttribute(
162
+ "gcp.vertex.agent.data",
163
+ shouldAddRequestResponseToSpans() ? safeJsonSerialize(data) : "{}"
164
+ );
150
165
  }
151
166
  function buildLlmRequestForTrace(llmRequest) {
152
167
  const result = {
@@ -166,7 +181,7 @@ function buildLlmRequestForTrace(llmRequest) {
166
181
  });
167
182
  return result;
168
183
  }
169
- function bindAsyncGenerator(ctx, generator) {
184
+ function bindOtelContextToAsyncGenerator(ctx, generator) {
170
185
  return {
171
186
  // Bind the next() method to execute within the provided context
172
187
  next: context.bind(ctx, generator.next.bind(generator)),
@@ -176,16 +191,23 @@ function bindAsyncGenerator(ctx, generator) {
176
191
  throw: context.bind(ctx, generator.throw.bind(generator)),
177
192
  // Ensure the async iterator symbol also returns a context-bound generator
178
193
  [Symbol.asyncIterator]() {
179
- return bindAsyncGenerator(ctx, generator[Symbol.asyncIterator]());
194
+ return bindOtelContextToAsyncGenerator(
195
+ ctx,
196
+ generator[Symbol.asyncIterator]()
197
+ );
180
198
  }
181
199
  };
182
200
  }
201
+ function runAsyncGeneratorWithOtelContext(otelContext, generatorFnContext, generatorFn) {
202
+ const generator = generatorFn.call(generatorFnContext);
203
+ return bindOtelContextToAsyncGenerator(otelContext, generator);
204
+ }
183
205
  function shouldAddRequestResponseToSpans() {
184
206
  const envValue = process.env.ADK_CAPTURE_MESSAGE_CONTENT_IN_SPANS || "true";
185
207
  return envValue === "true" || envValue === "1";
186
208
  }
187
209
  export {
188
- bindAsyncGenerator,
210
+ runAsyncGeneratorWithOtelContext,
189
211
  traceAgentInvocation,
190
212
  traceCallLlm,
191
213
  traceMergedToolCalls,