google-adk 0.0.1__py3-none-any.whl → 0.0.3__py3-none-any.whl
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.
- google/adk/._version.py +0 -0
- google/adk/__init__.py +20 -0
- google/adk/agents/__init__.py +32 -0
- google/adk/agents/active_streaming_tool.py +38 -0
- google/adk/agents/base_agent.py +345 -0
- google/adk/agents/callback_context.py +112 -0
- google/adk/agents/invocation_context.py +181 -0
- google/adk/agents/langgraph_agent.py +140 -0
- google/adk/agents/live_request_queue.py +64 -0
- google/adk/agents/llm_agent.py +376 -0
- google/adk/agents/loop_agent.py +62 -0
- google/adk/agents/parallel_agent.py +96 -0
- google/adk/agents/readonly_context.py +46 -0
- google/adk/agents/remote_agent.py +50 -0
- google/adk/agents/run_config.py +87 -0
- google/adk/agents/sequential_agent.py +45 -0
- google/adk/agents/transcription_entry.py +34 -0
- google/adk/artifacts/__init__.py +23 -0
- google/adk/artifacts/base_artifact_service.py +128 -0
- google/adk/artifacts/gcs_artifact_service.py +195 -0
- google/adk/artifacts/in_memory_artifact_service.py +133 -0
- google/adk/auth/__init__.py +22 -0
- google/adk/auth/auth_credential.py +220 -0
- google/adk/auth/auth_handler.py +268 -0
- google/adk/auth/auth_preprocessor.py +116 -0
- google/adk/auth/auth_schemes.py +67 -0
- google/adk/auth/auth_tool.py +55 -0
- google/adk/cli/__init__.py +15 -0
- google/adk/cli/__main__.py +18 -0
- google/adk/cli/agent_graph.py +148 -0
- google/adk/cli/browser/adk_favicon.svg +17 -0
- google/adk/cli/browser/assets/audio-processor.js +51 -0
- google/adk/cli/browser/assets/config/runtime-config.json +3 -0
- google/adk/cli/browser/index.html +33 -0
- google/adk/cli/browser/main-SY2WYYGV.js +75 -0
- google/adk/cli/browser/polyfills-FFHMD2TL.js +18 -0
- google/adk/cli/browser/styles-4VDSPQ37.css +17 -0
- google/adk/cli/cli.py +181 -0
- google/adk/cli/cli_deploy.py +181 -0
- google/adk/cli/cli_eval.py +282 -0
- google/adk/cli/cli_tools_click.py +524 -0
- google/adk/cli/fast_api.py +784 -0
- google/adk/cli/utils/__init__.py +49 -0
- google/adk/cli/utils/envs.py +57 -0
- google/adk/cli/utils/evals.py +93 -0
- google/adk/cli/utils/logs.py +72 -0
- google/adk/code_executors/__init__.py +49 -0
- google/adk/code_executors/base_code_executor.py +97 -0
- google/adk/code_executors/code_execution_utils.py +256 -0
- google/adk/code_executors/code_executor_context.py +202 -0
- google/adk/code_executors/container_code_executor.py +196 -0
- google/adk/code_executors/unsafe_local_code_executor.py +71 -0
- google/adk/code_executors/vertex_ai_code_executor.py +234 -0
- google/adk/docs/Makefile +20 -0
- google/adk/docs/build/doctrees/google-adk.doctree +0 -0
- google/adk/docs/build/html/_sources/google-adk.rst.txt +98 -0
- google/adk/docs/build/html/_sources/index.rst.txt +7 -0
- google/adk/docs/build/html/_static/autodoc_pydantic.css +27 -0
- google/adk/docs/build/html/_static/basic.css +925 -0
- google/adk/docs/build/html/_static/debug.css +85 -0
- google/adk/docs/build/html/_static/doctools.js +156 -0
- google/adk/docs/build/html/_static/documentation_options.js +29 -0
- google/adk/docs/build/html/_static/file.png +0 -0
- google/adk/docs/build/html/_static/language_data.js +199 -0
- google/adk/docs/build/html/_static/minus.png +0 -0
- google/adk/docs/build/html/_static/plus.png +0 -0
- google/adk/docs/build/html/_static/pygments.css +274 -0
- google/adk/docs/build/html/_static/scripts/furo-extensions.js +16 -0
- google/adk/docs/build/html/_static/scripts/furo.js +19 -0
- google/adk/docs/build/html/_static/scripts/furo.js.LICENSE.txt +7 -0
- google/adk/docs/build/html/_static/scripts/furo.js.map +1 -0
- google/adk/docs/build/html/_static/searchtools.js +620 -0
- google/adk/docs/build/html/_static/skeleton.css +312 -0
- google/adk/docs/build/html/_static/sphinx_highlight.js +170 -0
- google/adk/docs/build/html/_static/styles/furo-extensions.css +18 -0
- google/adk/docs/build/html/_static/styles/furo-extensions.css.map +1 -0
- google/adk/docs/build/html/_static/styles/furo.css +18 -0
- google/adk/docs/build/html/_static/styles/furo.css.map +1 -0
- google/adk/docs/build/html/genindex.html +861 -0
- google/adk/docs/build/html/google-adk.html +5461 -0
- google/adk/docs/build/html/index.html +567 -0
- google/adk/docs/build/html/objects.inv +0 -0
- google/adk/docs/build/html/py-modindex.html +373 -0
- google/adk/docs/build/html/search.html +333 -0
- google/adk/docs/build/html/searchindex.js +17 -0
- google/adk/docs/source/conf.py +133 -0
- google/adk/docs/source/google-adk.rst +98 -0
- google/adk/docs/source/index.rst +7 -0
- google/adk/evaluation/__init__.py +31 -0
- google/adk/evaluation/agent_evaluator.py +329 -0
- google/adk/evaluation/evaluation_constants.py +24 -0
- google/adk/evaluation/evaluation_generator.py +270 -0
- google/adk/evaluation/response_evaluator.py +135 -0
- google/adk/evaluation/trajectory_evaluator.py +184 -0
- google/adk/events/__init__.py +21 -0
- google/adk/events/event.py +130 -0
- google/adk/events/event_actions.py +55 -0
- google/adk/examples/__init__.py +28 -0
- google/adk/examples/base_example_provider.py +35 -0
- google/adk/examples/example.py +27 -0
- google/adk/examples/example_util.py +123 -0
- google/adk/examples/vertex_ai_example_store.py +104 -0
- google/adk/flows/__init__.py +14 -0
- google/adk/flows/llm_flows/__init__.py +20 -0
- google/adk/flows/llm_flows/_base_llm_processor.py +52 -0
- google/adk/flows/llm_flows/_code_execution.py +458 -0
- google/adk/flows/llm_flows/_nl_planning.py +129 -0
- google/adk/flows/llm_flows/agent_transfer.py +132 -0
- google/adk/flows/llm_flows/audio_transcriber.py +109 -0
- google/adk/flows/llm_flows/auto_flow.py +49 -0
- google/adk/flows/llm_flows/base_llm_flow.py +559 -0
- google/adk/flows/llm_flows/basic.py +72 -0
- google/adk/flows/llm_flows/contents.py +370 -0
- google/adk/flows/llm_flows/functions.py +486 -0
- google/adk/flows/llm_flows/identity.py +47 -0
- google/adk/flows/llm_flows/instructions.py +137 -0
- google/adk/flows/llm_flows/single_flow.py +57 -0
- google/adk/memory/__init__.py +35 -0
- google/adk/memory/base_memory_service.py +74 -0
- google/adk/memory/in_memory_memory_service.py +62 -0
- google/adk/memory/vertex_ai_rag_memory_service.py +177 -0
- google/adk/models/__init__.py +31 -0
- google/adk/models/anthropic_llm.py +243 -0
- google/adk/models/base_llm.py +87 -0
- google/adk/models/base_llm_connection.py +76 -0
- google/adk/models/gemini_llm_connection.py +200 -0
- google/adk/models/google_llm.py +331 -0
- google/adk/models/lite_llm.py +673 -0
- google/adk/models/llm_request.py +98 -0
- google/adk/models/llm_response.py +111 -0
- google/adk/models/registry.py +102 -0
- google/adk/planners/__init__.py +23 -0
- google/adk/planners/base_planner.py +66 -0
- google/adk/planners/built_in_planner.py +75 -0
- google/adk/planners/plan_re_act_planner.py +208 -0
- google/adk/runners.py +456 -0
- google/adk/sessions/__init__.py +41 -0
- google/adk/sessions/base_session_service.py +133 -0
- google/adk/sessions/database_session_service.py +522 -0
- google/adk/sessions/in_memory_session_service.py +206 -0
- google/adk/sessions/session.py +54 -0
- google/adk/sessions/state.py +71 -0
- google/adk/sessions/vertex_ai_session_service.py +356 -0
- google/adk/telemetry.py +189 -0
- google/adk/tests/__init__.py +14 -0
- google/adk/tests/integration/.env.example +10 -0
- google/adk/tests/integration/__init__.py +18 -0
- google/adk/tests/integration/conftest.py +119 -0
- google/adk/tests/integration/fixture/__init__.py +14 -0
- google/adk/tests/integration/fixture/agent_with_config/__init__.py +15 -0
- google/adk/tests/integration/fixture/agent_with_config/agent.py +88 -0
- google/adk/tests/integration/fixture/callback_agent/__init__.py +15 -0
- google/adk/tests/integration/fixture/callback_agent/agent.py +105 -0
- google/adk/tests/integration/fixture/context_update_test/OWNERS +1 -0
- google/adk/tests/integration/fixture/context_update_test/__init__.py +15 -0
- google/adk/tests/integration/fixture/context_update_test/agent.py +43 -0
- google/adk/tests/integration/fixture/context_update_test/successful_test.session.json +582 -0
- google/adk/tests/integration/fixture/context_variable_agent/__init__.py +15 -0
- google/adk/tests/integration/fixture/context_variable_agent/agent.py +115 -0
- google/adk/tests/integration/fixture/customer_support_ma/__init__.py +15 -0
- google/adk/tests/integration/fixture/customer_support_ma/agent.py +172 -0
- google/adk/tests/integration/fixture/ecommerce_customer_service_agent/__init__.py +15 -0
- google/adk/tests/integration/fixture/ecommerce_customer_service_agent/agent.py +338 -0
- google/adk/tests/integration/fixture/ecommerce_customer_service_agent/order_query.test.json +69 -0
- google/adk/tests/integration/fixture/ecommerce_customer_service_agent/test_config.json +6 -0
- google/adk/tests/integration/fixture/flow_complex_spark/__init__.py +15 -0
- google/adk/tests/integration/fixture/flow_complex_spark/agent.py +182 -0
- google/adk/tests/integration/fixture/flow_complex_spark/sample.session.json +190 -0
- google/adk/tests/integration/fixture/hello_world_agent/__init__.py +15 -0
- google/adk/tests/integration/fixture/hello_world_agent/agent.py +95 -0
- google/adk/tests/integration/fixture/hello_world_agent/roll_die.test.json +24 -0
- google/adk/tests/integration/fixture/hello_world_agent/test_config.json +6 -0
- google/adk/tests/integration/fixture/home_automation_agent/__init__.py +15 -0
- google/adk/tests/integration/fixture/home_automation_agent/agent.py +304 -0
- google/adk/tests/integration/fixture/home_automation_agent/simple_test.test.json +5 -0
- google/adk/tests/integration/fixture/home_automation_agent/simple_test2.test.json +5 -0
- google/adk/tests/integration/fixture/home_automation_agent/test_config.json +5 -0
- google/adk/tests/integration/fixture/home_automation_agent/test_files/dependent_tool_calls.test.json +18 -0
- google/adk/tests/integration/fixture/home_automation_agent/test_files/memorizing_past_events/eval_data.test.json +17 -0
- google/adk/tests/integration/fixture/home_automation_agent/test_files/memorizing_past_events/test_config.json +6 -0
- google/adk/tests/integration/fixture/home_automation_agent/test_files/simple_multi_turn_conversation.test.json +18 -0
- google/adk/tests/integration/fixture/home_automation_agent/test_files/simple_test.test.json +17 -0
- google/adk/tests/integration/fixture/home_automation_agent/test_files/simple_test2.test.json +5 -0
- google/adk/tests/integration/fixture/home_automation_agent/test_files/test_config.json +5 -0
- google/adk/tests/integration/fixture/tool_agent/__init__.py +15 -0
- google/adk/tests/integration/fixture/tool_agent/agent.py +218 -0
- google/adk/tests/integration/fixture/tool_agent/files/Agent_test_plan.pdf +0 -0
- google/adk/tests/integration/fixture/trip_planner_agent/__init__.py +15 -0
- google/adk/tests/integration/fixture/trip_planner_agent/agent.py +110 -0
- google/adk/tests/integration/fixture/trip_planner_agent/initial.session.json +13 -0
- google/adk/tests/integration/fixture/trip_planner_agent/test_config.json +5 -0
- google/adk/tests/integration/fixture/trip_planner_agent/test_files/initial.session.json +13 -0
- google/adk/tests/integration/fixture/trip_planner_agent/test_files/test_config.json +5 -0
- google/adk/tests/integration/fixture/trip_planner_agent/test_files/trip_inquiry_sub_agent.test.json +7 -0
- google/adk/tests/integration/fixture/trip_planner_agent/trip_inquiry.test.json +19 -0
- google/adk/tests/integration/models/__init__.py +14 -0
- google/adk/tests/integration/models/test_google_llm.py +65 -0
- google/adk/tests/integration/test_callback.py +70 -0
- google/adk/tests/integration/test_context_variable.py +67 -0
- google/adk/tests/integration/test_evalute_agent_in_fixture.py +76 -0
- google/adk/tests/integration/test_multi_agent.py +28 -0
- google/adk/tests/integration/test_multi_turn.py +42 -0
- google/adk/tests/integration/test_single_agent.py +23 -0
- google/adk/tests/integration/test_sub_agent.py +26 -0
- google/adk/tests/integration/test_system_instruction.py +177 -0
- google/adk/tests/integration/test_tools.py +287 -0
- google/adk/tests/integration/test_with_test_file.py +34 -0
- google/adk/tests/integration/tools/__init__.py +14 -0
- google/adk/tests/integration/utils/__init__.py +16 -0
- google/adk/tests/integration/utils/asserts.py +75 -0
- google/adk/tests/integration/utils/test_runner.py +97 -0
- google/adk/tests/unittests/__init__.py +14 -0
- google/adk/tests/unittests/agents/__init__.py +14 -0
- google/adk/tests/unittests/agents/test_base_agent.py +407 -0
- google/adk/tests/unittests/agents/test_langgraph_agent.py +191 -0
- google/adk/tests/unittests/agents/test_llm_agent_callbacks.py +138 -0
- google/adk/tests/unittests/agents/test_llm_agent_fields.py +231 -0
- google/adk/tests/unittests/agents/test_loop_agent.py +136 -0
- google/adk/tests/unittests/agents/test_parallel_agent.py +92 -0
- google/adk/tests/unittests/agents/test_sequential_agent.py +114 -0
- google/adk/tests/unittests/artifacts/__init__.py +14 -0
- google/adk/tests/unittests/artifacts/test_artifact_service.py +276 -0
- google/adk/tests/unittests/auth/test_auth_handler.py +575 -0
- google/adk/tests/unittests/conftest.py +73 -0
- google/adk/tests/unittests/fast_api/__init__.py +14 -0
- google/adk/tests/unittests/fast_api/test_fast_api.py +269 -0
- google/adk/tests/unittests/flows/__init__.py +14 -0
- google/adk/tests/unittests/flows/llm_flows/__init__.py +14 -0
- google/adk/tests/unittests/flows/llm_flows/_test_examples.py +142 -0
- google/adk/tests/unittests/flows/llm_flows/test_agent_transfer.py +311 -0
- google/adk/tests/unittests/flows/llm_flows/test_functions_long_running.py +244 -0
- google/adk/tests/unittests/flows/llm_flows/test_functions_request_euc.py +346 -0
- google/adk/tests/unittests/flows/llm_flows/test_functions_sequential.py +93 -0
- google/adk/tests/unittests/flows/llm_flows/test_functions_simple.py +258 -0
- google/adk/tests/unittests/flows/llm_flows/test_identity.py +66 -0
- google/adk/tests/unittests/flows/llm_flows/test_instructions.py +164 -0
- google/adk/tests/unittests/flows/llm_flows/test_model_callbacks.py +142 -0
- google/adk/tests/unittests/flows/llm_flows/test_other_configs.py +46 -0
- google/adk/tests/unittests/flows/llm_flows/test_tool_callbacks.py +269 -0
- google/adk/tests/unittests/models/__init__.py +14 -0
- google/adk/tests/unittests/models/test_google_llm.py +224 -0
- google/adk/tests/unittests/models/test_litellm.py +804 -0
- google/adk/tests/unittests/models/test_models.py +60 -0
- google/adk/tests/unittests/sessions/__init__.py +14 -0
- google/adk/tests/unittests/sessions/test_session_service.py +227 -0
- google/adk/tests/unittests/sessions/test_vertex_ai_session_service.py +246 -0
- google/adk/tests/unittests/streaming/__init__.py +14 -0
- google/adk/tests/unittests/streaming/test_streaming.py +50 -0
- google/adk/tests/unittests/tools/__init__.py +14 -0
- google/adk/tests/unittests/tools/apihub_tool/clients/test_apihub_client.py +499 -0
- google/adk/tests/unittests/tools/apihub_tool/test_apihub_toolset.py +204 -0
- google/adk/tests/unittests/tools/application_integration_tool/clients/test_connections_client.py +600 -0
- google/adk/tests/unittests/tools/application_integration_tool/clients/test_integration_client.py +630 -0
- google/adk/tests/unittests/tools/application_integration_tool/test_application_integration_toolset.py +345 -0
- google/adk/tests/unittests/tools/google_api_tool/__init__.py +13 -0
- google/adk/tests/unittests/tools/google_api_tool/test_googleapi_to_openapi_converter.py +657 -0
- google/adk/tests/unittests/tools/openapi_tool/auth/credential_exchangers/test_auto_auth_credential_exchanger.py +145 -0
- google/adk/tests/unittests/tools/openapi_tool/auth/credential_exchangers/test_base_auth_credential_exchanger.py +68 -0
- google/adk/tests/unittests/tools/openapi_tool/auth/credential_exchangers/test_oauth2_exchanger.py +153 -0
- google/adk/tests/unittests/tools/openapi_tool/auth/credential_exchangers/test_service_account_exchanger.py +196 -0
- google/adk/tests/unittests/tools/openapi_tool/auth/test_auth_helper.py +573 -0
- google/adk/tests/unittests/tools/openapi_tool/common/test_common.py +436 -0
- google/adk/tests/unittests/tools/openapi_tool/openapi_spec_parser/test.yaml +1367 -0
- google/adk/tests/unittests/tools/openapi_tool/openapi_spec_parser/test_openapi_spec_parser.py +628 -0
- google/adk/tests/unittests/tools/openapi_tool/openapi_spec_parser/test_openapi_toolset.py +139 -0
- google/adk/tests/unittests/tools/openapi_tool/openapi_spec_parser/test_operation_parser.py +406 -0
- google/adk/tests/unittests/tools/openapi_tool/openapi_spec_parser/test_rest_api_tool.py +966 -0
- google/adk/tests/unittests/tools/openapi_tool/openapi_spec_parser/test_tool_auth_handler.py +201 -0
- google/adk/tests/unittests/tools/retrieval/__init__.py +14 -0
- google/adk/tests/unittests/tools/retrieval/test_vertex_ai_rag_retrieval.py +147 -0
- google/adk/tests/unittests/tools/test_agent_tool.py +167 -0
- google/adk/tests/unittests/tools/test_base_tool.py +141 -0
- google/adk/tests/unittests/tools/test_build_function_declaration.py +277 -0
- google/adk/tests/unittests/utils.py +304 -0
- google/adk/tools/__init__.py +51 -0
- google/adk/tools/_automatic_function_calling_util.py +346 -0
- google/adk/tools/agent_tool.py +176 -0
- google/adk/tools/apihub_tool/__init__.py +19 -0
- google/adk/tools/apihub_tool/apihub_toolset.py +209 -0
- google/adk/tools/apihub_tool/clients/__init__.py +13 -0
- google/adk/tools/apihub_tool/clients/apihub_client.py +332 -0
- google/adk/tools/apihub_tool/clients/secret_client.py +115 -0
- google/adk/tools/application_integration_tool/__init__.py +19 -0
- google/adk/tools/application_integration_tool/application_integration_toolset.py +230 -0
- google/adk/tools/application_integration_tool/clients/connections_client.py +903 -0
- google/adk/tools/application_integration_tool/clients/integration_client.py +253 -0
- google/adk/tools/base_tool.py +144 -0
- google/adk/tools/built_in_code_execution_tool.py +59 -0
- google/adk/tools/crewai_tool.py +72 -0
- google/adk/tools/example_tool.py +62 -0
- google/adk/tools/exit_loop_tool.py +23 -0
- google/adk/tools/function_parameter_parse_util.py +307 -0
- google/adk/tools/function_tool.py +87 -0
- google/adk/tools/get_user_choice_tool.py +28 -0
- google/adk/tools/google_api_tool/__init__.py +14 -0
- google/adk/tools/google_api_tool/google_api_tool.py +59 -0
- google/adk/tools/google_api_tool/google_api_tool_set.py +107 -0
- google/adk/tools/google_api_tool/google_api_tool_sets.py +55 -0
- google/adk/tools/google_api_tool/googleapi_to_openapi_converter.py +521 -0
- google/adk/tools/google_search_tool.py +68 -0
- google/adk/tools/langchain_tool.py +86 -0
- google/adk/tools/load_artifacts_tool.py +113 -0
- google/adk/tools/load_memory_tool.py +58 -0
- google/adk/tools/load_web_page.py +41 -0
- google/adk/tools/long_running_tool.py +39 -0
- google/adk/tools/mcp_tool/__init__.py +42 -0
- google/adk/tools/mcp_tool/conversion_utils.py +161 -0
- google/adk/tools/mcp_tool/mcp_tool.py +113 -0
- google/adk/tools/mcp_tool/mcp_toolset.py +272 -0
- google/adk/tools/openapi_tool/__init__.py +21 -0
- google/adk/tools/openapi_tool/auth/__init__.py +19 -0
- google/adk/tools/openapi_tool/auth/auth_helpers.py +498 -0
- google/adk/tools/openapi_tool/auth/credential_exchangers/__init__.py +25 -0
- google/adk/tools/openapi_tool/auth/credential_exchangers/auto_auth_credential_exchanger.py +105 -0
- google/adk/tools/openapi_tool/auth/credential_exchangers/base_credential_exchanger.py +55 -0
- google/adk/tools/openapi_tool/auth/credential_exchangers/oauth2_exchanger.py +117 -0
- google/adk/tools/openapi_tool/auth/credential_exchangers/service_account_exchanger.py +97 -0
- google/adk/tools/openapi_tool/common/__init__.py +19 -0
- google/adk/tools/openapi_tool/common/common.py +300 -0
- google/adk/tools/openapi_tool/openapi_spec_parser/__init__.py +32 -0
- google/adk/tools/openapi_tool/openapi_spec_parser/openapi_spec_parser.py +231 -0
- google/adk/tools/openapi_tool/openapi_spec_parser/openapi_toolset.py +144 -0
- google/adk/tools/openapi_tool/openapi_spec_parser/operation_parser.py +260 -0
- google/adk/tools/openapi_tool/openapi_spec_parser/rest_api_tool.py +496 -0
- google/adk/tools/openapi_tool/openapi_spec_parser/tool_auth_handler.py +268 -0
- google/adk/tools/preload_memory_tool.py +72 -0
- google/adk/tools/retrieval/__init__.py +36 -0
- google/adk/tools/retrieval/base_retrieval_tool.py +37 -0
- google/adk/tools/retrieval/files_retrieval.py +33 -0
- google/adk/tools/retrieval/llama_index_retrieval.py +41 -0
- google/adk/tools/retrieval/vertex_ai_rag_retrieval.py +107 -0
- google/adk/tools/tool_context.py +90 -0
- google/adk/tools/toolbox_tool.py +46 -0
- google/adk/tools/transfer_to_agent_tool.py +21 -0
- google/adk/tools/vertex_ai_search_tool.py +96 -0
- google/adk/version.py +16 -0
- google_adk-0.0.3.dist-info/METADATA +73 -0
- google_adk-0.0.3.dist-info/RECORD +340 -0
- {google_adk-0.0.1.dist-info → google_adk-0.0.3.dist-info}/WHEEL +1 -2
- google_adk-0.0.3.dist-info/entry_points.txt +3 -0
- agent_kit/__init__.py +0 -0
- google_adk-0.0.1.dist-info/LICENSE.txt +0 -170
- google_adk-0.0.1.dist-info/METADATA +0 -15
- google_adk-0.0.1.dist-info/RECORD +0 -6
- google_adk-0.0.1.dist-info/top_level.txt +0 -1
google/adk/runners.py
ADDED
@@ -0,0 +1,456 @@
|
|
1
|
+
# Copyright 2025 Google LLC
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
|
17
|
+
import asyncio
|
18
|
+
import logging
|
19
|
+
import queue
|
20
|
+
import threading
|
21
|
+
from typing import AsyncGenerator
|
22
|
+
from typing import Generator
|
23
|
+
from typing import Optional
|
24
|
+
|
25
|
+
from deprecated import deprecated
|
26
|
+
from google.genai import types
|
27
|
+
|
28
|
+
from .agents.active_streaming_tool import ActiveStreamingTool
|
29
|
+
from .agents.base_agent import BaseAgent
|
30
|
+
from .agents.invocation_context import InvocationContext
|
31
|
+
from .agents.invocation_context import new_invocation_context_id
|
32
|
+
from .agents.live_request_queue import LiveRequestQueue
|
33
|
+
from .agents.llm_agent import LlmAgent
|
34
|
+
from .agents.run_config import RunConfig
|
35
|
+
from .agents.run_config import StreamingMode
|
36
|
+
from .artifacts.base_artifact_service import BaseArtifactService
|
37
|
+
from .artifacts.in_memory_artifact_service import InMemoryArtifactService
|
38
|
+
from .events.event import Event
|
39
|
+
from .memory.base_memory_service import BaseMemoryService
|
40
|
+
from .memory.in_memory_memory_service import InMemoryMemoryService
|
41
|
+
from .sessions.base_session_service import BaseSessionService
|
42
|
+
from .sessions.in_memory_session_service import InMemorySessionService
|
43
|
+
from .sessions.session import Session
|
44
|
+
from .telemetry import tracer
|
45
|
+
from .tools.built_in_code_execution_tool import built_in_code_execution
|
46
|
+
|
47
|
+
logger = logging.getLogger(__name__)
|
48
|
+
|
49
|
+
|
50
|
+
class Runner:
|
51
|
+
"""The Runner class is used to run agents.
|
52
|
+
|
53
|
+
It manages the execution of an agent within a session, handling message
|
54
|
+
processing, event generation, and interaction with various services like
|
55
|
+
artifact storage, session management, and memory.
|
56
|
+
|
57
|
+
Attributes:
|
58
|
+
app_name: The application name of the runner.
|
59
|
+
agent: The root agent to run.
|
60
|
+
artifact_service: The artifact service for the runner.
|
61
|
+
session_service: The session service for the runner.
|
62
|
+
memory_service: The memory service for the runner.
|
63
|
+
"""
|
64
|
+
|
65
|
+
app_name: str
|
66
|
+
"""The app name of the runner."""
|
67
|
+
agent: BaseAgent
|
68
|
+
"""The root agent to run."""
|
69
|
+
artifact_service: Optional[BaseArtifactService] = None
|
70
|
+
"""The artifact service for the runner."""
|
71
|
+
session_service: BaseSessionService
|
72
|
+
"""The session service for the runner."""
|
73
|
+
memory_service: Optional[BaseMemoryService] = None
|
74
|
+
"""The memory service for the runner."""
|
75
|
+
|
76
|
+
def __init__(
|
77
|
+
self,
|
78
|
+
*,
|
79
|
+
app_name: str,
|
80
|
+
agent: BaseAgent,
|
81
|
+
artifact_service: Optional[BaseArtifactService] = None,
|
82
|
+
session_service: BaseSessionService,
|
83
|
+
memory_service: Optional[BaseMemoryService] = None,
|
84
|
+
):
|
85
|
+
"""Initializes the Runner.
|
86
|
+
|
87
|
+
Args:
|
88
|
+
app_name: The application name of the runner.
|
89
|
+
agent: The root agent to run.
|
90
|
+
artifact_service: The artifact service for the runner.
|
91
|
+
session_service: The session service for the runner.
|
92
|
+
memory_service: The memory service for the runner.
|
93
|
+
"""
|
94
|
+
self.app_name = app_name
|
95
|
+
self.agent = agent
|
96
|
+
self.artifact_service = artifact_service
|
97
|
+
self.session_service = session_service
|
98
|
+
self.memory_service = memory_service
|
99
|
+
|
100
|
+
def run(
|
101
|
+
self,
|
102
|
+
*,
|
103
|
+
user_id: str,
|
104
|
+
session_id: str,
|
105
|
+
new_message: types.Content,
|
106
|
+
run_config: RunConfig = RunConfig(),
|
107
|
+
) -> Generator[Event, None, None]:
|
108
|
+
"""Runs the agent.
|
109
|
+
|
110
|
+
NOTE: This sync interface is only for local testing and convenience purpose.
|
111
|
+
Consider to use `run_async` for production usage.
|
112
|
+
|
113
|
+
Args:
|
114
|
+
user_id: The user ID of the session.
|
115
|
+
session_id: The session ID of the session.
|
116
|
+
new_message: A new message to append to the session.
|
117
|
+
run_config: The run config for the agent.
|
118
|
+
|
119
|
+
Yields:
|
120
|
+
The events generated by the agent.
|
121
|
+
"""
|
122
|
+
event_queue = queue.Queue()
|
123
|
+
|
124
|
+
async def _invoke_run_async():
|
125
|
+
try:
|
126
|
+
async for event in self.run_async(
|
127
|
+
user_id=user_id,
|
128
|
+
session_id=session_id,
|
129
|
+
new_message=new_message,
|
130
|
+
run_config=run_config,
|
131
|
+
):
|
132
|
+
event_queue.put(event)
|
133
|
+
finally:
|
134
|
+
event_queue.put(None)
|
135
|
+
|
136
|
+
def _asyncio_thread_main():
|
137
|
+
try:
|
138
|
+
asyncio.run(_invoke_run_async())
|
139
|
+
finally:
|
140
|
+
event_queue.put(None)
|
141
|
+
|
142
|
+
thread = threading.Thread(target=_asyncio_thread_main)
|
143
|
+
thread.start()
|
144
|
+
|
145
|
+
# consumes and re-yield the events from background thread.
|
146
|
+
while True:
|
147
|
+
event = event_queue.get()
|
148
|
+
if event is None:
|
149
|
+
break
|
150
|
+
else:
|
151
|
+
yield event
|
152
|
+
|
153
|
+
thread.join()
|
154
|
+
|
155
|
+
async def run_async(
|
156
|
+
self,
|
157
|
+
*,
|
158
|
+
user_id: str,
|
159
|
+
session_id: str,
|
160
|
+
new_message: types.Content,
|
161
|
+
run_config: RunConfig = RunConfig(),
|
162
|
+
) -> AsyncGenerator[Event, None]:
|
163
|
+
"""Main entry method to run the agent in this runner.
|
164
|
+
|
165
|
+
Args:
|
166
|
+
user_id: The user ID of the session.
|
167
|
+
session_id: The session ID of the session.
|
168
|
+
new_message: A new message to append to the session.
|
169
|
+
run_config: The run config for the agent.
|
170
|
+
|
171
|
+
Yields:
|
172
|
+
The events generated by the agent.
|
173
|
+
"""
|
174
|
+
with tracer.start_as_current_span('invocation'):
|
175
|
+
session = self.session_service.get_session(
|
176
|
+
app_name=self.app_name, user_id=user_id, session_id=session_id
|
177
|
+
)
|
178
|
+
if not session:
|
179
|
+
raise ValueError(f'Session not found: {session_id}')
|
180
|
+
|
181
|
+
invocation_context = self._new_invocation_context(
|
182
|
+
session,
|
183
|
+
new_message=new_message,
|
184
|
+
run_config=run_config,
|
185
|
+
)
|
186
|
+
root_agent = self.agent
|
187
|
+
|
188
|
+
if new_message:
|
189
|
+
self._append_new_message_to_session(
|
190
|
+
session,
|
191
|
+
new_message,
|
192
|
+
invocation_context,
|
193
|
+
run_config.save_input_blobs_as_artifacts,
|
194
|
+
)
|
195
|
+
|
196
|
+
invocation_context.agent = self._find_agent_to_run(session, root_agent)
|
197
|
+
async for event in invocation_context.agent.run_async(invocation_context):
|
198
|
+
if not event.partial:
|
199
|
+
self.session_service.append_event(session=session, event=event)
|
200
|
+
yield event
|
201
|
+
|
202
|
+
def _append_new_message_to_session(
|
203
|
+
self,
|
204
|
+
session: Session,
|
205
|
+
new_message: types.Content,
|
206
|
+
invocation_context: InvocationContext,
|
207
|
+
save_input_blobs_as_artifacts: bool = False,
|
208
|
+
):
|
209
|
+
"""Appends a new message to the session.
|
210
|
+
|
211
|
+
Args:
|
212
|
+
session: The session to append the message to.
|
213
|
+
new_message: The new message to append.
|
214
|
+
invocation_context: The invocation context for the message.
|
215
|
+
save_input_blobs_as_artifacts: Whether to save input blobs as artifacts.
|
216
|
+
"""
|
217
|
+
if not new_message.parts:
|
218
|
+
raise ValueError('No parts in the new_message.')
|
219
|
+
|
220
|
+
if self.artifact_service and save_input_blobs_as_artifacts:
|
221
|
+
# The runner directly saves the artifacts (if applicable) in the
|
222
|
+
# user message and replaces the artifact data with a file name
|
223
|
+
# placeholder.
|
224
|
+
for i, part in enumerate(new_message.parts):
|
225
|
+
if part.inline_data is None:
|
226
|
+
continue
|
227
|
+
file_name = f'artifact_{invocation_context.invocation_id}_{i}'
|
228
|
+
self.artifact_service.save_artifact(
|
229
|
+
app_name=self.app_name,
|
230
|
+
user_id=session.user_id,
|
231
|
+
session_id=session.id,
|
232
|
+
filename=file_name,
|
233
|
+
artifact=part,
|
234
|
+
)
|
235
|
+
new_message.parts[i] = types.Part(
|
236
|
+
text=f'Uploaded file: {file_name}. It is saved into artifacts'
|
237
|
+
)
|
238
|
+
# Appends only. We do not yield the event because it's not from the model.
|
239
|
+
event = Event(
|
240
|
+
invocation_id=invocation_context.invocation_id,
|
241
|
+
author='user',
|
242
|
+
content=new_message,
|
243
|
+
)
|
244
|
+
self.session_service.append_event(session=session, event=event)
|
245
|
+
|
246
|
+
async def run_live(
|
247
|
+
self,
|
248
|
+
*,
|
249
|
+
session: Session,
|
250
|
+
live_request_queue: LiveRequestQueue,
|
251
|
+
run_config: RunConfig = RunConfig(),
|
252
|
+
) -> AsyncGenerator[Event, None]:
|
253
|
+
"""Runs the agent in live mode (experimental feature).
|
254
|
+
|
255
|
+
Args:
|
256
|
+
session: The session to use.
|
257
|
+
live_request_queue: The queue for live requests.
|
258
|
+
run_config: The run config for the agent.
|
259
|
+
|
260
|
+
Yields:
|
261
|
+
The events generated by the agent.
|
262
|
+
"""
|
263
|
+
# TODO: right now, only works for a single audio agent without FC.
|
264
|
+
invocation_context = self._new_invocation_context_for_live(
|
265
|
+
session,
|
266
|
+
live_request_queue=live_request_queue,
|
267
|
+
run_config=run_config,
|
268
|
+
)
|
269
|
+
|
270
|
+
root_agent = self.agent
|
271
|
+
invocation_context.agent = self._find_agent_to_run(session, root_agent)
|
272
|
+
|
273
|
+
invocation_context.active_streaming_tools = {}
|
274
|
+
# TODO(hangfei): switch to use canonical_tools.
|
275
|
+
for tool in invocation_context.agent.tools:
|
276
|
+
# replicate a LiveRequestQueue for streaming tools that relis on
|
277
|
+
# LiveRequestQueue
|
278
|
+
from typing import get_type_hints
|
279
|
+
|
280
|
+
type_hints = get_type_hints(tool)
|
281
|
+
for arg_type in type_hints.values():
|
282
|
+
if arg_type is LiveRequestQueue:
|
283
|
+
if not invocation_context.active_streaming_tools:
|
284
|
+
invocation_context.active_streaming_tools = {}
|
285
|
+
active_streaming_tools = ActiveStreamingTool(
|
286
|
+
stream=LiveRequestQueue()
|
287
|
+
)
|
288
|
+
invocation_context.active_streaming_tools[tool.__name__] = (
|
289
|
+
active_streaming_tools
|
290
|
+
)
|
291
|
+
|
292
|
+
async for event in invocation_context.agent.run_live(invocation_context):
|
293
|
+
self.session_service.append_event(session=session, event=event)
|
294
|
+
yield event
|
295
|
+
|
296
|
+
def close_session(self, session: Session):
|
297
|
+
"""Closes a session and adds it to the memory service (experimental feature).
|
298
|
+
|
299
|
+
Args:
|
300
|
+
session: The session to close.
|
301
|
+
"""
|
302
|
+
if self.memory_service:
|
303
|
+
self.memory_service.add_session_to_memory(session)
|
304
|
+
self.session_service.close_session(session=session)
|
305
|
+
|
306
|
+
def _find_agent_to_run(
|
307
|
+
self, session: Session, root_agent: BaseAgent
|
308
|
+
) -> BaseAgent:
|
309
|
+
"""Finds the agent to run to continue the session.
|
310
|
+
|
311
|
+
A qualified agent must be either of:
|
312
|
+
- The root agent;
|
313
|
+
- An LlmAgent who replied last and is capable to transfer to any other agent
|
314
|
+
in the agent hierarchy.
|
315
|
+
|
316
|
+
Args:
|
317
|
+
session: The session to find the agent for.
|
318
|
+
root_agent: The root agent of the runner.
|
319
|
+
|
320
|
+
Returns:
|
321
|
+
The agent of the last message in the session or the root agent.
|
322
|
+
"""
|
323
|
+
for event in filter(lambda e: e.author != 'user', reversed(session.events)):
|
324
|
+
if event.author == root_agent.name:
|
325
|
+
# Found root agent.
|
326
|
+
return root_agent
|
327
|
+
if not (agent := root_agent.find_sub_agent(event.author)):
|
328
|
+
# Agent not found, continue looking.
|
329
|
+
logger.warning(
|
330
|
+
'Event from an unknown agent: %s, event id: %s',
|
331
|
+
event.author,
|
332
|
+
event.id,
|
333
|
+
)
|
334
|
+
continue
|
335
|
+
if self._is_transferable_across_agent_tree(agent):
|
336
|
+
return agent
|
337
|
+
# Falls back to root agent if no suitable agents are found in the session.
|
338
|
+
return root_agent
|
339
|
+
|
340
|
+
def _is_transferable_across_agent_tree(self, agent_to_run: BaseAgent) -> bool:
|
341
|
+
"""Whether the agent to run can transfer to any other agent in the agent tree.
|
342
|
+
|
343
|
+
This typically means all agent_to_run's parent through root agent can
|
344
|
+
transfer to their parent_agent.
|
345
|
+
|
346
|
+
Args:
|
347
|
+
agent_to_run: The agent to check for transferability.
|
348
|
+
|
349
|
+
Returns:
|
350
|
+
True if the agent can transfer, False otherwise.
|
351
|
+
"""
|
352
|
+
agent = agent_to_run
|
353
|
+
while agent:
|
354
|
+
if not isinstance(agent, LlmAgent):
|
355
|
+
# Only LLM-based Agent can provider agent transfer capability.
|
356
|
+
return False
|
357
|
+
if agent.disallow_transfer_to_parent:
|
358
|
+
return False
|
359
|
+
agent = agent.parent_agent
|
360
|
+
return True
|
361
|
+
|
362
|
+
def _new_invocation_context(
|
363
|
+
self,
|
364
|
+
session: Session,
|
365
|
+
*,
|
366
|
+
new_message: Optional[types.Content] = None,
|
367
|
+
live_request_queue: Optional[LiveRequestQueue] = None,
|
368
|
+
run_config: RunConfig = RunConfig(),
|
369
|
+
) -> InvocationContext:
|
370
|
+
"""Creates a new invocation context.
|
371
|
+
|
372
|
+
Args:
|
373
|
+
session: The session for the context.
|
374
|
+
new_message: The new message for the context.
|
375
|
+
live_request_queue: The live request queue for the context.
|
376
|
+
run_config: The run config for the context.
|
377
|
+
|
378
|
+
Returns:
|
379
|
+
The new invocation context.
|
380
|
+
"""
|
381
|
+
invocation_id = new_invocation_context_id()
|
382
|
+
|
383
|
+
if run_config.support_cfc and isinstance(self.agent, LlmAgent):
|
384
|
+
model_name = self.agent.canonical_model.model
|
385
|
+
if not model_name.startswith('gemini-2'):
|
386
|
+
raise ValueError(
|
387
|
+
f'CFC is not supported for model: {model_name} in agent:'
|
388
|
+
f' {self.agent.name}'
|
389
|
+
)
|
390
|
+
if built_in_code_execution not in self.agent.canonical_tools:
|
391
|
+
self.agent.tools.append(built_in_code_execution)
|
392
|
+
|
393
|
+
return InvocationContext(
|
394
|
+
artifact_service=self.artifact_service,
|
395
|
+
session_service=self.session_service,
|
396
|
+
memory_service=self.memory_service,
|
397
|
+
invocation_id=invocation_id,
|
398
|
+
agent=self.agent,
|
399
|
+
session=session,
|
400
|
+
user_content=new_message,
|
401
|
+
live_request_queue=live_request_queue,
|
402
|
+
run_config=run_config,
|
403
|
+
)
|
404
|
+
|
405
|
+
def _new_invocation_context_for_live(
|
406
|
+
self,
|
407
|
+
session: Session,
|
408
|
+
*,
|
409
|
+
live_request_queue: Optional[LiveRequestQueue] = None,
|
410
|
+
run_config: RunConfig = RunConfig(),
|
411
|
+
) -> InvocationContext:
|
412
|
+
"""Creates a new invocation context for live multi-agent."""
|
413
|
+
|
414
|
+
# For live multi-agent, we need model's text transcription as context for
|
415
|
+
# next agent.
|
416
|
+
if self.agent.sub_agents and live_request_queue:
|
417
|
+
if not run_config.response_modalities:
|
418
|
+
# default
|
419
|
+
run_config.response_modalities = ['AUDIO', 'TEXT']
|
420
|
+
elif 'TEXT' not in run_config.response_modalities:
|
421
|
+
run_config.response_modalities.append('TEXT')
|
422
|
+
return self._new_invocation_context(
|
423
|
+
session,
|
424
|
+
live_request_queue=live_request_queue,
|
425
|
+
run_config=run_config,
|
426
|
+
)
|
427
|
+
|
428
|
+
|
429
|
+
class InMemoryRunner(Runner):
|
430
|
+
"""An in-memory Runner for testing and development.
|
431
|
+
|
432
|
+
This runner uses in-memory implementations for artifact, session, and memory
|
433
|
+
services, providing a lightweight and self-contained environment for agent
|
434
|
+
execution.
|
435
|
+
|
436
|
+
Attributes:
|
437
|
+
agent: The root agent to run.
|
438
|
+
app_name: The application name of the runner. Defaults to
|
439
|
+
'InMemoryRunner'.
|
440
|
+
"""
|
441
|
+
|
442
|
+
def __init__(self, agent: LlmAgent, *, app_name: str = 'InMemoryRunner'):
|
443
|
+
"""Initializes the InMemoryRunner.
|
444
|
+
|
445
|
+
Args:
|
446
|
+
agent: The root agent to run.
|
447
|
+
app_name: The application name of the runner. Defaults to
|
448
|
+
'InMemoryRunner'.
|
449
|
+
"""
|
450
|
+
super().__init__(
|
451
|
+
app_name=app_name,
|
452
|
+
agent=agent,
|
453
|
+
artifact_service=InMemoryArtifactService(),
|
454
|
+
session_service=InMemorySessionService(),
|
455
|
+
memory_service=InMemoryMemoryService(),
|
456
|
+
)
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# Copyright 2025 Google LLC
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
import logging
|
15
|
+
|
16
|
+
from .base_session_service import BaseSessionService
|
17
|
+
from .in_memory_session_service import InMemorySessionService
|
18
|
+
from .session import Session
|
19
|
+
from .state import State
|
20
|
+
from .vertex_ai_session_service import VertexAiSessionService
|
21
|
+
|
22
|
+
logger = logging.getLogger(__name__)
|
23
|
+
|
24
|
+
|
25
|
+
__all__ = [
|
26
|
+
'BaseSessionService',
|
27
|
+
'InMemorySessionService',
|
28
|
+
'Session',
|
29
|
+
'State',
|
30
|
+
'VertexAiSessionService',
|
31
|
+
]
|
32
|
+
|
33
|
+
try:
|
34
|
+
from .database_session_service import DatabaseSessionService
|
35
|
+
|
36
|
+
__all__.append('DatabaseSessionService')
|
37
|
+
except ImportError:
|
38
|
+
logger.debug(
|
39
|
+
'DatabaseSessionService require sqlalchemy>=2.0, please ensure it is'
|
40
|
+
' installed correctly.'
|
41
|
+
)
|
@@ -0,0 +1,133 @@
|
|
1
|
+
# Copyright 2025 Google LLC
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
import abc
|
16
|
+
from typing import Any
|
17
|
+
from typing import Optional
|
18
|
+
|
19
|
+
from pydantic import BaseModel
|
20
|
+
from pydantic import Field
|
21
|
+
|
22
|
+
from ..events.event import Event
|
23
|
+
from .session import Session
|
24
|
+
from .state import State
|
25
|
+
|
26
|
+
|
27
|
+
class GetSessionConfig(BaseModel):
|
28
|
+
"""The configuration of getting a session."""
|
29
|
+
num_recent_events: Optional[int] = None
|
30
|
+
after_timestamp: Optional[float] = None
|
31
|
+
|
32
|
+
|
33
|
+
class ListSessionsResponse(BaseModel):
|
34
|
+
"""The response of listing sessions.
|
35
|
+
|
36
|
+
The events and states are not set within each Session object.
|
37
|
+
"""
|
38
|
+
sessions: list[Session] = Field(default_factory=list)
|
39
|
+
|
40
|
+
|
41
|
+
class ListEventsResponse(BaseModel):
|
42
|
+
"""The response of listing events in a session."""
|
43
|
+
events: list[Event] = Field(default_factory=list)
|
44
|
+
next_page_token: Optional[str] = None
|
45
|
+
|
46
|
+
|
47
|
+
class BaseSessionService(abc.ABC):
|
48
|
+
"""Base class for session services.
|
49
|
+
|
50
|
+
The service provides a set of methods for managing sessions and events.
|
51
|
+
"""
|
52
|
+
|
53
|
+
@abc.abstractmethod
|
54
|
+
def create_session(
|
55
|
+
self,
|
56
|
+
*,
|
57
|
+
app_name: str,
|
58
|
+
user_id: str,
|
59
|
+
state: Optional[dict[str, Any]] = None,
|
60
|
+
session_id: Optional[str] = None,
|
61
|
+
) -> Session:
|
62
|
+
"""Creates a new session.
|
63
|
+
|
64
|
+
Args:
|
65
|
+
app_name: the name of the app.
|
66
|
+
user_id: the id of the user.
|
67
|
+
state: the initial state of the session.
|
68
|
+
session_id: the client-provided id of the session. If not provided, a
|
69
|
+
generated ID will be used.
|
70
|
+
|
71
|
+
Returns:
|
72
|
+
session: The newly created session instance.
|
73
|
+
"""
|
74
|
+
pass
|
75
|
+
|
76
|
+
@abc.abstractmethod
|
77
|
+
def get_session(
|
78
|
+
self,
|
79
|
+
*,
|
80
|
+
app_name: str,
|
81
|
+
user_id: str,
|
82
|
+
session_id: str,
|
83
|
+
config: Optional[GetSessionConfig] = None,
|
84
|
+
) -> Optional[Session]:
|
85
|
+
"""Gets a session."""
|
86
|
+
pass
|
87
|
+
|
88
|
+
@abc.abstractmethod
|
89
|
+
def list_sessions(
|
90
|
+
self, *, app_name: str, user_id: str
|
91
|
+
) -> ListSessionsResponse:
|
92
|
+
"""Lists all the sessions."""
|
93
|
+
pass
|
94
|
+
|
95
|
+
@abc.abstractmethod
|
96
|
+
def delete_session(
|
97
|
+
self, *, app_name: str, user_id: str, session_id: str
|
98
|
+
) -> None:
|
99
|
+
"""Deletes a session."""
|
100
|
+
pass
|
101
|
+
|
102
|
+
@abc.abstractmethod
|
103
|
+
def list_events(
|
104
|
+
self,
|
105
|
+
*,
|
106
|
+
app_name: str,
|
107
|
+
user_id: str,
|
108
|
+
session_id: str,
|
109
|
+
) -> ListEventsResponse:
|
110
|
+
"""Lists events in a session."""
|
111
|
+
pass
|
112
|
+
|
113
|
+
def close_session(self, *, session: Session):
|
114
|
+
"""Closes a session."""
|
115
|
+
# TODO: determine whether we want to finalize the session here.
|
116
|
+
pass
|
117
|
+
|
118
|
+
def append_event(self, session: Session, event: Event) -> Event:
|
119
|
+
"""Appends an event to a session object."""
|
120
|
+
if event.partial:
|
121
|
+
return event
|
122
|
+
self.__update_session_state(session, event)
|
123
|
+
session.events.append(event)
|
124
|
+
return event
|
125
|
+
|
126
|
+
def __update_session_state(self, session: Session, event: Event):
|
127
|
+
"""Updates the session state based on the event."""
|
128
|
+
if not event.actions or not event.actions.state_delta:
|
129
|
+
return
|
130
|
+
for key, value in event.actions.state_delta.items():
|
131
|
+
if key.startswith(State.TEMP_PREFIX):
|
132
|
+
continue
|
133
|
+
session.state.update({key: value})
|