@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.
- package/LICENSE +202 -0
- package/README.md +9 -0
- package/dist/cjs/agents/active_streaming_tool.js +44 -0
- package/dist/cjs/agents/base_agent.js +245 -0
- package/dist/cjs/agents/base_llm_processor.js +44 -0
- package/dist/cjs/agents/callback_context.js +98 -0
- package/dist/cjs/agents/content_processor_utils.js +299 -0
- package/dist/cjs/agents/functions.js +394 -0
- package/dist/cjs/agents/instructions.js +110 -0
- package/dist/cjs/agents/invocation_context.js +109 -0
- package/dist/cjs/agents/live_request_queue.js +136 -0
- package/dist/cjs/agents/llm_agent.js +859 -0
- package/dist/cjs/agents/loop_agent.js +68 -0
- package/dist/cjs/agents/parallel_agent.js +78 -0
- package/dist/cjs/agents/readonly_context.js +68 -0
- package/dist/cjs/agents/run_config.js +74 -0
- package/dist/cjs/agents/sequential_agent.js +84 -0
- package/dist/cjs/agents/transcription_entry.js +27 -0
- package/dist/cjs/artifacts/base_artifact_service.js +27 -0
- package/dist/cjs/artifacts/in_memory_artifact_service.js +119 -0
- package/dist/cjs/auth/auth_credential.js +46 -0
- package/dist/cjs/auth/auth_handler.js +92 -0
- package/dist/cjs/auth/auth_schemes.js +62 -0
- package/dist/cjs/auth/auth_tool.js +27 -0
- package/dist/cjs/auth/credential_service/base_credential_service.js +27 -0
- package/dist/cjs/auth/credential_service/in_memory_credential_service.js +63 -0
- package/dist/cjs/code_executors/base_code_executor.js +76 -0
- package/dist/cjs/code_executors/built_in_code_executor.js +58 -0
- package/dist/cjs/code_executors/code_execution_utils.js +142 -0
- package/dist/cjs/code_executors/code_executor_context.js +198 -0
- package/dist/cjs/common.js +161 -0
- package/dist/cjs/events/event.js +107 -0
- package/dist/cjs/events/event_actions.js +83 -0
- package/dist/cjs/examples/base_example_provider.js +40 -0
- package/dist/cjs/examples/example.js +27 -0
- package/dist/cjs/examples/example_util.js +107 -0
- package/dist/cjs/index.js +40 -0
- package/dist/cjs/index.js.map +7 -0
- package/dist/cjs/index_web.js +33 -0
- package/dist/cjs/memory/base_memory_service.js +27 -0
- package/dist/cjs/memory/in_memory_memory_service.js +97 -0
- package/dist/cjs/memory/memory_entry.js +27 -0
- package/dist/cjs/models/base_llm.js +77 -0
- package/dist/cjs/models/base_llm_connection.js +27 -0
- package/dist/cjs/models/gemini_llm_connection.js +132 -0
- package/dist/cjs/models/google_llm.js +321 -0
- package/dist/cjs/models/llm_request.js +82 -0
- package/dist/cjs/models/llm_response.js +71 -0
- package/dist/cjs/models/registry.js +121 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/plugins/base_plugin.js +236 -0
- package/dist/cjs/plugins/logging_plugin.js +222 -0
- package/dist/cjs/plugins/plugin_manager.js +239 -0
- package/dist/cjs/plugins/security_plugin.js +153 -0
- package/dist/cjs/runner/in_memory_runner.js +58 -0
- package/dist/cjs/runner/runner.js +276 -0
- package/dist/cjs/sessions/base_session_service.js +71 -0
- package/dist/cjs/sessions/in_memory_session_service.js +184 -0
- package/dist/cjs/sessions/session.js +48 -0
- package/dist/cjs/sessions/state.js +101 -0
- package/dist/cjs/tools/agent_tool.js +134 -0
- package/dist/cjs/tools/base_tool.js +107 -0
- package/dist/cjs/tools/base_toolset.js +76 -0
- package/dist/cjs/tools/forwarding_artifact_service.js +71 -0
- package/dist/cjs/tools/function_tool.js +101 -0
- package/dist/cjs/tools/google_search_tool.js +76 -0
- package/dist/cjs/tools/long_running_tool.js +63 -0
- package/dist/cjs/tools/mcp/mcp_session_manager.js +65 -0
- package/dist/cjs/tools/mcp/mcp_tool.js +65 -0
- package/dist/cjs/tools/mcp/mcp_toolset.js +61 -0
- package/dist/cjs/tools/tool_confirmation.js +49 -0
- package/dist/cjs/tools/tool_context.js +129 -0
- package/dist/cjs/utils/deep_clone.js +44 -0
- package/dist/cjs/utils/env_aware_utils.js +83 -0
- package/dist/cjs/utils/gemini_schema_util.js +88 -0
- package/dist/cjs/utils/logger.js +121 -0
- package/dist/cjs/utils/model_name.js +64 -0
- package/dist/cjs/utils/simple_zod_to_json.js +191 -0
- package/dist/cjs/utils/variant_utils.js +55 -0
- package/dist/cjs/version.js +39 -0
- package/dist/esm/agents/active_streaming_tool.js +14 -0
- package/dist/esm/agents/base_agent.js +214 -0
- package/dist/esm/agents/base_llm_processor.js +13 -0
- package/dist/esm/agents/callback_context.js +68 -0
- package/dist/esm/agents/content_processor_utils.js +268 -0
- package/dist/esm/agents/functions.js +353 -0
- package/dist/esm/agents/instructions.js +80 -0
- package/dist/esm/agents/invocation_context.js +78 -0
- package/dist/esm/agents/live_request_queue.js +106 -0
- package/dist/esm/agents/llm_agent.js +828 -0
- package/dist/esm/agents/loop_agent.js +38 -0
- package/dist/esm/agents/parallel_agent.js +48 -0
- package/dist/esm/agents/readonly_context.js +38 -0
- package/dist/esm/agents/run_config.js +43 -0
- package/dist/esm/agents/sequential_agent.js +54 -0
- package/dist/esm/agents/transcription_entry.js +5 -0
- package/dist/esm/artifacts/base_artifact_service.js +5 -0
- package/dist/esm/artifacts/in_memory_artifact_service.js +89 -0
- package/dist/esm/auth/auth_credential.js +16 -0
- package/dist/esm/auth/auth_handler.js +62 -0
- package/dist/esm/auth/auth_schemes.js +31 -0
- package/dist/esm/auth/auth_tool.js +5 -0
- package/dist/esm/auth/credential_service/base_credential_service.js +5 -0
- package/dist/esm/auth/credential_service/in_memory_credential_service.js +33 -0
- package/dist/esm/code_executors/base_code_executor.js +46 -0
- package/dist/esm/code_executors/built_in_code_executor.js +28 -0
- package/dist/esm/code_executors/code_execution_utils.js +108 -0
- package/dist/esm/code_executors/code_executor_context.js +168 -0
- package/dist/esm/common.js +85 -0
- package/dist/esm/events/event.js +72 -0
- package/dist/esm/events/event_actions.js +52 -0
- package/dist/esm/examples/base_example_provider.js +10 -0
- package/dist/esm/examples/example.js +5 -0
- package/dist/esm/examples/example_util.js +76 -0
- package/dist/esm/index.js +40 -0
- package/dist/esm/index.js.map +7 -0
- package/dist/esm/index_web.js +6 -0
- package/dist/esm/memory/base_memory_service.js +5 -0
- package/dist/esm/memory/in_memory_memory_service.js +67 -0
- package/dist/esm/memory/memory_entry.js +5 -0
- package/dist/esm/models/base_llm.js +47 -0
- package/dist/esm/models/base_llm_connection.js +5 -0
- package/dist/esm/models/gemini_llm_connection.js +102 -0
- package/dist/esm/models/google_llm.js +291 -0
- package/dist/esm/models/llm_request.js +50 -0
- package/dist/esm/models/llm_response.js +41 -0
- package/dist/esm/models/registry.js +91 -0
- package/dist/esm/plugins/base_plugin.js +206 -0
- package/dist/esm/plugins/logging_plugin.js +192 -0
- package/dist/esm/plugins/plugin_manager.js +209 -0
- package/dist/esm/plugins/security_plugin.js +119 -0
- package/dist/esm/runner/in_memory_runner.js +28 -0
- package/dist/esm/runner/runner.js +246 -0
- package/dist/esm/sessions/base_session_service.js +41 -0
- package/dist/esm/sessions/in_memory_session_service.js +154 -0
- package/dist/esm/sessions/session.js +18 -0
- package/dist/esm/sessions/state.js +71 -0
- package/dist/esm/tools/agent_tool.js +104 -0
- package/dist/esm/tools/base_tool.js +77 -0
- package/dist/esm/tools/base_toolset.js +46 -0
- package/dist/esm/tools/forwarding_artifact_service.js +41 -0
- package/dist/esm/tools/function_tool.js +71 -0
- package/dist/esm/tools/google_search_tool.js +46 -0
- package/dist/esm/tools/long_running_tool.js +33 -0
- package/dist/esm/tools/mcp/mcp_session_manager.js +35 -0
- package/dist/esm/tools/mcp/mcp_tool.js +35 -0
- package/dist/esm/tools/mcp/mcp_toolset.js +31 -0
- package/dist/esm/tools/tool_confirmation.js +19 -0
- package/dist/esm/tools/tool_context.js +99 -0
- package/dist/esm/utils/deep_clone.js +14 -0
- package/dist/esm/utils/env_aware_utils.js +49 -0
- package/dist/esm/utils/gemini_schema_util.js +58 -0
- package/dist/esm/utils/logger.js +89 -0
- package/dist/esm/utils/model_name.js +31 -0
- package/dist/esm/utils/simple_zod_to_json.js +160 -0
- package/dist/esm/utils/variant_utils.js +24 -0
- package/dist/esm/version.js +9 -0
- package/dist/types/agents/active_streaming_tool.d.ts +29 -0
- package/dist/types/agents/base_agent.d.ts +167 -0
- package/dist/types/agents/base_llm_processor.d.ts +27 -0
- package/dist/types/agents/callback_context.d.ts +42 -0
- package/dist/types/agents/content_processor_utils.d.ts +36 -0
- package/dist/types/agents/functions.d.ts +90 -0
- package/dist/types/agents/instructions.d.ts +32 -0
- package/dist/types/agents/invocation_context.d.ts +155 -0
- package/dist/types/agents/live_request_queue.d.ts +67 -0
- package/dist/types/agents/llm_agent.d.ts +333 -0
- package/dist/types/agents/loop_agent.d.ts +31 -0
- package/dist/types/agents/parallel_agent.d.ts +21 -0
- package/dist/types/agents/readonly_context.d.ts +31 -0
- package/dist/types/agents/run_config.d.ts +76 -0
- package/dist/types/agents/sequential_agent.d.ts +26 -0
- package/dist/types/agents/transcription_entry.d.ts +17 -0
- package/dist/types/artifacts/base_artifact_service.d.ts +127 -0
- package/dist/types/artifacts/in_memory_artifact_service.d.ts +18 -0
- package/dist/types/auth/auth_credential.d.ts +227 -0
- package/dist/types/auth/auth_handler.d.ts +27 -0
- package/dist/types/auth/auth_schemes.d.ts +36 -0
- package/dist/types/auth/auth_tool.d.ts +51 -0
- package/dist/types/auth/credential_service/base_credential_service.d.ts +27 -0
- package/dist/types/auth/credential_service/in_memory_credential_service.d.ts +19 -0
- package/dist/types/code_executors/base_code_executor.d.ts +60 -0
- package/dist/types/code_executors/built_in_code_executor.d.ts +13 -0
- package/dist/types/code_executors/code_execution_utils.d.ts +99 -0
- package/dist/types/code_executors/code_executor_context.d.ts +92 -0
- package/dist/types/common.d.ts +51 -0
- package/dist/types/events/event.d.ts +81 -0
- package/dist/types/events/event_actions.d.ts +74 -0
- package/dist/types/examples/base_example_provider.d.ts +20 -0
- package/dist/types/examples/example.d.ts +19 -0
- package/dist/types/examples/example_util.d.ts +13 -0
- package/dist/types/index.d.ts +9 -0
- package/dist/types/index_web.d.ts +6 -0
- package/dist/types/memory/base_memory_service.d.ts +47 -0
- package/dist/types/memory/in_memory_memory_service.d.ts +18 -0
- package/dist/types/memory/memory_entry.d.ts +24 -0
- package/dist/types/models/base_llm.d.ts +46 -0
- package/dist/types/models/base_llm_connection.d.ts +51 -0
- package/dist/types/models/gemini_llm_connection.d.ts +54 -0
- package/dist/types/models/google_llm.d.ts +88 -0
- package/dist/types/models/llm_request.d.ts +49 -0
- package/dist/types/models/llm_response.d.ts +79 -0
- package/dist/types/models/registry.d.ts +45 -0
- package/dist/types/plugins/base_plugin.d.ts +310 -0
- package/dist/types/plugins/logging_plugin.d.ts +104 -0
- package/dist/types/plugins/plugin_manager.d.ts +155 -0
- package/dist/types/plugins/security_plugin.d.ts +60 -0
- package/dist/types/runner/in_memory_runner.d.ts +15 -0
- package/dist/types/runner/runner.d.ts +80 -0
- package/dist/types/sessions/base_session_service.d.ts +129 -0
- package/dist/types/sessions/in_memory_session_service.d.ts +32 -0
- package/dist/types/sessions/session.d.ts +46 -0
- package/dist/types/sessions/state.d.ts +57 -0
- package/dist/types/tools/agent_tool.d.ts +37 -0
- package/dist/types/tools/base_tool.d.ts +84 -0
- package/dist/types/tools/base_toolset.d.ts +64 -0
- package/dist/types/tools/forwarding_artifact_service.d.ts +21 -0
- package/dist/types/tools/function_tool.d.ts +48 -0
- package/dist/types/tools/google_search_tool.d.ts +18 -0
- package/dist/types/tools/long_running_tool.d.ts +18 -0
- package/dist/types/tools/mcp/mcp_session_manager.d.ts +57 -0
- package/dist/types/tools/mcp/mcp_tool.d.ts +30 -0
- package/dist/types/tools/mcp/mcp_toolset.d.ts +39 -0
- package/dist/types/tools/tool_confirmation.d.ts +25 -0
- package/dist/types/tools/tool_context.d.ts +63 -0
- package/dist/types/utils/deep_clone.d.ts +1 -0
- package/dist/types/utils/env_aware_utils.d.ts +31 -0
- package/dist/types/utils/gemini_schema_util.d.ts +23 -0
- package/dist/types/utils/logger.d.ts +41 -0
- package/dist/types/utils/model_name.d.ts +34 -0
- package/dist/types/utils/simple_zod_to_json.d.ts +12 -0
- package/dist/types/utils/variant_utils.d.ts +24 -0
- package/dist/types/version.d.ts +6 -0
- package/dist/web/agents/active_streaming_tool.js +14 -0
- package/dist/web/agents/base_agent.js +265 -0
- package/dist/web/agents/base_llm_processor.js +13 -0
- package/dist/web/agents/callback_context.js +68 -0
- package/dist/web/agents/content_processor_utils.js +268 -0
- package/dist/web/agents/functions.js +353 -0
- package/dist/web/agents/instructions.js +80 -0
- package/dist/web/agents/invocation_context.js +78 -0
- package/dist/web/agents/live_request_queue.js +124 -0
- package/dist/web/agents/llm_agent.js +973 -0
- package/dist/web/agents/loop_agent.js +71 -0
- package/dist/web/agents/parallel_agent.js +83 -0
- package/dist/web/agents/readonly_context.js +38 -0
- package/dist/web/agents/run_config.js +43 -0
- package/dist/web/agents/sequential_agent.js +99 -0
- package/dist/web/agents/transcription_entry.js +5 -0
- package/dist/web/artifacts/base_artifact_service.js +5 -0
- package/dist/web/artifacts/in_memory_artifact_service.js +89 -0
- package/dist/web/auth/auth_credential.js +16 -0
- package/dist/web/auth/auth_handler.js +62 -0
- package/dist/web/auth/auth_schemes.js +31 -0
- package/dist/web/auth/auth_tool.js +5 -0
- package/dist/web/auth/credential_service/base_credential_service.js +5 -0
- package/dist/web/auth/credential_service/in_memory_credential_service.js +33 -0
- package/dist/web/code_executors/base_code_executor.js +46 -0
- package/dist/web/code_executors/built_in_code_executor.js +28 -0
- package/dist/web/code_executors/code_execution_utils.js +105 -0
- package/dist/web/code_executors/code_executor_context.js +168 -0
- package/dist/web/common.js +85 -0
- package/dist/web/events/event.js +90 -0
- package/dist/web/events/event_actions.js +67 -0
- package/dist/web/examples/base_example_provider.js +10 -0
- package/dist/web/examples/example.js +5 -0
- package/dist/web/examples/example_util.js +75 -0
- package/dist/web/index.js +13 -0
- package/dist/web/index.js.map +7 -0
- package/dist/web/index_web.js +6 -0
- package/dist/web/memory/base_memory_service.js +5 -0
- package/dist/web/memory/in_memory_memory_service.js +67 -0
- package/dist/web/memory/memory_entry.js +5 -0
- package/dist/web/models/base_llm.js +47 -0
- package/dist/web/models/base_llm_connection.js +5 -0
- package/dist/web/models/gemini_llm_connection.js +120 -0
- package/dist/web/models/google_llm.js +332 -0
- package/dist/web/models/llm_request.js +50 -0
- package/dist/web/models/llm_response.js +41 -0
- package/dist/web/models/registry.js +91 -0
- package/dist/web/plugins/base_plugin.js +206 -0
- package/dist/web/plugins/logging_plugin.js +192 -0
- package/dist/web/plugins/plugin_manager.js +209 -0
- package/dist/web/plugins/security_plugin.js +119 -0
- package/dist/web/runner/in_memory_runner.js +28 -0
- package/dist/web/runner/runner.js +277 -0
- package/dist/web/sessions/base_session_service.js +41 -0
- package/dist/web/sessions/in_memory_session_service.js +154 -0
- package/dist/web/sessions/session.js +18 -0
- package/dist/web/sessions/state.js +87 -0
- package/dist/web/tools/agent_tool.js +118 -0
- package/dist/web/tools/base_tool.js +77 -0
- package/dist/web/tools/base_toolset.js +46 -0
- package/dist/web/tools/forwarding_artifact_service.js +41 -0
- package/dist/web/tools/function_tool.js +71 -0
- package/dist/web/tools/google_search_tool.js +46 -0
- package/dist/web/tools/long_running_tool.js +50 -0
- package/dist/web/tools/mcp/mcp_session_manager.js +35 -0
- package/dist/web/tools/mcp/mcp_tool.js +35 -0
- package/dist/web/tools/mcp/mcp_toolset.js +31 -0
- package/dist/web/tools/tool_confirmation.js +19 -0
- package/dist/web/tools/tool_context.js +99 -0
- package/dist/web/utils/deep_clone.js +14 -0
- package/dist/web/utils/env_aware_utils.js +49 -0
- package/dist/web/utils/gemini_schema_util.js +58 -0
- package/dist/web/utils/logger.js +89 -0
- package/dist/web/utils/model_name.js +31 -0
- package/dist/web/utils/simple_zod_to_json.js +174 -0
- package/dist/web/utils/variant_utils.js +24 -0
- package/dist/web/version.js +9 -0
- package/package.json +61 -0
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { BaseAgent } from "./base_agent.js";
|
|
7
|
+
class LoopAgent extends BaseAgent {
|
|
8
|
+
constructor(config) {
|
|
9
|
+
var _a;
|
|
10
|
+
super(config);
|
|
11
|
+
this.maxIterations = (_a = config.maxIterations) != null ? _a : Number.MAX_SAFE_INTEGER;
|
|
12
|
+
}
|
|
13
|
+
async *runAsyncImpl(context) {
|
|
14
|
+
let iteration = 0;
|
|
15
|
+
while (iteration < this.maxIterations) {
|
|
16
|
+
for (const subAgent of this.subAgents) {
|
|
17
|
+
let shouldExit = false;
|
|
18
|
+
for await (const event of subAgent.runAsync(context)) {
|
|
19
|
+
yield event;
|
|
20
|
+
if (event.actions.escalate) {
|
|
21
|
+
shouldExit = true;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
if (shouldExit) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
iteration++;
|
|
29
|
+
}
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
async *runLiveImpl(context) {
|
|
33
|
+
throw new Error("This is not supported yet for LoopAgent.");
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export {
|
|
37
|
+
LoopAgent
|
|
38
|
+
};
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { BaseAgent } from "./base_agent.js";
|
|
7
|
+
import { InvocationContext } from "./invocation_context.js";
|
|
8
|
+
class ParallelAgent extends BaseAgent {
|
|
9
|
+
async *runAsyncImpl(context) {
|
|
10
|
+
const agentRuns = this.subAgents.map(
|
|
11
|
+
(subAgent) => subAgent.runAsync(
|
|
12
|
+
createBranchCtxForSubAgent(this, subAgent, context)
|
|
13
|
+
)
|
|
14
|
+
);
|
|
15
|
+
for await (const event of mergeAgentRuns(agentRuns)) {
|
|
16
|
+
yield event;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
async *runLiveImpl(context) {
|
|
20
|
+
throw new Error("This is not supported yet for ParallelAgent.");
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
function createBranchCtxForSubAgent(agent, subAgent, originalContext) {
|
|
24
|
+
const invocationContext = new InvocationContext(originalContext);
|
|
25
|
+
const branchSuffix = `${agent.name}.${subAgent.name}`;
|
|
26
|
+
invocationContext.branch = invocationContext.branch ? `${invocationContext.branch}.${branchSuffix}` : branchSuffix;
|
|
27
|
+
return invocationContext;
|
|
28
|
+
}
|
|
29
|
+
async function* mergeAgentRuns(agentRuns) {
|
|
30
|
+
const pendingPromises = /* @__PURE__ */ new Map();
|
|
31
|
+
for (const [index, generator] of agentRuns.entries()) {
|
|
32
|
+
const promise = generator.next().then((result) => ({ result, index }));
|
|
33
|
+
pendingPromises.set(index, promise);
|
|
34
|
+
}
|
|
35
|
+
while (pendingPromises.size > 0) {
|
|
36
|
+
const { result, index } = await Promise.race(pendingPromises.values());
|
|
37
|
+
if (result.done) {
|
|
38
|
+
pendingPromises.delete(index);
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
yield result.value;
|
|
42
|
+
const nextPromise = agentRuns[index].next().then((result2) => ({ result: result2, index }));
|
|
43
|
+
pendingPromises.set(index, nextPromise);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
export {
|
|
47
|
+
ParallelAgent
|
|
48
|
+
};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { State } from "../sessions/state.js";
|
|
7
|
+
class ReadonlyContext {
|
|
8
|
+
constructor(invocationContext) {
|
|
9
|
+
this.invocationContext = invocationContext;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* The user content that started this invocation.
|
|
13
|
+
*/
|
|
14
|
+
get userContent() {
|
|
15
|
+
return this.invocationContext.userContent;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* The current invocation id.
|
|
19
|
+
*/
|
|
20
|
+
get invocationId() {
|
|
21
|
+
return this.invocationContext.invocationId;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* The current agent name.
|
|
25
|
+
*/
|
|
26
|
+
get agentName() {
|
|
27
|
+
return this.invocationContext.agent.name;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* The state of the current session.
|
|
31
|
+
*/
|
|
32
|
+
get state() {
|
|
33
|
+
return new State(this.invocationContext.session.state, {});
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export {
|
|
37
|
+
ReadonlyContext
|
|
38
|
+
};
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { logger } from "../utils/logger.js";
|
|
7
|
+
var StreamingMode = /* @__PURE__ */ ((StreamingMode2) => {
|
|
8
|
+
StreamingMode2["NONE"] = "none";
|
|
9
|
+
StreamingMode2["SSE"] = "sse";
|
|
10
|
+
StreamingMode2["BIDI"] = "bidi";
|
|
11
|
+
return StreamingMode2;
|
|
12
|
+
})(StreamingMode || {});
|
|
13
|
+
class RunConfig {
|
|
14
|
+
constructor(params = {}) {
|
|
15
|
+
this.speechConfig = params.speechConfig;
|
|
16
|
+
this.responseModalities = params.responseModalities;
|
|
17
|
+
this.saveInputBlobsAsArtifacts = params.saveInputBlobsAsArtifacts || false;
|
|
18
|
+
this.supportCfc = params.supportCfc || false;
|
|
19
|
+
this.streamingMode = params.streamingMode || "none" /* NONE */;
|
|
20
|
+
this.outputAudioTranscription = params.outputAudioTranscription;
|
|
21
|
+
this.inputAudioTranscription = params.inputAudioTranscription;
|
|
22
|
+
this.enableAffectiveDialog = params.enableAffectiveDialog || false;
|
|
23
|
+
this.realtimeInputConfig = params.realtimeInputConfig;
|
|
24
|
+
this.maxLlmCalls = validateMaxLlmCalls(params.maxLlmCalls || 500);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function validateMaxLlmCalls(value) {
|
|
28
|
+
if (value > Number.MAX_SAFE_INTEGER) {
|
|
29
|
+
throw new Error(
|
|
30
|
+
`maxLlmCalls should be less than ${Number.MAX_SAFE_INTEGER}.`
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
if (value <= 0) {
|
|
34
|
+
logger.warn(
|
|
35
|
+
"maxLlmCalls is less than or equal to 0. This will result in no enforcement on total number of llm calls that will be made for a run. This may not be ideal, as this could result in a never ending communication between the model and the agent in certain cases."
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
return value;
|
|
39
|
+
}
|
|
40
|
+
export {
|
|
41
|
+
RunConfig,
|
|
42
|
+
StreamingMode
|
|
43
|
+
};
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { FunctionTool } from "../tools/function_tool.js";
|
|
7
|
+
import { BaseAgent } from "./base_agent.js";
|
|
8
|
+
import { LlmAgent } from "./llm_agent.js";
|
|
9
|
+
import { ReadonlyContext } from "./readonly_context.js";
|
|
10
|
+
const TASK_COMPLETED_TOOL_NAME = "task_completed";
|
|
11
|
+
class SequentialAgent extends BaseAgent {
|
|
12
|
+
async *runAsyncImpl(context) {
|
|
13
|
+
for (const subAgent of this.subAgents) {
|
|
14
|
+
for await (const event of subAgent.runAsync(context)) {
|
|
15
|
+
yield event;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Implementation for live SequentialAgent.
|
|
21
|
+
*
|
|
22
|
+
* Compared to the non-live case, live agents process a continuous stream of
|
|
23
|
+
* audio or video, so there is no way to tell if it's finished and should pass
|
|
24
|
+
* to the next agent or not. So we introduce a task_completed() function so
|
|
25
|
+
* the model can call this function to signal that it's finished the task and
|
|
26
|
+
* we can move on to the next agent.
|
|
27
|
+
*
|
|
28
|
+
* @param context: The invocation context of the agent.
|
|
29
|
+
*/
|
|
30
|
+
async *runLiveImpl(context) {
|
|
31
|
+
for (const subAgent of this.subAgents) {
|
|
32
|
+
if (subAgent instanceof LlmAgent) {
|
|
33
|
+
const agentTools = await subAgent.canonicalTools(new ReadonlyContext(context));
|
|
34
|
+
const taskCompletedToolAlreadyAdded = agentTools.some((tool) => tool.name === TASK_COMPLETED_TOOL_NAME);
|
|
35
|
+
if (!taskCompletedToolAlreadyAdded) {
|
|
36
|
+
subAgent.tools.push(new FunctionTool({
|
|
37
|
+
name: TASK_COMPLETED_TOOL_NAME,
|
|
38
|
+
description: `Signals that the model has successfully completed the user's question or task.`,
|
|
39
|
+
execute: () => "Task completion signaled."
|
|
40
|
+
}));
|
|
41
|
+
subAgent.instruction += `If you finished the user's request according to its description, call the ${TASK_COMPLETED_TOOL_NAME} function to exit so the next agents can take over. When calling this function, do not generate any text other than the function call.`;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
for (const subAgent of this.subAgents) {
|
|
46
|
+
for await (const event of subAgent.runLive(context)) {
|
|
47
|
+
yield event;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
export {
|
|
53
|
+
SequentialAgent
|
|
54
|
+
};
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
class InMemoryArtifactService {
|
|
7
|
+
constructor() {
|
|
8
|
+
this.artifacts = {};
|
|
9
|
+
}
|
|
10
|
+
saveArtifact({
|
|
11
|
+
appName,
|
|
12
|
+
userId,
|
|
13
|
+
sessionId,
|
|
14
|
+
filename,
|
|
15
|
+
artifact
|
|
16
|
+
}) {
|
|
17
|
+
const path = artifactPath(appName, userId, sessionId, filename);
|
|
18
|
+
if (!this.artifacts[path]) {
|
|
19
|
+
this.artifacts[path] = [];
|
|
20
|
+
}
|
|
21
|
+
const version = this.artifacts[path].length;
|
|
22
|
+
this.artifacts[path].push(artifact);
|
|
23
|
+
return Promise.resolve(version);
|
|
24
|
+
}
|
|
25
|
+
loadArtifact({
|
|
26
|
+
appName,
|
|
27
|
+
userId,
|
|
28
|
+
sessionId,
|
|
29
|
+
filename,
|
|
30
|
+
version
|
|
31
|
+
}) {
|
|
32
|
+
const path = artifactPath(appName, userId, sessionId, filename);
|
|
33
|
+
const versions = this.artifacts[path];
|
|
34
|
+
if (!versions) {
|
|
35
|
+
return Promise.resolve(void 0);
|
|
36
|
+
}
|
|
37
|
+
if (version === void 0) {
|
|
38
|
+
version = versions.length - 1;
|
|
39
|
+
}
|
|
40
|
+
return Promise.resolve(versions[version]);
|
|
41
|
+
}
|
|
42
|
+
listArtifactKeys({ appName, userId, sessionId }) {
|
|
43
|
+
const sessionPrefix = `${appName}/${userId}/${sessionId}/`;
|
|
44
|
+
const usernamespacePrefix = `${appName}/${userId}/user/`;
|
|
45
|
+
const filenames = [];
|
|
46
|
+
for (const path in this.artifacts) {
|
|
47
|
+
if (path.startsWith(sessionPrefix)) {
|
|
48
|
+
const filename = path.replace(sessionPrefix, "");
|
|
49
|
+
filenames.push(filename);
|
|
50
|
+
} else if (path.startsWith(usernamespacePrefix)) {
|
|
51
|
+
const filename = path.replace(usernamespacePrefix, "");
|
|
52
|
+
filenames.push(filename);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return Promise.resolve(filenames.sort());
|
|
56
|
+
}
|
|
57
|
+
deleteArtifact({ appName, userId, sessionId, filename }) {
|
|
58
|
+
const path = artifactPath(appName, userId, sessionId, filename);
|
|
59
|
+
if (!this.artifacts[path]) {
|
|
60
|
+
return Promise.resolve();
|
|
61
|
+
}
|
|
62
|
+
delete this.artifacts[path];
|
|
63
|
+
return Promise.resolve();
|
|
64
|
+
}
|
|
65
|
+
listVersions({ appName, userId, sessionId, filename }) {
|
|
66
|
+
const path = artifactPath(appName, userId, sessionId, filename);
|
|
67
|
+
const artifacts = this.artifacts[path];
|
|
68
|
+
if (!artifacts) {
|
|
69
|
+
return Promise.resolve([]);
|
|
70
|
+
}
|
|
71
|
+
let versions = [];
|
|
72
|
+
for (let i = 0; i < artifacts.length; i++) {
|
|
73
|
+
versions.push(i);
|
|
74
|
+
}
|
|
75
|
+
return Promise.resolve(versions);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
function artifactPath(appName, userId, sessionId, filename) {
|
|
79
|
+
if (fileHasUserNamespace(filename)) {
|
|
80
|
+
return `${appName}/${userId}/user/${filename}`;
|
|
81
|
+
}
|
|
82
|
+
return `${appName}/${userId}/${sessionId}/${filename}`;
|
|
83
|
+
}
|
|
84
|
+
function fileHasUserNamespace(filename) {
|
|
85
|
+
return filename.startsWith("user:");
|
|
86
|
+
}
|
|
87
|
+
export {
|
|
88
|
+
InMemoryArtifactService
|
|
89
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
var AuthCredentialTypes = /* @__PURE__ */ ((AuthCredentialTypes2) => {
|
|
7
|
+
AuthCredentialTypes2["API_KEY"] = "apiKey";
|
|
8
|
+
AuthCredentialTypes2["HTTP"] = "http";
|
|
9
|
+
AuthCredentialTypes2["OAUTH2"] = "oauth2";
|
|
10
|
+
AuthCredentialTypes2["OPEN_ID_CONNECT"] = "openIdConnect";
|
|
11
|
+
AuthCredentialTypes2["SERVICE_ACCOUNT"] = "serviceAccount";
|
|
12
|
+
return AuthCredentialTypes2;
|
|
13
|
+
})(AuthCredentialTypes || {});
|
|
14
|
+
export {
|
|
15
|
+
AuthCredentialTypes
|
|
16
|
+
};
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
class AuthHandler {
|
|
7
|
+
constructor(authConfig) {
|
|
8
|
+
this.authConfig = authConfig;
|
|
9
|
+
}
|
|
10
|
+
getAuthResponse(state) {
|
|
11
|
+
const credentialKey = "temp:" + this.authConfig.credentialKey;
|
|
12
|
+
return state.get(credentialKey);
|
|
13
|
+
}
|
|
14
|
+
generateAuthRequest() {
|
|
15
|
+
var _a, _b;
|
|
16
|
+
const authSchemeType = this.authConfig.authScheme.type;
|
|
17
|
+
if (!["oauth2", "openIdConnect"].includes(authSchemeType)) {
|
|
18
|
+
return this.authConfig;
|
|
19
|
+
}
|
|
20
|
+
if ((_b = (_a = this.authConfig.exchangedAuthCredential) == null ? void 0 : _a.oauth2) == null ? void 0 : _b.authUri) {
|
|
21
|
+
return this.authConfig;
|
|
22
|
+
}
|
|
23
|
+
if (!this.authConfig.rawAuthCredential) {
|
|
24
|
+
throw new Error(`Auth Scheme ${authSchemeType} requires authCredential.`);
|
|
25
|
+
}
|
|
26
|
+
if (!this.authConfig.rawAuthCredential.oauth2) {
|
|
27
|
+
throw new Error(
|
|
28
|
+
`Auth Scheme ${authSchemeType} requires oauth2 in authCredential.`
|
|
29
|
+
);
|
|
30
|
+
}
|
|
31
|
+
if (this.authConfig.rawAuthCredential.oauth2.authUri) {
|
|
32
|
+
return {
|
|
33
|
+
credentialKey: this.authConfig.credentialKey,
|
|
34
|
+
authScheme: this.authConfig.authScheme,
|
|
35
|
+
rawAuthCredential: this.authConfig.rawAuthCredential,
|
|
36
|
+
exchangedAuthCredential: this.authConfig.rawAuthCredential
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
if (!this.authConfig.rawAuthCredential.oauth2.clientId || !this.authConfig.rawAuthCredential.oauth2.clientSecret) {
|
|
40
|
+
throw new Error(`Auth Scheme ${authSchemeType} requires both clientId and clientSecret in authCredential.oauth2.`);
|
|
41
|
+
}
|
|
42
|
+
return {
|
|
43
|
+
credentialKey: this.authConfig.credentialKey,
|
|
44
|
+
authScheme: this.authConfig.authScheme,
|
|
45
|
+
rawAuthCredential: this.authConfig.rawAuthCredential,
|
|
46
|
+
exchangedAuthCredential: this.generateAuthUri()
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Generates an response containing the auth uri for user to sign in.
|
|
51
|
+
*
|
|
52
|
+
* @return An AuthCredential object containing the auth URI and state.
|
|
53
|
+
* @throws Error: If the authorization endpoint is not configured in the
|
|
54
|
+
* auth scheme.
|
|
55
|
+
*/
|
|
56
|
+
generateAuthUri() {
|
|
57
|
+
return this.authConfig.rawAuthCredential;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
export {
|
|
61
|
+
AuthHandler
|
|
62
|
+
};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
var OAuthGrantType = /* @__PURE__ */ ((OAuthGrantType2) => {
|
|
7
|
+
OAuthGrantType2["CLIENT_CREDENTIALS"] = "client_credentials";
|
|
8
|
+
OAuthGrantType2["AUTHORIZATION_CODE"] = "authorization_code";
|
|
9
|
+
OAuthGrantType2["IMPLICIT"] = "implicit";
|
|
10
|
+
OAuthGrantType2["PASSWORD"] = "password";
|
|
11
|
+
return OAuthGrantType2;
|
|
12
|
+
})(OAuthGrantType || {});
|
|
13
|
+
function getOAuthGrantTypeFromFlow(flow) {
|
|
14
|
+
if (flow.clientCredentials) {
|
|
15
|
+
return "client_credentials" /* CLIENT_CREDENTIALS */;
|
|
16
|
+
}
|
|
17
|
+
if (flow.authorizationCode) {
|
|
18
|
+
return "authorization_code" /* AUTHORIZATION_CODE */;
|
|
19
|
+
}
|
|
20
|
+
if (flow.implicit) {
|
|
21
|
+
return "implicit" /* IMPLICIT */;
|
|
22
|
+
}
|
|
23
|
+
if (flow.password) {
|
|
24
|
+
return "password" /* PASSWORD */;
|
|
25
|
+
}
|
|
26
|
+
return void 0;
|
|
27
|
+
}
|
|
28
|
+
export {
|
|
29
|
+
OAuthGrantType,
|
|
30
|
+
getOAuthGrantTypeFromFlow
|
|
31
|
+
};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
class InMemoryCredentialService {
|
|
7
|
+
constructor() {
|
|
8
|
+
this.credentials = {};
|
|
9
|
+
}
|
|
10
|
+
loadCredential(authConfig, toolContext) {
|
|
11
|
+
const credentialBucket = this.getBucketForCurrentContext(toolContext);
|
|
12
|
+
return Promise.resolve(credentialBucket[authConfig.credentialKey]);
|
|
13
|
+
}
|
|
14
|
+
async saveCredential(authConfig, toolContext) {
|
|
15
|
+
const credentialBucket = this.getBucketForCurrentContext(toolContext);
|
|
16
|
+
if (authConfig.exchangedAuthCredential) {
|
|
17
|
+
credentialBucket[authConfig.credentialKey] = authConfig.exchangedAuthCredential;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
getBucketForCurrentContext(toolContext) {
|
|
21
|
+
const { appName, userId } = toolContext.invocationContext.session;
|
|
22
|
+
if (!this.credentials[appName]) {
|
|
23
|
+
this.credentials[appName] = {};
|
|
24
|
+
}
|
|
25
|
+
if (!this.credentials[appName][userId]) {
|
|
26
|
+
this.credentials[appName][userId] = {};
|
|
27
|
+
}
|
|
28
|
+
return this.credentials[appName][userId];
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export {
|
|
32
|
+
InMemoryCredentialService
|
|
33
|
+
};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
class BaseCodeExecutor {
|
|
7
|
+
constructor() {
|
|
8
|
+
/**
|
|
9
|
+
* If true, extract and process data files from the model request
|
|
10
|
+
* and attach them to the code executor.
|
|
11
|
+
*
|
|
12
|
+
* Supported data file MimeTypes are [text/csv].
|
|
13
|
+
* Default to false.
|
|
14
|
+
*/
|
|
15
|
+
this.optimizeDataFile = false;
|
|
16
|
+
/**
|
|
17
|
+
* Whether the code executor is stateful. Default to false.
|
|
18
|
+
*/
|
|
19
|
+
this.stateful = false;
|
|
20
|
+
/**
|
|
21
|
+
* The number of attempts to retry on consecutive code execution errors.
|
|
22
|
+
* Default to 2.
|
|
23
|
+
*/
|
|
24
|
+
this.errorRetryAttempts = 2;
|
|
25
|
+
/**
|
|
26
|
+
* The list of the enclosing delimiters to identify the code blocks.
|
|
27
|
+
* For example, the delimiter('```python\\n', '\\n```') can be used to
|
|
28
|
+
* identify code blocks with the following format::
|
|
29
|
+
*
|
|
30
|
+
* ```python
|
|
31
|
+
* print("hello")
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
this.codeBlockDelimiters = [
|
|
35
|
+
["```tool_code\n", "\n```"],
|
|
36
|
+
["```python\n", "\n```"]
|
|
37
|
+
];
|
|
38
|
+
/**
|
|
39
|
+
* The delimiters to format the code execution result.
|
|
40
|
+
*/
|
|
41
|
+
this.executionResultDelimiters = ["```tool_output\n", "\n```"];
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
export {
|
|
45
|
+
BaseCodeExecutor
|
|
46
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { isGemini2Model } from "../utils/model_name.js";
|
|
7
|
+
import { BaseCodeExecutor } from "./base_code_executor.js";
|
|
8
|
+
class BuiltInCodeExecutor extends BaseCodeExecutor {
|
|
9
|
+
executeCode(params) {
|
|
10
|
+
return Promise.resolve({
|
|
11
|
+
stdout: "",
|
|
12
|
+
stderr: "",
|
|
13
|
+
outputFiles: []
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
processLlmRequest(llmRequest) {
|
|
17
|
+
if (llmRequest.model && isGemini2Model(llmRequest.model)) {
|
|
18
|
+
llmRequest.config = llmRequest.config || {};
|
|
19
|
+
llmRequest.config.tools = llmRequest.config.tools || [];
|
|
20
|
+
llmRequest.config.tools.push({ codeExecution: {} });
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
throw new Error(`Gemini code execution tool is not supported for model ${llmRequest.model}`);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export {
|
|
27
|
+
BuiltInCodeExecutor
|
|
28
|
+
};
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { Language, Outcome } from "@google/genai";
|
|
7
|
+
import { deepClone } from "../utils/deep_clone.js";
|
|
8
|
+
import { base64Encode, isBase64Encoded } from "../utils/env_aware_utils.js";
|
|
9
|
+
function getEncodedFileContent(data) {
|
|
10
|
+
return isBase64Encoded(data) ? data : base64Encode(data);
|
|
11
|
+
}
|
|
12
|
+
function extractCodeAndTruncateContent(content, codeBlockDelimiters) {
|
|
13
|
+
var _a;
|
|
14
|
+
if (!((_a = content.parts) == null ? void 0 : _a.length)) {
|
|
15
|
+
return "";
|
|
16
|
+
}
|
|
17
|
+
for (let i = 0; i < content.parts.length; i++) {
|
|
18
|
+
const part = content.parts[i];
|
|
19
|
+
if (part.executableCode && (i === content.parts.length - 1 || !content.parts[i + 1].codeExecutionResult)) {
|
|
20
|
+
content.parts = content.parts.slice(0, i + 1);
|
|
21
|
+
return part.executableCode.code;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
const textParts = content.parts.filter((part) => part.text);
|
|
25
|
+
if (!textParts.length) {
|
|
26
|
+
return "";
|
|
27
|
+
}
|
|
28
|
+
const firstTextPart = deepClone(textParts[0]);
|
|
29
|
+
const responseText = textParts.map((part) => part.text).join("\n");
|
|
30
|
+
const leadingDelimiterPattern = codeBlockDelimiters.map((d) => d[0]).join("|");
|
|
31
|
+
const trailingDelimiterPattern = codeBlockDelimiters.map((d) => d[1]).join("|");
|
|
32
|
+
const match = new RegExp(
|
|
33
|
+
`?<prefix>.*?)(${leadingDelimiterPattern})(?<codeStr>.*?)(${trailingDelimiterPattern})(?<suffix>.*?)$`,
|
|
34
|
+
"s"
|
|
35
|
+
).exec(responseText);
|
|
36
|
+
const { prefix, codeStr } = (match == null ? void 0 : match.groups) || {};
|
|
37
|
+
if (!codeStr) {
|
|
38
|
+
return "";
|
|
39
|
+
}
|
|
40
|
+
content.parts = [];
|
|
41
|
+
if (prefix) {
|
|
42
|
+
firstTextPart.text = prefix;
|
|
43
|
+
content.parts.push(firstTextPart);
|
|
44
|
+
}
|
|
45
|
+
content.parts.push(buildExecutableCodePart(codeStr));
|
|
46
|
+
return codeStr;
|
|
47
|
+
}
|
|
48
|
+
function buildExecutableCodePart(code) {
|
|
49
|
+
return {
|
|
50
|
+
text: code,
|
|
51
|
+
executableCode: {
|
|
52
|
+
code,
|
|
53
|
+
language: Language.PYTHON
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
function buildCodeExecutionResultPart(codeExecutionResult) {
|
|
58
|
+
if (codeExecutionResult.stderr) {
|
|
59
|
+
return {
|
|
60
|
+
text: codeExecutionResult.stderr,
|
|
61
|
+
codeExecutionResult: {
|
|
62
|
+
outcome: Outcome.OUTCOME_FAILED
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
const finalResult = [];
|
|
67
|
+
if (codeExecutionResult.stdout || !codeExecutionResult.outputFiles) {
|
|
68
|
+
finalResult.push(`Code execution result:
|
|
69
|
+
${codeExecutionResult.stdout}
|
|
70
|
+
`);
|
|
71
|
+
}
|
|
72
|
+
if (codeExecutionResult.outputFiles) {
|
|
73
|
+
finalResult.push(
|
|
74
|
+
`Saved artifacts:
|
|
75
|
+
` + codeExecutionResult.outputFiles.map((f) => f.name).join(", ")
|
|
76
|
+
);
|
|
77
|
+
}
|
|
78
|
+
return {
|
|
79
|
+
text: finalResult.join("\n\n"),
|
|
80
|
+
codeExecutionResult: {
|
|
81
|
+
outcome: Outcome.OUTCOME_OK
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
function convertCodeExecutionParts(content, codeBlockDelimiter, executionResultDelimiters) {
|
|
86
|
+
var _a;
|
|
87
|
+
if (!((_a = content.parts) == null ? void 0 : _a.length)) {
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
const lastPart = content.parts[content.parts.length - 1];
|
|
91
|
+
if (lastPart.executableCode) {
|
|
92
|
+
content.parts[content.parts.length - 1] = {
|
|
93
|
+
text: codeBlockDelimiter[0] + lastPart.executableCode.code + codeBlockDelimiter[1]
|
|
94
|
+
};
|
|
95
|
+
} else if (content.parts.length == 1 && lastPart.codeExecutionResult) {
|
|
96
|
+
content.parts[content.parts.length - 1] = {
|
|
97
|
+
text: executionResultDelimiters[0] + lastPart.codeExecutionResult.output + executionResultDelimiters[1]
|
|
98
|
+
};
|
|
99
|
+
content.role = "user";
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
export {
|
|
103
|
+
buildCodeExecutionResultPart,
|
|
104
|
+
buildExecutableCodePart,
|
|
105
|
+
convertCodeExecutionParts,
|
|
106
|
+
extractCodeAndTruncateContent,
|
|
107
|
+
getEncodedFileContent
|
|
108
|
+
};
|