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