Copy disabled (too large)
Download .txt
Showing preview only (16,075K chars total). Download the full file to get everything.
Repository: google/adk-python
Branch: main
Commit: 0e93faf0813a
Files: 1514
Total size: 21.2 MB
Directory structure:
gitextract_mn7a6x6v/
├── .gemini/
│ └── settings.json
├── .github/
│ ├── .release-please-manifest-v2.json
│ ├── .release-please-manifest.json
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.md
│ │ └── feature_request.md
│ ├── pull_request_template.md
│ ├── release-please-config-v2.json
│ ├── release-please-config.json
│ └── workflows/
│ ├── analyze-releases-for-adk-docs-updates.yml
│ ├── check-file-contents.yml
│ ├── copybara-pr-handler.yml
│ ├── discussion_answering.yml
│ ├── isort.yml
│ ├── issue-monitor.yml
│ ├── mypy-new-errors.yml
│ ├── mypy.yml
│ ├── pr-triage.yml
│ ├── pyink.yml
│ ├── python-unit-tests.yml
│ ├── release-cherry-pick.yml
│ ├── release-cut.yml
│ ├── release-finalize.yml
│ ├── release-please.yml
│ ├── release-publish.yml
│ ├── release-v2-cherry-pick.yml
│ ├── release-v2-cut.yml
│ ├── release-v2-finalize.yml
│ ├── release-v2-please.yml
│ ├── release-v2-publish.yml
│ ├── stale-bot.yml
│ ├── triage.yml
│ ├── upload-adk-docs-to-vertex-ai-search.yml
│ └── v2-sync.yml
├── .gitignore
├── AGENTS.md
├── CHANGELOG.md
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── autoformat.sh
├── contributing/
│ ├── README.md
│ ├── adk_project_overview_and_architecture.md
│ ├── dev/
│ │ └── utils/
│ │ └── build_llms_txt.py
│ └── samples/
│ ├── a2a_auth/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── remote_a2a/
│ │ └── bigquery_agent/
│ │ ├── __init__.py
│ │ ├── agent.json
│ │ └── agent.py
│ ├── a2a_basic/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── remote_a2a/
│ │ └── check_prime_agent/
│ │ ├── __init__.py
│ │ ├── agent.json
│ │ └── agent.py
│ ├── a2a_human_in_loop/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── remote_a2a/
│ │ └── human_in_loop/
│ │ ├── __init__.py
│ │ ├── agent.json
│ │ └── agent.py
│ ├── a2a_root/
│ │ ├── README.md
│ │ ├── agent.py
│ │ └── remote_a2a/
│ │ └── hello_world/
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── adk_answering_agent/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ ├── gemini_assistant/
│ │ │ ├── __init__.py
│ │ │ └── agent.py
│ │ ├── main.py
│ │ ├── settings.py
│ │ ├── tools.py
│ │ ├── upload_docs_to_vertex_ai_search.py
│ │ └── utils.py
│ ├── adk_documentation/
│ │ ├── __init__.py
│ │ ├── adk_docs_updater/
│ │ │ ├── __init__.py
│ │ │ ├── agent.py
│ │ │ └── main.py
│ │ ├── adk_release_analyzer/
│ │ │ ├── README.md
│ │ │ ├── __init__.py
│ │ │ ├── agent.py
│ │ │ └── main.py
│ │ ├── settings.py
│ │ ├── tools.py
│ │ └── utils.py
│ ├── adk_issue_formatting_agent/
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ ├── settings.py
│ │ └── utils.py
│ ├── adk_issue_monitoring_agent/
│ │ ├── PROMPT_INSTRUCTION.txt
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ ├── main.py
│ │ ├── settings.py
│ │ └── utils.py
│ ├── adk_knowledge_agent/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── agent.json
│ │ ├── agent.py
│ │ └── requirements.txt
│ ├── adk_pr_agent/
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── main.py
│ ├── adk_pr_triaging_agent/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ ├── main.py
│ │ ├── settings.py
│ │ └── utils.py
│ ├── adk_stale_agent/
│ │ ├── PROMPT_INSTRUCTION.txt
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ ├── main.py
│ │ ├── settings.py
│ │ └── utils.py
│ ├── adk_triaging_agent/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ ├── main.py
│ │ ├── settings.py
│ │ └── utils.py
│ ├── agent_engine_code_execution/
│ │ ├── README
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── agent_registry_agent/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── api_registry_agent/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── application_integration_agent/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── artifact_save_text/
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── authn-adk-all-in-one/
│ │ ├── README.md
│ │ ├── adk_agents/
│ │ │ ├── agent_openapi_tools/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── agent.py
│ │ │ │ └── openapi.yaml
│ │ │ ├── requirements.txt
│ │ │ └── sample.env
│ │ ├── hotel_booker_app/
│ │ │ ├── hotelbooker_core.py
│ │ │ ├── main.py
│ │ │ └── openapi.yaml
│ │ ├── idp/
│ │ │ ├── app.py
│ │ │ ├── sample.env
│ │ │ ├── sample.jwks.json
│ │ │ └── templates/
│ │ │ ├── admin.html
│ │ │ ├── consent.html
│ │ │ └── login.html
│ │ └── requirements.txt
│ ├── bigquery/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── bigquery_mcp/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── bigtable/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── built_in_multi_tools/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── cache_analysis/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ ├── run_cache_experiments.py
│ │ └── utils.py
│ ├── callbacks/
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── main.py
│ ├── code_execution/
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── gke_sandbox_agent.py
│ ├── computer_use/
│ │ ├── README.md
│ │ ├── agent.py
│ │ ├── playwright.py
│ │ └── requirements.txt
│ ├── context_offloading_with_artifact/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── core_basic_config/
│ │ ├── README.md
│ │ └── root_agent.yaml
│ ├── core_callback_config/
│ │ ├── __init__.py
│ │ ├── callbacks.py
│ │ ├── root_agent.yaml
│ │ └── tools.py
│ ├── core_custom_agent_config/
│ │ ├── __init__.py
│ │ ├── my_agents.py
│ │ └── root_agent.yaml
│ ├── core_generate_content_config_config/
│ │ └── root_agent.yaml
│ ├── crewai_tool_kwargs/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── main.py
│ ├── custom_code_execution/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── data_agent/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── dummy_services.py
│ ├── fields_output_schema/
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── fields_planner/
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── main.py
│ ├── files_retrieval_agent/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── data/
│ │ ├── adk_overview.txt
│ │ └── tools_guide.txt
│ ├── generate_image/
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── sample.session.json
│ ├── gepa/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── adk_agent.py
│ │ ├── adk_agent_test.py
│ │ ├── experiment.py
│ │ ├── gepa_tau_bench.ipynb
│ │ ├── rater_lib.py
│ │ ├── rubric_validation_template.txt
│ │ ├── run_experiment.py
│ │ ├── tau_bench_agent.py
│ │ ├── utils.py
│ │ └── voter_agent/
│ │ ├── eval_prompts.txt
│ │ ├── gepa.ipynb
│ │ ├── optimized_prompt.txt
│ │ ├── prompts.txt
│ │ ├── rubric_validation_template.txt
│ │ └── tools.py
│ ├── gke_agent_sandbox/
│ │ └── deployment_rbac.yaml
│ ├── google_api/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── google_search_agent/
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── hello_world/
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── main.py
│ ├── hello_world_anthropic/
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── main.py
│ ├── hello_world_apigeellm/
│ │ ├── .env-sample
│ │ ├── README.md
│ │ ├── agent.py
│ │ └── main.py
│ ├── hello_world_app/
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── main.py
│ ├── hello_world_gemma/
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── main.py
│ ├── hello_world_gemma3_ollama/
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── main.py
│ ├── hello_world_litellm/
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── main.py
│ ├── hello_world_litellm_add_function_to_prompt/
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── main.py
│ ├── hello_world_ma/
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── hello_world_ollama/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── main.py
│ ├── hello_world_stream_fc_args/
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── history_management/
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── main.py
│ ├── human_in_loop/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── main.py
│ ├── human_tool_confirmation/
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── integration_connector_euc_agent/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── interactions_api/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── main.py
│ ├── jira_agent/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── tools.py
│ ├── json_passing_agent/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── main.py
│ ├── langchain_structured_tool_agent/
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── langchain_youtube_search_agent/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── requirements.txt
│ ├── litellm_inline_tool_call/
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── litellm_streaming/
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── main.py
│ ├── litellm_structured_output/
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── litellm_with_fallback_models/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── live_agent_api_server_example/
│ │ ├── live_agent_example.py
│ │ └── readme.md
│ ├── live_bidi_debug_utils/
│ │ └── pcm_audio_player.py
│ ├── live_bidi_streaming_multi_agent/
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── readme.md
│ ├── live_bidi_streaming_single_agent/
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── readme.md
│ ├── live_bidi_streaming_tools_agent/
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── readme.md
│ ├── live_tool_callbacks_agent/
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── readme.md
│ ├── logprobs/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── manual_ollama_test/
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── mcp_dynamic_header_agent/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── header_server.py
│ ├── mcp_in_agent_tool_remote/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── mcp_in_agent_tool_stdio/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── mcp_postgres_agent/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── mcp_progress_callback_agent/
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── mock_progress_server.py
│ ├── mcp_server_side_sampling/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── mcp_server.py
│ ├── mcp_service_account_agent/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── mcp_sse_agent/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── filesystem_server.py
│ ├── mcp_stdio_notion_agent/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── mcp_stdio_server_agent/
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── mcp_streamablehttp_agent/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── filesystem_server.py
│ ├── mcp_toolset_auth/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ ├── main.py
│ │ └── oauth_mcp_server.py
│ ├── memory/
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── main.py
│ ├── migrate_session_db/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ ├── main.py
│ │ └── sample-output/
│ │ ├── alembic/
│ │ │ ├── README
│ │ │ ├── env.py
│ │ │ └── script.py.mako
│ │ └── alembic.ini
│ ├── multi_agent_basic_config/
│ │ ├── README.md
│ │ ├── code_tutor_agent.yaml
│ │ ├── math_tutor_agent.yaml
│ │ └── root_agent.yaml
│ ├── multi_agent_llm_config/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── prime_agent.yaml
│ │ ├── roll_agent.yaml
│ │ └── root_agent.yaml
│ ├── multi_agent_loop_config/
│ │ ├── README.md
│ │ ├── loop_agent.yaml
│ │ ├── root_agent.yaml
│ │ └── writer_agents/
│ │ ├── critic_agent.yaml
│ │ ├── initial_writer_agent.yaml
│ │ └── refiner_agent.yaml
│ ├── multi_agent_seq_config/
│ │ ├── README.md
│ │ ├── root_agent.yaml
│ │ └── sub_agents/
│ │ ├── code_refactorer_agent.yaml
│ │ ├── code_reviewer_agent.yaml
│ │ └── code_writer_agent.yaml
│ ├── multimodal_tool_results/
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── non_llm_sequential/
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── oauth2_client_credentials/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ ├── main.py
│ │ └── oauth2_test_server.py
│ ├── oauth_calendar_agent/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── output_schema_with_tools/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── parallel_functions/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── plugin_basic/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── count_plugin.py
│ │ └── main.py
│ ├── plugin_debug_logging/
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── plugin_reflect_tool_retry/
│ │ ├── README.md
│ │ ├── basic/
│ │ │ ├── __init__.py
│ │ │ └── agent.py
│ │ └── hallucinating_func_name/
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── postgres_session_service/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ ├── compose.yml
│ │ └── main.py
│ ├── pubsub/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── pydantic_argument/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── main.py
│ ├── quickstart/
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── rag_agent/
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── rewind_session/
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── main.py
│ ├── runner_debug_example/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── main.py
│ ├── services.py
│ ├── services.yaml
│ ├── session_state_agent/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── input.json
│ ├── simple_sequential_agent/
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── skills_agent/
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── skills/
│ │ ├── weather-skill/
│ │ │ ├── SKILL.md
│ │ │ ├── references/
│ │ │ │ └── weather_info.md
│ │ │ └── scripts/
│ │ │ └── get_humidity.py
│ │ └── weather_skill/
│ │ └── SKILL.md
│ ├── skills_agent_gcs/
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── slack_agent/
│ │ └── agent.py
│ ├── spanner/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── spanner_admin/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── spanner_rag_agent/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── static_instruction/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── main.py
│ ├── static_non_text_content/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── main.py
│ ├── sub_agents_config/
│ │ ├── __init__.py
│ │ ├── life_agent.py
│ │ ├── root_agent.yaml
│ │ └── work_agent.yaml
│ ├── telemetry/
│ │ ├── agent.py
│ │ └── main.py
│ ├── token_usage/
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── main.py
│ ├── tool_agent_tool_config/
│ │ ├── root_agent.yaml
│ │ ├── summarizer_agent.yaml
│ │ └── web_search_agent.yaml
│ ├── tool_builtin_config/
│ │ └── root_agent.yaml
│ ├── tool_functions_config/
│ │ ├── __init__.py
│ │ ├── root_agent.yaml
│ │ └── tools.py
│ ├── tool_human_in_the_loop_config/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── root_agent.yaml
│ │ └── tools.py
│ ├── tool_mcp_stdio_notion_config/
│ │ ├── README.md
│ │ └── root_agent.yaml
│ ├── toolbox_agent/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── tools.yaml
│ ├── vertex_code_execution/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── workflow_agent_seq/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ ├── main.py
│ │ └── sample.output
│ └── workflow_triage/
│ ├── README.md
│ ├── __init__.py
│ ├── agent.py
│ └── execution_agent.py
├── llms-full.txt
├── llms.txt
├── pylintrc
├── pyproject.toml
├── scripts/
│ ├── db_migration.sh
│ └── unittests.sh
├── src/
│ └── google/
│ └── adk/
│ ├── __init__.py
│ ├── a2a/
│ │ ├── __init__.py
│ │ ├── agent/
│ │ │ ├── __init__.py
│ │ │ ├── config.py
│ │ │ ├── interceptors/
│ │ │ │ ├── __init__.py
│ │ │ │ └── new_integration_extension.py
│ │ │ └── utils.py
│ │ ├── converters/
│ │ │ ├── __init__.py
│ │ │ ├── event_converter.py
│ │ │ ├── from_adk_event.py
│ │ │ ├── long_running_functions.py
│ │ │ ├── part_converter.py
│ │ │ ├── request_converter.py
│ │ │ ├── to_adk_event.py
│ │ │ └── utils.py
│ │ ├── executor/
│ │ │ ├── __init__.py
│ │ │ ├── a2a_agent_executor.py
│ │ │ ├── a2a_agent_executor_impl.py
│ │ │ ├── config.py
│ │ │ ├── executor_context.py
│ │ │ ├── task_result_aggregator.py
│ │ │ └── utils.py
│ │ ├── experimental.py
│ │ └── utils/
│ │ ├── __init__.py
│ │ ├── agent_card_builder.py
│ │ └── agent_to_a2a.py
│ ├── agents/
│ │ ├── __init__.py
│ │ ├── active_streaming_tool.py
│ │ ├── agent_config.py
│ │ ├── base_agent.py
│ │ ├── base_agent_config.py
│ │ ├── callback_context.py
│ │ ├── common_configs.py
│ │ ├── config_agent_utils.py
│ │ ├── config_schemas/
│ │ │ └── AgentConfig.json
│ │ ├── context.py
│ │ ├── context_cache_config.py
│ │ ├── invocation_context.py
│ │ ├── langgraph_agent.py
│ │ ├── live_request_queue.py
│ │ ├── llm_agent.py
│ │ ├── llm_agent_config.py
│ │ ├── loop_agent.py
│ │ ├── loop_agent_config.py
│ │ ├── mcp_instruction_provider.py
│ │ ├── parallel_agent.py
│ │ ├── parallel_agent_config.py
│ │ ├── readonly_context.py
│ │ ├── remote_a2a_agent.py
│ │ ├── run_config.py
│ │ ├── sequential_agent.py
│ │ ├── sequential_agent_config.py
│ │ └── transcription_entry.py
│ ├── apps/
│ │ ├── __init__.py
│ │ ├── app.py
│ │ ├── base_events_summarizer.py
│ │ ├── compaction.py
│ │ └── llm_event_summarizer.py
│ ├── artifacts/
│ │ ├── __init__.py
│ │ ├── artifact_util.py
│ │ ├── base_artifact_service.py
│ │ ├── file_artifact_service.py
│ │ ├── gcs_artifact_service.py
│ │ └── in_memory_artifact_service.py
│ ├── auth/
│ │ ├── __init__.py
│ │ ├── auth_credential.py
│ │ ├── auth_handler.py
│ │ ├── auth_preprocessor.py
│ │ ├── auth_provider_registry.py
│ │ ├── auth_schemes.py
│ │ ├── auth_tool.py
│ │ ├── base_auth_provider.py
│ │ ├── credential_manager.py
│ │ ├── credential_service/
│ │ │ ├── __init__.py
│ │ │ ├── base_credential_service.py
│ │ │ ├── in_memory_credential_service.py
│ │ │ └── session_state_credential_service.py
│ │ ├── exchanger/
│ │ │ ├── __init__.py
│ │ │ ├── base_credential_exchanger.py
│ │ │ ├── credential_exchanger_registry.py
│ │ │ └── oauth2_credential_exchanger.py
│ │ ├── oauth2_credential_util.py
│ │ ├── oauth2_discovery.py
│ │ └── refresher/
│ │ ├── __init__.py
│ │ ├── base_credential_refresher.py
│ │ ├── credential_refresher_registry.py
│ │ └── oauth2_credential_refresher.py
│ ├── cli/
│ │ ├── __init__.py
│ │ ├── __main__.py
│ │ ├── adk_web_server.py
│ │ ├── agent_graph.py
│ │ ├── browser/
│ │ │ ├── assets/
│ │ │ │ ├── audio-processor.js
│ │ │ │ └── config/
│ │ │ │ └── runtime-config.json
│ │ │ ├── chunk-5MGPUGAY.js
│ │ │ ├── chunk-66RH7XMI.js
│ │ │ ├── chunk-AF27AUNK.js
│ │ │ ├── chunk-ARP3QDVK.js
│ │ │ ├── chunk-BI6TV3NL.js
│ │ │ ├── chunk-FZZPD3K2.js
│ │ │ ├── chunk-GFARMTUE.js
│ │ │ ├── chunk-GLGQFQO2.js
│ │ │ ├── chunk-GLGRLUIJ.js
│ │ │ ├── chunk-MBYWPZQV.js
│ │ │ ├── chunk-N3RKSFBU.js
│ │ │ ├── chunk-R2IMOXM4.js
│ │ │ ├── chunk-RGCH6K7F.js
│ │ │ ├── chunk-ROC2DVJ2.js
│ │ │ ├── chunk-SGO5R2ED.js
│ │ │ ├── chunk-W7GRJBO5.js
│ │ │ ├── chunk-YI5XBR2B.js
│ │ │ ├── chunk-ZLSAKILO.js
│ │ │ ├── index.html
│ │ │ ├── main-7SJG752M.js
│ │ │ ├── polyfills-5CFQRCPP.js
│ │ │ └── styles-YY6V3TJU.css
│ │ ├── built_in_agents/
│ │ │ ├── README.md
│ │ │ ├── __init__.py
│ │ │ ├── adk_agent_builder_assistant.py
│ │ │ ├── agent.py
│ │ │ ├── instruction_embedded.template
│ │ │ ├── sub_agents/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── google_search_agent.py
│ │ │ │ └── url_context_agent.py
│ │ │ ├── tools/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── cleanup_unused_files.py
│ │ │ │ ├── delete_files.py
│ │ │ │ ├── explore_project.py
│ │ │ │ ├── query_schema.py
│ │ │ │ ├── read_config_files.py
│ │ │ │ ├── read_files.py
│ │ │ │ ├── search_adk_knowledge.py
│ │ │ │ ├── search_adk_source.py
│ │ │ │ ├── write_config_files.py
│ │ │ │ └── write_files.py
│ │ │ └── utils/
│ │ │ ├── __init__.py
│ │ │ ├── adk_source_utils.py
│ │ │ ├── path_normalizer.py
│ │ │ └── resolve_root_directory.py
│ │ ├── cli.py
│ │ ├── cli_create.py
│ │ ├── cli_deploy.py
│ │ ├── cli_eval.py
│ │ ├── cli_tools_click.py
│ │ ├── conformance/
│ │ │ ├── __init__.py
│ │ │ ├── _conformance_test_google_llm.py
│ │ │ ├── _generate_markdown_utils.py
│ │ │ ├── _generated_file_utils.py
│ │ │ ├── _replay_validators.py
│ │ │ ├── adk_web_server_client.py
│ │ │ ├── cli_record.py
│ │ │ ├── cli_test.py
│ │ │ └── test_case.py
│ │ ├── fast_api.py
│ │ ├── plugins/
│ │ │ ├── __init__.py
│ │ │ ├── recordings_plugin.py
│ │ │ ├── recordings_schema.py
│ │ │ └── replay_plugin.py
│ │ ├── service_registry.py
│ │ └── utils/
│ │ ├── __init__.py
│ │ ├── agent_change_handler.py
│ │ ├── agent_loader.py
│ │ ├── base_agent_loader.py
│ │ ├── cleanup.py
│ │ ├── common.py
│ │ ├── dot_adk_folder.py
│ │ ├── envs.py
│ │ ├── evals.py
│ │ ├── local_storage.py
│ │ ├── logs.py
│ │ ├── service_factory.py
│ │ ├── shared_value.py
│ │ └── state.py
│ ├── code_executors/
│ │ ├── __init__.py
│ │ ├── agent_engine_sandbox_code_executor.py
│ │ ├── base_code_executor.py
│ │ ├── built_in_code_executor.py
│ │ ├── code_execution_utils.py
│ │ ├── code_executor_context.py
│ │ ├── container_code_executor.py
│ │ ├── gke_code_executor.py
│ │ ├── unsafe_local_code_executor.py
│ │ └── vertex_ai_code_executor.py
│ ├── dependencies/
│ │ ├── __init__.py
│ │ ├── rouge_scorer.py
│ │ └── vertexai.py
│ ├── errors/
│ │ ├── __init__.py
│ │ ├── already_exists_error.py
│ │ ├── input_validation_error.py
│ │ ├── not_found_error.py
│ │ ├── session_not_found_error.py
│ │ └── tool_execution_error.py
│ ├── evaluation/
│ │ ├── __init__.py
│ │ ├── _eval_set_results_manager_utils.py
│ │ ├── _eval_sets_manager_utils.py
│ │ ├── _retry_options_utils.py
│ │ ├── agent_evaluator.py
│ │ ├── app_details.py
│ │ ├── base_eval_service.py
│ │ ├── common.py
│ │ ├── constants.py
│ │ ├── conversation_scenarios.py
│ │ ├── custom_metric_evaluator.py
│ │ ├── eval_case.py
│ │ ├── eval_config.py
│ │ ├── eval_metrics.py
│ │ ├── eval_result.py
│ │ ├── eval_rubrics.py
│ │ ├── eval_set.py
│ │ ├── eval_set_results_manager.py
│ │ ├── eval_sets_manager.py
│ │ ├── evaluation_constants.py
│ │ ├── evaluation_generator.py
│ │ ├── evaluator.py
│ │ ├── final_response_match_v1.py
│ │ ├── final_response_match_v2.py
│ │ ├── gcs_eval_set_results_manager.py
│ │ ├── gcs_eval_sets_manager.py
│ │ ├── hallucinations_v1.py
│ │ ├── in_memory_eval_sets_manager.py
│ │ ├── llm_as_judge.py
│ │ ├── llm_as_judge_utils.py
│ │ ├── local_eval_service.py
│ │ ├── local_eval_set_results_manager.py
│ │ ├── local_eval_sets_manager.py
│ │ ├── metric_evaluator_registry.py
│ │ ├── metric_info_providers.py
│ │ ├── multi_turn_task_success_evaluator.py
│ │ ├── multi_turn_tool_use_quality_evaluator.py
│ │ ├── multi_turn_trajectory_quality_evaluator.py
│ │ ├── request_intercepter_plugin.py
│ │ ├── response_evaluator.py
│ │ ├── rubric_based_evaluator.py
│ │ ├── rubric_based_final_response_quality_v1.py
│ │ ├── rubric_based_tool_use_quality_v1.py
│ │ ├── safety_evaluator.py
│ │ ├── simulation/
│ │ │ ├── __init__.py
│ │ │ ├── llm_backed_user_simulator.py
│ │ │ ├── llm_backed_user_simulator_prompts.py
│ │ │ ├── per_turn_user_simulator_quality_prompts.py
│ │ │ ├── per_turn_user_simulator_quality_v1.py
│ │ │ ├── pre_built_personas.py
│ │ │ ├── static_user_simulator.py
│ │ │ ├── user_simulator.py
│ │ │ ├── user_simulator_personas.py
│ │ │ └── user_simulator_provider.py
│ │ ├── trajectory_evaluator.py
│ │ └── vertex_ai_eval_facade.py
│ ├── events/
│ │ ├── __init__.py
│ │ ├── event.py
│ │ ├── event_actions.py
│ │ └── ui_widget.py
│ ├── examples/
│ │ ├── __init__.py
│ │ ├── base_example_provider.py
│ │ ├── example.py
│ │ ├── example_util.py
│ │ └── vertex_ai_example_store.py
│ ├── features/
│ │ ├── __init__.py
│ │ ├── _feature_decorator.py
│ │ └── _feature_registry.py
│ ├── flows/
│ │ ├── __init__.py
│ │ └── llm_flows/
│ │ ├── __init__.py
│ │ ├── _base_llm_processor.py
│ │ ├── _code_execution.py
│ │ ├── _nl_planning.py
│ │ ├── _output_schema_processor.py
│ │ ├── agent_transfer.py
│ │ ├── audio_cache_manager.py
│ │ ├── audio_transcriber.py
│ │ ├── auto_flow.py
│ │ ├── base_llm_flow.py
│ │ ├── basic.py
│ │ ├── compaction.py
│ │ ├── contents.py
│ │ ├── context_cache_processor.py
│ │ ├── functions.py
│ │ ├── identity.py
│ │ ├── instructions.py
│ │ ├── interactions_processor.py
│ │ ├── request_confirmation.py
│ │ ├── single_flow.py
│ │ └── transcription_manager.py
│ ├── integrations/
│ │ ├── README.md
│ │ ├── agent_registry/
│ │ │ ├── __init__.py
│ │ │ └── agent_registry.py
│ │ ├── api_registry/
│ │ │ ├── __init__.py
│ │ │ └── api_registry.py
│ │ ├── crewai/
│ │ │ ├── __init__.py
│ │ │ └── crewai_tool.py
│ │ ├── langchain/
│ │ │ ├── __init__.py
│ │ │ └── langchain_tool.py
│ │ └── slack/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ └── slack_runner.py
│ ├── memory/
│ │ ├── __init__.py
│ │ ├── _utils.py
│ │ ├── base_memory_service.py
│ │ ├── in_memory_memory_service.py
│ │ ├── memory_entry.py
│ │ ├── vertex_ai_memory_bank_service.py
│ │ └── vertex_ai_rag_memory_service.py
│ ├── models/
│ │ ├── __init__.py
│ │ ├── anthropic_llm.py
│ │ ├── apigee_llm.py
│ │ ├── base_llm.py
│ │ ├── base_llm_connection.py
│ │ ├── cache_metadata.py
│ │ ├── gemini_context_cache_manager.py
│ │ ├── gemini_llm_connection.py
│ │ ├── gemma_llm.py
│ │ ├── google_llm.py
│ │ ├── interactions_utils.py
│ │ ├── lite_llm.py
│ │ ├── llm_request.py
│ │ ├── llm_response.py
│ │ └── registry.py
│ ├── optimization/
│ │ ├── __init__.py
│ │ ├── agent_optimizer.py
│ │ ├── data_types.py
│ │ ├── gepa_root_agent_prompt_optimizer.py
│ │ ├── local_eval_sampler.py
│ │ ├── sampler.py
│ │ └── simple_prompt_optimizer.py
│ ├── planners/
│ │ ├── __init__.py
│ │ ├── base_planner.py
│ │ ├── built_in_planner.py
│ │ └── plan_re_act_planner.py
│ ├── platform/
│ │ ├── __init__.py
│ │ ├── thread.py
│ │ ├── time.py
│ │ └── uuid.py
│ ├── plugins/
│ │ ├── __init__.py
│ │ ├── base_plugin.py
│ │ ├── bigquery_agent_analytics_plugin.py
│ │ ├── context_filter_plugin.py
│ │ ├── debug_logging_plugin.py
│ │ ├── global_instruction_plugin.py
│ │ ├── logging_plugin.py
│ │ ├── multimodal_tool_results_plugin.py
│ │ ├── plugin_manager.py
│ │ ├── reflect_retry_tool_plugin.py
│ │ └── save_files_as_artifacts_plugin.py
│ ├── py.typed
│ ├── runners.py
│ ├── sessions/
│ │ ├── __init__.py
│ │ ├── _session_util.py
│ │ ├── base_session_service.py
│ │ ├── database_session_service.py
│ │ ├── in_memory_session_service.py
│ │ ├── migration/
│ │ │ ├── README.md
│ │ │ ├── _schema_check_utils.py
│ │ │ ├── migrate_from_sqlalchemy_pickle.py
│ │ │ ├── migrate_from_sqlalchemy_sqlite.py
│ │ │ └── migration_runner.py
│ │ ├── schemas/
│ │ │ ├── shared.py
│ │ │ ├── v0.py
│ │ │ └── v1.py
│ │ ├── session.py
│ │ ├── sqlite_session_service.py
│ │ ├── state.py
│ │ └── vertex_ai_session_service.py
│ ├── skills/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── _utils.py
│ │ ├── models.py
│ │ └── prompt.py
│ ├── telemetry/
│ │ ├── __init__.py
│ │ ├── _experimental_semconv.py
│ │ ├── google_cloud.py
│ │ ├── setup.py
│ │ ├── sqlite_span_exporter.py
│ │ └── tracing.py
│ ├── tools/
│ │ ├── __init__.py
│ │ ├── _automatic_function_calling_util.py
│ │ ├── _forwarding_artifact_service.py
│ │ ├── _function_parameter_parse_util.py
│ │ ├── _function_tool_declarations.py
│ │ ├── _gemini_schema_util.py
│ │ ├── _google_credentials.py
│ │ ├── _memory_entry_utils.py
│ │ ├── agent_simulator/
│ │ │ ├── __init__.py
│ │ │ ├── agent_simulator_config.py
│ │ │ ├── agent_simulator_engine.py
│ │ │ ├── agent_simulator_factory.py
│ │ │ ├── agent_simulator_plugin.py
│ │ │ ├── strategies/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── base.py
│ │ │ │ └── tool_spec_mock_strategy.py
│ │ │ ├── tool_connection_analyzer.py
│ │ │ └── tool_connection_map.py
│ │ ├── agent_tool.py
│ │ ├── api_registry.py
│ │ ├── apihub_tool/
│ │ │ ├── __init__.py
│ │ │ ├── apihub_toolset.py
│ │ │ └── clients/
│ │ │ ├── __init__.py
│ │ │ ├── apihub_client.py
│ │ │ └── secret_client.py
│ │ ├── application_integration_tool/
│ │ │ ├── __init__.py
│ │ │ ├── application_integration_toolset.py
│ │ │ ├── clients/
│ │ │ │ ├── connections_client.py
│ │ │ │ └── integration_client.py
│ │ │ └── integration_connector_tool.py
│ │ ├── authenticated_function_tool.py
│ │ ├── base_authenticated_tool.py
│ │ ├── base_tool.py
│ │ ├── base_toolset.py
│ │ ├── bash_tool.py
│ │ ├── bigquery/
│ │ │ ├── __init__.py
│ │ │ ├── bigquery_credentials.py
│ │ │ ├── bigquery_toolset.py
│ │ │ ├── client.py
│ │ │ ├── config.py
│ │ │ ├── data_insights_tool.py
│ │ │ ├── metadata_tool.py
│ │ │ ├── query_tool.py
│ │ │ └── search_tool.py
│ │ ├── bigtable/
│ │ │ ├── __init__.py
│ │ │ ├── bigtable_credentials.py
│ │ │ ├── bigtable_toolset.py
│ │ │ ├── client.py
│ │ │ ├── metadata_tool.py
│ │ │ ├── query_tool.py
│ │ │ └── settings.py
│ │ ├── computer_use/
│ │ │ ├── __init__.py
│ │ │ ├── base_computer.py
│ │ │ ├── computer_use_tool.py
│ │ │ └── computer_use_toolset.py
│ │ ├── crewai_tool.py
│ │ ├── data_agent/
│ │ │ ├── __init__.py
│ │ │ ├── config.py
│ │ │ ├── credentials.py
│ │ │ ├── data_agent_tool.py
│ │ │ └── data_agent_toolset.py
│ │ ├── discovery_engine_search_tool.py
│ │ ├── enterprise_search_tool.py
│ │ ├── environment_simulation/
│ │ │ ├── __init__.py
│ │ │ ├── environment_simulation_config.py
│ │ │ ├── environment_simulation_engine.py
│ │ │ ├── environment_simulation_factory.py
│ │ │ ├── environment_simulation_plugin.py
│ │ │ ├── strategies/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── base.py
│ │ │ │ └── tool_spec_mock_strategy.py
│ │ │ ├── tool_connection_analyzer.py
│ │ │ └── tool_connection_map.py
│ │ ├── example_tool.py
│ │ ├── exit_loop_tool.py
│ │ ├── function_tool.py
│ │ ├── get_user_choice_tool.py
│ │ ├── google_api_tool/
│ │ │ ├── __init__.py
│ │ │ ├── google_api_tool.py
│ │ │ ├── google_api_toolset.py
│ │ │ ├── google_api_toolsets.py
│ │ │ └── googleapi_to_openapi_converter.py
│ │ ├── google_maps_grounding_tool.py
│ │ ├── google_search_agent_tool.py
│ │ ├── google_search_tool.py
│ │ ├── google_tool.py
│ │ ├── langchain_tool.py
│ │ ├── load_artifacts_tool.py
│ │ ├── load_mcp_resource_tool.py
│ │ ├── load_memory_tool.py
│ │ ├── load_web_page.py
│ │ ├── long_running_tool.py
│ │ ├── mcp_tool/
│ │ │ ├── __init__.py
│ │ │ ├── conversion_utils.py
│ │ │ ├── mcp_session_manager.py
│ │ │ ├── mcp_tool.py
│ │ │ ├── mcp_toolset.py
│ │ │ └── session_context.py
│ │ ├── openapi_tool/
│ │ │ ├── __init__.py
│ │ │ ├── auth/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── auth_helpers.py
│ │ │ │ └── credential_exchangers/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── auto_auth_credential_exchanger.py
│ │ │ │ ├── base_credential_exchanger.py
│ │ │ │ ├── oauth2_exchanger.py
│ │ │ │ └── service_account_exchanger.py
│ │ │ ├── common/
│ │ │ │ ├── __init__.py
│ │ │ │ └── common.py
│ │ │ └── openapi_spec_parser/
│ │ │ ├── __init__.py
│ │ │ ├── openapi_spec_parser.py
│ │ │ ├── openapi_toolset.py
│ │ │ ├── operation_parser.py
│ │ │ ├── rest_api_tool.py
│ │ │ └── tool_auth_handler.py
│ │ ├── preload_memory_tool.py
│ │ ├── pubsub/
│ │ │ ├── __init__.py
│ │ │ ├── client.py
│ │ │ ├── config.py
│ │ │ ├── message_tool.py
│ │ │ ├── pubsub_credentials.py
│ │ │ └── pubsub_toolset.py
│ │ ├── retrieval/
│ │ │ ├── __init__.py
│ │ │ ├── base_retrieval_tool.py
│ │ │ ├── files_retrieval.py
│ │ │ ├── llama_index_retrieval.py
│ │ │ └── vertex_ai_rag_retrieval.py
│ │ ├── set_model_response_tool.py
│ │ ├── skill_toolset.py
│ │ ├── spanner/
│ │ │ ├── __init__.py
│ │ │ ├── admin_tool.py
│ │ │ ├── admin_toolset.py
│ │ │ ├── client.py
│ │ │ ├── metadata_tool.py
│ │ │ ├── query_tool.py
│ │ │ ├── search_tool.py
│ │ │ ├── settings.py
│ │ │ ├── spanner_credentials.py
│ │ │ ├── spanner_toolset.py
│ │ │ └── utils.py
│ │ ├── tool_configs.py
│ │ ├── tool_confirmation.py
│ │ ├── tool_context.py
│ │ ├── toolbox_toolset.py
│ │ ├── transfer_to_agent_tool.py
│ │ ├── url_context_tool.py
│ │ └── vertex_ai_search_tool.py
│ ├── utils/
│ │ ├── __init__.py
│ │ ├── _client_labels_utils.py
│ │ ├── _debug_output.py
│ │ ├── _google_client_headers.py
│ │ ├── _schema_utils.py
│ │ ├── cache_performance_analyzer.py
│ │ ├── content_utils.py
│ │ ├── context_utils.py
│ │ ├── env_utils.py
│ │ ├── feature_decorator.py
│ │ ├── instructions_utils.py
│ │ ├── model_name_utils.py
│ │ ├── output_schema_utils.py
│ │ ├── streaming_utils.py
│ │ ├── variant_utils.py
│ │ ├── vertex_ai_utils.py
│ │ └── yaml_utils.py
│ └── version.py
└── tests/
├── __init__.py
├── integration/
│ ├── __init__.py
│ ├── conftest.py
│ ├── fixture/
│ │ ├── __init__.py
│ │ ├── agent_with_config/
│ │ │ ├── __init__.py
│ │ │ └── agent.py
│ │ ├── bigquery_agent/
│ │ │ ├── README.md
│ │ │ ├── __init__.py
│ │ │ ├── agent.py
│ │ │ ├── simple.test.json
│ │ │ └── test_config.json
│ │ ├── callback_agent/
│ │ │ ├── __init__.py
│ │ │ └── agent.py
│ │ ├── context_update_test/
│ │ │ ├── __init__.py
│ │ │ ├── agent.py
│ │ │ └── successful_test.session.json
│ │ ├── context_variable_agent/
│ │ │ ├── __init__.py
│ │ │ └── agent.py
│ │ ├── ecommerce_customer_service_agent/
│ │ │ ├── __init__.py
│ │ │ ├── agent.py
│ │ │ ├── order_query.test.json
│ │ │ └── test_config.json
│ │ ├── flow_complex_spark/
│ │ │ ├── __init__.py
│ │ │ ├── agent.py
│ │ │ └── sample.session.json
│ │ ├── hello_world_agent/
│ │ │ ├── __init__.py
│ │ │ ├── agent.py
│ │ │ ├── roll_die.test.json
│ │ │ └── test_config.json
│ │ ├── hello_world_agent_async/
│ │ │ ├── __init__.py
│ │ │ ├── agent.py
│ │ │ ├── roll_die.test.json
│ │ │ └── test_config.json
│ │ ├── home_automation_agent/
│ │ │ ├── __init__.py
│ │ │ ├── agent.py
│ │ │ ├── simple_test.test.json
│ │ │ ├── simple_test2.test.json
│ │ │ ├── test_config.json
│ │ │ └── test_files/
│ │ │ ├── dependent_tool_calls.test.json
│ │ │ ├── memorizing_past_events/
│ │ │ │ ├── eval_data.test.json
│ │ │ │ └── test_config.json
│ │ │ ├── simple_multi_turn_conversation.test.json
│ │ │ ├── simple_test.test.json
│ │ │ ├── simple_test2.test.json
│ │ │ └── test_config.json
│ │ ├── tool_agent/
│ │ │ ├── __init__.py
│ │ │ └── agent.py
│ │ └── trip_planner_agent/
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ ├── test_config.json
│ │ ├── test_files/
│ │ │ ├── test_config.json
│ │ │ └── trip_inquiry_sub_agent.test.json
│ │ └── trip_inquiry_multi_turn.test.json
│ ├── models/
│ │ ├── __init__.py
│ │ ├── test_gemma_llm.py
│ │ ├── test_google_llm.py
│ │ ├── test_litellm_no_function.py
│ │ └── test_litellm_with_function.py
│ ├── test_callback.py
│ ├── test_context_variable.py
│ ├── test_evaluate_agent_in_fixture.py
│ ├── test_multi_agent.py
│ ├── test_multi_turn.py
│ ├── test_single_agent.py
│ ├── test_sub_agent.py
│ ├── test_system_instruction.py
│ ├── test_tools.py
│ ├── test_vertex_ai_search_grounding_streaming.py
│ ├── test_with_test_file.py
│ ├── tools/
│ │ └── __init__.py
│ └── utils/
│ ├── __init__.py
│ ├── asserts.py
│ └── test_runner.py
└── unittests/
├── __init__.py
├── a2a/
│ ├── __init__.py
│ ├── converters/
│ │ ├── __init__.py
│ │ ├── test_event_converter.py
│ │ ├── test_event_round_trip.py
│ │ ├── test_from_adk.py
│ │ ├── test_part_converter.py
│ │ ├── test_request_converter.py
│ │ ├── test_to_adk.py
│ │ └── test_utils.py
│ ├── executor/
│ │ ├── __init__.py
│ │ ├── test_a2a_agent_executor.py
│ │ ├── test_a2a_agent_executor_impl.py
│ │ └── test_task_result_aggregator.py
│ └── utils/
│ ├── __init__.py
│ ├── test_agent_card_builder.py
│ └── test_agent_to_a2a.py
├── agents/
│ ├── __init__.py
│ ├── test_agent_clone.py
│ ├── test_agent_config.py
│ ├── test_base_agent.py
│ ├── test_callback_context.py
│ ├── test_context.py
│ ├── test_context_cache_config.py
│ ├── test_gemini_context_cache_manager.py
│ ├── test_invocation_context.py
│ ├── test_langgraph_agent.py
│ ├── test_live_request_queue.py
│ ├── test_llm_agent_callbacks.py
│ ├── test_llm_agent_error_messages.py
│ ├── test_llm_agent_fields.py
│ ├── test_llm_agent_include_contents.py
│ ├── test_llm_agent_output_save.py
│ ├── test_loop_agent.py
│ ├── test_mcp_instruction_provider.py
│ ├── test_model_callback_chain.py
│ ├── test_parallel_agent.py
│ ├── test_readonly_context.py
│ ├── test_remote_a2a_agent.py
│ ├── test_resumable_llm_agent.py
│ ├── test_run_config.py
│ └── test_sequential_agent.py
├── apps/
│ ├── __init__.py
│ ├── test_apps.py
│ ├── test_compaction.py
│ └── test_llm_event_summarizer.py
├── artifacts/
│ ├── __init__.py
│ ├── test_artifact_service.py
│ └── test_artifact_util.py
├── auth/
│ ├── __init__.py
│ ├── credential_service/
│ │ ├── __init__.py
│ │ ├── test_in_memory_credential_service.py
│ │ └── test_session_state_credential_service.py
│ ├── exchanger/
│ │ ├── __init__.py
│ │ ├── test_credential_exchanger_registry.py
│ │ └── test_oauth2_credential_exchanger.py
│ ├── refresher/
│ │ ├── __init__.py
│ │ ├── test_credential_refresher_registry.py
│ │ └── test_oauth2_credential_refresher.py
│ ├── test_auth_config.py
│ ├── test_auth_handler.py
│ ├── test_auth_preprocessor.py
│ ├── test_auth_provider_registry.py
│ ├── test_credential_manager.py
│ ├── test_oauth2_credential_util.py
│ ├── test_oauth2_discovery.py
│ └── test_toolset_auth.py
├── cli/
│ ├── __init__.py
│ ├── conformance/
│ │ ├── __init__.py
│ │ └── test_adk_web_server_client.py
│ ├── test_adk_web_server_run_live.py
│ ├── test_cli_feature_options.py
│ ├── test_cli_tools_click_option_mismatch.py
│ ├── test_cors_regex.py
│ ├── test_fast_api.py
│ ├── test_service_registry.py
│ └── utils/
│ ├── __init__.py
│ ├── test_agent_change_handler.py
│ ├── test_agent_loader.py
│ ├── test_cli.py
│ ├── test_cli_create.py
│ ├── test_cli_deploy.py
│ ├── test_cli_deploy_to_cloud_run.py
│ ├── test_cli_eval.py
│ ├── test_cli_tools_click.py
│ ├── test_dot_adk_folder.py
│ ├── test_envs.py
│ ├── test_evals.py
│ ├── test_local_storage.py
│ └── test_service_factory.py
├── code_executors/
│ ├── __init__.py
│ ├── test_agent_engine_sandbox_code_executor.py
│ ├── test_built_in_code_executor.py
│ ├── test_code_executor_context.py
│ ├── test_gke_code_executor.py
│ └── test_unsafe_local_code_executor.py
├── conftest.py
├── evaluation/
│ ├── __init__.py
│ ├── mock_gcs_utils.py
│ ├── simulation/
│ │ ├── __init__.py
│ │ ├── test_llm_backed_user_simulator.py
│ │ ├── test_llm_backed_user_simulator_prompts.py
│ │ ├── test_per_turn_user_simulation_quality_prompts.py
│ │ ├── test_per_turn_user_simulation_quality_v1.py
│ │ ├── test_pre_built_personas.py
│ │ ├── test_static_user_simulator.py
│ │ ├── test_user_simulator.py
│ │ ├── test_user_simulator_personas.py
│ │ └── test_user_simulator_provider.py
│ ├── test_app_details.py
│ ├── test_custom_metric_evaluator.py
│ ├── test_eval_case.py
│ ├── test_eval_config.py
│ ├── test_evaluation_generator.py
│ ├── test_final_response_match_v1.py
│ ├── test_final_response_match_v2.py
│ ├── test_gcs_eval_set_results_manager.py
│ ├── test_gcs_eval_sets_manager.py
│ ├── test_hallucinations_v1.py
│ ├── test_in_memory_eval_sets_manager.py
│ ├── test_llm_as_judge.py
│ ├── test_llm_as_judge_utils.py
│ ├── test_local_eval_service.py
│ ├── test_local_eval_set_results_manager.py
│ ├── test_local_eval_sets_manager.py
│ ├── test_metric_evaluator_registry.py
│ ├── test_multi_turn_task_success_evaluator.py
│ ├── test_multi_turn_tool_use_quality_evaluator.py
│ ├── test_multi_turn_trajectory_quality_evaluator.py
│ ├── test_request_intercepter_plugin.py
│ ├── test_response_evaluator.py
│ ├── test_retry_options_utils.py
│ ├── test_rubric_based_evaluator.py
│ ├── test_rubric_based_final_response_quality_v1.py
│ ├── test_rubric_based_tool_use_quality_v1.py
│ ├── test_safety_evaluator.py
│ ├── test_trajectory_evaluator.py
│ └── test_vertex_ai_eval_facade.py
├── features/
│ ├── test_feature_decorator.py
│ └── test_feature_registry.py
├── flows/
│ ├── __init__.py
│ └── llm_flows/
│ ├── __init__.py
│ ├── test_agent_transfer.py
│ ├── test_agent_transfer_system_instructions.py
│ ├── test_async_tool_callbacks.py
│ ├── test_audio_cache_manager.py
│ ├── test_base_llm_flow.py
│ ├── test_base_llm_flow_partial_handling.py
│ ├── test_base_llm_flow_realtime.py
│ ├── test_basic_processor.py
│ ├── test_code_execution.py
│ ├── test_compaction_processor.py
│ ├── test_contents.py
│ ├── test_contents_branch.py
│ ├── test_contents_function.py
│ ├── test_contents_other_agent.py
│ ├── test_context_cache_processor.py
│ ├── test_functions_error_messages.py
│ ├── test_functions_long_running.py
│ ├── test_functions_parallel.py
│ ├── test_functions_request_euc.py
│ ├── test_functions_sequential.py
│ ├── test_functions_simple.py
│ ├── test_functions_thread_pool.py
│ ├── test_identity.py
│ ├── test_instructions.py
│ ├── test_interactions_processor.py
│ ├── test_live_tool_callbacks.py
│ ├── test_model_callbacks.py
│ ├── test_nl_planning.py
│ ├── test_other_configs.py
│ ├── test_output_schema_processor.py
│ ├── test_plugin_model_callbacks.py
│ ├── test_plugin_tool_callbacks.py
│ ├── test_progressive_sse_streaming.py
│ ├── test_request_confirmation.py
│ ├── test_tool_callbacks.py
│ ├── test_tool_telemetry.py
│ └── test_transcription_manager.py
├── integrations/
│ ├── agent_registry/
│ │ ├── __init__.py
│ │ └── test_agent_registry.py
│ ├── api_registry/
│ │ ├── __init__.py
│ │ └── test_api_registry.py
│ ├── crewai/
│ │ └── test_crewai_tool.py
│ ├── langchain/
│ │ └── test_langchain_tool.py
│ └── slack/
│ └── test_slack_runner.py
├── memory/
│ ├── test_in_memory_memory_service.py
│ └── test_vertex_ai_memory_bank_service.py
├── models/
│ ├── __init__.py
│ ├── test_anthropic_llm.py
│ ├── test_apigee_llm.py
│ ├── test_cache_metadata.py
│ ├── test_completions_http_client.py
│ ├── test_gemini_llm_connection.py
│ ├── test_gemma_llm.py
│ ├── test_google_llm.py
│ ├── test_interactions_utils.py
│ ├── test_litellm.py
│ ├── test_litellm_import.py
│ ├── test_llm_request.py
│ ├── test_llm_response.py
│ └── test_models.py
├── optimization/
│ ├── gepa_root_agent_prompt_optimizer_test.py
│ ├── local_eval_sampler_test.py
│ └── simple_prompt_optimizer_test.py
├── platform/
│ ├── __init__.py
│ ├── test_time.py
│ └── test_uuid.py
├── plugins/
│ ├── __init__.py
│ ├── test_base_plugin.py
│ ├── test_bigquery_agent_analytics_plugin.py
│ ├── test_context_filtering_plugin.py
│ ├── test_debug_logging_plugin.py
│ ├── test_global_instruction_plugin.py
│ ├── test_multimodal_tool_results_plugin.py
│ ├── test_plugin_manager.py
│ ├── test_reflect_retry_tool_plugin.py
│ └── test_save_files_as_artifacts.py
├── runners/
│ ├── __init__.py
│ ├── test_pause_invocation.py
│ ├── test_resume_invocation.py
│ ├── test_run_tool_confirmation.py
│ ├── test_runner_debug.py
│ └── test_runner_rewind.py
├── sessions/
│ ├── __init__.py
│ ├── migration/
│ │ ├── test_database_schema.py
│ │ └── test_migration.py
│ ├── test_dynamic_pickle_type.py
│ ├── test_session_service.py
│ ├── test_v0_storage_event.py
│ └── test_vertex_ai_session_service.py
├── skills/
│ ├── __init__.py
│ ├── test__utils.py
│ ├── test_models.py
│ └── test_prompt.py
├── streaming/
│ ├── __init__.py
│ ├── test_live_streaming_configs.py
│ ├── test_multi_agent_streaming.py
│ ├── test_streaming.py
│ └── test_streaming_audio_storage.py
├── telemetry/
│ ├── __init__.py
│ ├── test_functional.py
│ ├── test_google_cloud.py
│ ├── test_setup.py
│ ├── test_spans.py
│ └── test_sqlite_span_exporter.py
├── test_runners.py
├── testing_utils.py
├── tools/
│ ├── __init__.py
│ ├── apihub_tool/
│ │ ├── clients/
│ │ │ ├── test_apihub_client.py
│ │ │ └── test_secret_client.py
│ │ └── test_apihub_toolset.py
│ ├── application_integration_tool/
│ │ ├── clients/
│ │ │ ├── test_connections_client.py
│ │ │ └── test_integration_client.py
│ │ ├── test_application_integration_toolset.py
│ │ └── test_integration_connector_tool.py
│ ├── bigquery/
│ │ ├── __init__
│ │ ├── test_bigquery_client.py
│ │ ├── test_bigquery_credentials.py
│ │ ├── test_bigquery_data_insights_tool.py
│ │ ├── test_bigquery_metadata_tool.py
│ │ ├── test_bigquery_query_tool.py
│ │ ├── test_bigquery_search_tool.py
│ │ ├── test_bigquery_tool_config.py
│ │ ├── test_bigquery_toolset.py
│ │ └── test_data/
│ │ └── ask_data_insights_penguins_highest_mass.yaml
│ ├── bigtable/
│ │ ├── __init__
│ │ ├── test_bigtable_credentials.py
│ │ ├── test_bigtable_metadata_tool.py
│ │ ├── test_bigtable_query_tool.py
│ │ ├── test_bigtable_toolset.py
│ │ └── test_client.py
│ ├── computer_use/
│ │ ├── __init__.py
│ │ ├── test_base_computer.py
│ │ ├── test_computer_use_tool.py
│ │ └── test_computer_use_toolset.py
│ ├── data_agent/
│ │ ├── test_data_agent_tool.py
│ │ └── test_data_agent_toolset.py
│ ├── environment_simulation/
│ │ ├── __init__.py
│ │ ├── test_environment_simulation_engine.py
│ │ ├── test_environment_simulation_factory.py
│ │ └── test_environment_simulation_plugin.py
│ ├── google_api_tool/
│ │ ├── __init__.py
│ │ ├── test_docs_batchupdate.py
│ │ ├── test_google_api_tool.py
│ │ ├── test_google_api_toolset.py
│ │ └── test_googleapi_to_openapi_converter.py
│ ├── mcp_tool/
│ │ ├── __init__.py
│ │ ├── test_conversion_utils.py
│ │ ├── test_mcp_session_manager.py
│ │ ├── test_mcp_tool.py
│ │ ├── test_mcp_toolset.py
│ │ ├── test_mcp_toolset_auth.py
│ │ └── test_session_context.py
│ ├── openapi_tool/
│ │ ├── auth/
│ │ │ ├── credential_exchangers/
│ │ │ │ ├── test_auto_auth_credential_exchanger.py
│ │ │ │ ├── test_base_auth_credential_exchanger.py
│ │ │ │ ├── test_oauth2_exchanger.py
│ │ │ │ └── test_service_account_exchanger.py
│ │ │ └── test_auth_helper.py
│ │ ├── common/
│ │ │ └── test_common.py
│ │ └── openapi_spec_parser/
│ │ ├── test.yaml
│ │ ├── test_openapi_spec_parser.py
│ │ ├── test_openapi_toolset.py
│ │ ├── test_operation_parser.py
│ │ ├── test_rest_api_tool.py
│ │ └── test_tool_auth_handler.py
│ ├── pubsub/
│ │ ├── test_pubsub_client.py
│ │ ├── test_pubsub_config.py
│ │ ├── test_pubsub_credentials.py
│ │ ├── test_pubsub_message_tool.py
│ │ └── test_pubsub_toolset.py
│ ├── retrieval/
│ │ ├── __init__.py
│ │ ├── test_base_retrieval_tool.py
│ │ ├── test_files_retrieval.py
│ │ └── test_vertex_ai_rag_retrieval.py
│ ├── spanner/
│ │ ├── __init__
│ │ ├── test_admin_tool.py
│ │ ├── test_admin_toolset.py
│ │ ├── test_metadata_tool.py
│ │ ├── test_search_tool.py
│ │ ├── test_spanner_client.py
│ │ ├── test_spanner_credentials.py
│ │ ├── test_spanner_query_tool.py
│ │ ├── test_spanner_tool_settings.py
│ │ ├── test_spanner_toolset.py
│ │ └── test_utils.py
│ ├── test_agent_tool.py
│ ├── test_authenticated_function_tool.py
│ ├── test_base_authenticated_tool.py
│ ├── test_base_google_credentials_manager.py
│ ├── test_base_tool.py
│ ├── test_base_toolset.py
│ ├── test_bash_tool.py
│ ├── test_build_function_declaration.py
│ ├── test_discovery_engine_search_tool.py
│ ├── test_enterprise_web_search_tool.py
│ ├── test_from_function_with_options.py
│ ├── test_function_tool.py
│ ├── test_function_tool_declarations.py
│ ├── test_function_tool_pydantic.py
│ ├── test_function_tool_with_import_annotations.py
│ ├── test_gemini_schema_util.py
│ ├── test_google_maps_grounding_tool.py
│ ├── test_google_search_agent_tool.py
│ ├── test_google_search_tool.py
│ ├── test_google_tool.py
│ ├── test_load_artifacts_tool.py
│ ├── test_load_mcp_resource_tool.py
│ ├── test_load_memory_tool.py
│ ├── test_long_running_tool.py
│ ├── test_set_model_response_tool.py
│ ├── test_skill_toolset.py
│ ├── test_tool_config.py
│ ├── test_transfer_to_agent_tool.py
│ ├── test_url_context_tool.py
│ └── test_vertex_ai_search_tool.py
└── utils/
├── __init__.py
├── test_cache_performance_analyzer.py
├── test_client_labels_utils.py
├── test_context_utils.py
├── test_env_utils.py
├── test_feature_decorator.py
├── test_google_client_headers.py
├── test_instructions_utils.py
├── test_model_name_utils.py
├── test_output_schema_utils.py
├── test_schema_utils.py
├── test_streaming_utils.py
├── test_vertex_ai_utils.py
└── test_yaml_utils.py
================================================
FILE CONTENTS
================================================
================================================
FILE: .gemini/settings.json
================================================
{
"contextFileName": "AGENTS.md"
}
================================================
FILE: .github/.release-please-manifest-v2.json
================================================
{
".": "2.0.0-alpha.0"
}
================================================
FILE: .github/.release-please-manifest.json
================================================
{
".": "1.27.2"
}
================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: ''
assignees: ''
---
## 🔴 Required Information
*Please ensure all items in this section are completed to allow for efficient
triaging. Requests without complete information may be rejected / deprioritized.
If an item is not applicable to you - please mark it as N/A*
**Describe the Bug:**
A clear and concise description of what the bug is.
**Steps to Reproduce:**
Please provide a numbered list of steps to reproduce the behavior:
1. Install '...'
2. Run '....'
3. Open '....'
4. Provide error or stacktrace
**Expected Behavior:**
A clear and concise description of what you expected to happen.
**Observed Behavior:**
What actually happened? Include error messages or crash stack traces here.
**Environment Details:**
- ADK Library Version (pip show google-adk):
- Desktop OS:** [e.g., macOS, Linux, Windows]
- Python Version (python -V):
**Model Information:**
- Are you using LiteLLM: Yes/No
- Which model is being used: (e.g., gemini-2.5-pro)
---
## 🟡 Optional Information
*Providing this information greatly speeds up the resolution process.*
**Regression:**
Did this work in a previous version of ADK? If so, which one?
**Logs:**
Please attach relevant logs. Wrap them in code blocks (```) or attach a
text file.
```text
// Paste logs here
```
**Screenshots / Video:**
If applicable, add screenshots or screen recordings to help explain
your problem.
**Additional Context:**
Add any other context about the problem here.
**Minimal Reproduction Code:**
Please provide a code snippet or a link to a Gist/repo that isolates the issue.
```python
// Code snippet here
```
**How often has this issue occurred?:**
- Always (100%)
- Often (50%+)
- Intermittently (<50%)
- Once / Rare
================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: ''
assignees: ''
---
** Please make sure you read the contribution guide and file the issues in the right place. **
[Contribution guide.](https://google.github.io/adk-docs/contributing-guide/)
## 🔴 Required Information
*Please ensure all items in this section are completed to allow for efficient
triaging. Requests without complete information may be rejected / deprioritized.
If an item is not applicable to you - please mark it as N/A*
### Is your feature request related to a specific problem?
Please describe the problem you are trying to solve. (Ex: "I'm always frustrated
when I have to manually handle X...")
### Describe the Solution You'd Like
A clear and concise description of the feature or API change you want.
Be specific about input/outputs if this involves an API change.
### Impact on your work
How does this feature impact your work and what are you trying to achieve?
If this is critical for you, tell us if there is a timeline by when you need
this feature.
### Willingness to contribute
Are you interested in implementing this feature yourself or submitting a PR?
(Yes/No)
---
## 🟡 Recommended Information
### Describe Alternatives You've Considered
A clear and concise description of any alternative solutions or workarounds
you've considered and why they didn't work for you.
### Proposed API / Implementation
If you have ideas on how this should look in code, please share a
pseudo-code example.
### Additional Context
Add any other context or screenshots about the feature request here.
================================================
FILE: .github/pull_request_template.md
================================================
**Please ensure you have read the [contribution guide](https://github.com/google/adk-python/blob/main/CONTRIBUTING.md) before creating a pull request.**
### Link to Issue or Description of Change
**1. Link to an existing issue (if applicable):**
- Closes: #_issue_number_
- Related: #_issue_number_
**2. Or, if no issue exists, describe the change:**
_If applicable, please follow the issue templates to provide as much detail as
possible._
**Problem:**
_A clear and concise description of what the problem is._
**Solution:**
_A clear and concise description of what you want to happen and why you choose
this solution._
### Testing Plan
_Please describe the tests that you ran to verify your changes. This is required
for all PRs that are not small documentation or typo fixes._
**Unit Tests:**
- [ ] I have added or updated unit tests for my change.
- [ ] All unit tests pass locally.
_Please include a summary of passed `pytest` results._
**Manual End-to-End (E2E) Tests:**
_Please provide instructions on how to manually test your changes, including any
necessary setup or configuration. Please provide logs or screenshots to help
reviewers better understand the fix._
### Checklist
- [ ] I have read the [CONTRIBUTING.md](https://github.com/google/adk-python/blob/main/CONTRIBUTING.md) document.
- [ ] I have performed a self-review of my own code.
- [ ] I have commented my code, particularly in hard-to-understand areas.
- [ ] I have added tests that prove my fix is effective or that my feature works.
- [ ] New and existing unit tests pass locally with my changes.
- [ ] I have manually tested my changes end-to-end.
- [ ] Any dependent changes have been merged and published in downstream modules.
### Additional context
_Add any other context or screenshots about the feature request here._
================================================
FILE: .github/release-please-config-v2.json
================================================
{
"$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json",
"packages": {
".": {
"release-type": "python",
"versioning": "prerelease",
"prerelease": true,
"prerelease-type": "alpha",
"package-name": "google-adk",
"include-component-in-tag": false,
"skip-github-release": true,
"changelog-path": "CHANGELOG-v2.md",
"changelog-sections": [
{
"type": "feat",
"section": "Features"
},
{
"type": "fix",
"section": "Bug Fixes"
},
{
"type": "perf",
"section": "Performance Improvements"
},
{
"type": "refactor",
"section": "Code Refactoring"
},
{
"type": "docs",
"section": "Documentation"
},
{
"type": "test",
"section": "Tests",
"hidden": true
},
{
"type": "build",
"section": "Build System",
"hidden": true
},
{
"type": "ci",
"section": "CI/CD",
"hidden": true
},
{
"type": "style",
"section": "Styles",
"hidden": true
},
{
"type": "chore",
"section": "Miscellaneous Chores",
"hidden": true
}
]
}
}
}
================================================
FILE: .github/release-please-config.json
================================================
{
"$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json",
"last-release-sha": "7b94a767337e0d642e808734608f07a70e077c62",
"packages": {
".": {
"release-type": "python",
"versioning": "always-bump-minor",
"package-name": "google-adk",
"include-component-in-tag": false,
"skip-github-release": true,
"changelog-path": "CHANGELOG.md",
"changelog-sections": [
{
"type": "feat",
"section": "Features"
},
{
"type": "fix",
"section": "Bug Fixes"
},
{
"type": "perf",
"section": "Performance Improvements"
},
{
"type": "refactor",
"section": "Code Refactoring"
},
{
"type": "docs",
"section": "Documentation"
},
{
"type": "test",
"section": "Tests",
"hidden": true
},
{
"type": "build",
"section": "Build System",
"hidden": true
},
{
"type": "ci",
"section": "CI/CD",
"hidden": true
},
{
"type": "style",
"section": "Styles",
"hidden": true
},
{
"type": "chore",
"section": "Miscellaneous Chores",
"hidden": true
}
]
}
}
}
================================================
FILE: .github/workflows/analyze-releases-for-adk-docs-updates.yml
================================================
name: Analyze New Release for ADK Docs Updates
on:
# Runs on every new release.
release:
types: [published]
# Manual trigger for testing and retrying.
workflow_dispatch:
jobs:
analyze-new-release-for-adk-docs-updates:
runs-on: ubuntu-latest
permissions:
contents: read
issues: write
steps:
- name: Checkout repository
uses: actions/checkout@v6
- name: Set up Python
uses: actions/setup-python@v6
with:
python-version: '3.11'
- name: Load adk-bot SSH Private Key
uses: webfactory/ssh-agent@v0.9.1
with:
ssh-private-key: ${{ secrets.ADK_BOT_SSH_PRIVATE_KEY }}
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install requests google-adk
- name: Run Analyzing Script
env:
GITHUB_TOKEN: ${{ secrets.ADK_TRIAGE_AGENT }}
GOOGLE_API_KEY: ${{ secrets.GOOGLE_API_KEY_FOR_DOCS_AGENTS }}
GOOGLE_GENAI_USE_VERTEXAI: 0
DOC_OWNER: 'google'
CODE_OWNER: 'google'
DOC_REPO: 'adk-docs'
CODE_REPO: 'adk-python'
INTERACTIVE: 0
PYTHONPATH: contributing/samples/adk_documentation
run: python -m adk_release_analyzer.main
================================================
FILE: .github/workflows/check-file-contents.yml
================================================
# Copyright 2026 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
name: "Check file contents"
on:
pull_request:
paths:
- '**.py'
jobs:
check-file-contents:
runs-on: ubuntu-latest
steps:
- name: Checkout Code
uses: actions/checkout@v6
with:
fetch-depth: 2
- name: Check for logger pattern in all changed Python files
run: |
git fetch origin ${GITHUB_BASE_REF}
CHANGED_FILES=$(git diff --diff-filter=ACMR --name-only origin/${GITHUB_BASE_REF}...HEAD | grep -E '\.py$' || true)
if [ -n "$CHANGED_FILES" ]; then
echo "Changed Python files to check:"
echo "$CHANGED_FILES"
echo ""
# Check for 'logger = logging.getLogger(__name__)' in changed .py files.
# The grep command will exit with a non-zero status code if the pattern is not found.
# We invert the exit code with ! so the step succeeds if the pattern is NOT found.
set +e
FILES_WITH_FORBIDDEN_LOGGER=$(grep -lE 'logger = logging\.getLogger\(__name__\)' $CHANGED_FILES)
GREP_EXIT_CODE=$?
set -e
# grep exits with 0 if matches are found, 1 if no matches are found.
# A non-zero exit code other than 1 indicates an error.
if [ $GREP_EXIT_CODE -eq 0 ]; then
echo "❌ Found forbidden use of 'logger = logging.getLogger(__name__)'. Please use 'logger = logging.getLogger('google_adk.' + __name__)' instead."
echo "The following files contain the forbidden pattern:"
echo "$FILES_WITH_FORBIDDEN_LOGGER"
exit 1
elif [ $GREP_EXIT_CODE -eq 1 ]; then
echo "✅ No instances of 'logger = logging.getLogger(__name__)' found in changed Python files."
fi
else
echo "✅ No relevant Python files found."
fi
- name: Check for import pattern in certain changed Python files
run: |
git fetch origin ${GITHUB_BASE_REF}
CHANGED_FILES=$(git diff --diff-filter=ACMR --name-only origin/${GITHUB_BASE_REF}...HEAD | grep -E '\.py$' | grep -v -E '__init__.py$|version.py$|tests/.*|contributing/samples/' || true)
if [ -n "$CHANGED_FILES" ]; then
echo "Changed Python files to check:"
echo "$CHANGED_FILES"
echo ""
# Use grep -L to find files that DO NOT contain the pattern.
# This command will output a list of non-compliant files.
FILES_MISSING_IMPORT=$(grep -L 'from __future__ import annotations' $CHANGED_FILES || true)
# Check if the list of non-compliant files is empty
if [ -z "$FILES_MISSING_IMPORT" ]; then
echo "✅ All modified Python files include 'from __future__ import annotations'."
exit 0
else
echo "❌ The following files are missing 'from __future__ import annotations':"
echo "$FILES_MISSING_IMPORT"
echo "This import is required to allow forward references in type annotations without quotes."
exit 1
fi
else
echo "✅ No relevant Python files found."
fi
- name: Check for import from cli package in certain changed Python files
run: |
git fetch origin ${GITHUB_BASE_REF}
CHANGED_FILES=$(git diff --diff-filter=ACMR --name-only origin/${GITHUB_BASE_REF}...HEAD | grep -E '\.py$' | grep -v -E 'cli/.*|src/google/adk/tools/apihub_tool/apihub_toolset.py|tests/.*|contributing/samples/' || true)
if [ -n "$CHANGED_FILES" ]; then
echo "Changed Python files to check:"
echo "$CHANGED_FILES"
echo ""
set +e
FILES_WITH_FORBIDDEN_IMPORT=$(grep -lE '^from.*\bcli\b.*import.*$' $CHANGED_FILES)
GREP_EXIT_CODE=$?
set -e
if [[ $GREP_EXIT_CODE -eq 0 ]]; then
echo "❌ Do not import from the cli package outside of the cli package. If you need to reuse the code elsewhere, please move the code outside of the cli package."
echo "The following files contain the forbidden pattern:"
echo "$FILES_WITH_FORBIDDEN_IMPORT"
exit 1
else
echo "✅ No instances of importing from the cli package found in relevant changed Python files."
fi
else
echo "✅ No relevant Python files found."
fi
================================================
FILE: .github/workflows/copybara-pr-handler.yml
================================================
name: Copybara PR Handler
on:
push:
branches:
- main
workflow_dispatch:
inputs:
pr_number:
description: 'PR number to close (for testing)'
required: true
type: string
commit_sha:
description: 'Commit SHA reference (optional, for testing)'
required: false
type: string
jobs:
close-imported-pr:
runs-on: ubuntu-latest
permissions:
pull-requests: write
issues: write
contents: read
steps:
- name: Check for Copybara commits and close PRs
uses: actions/github-script@v8
with:
github-token: ${{ secrets.ADK_TRIAGE_AGENT }}
script: |
// Check if this is a manual test run
const isManualRun = context.eventName === 'workflow_dispatch';
let prsToClose = [];
if (isManualRun) {
// Manual testing mode
const prNumber = parseInt(context.payload.inputs.pr_number);
const commitSha = context.payload.inputs.commit_sha || context.sha.substring(0, 7);
console.log('=== MANUAL TEST MODE ===');
console.log(`Testing with PR #${prNumber}, commit ${commitSha}`);
prsToClose.push({ prNumber, commitSha });
} else {
// Normal mode: process commits from push event
const commits = context.payload.commits || [];
console.log(`Found ${commits.length} commit(s) in this push`);
// Process each commit
for (const commit of commits) {
const sha = commit.id;
const committer = commit.committer.name;
const message = commit.message;
console.log(`\n--- Processing commit ${sha.substring(0, 7)} ---`);
console.log(`Committer: ${committer}`);
// Check if this is a Copybara commit
if (committer !== 'Copybara-Service') {
console.log('Not a Copybara commit, skipping');
continue;
}
// Extract PR number from commit message
// Pattern: "Merge https://github.com/google/adk-python/pull/3333"
const prMatch = message.match(/Merge https:\/\/github\.com\/google\/adk-python\/pull\/(\d+)/);
if (!prMatch) {
console.log('No PR number found in Copybara commit message');
continue;
}
const prNumber = parseInt(prMatch[1]);
const commitSha = sha.substring(0, 7);
prsToClose.push({ prNumber, commitSha });
}
}
// Process PRs to close
for (const { prNumber, commitSha } of prsToClose) {
console.log(`\n--- Processing PR #${prNumber} ---`);
// Get PR details to check if it's open
let pr;
try {
pr = await github.rest.pulls.get({
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: prNumber
});
} catch (error) {
console.log(`PR #${prNumber} not found or inaccessible:`, error.message);
continue;
}
// Only close if PR is still open
if (pr.data.state !== 'open') {
console.log(`PR #${prNumber} is already ${pr.data.state}, skipping`);
continue;
}
const author = pr.data.user.login;
try {
// Add comment with commit reference
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: prNumber,
body: `Thank you @${author} for your contribution! 🎉\n\nYour changes have been successfully imported and merged via Copybara in commit ${commitSha}.\n\nClosing this PR as the changes are now in the main branch.`
});
// Close the PR
await github.rest.pulls.update({
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: prNumber,
state: 'closed'
});
console.log(`Successfully closed PR #${prNumber}`);
} catch (error) {
console.log(`Error closing PR #${prNumber}:`, error.message);
}
}
if (isManualRun) {
console.log('\n=== TEST COMPLETED ===');
} else {
console.log('\n--- Finished processing all commits ---');
}
================================================
FILE: .github/workflows/discussion_answering.yml
================================================
name: ADK Answering Agent for Discussions
on:
discussion:
types: [created]
discussion_comment:
types: [created]
jobs:
agent-answer-questions:
if: >-
(github.event_name == 'discussion' && github.event.discussion.category.name == 'Q&A') ||
(github.event_name == 'discussion_comment' && contains(github.event.comment.body, '@adk-bot') && github.event.sender.login != 'adk-bot')
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v6
- name: Set up Python
uses: actions/setup-python@v6
with:
python-version: '3.11'
- name: Authenticate to Google Cloud
id: auth
uses: 'google-github-actions/auth@v3'
with:
credentials_json: '${{ secrets.ADK_GCP_SA_KEY }}'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install google-adk google-cloud-discoveryengine
- name: Run Answering Script
env:
GITHUB_TOKEN: ${{ secrets.ADK_TRIAGE_AGENT }}
ADK_GCP_SA_KEY: ${{ secrets.ADK_GCP_SA_KEY }}
GOOGLE_CLOUD_PROJECT: ${{ secrets.GOOGLE_CLOUD_PROJECT }}
GOOGLE_CLOUD_LOCATION: ${{ secrets.GOOGLE_CLOUD_LOCATION }}
VERTEXAI_DATASTORE_ID: ${{ secrets.VERTEXAI_DATASTORE_ID }}
GEMINI_API_DATASTORE_ID: ${{ secrets.GEMINI_API_DATASTORE_ID }}
GOOGLE_GENAI_USE_VERTEXAI: 1
OWNER: 'google'
REPO: 'adk-python'
INTERACTIVE: 0
PYTHONPATH: contributing/samples
run: |
# Write discussion data to temporary file to avoid secret masking issues
cat > /tmp/discussion.json << 'EOF'
${{ toJson(github.event.discussion) }}
EOF
python -m adk_answering_agent.main --discussion-file /tmp/discussion.json
================================================
FILE: .github/workflows/isort.yml
================================================
# Copyright 2026 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
name: Check sorting of imports
on:
pull_request:
paths:
- '**.py'
- 'pyproject.toml'
jobs:
isort-check:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v6
with:
fetch-depth: 2
- name: Set up Python
uses: actions/setup-python@v6
with:
python-version: '3.11'
- name: Install isort
run: |
pip install isort
- name: Run isort on changed files
id: run_isort
run: |
git fetch origin ${GITHUB_BASE_REF}
CHANGED_FILES=$(git diff --diff-filter=ACMR --name-only origin/${GITHUB_BASE_REF}...HEAD | grep -E '\.py$' || true)
if [ -n "$CHANGED_FILES" ]; then
echo "Changed Python files:"
echo "$CHANGED_FILES"
echo ""
FORMATTED_FILES=$(echo "$CHANGED_FILES" | tr '\n' ' ')
# Run isort --check
set +e
isort --check $CHANGED_FILES
RESULT=$?
set -e
if [ $RESULT -ne 0 ]; then
echo ""
echo "❌ isort check failed!"
echo "👉 To fix import order, run locally:"
echo ""
echo " isort $FORMATTED_FILES"
echo ""
exit $RESULT
fi
else
echo "No Python files changed. Skipping isort check."
fi
================================================
FILE: .github/workflows/issue-monitor.yml
================================================
# Copyright 2026 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
name: ADK Issue Monitoring Agent
on:
schedule:
# Runs daily at 6:00 AM UTC
- cron: '0 6 * * *'
# Allows manual triggering from the GitHub Actions tab
workflow_dispatch:
inputs:
full_scan:
description: 'Run an Initial Full Scan of ALL open issues'
required: false
type: boolean
default: false
jobs:
sweep-spam:
runs-on: ubuntu-latest
timeout-minutes: 120
permissions:
issues: write
contents: read
steps:
- name: Checkout repository
uses: actions/checkout@v6
- name: Set up Python
uses: actions/setup-python@v6
with:
python-version: '3.11'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install requests google-adk python-dotenv
- name: Run Issue Monitoring Agent
env:
GITHUB_TOKEN: ${{ secrets.ADK_TRIAGE_AGENT }}
GOOGLE_API_KEY: ${{ secrets.GOOGLE_API_KEY }}
OWNER: ${{ github.repository_owner }}
REPO: ${{ github.event.repository.name }}
CONCURRENCY_LIMIT: 3
INITIAL_FULL_SCAN: ${{ github.event.inputs.full_scan == 'true' }}
LLM_MODEL_NAME: "gemini-2.5-flash"
PYTHONPATH: contributing/samples
run: python -m adk_issue_monitoring_agent.main
================================================
FILE: .github/workflows/mypy-new-errors.yml
================================================
name: Mypy New Error Check
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
mypy-diff:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ['3.10', '3.11', '3.12', '3.13',]
steps:
- name: Checkout code
uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Set up Python
uses: actions/setup-python@v6
with:
python-version: ${{ matrix.python-version }}
- name: Install uv
uses: astral-sh/setup-uv@v7
- name: Generate Baseline (Main)
run: |
# Switch to main branch to generate baseline
git checkout origin/main
git checkout ${{ github.sha }} -- pyproject.toml
# Install dependencies for main
uv venv .venv
source .venv/bin/activate
uv sync --all-extras
# Run mypy, filter for errors only, remove line numbers (file:123: -> file::), and sort
# We ignore exit code (|| true) because we expect errors on main
uv run mypy . | grep "error:" | sed 's/:\([0-9]\+\):/::/g' | sort > main_errors.txt || true
echo "Found $(wc -l < main_errors.txt) errors on main."
- name: Check PR Branch
run: |
# Switch back to the PR commit
git checkout ${{ github.sha }}
# Re-sync dependencies in case the PR changed them
source .venv/bin/activate
uv sync --all-extras
# Run mypy on PR code, apply same processing
uv run mypy . | grep "error:" | sed 's/:\([0-9]\+\):/::/g' | sort > pr_errors.txt || true
echo "Found $(wc -l < pr_errors.txt) errors on PR branch."
- name: Compare and Fail on New Errors
run: |
# 'comm -13' suppresses unique lines in file1 (main) and common lines,
# leaving only lines unique to file2 (PR) -> The new errors.
comm -13 main_errors.txt pr_errors.txt > new_errors.txt
if [ -s new_errors.txt ]; then
echo "::error::The following NEW mypy errors were introduced:"
cat new_errors.txt
exit 1
else
echo "Great job! No new mypy errors introduced."
fi
================================================
FILE: .github/workflows/mypy.yml
================================================
name: Mypy Type Check
on:
workflow_dispatch:
jobs:
mypy:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ['3.10', '3.11', '3.12', '3.13',]
steps:
- uses: actions/checkout@v6
- name: Install uv
uses: astral-sh/setup-uv@v7
- name: Set up Python
uses: actions/setup-python@v6
with:
python-version: ${{ matrix.python-version }}
- name: Install dependencies
run: uv sync --all-extras
- name: Run mypy
run: uv run mypy . --strict
================================================
FILE: .github/workflows/pr-triage.yml
================================================
name: ADK Pull Request Triaging Agent
on:
pull_request_target:
types: [opened, reopened, edited]
workflow_dispatch:
inputs:
pr_number:
description: 'The Pull Request number to triage'
required: true
type: 'string'
jobs:
agent-triage-pull-request:
if: github.event_name == 'workflow_dispatch' || !contains(github.event.pull_request.labels.*.name, 'google-contributor')
runs-on: ubuntu-latest
permissions:
pull-requests: write
contents: read
steps:
- name: Checkout repository
uses: actions/checkout@v6
- name: Set up Python
uses: actions/setup-python@v6
with:
python-version: '3.11'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install requests google-adk
- name: Run Triaging Script
env:
GITHUB_TOKEN: ${{ secrets.ADK_TRIAGE_AGENT }}
GOOGLE_API_KEY: ${{ secrets.GOOGLE_API_KEY }}
GOOGLE_GENAI_USE_VERTEXAI: 0
OWNER: 'google'
REPO: 'adk-python'
PULL_REQUEST_NUMBER: ${{ github.event.pull_request.number || github.event.inputs.pr_number }}
INTERACTIVE: ${{ vars.PR_TRIAGE_INTERACTIVE }}
PYTHONPATH: contributing/samples
run: python -m adk_pr_triaging_agent.main
================================================
FILE: .github/workflows/pyink.yml
================================================
# Copyright 2026 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
name: Check Pyink Formatting
on:
pull_request:
paths:
- '**.py'
- 'pyproject.toml'
jobs:
pyink-check:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v6
with:
fetch-depth: 2
- name: Set up Python
uses: actions/setup-python@v6
with:
python-version: '3.11'
- name: Install pyink
run: |
pip install pyink
- name: Run pyink on changed files
id: run_pyink
run: |
git fetch origin ${GITHUB_BASE_REF}
CHANGED_FILES=$(git diff --diff-filter=ACMR --name-only origin/${GITHUB_BASE_REF}...HEAD | grep -E '\.py$' || true)
if [ -n "$CHANGED_FILES" ]; then
echo "Changed Python files:"
echo "$CHANGED_FILES"
echo ""
FORMATTED_FILES=$(echo "$CHANGED_FILES" | tr '\n' ' ')
# Run pyink --check
set +e
pyink --check --diff --config pyproject.toml $CHANGED_FILES
RESULT=$?
set -e
if [ $RESULT -ne 0 ]; then
echo ""
echo "❌ Pyink formatting check failed!"
echo "👉 To fix formatting, run locally:"
echo ""
echo " pyink --config pyproject.toml $FORMATTED_FILES"
echo ""
exit $RESULT
fi
else
echo "No Python files changed. Skipping pyink check."
fi
================================================
FILE: .github/workflows/python-unit-tests.yml
================================================
# Copyright 2026 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
name: Python Unit Tests
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"]
steps:
- name: Checkout code
uses: actions/checkout@v6
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v6
with:
python-version: ${{ matrix.python-version }}
- name: Install the latest version of uv
uses: astral-sh/setup-uv@v7
- name: Install dependencies
run: |
uv venv .venv
source .venv/bin/activate
uv sync --extra test
- name: Run unit tests with pytest
run: |
source .venv/bin/activate
pytest tests/unittests \
--ignore=tests/unittests/artifacts/test_artifact_service.py \
--ignore=tests/unittests/tools/google_api_tool/test_googleapi_to_openapi_converter.py
================================================
FILE: .github/workflows/release-cherry-pick.yml
================================================
# Step 3 (optional): Cherry-picks a commit from main to the release/candidate branch.
# Use between step 1 and step 4 to include bug fixes in an in-progress release.
# Note: Does NOT auto-trigger release-please to preserve manual changelog edits.
name: "Release: Cherry-pick"
on:
workflow_dispatch:
inputs:
commit_sha:
description: 'Commit SHA to cherry-pick'
required: true
type: string
permissions:
contents: write
jobs:
cherry-pick:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
with:
ref: release/candidate
fetch-depth: 0
- name: Configure git
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
- name: Cherry-pick commit
run: |
echo "Cherry-picking ${INPUTS_COMMIT_SHA} to release/candidate"
git cherry-pick ${INPUTS_COMMIT_SHA}
env:
INPUTS_COMMIT_SHA: ${{ inputs.commit_sha }}
- name: Push changes
run: |
git push origin release/candidate
echo "Successfully cherry-picked commit to release/candidate"
echo "Note: Release Please is NOT auto-triggered to preserve manual changelog edits."
echo "Run release-please.yml manually if you want to regenerate the changelog."
================================================
FILE: .github/workflows/release-cut.yml
================================================
# Step 1: Starts the release process by creating a release/candidate branch.
# Generates a changelog PR for review (step 2).
name: "Release: Cut"
on:
workflow_dispatch:
inputs:
commit_sha:
description: 'Commit SHA to cut from (leave empty for latest main)'
required: false
type: string
permissions:
contents: write
actions: write
jobs:
cut-release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
with:
ref: ${{ inputs.commit_sha || 'main' }}
- name: Check for existing release/candidate branch
env:
GH_TOKEN: ${{ github.token }}
run: |
if git ls-remote --exit-code --heads origin release/candidate &>/dev/null; then
echo "Error: release/candidate branch already exists"
echo "Please finalize or delete the existing release candidate before starting a new one"
exit 1
fi
- name: Create and push release/candidate branch
run: |
git checkout -b release/candidate
git push origin release/candidate
echo "Created branch: release/candidate"
- name: Trigger Release Please
env:
GH_TOKEN: ${{ github.token }}
run: |
gh workflow run release-please.yml --repo ${{ github.repository }} --ref release/candidate
echo "Triggered Release Please workflow"
================================================
FILE: .github/workflows/release-finalize.yml
================================================
# Step 4: Triggers when the changelog PR is merged to release/candidate.
# Records last-release-sha and renames release/candidate to release/v{version}.
name: "Release: Finalize"
on:
pull_request:
types: [closed]
branches:
- release/candidate
permissions:
contents: write
pull-requests: write
jobs:
finalize:
if: github.event.pull_request.merged == true
runs-on: ubuntu-latest
steps:
- name: Check for release-please PR
id: check
env:
LABELS: ${{ toJson(github.event.pull_request.labels.*.name) }}
run: |
if echo "$LABELS" | grep -q "autorelease: pending"; then
echo "is_release_pr=true" >> $GITHUB_OUTPUT
else
echo "Not a release-please PR, skipping"
echo "is_release_pr=false" >> $GITHUB_OUTPUT
fi
- uses: actions/checkout@v6
if: steps.check.outputs.is_release_pr == 'true'
with:
ref: release/candidate
token: ${{ secrets.RELEASE_PAT }}
fetch-depth: 0
- name: Extract version from manifest
if: steps.check.outputs.is_release_pr == 'true'
id: version
run: |
VERSION=$(jq -r '.["."]' .github/.release-please-manifest.json)
echo "version=$VERSION" >> $GITHUB_OUTPUT
echo "Extracted version: $VERSION"
- name: Configure git identity from RELEASE_PAT
if: steps.check.outputs.is_release_pr == 'true'
env:
GH_TOKEN: ${{ secrets.RELEASE_PAT }}
run: |
USER_JSON=$(gh api user)
git config user.name "$(echo "$USER_JSON" | jq -r '.login')"
git config user.email "$(echo "$USER_JSON" | jq -r '.id')+$(echo "$USER_JSON" | jq -r '.login')@users.noreply.github.com"
- name: Record last-release-sha for release-please
if: steps.check.outputs.is_release_pr == 'true'
run: |
git fetch origin main
CUT_SHA=$(git merge-base origin/main HEAD)
echo "Release was cut from main at: $CUT_SHA"
jq --arg sha "$CUT_SHA" '. + {"last-release-sha": $sha}' \
.github/release-please-config.json > tmp.json && mv tmp.json .github/release-please-config.json
git add .github/release-please-config.json
git commit -m "chore: update last-release-sha for next release"
git push origin release/candidate
- name: Rename release/candidate to release/v{version}
if: steps.check.outputs.is_release_pr == 'true'
run: |
VERSION="v${STEPS_VERSION_OUTPUTS_VERSION}"
git push origin "release/candidate:refs/heads/release/$VERSION" ":release/candidate"
echo "Renamed release/candidate to release/$VERSION"
env:
STEPS_VERSION_OUTPUTS_VERSION: ${{ steps.version.outputs.version }}
- name: Update PR label to tagged
if: steps.check.outputs.is_release_pr == 'true'
env:
GH_TOKEN: ${{ github.token }}
run: |
gh pr edit ${{ github.event.pull_request.number }} \
--remove-label "autorelease: pending" \
--add-label "autorelease: tagged"
echo "Updated PR label to autorelease: tagged"
================================================
FILE: .github/workflows/release-please.yml
================================================
# Runs release-please to create/update a PR with version bump and changelog.
# Triggered only by workflow_dispatch (from release-cut.yml).
# Does NOT auto-run on push to preserve manual changelog edits after cherry-picks.
name: "Release: Please"
on:
# Only run via workflow_dispatch (triggered by release-cut.yml)
workflow_dispatch:
permissions:
contents: write
pull-requests: write
jobs:
release-please:
runs-on: ubuntu-latest
steps:
- name: Check if release/candidate still exists
id: check
env:
GH_TOKEN: ${{ github.token }}
run: |
if gh api repos/${{ github.repository }}/branches/release/candidate --silent 2>/dev/null; then
echo "exists=true" >> $GITHUB_OUTPUT
else
echo "release/candidate branch no longer exists, skipping"
echo "exists=false" >> $GITHUB_OUTPUT
fi
- uses: actions/checkout@v6
if: steps.check.outputs.exists == 'true'
with:
ref: release/candidate
- uses: googleapis/release-please-action@v4
if: steps.check.outputs.exists == 'true'
with:
token: ${{ secrets.RELEASE_PAT }}
config-file: .github/release-please-config.json
manifest-file: .github/.release-please-manifest.json
target-branch: release/candidate
================================================
FILE: .github/workflows/release-publish.yml
================================================
# Step 6: Builds and publishes the package to PyPI from a release/v{version} branch.
# Creates a merge-back PR (step 7) to sync release changes to main.
name: "Release: Publish to PyPi"
on:
workflow_dispatch:
permissions:
contents: write
pull-requests: write
jobs:
publish:
runs-on: ubuntu-latest
steps:
- name: Validate branch
run: |
if [[ ! "${GITHUB_REF_NAME}" =~ ^release/v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
echo "Error: Must run from a release/v* branch (e.g., release/v0.3.0)"
exit 1
fi
- name: Extract version
id: version
run: |
VERSION="${GITHUB_REF_NAME}"
VERSION="${VERSION#release/v}"
echo "version=$VERSION" >> $GITHUB_OUTPUT
echo "Publishing version: $VERSION"
- uses: actions/checkout@v6
- name: Install uv
uses: astral-sh/setup-uv@v4
with:
version: "latest"
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.11"
- name: Build package
run: uv build
- name: Publish to PyPI
env:
UV_PUBLISH_TOKEN: ${{ secrets.PYPI_TOKEN }}
run: uv publish
- name: Create merge-back PR
env:
GH_TOKEN: ${{ secrets.RELEASE_PAT }}
STEPS_VERSION_OUTPUTS_VERSION: ${{ steps.version.outputs.version }}
run: |
gh pr create \
--base main \
--head "${GITHUB_REF_NAME}" \
--title "chore: merge release v${STEPS_VERSION_OUTPUTS_VERSION} to main" \
--body "Syncs version bump and CHANGELOG from release v${STEPS_VERSION_OUTPUTS_VERSION} to main."
================================================
FILE: .github/workflows/release-v2-cherry-pick.yml
================================================
# Step 3 (v2, optional): Cherry-picks a commit from v2 to the release/v2-candidate branch.
# Use between step 1 and step 4 to include bug fixes in an in-progress release.
# Note: Does NOT auto-trigger release-please to preserve manual changelog edits.
name: "Release v2: Cherry-pick"
on:
workflow_dispatch:
inputs:
commit_sha:
description: 'Commit SHA to cherry-pick'
required: true
type: string
permissions:
contents: write
jobs:
cherry-pick:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
with:
ref: release/v2-candidate
fetch-depth: 0
- name: Configure git
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
- name: Cherry-pick commit
run: |
echo "Cherry-picking ${INPUTS_COMMIT_SHA} to release/v2-candidate"
git cherry-pick ${INPUTS_COMMIT_SHA}
env:
INPUTS_COMMIT_SHA: ${{ inputs.commit_sha }}
- name: Push changes
run: |
git push origin release/v2-candidate
echo "Successfully cherry-picked commit to release/v2-candidate"
echo "Note: Release Please is NOT auto-triggered to preserve manual changelog edits."
echo "Run release-v2-please.yml manually if you want to regenerate the changelog."
================================================
FILE: .github/workflows/release-v2-cut.yml
================================================
# Step 1 (v2): Starts the v2 release process by creating a release/v2-candidate branch.
# Generates a changelog PR for review (step 2).
name: "Release v2: Cut"
on:
workflow_dispatch:
inputs:
commit_sha:
description: 'Commit SHA to cut from (leave empty for latest v2)'
required: false
type: string
permissions:
contents: write
actions: write
jobs:
cut-release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
with:
ref: ${{ inputs.commit_sha || 'v2' }}
- name: Check for existing release/v2-candidate branch
env:
GH_TOKEN: ${{ github.token }}
run: |
if git ls-remote --exit-code --heads origin release/v2-candidate &>/dev/null; then
echo "Error: release/v2-candidate branch already exists"
echo "Please finalize or delete the existing release candidate before starting a new one"
exit 1
fi
- name: Create and push release/v2-candidate branch
run: |
git checkout -b release/v2-candidate
git push origin release/v2-candidate
echo "Created branch: release/v2-candidate"
- name: Trigger Release Please
env:
GH_TOKEN: ${{ github.token }}
run: |
gh workflow run release-v2-please.yml --repo ${{ github.repository }} --ref release/v2-candidate
echo "Triggered Release Please workflow for v2"
================================================
FILE: .github/workflows/release-v2-finalize.yml
================================================
# Step 4 (v2): Triggers when the changelog PR is merged to release/v2-candidate.
# Records last-release-sha and renames release/v2-candidate to release/v{version}.
name: "Release v2: Finalize"
on:
pull_request:
types: [closed]
branches:
- release/v2-candidate
permissions:
contents: write
pull-requests: write
jobs:
finalize:
if: github.event.pull_request.merged == true
runs-on: ubuntu-latest
steps:
- name: Check for release-please PR
id: check
env:
LABELS: ${{ toJson(github.event.pull_request.labels.*.name) }}
run: |
if echo "$LABELS" | grep -q "autorelease: pending"; then
echo "is_release_pr=true" >> $GITHUB_OUTPUT
else
echo "Not a release-please PR, skipping"
echo "is_release_pr=false" >> $GITHUB_OUTPUT
fi
- uses: actions/checkout@v6
if: steps.check.outputs.is_release_pr == 'true'
with:
ref: release/v2-candidate
token: ${{ secrets.RELEASE_PAT }}
fetch-depth: 0
- name: Extract version from manifest
if: steps.check.outputs.is_release_pr == 'true'
id: version
run: |
VERSION=$(jq -r '.["."]' .github/.release-please-manifest-v2.json)
echo "version=$VERSION" >> $GITHUB_OUTPUT
echo "Extracted version: $VERSION"
- name: Configure git identity from RELEASE_PAT
if: steps.check.outputs.is_release_pr == 'true'
env:
GH_TOKEN: ${{ secrets.RELEASE_PAT }}
run: |
USER_JSON=$(gh api user)
git config user.name "$(echo "$USER_JSON" | jq -r '.login')"
git config user.email "$(echo "$USER_JSON" | jq -r '.id')+$(echo "$USER_JSON" | jq -r '.login')@users.noreply.github.com"
- name: Record last-release-sha for release-please
if: steps.check.outputs.is_release_pr == 'true'
run: |
git fetch origin v2
CUT_SHA=$(git merge-base origin/v2 HEAD)
echo "Release was cut from v2 at: $CUT_SHA"
jq --arg sha "$CUT_SHA" '. + {"last-release-sha": $sha}' \
.github/release-please-config-v2.json > tmp.json && mv tmp.json .github/release-please-config-v2.json
git add .github/release-please-config-v2.json
git commit -m "chore: update last-release-sha for next v2 release"
git push origin release/v2-candidate
- name: Rename release/v2-candidate to release/v{version}
if: steps.check.outputs.is_release_pr == 'true'
run: |
VERSION="v${STEPS_VERSION_OUTPUTS_VERSION}"
git push origin "release/v2-candidate:refs/heads/release/$VERSION" ":release/v2-candidate"
echo "Renamed release/v2-candidate to release/$VERSION"
env:
STEPS_VERSION_OUTPUTS_VERSION: ${{ steps.version.outputs.version }}
- name: Update PR label to tagged
if: steps.check.outputs.is_release_pr == 'true'
env:
GH_TOKEN: ${{ github.token }}
run: |
gh pr edit ${{ github.event.pull_request.number }} \
--remove-label "autorelease: pending" \
--add-label "autorelease: tagged"
echo "Updated PR label to autorelease: tagged"
================================================
FILE: .github/workflows/release-v2-please.yml
================================================
# Runs release-please to create/update a PR with version bump and changelog for v2.
# Triggered only by workflow_dispatch (from release-v2-cut.yml).
# Does NOT auto-run on push to preserve manual changelog edits after cherry-picks.
name: "Release v2: Please"
on:
# Only run via workflow_dispatch (triggered by release-v2-cut.yml)
workflow_dispatch:
permissions:
contents: write
pull-requests: write
jobs:
release-please:
runs-on: ubuntu-latest
steps:
- name: Check if release/v2-candidate still exists
id: check
env:
GH_TOKEN: ${{ github.token }}
run: |
if gh api repos/${{ github.repository }}/branches/release/v2-candidate --silent 2>/dev/null; then
echo "exists=true" >> $GITHUB_OUTPUT
else
echo "release/v2-candidate branch no longer exists, skipping"
echo "exists=false" >> $GITHUB_OUTPUT
fi
- uses: actions/checkout@v6
if: steps.check.outputs.exists == 'true'
with:
ref: release/v2-candidate
- uses: googleapis/release-please-action@v4
if: steps.check.outputs.exists == 'true'
with:
token: ${{ secrets.RELEASE_PAT }}
config-file: .github/release-please-config-v2.json
manifest-file: .github/.release-please-manifest-v2.json
target-branch: release/v2-candidate
================================================
FILE: .github/workflows/release-v2-publish.yml
================================================
# Step 6 (v2): Builds and publishes the v2 package to PyPI from a release/v{version} branch.
# Converts semver pre-release version to PEP 440 format before building.
# Creates a merge-back PR (step 7) to sync release changes to v2.
name: "Release v2: Publish to PyPi"
on:
workflow_dispatch:
permissions:
contents: write
pull-requests: write
jobs:
publish:
runs-on: ubuntu-latest
steps:
- name: Validate branch
run: |
if [[ ! "${GITHUB_REF_NAME}" =~ ^release/v[0-9]+\.[0-9]+\.[0-9]+ ]]; then
echo "Error: Must run from a release/v* branch (e.g., release/v2.0.0-alpha.1)"
exit 1
fi
- name: Extract and convert version to PEP 440
id: version
run: |
VERSION="${GITHUB_REF_NAME}"
VERSION="${VERSION#release/v}"
echo "semver=$VERSION" >> $GITHUB_OUTPUT
echo "Semver version: $VERSION"
# Convert semver pre-release to PEP 440:
# 2.0.0-alpha.1 -> 2.0.0a1
# 2.0.0-beta.1 -> 2.0.0b1
# 2.0.0-rc.1 -> 2.0.0rc1
# 2.0.0 -> 2.0.0 (no change for stable)
PEP440=$(echo "$VERSION" | sed -E 's/-alpha\./a/; s/-beta\./b/; s/-rc\./rc/')
echo "pep440=$PEP440" >> $GITHUB_OUTPUT
echo "PEP 440 version: $PEP440"
- uses: actions/checkout@v6
- name: Install uv
uses: astral-sh/setup-uv@v4
with:
version: "latest"
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.11"
- name: Update pyproject.toml with PEP 440 version
env:
PEP440_VERSION: ${{ steps.version.outputs.pep440 }}
run: |
# Update version in pyproject.toml if it differs from PEP 440
sed -i "s/^version = .*/version = \"${PEP440_VERSION}\"/" pyproject.toml
echo "Updated pyproject.toml version to ${PEP440_VERSION}"
- name: Build package
run: uv build
- name: Publish to PyPI
env:
UV_PUBLISH_TOKEN: ${{ secrets.PYPI_TOKEN }}
run: uv publish
- name: Create merge-back PR
env:
GH_TOKEN: ${{ secrets.RELEASE_PAT }}
SEMVER_VERSION: ${{ steps.version.outputs.semver }}
PEP440_VERSION: ${{ steps.version.outputs.pep440 }}
run: |
gh pr create \
--base v2 \
--head "${GITHUB_REF_NAME}" \
--title "chore: merge release v${PEP440_VERSION} to v2" \
--body "Syncs version bump and CHANGELOG from release v${SEMVER_VERSION} to v2."
================================================
FILE: .github/workflows/stale-bot.yml
================================================
# Copyright 2026 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
name: ADK Stale Issue Auditor
on:
workflow_dispatch:
schedule:
# This runs at 6:00 AM UTC (10 PM PST)
- cron: '0 6 * * *'
jobs:
audit-stale-issues:
if: github.repository == 'google/adk-python'
runs-on: ubuntu-latest
timeout-minutes: 60
permissions:
issues: write
contents: read
steps:
- name: Checkout repository
uses: actions/checkout@v6
- name: Set up Python
uses: actions/setup-python@v6
with:
python-version: '3.11'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install requests google-adk
- name: Run Auditor Agent Script
env:
GITHUB_TOKEN: ${{ secrets.ADK_TRIAGE_AGENT }}
GOOGLE_API_KEY: ${{ secrets.GOOGLE_API_KEY }}
OWNER: ${{ github.repository_owner }}
REPO: adk-python
CONCURRENCY_LIMIT: 3
LLM_MODEL_NAME: "gemini-2.5-flash"
PYTHONPATH: contributing/samples
run: python -m adk_stale_agent.main
================================================
FILE: .github/workflows/triage.yml
================================================
name: ADK Issue Triaging Agent
on:
issues:
types: [opened, labeled]
schedule:
# Run every 6 hours to triage untriaged issues
- cron: '0 */6 * * *'
jobs:
agent-triage-issues:
runs-on: ubuntu-latest
# Run for:
# - Scheduled runs (batch processing)
# - New issues (need component labeling)
# - Issues labeled with "planned" (need owner assignment)
if: >-
github.repository == 'google/adk-python' && (
github.event_name == 'schedule' ||
github.event.action == 'opened' ||
github.event.label.name == 'planned'
)
permissions:
issues: write
contents: read
steps:
- name: Checkout repository
uses: actions/checkout@v6
- name: Set up Python
uses: actions/setup-python@v6
with:
python-version: '3.11'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install requests google-adk
- name: Run Triaging Script
env:
GITHUB_TOKEN: ${{ secrets.ADK_TRIAGE_AGENT }}
GOOGLE_API_KEY: ${{ secrets.GOOGLE_API_KEY }}
GOOGLE_GENAI_USE_VERTEXAI: 0
OWNER: ${{ github.repository_owner }}
REPO: ${{ github.event.repository.name }}
INTERACTIVE: 0
EVENT_NAME: ${{ github.event_name }} # 'issues', 'schedule', etc.
ISSUE_NUMBER: ${{ github.event.issue.number }}
ISSUE_TITLE: ${{ github.event.issue.title }}
ISSUE_BODY: ${{ github.event.issue.body }}
ISSUE_COUNT_TO_PROCESS: '3' # Process 3 issues at a time on schedule
PYTHONPATH: contributing/samples
run: python -m adk_triaging_agent.main
================================================
FILE: .github/workflows/upload-adk-docs-to-vertex-ai-search.yml
================================================
name: Upload ADK Docs to Vertex AI Search
on:
# Runs once per day at 16:00 UTC
schedule:
- cron: '00 16 * * *'
# Manual trigger for testing and fixing
workflow_dispatch:
jobs:
upload-adk-docs-to-vertex-ai-search:
if: github.repository == 'google/adk-python'
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v6
- name: Clone adk-docs repository
run: git clone https://github.com/google/adk-docs.git /tmp/adk-docs
- name: Clone adk-python repository
run: git clone https://github.com/google/adk-python.git /tmp/adk-python
- name: Set up Python
uses: actions/setup-python@v6
with:
python-version: '3.11'
- name: Authenticate to Google Cloud
id: auth
uses: 'google-github-actions/auth@v3'
with:
credentials_json: '${{ secrets.ADK_GCP_SA_KEY }}'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install google-adk markdown google-cloud-storage google-cloud-discoveryengine
- name: Run Answering Script
env:
GITHUB_TOKEN: ${{ secrets.ADK_TRIAGE_AGENT }}
GOOGLE_CLOUD_PROJECT: ${{ secrets.GOOGLE_CLOUD_PROJECT }}
GOOGLE_CLOUD_LOCATION: ${{ secrets.GOOGLE_CLOUD_LOCATION }}
VERTEXAI_DATASTORE_ID: ${{ secrets.VERTEXAI_DATASTORE_ID }}
GOOGLE_GENAI_USE_VERTEXAI: 1
GCS_BUCKET_NAME: ${{ secrets.GCS_BUCKET_NAME }}
ADK_DOCS_ROOT_PATH: /tmp/adk-docs
ADK_PYTHON_ROOT_PATH: /tmp/adk-python
PYTHONPATH: contributing/samples
run: python -m adk_answering_agent.upload_docs_to_vertex_ai_search
================================================
FILE: .github/workflows/v2-sync.yml
================================================
# Automatically creates a PR to merge main (v1) into v2 to keep v2 up to date.
# The oncall is responsible for reviewing and merging the sync PR.
name: "Sync: main -> v2"
on:
schedule:
- cron: '0 6 * * *' # Daily at 6am UTC
workflow_dispatch:
permissions:
contents: write
pull-requests: write
jobs:
sync:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
with:
ref: v2
fetch-depth: 0
token: ${{ secrets.RELEASE_PAT }}
- name: Check for new commits on main
id: check
run: |
git fetch origin main
BEHIND=$(git rev-list --count HEAD..origin/main)
echo "behind=$BEHIND" >> $GITHUB_OUTPUT
if [ "$BEHIND" -eq 0 ]; then
echo "v2 is up to date with main, nothing to sync"
else
echo "v2 is $BEHIND commit(s) behind main"
fi
- name: Check for existing sync PR
if: steps.check.outputs.behind != '0'
id: existing
env:
GH_TOKEN: ${{ github.token }}
run: |
PR=$(gh pr list --base v2 --head main --state open --json number --jq '.[0].number // empty')
if [ -n "$PR" ]; then
echo "Sync PR #$PR already exists, skipping"
echo "exists=true" >> $GITHUB_OUTPUT
else
echo "exists=false" >> $GITHUB_OUTPUT
fi
- name: Create sync PR
if: steps.check.outputs.behind != '0' && steps.existing.outputs.exists == 'false'
env:
GH_TOKEN: ${{ secrets.RELEASE_PAT }}
run: |
gh pr create \
--base v2 \
--head main \
--title "chore: sync main -> v2" \
--body "Automated sync of v1 changes from main into v2. The oncall is responsible for reviewing and merging this PR. Resolve conflicts in favor of the v2 implementation."
================================================
FILE: .gitignore
================================================
# Python
__pycache__/
*.py[cod]
*$py.class
*.so
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
*.egg-info/
.installed.cfg
*.egg
# Virtual Environment
venv/
ENV/
env/
.env
.venv
env.bak/
venv.bak/
# IDE
.idea/
.vscode/
*.swp
*.swo
.DS_Store
# Testing
.coverage
htmlcov/
.tox/
.nox/
.pytest_cache/
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py,cover
.hypothesis/
.pytest_cache/
# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
*.egg-info/
.installed.cfg
*.egg
# Jupyter Notebook
.ipynb_checkpoints
# Logs
*.log
logs/
log/
# Local development settings
.env.local
.env.development.local
.env.test.local
.env.production.local
uv.lock
# Google Cloud specific
.gcloudignore
.gcloudignore.local
# Documentation
docs/_build/
site/
# Misc
.DS_Store
Thumbs.db
*.bak
*.tmp
*.temp
# AI Coding Tools - Project-specific configs
# Developers should symlink or copy AGENTS.md and add their own overrides locally
.adk/
.claude/
CLAUDE.md
.cursor/
.cursorrules
.cursorignore
.windsurfrules
.aider*
.continue/
.codeium/
.githubnext/
.roo/
.rooignore
.bolt/
.v0/
================================================
FILE: AGENTS.md
================================================
# AI Coding Assistant Context
This document provides context for AI coding assistants (Claude Code, Gemini
CLI, GitHub Copilot, Cursor, etc.) to understand the ADK Python project and
assist with development.
## Project Overview
The Agent Development Kit (ADK) is an open-source, code-first Python toolkit for
building, evaluating, and deploying sophisticated AI agents with flexibility and
control. While optimized for Gemini and the Google ecosystem, ADK is
model-agnostic, deployment-agnostic, and is built for compatibility with other
frameworks. ADK was designed to make agent development feel more like software
development, to make it easier for developers to create, deploy, and orchestrate
agentic architectures that range from simple tasks to complex workflows.
### Key Components
- **Agent** - Blueprint defining identity, instructions, and tools
(`LlmAgent`, `LoopAgent`, `ParallelAgent`, `SequentialAgent`, etc.)
- **Runner** - Execution engine that orchestrates agent execution. It manages
the 'Reason-Act' loop, processes messages within a session, generates
events, calls LLMs, executes tools, and handles multi-agent coordination. It
interacts with various services like session management, artifact storage,
and memory, and integrates with application-wide plugins. The runner
provides different execution modes: `run_async` for asynchronous execution
in production, `run_live` for bidirectional streaming interaction, and
`run` for synchronous execution suitable for local testing and debugging. At
the end of each invocation, it can perform event compaction to manage
session history size.
- **Tool** - Functions/capabilities agents can call (Python functions, OpenAPI
specs, MCP tools, Google API tools)
- **Session** - Conversation state management (in-memory, Vertex AI,
Spanner-backed)
- **Memory** - Long-term recall across sessions
### How the Runner Works
The Runner is the stateless orchestration engine that manages agent execution.
It does not hold conversation history in memory; instead, it relies on services
like `SessionService`, `ArtifactService`, and `MemoryService` for persistence.
**Invocation Lifecycle:**
Each call to `runner.run_async()` or `runner.run()` processes a single user
turn, known as an **invocation**.
1. **Session Retrieval:** When `run_async()` is called with a `session_id`, the
runner fetches the session state, including all conversation events, from
the `SessionService`.
2. **Context Creation:** It creates an `InvocationContext` containing the
session, the new user message, and references to persistence services.
3. **Agent Execution:** The runner calls `agent.run_async()` with this context.
The agent then enters its reason-act loop, which may involve:
* Calling an LLM for reasoning.
* Executing tools (function calling).
* Generating text or audio responses.
* Transferring control to sub-agents.
4. **Event Streaming & Persistence:** Each step in the agent's execution (LLM
call, tool call, tool response, model response) generates `Event` objects.
The runner streams these events back to the caller and simultaneously
appends them to the session via `SessionService`.
5. **Invocation Completion:** Once the agent has produced its final response
for the turn (e.g., a text response to the user), the agent's execution loop
finishes.
6. **Event Compaction:** If event compaction is configured, the runner may
summarize older events in the session to manage context window limits,
appending a `CompactedEvent` to the session.
7. **Next Turn:** When the user sends another message, a new `run_async()`
invocation begins, repeating the cycle by loading the session, which now
includes the events from all prior turns.
## Project Architecture
Please refer to
[ADK Project Overview and Architecture](https://github.com/google/adk-python/blob/main/contributing/adk_project_overview_and_architecture.md)
for details.
### Source Structure
```
src/google/adk/
├── agents/ # Agent implementations (LlmAgent, LoopAgent, ParallelAgent, etc.)
├── runners.py # Core Runner orchestration class
├── tools/ # Tool ecosystem (50+ files)
│ ├── google_api_tool/
│ ├── bigtable/, bigquery/, spanner/
│ ├── openapi_tool/
│ └── mcp_tool/ # Model Context Protocol
├── models/ # LLM integrations (Gemini, Anthropic, LiteLLM)
├── sessions/ # Session management (in-memory, Vertex AI, Spanner)
├── memory/ # Long-term memory services
├── evaluation/ # Evaluation framework (47 files)
├── cli/ # CLI tools and web UI
├── flows/ # Execution flow orchestration
├── a2a/ # Agent-to-Agent protocol
├── telemetry/ # Observability and tracing
└── utils/ # Utility functions
```
### Test Structure
```
tests/
├── unittests/ # 2600+ unit tests across 236+ files
│ ├── agents/
│ ├── tools/
│ ├── models/
│ ├── evaluation/
│ ├── a2a/
│ └── ...
└── integration/ # Integration tests
```
### ADK Live (Bidi-streaming)
- ADK live feature can be accessed from runner.run_live(...) and corresponding
FAST api endpoint.
- ADK live feature is built on top of
[Gemini Live API](https://cloud.google.com/vertex-ai/generative-ai/docs/live-api).
We integrate Gemini Live API through
[GenAI SDK](https://github.com/googleapis/python-genai).
- ADK live related configs are in
[run_config.py](https://github.com/google/adk-python/blob/main/src/google/adk/agents/run_config.py).
- ADK live under multi-agent scenario: we convert the audio into text. This
text will be passed to next agent as context.
- Most logics are in
[base_llm_flow.py](https://github.com/google/adk-python/blob/main/src/google/adk/flows/llm_flows/base_llm_flow.py)
and
[gemini_llm_connection.py](https://github.com/google/adk-python/blob/main/src/google/adk/models/gemini_llm_connection.py).
- Input transcription and output transcription should be added to session as
Event.
- User audio or model audio should be saved into artifacts with a reference in
Event to it.
- Tests are in
[tests/unittests/streaming](https://github.com/google/adk-python/tree/main/tests/unittests/streaming).
### Agent Structure Convention (Required)
**All agent directories must follow this structure:** `my_agent/ ├──
__init__.py # MUST contain: from . import agent └── agent.py # MUST define:
root_agent = Agent(...) OR app = App(...)`
**Choose one pattern based on your needs:**
**Option 1 - Simple Agent (for basic agents without plugins):** ```python from
google.adk.agents import Agent from google.adk.tools import google_search
root_agent = Agent( name="search_assistant", model="gemini-2.5-flash",
instruction="You are a helpful assistant.", description="An assistant that can
search the web.", tools=[google_search] ) ```
**Option 2 - App Pattern (when you need plugins, event compaction, custom
configuration):** ```python from google.adk import Agent from google.adk.apps
import App from google.adk.plugins import ContextFilterPlugin
root_agent = Agent( name="my_agent", model="gemini-2.5-flash", instruction="You
are a helpful assistant.", tools=[...], )
app = App( name="my_app", root_agent=root_agent, plugins=[
ContextFilterPlugin(num_invocations_to_keep=3), ], ) ```
**Rationale:** This structure allows the ADK CLI (`adk web`, `adk run`, etc.) to
automatically discover and load agents without additional configuration.
## Development Setup
### Requirements
**Minimum requirements:**
- Python 3.10+ (**Python 3.11+ strongly recommended** for best performance)
- `uv` package manager (**required** - faster than pip/venv)
**Install uv if not already installed:** `bash curl -LsSf
https://astral.sh/uv/install.sh | sh`
### Setup Instructions
**Standard setup for development:** ```bash
# Create virtual environment with Python 3.11
uv venv --python "python3.11" ".venv" source .venv/bin/activate
# Install all dependencies for development
uv sync --all-extras ```
**Minimal setup for testing only (matches CI):** `bash uv sync --extra test`
**Virtual Environment Usage (Required):** - **Always use** `.venv/bin/python` or
`.venv/bin/pytest` directly - **Or activate** with `source .venv/bin/activate`
before running commands - **Never use** `python -m venv` - always create with
`uv venv` if missing
**Rationale:** `uv` is significantly faster and ensures consistent dependency
resolution across the team.
### Building
```bash
# Build wheel
uv build
# Install local build for testing
pip install dist/google_adk-<version>-py3-none-any.whl
```
### Running Agents Locally
**For interactive development and debugging:** ```bash
# Launch web UI (recommended for development)
adk web path/to/agents_dir ```
**For CLI-based testing:** ```bash
# Interactive CLI (prompts for user input)
adk run path/to/my_agent ```
**For API/production mode:** ```bash
# Start FastAPI server
adk api_server path/to/agents_dir ```
**For running evaluations:** ```bash
# Run evaluation set against agent
adk eval path/to/my_agent path/to/eval_set.json ```
## ADK: Style Guides
### Python Style Guide
The project follows the Google Python Style Guide. Key conventions are enforced
using `pylint` with the provided `pylintrc` configuration file. Here are some of
the key style points:
* **Indentation**: 2 spaces.
* **Line Length**: Maximum 80 characters.
* **Naming Conventions**:
* `function_and_variable_names`: `snake_case`
* `ClassNames`: `CamelCase`
* `CONSTANTS`: `UPPERCASE_SNAKE_CASE`
* **Docstrings**: Required for all public modules, functions, classes, and
methods.
* **Imports**: Organized and sorted.
* **Error Handling**: Specific exceptions should be caught, not general ones
like `Exception`.
### Autoformat (Required Before Committing)
**Always run** before committing code: `bash ./autoformat.sh`
**Manual formatting** (if needed): ```bash
# Format imports
isort src/ tests/ contributing/
# Format code style
pyink --config pyproject.toml src/ tests/ contributing/ ```
**Check formatting** without making changes: `bash pyink --check --diff --config
pyproject.toml src/ isort --check src/`
**Formatting Standards (Enforced by CI):** - **Formatter:** `pyink`
(Google-style Python formatter) - **Line length:** 80 characters maximum -
**Indentation:** 2 spaces (never tabs) - **Import sorter:** `isort` with Google
profile - **Linter:** `pylint` with Google Python Style Guide
**Rationale:** Consistent formatting eliminates style debates and makes code
reviews focus on logic rather than style.
### In ADK source
Below styles applies to the ADK source code (under `src/` folder of the GitHub
repo).
#### Use relative imports (Required)
```python
# DO - Use relative imports
from ..agents.llm_agent import LlmAgent
# DON'T - No absolute imports
from google.adk.agents.llm_agent import LlmAgent
```
**Rationale:** Relative imports make the code more maintainable and avoid
circular import issues in large codebases.
#### Import from module, not from `__init__.py` (Required)
```python
# DO - Import directly from module
from ..agents.llm_agent import LlmAgent
# DON'T - Import from __init__.py
from ..agents import LlmAgent
```
**Rationale:** Direct module imports make dependencies explicit and improve IDE
navigation and refactoring.
#### Always do `from __future__ import annotations` (Required)
**Rule:** Every source file must include `from __future__ import annotations`
immediately after the license header, before any other imports.
```python
# Copyright 2026 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from __future__ import annotations # REQUIRED - Always include this
# ... rest of imports ...
```
**Rationale:** This enables forward-referencing classes without quotes,
improving code readability and type hint support (PEP 563).
### In ADK tests
#### Use absolute imports (Required)
**Rule:** Test code must use absolute imports (`google.adk.*`) to match how
users import ADK.
```python
# DO - Use absolute imports
from google.adk.agents.llm_agent import LlmAgent
# DON'T - No relative imports in tests
from ..agents.llm_agent import LlmAgent
```
**Rationale:** Tests should exercise the same import paths that users will use,
catching issues with the public API.
## ADK: Local Testing
### Unit Tests
**Quick start:** Run all tests with: `bash pytest tests/unittests`
**Recommended:** Match CI configuration before submitting PRs: `bash uv sync
--extra test && pytest tests/unittests`
**Additional options:** ```bash
# Run tests in parallel for faster execution
pytest tests/unittests -n auto
# Run a specific test file during development
pytest tests/unittests/agents/test_llm_agent.py
```
### Testing Philosophy
**Use real code over mocks:** ADK tests should use real implementations as much
as possible instead of mocking. Only mock external dependencies like network
calls or cloud services.
**Test interface behavior, not implementation details:** Tests should verify
that the public API behaves correctly, not how it's implemented internally. This
makes tests resilient to refactoring and ensures the contract with users remains
intact.
**Test Requirements:** - Fast and isolated tests where possible - Use real ADK
components; mock only external dependencies (LLM APIs, cloud services, etc.) -
Focus on testing public interfaces and behavior, not internal implementation -
Descriptive test names that explain what behavior is being tested - High
coverage for new features, edge cases, and error conditions - Location:
`tests/unittests/` following source structure
## Docstring and comments
### Comments - Explaining the Why, Not the What
Philosophy: Well-written code should be largely self-documenting. Comments serve
a different purpose: they should explain the complex algorithms, non-obvious
business logic, or the rationale behind a particular implementation choice—the
things the code cannot express on its own. Avoid comments that merely restate
what the code does (e.g., # increment i above i += 1).
Style: Comments should be written as complete sentences. Block comments must
begin with a # followed by a single space.
## Versioning
ADK adherence to Semantic Versioning 2.0.0
Core Principle: The adk-python project strictly adheres to the Semantic
Versioning 2.0.0 specification. All release versions will follow the
MAJOR.MINOR.PATCH format.
### Breaking Change
A breaking change is any modification that introduces backward-incompatible
changes to the public API. In the context of the ADK, this means a change that
could force a developer using the framework to alter their existing code to
upgrade to the new version. The public API is not limited to just the Python
function and class signatures; it also encompasses data schemas for stored
information (like evaluation datasets), the command-line interface (CLI), and
the data format used for server communications.
### Public API Surface Definition
The "public API" of ADK is a broad contract that extends beyond its Python
function signatures. A breaking change in any of the following areas can disrupt
user workflows and the wider ecosystem of agents and tools built with ADK. The
analysis of the breaking changes introduced in v1.0.0 demonstrates the expansive
nature of this contract. For the purposes of versioning, the ADK Public API
Surface is defined as:
- All public classes, methods, and functions in the google.adk namespace.
- The names, required parameters, and expected behavior of all built-in Tools
(e.g., google_search, BuiltInCodeExecutor).
- The structure and schema of persisted data, including Session data, Memory,
and Evaluation datasets.
- The JSON request/response format of the ADK API server(FastAPI server) used
by adk web, including field casing conventions.
- The command-line interface (CLI) commands, arguments, and flags (e.g., adk
deploy).
- The expected file structure for agent definitions that are loaded by the
framework (e.g., the agent.py convention).
#### Checklist for Breaking Changes:
The following changes are considered breaking and necessitate a MAJOR version
bump.
- API Signature Change: Renaming, removing, or altering the required
parameters of any public class, method, or function (e.g., the removal of
the list_events method from BaseSessionService).
- Architectural Shift: A fundamental change to a core component's behavior
(e.g., making all service methods async, which requires consumers to use
await).
- Data Schema Change: A non-additive change to a persisted data schema that
renders old data unreadable or invalid (e.g., the redesign of the
MemoryService and evaluation dataset schemas).
- Tool Interface Change: Renaming a built-in tool, changing its required
parameters, or altering its fundamental purpose (e.g., replacing
BuiltInCodeExecutionTool with BuiltInCodeExecutor and moving it from the
tools parameter to the code_executor parameter of an Agent).
- Configuration Change: Altering the required structure of configuration files
or agent definition files that the framework loads (e.g., the simplification
of the agent.py structure for MCPToolset).
- Wire Format Change: Modifying the data format for API server interactions
(e.g., the switch from snake_case to camelCase for all JSON payloads).
- Dependency Removal: Removing support for a previously integrated third-party
library or tool type.
## Commit Message Format (Required)
**All commits must** follow
[Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) format.
**Format:** ``` <type>(<scope>): <description>
[optional body]
[optional footer] ```
**Common types:** `feat`, `fix`, `refactor`, `docs`, `test`, `chore`
**Examples:** ``` feat(agents): Add support for App pattern with plugins
fix(sessions): Prevent memory leak in session cleanup
refactor(tools): Unify environment variable enabled checks ```
**Rationale:** Conventional commits enable automated changelog generation and
version management.
## Key Files and Locations
Quick reference to important project files:
- **Main config:** `pyproject.toml` (uses `flit_core` build backend)
- **Dependencies:** `uv.lock` (managed by `uv`)
- **Linting:** `pylintrc` (Google Python Style Guide)
- **Auto-format:** `autoformat.sh` (runs isort + pyink)
- **CLI entry point:** `src/google/adk/cli/cli_tools_click.py`
- **Web UI backend:** `src/google/adk/cli/adk_web_server.py`
- **Main exports:** `src/google/adk/__init__.py` (exports Agent, Runner)
- **Examples:** `contributing/samples/` (100+ agent implementations)
## Additional Resources
- **Documentation:** https://google.github.io/adk-docs
- **Samples:** https://github.com/google/adk-samples
- **Architecture Details:** `contributing/adk_project_overview_and_architecture.md`
- **Contributing Guide:** `CONTRIBUTING.md`
- **LLM Context:** `llms.txt` (summarized), `llms-full.txt` (comprehensive)
## Python Tips
### General Python Best Practices
* **Constants:** Use immutable global constant collections (tuple, frozenset, immutabledict) to avoid hard-to-find bugs. Prefer constants over wild string/int literals, especially for dictionary keys, pathnames, and enums.
* **Naming:** Name mappings like `value_by_key` to enhance readability in lookups (e.g., `item = item_by_id[id]`).
* **Readability:** Use f-strings for concise string formatting, but use lazy-evaluated `%`-based templates for logging. Use `repr()` or `pprint.pformat()` for human-readable debug messages. Use `_` as a separator in numeric literals to improve readability.
* **Comprehensions:** Use list, set, and dict comprehensions for building collections concisely.
* **Iteration:** Iterate directly over containers without indices. Use `enumerate()` when you need the index, `dict.items()` for keys and values, and `zip()` for parallel iteration.
* **Built-ins:** Leverage built-in functions like `all()`, `any()`, `reversed()`, `sum()`, etc., to write more concise and efficient code.
* **Flattening Lists:** Use `itertools.chain.from_iterable()` to flatten a list of lists efficiently without unnecessary copying.
* **String Methods:** Use `startswith()` and `endswith()` with a tuple of strings to check for multiple prefixes or suffixes at once.
* **Decorators:** Use decorators to add common functionality (like logging, timing, caching) to functions without modifying their core logic. Use `functools.wraps()` to preserve the original function's metadata.
* **Context Managers:** Use `with` statements and context managers (from `contextlib` or custom classes with `__enter__`/`__exit__`) to ensure resources are properly initialized and torn down, even in the presence of exceptions.
* **Else Clauses:** Utilize the `else` clause in `try/except` blocks (runs if no exception), and in `for/while` loops (runs if the loop completes without a `break`) to write more expressive and less error-prone code.
* **Single Assignment:** Prefer single-assignment form (assign to a variable once) over assign-and-mutate to reduce bugs and improve readability. Use conditional expressions where appropriate.
* **Equality vs. Identity:** Use `is` or `is not` for singleton comparisons (e.g., `None`, `True`, `False`). Use `==` for value comparison.
* **Object Comparisons:** When implementing custom classes, be careful with `__eq__`. Return `NotImplemented` for unhandled types. Consider edge cases like subclasses and hashing. Prefer using `attrs` or `dataclasses` to handle this automatically.
* **Hashing:** If objects are equal, their hashes must be equal. Ensure attributes used in `__hash__` are immutable. Disable hashing with `__hash__ = None` if custom `__eq__` is implemented without a proper `__hash__`.
* **`__init__()` vs. `__new__()`:** `__new__()` creates the object, `__init__()` initializes it. For immutable types, modifications must happen in `__new__()`.
* **Default Arguments:** NEVER use mutable default arguments. Use `None` as a sentinel value instead.
* **`__add__()` vs. `__iadd__()`:** `x += y` (in-place add) can modify the object in-place if `__iadd__` is implemented (like for lists), while `x = x + y` creates a new object. This matters when multiple variables reference the same object.
* **Properties:** Use `@property` to create getters and setters only when needed, maintaining a simple attribute access syntax. Avoid properties for computationally expensive operations or those that can fail.
* **Modules for Namespacing:** Use modules as the primary mechanism for grouping and namespacing code elements, not classes. Avoid `@staticmethod` and methods that don't use `self`.
* **Argument Passing:** Python is call-by-value, where the values are object references (pointers). Assignment binds a name to an object. Modifying a mutable object through one name affects all names bound to it.
* **Keyword/Positional Arguments:** Use `*` to force keyword-only arguments and `/` to force positional-only arguments. This can prevent argument transposition errors and make APIs clearer, especially for functions with multiple arguments of the same type.
* **Type Hinting:** Annotate code with types to improve readability, debuggability, and maintainability. Use abstract types from `collections.abc` for container annotations (e.g., `Sequence`, `Mapping`, `Iterable`). Annotate return values, including `None`. Choose the most appropriate abstract type for function arguments and return types.
* **`NewType`:** Use `typing.NewType` to create distinct types from primitives (like `int` or `str`) to prevent argument transposition and improve type safety.
* **`__repr__()` vs. `__str__()`:** Implement `__repr__()` for unambiguous, developer-focused string representations, ideally evaluable. Implement `__str__()` for human-readable output. `__str__()` defaults to `__repr__()`.
* **F-string Debug:** Use `f"{expr=}"` for concise debug printing, showing both the expression and its value.
### Libraries and Tools
* **`collections.Counter`:** Use for efficiently counting hashable objects in an iterable.
* **`collections.defaultdict`:** Useful for avoiding key checks when initializing dictionary values, e.g., appending to lists.
* **`heapq`:** Use `heapq.nlargest()` and `heapq.nsmallest()` for efficiently finding the top/bottom N items. Use `heapq.merge()` to merge multiple sorted iterables.
* **`attrs` / `dataclasses`:** Use these libraries to easily define simple classes with boilerplate methods like `__init__`, `__repr__`, `__eq__`, etc., automatically generated.
* **NumPy:** Use NumPy for efficient array computing, element-wise operations, math functions, filtering, and aggregations on numerical data.
* **Pandas:** When constructing DataFrames row by row, append to a list of dicts and call `pd.DataFrame()` once to avoid inefficient copying. Use `TypedDict` or `dataclasses` for intermediate row data.
* **Flags:** Use libraries like `argparse` or `click` for command-line flag parsing. Access flag values in a type-safe manner.
* **Serialization:** For cross-language serialization, consider JSON (built-in), Protocol Buffers, or msgpack. For Python serialization with validation, use `pydantic` for runtime validation and automatic (de)serialization, or `cattrs` for performance-focused (de)serialization with `dataclasses` or `attrs`.
* **Regular Expressions:** Use `re.VERBOSE` to make complex regexes more readable with whitespace and comments. Choose the right method (`re.search`, `re.fullmatch`). Avoid regexes for simple string checks (`in`, `startswith`, `endswith`). Compile regexes used multiple times with `re.compile()`.
* **Caching:** Use `functools.lru_cache` with care. Prefer immutable return types. Be cautious when memoizing methods, as it can lead to memory leaks if the instance is part of the cache key; consider `functools.cached_property`.
* **Pickle:** Avoid using `pickle` due to security risks and compatibility issues. Prefer JSON, Protocol Buffers, or msgpack for serialization.
* **Multiprocessing:** Be aware of potential issues with `multiprocessing` on some platforms, especially concerning `fork`. Consider alternatives like threads (`concurrent.futures.ThreadPoolExecutor`) or `asyncio` for I/O-bound tasks.
* **Debugging:** Use `IPython.embed()` or `pdb.set_trace()` to drop into an interactive shell for debugging. Use visual debuggers if available. Log with context, including inputs and exception info using `logging.exception()` or `exc_info=True`.
* **Property-Based Testing & Fuzzing:** Use `hypothesis` for property-based testing that generates test cases automatically. For coverage-guided fuzzing, consider `atheris` or `python-afl`.
### Testing
* **Assertions:** Use pytest's native `assert` statements with informative expressions. Pytest automatically provides detailed failure messages showing the values involved. Add custom messages with `assert condition, "helpful message"` when the expression alone isn't clear.
* **Custom Assertions:** Write reusable helper functions (not methods) for repeated complex checks. Use `pytest.fail("message")` to explicitly fail a test with a custom message.
* **Parameterized Tests:** Use `@pytest.mark.parametrize` to reduce duplication when running the same test logic with different inputs. This is more idiomatic than the `parameterized` library.
* **Fixtures:** Use pytest fixtures (with `@pytest.fixture`) for test setup, teardown, and dependency injection. Fixtures are cleaner than class-based setup methods and can be easily shared across tests.
* **Mocking:** Use `mock.create_autospec()` with `spec_set=True` to create mocks that match the original object's interface, preventing typos and API mismatch issues. Use context managers (`with mock.patch(...)`) to manage mock lifecycles and ensure patches are stopped. Prefer injecting dependencies via fixtures over patching.
* **Asserting Mock Calls:** Use `mock.ANY` and other matchers for partial argument matching when asserting mock calls (e.g., `assert_called_once_with`).
* **Temporary Files:** Use pytest's `tmp_path` and `tmp_path_factory` fixtures for creating isolated and automatically cleaned-up temporary files/directories. These are preferred over the `tempfile` module in pytest tests.
* **Avoid Randomness:** Do not use random number generators to create inputs for unit tests. This leads to flaky, hard-to-debug tests. Instead, use deterministic, easy-to-reason-about inputs that cover specific behaviors.
* **Test Invariants:** Focus tests on the invariant behaviors of public APIs, not implementation details.
* **Test Organization:** Prefer simple test functions over class-based tests unless you need to share fixtures across multiple test methods in a class. Use descriptive test names that explain the behavior being tested.
### Error Handling
* **Re-raising Exceptions:** Use a bare `raise` to re-raise the current exception, preserving the original stack trace. Use `raise NewException from original_exception` to chain exceptions, providing context. Use `raise NewException from None` to suppress the original exception's context.
* **Exception Messages:** Always include a descriptive message when raising exceptions.
* **Converting Exceptions to Strings:** `str(e)` can be uninformative. `repr(e)` is often better. For full details including tracebacks and chained exceptions, use functions from the `traceback` module (e.g., `traceback.format_exception(e)`, `traceback.format_exc()`).
* **Terminating Programs:** Use `sys.exit()` for expected terminations. Uncaught non-`SystemExit` exceptions should signal bugs. Avoid functions that cause immediate, unclean exits like `os.abort()`.
* **Returning None:** Be consistent. If a function can return a value, all paths should return a value (use `return None` explicitly). Bare `return` is only for early exit in conceptually void functions (annotated with `-> None`).
================================================
FILE: CHANGELOG.md
================================================
# Changelog
## [1.27.2](https://github.com/google/adk-python/compare/v1.27.1...v1.27.2) (2026-03-17)
### Bug Fixes
* Use valid dataplex OAuth scope for BigQueryToolset ([4010716](https://github.com/google/adk-python/commit/4010716470fc83918dc367c5971342ff551401c8))
* Store and retrieve usage_metadata in Vertex AI custom_metadata ([b318eee](https://github.com/google/adk-python/commit/b318eee979b1625d3d23ad98825c88f54016a12f))
## [1.27.1](https://github.com/google/adk-python/compare/v1.27.0...v1.27.1) (2026-03-13)
### Bug Fixes
* Rolling back change to fix issue affecting LlmAgent creation due to missing version field ([0e18f81](https://github.com/google/adk-python/commit/0e18f81a5cd0d0392ded653b1a63a236449a2685))
## [1.27.0](https://github.com/google/adk-python/compare/v1.26.0...v1.27.0) (2026-03-12)
### Features
* **[Core]**
* Introduce A2A request interceptors in RemoteA2aAgent ([6f772d2](https://github.com/google/adk-python/commit/6f772d2b0841446bc168ccf405b59eb17c1d671a))
* Add UiWidget to EventActions for supporting new experimental UI Widgets feature ([530ff06](https://github.com/google/adk-python/commit/530ff06ece61a93855a53235e85af18b46b2a6a0))
* **auth:** Add pluggable support for auth integrations using AuthProviderRegistry within CredentialManager ([d004074](https://github.com/google/adk-python/commit/d004074c90525442a69cebe226440bb318abad29))
* Support all `types.SchemaUnion` as output_schema in LLM Agent ([63f450e](https://github.com/google/adk-python/commit/63f450e0231f237ee1af37f17420d37b15426d48))
* durable runtime support ([07fdd23](https://github.com/google/adk-python/commit/07fdd23c9c3f5046aa668fb480840f67f13bf271))
* **runners:** pass GetSessionConfig through Runner to session service ([eff724a](https://github.com/google/adk-python/commit/eff724ac9aef2a203607f772c473703f21c09a72))
* **[Models]**
* Add support for PDF documents in Anthropic LLM ([4c8ba74](https://github.com/google/adk-python/commit/4c8ba74fcb07014db187ef8db8246ff966379aa9))
* Add streaming support for Anthropic models ([5770cd3](https://github.com/google/adk-python/commit/5770cd3776c8805086ece34d747e589e36916a34)), closes [#3250](https://github.com/google/adk-python/issues/3250)
* Enable output schema with tools for LiteLlm models ([89df5fc](https://github.com/google/adk-python/commit/89df5fcf883b599cf7bfe40bde35b8d86ab0146b)), closes [#3969](https://github.com/google/adk-python/issues/3969)
* Preserve thought_signature in LiteLLM tool calls ([ae565be](https://github.com/google/adk-python/commit/ae565be30e64249b2913ad647911061a8b170e21)), closes [#4650](https://github.com/google/adk-python/issues/4650)
* **[Web]**
* Updated human in the loop: developers now can respond to long running functions directly in chat
* Render artifacts when resuming
* Fix some light mode styles
* Fix token level streaming not working properly ([22799c0](https://github.com/google/adk-python/commit/22799c0833569753021078f7bd8dcd11ece562fe))
* **[Observability]**
* **telemetry:** add new gen_ai.agent.version span attribute ([ffe97ec](https://github.com/google/adk-python/commit/ffe97ec5ad7229c0b4ba573f33eb0edb8bb2877a))
* **otel:** add `gen_ai.tool.definitions` to experimental semconv ([4dd4d5e](https://github.com/google/adk-python/commit/4dd4d5ecb6a1dadbc41389dac208616f6d21bc6e))
* **otel:** add experimental semantic convention and emit `gen_ai.client.inference.operation.details` event ([19718e9](https://github.com/google/adk-python/commit/19718e9c174af7b1287b627e6b23a609db1ee5e2))
* add missing token usage span attributes during model usage ([77bf325](https://github.com/google/adk-python/commit/77bf325d2bf556621c3276f74ee2816fce2a7085))
* capture tool execution error code in OpenTelemetry spans ([e0a6c6d](https://github.com/google/adk-python/commit/e0a6c6db6f8e2db161f8b86b9f11030f0cec807a))
* **[Tools]**
* Warn when accessing DEFAULT_SKILL_SYSTEM_INSTRUCTION ([35366f4](https://github.com/google/adk-python/commit/35366f4e2a0575090fe12cd85f51e8116a1cd0d3))
* add preserve_property_names option to OpenAPIToolset ([078b516](https://github.com/google/adk-python/commit/078b5163ff47acec69b1c8e105f62eb7b74f5548))
* Add gcs filesystem support for Skills. It supports skills in text and pdf format, also has some sample agents ([6edcb97](https://github.com/google/adk-python/commit/6edcb975827dbd543a40ae3a402d2389327df603))
* Add list_skills_in_dir to skills utils ([327b3af](https://github.com/google/adk-python/commit/327b3affd2d0a192f5a072b90fdb4aae7575be90))
* Add support for MCP App UI widgets in MCPTool ([86db35c](https://github.com/google/adk-python/commit/86db35c338adaafb41e156311465e71e17edf35e))
* add Dataplex Catalog search tool to BigQuery ADK ([82c2eef](https://github.com/google/adk-python/commit/82c2eefb27313c5b11b9e9382f626f543c53a29e))
* Add RunSkillScriptTool to SkillToolset ([636f68f](https://github.com/google/adk-python/commit/636f68fbee700aa47f01e2cfd746859353b3333d))
* Add support for ADK tools in SkillToolset ([44a5e6b](https://github.com/google/adk-python/commit/44a5e6bdb8e8f02891e72b65ef883f108c506f6a))
* limit number of user-provided BigQuery job labels and reserve internal prefixes ([8c4ff74](https://github.com/google/adk-python/commit/8c4ff74e7d70cf940f54f6d7735f001495ce75d5))
* Add param support to Bigtable execute_sql ([5702a4b](https://github.com/google/adk-python/commit/5702a4b1f59b17fd8b290fc125c349240b0953d7))
* **bigtable:** add Bigtable cluster metadata tools ([34c560e](https://github.com/google/adk-python/commit/34c560e66e7ad379f586bbcd45a9460dc059bee2))
* execute-type param addition in GkeCodeExecutor ([9c45166](https://github.com/google/adk-python/commit/9c451662819a6c7de71be71d12ea715b2fe74135))
* **skill:** Add BashTool ([8a31612](https://github.com/google/adk-python/commit/8a3161202e4bac0bb8e8801b100f4403c1c75646))
* Add support for toolsets to additional_tools field of SkillToolset ([066fcec](https://github.com/google/adk-python/commit/066fcec3e8e669d1c5360e1556afce3f7e068072))
* **[Optimization]**
* Add `adk optimize` command ([b18d7a1](https://github.com/google/adk-python/commit/b18d7a140f8e18e03255b07e6d89948427790095))
* Add interface between optimization infra and LocalEvalService ([7b7ddda](https://github.com/google/adk-python/commit/7b7ddda46ca701952f002b2807b89dbef5322414))
* Add GEPA root agent prompt optimizer ([4e3e2cb](https://github.com/google/adk-python/commit/4e3e2cb58858e08a79bc6119ad49b6c049dbc0d0))
* **[Integrations]**
* Enhance BigQuery plugin schema upgrades and error reporting ([bcf38fa](https://github.com/google/adk-python/commit/bcf38fa2bac2f0d1ab74e07e01eb5160bad1d6dc))
* Enhance BQ plugin with fork safety, auto views, and trace continuity ([80c5a24](https://github.com/google/adk-python/commit/80c5a245557cd75870e72bff0ecfaafbd37fdbc7))
* Handle Conflict Errors in BigQuery Agent Analytics Plugin ([372c76b](https://github.com/google/adk-python/commit/372c76b857daa1102e76d755c0758f1515d6f180))
* Added tracking headers for ADK CLI command to Agent Engine ([3117446](https://github.com/google/adk-python/commit/3117446293d30039c2f21f3d17a64a456c42c47d))
* **[A2A]**
* New implementation of A2aAgentExecutor and A2A-ADK conversion ([87ffc55](https://github.com/google/adk-python/commit/87ffc55640dea1185cf67e6f9b78f70b30867bcc))
* New implementation of RemoteA2aAgent and A2A-ADK conversion ([6770e41](https://github.com/google/adk-python/commit/6770e419f5e200f4c7ad26587e1f769693ef4da0))
### Bug Fixes
* Allow artifact services to accept dictionary representations of types.Part ([b004da5](https://github.com/google/adk-python/commit/b004da50270475adc9e1d7afe4064ca1d10c560a)), closes [#2886](https://github.com/google/adk-python/issues/2886)
* Decode image data from ComputerUse tool response into image blobs ([d7cfd8f](https://github.com/google/adk-python/commit/d7cfd8fe4def2198c113ff1993ef39cd519908a1))
* Expand LiteLLM reasoning extraction to include 'reasoning' field ([9468487](https://github.com/google/adk-python/commit/94684874e436c2959cfc90ec346010a6f4fddc49)), closes [#3694](https://github.com/google/adk-python/issues/3694)
* Filter non-agent directories from list_agents() ([3b5937f](https://github.com/google/adk-python/commit/3b5937f022adf9286dc41e01e3618071a23eb992))
* Fix Type Error by initializing user_content as a Content object ([2addf6b](https://github.com/google/adk-python/commit/2addf6b9dacfe87344aeec0101df98d99c23bdb1))
* Handle length finish reason in LiteLLM responses ([4c6096b](https://github.com/google/adk-python/commit/4c6096baa1b0bed8533397287a5c11a0c4cb9101)), closes [#4482](https://github.com/google/adk-python/issues/4482)
* In SaveFilesAsArtifactsPlugin, write the artifact delta to state then event actions so that the plugin works with ADK Web UI's artifacts panel ([d6f31be](https://github.com/google/adk-python/commit/d6f31be554d9b7ee15fd9c95ae655b2265fb1f32))
* Make invocation_context optional in convert_event_to_a2a_message ([8e79a12](https://github.com/google/adk-python/commit/8e79a12d6bcde43cc33247b7ee6cc9e929fa6288))
* Optimize row-level locking in append_event ([d61846f](https://github.com/google/adk-python/commit/d61846f6c6dd5e357abb0e30eaf61fe27896ae6a)), closes [#4655](https://github.com/google/adk-python/issues/4655)
* Preserve thought_signature in FunctionCall conversions between GenAI and A2A ([f9c104f](https://github.com/google/adk-python/commit/f9c104faf73e2a002bb3092b50fb88f4eed78163))
* Prevent splitting of SSE events with artifactDelta for function resume requests ([6a929af](https://github.com/google/adk-python/commit/6a929af718fa77199d1eecc62b16c54beb1c8d84)), closes [#4487](https://github.com/google/adk-python/issues/4487)
* Propagate file names during A2A to/from Genai Part conversion ([f324fa2](https://github.com/google/adk-python/commit/f324fa2d62442301ebb2e7974eb97ea870471410))
* Propagate thought from A2A TextPart metadata to GenAI Part ([e59929e](https://github.com/google/adk-python/commit/e59929e11a56aaee7bb0c45cd4c9d9fef689548c))
* Re-export DEFAULT_SKILL_SYSTEM_INSTRUCTION to skills and skill/prompt.py to avoid breaking current users ([de4dee8](https://github.com/google/adk-python/commit/de4dee899cd777a01ba15906f8496a72e717ea98))
* Refactor type string update in Anthropic tool param conversion ([ab4b736](https://github.com/google/adk-python/commit/ab4b736807dabee65659486a68135d9f1530834c))
* **simulation:** handle NoneType generated_content ([9d15517](https://github.com/google/adk-python/commit/9d155177b956f690d4c99560f582e3e90e111f71))
* Store and retrieve EventCompaction via custom_metadata in Vertex AISessionService ([2e434ca](https://github.com/google/adk-python/commit/2e434ca7be765d45426fde9d52b131921bd9fa30)), closes [#3465](https://github.com/google/adk-python/issues/3465)
* Support before_tool_callback and after_tool_callback in Live mode ([c36a708](https://github.com/google/adk-python/commit/c36a708058163ade061cd3d2f9957231a505a62d)), closes [#4704](https://github.com/google/adk-python/issues/4704)
* temp-scoped state now visible to subsequent agents in same invocation ([2780ae2](https://github.com/google/adk-python/commit/2780ae2892adfbebc7580c843d2eaad29f86c335))
* **tools:** Handle JSON Schema boolean schemas in Gemini schema conversion ([3256a67](https://github.com/google/adk-python/commit/3256a679da3e0fb6f18b26057e87f5284680cb58))
* typo in A2A EXPERIMENTAL warning ([eb55eb7](https://github.com/google/adk-python/commit/eb55eb7e7f0fa647d762205225c333dcd8a08dd0))
* Update agent_engine_sandbox_code_executor in ADK ([dff4c44](https://github.com/google/adk-python/commit/dff4c4404051b711c8be437ba0ae26ca2763df7d))
* update Bigtable query tools to async functions ([72f3e7e](https://github.com/google/adk-python/commit/72f3e7e1e00d93c632883027bf6d31a9095cd6c2))
* Update expected UsageMetadataChunk in LiteLLM tests ([dd0851a](https://github.com/google/adk-python/commit/dd0851ac74d358bc030def5adf242d875ab18265)), closes [#4680](https://github.com/google/adk-python/issues/4680)
* update toolbox server and SDK package versions ([2e370ea](https://github.com/google/adk-python/commit/2e370ea688033f0663501171d0babfb0d74de4b2))
* Validate session before streaming instead of eagerly advancing the runner generator ([ebbc114](https://github.com/google/adk-python/commit/ebbc1147863956e85931f8d46abb0632e3d1cf67))
### Code Refactoring
* extract reusable functions from hitl and auth preprocessor ([c59afc2](https://github.com/google/adk-python/commit/c59afc21cbed27d1328872cdc2b0e182ab2ca6c8))
* Rename base classes and TypeVars in optimization data types ([9154ef5](https://github.com/google/adk-python/commit/9154ef59d29eb37538914e9967c4392cc2a24237))
## [1.26.0](https://github.com/google/adk-python/compare/v1.25.1...v1.26.0) (2026-02-26)
### Features
* **[Core]**
* Add intra-invocation compaction and token compaction pre-request ([485fcb8](https://github.com/google/adk-python/commit/485fcb84e3ca351f83416c012edcafcec479c1db))
* Use `--memory_service_uri` in ADK CLI run command ([a7b5097](https://github.com/google/adk-python/commit/a7b509763c1732f0363e90952bb4c2672572d542))
* **[Models]**
* Add `/chat/completions` integration to `ApigeeLlm` ([9c4c445](https://github.com/google/adk-python/commit/9c4c44536904f5cf3301a5abb910a5666344a8c5))
* Add `/chat/completions` streaming support to Apigee LLM ([121d277](https://github.com/google/adk-python/commit/121d27741684685c564e484704ae949c5f0807b1))
* Expand LiteLlm supported models and add registry tests ([d5332f4](https://github.com/google/adk-python/commit/d5332f44347f44d60360e14205a2342a0c990d66))
* **[Tools]**
* Add `load_skill_from_dir()` method ([9f7d5b3](https://github.com/google/adk-python/commit/9f7d5b3f1476234e552b783415527cc4bac55b39))
* Agent Skills spec compliance — validation, aliases, scripts, and auto-injection ([223d9a7](https://github.com/google/adk-python/commit/223d9a7ff52d8da702f1f436bd22e94ad78bd5da))
* BigQuery ADK support for search catalog tool ([bef3f11](https://github.com/google/adk-python/commit/bef3f117b4842ce62760328304484cd26a1ec30a))
* Make skill instruction optimizable and can adapt to user tasks ([21be6ad](https://github.com/google/adk-python/commit/21be6adcb86722a585b26f600c45c85e593b4ee0))
* Pass trace context in MCP tool call's `_meta` field with OpenTelemetry propagator ([bcbfeba](https://github.com/google/adk-python/commit/bcbfeba953d46fca731b11542a00103cef374e57))
* **[Evals]**
* Introduce User Personas to the ADK evaluation framework ([6a808c6](https://github.com/google/adk-python/commit/6a808c60b38ad7140ddeb222887c6accc63edce9))
* **[Services]**
* Add generate/create modes for Vertex AI Memory Bank writes ([811e50a](https://github.com/google/adk-python/commit/811e50a0cbb181d502b9837711431ef78fca3f34))
* Add support for memory consolidation via Vertex AI Memory Bank ([4a88804](https://github.com/google/adk-python/commit/4a88804ec7d17fb4031b238c362f27d240df0a13))
* **[A2A]**
* Add interceptor framework to `A2aAgentExecutor` ([87fcd77](https://github.com/google/adk-python/commit/87fcd77caa9672f219c12e5a0e2ff65cbbaaf6f3))
* **[Auth]**
* Add native support for `id_token` in OAuth2 credentials ([33f7d11](https://github.com/google/adk-python/commit/33f7d118b377b60f998c92944d2673679fddbc6e))
* Support ID token exchange in `ServiceAccountCredentialExchanger` ([7be90db](https://github.com/google/adk-python/commit/7be90db24b41f1830e39ca3d7e15bf4dbfa5a304)), closes [#4458](https://github.com/google/adk-python/issues/4458)
* **[Integrations]**
* Agent Registry in ADK ([abaa929](https://github.com/google/adk-python/commit/abaa92944c4cd43d206e2986d405d4ee07d45afe))
* Add schema auto-upgrade, tool provenance, HITL tracing, and span hierarchy fix to BigQuery Agent Analytics plugin ([4260ef0](https://github.com/google/adk-python/commit/4260ef0c7c37ecdfea295fb0e1a933bb0df78bea))
* Change default BigQuery table ID and update docstring ([7557a92](https://github.com/google/adk-python/commit/7557a929398ec2a1f946500d906cef5a4f86b5d1))
* Update Agent Registry to create AgentCard from info in get agents endpoint ([c33d614](https://github.com/google/adk-python/commit/c33d614004a47d1a74951dd13628fd2300aeb9ef))
* **[Web]**
* Enable dependency injection for agent loader in FastAPI app gen ([34da2d5](https://github.com/google/adk-python/commit/34da2d5b26e82f96f1951334fe974a0444843720))
### Bug Fixes
* Add OpenAI strict JSON schema enforcement in LiteLLM ([2dbd1f2](https://github.com/google/adk-python/commit/2dbd1f25bdb1d88a6873d824b81b3dd5243332a4)), closes [#4573](https://github.com/google/adk-python/issues/4573)
* Add push notification config store to agent_to_a2a ([4ca904f](https://github.com/google/adk-python/commit/4ca904f11113c4faa3e17bb4a9662dca1f936e2e)), closes [#4126](https://github.com/google/adk-python/issues/4126)
* Add support for injecting a custom google.genai.Client into Gemini models ([48105b4](https://github.com/google/adk-python/commit/48105b49c5ab8e4719a66e7219f731b2cd293b00)), closes [#2560](https://github.com/google/adk-python/issues/2560)
* Add support for injecting a custom google.genai.Client into Gemini models ([c615757](https://github.com/google/adk-python/commit/c615757ba12093ba4a2ba19bee3f498fef91584c)), closes [#2560](https://github.com/google/adk-python/issues/2560)
* Check both `input_stream` parameter name and its annotation to decide whether it's a streaming tool that accept input stream ([d56cb41](https://github.com/google/adk-python/commit/d56cb4142c5040b6e7d13beb09123b8a59341384))
* **deps:** Increase pydantic lower version to 2.7.0 ([dbd6420](https://github.com/google/adk-python/commit/dbd64207aebea8c5af19830a9a02d4c05d1d9469))
* edit copybara and BUILD config for new adk/integrations folder (added with Agent Registry) ([37d52b4](https://github.com/google/adk-python/commit/37d52b4caf6738437e62fe804103efe4bde363a1))
* Expand add_memory to accept MemoryEntry ([f27a9cf](https://github.com/google/adk-python/commit/f27a9cfb87caecb8d52967c50637ed5ad541cd07))
* Fix pickling lock errors in McpSessionManager ([4e2d615](https://github.com/google/adk-python/commit/4e2d6159ae3552954aaae295fef3e09118502898))
* fix typo in PlanReActPlanner instruction ([6d53d80](https://github.com/google/adk-python/commit/6d53d800d5f6dc5d4a3a75300e34d5a9b0f006f5))
* handle UnicodeDecodeError when loading skills in ADK ([3fbc27f](https://github.com/google/adk-python/commit/3fbc27fa4ddb58b2b69ee1bea1e3a7b2514bd725))
* Improve BigQuery Agent Analytics plugin reliability and code quality ([ea03487](https://github.com/google/adk-python/commit/ea034877ec15eef1be8f9a4be9fcd95446a3dc21))
* Include list of skills in every message and remove list_skills tool from system instruction ([4285f85](https://github.com/google/adk-python/commit/4285f852d54670390b19302ed38306bccc0a7cee))
* Invoke on_tool_error_callback for missing tools in live mode ([e6b601a](https://github.com/google/adk-python/commit/e6b601a2ab71b7e2df0240fd55550dca1eba8397))
* Keep query params embedded in OpenAPI paths when using httpx ([ffbcc0a](https://github.com/google/adk-python/commit/ffbcc0a626deb24fe38eab402b3d6ace484115df)), closes [#4555](https://github.com/google/adk-python/issues/4555)
* Only relay the LiveRequest after tools is invoked ([b53bc55](https://github.com/google/adk-python/commit/b53bc555cceaa11dc53b42c9ca1d650592fb4365))
* Parallelize tool resolution in LlmAgent.canonical_tools() ([7478bda](https://github.com/google/adk-python/commit/7478bdaa9817b0285b4119e8c739d7520373f719))
* race condition in table creation for `DatabaseSessionService` ([fbe9ecc](https://github.com/google/adk-python/commit/fbe9eccd05e628daa67059ba2e6a0d03966b240d))
* Re-export DEFAULT_SKILL_SYSTEM_INSTRUCTION to skills and skill/prompt.py to avoid breaking current users ([40ec134](https://github.com/google/adk-python/commit/40ec1343c2708e1cf0d39cd8b8a96f3729f843de))
* Refactor LiteLLM streaming response parsing for compatibility with LiteLLM 1.81+ ([e8019b1](https://github.com/google/adk-python/commit/e8019b1b1b0b43dcc5fa23075942b31db502ffdd)), closes [#4225](https://github.com/google/adk-python/issues/4225)
* remove duplicate session GET when using API server, unbreak auto_session_create when using API server ([445dc18](https://github.com/google/adk-python/commit/445dc189e915ce5198e822ad7fadd6bb0880a95e))
* Remove experimental decorators from user persona data models ([eccdf6d](https://github.com/google/adk-python/commit/eccdf6d01e70c37a1e5aa47c40d74469580365d2))
* Replace the global DEFAULT_USER_PERSONA_REGISTRY with a function call to get_default_persona_registry ([2703613](https://github.com/google/adk-python/commit/2703613572a38bf4f9e25569be2ee678dc91b5b5))
* **skill:** coloate default skill SI with skilltoolset ([fc1f1db](https://github.com/google/adk-python/commit/fc1f1db00562a79cd6c742cfd00f6267295c29a8))
* Update agent_engine_sandbox_code_executor in ADK ([ee8d956](https://github.com/google/adk-python/commit/ee8d956413473d1bbbb025a470ad882c1487d8b8))
* Update agent_engine_sandbox_code_executor in ADK ([dab80e4](https://github.com/google/adk-python/commit/dab80e4a8f3c5476f731335724bff5df3e6f3650))
* Update sample skills agent to use weather-skill instead of weather_skill ([8f54281](https://github.com/google/adk-python/commit/8f5428150d18ed732b66379c0acb806a9121c3cb))
* update Spanner query tools to async functions ([1dbcecc](https://github.com/google/adk-python/commit/1dbceccf36c28d693b0982b531a99877a3e75169))
* use correct msg_out/msg_err keys for Agent Engine sandbox output ([b1e33a9](https://github.com/google/adk-python/commit/b1e33a90b4ba716d717e0488b84892b8a7f42aac))
* Validate session before streaming instead of eagerly advancing the runner generator ([ab32f33](https://github.com/google/adk-python/commit/ab32f33e7418d452e65cf6f5b6cbfe1371600323))
* **web:** allow session resume without new message ([30b2ed3](https://github.com/google/adk-python/commit/30b2ed3ef8ee6d3633743c0db00533683d3342d8))
### Code Refactoring
* Extract reusable function for building agent transfer instructions ([e1e0d63](https://github.com/google/adk-python/commit/e1e0d6361675e7b9a2c9b2523e3a72e2e5e7ce05))
* Extract reusable private methods ([976a238](https://github.com/google/adk-python/commit/976a238544330528b4f9f4bea6c4e75ec13b33e1))
* Extract reusable private methods ([42eeaef](https://github.com/google/adk-python/commit/42eeaef2b34c860f126c79c552435458614255ad))
* Extract reusable private methods ([706f9fe](https://github.com/google/adk-python/commit/706f9fe74db0197e19790ca542d372ce46d0ae87))
### Documentation
* add `thinking_config` in `generate_content_config` in example agent ([c6b1c74](https://github.com/google/adk-python/commit/c6b1c74321faf62cc52d2518eb9ea0dcef050cde))
## [1.25.1](https://github.com/google/adk-python/compare/v1.25.0...v1.25.1) (2026-02-18)
### Bug Fixes
* Fix pickling lock errors in McpSessionManager ([4e2d615](https://github.com/google/adk-python/commit/4e2d6159ae3552954aaae295fef3e09118502898))
## [1.25.0](https://github.com/google/adk-python/compare/v1.24.1...v1.25.0) (2026-02-11)
### Features
* **[Core]**
* Add a demo for the simple prompt optimizer for the optimization interface ([0abf4cd](https://github.com/google/adk-python/commit/0abf4cd2c7103a071506c9398455a3bd66fe5da5))
* Add `--auto_create_session` flag to `adk api_server` CLI ([40c15d0](https://github.com/google/adk-python/commit/40c15d059599472b40f48272a464eb3cb7345fc6))
* Add `add_events_to_memory` facade for event-delta ([59e8897](https://github.com/google/adk-python/commit/59e88972ae4f10274444593db0607f40cfcc597e))
* Add post-invocation token-threshold compaction with event retention ([a88e864](https://github.com/google/adk-python/commit/a88e8647558a9b9d0bfdf38d2d8de058e3ba0596))
* Add report generation to `adk conformance test` command ([43c437e](https://github.com/google/adk-python/commit/43c437e38b9109b68a81de886d1901e4d8f87a01))
* **[Models]**
* Add base_url option to Gemini LLM class ([781f605](https://github.com/google/adk-python/commit/781f605a1e5de6d77b69d7e7b9835ec6fc8de4bf))
* **[Tools]**
* Enhance google credentials config to support externally passed access token ([3cf43e3](https://github.com/google/adk-python/commit/3cf43e3842d9987499ea70d6f63d6e1c4d4a07db))
* Update agent simulator by improving prompts and add environment data ([7af1858](https://github.com/google/adk-python/commit/7af1858f46b66fa4471c5ba7943385f2d23d08d3))
* Add a load MCP resource tool ([e25227d](https://github.com/google/adk-python/commit/e25227da5e91a8c1192af709f8e8bb2a471ded92))
* Add SkillToolset to adk ([8d02792](https://github.com/google/adk-python/commit/8d0279251ce4fad6f0c84bd7777eb5a74f7ba07a))
* **[Web]**
* Add `/health` and `/version` endpoints to ADK web server ([25ec2c6](https://github.com/google/adk-python/commit/25ec2c6b614cf8d185ff6dbdac5697a210be68da))
### Bug Fixes
* Use async iteration for VertexAiSessionService.list_sessions pagination ([758d337](https://github.com/google/adk-python/commit/758d337c76d877e3174c35f06551cc9beb1def06))
* Fix event loop closed bug in McpSessionManager ([4aa4751](https://github.com/google/adk-python/commit/4aa475145f196fb35fe97290dd9f928548bc737f))
* Preserve thought_signature in function call conversions for interactions API integration ([2010569](https://github.com/google/adk-python/commit/20105690100d9c2f69c061ac08be5e94c50dc39c))
* Propagate grounding and citation metadata in streaming responses ([e6da417](https://github.com/google/adk-python/commit/e6da4172924ecc36ffc2535199c450a2a51c7bcc))
* Add endpoints to get/list artifact version metadata ([e0b9712](https://github.com/google/adk-python/commit/e0b9712a492bf84ac17679095b333642a79b8ee6))
* Support escaped curly braces in instruction templates ([7c7d25a](https://github.com/google/adk-python/commit/7c7d25a4a6e4389e23037e70b8efdcd5341f44ea))
* Strip timezone for PostgreSQL timestamps in DatabaseSessionService ([19b6076](https://github.com/google/adk-python/commit/19b607684f15ce2b6ffd60382211ba5600705743))
* Prompt token may be None in streaming mode ([32ee07d](https://github.com/google/adk-python/commit/32ee07df01f10dbee0e98ca9d412440a7fe9163d))
* Pass invocation_id from `/run` endpoint to `Runner.run_async` ([d2dba27](https://github.com/google/adk-python/commit/d2dba27134f833e5d929fdf363ada9364cc852f9))
* Conditionally preserve function call IDs in LLM requests ([663cb75](https://github.com/google/adk-python/commit/663cb75b3288d8d0649412e1009329502b21cbbc))
* Migrate VertexAiMemoryBankService to use the async Vertex AI client ([64a44c2](https://github.com/google/adk-python/commit/64a44c28974de77cf8934f9c3d1bc03691b90e7b))
* Handle list values in Gemini schema sanitization ([fd8a9e3](https://github.com/google/adk-python/commit/fd8a9e3962cca4f422beb7316cbe732edf726d51))
* Used logger to log instead of print in MCP ([6bc70a6](https://github.com/google/adk-python/commit/6bc70a6bab79b679a4b18ad146b3450fb9014475))
### Improvements
* Replace check of instance for LlmAgent with hasAttribute check ([7110336](https://github.com/google/adk-python/commit/7110336788662abb8c9bbbb0a53a50cc09130d5e))
* Log exception details before re-raising in MCP session execution ([de79bf1](https://github.com/google/adk-python/commit/de79bf12b564a4eefc7e6a2568dbe0f08bb6efeb))
## [1.24.1](https://github.com/google/adk-python/compare/v1.24.0...v1.24.1) (2026-02-06)
### Bug Fixes
* Add back deprecated eval endpoint for web until we migrate([ae993e8](https://github.com/google/adk-python/commit/ae993e884f44db276a4116ebb7a11a2fb586dbfe))
* Update eval dialog colors, and fix a2ui component types ([3686a3a](https://github.com/google/adk-python/commit/3686a3a98f46738549cd7a999f3773b7a6fd1182))
## [1.24.0](https://github.com/google/adk-python/compare/v1.23.0...v1.24.0) (2026-02-04)
### ⚠ BREAKING CHANGES
* Breaking: Make credential manager accept `tool_context` instead of `callback_context` ([fe82f3c](https://github.com/google/adk-python/commit/fe82f3cde854e49be13d90b4c02d786d82f8a202))
### Highlights
* **[Web]**
* **Consolidated Event View**: Replaced the Event tab with a more intuitive "click-to-expand" interaction on message rows, enabling faster debugging within the chat context
* **Enhanced Accessibility**: Added full support for arrow-key navigation for a more seamless, keyboard-centric experience
* **Rich Developer Tooling**: Introduced detailed tooltips for function calls, providing instant visibility into arguments, responses, and state changes
* **A2UI Integration**: Integrated the **A2UI v0.8** standard catalog to automatically render spec-compliant ADK parts as native UI components directly in the chat
### Features
* **[Core]**
* Allow passthrough of `GOOGLE_CLOUD_LOCATION` for Agent Engine deployments ([004e15c](https://github.com/google/adk-python/commit/004e15ccb7c7f683623f8e7d2e77a9d12558c545))
* Add interface for agent optimizers ([4ee125a](https://github.com/google/adk-python/commit/4ee125a03856fdb9ed28245bf7f5917c2d9038db))
* Pass event ID as metadata when converted into a message ([85434e2](https://github.com/google/adk-python/commit/85434e293f7bd1e3711f190f84d5a36804e4462b))
* Restructure the bug report template as per the intake process ([324796b](https://github.com/google/adk-python/commit/324796b4fe05bec3379bfef67071a29552ef355a))
* **[Models]**
* Mark Vertex calls made from non-Gemini models ([7d58e0d](https://github.com/google/adk-python/commit/7d58e0d2f375bc80bdfac9cffea2926fd2344b8a))
* **[Evals]**
* Allow Vertex AI Client initialization with API Key ([43d6075](https://github.com/google/adk-python/commit/43d6075ea7aa49ddb358732f2219ca9598dd286f))
* Remove overall evaluation status calculation from `_CustomMetricEvaluator` and add threshold to custom metric function expected signature ([553e376](https://github.com/google/adk-python/commit/553e376718ceb3d7fb1403231bb720836d71f42c))
* **[Tools]**
* Make OpenAPI tool asynchronous ([9290b96](https://github.com/google/adk-python/commit/9290b966267dc02569786f95aab2a3cb78c7004f))
* Implement toolset authentication for `McpToolset`, `OpenAPIToolset`, and other toolsets ([798f65d](https://github.com/google/adk-python/commit/798f65df86b1bbe33d864e30c5b1f9e155e89810))
* Add framework support for toolset authentication before `get_tools` calls ([ee873ca](https://github.com/google/adk-python/commit/ee873cae2e2df960910d264a4340ce6c0489eb7a))
* Support dynamic configuration for `VertexAiSearchTool` ([585ebfd](https://github.com/google/adk-python/commit/585ebfdac7f1b8007b4e4a7e4258ec5de72c78b1))
* Add `get_auth_config` method to toolset to expose authentication requirements ([381d44c](https://github.com/google/adk-python/commit/381d44cab437cac027af181ae627e7b260b7561e))
* Add methods in `McpToolset` for users to access MCP resources ([8f7d965](https://github.com/google/adk-python/commit/8f7d9659cfc19034af29952fbca765d012169b38))
* Improve error message when failing to get tools from MCP ([3480b3b](https://github.com/google/adk-python/commit/3480b3b82d89de69f77637d7ad034827434df45a))
* **[Services]**
* Improve `asyncio` loop handling and test cleanup ([00aba2d](https://github.com/google/adk-python/commit/00aba2d884d24fb5244d1de84f8dba9cbc3c07e8))
* **[Live]**
* Support running tools in separate threads for live mode ([714c3ad](https://github.com/google/adk-python/commit/714c3ad0477e775fba6696a919a366a293197268))
* **[Observability]**
* Add extra attributes to spans generated with `opentelemetry-instrumentation-google-genai` ([e87a843](https://github.com/google/adk-python/commit/e87a8437fb430e0d4c42c73948e3ba1872040a15))
### Bug Fixes
* Ignore `session_db_kwargs` for SQLite session services ([ce07cd8](https://github.com/google/adk-python/commit/ce07cd8144c8498434f68e61ebeb519bf329f778))
* Resolve `MutualTLSChannelError` by adding `pyopenssl` dependency ([125bc85](https://github.com/google/adk-python/commit/125bc85ac5e1400bc38f7c681f76fa82626c9911))
* Add `update_timestamp_tz` property to `StorageSession` ([666cebe](https://github.com/google/adk-python/commit/666cebe3693d2981fd5fea6e9e4c65e56dcd3f2b))
* Do not treat Function Calls and Function Responses as invisible when marked as thoughts ([853a3b0](https://github.com/google/adk-python/commit/853a3b0e143ce27516f0de51e0e0df2af6ecf465))
* Add pre-deployment validation for agent module imports (credit to @ppgranger, [2ac468e](https://github.com/google/adk-python/commit/2ac468ea7e30ef30c1324ffc86f67dbf32ab7ede))
* Fix cases where `execution_result_delimiters` have `None` type element ([a16e3cc](https://github.com/google/adk-python/commit/a16e3cc67e1cb391228ba78662547672404ae550))
* Disable `save_input_blobs_as_artifacts` deprecation warning message for users not setting it ([c34615e](https://github.com/google/adk-python/commit/c34615ecf3c7bbe0f4275f72543774f258c565b4))
* Fix agent config path handling in generated deployment script ([8012339](https://github.com/google/adk-python/commit/801233902bbd6c0cca63b6fc8c1b0b2531f3f11e))
* Add `pypika>=0.50.0` to `project.toml` to support `crewai` on Python 3.12+ ([e8f7aa3](https://github.com/google/adk-python/commit/e8f7aa3140d2585ac38ebfe31c5b650383499a20))
* Update OpenTelemetry dependency versions to relax version constraints for `opentelemetry-api` and `opentelemetry-sdk` ([706a6dd](https://github.com/google/adk-python/commit/706a6dda8144da147bd9fa42ef85bbfa58fec5d3))
* Enable `pool_pre_ping` by default for non-SQLite database engines ([da73e71](https://github.com/google/adk-python/commit/da73e718efa9557ed33e2fb579de68fcbcf4c7f0))
* Ensure database sessions are always rolled back on errors ([63a8eba](https://github.com/google/adk-python/commit/63a8eba53f2cb07625eb7cd111ff767e8e0030fa))
* Reload stale session in `DatabaseSessionService` when storage update time is later than the in-memory session object ([1063fa5](https://github.com/google/adk-python/commit/1063fa532cad59d8e9f7421ce2f523724d49d541))
* Make credential key generation stable and prevent cross-user credential leaks ([33012e6](https://github.com/google/adk-python/commit/33012e6dda9ef20c7a1dae66a84717de5d782097))
* Change MCP `read_resource` to return original contents ([ecce7e5](https://github.com/google/adk-python/commit/ecce7e54a688a915a1b9d742c39e4684186729be))
* Recognize function responses as non-empty parts in LiteLLM ([d0102ec](https://github.com/google/adk-python/commit/d0102ecea331e062190dbb7578a4ef7f4044306e))
* Handle HTTP/HTTPS URLs for media files in LiteLLM content conversion ([47221cd](https://github.com/google/adk-python/commit/47221cd5c1e778cd4b92ed8d382c639435f5728c))
* Fix Pydantic schema generation error for `ClientSession` ([131fbd3](https://github.com/google/adk-python/commit/131fbd39482980572487a30fea13236d2badd543))
* Fix Click’s Wrapping in `adk eval` help message ([3bcd8f7](https://github.com/google/adk-python/commit/3bcd8f7f7a0683f838005bc209f7d39dc93f850b))
* Stream errors as simple JSON objects in ADK web server SSE endpoint ([798d005](https://github.com/google/adk-python/commit/798d0053c832e7ed52e2e104f8a14f789ba8b17f))
* Remove print debugging artifact ([0d38a36](https://github.com/google/adk-python/commit/0d38a3683f13bc12dc5d181164b6cd5d72fc260c))
### Improvements
* Check `will_continue` for streaming function calls ([2220d88](https://github.com/google/adk-python/commit/2220d885cda875144b52338b5becf6e5546f3f51))
* Update ADK web, rework events, and add A2UI capabilities ([37e6507](https://github.com/google/adk-python/commit/37e6507ce4d8750100d914eb1a62014350ef1795))
* Improve error handling for LiteLLM import in `gemma_llm.py` ([574ec43](https://github.com/google/adk-python/commit/574ec43a175e3bf3a05e73114e8db7196fae7040))
* Replace proxy methods with utils implementation ([6ff10b2](https://github.com/google/adk-python/commit/6ff10b23be01c1f7dd79d13ac8c679c079140f76), [f82ceb0](https://github.com/google/adk-python/commit/f82ceb0ce75d3efed7c046835ddac76c28210013))
* Replace print statements with logging in ADK evaluation components ([dd8cd27](https://github.com/google/adk-python/commit/dd8cd27b2ce505ecca50cdfbb1469db01c82b0af))
* Add sample agent that requires OAuth flow during MCP tool listing, and convert `MCPToolset` to `McpToolset` in unit tests ([2770012](https://github.com/google/adk-python/commit/2770012cecdfc71628a818a75b21faabe828b4e5), [4341839](https://github.com/google/adk-python/commit/43418394202c2d01b0d37f6424bd601148077e27))
* Ensure `BigQueryAgentAnalyticsPlugin` is shut down after each test ([c0c98d9](https://github.com/google/adk-python/commit/c0c98d94b3161d6bf9fff731e0abfc985b53e653))
* Add ADK logger in `RestApiTool` ([288c2c4](https://github.com/google/adk-python/commit/288c2c448d77c574dafadf7851a49e6ff59fa7f4))
* Add GitHub Action check to run `mypy` ([32f9f92](https://github.com/google/adk-python/commit/32f9f92042ab530220ac9d159045c91d311affa7))
* Add `unittests.sh` script and update `CONTRIBUTING.md` ([025b42c](https://github.com/google/adk-python/commit/025b42c8361ad2078593e3e7fc5301df88a532c7))
* Extract helper function for LLM request building and response processing ([753084f](https://github.com/google/adk-python/commit/753084fd46c9637488f33b0a05b4d270f6e03a39))
## [1.23.0](https://github.com/google/adk-python/compare/v1.22.1...v1.23.0) (2026-01-22)
### ⚠ BREAKING CHANGES
* Breaking: Use OpenTelemetry for BigQuery plugin tracing, replacing custom `ContextVar` implementation ([ab89d12](https://github.com/google/adk-python/commit/ab89d1283430041afb303834749869e9ee331721))
### Features
* **[Core]**
* Add support to automatically create a session if one does not exist ([8e69a58](https://github.com/google/adk-python/commit/8e69a58df4eadeccbb100b7264bb518a46b61fd7))
* Remove `@experimental` decorator from `AgentEngineSandboxCodeExecutor` ([135f763](https://github.com/google/adk-python/commit/135f7633253f6a415302142abc3579b664601d5b))
* Add `--disable_features` CLI option to override default feature enable state ([53b67ce](https://github.com/google/adk-python/commit/53b67ce6340f3f3f8c3d732f9f7811e445c76359))
* Add `otel_to_cloud` flag to `adk deploy agent_engine` command ([21f63f6](https://github.com/google/adk-python/commit/21f63f66ee424501d9a70806277463ef718ae843))
* Add `is_computer_use` field to agent information in `adk-web` server ([5923da7](https://github.com/google/adk-python/commit/5923da786eb1aaef6f0bcbc6adc906cbc8bf9b36))
* Allow `thinking_config` in `generate_content_config` ([e162bb8](https://github.com/google/adk-python/commit/e162bb8832a806e2380048e39165bf837455f88c))
* Convert A2UI messages between A2A `DataPart` metadata and ADK events ([1133ce2](https://github.com/google/adk-python/commit/1133ce219c5a7a9a85222b03e348ba6b13830c8f))
* Add `--enable_features` CLI option to override default feature enable state ([79fcddb](https://github.com/google/adk-python/commit/79fcddb39f71a4c1342e63b4d67832b3eccb2652))
* **[Tools]**
* Add flush mechanism to `BigQueryAgentAnalyticsPlugin` to ensure pending log events are written to BigQuery ([9579bea](https://github.com/google/adk-python/commit/9579bea05d946b3d8b4bfec35e510725dd371224))
* Allow Google Search tool to set a different model ([b57a3d4](https://github.com/google/adk-python/commit/b57a3d43e4656f5a3c5db53addff02b67d1fde26))
* Support authentication for MCP tool listing ([e3d542a](https://github.com/google/adk-python/commit/e3d542a5ba3d357407f8cd29cfdd722f583c8564) [19315fe](https://github.com/google/adk-python/commit/19315fe557039fa8bf446525a4830b1c9f40cba9))
* Use JSON schema for `base_retrieval_tool`, `load_artifacts_tool`, and `load_memory_tool` declarations when the feature is enabled ([69ad605](https://github.com/google/adk-python/commit/69ad605bc4bbe9a4f018127fd3625169ee70488e))
* Use JSON schema for `IntegrationConnectorTool` declaration when the feature is enabled ([2ed6865](https://github.com/google/adk-python/commit/2ed686527ac75ff64128ce7d9b1a3befc2b37c64))
* Start and close `ClientSession` in a single task in `McpSessionManager` ([cce430d](https://github.com/google/adk-python/commit/cce430da799766686e65f6cae02ba64e916d5c8a))
* Use JSON schema for `RestApiTool` declaration when the feature is enabled ([a5f0d33](https://github.com/google/adk-python/commit/a5f0d333d7f26f2966ed511d5d9def7a1933f0c2))
* **[Evals]**
* Update `adk eval` CLI to consume custom metrics by adding `CustomMetricEvaluator` ([ea0934b](https://github.com/google/adk-python/commit/ea0934b9934c1fefd129a1026d6af369f126870e))
* Update `EvalConfig` and `EvalMetric` data models to support custom metrics ([6d2f33a](https://github.com/google/adk-python/commit/6d2f33a59cfba358dd758378290125fc2701c411))
* **[Observability]**
* Add minimal `generate_content {model.name}` spans and logs for non-Gemini inference and when `opentelemetry-inference-google-genai` dependency is missing ([935c279](https://github.com/google/adk-python/commit/935c279f8281bde99224f03d936b8abe51cbabfc))
* **[Integrations]**
* Enhance `TraceManager` asynchronous safety, enrich BigQuery plugin logging, and fix serialization ([a4116a6](https://github.com/google/adk-python/commit/a4116a6cbfadc161982af5dabd55a711d79348b7))
* **[Live]**
* Persist user input content to session in live mode ([a04828d](https://github.com/google/adk-python/commit/a04828dd8a848482acbd48acc7da432d0d2cb0aa))
### Bug Fixes
* Recursively extract input/output schema for AgentTool ([bf2b56d](https://github.com/google/adk-python/commit/bf2b56de6d0052e40b6d871b2d22c56e9225e145))
* Yield buffered `function_call` and `function_response` events during live streaming ([7b25b8f](https://github.com/google/adk-python/commit/7b25b8fb1daf54d7694bf405d545d46d2c012d2b))
* Update `authlib` and `mcp` dependency versions ([7955177](https://github.com/google/adk-python/commit/7955177fb28b8e5dc19aae8be94015a7b5d9882a))
* Set `LITELLM_MODE` to `PRODUCTION` before importing LiteLLM to prevent implicit `.env` file loading ([215c2f5](https://github.com/google/adk-python/commit/215c2f506e21a3d8c39551b80f6356943ecae320))
* Redact sensitive information from URIs in logs ([5257869](https://github.com/google/adk-python/commit/5257869d91a77ebd1381538a85e7fdc3a600da90))
* Handle asynchronous driver URLs in the migration tool ([4b29d15](https://github.com/google/adk-python/commit/4b29d15b3e5df65f3503daffa6bc7af85159507b))
* Remove custom metadata from A2A response events ([81eaeb5](https://github.com/google/adk-python/commit/81eaeb5eba6d40cde0cf6147d96921ed1bf7bb31))
* Handle `None` inferences in eval results ([7d4326c](https://github.com/google/adk-python/commit/7d4326c3606a7ff2ba3c0fdef08d4f6af52ee71e))
* Mark all parts of a thought event as thought ([f92d4e3](https://github.com/google/adk-python/commit/f92d4e397f37445fe9032a95ce26646a3a69300b))
* Use `json.dumps` for error messages in SSE events ([6ad18cc](https://github.com/google/adk-python/commit/6ad18cc2fc3a3315a0fc240cb51b3283b53116b4))
* Use the correct path for config-based agents when deploying to AgentEngine ([83d7bb6](https://github.com/google/adk-python/commit/83d7bb6ef0d952ad04c5d9a61aaf202672c7e17d))
* Support Generator and Async Generator tool declarations in JSON schema ([19555e7](https://github.com/google/adk-python/commit/19555e7dce6d60c3b960ca0bc2f928c138ac3cc0) [7c28297](https://github.com/google/adk-python/commit/7c282973ea193841fee79f90b8a91c5e02627ccc))
* Prevent stopping event processing on events with `None` content ([ed2c3eb](https://github.com/google/adk-python/commit/ed2c3ebde9cafbb5e2bf375f44db1e77cee9fb24))
* Fix `'NoneType'` object is not iterable error ([7db3ce9](https://github.com/google/adk-python/commit/7db3ce9613b1c2c97e6ca3cd8115736516dc1556))
* Use canonical tools to find streaming tools and register them by `tool.name` ([ec6abf4](https://github.com/google/adk-python/commit/ec6abf401019c39e8e1a8d1b2c7d5cf5e8c7ac56))
* Initialize `self._auth_config` inside `BaseAuthenticatedTool` to access authentication headers in `McpTool` ([d4da1bb](https://github.com/google/adk-python/commit/d4da1bb7330cdb87c1dcbe0b9023148357a6bd07))
* Only filter out audio content when sending history ([712b5a3](https://github.com/google/adk-python/commit/712b5a393d44e7b5ce35fc459da98361bae4bb16))
* Add finish reason mapping and remove custom file URI handling in LiteLLM ([89bed43](https://github.com/google/adk-python/commit/89bed43f5e0c5ad12dd31c716d372145b7e33e78))
* Convert unsupported inline artifact MIME types to text in `LoadArtifactsTool` ([fdc98d5](https://github.com/google/adk-python/commit/fdc98d5c927bfef021e87cf72103892e4c2ac12a))
* Pass `log_level` to `uvicorn` in `web` and `api_server` commands ([38d52b2](https://github.com/google/adk-python/commit/38d52b247600fb45a2beeb041c4698e90c00d705))
* Use the agent name as the author of the audio event ([ab62b1b](https://github.com/google/adk-python/commit/ab62b1bffd7ad2df5809d430ad1823872b8bd67a))
* Handle `NOT_FOUND` error when fetching Vertex AI sessions ([75231a3](https://github.com/google/adk-python/commit/75231a30f1857d930804769caf88bcc20839dd08))
* Fix `httpx` client closure during event pagination ([b725045](https://github.com/google/adk-python/commit/b725045e5a1192bc9fd5190cbd2758ab6ff02590))
### Improvements
* Add new conversational analytics API toolset ([82fa10b](https://github.com/google/adk-python/commit/82fa10b71e037b565cb407c82e9e908432dab0ff))
* Filter out `adk_request_input` event from content list ([295b345](https://github.com/google/adk-python/commit/295b34558774d1f64022009980e3edd8eb79527b))
* Always skip executing partial function calls ([d62f9c8](https://github.com/google/adk-python/commit/d62f9c896c301aba3a781e868735e16f946a8862))
* Update comments of request confirmation preprocessor ([1699b09](https://github.com/google/adk-python/commit/1699b090edc9e5b13c34f461c8e664187157c5c0))
* Fix various typos ([a8f2ddd](https://github.com/google/adk-python/commit/a8f2ddd943301bbf53f49b3a23300ece45803cc0))
* Update sample live streaming tools agent to use latest live models ([3dd7e3f](https://github.com/google/adk-python/commit/3dd7e3f1b9be05c28adb061864d84c4202a2d922))
* Make the regex to catch CLI reference strict by adding word boundary anchor ([c222a45](https://github.com/google/adk-python/commit/c222a45ef74f7b55c48dc151ba98cd8c30a15c57))
* Migrate `ToolboxToolset` to use `toolbox-adk` and align validation ([7dc6adf](https://github.com/google/adk-python/commit/7dc6adf4e563330a09e4cf28d2b1994c24b007d1) [277084e](https://github.com/google/adk-python/commit/277084e31368302e6338b69d456affd35d5fedfe))
* Always log API backend when connecting to live model ([7b035aa](https://github.com/google/adk-python/commit/7b035aa9fc43a43489aeffea8f877cd7eaa09f35))
* Add a sample BigQuery agent using BigQuery MCP tools ([672b57f](https://github.com/google/adk-python/commit/672b57f1b76580023d1f348de76227291a9c1012))
* Add a `DebugLoggingPlugin` to record human-readable debugging logs ([8973618](https://github.com/google/adk-python/commit/8973618b0b0e90c513873e22af272c147efb4904))
* Upgrade the sample BigQuery agent model version to `gemini-2.5-flash` ([fd2c0f5](https://github.com/google/adk-python/commit/fd2c0f556b786417a9f6add744827b07e7a06b7d))
* Import `migration_runner` lazily within the migrate command ([905604f](https://github.com/google/adk-python/commit/905604faac82aca8ae0935eebea288f82985e9c5))
## [1.22.1](https://github.com/google/adk-python/compare/v1.22.0...v1.22.1) (2026-01-09)
### Bug Fixes
* Add back `adk migrate session` CLI ([8fb2be2](https://github.com/google/adk-python/commit/8fb2be216f11dabe7fa361a0402e5e6316878ad8)).
* Escape database reserved keyword ([94d48fc](https://github.com/google/adk-python/commit/94d48fce32a1f07cef967d50e82f2b1975b4abd9)).
## [1.22.0](https://github.com/google/adk-python/compare/v1.21.0...v1.22.0) (2026-01-08)
### Features
* **[Core]**
* Make `LlmAgent.model` optional with a default fallback ([b287215](https://github.com/google/adk-python/commit/b28721508a41bf6bcfef52bbc042fb6193a32dfa)).
* Support regex for allowed origins ([2ea6e51](https://github.com/google/adk-python/commit/2ea6e513cff61d3f330274725c66f82fce4ba259)).
* Enable PROGRESSIVE_SSE_STREAMING feature by default ([0b1cff2](https://github.com/google/adk-python/commit/0b1cff2976d1c04acf3863f76107b05d1cec448f)).
* **[Evals]**
* Add custom instructions support to LlmBackedUserSimulator ([a364388](https://github.com/google/adk-python/commit/a364388d9744969760fd87ed24d60793146c162a)).
* Introduce a post-hoc, per-turn evaluator for user simulations ([e515e0f](https://github.com/google/adk-python/commit/e515e0f321a259016c5e5f6b388ecf02ae343ba7)).
* **[Tools]**
* Expose mcps streamable http custom httpx factory parameter ([bfed19c](https://github.com/google/adk-python/commit/bfed19cd78298fc9f896da8ed82a756004e92094)).
* Add a handwritten tool for Cloud Pub/Sub ([b6f6dcb](https://github.com/google/adk-python/commit/b6f6dcbeb465a775b9c38ace7a324ee2155d366f)).
* Add `token_endpoint_auth_method` support to OAuth2 credentials ([8782a69](https://github.com/google/adk-python/commit/8782a695036aa0c1528027673868159143f925f0)).
* **[Services]**
* Introduce new JSON-based database schema for DatabaseSessionService, which will be used for newly-created databases. A migration command and script are provided.([7e6ef71](https://github.com/google/adk-python/commit/7e6ef71eec8be2e804286cc4140d0cbdf84f1206) [ba91fea](https://github.com/google/adk-python/commit/ba91fea54136ab60f37c10b899c3648d0b0fa721) [ce64787](https://github.com/google/adk-python/commit/ce64787c3e1130d1678e408aa31011fc88590e15)).
* Set log level when deploying to Agent Engine ([1f546df](https://github.com/google/adk-python/commit/1f546df35a1c18aeb3d2fc7a2ac66edf386027c5)).
* **[A2A]**
* Update event_converter used in A2ARemote agent to use a2a_task.status.message only if parts are non-empty ([e4ee9d7](https://github.com/google/adk-python/commit/e4ee9d7c46b57eed8493539d8f539c042bdfae60)).
### Bug Fixes
* Add checks for event content and parts before accessing ([5912835](https://github.com/google/adk-python/commit/5912835c975673c8fc2fb315150f5ec29d685eac)).
* Validate app name in `adk create` command ([742c926](https://github.com/google/adk-python/commit/742c9265a260a9c598a1f65e0996d926b4b9c022)).
* Prevent .env files from overriding existing environment variables ([0827d12](https://github.com/google/adk-python/commit/0827d12ccd74feb24758f64f2884c9493001b4ca)).
* Prevent ContextFilterPlugin from creating orphaned function responses ([e32f017](https://github.com/google/adk-python/commit/e32f017979e26a94b998311cafcde753fd29e44e)).
* Update empty event check to include executable code and execution results ([688f48f](https://github.com/google/adk-python/commit/688f48fffb9df6ef18a692cd2ccaa7628f4c82a7)).
* Make the BigQuery analytics plugin work with agents that don't have instructions such as the LoopAgent ([8bed01c](https://github.com/google/adk-python/commit/8bed01cbdc5961c0d219fd6389f492f1a4235de5)).
* Label response as thought if task is immediately returned as working ([4f3b733](https://github.com/google/adk-python/commit/4f3b733074c867e68ca5d38720ccb1f3e0b0d960)).
* Move and enhance the deprecation warning for the plugins argument in "_validate_runner_params" to the beginning of the function ([43270bc](https://github.com/google/adk-python/commit/43270bcb6197526ba5765f83d7e4fb88f213b8d3)).
* Oauth refresh not triggered on token expiry ([69997cd](https://github.com/google/adk-python/commit/69997cd5ef44ee881a974bb36dc100e17ed6de2e)).
* Fix double JSON encoding when saving eval set results ([fc4e3d6](https://github.com/google/adk-python/commit/fc4e3d6f607032259e68e91bcb1ad0815a03164e)).
* Allow string values for ToolTrajectoryCriterion.match_type ([93d6e4c](https://github.com/google/adk-python/commit/93d6e4c888d5a2181e3c22da049d8be0d6ead70c)).
* Fix inconsistent method signatures for evaluate_invocations ([0918b64](https://github.com/google/adk-python/commit/0918b647df6f88b95974d486a3161121a6514901)).
* Honor the modalities parameter in adk api server for live API ([19de45b](https://github.com/google/adk-python/commit/19de45b3250d09b9ec16c45788e7d472b3e588c2)).
* Filter out thought parts in lite_llm._get_content ([1ace8fc](https://github.com/google/adk-python/commit/1ace8fc6780bc25e2ef4222c73bc2558082b0a00)).
* Rehydration of EventActions in StorageEvent.to_event ([838530e](https://github.com/google/adk-python/commit/838530ebe053e5193d4329c5a203ca3d096ff7be)).
* Heal missing tool results before LiteLLM requests ([6b7386b](https://github.com/google/adk-python/commit/6b7386b7620bbc51cda8c1c6d9914549536640e6)).
* Refine Ollama content flattening and provider checks ([c6f389d](https://github.com/google/adk-python/commit/c6f389d4bc4d2b91795003a3bd87ed1f1b854493)).
* Add MIME type inference and default for file URIs in LiteLLM ([5c4bae7](https://github.com/google/adk-python/commit/5c4bae7ff2085c05b7f002f5fa368e9b48a752b1)).
* Use mode='json' in model_dump to serialize bytes correctly when using telemetry ([96c5db5](https://github.com/google/adk-python/commit/96c5db5a07f7f851751ccd68f176dad1634885cb)).
* Avoid local .adk storage in Cloud Run/GKE ([b30c2f4](https://github.com/google/adk-python/commit/b30c2f4e139e0d4410c5f8dd61acee2056ad06ea)).
* Remove fallback to cached exchanged credential in _load_existing_credential ([1ae0e16](https://github.com/google/adk-python/commit/1ae0e16b2c1a3139b9c2b1c4a3e725833a6240be)).
* Handle overriding of requirements when deploying to agent engine ([38a30a4](https://github.com/google/adk-python/commit/38a30a44d222fade8616f9d63410b1c2b6f84e1b)).
* Built-in agents (names starting with "__") now use in-memory session storage instead of creating .adk folders in the agents directory ([e3bac1a](https://github.com/google/adk-python/commit/e3bac1ab8c724454fb433cc7e78416b61efe33ee)).
* Change error_message column type to TEXT in DatabaseSessionService ([8335f35](https://github.com/google/adk-python/commit/8335f35015c7d4349bc4ac47dedbe99663b78e62)).
* Add schema type sanitization to OpenAPI spec parser ([6dce7f8](https://github.com/google/adk-python/commit/6dce7f8a8f28de275b1119fc03219f1468bb883b)).
* Prevent retry_on_errors from retrying asyncio.CancelledError ([30d3411](https://github.com/google/adk-python/commit/30d3411d603f12ca5bcdd2d71773d087f3191dba)).
* Include back-ticks around the BQ asset names in the tools examples ([8789ad8](https://github.com/google/adk-python/commit/8789ad8f16dfa250fab607946250a2857a25d5ef)).
* Fix issue with MCP tools throwing an error ([26e77e1](https://github.com/google/adk-python/commit/26e77e16947aed1abcfdd7f526532a708f1f073b)).
* Exclude thought parts when merging agent output ([07bb164](https://github.com/google/adk-python/commit/07bb1647588a781e701257c4c379736537029ea0)).
* Prepend "https://" to the MCP server url only if it doesn't already have a scheme ([71b3289](https://github.com/google/adk-python/commit/71b32890f5ab279e2bed1fd28c0f4693cba3f45e)).
* Split SSE events with both content and artifactDelta in ADK Web Server ([084fcfa](https://github.com/google/adk-python/commit/084fcfaba52c4a6075397221dbe7aba2f2acd2d7)).
* Propagate RunConfig custom metadata to all events ([e3db2d0](https://github.com/google/adk-python/commit/e3db2d0d8301748c63bad826f24692448dbd1c2c)).
* Harden YAML builder tmp save/cleanup([6f259f0](https://github.com/google/adk-python/commit/6f259f08b3c45ad6050b8a93c9bd85913451ece6)).
* Ignore adk-bot administrative actions in stale agent ([3ec7ae3](https://github.com/google/adk-python/commit/3ec7ae3b8d532ed4b60786201a78e980dfc56cf3)).
* Only prepend "https://" to the MCP server url if it doesn't already have a scheme ([71b3289](https://github.com/google/adk-python/commit/71b32890f5ab279e2bed1fd28c0f4693cba3f45e)).
* Check all content parts for emptiness in _contains_empty_content ([f35d129](https://github.com/google/adk-python/commit/f35d129b4c59d381e95418725d6eaa072ca7720a)).
### Improvements
* Remove unnecessary event loop creation in LiveRequstQueue constructor ([ecc9f18](https://github.com/google/adk-python/commit/ecc9f182e3bd25ee8eda8920d665e967517ca59a)).
* Close database engines to avoid aiosqlite pytest hangs ([4ddb2cb](https://github.com/google/adk-python/commit/4ddb2cb2a8d1d026a43418b2dd698e6ea199594e)).
* Add `override_feature_enabled` to override the default feature enable states ([a088506](https://github.com/google/adk-python/commit/a0885064b0cbef3b25484025da0748dc64320d4a)).
* Move SQLite migration script to migration/ folder ([e8ab7da](https://github.com/google/adk-python/commit/e8ab7dafa96d5890a4fff919b9fa180993ef5830)).
* Update latest Live Model names for sample agent ([f1eb1c0](https://github.com/google/adk-python/commit/f1eb1c0254802ef3aa64c76512e3104376291ec0)).
* Update google-genai and google-cloud-aiplatform versions ([d58ea58](https://github.com/google/adk-python/commit/d58ea589ade822894f1482fd505a33d842755d9c)).
* Introduce MetricInfoProvider interface, and refactor metric evaluators to use this interface to provide MetricInfo ([5b7c8c0](https://github.com/google/adk-python/commit/5b7c8c04d6e4a688c76fa517922488e3d96353a3)).
* Update _flatten_ollama_content return type and add tests ([fcea86f](https://github.com/google/adk-python/commit/fcea86f58c95894bc9c1fb7ed12e36ddedaaa88a)).
* Add disambiguation message to enterprise_search_tool ([8329fec](https://github.com/google/adk-python/commit/8329fec0fc6b6130ffd1f53a8a2e2ccc6e8f43ed)).
* Add x-goog-user-project header to http calls in API Registry ([0088b0f](https://github.com/google/adk-python/commit/0088b0f3adb963dded692929c314d94709dcc211)).
* Set the default response modality to AUDIO only ([a4b914b](https://github.com/google/adk-python/commit/a4b914b09fbab76834050a8c8f0eb335b12cfc34)).
## [1.21.0](https://github.com/google/adk-python/compare/v1.20.0...v1.21.0) (2025-12-11)
### Features
* **[Interactions API Support]**
* The newly released Gemini [Interactions API](https://ai.google.dev/gemini-api/docs/interactions) is supported in ADK now. To use it:
```Python
Agent(
model=Gemini(
model="gemini-3-pro-preview",
use_interactions_api=True,
),
name="...",
description="...",
instruction="...",
)
```
see [samples](https://github.com/google/adk-python/tree/main/contributing/samples/interactions_api) for details
* **[Services]**
* Add `add_session_to_memory` to `CallbackContext` and `ToolContext` to explicitly save the current session to memory ([7b356dd](https://github.com/google/adk-python/commit/7b356ddc1b1694d2c8a9eee538f3a41cf5518e42))
* **[Plugins]**
* Add location for table in agent events in plugin BigQueryAgentAnalytics ([507424a](https://github.com/google/adk-python/commit/507424acb9aabc697fc64ef2e9a57875f25f0a21))
* Upgrade BigQueryAgentAnalyticsPlugin to v2.0 with improved performance, multimodal support, and reliability ([7b2fe14](https://github.com/google/adk-python/commit/7b2fe14dab96440ee25b66dae9e66eadba629a56))
* **[A2A]**
* Adds ADK EventActions to A2A response ([32e87f6](https://github.com/google/adk-python/commit/32e87f6381ff8905a06a9a43a0207d758a74299d))
* **[Tools]**
* Add `header_provider` to `OpenAPIToolset` and `RestApiTool` ([e1a7593](https://github.com/google/adk-python/commit/e1a7593ae8455d51cdde46f5165410217400d3c9))
* Allow overriding connection template ([cde7f7c](https://github.com/google/adk-python/commit/cde7f7c243a7cdc8c7b886f68be55fd59b1f6d5a))
* Add SSL certificate verification configuration to OpenAPI tools using the `verify` parameter ([9d2388a](https://github.com/google/adk-python/commit/9d2388a46f7a481ea1ec522f33641a06c64394ed))
* Use json schema for function tool declaration when feature enabled ([cb3244b](https://github.com/google/adk-python/commit/cb3244bb58904ab508f77069b436f85b442d3299))
* **[Models]**
* Add Gemma3Ollama model integration and a sample ([e9182e5](https://github.com/google/adk-python/commit/e9182e5eb4a37fb5219fc607cd8f06d7e6982e83))
### Bug Fixes
* Install dependencies for py 3.10 ([9cccab4](https://github.com/google/adk-python/commit/9cccab453706138826f313c47118812133e099c4))
* Refactor LiteLLM response schema formatting for different models ([894d8c6](https://github.com/google/adk-python/commit/894d8c6c2652492324c428e8dae68a8646b17485))
* Resolve project and credentials before creating Spanner client ([99f893a](https://github.com/google/adk-python/commit/99f893ae282a04c67cce5f80e87d3bfadd3943e6))
* Avoid false positive "App name mismatch" warnings in Runner ([6388ba3](https://github.com/google/adk-python/commit/6388ba3b2054e60d218eae6ec8abc621ed0a1139))
* Update the code to work with either 1 event or more than 1 events ([4f54660](https://github.com/google/adk-python/commit/4f54660d6de54ddde0fec6e09fdd68890ce657ca))
* OpenAPI schema generation by skipping JSON schema for judge_model_config ([56775af](https://github.com/google/adk-python/commit/56775afc48ee54e9cbea441a6e0fa6c8a12891b9))
* Add tool_name_prefix support to OpenAPIToolset ([82e6623](https://github.com/google/adk-python/commit/82e6623fa97fb9cbc6893b44e228f4da098498da))
* Pass context to client interceptors ([143ad44](https://github.com/google/adk-python/commit/143ad44f8c5d1c56fc92dd691589aaa0b788e485))
* Yield event with error code when agent run raised A2AClientHTTPError ([b7ce5e1](https://github.com/google/adk-python/commit/b7ce5e17b6653074c5b41d08b2027b5e9970a671))
* Handle string function responses in LiteLLM conversion ([2b64715](https://github.com/google/adk-python/commit/2b6471550591ee7fc5f70f79e66a6e4080df442b))
* ApigeeLLM support for Built-in tools like GoogleSearch, BuiltInCodeExecutor when calling Gemini models through Apigee ([a9b853f](https://github.com/google/adk-python/commit/a9b853fe364d08703b37914a89cf02293b5c553b))
* Extract and propagate task_id in RemoteA2aAgent ([82bd4f3](https://github.com/google/adk-python/commit/82bd4f380bd8b4822191ea16e6140fe2613023ad))
* Update FastAPI and Starlette to fix CVE-2025-62727 (ReDoS vulnerability) ([c557b0a](https://github.com/google/adk-python/commit/c557b0a1f2aac9f0ef7f1e0f65e3884007407e30))
* Add client id to token exchange ([f273517](https://github.com/google/adk-python/commit/f2735177f195b8d7745dba6360688ddfebfed31a))
### Improvements
* Normalize multipart content for LiteLLM's ollama_chat provider ([055dfc7](https://github.com/google/adk-python/commit/055dfc79747aa365db8441908d4994f795e94a68))
* Update adk web, fixes image not rendering, state not updating, update drop down box width and trace icons ([df86847](https://github.com/google/adk-python/commit/df8684734bbfd5a8afe3b4362574fe93dcb43048))
* Add sample agent for interaction api integration ([68d7048](https://github.com/google/adk-python/commit/68d70488b9340251a9d37e8ae3a9166870f26aa1))
* Update genAI SDK version ([f0bdcab](https://github.com/google/adk-python/commit/f0bdcaba449f21bd8c27cde7dbedc03bf5ec5349))
* Introduce `build_function_declaration_with_json_schema` to use pydantic to generate json schema for FunctionTool ([51a638b](https://github.com/google/adk-python/commit/51a638b6b85943d4aaec4ee37c95a55386ebac90))
* Update component definition for triaging agent ([ee743bd](https://github.com/google/adk-python/commit/ee743bd19a8134129111fc4769ec24e40a611982))
* Migrate Google tools to use the new feature decorator ([bab5729](https://github.com/google/adk-python/commit/bab57296d553cb211106ece9ee2c226c64a60c57))
* Migrate computer to use the new feature decorator ([1ae944b](https://github.com/google/adk-python/commit/1ae944b39d9cf263e15b36c76480975fe4291d22))
* Add Spanner execute sql query result mode using list of dictionaries ([f22bac0](https://github.com/google/adk-python/commit/f22bac0b202cd8f273bf2dee9fff57be1b40730d))
* Improve error message for missing `invocation_id` and `new_message` in `run_async` ([de841a4](https://github.com/google/adk-python/commit/de841a4a0982d98ade4478f10481c817a923faa2))
## [1.20.0](https://github.com/google/adk-python/compare/v1.19.0...v1.20.0) (2025-12-01)
### Features
* **[Core]**
* Add enum constraint to `agent_name` for `transfer_to_agent` ([4a42d0d](https://github.com/google/adk-python/commit/4a42d0d9d81b7aab98371427f70a7707dbfb8bc4))
* Add validation for unique sub-agent names ([#3557](https://github.com/google/adk-python/issues/3557)) ([2247a45](https://github.com/google/adk-python/commit/2247a45922afdf0a733239b619f45601d9b325ec))
* Support streaming function call arguments in progressive SSE streaming feature ([786aaed](https://github.com/google/adk-python/commit/786aaed335e1ce64b7e92dff2f4af8316b2ef593))
* **[Models]**
* Enable multi-provider support for Claude and LiteLLM ([d29261a](https://github.com/google/adk-python/commit/d29261a3dc9c5a603feef27ea657c4a03bb8a089))
* **[Tools]**
* Create APIRegistryToolset to add tools from Cloud API registry to agent ([ec4ccd7](https://github.com/google/adk-python/commit/ec4ccd718feeadeb6b2b59fcc0e9ff29a4fd0bac))
* Add an option to disallow propagating runner plugins to AgentTool runner ([777dba3](https://github.com/google/adk-python/commit/777dba3033a9a14667fb009ba017f648177be41d))
* **[Web]**
* Added an endpoint to list apps with details ([b57fe5f](https://github.com/google/adk-python/commit/b57fe5f4598925ec7592917bb32c7f0d6eca287a))
### Bug Fixes
* Allow image parts in user messages for Anthropic Claude ([5453b5b](https://github.com/google/adk-python/commit/5453b5bfdedc91d9d668c9eac39e3bb009a7bbbf))
* Mark the Content as non-empty if its first part contains text or inline_data or file_data or func call/response ([631b583](https://github.com/google/adk-python/commit/631b58336d36bfd93e190582be34069613d38559))
* Fixes double response processing issue in `base_llm_flow.py` where, in Bidi-streaming (live) mode, the multi-agent structure causes duplicated responses after tool calling. ([cf21ca3](https://github.com/google/adk-python/commit/cf21ca358478919207049695ba6b31dc6e0b2673))
* Fix out of bounds error in _run_async_impl ([8fc6128](https://github.com/google/adk-python/commit/8fc6128b62ba576480d196d4a2597564fd0a7006))
* Fix paths for public docs ([cd54f48](https://github.com/google/adk-python/commit/cd54f48fed0c87b54fb19743c9c75e790c5d9135))
* Ensure request bodies without explicit names are named 'body' ([084c2de](https://github.com/google/adk-python/commit/084c2de0dac84697906e2b4beebf008bbd9ae8e1)), closes [#2213](https://github.com/google/adk-python/issues/2213)
* Optimize Stale Agent with GraphQL and Search API to resolve 429 Quota errors ([cb19d07](https://github.com/google/adk-python/commit/cb19d0714c90cd578551753680f39d8d6076c79b))
* Update AgentTool to use Agent's description when input_schema is provided in FunctionDeclaration ([52674e7](https://github.com/google/adk-python/commit/52674e7fac6b7689f0e3871d41c4523e13471a7e))
* Update LiteLLM system instruction role from "developer" to "system" ([2e1f730](https://github.com/google/adk-python/commit/2e1f730c3bc0eb454b76d7f36b7b9f1da7304cfe)), closes [#3657](https://github.com/google/adk-python/issues/3657)
* Update session last update time when appending events ([a3e4ad3](https://github.com/google/adk-python/commit/a3e4ad3cd130714affcaa880f696aeb498cd93af)), closes [#2721](https://github.com/google/adk-python/issues/2721)
* Update the retry_on_closed_resource decorator to retry on all errors ([a3aa077](https://github.com/google/adk-python/commit/a3aa07722a7de3e08807e86fd10f28938f0b267d))
* Windows Path Handling and Normalize Cross-Platform Path Resolution in AgentLoader ([a1c09b7](https://github.com/google/adk-python/commit/a1c09b724bb37513eaabaff9643eeaa68014f14d))
### Documentation
* Add Code Wiki badge to README ([caf23ac](https://github.com/google/adk-python/commit/caf23ac49fe08bc7f625c61eed4635c26852c3ba))
## [1.19.0](https://github.com/google/adk-python/compare/v1.18.0...v1.19.0) (2025-11-19)
### Features
* **[Core]**
* Add `id` and `custom_metadata` fields to `MemoryEntry` ([4dd28a3](https://github.com/google/adk-python/commit/4dd28a3970d0f76c571caf80b3e1bea1b79e9dde))
* Add progressive SSE streaming feature ([a5ac1d5](https://github.com/google/adk-python/commit/a5ac1d5e14f5ce7cd875d81a494a773710669dc1))
* Add a2a_request_meta_provider to RemoteAgent init ([d12468e](https://github.com/google/adk-python/commit/d12468ee5a2b906b6699ccdb94c6a5a4c2822465))
* Add feature decorator for the feature registry system ([871da73](https://github.com/google/adk-python/commit/871da731f1c09c6a62d51b137d9d2e7c9fb3897a))
* Breaking: Raise minimum Python version to 3_10 ([8402832](https://github.com/google/adk-python/commit/840283228ee77fb3dbd737cfe7eb8736d9be5ec8))
* Refactor and rename BigQuery agent analytics plugin ([6b14f88](https://github.com/google/adk-python/commit/6b14f887262722ccb85dcd6cef9c0e9b103cfa6e))
* Pass custom_metadata through forwarding artifact service ([c642f13](https://github.com/google/adk-python/commit/c642f13f216fb64bc93ac46c1c57702c8a2add8c))
* Update save_files_as_artifacts_plugin to never keep inline data ([857de04](https://github.com/google/adk-python/commit/857de04debdeba421075c2283c9bd8518d586624))
* **[Evals]**
* Add support for InOrder and AnyOrder match in ToolTrajectoryAvgScore Metric ([e2d3b2d](https://github.com/google/adk-python/commit/e2d3b2d862f7fc93807d16089307d4df25367a24))
* **[Integrations]**
* Enhance BQ Plugin Schema, Error Handling, and Logging ([5ac5129](https://github.com/google/adk-python/commit/5ac5129fb01913516d6f5348a825ca83d024d33a))
* Schema Enhancements with Descriptions, Partitioning, and Truncation Indicator ([7c993b0](https://github.com/google/adk-python/commit/7c993b01d1b9d582b4e2348f73c0591d47bf2f3a))
* **[Services]**
* Add file-backed artifact service ([99ca6aa](https://github.com/google/adk-python/commit/99ca6aa6e6b4027f37d091d9c93da6486def20d7))
* Add service factory for configurable session and artifact backends ([a12ae81](https://github.com/google/adk-python/commit/a12ae812d367d2d00ab246f85a73ed679dd3828a))
* Add SqliteSessionService and a migration script to migrate existing DB using DatabaseSessionService to SqliteSessionService ([e218254](https://github.com/google/adk-python/commit/e2182544952c0174d1a8307fbba319456dca748b))
* Add transcription fields to session events ([3ad30a5](https://github.com/google/adk-python/commit/3ad30a58f95b8729f369d00db799546069d7b23a))
* Full async implementation of DatabaseSessionService ([7495941](https://github.com/google/adk-python/commit/74959414d8ded733d584875a49fb4638a12d3ce5))
* **[Models]**
* Add experimental feature to use `parameters_json_schema` and `response_json_schema` for McpTool ([1dd97f5](https://github.com/google/adk-python/commit/1dd97f5b45226c25e4c51455c78ebf3ff56ab46a))
* Add support for parsing inline JSON tool calls in LiteLLM responses ([22eb7e5](https://github.com/google/adk-python/commit/22eb7e5b06c9e048da5bb34fe7ae9135d00acb4e))
* Expose artifact URLs to the model when available ([e3caf79](https://github.com/google/adk-python/commit/e3caf791395ce3cc0b10410a852be6e7b0d8d3b1))
* **[Tools]**
* Add BigQuery related label handling ([ffbab4c](https://github.com/google/adk-python/commit/ffbab4cf4ed6ceb313241c345751214d3c0e11ce))
* Allow setting max_billed_bytes in BigQuery tools config ([ffbb0b3](https://github.com/google/adk-python/commit/ffbb0b37e128de50ebf57d76cba8b743a8b970d5))
* Propagate `application_name` set for the BigQuery Tools as BigQuery job labels ([f13a11e](https://github.com/google/adk-python/commit/f13a11e1dc27c5aa46345154fbe0eecfe1690cbb))
* Set per-tool user agent in BQ calls and tool label in BQ jobs ([c0be1df](https://github.com/google/adk-python/commit/c0be1df0521cfd4b84585f404d4385b80d08ba59))
* **[Observability]**
* Migrate BigQuery logging to Storage Write API ([a2ce34a](https://github.com/google/adk-python/commit/a2ce34a0b9a8403f830ff637d0e2094e82dee8e7))
### Bug Fixes
* Add `jsonschema` dependency for Agent Builder config validation ([0fa7e46](https://github.com/google/adk-python/commit/0fa7e4619d589dc834f7508a18bc2a3b93ec7fd9))
* Add None check for `event` in `remote_a2a_agent.py` ([744f94f](https://github.com/google/adk-python/commit/744f94f0c8736087724205bbbad501640b365270))
* Add vertexai initialization for code being deployed to AgentEngine ([b8e4aed](https://github.com/google/adk-python/commit/b8e4aedfbf0eb55b34599ee24e163b41072a699c))
* Change LiteLLM content and tool parameter handling ([a19be12](https://github.com/google/adk-python/commit/a19be12c1f04bb62a8387da686499857c24b45c0))
* Change name for builder agent ([131d39c](https://github.com/google/adk-python/commit/131d39c3db1ae25e3911fa7f72afbe05e24a1c37))
* Ensure event compaction completes by awaiting task ([b5f5df9](https://github.com/google/adk-python/commit/b5f5df9fa8f616b855c186fcef45bade00653c77))
* Fix deploy to cloud run on Windows ([29fea7e](https://github.com/google/adk-python/commit/29fea7ec1fb27989f07c90494b2d6acbe76c03d8))
* Fix error handling when MCP server is unreachable ([ee8106b](https://github.com/google/adk-python/commit/ee8106be77f253e3687e72ae0e236687d254965c))
* Fix error when query job destination is None ([0ccc43c](https://github.com/google/adk-python/commit/0ccc43cf49dc0882dc896455d6603a602d8a28e7))
* Fix Improve logic for checking if a MCP session is disconnected ([a754c96](https://github.com/google/adk-python/commit/a754c96d3c4fd00f9c2cd924fc428b68cc5115fb))
* Fix McpToolset crashing with anyio.BrokenResourceError ([8e0648d](https://github.com/google/adk-python/commit/8e0648df23d0694afd3e245ec4a3c41aa935120a))
* Fix Safely handle `FunctionDeclaration` without a `required` attribute ([93aad61](https://github.com/google/adk-python/commit/93aad611983dc1daf415d3a73105db45bbdd1988))
* Fix status code in error message in RestApiTool ([9b75456](https://github.com/google/adk-python/commit/9b754564b3cc5a06ad0c6ae2cd2d83082f9f5943))
* Fix Use `async for` to loop through event iterator to get all events in vertex_ai_session_service ([9211f4c](https://github.com/google/adk-python/commit/9211f4ce8cc6d918df314d6a2ff13da2e0ef35fa))
* Fix: Fixes DeprecationWarning when using send method ([2882995](https://github.com/google/adk-python/commit/28829952890c39dbdb4463b2b67ff241d0e9ef6d))
* Improve logic for checking if a MCP session is disconnected ([a48a1a9](https://github.com/google/adk-python/commit/a48a1a9e889d4126e6f30b56c93718dfbacef624))
* Improve handling of partial and complete transcriptions in live calls ([1819ecb](https://github.com/google/adk-python/commit/1819ecb4b8c009d02581c2d060fae49cd7fdf653))
* Keep vertex session event after the session update time ([0ec0195](https://github.com/google/adk-python/commit/0ec01956e86df6ae8e6553c70e410f1f8238ba88))
* Let part converters also return multiple parts so they can support more usecases ([824ab07](https://github.com/google/adk-python/commit/824ab072124e037cc373c493f43de38f8b61b534))
* Load agent/app before creating session ([236f562](https://github.com/google/adk-python/commit/236f562cd275f84837be46f7dfb0065f85425169))
* Remove app name from FileArtifactService directory structure ([12db84f](https://github.com/google/adk-python/commit/12db84f5cd6d8b6e06142f6f6411f6b78ff3f177))
* Remove hardcoded `google-cloud-aiplatform` version in agent engine requirements ([e15e19d](https://github.com/google/adk-python/commit/e15e19da05ee1b763228467e83f6f73e0eced4b5))
* Stop updating write mode in the global settings during tool execution ([5adbf95](https://github.com/google/adk-python/commit/5adbf95a0ab0657dd7df5c4a6bac109d424d436e))
* Update description for `load_artifacts` tool ([c485889](https://github.com/google/adk-python/commit/c4858896ff085bedcfbc42b2010af8bd78febdd0))
### Improvements
* Add BigQuery related label handling ([ffbab4c](https://github.com/google/adk-python/commit/ffbab4cf4ed6ceb313241c345751214d3c0e11ce))
* Add demo for rewind ([8eb1bdb](https://github.com/google/adk-python/commit/8eb1bdbc58dc709006988f5b6eec5fda25bd0c89))
* Add debug logging for live connection ([5d5708b](https://github.com/google/adk-python/commit/5d5708b2ab26cb714556311c490b4d6f0a1f9666))
* Add debug logging for missing function call events ([f3d6fcf](https://github.com/google/adk-python/commit/f3d6fcf44411d07169c14ae12189543f44f96c27))
* Add default retry options as fall back to llm_request that are made during evals ([696852a](https://github.com/google/adk-python/commit/696852a28095a024cbe76413ee7617356e19a9e3))
* Add plugin for returning GenAI Parts from tools into the model request ([116b26c](https://github.com/google/adk-python/commit/116b26c33e166bf1a22964e2b67013907fbfcb80))
* Add support for abstract types in AFC ([2efc184](https://github.com/google/adk-python/commit/2efc184a46173529bdfc622db0d6f3866e7ee778))
* Add support for structured output schemas in LiteLLM models ([7ea4aed](https://github.com/google/adk-python/commit/7ea4aed35ba70ec5a38dc1b3b0a9808183c2bab1))
* Add tests for `max_query_result_rows` in BigQuery tool config ([fd33610](https://github.com/google/adk-python/commit/fd33610e967ad814bc02422f5d14dae046bee833))
* Add type hints in `cleanup_unused_files.py` ([2dea573](https://github.com/google/adk-python/commit/2dea5733b759a7a07d74f36a4d6da7b081afc732))
* Add util to build our llms.txt and llms-full.txt files
* ADK changes ([f1f4467](https://github.com/google/adk-python/commit/f1f44675e4a86b75e72cfd838efd8a0399f23e24))
* Defer import of `google.cloud.storage` in `GCSArtifactService` ([999af55](https://github.com/google/adk-python/commit/999af5588005e7b29451bdbf9252265187ca992d))
* Defer import of `live`, `Client` and `_transformers` in `google.genai` ([22c6dbe](https://github.com/google/adk-python/commit/22c6dbe83cd1a8900d0ac6fd23d2092f095189fa))
* Enhance the messaging with possible fixes for RESOURCE_EXHAUSTED errors from Gemini ([b2c45f8](https://github.com/google/adk-python/commit/b2c45f8d910eb7bca4805c567279e65aff72b58a))
* Improve gepa tau-bench colab for external use ([e02f177](https://github.com/google/adk-python/commit/e02f177790d9772dd253c9102b80df1a9418aa7f))
* Improve gepa voter agent demo colab ([d118479](https://github.com/google/adk-python/commit/d118479ccf3a970ce9b24ac834b4b6764edb5de4))
* Lazy import DatabaseSessionService in the adk/sessions/ module ([5f05749](https://github.com/google/adk-python/commit/5f057498a274d3b3db0be0866f04d5225334f54a))
* Move adk_agent_builder_assistant to built_in_agents ([b2b7f2d](https://github.com/google/adk-python/commit/b2b7f2d6aa5b919a00a92abaf2543993746e939e))
* Plumb memory service from LocalEvalService to EvaluationGenerator ([dc3f60c](https://github.com/google/adk-python/commit/dc3f60cc939335da49399a69c0b4abc0e7f25ea4))
* Removes the unrealistic todo comment of visibility management ([e511eb1](https://github.com/google/adk-python/commit/e511eb1f70f2a3fccc9464ddaf54d0165db22feb))
* Returns agent state regardless if ctx.is_resumable ([d6b928b](https://github.com/google/adk-python/commit/d6b928bdf7cdbf8f1925d4c5227c7d580093348e))
* Stop logging the full content of LLM blobs ([0826755](https://github.com/google/adk-python/commit/082675546f501a70f4bc8969b9431a2e4808bd13))
* Update ADK web to match main branch ([14e3802](https://github.com/google/adk-python/commit/14e3802643a2d8ce436d030734fafd163080a1ad))
* Update agent instructions and retry limit in `plugin_reflect_tool_retry` sample ([01bac62](https://github.com/google/adk-python/commit/01bac62f0c14cce5d454a389b64a9f44a03a3673))
* Update conformance test CLI to handle long-running tool calls ([dd706bd](https://github.com/google/adk-python/commit/dd706bdc4563a2a815459482237190a63994cb6f))
* Update Gemini Live model names in live bidi streaming sample ([aa77834](https://github.com/google/adk-python/commit/aa77834e2ecd4b77dfb4e689ef37549b3ebd6134))
## [1.18.0](https://github.com/google/adk-python/compare/v1.17.0...v1.18.0) (2025-11-05)
### Features
* **[ADK Visual Agent Builder]**
* Core Features
* Visual workflow designer for agent creation
* Support for multiple agent types (LLM, Sequential, Parallel, Loop, Workflow)
* Agent tool support with nested agent tools
* Built-in and custom tool integration
* Callback management for all ADK callback types (before/after agent, model, tool)
* Assistant to help you build your agents with natural language
* Assistant proposes and writes agent configuration yaml files for you
* Save to test with chat interfaces as normal
* Build and debug at the same time in adk web!
* **[Core]**
* Add support for extracting cache-related token counts from LiteLLM usage ([4f85e86](https://github.com/google/adk-python/commit/4f85e86fc3915f0e67312a39fe22451968d4f1b1))
* Expose the Python code run by the code interpreter in the logs ([a2c6a8a](https://github.com/google/adk-python/commit/a2c6a8a85cf4f556e9dacfe46cf384d13d964208))
* Add run_debug() helper method for quick agent experimentation ([0487eea](https://github.com/google/adk-python/commit/0487eea2abcd05d7efd123962d17b8c6c9a9d975))
* Allow injecting a custom Runner into `agent_to_a2a` ([156d235](https://github.com/google/adk-python/commit/156d23547915e8f7f5c6ba55e0362f4b133c3968))
* Support MCP prompts via the McpInstructionProvider class ([88032cf](https://github.com/google/adk-python/commit/88032cf5c56bb2d81842353605f9f5ab4b2206ff))
* **[Models]**
* Add model tracking to LiteLlm and introduce a LiteLLM with fallbacks demo ([d4c63fc](https://github.com/google/adk-python/commit/d4c63fc5629e7d70ad8b8185be09243a01e3428f))
* Add ApigeeLlm as a model that lets ADK Agent developers to connect with an Apigee proxy ([87dcb3f](https://github.com/google/adk-python/commit/87dcb3f7ba344a2ba7d9edfc4817c9e792d90bfc))
* **[Integrations]**
* Add example and fix for loading and upgrading old ADK session databases ([338c3c8](https://github.com/google/adk-python/commit/338c3c89c6bce7f3406f729013cedcd78b809a56))
* Add support for specifying logging level for adk eval cli command ([b1ff85f](https://github.com/google/adk-python/commit/b1ff85fb2347e3402eedd42e3673be7093a99548))
* Propagate LiteLLM finish_reason to LlmResponse for use in callbacks ([71aa564](https://github.com/google/adk-python/commit/71aa5645f6c3d91fd0e0ddb1ed564188c6727080))
* Allow LLM request to override the model used in the generate content async method in LiteLLM ([ce8f674](https://github.com/google/adk-python/commit/ce8f674a287368439ba11be3285902671e9bc75a))
* Add api key argument to Vertex Session and Memory services for Express Mode support ([9014a84](https://github.com/google/adk-python/commit/9014a849eab9f77b82db4a7f2053fb2a96282f03))
* Added support for enums as arguments for function tools ([240ef5b](https://github.com/google/adk-python/commit/240ef5beea9389911e8c03a6039b353befc716ac))
* Implement artifact_version related methods in GcsArtifactService ([e194ebb](https://github.com/google/adk-python/commit/e194ebb33c62bc40403ea852a88f77a9511b61a4))
* **[Services]**
* Add support for Vertex AI Express Mode when deploying to Agent Engine ([d4b2a8b](https://github.com/google/adk-python/commit/d4b2a8b49f98a9991cb44ac7ec6e538b81a08664))
* Remove custom polling logic for Vertex AI Session Service since LRO polling is supported in express mode ([546c2a6](https://github.com/google/adk-python/commit/546c2a68165f54e694664d5b6b6740566301782b))
* Make VertexAiSessionService fully asynchronous ([f7e2a7a](https://github.com/google/adk-python/commit/f7e2a7a40ef248dd6fbba9669503b0828a12f0cc))
* **[Tools]**
* Add Bigquery detect_anomalies tool ([9851340](https://github.com/google/adk-python/commit/9851340ad1df86d6f5c21e8984199573f239bb2b))
* Extend Bigquery detect_anomalies tool to support future data anomaly detection ([38ea749](https://github.com/google/adk-python/commit/38ea749c9cec8e65f5e768f49fd2de79b5545571))
* Add get_job_info tool to BigQuery toolset ([6429457](https://github.com/google/adk-python/commit/64294572c1c93590aa3c221015a5cb9b440ee948))
* **[Evals]**
* Add "final_session_state" to the EvalCase data model ([2274c4f](https://github.com/google/adk-python/commit/2274c4f3040b20da3690aa03272155776ca330c1))
* Marked expected_invocation as optional field on evaluator interface ([b17c8f1](https://github.com/google/adk-python/commit/b17c8f19e5fc67180d1bdc621f84cd43e357571c))
* Adds LLM-backed user simulator ([54c4ecc](https://github.com/google/adk-python/commit/54c4ecc73381cffa51cff01c7fb8a2ac59308c53))
* **[Observability]**
* Add BigQueryLoggingPlugin for event logging to BigQuery ([b7dbfed](https://github.com/google/adk-python/commit/b7dbfed4a3d4a0165e2c6e51594d1f547bec89d3))
* **[Live]**
* Add token usage to live events for bidi streaming ([6e5c0eb](https://github.com/google/adk-python/commit/6e5c0eb6e0474f5b908eb9df20328e7da85ebed9))
### Bug Fixes
* Reduce logging spam for MCP tools without authentication ([11571c3](https://github.com/google/adk-python/commit/11571c37ab948d43cbaa3a1d82522256dfe4d467))
* Fix typo in several files ([d2888a3](https://github.com/google/adk-python/commit/d2888a3766b87df2baaaa1a67a2235b1b80f138f))
* Disable SetModelResponseTool workaround for Vertex AI Gemini 2+ models ([6a94af2](https://github.com/google/adk-python/commit/6a94af24bf3367c05a5d405b7e7b79810a1fac4e))
* Bug when callback_context_invocation_context is missing in GlobalInstructionPlugin ([f81ebdb](https://github.com/google/adk-python/commit/f81ebdb622211031945eb06c3f00ff5208d94f9b))
* Support models slash prefix in model name extraction ([8dff850](https://github.com/google/adk-python/commit/8dff85099d67623dd6f4a707fb932ea55b8aaf9b))
* Do not consider events with state delta and no content as final response ([1ee93c8](https://github.com/google/adk-python/commit/1ee93c8bcb7ccd6f33658dc76b2095dd7e58aac9))
* Parameter filtering for CrewAI functions with **kwargs ([74a3500](https://github.com/google/adk-python/commit/74a3500fc5d4b07e80f914d83a0d91face28086c))
* Do not treat FinishReason.STOP as error case for LLM responses containing candidates with empty contents ([2f72ceb](https://github.com/google/adk-python/commit/2f72ceb49b452c5a1f257bce6adb004fa5d54472))
* Fixes null check for reflect_retry plugin sample ([86f0155](https://github.com/google/adk-python/commit/86f01550bd1b52d6d160e8bc54cecc6c4fe8611c))
* Creates evalset directory on evalset create ([6c3882f](https://github.com/google/adk-python/commit/6c3882f2d66f169d393171be280b6e6218b52a7c))
* Add ADK_DISABLE_LOAD_DOTENV environment variable that disables automatic loading of .env when running ADK cli, if set to true or 1 ([15afbcd](https://github.com/google/adk-python/commit/15afbcd1587d4102a4dc5c07c0c493917df9d6ea))
* Allow tenacity 9.0.0 ([ee8acc5](https://github.com/google/adk-python/commit/ee8acc58be7421a3e8eab07b051c45f9319f80dc))
* Output file uploading to artifact service should handle both base64 encoded and raw bytes ([496f8cd](https://github.com/google/adk-python/commit/496f8cd6bb36d3ba333d7ab1e94e7796d2960300))
* Correct message part ordering in A2A history ([5eca72f](https://github.com/google/adk-python/commit/5eca72f9bfd05c7c28a3d738391138a59a31167d))
* Change instruction insertion to respect tool call/response pairs ([1e6a9da](https://github.com/google/adk-python/commit/1e6a9daa63050936ab421f1f684935927aebc63e))
* DynamicPickleType to support MySQL dialect ([fc15c9a](https://github.com/google/adk-python/commit/fc15c9a0c3c043c0a61dce625b8cd1ee121b4baf))
* Enable usage metadata in LiteLLM streaming ([f9569bb](https://github.com/google/adk-python/commit/f9569bbb1afbc7f0e8b6e68599590471fd112b9f))
* Fix issue with MCP tools throwing an error ([1a4261a](https://github.com/google/adk-python/commit/1a4261ad4b66cdeb39d39110a086bd6112b17516))
* Remove redundant `format` field from LiteLLM content objects ([489c39d](https://github.com/google/adk-python/commit/489c39db01465e38ecbc2c7f32781c349b8cddc9))
* Update the contribution analysis tool to use original write mode ([54db3d4](https://github.com/google/adk-python/commit/54db3d4434e0706b83a589fa2499d11d439a6e4e))
* Fix agent evaluations detailed output rows wrapping issue([4284c61](https://github.com/google/adk-python/commit/4284c619010b8246c1ecaa011f14b6cc9de512dd))
* Update dependency version constraints to be based on PyPI versions([0b1784e](https://github.com/google/adk-python/commit/0b1784e0e493a0e2df1edfe37e5ed5f4247e7d9d))
### Improvements
* Add Community Repo section to README ([432d30a](https://github.com/google/adk-python/commit/432d30af486329aa83f89c5d5752749a85c0b843))
* Undo adding MCP tools output schema to FunctionDeclaration ([92a7d19](https://github.com/google/adk-python/commit/92a7d1957367d498de773761edd142d8c108d751))
* Refactor ADK README for clarity and consistency ([b0017ae](https://github.com/google/adk-python/commit/b0017aed4472c73c3b07e71f1d65ae97a5293547))
* Add support for reversed proxy in adk web ([a0df75b](https://github.com/google/adk-python/commit/a0df75b6fa35d837086decb8802dbf1c0a6637ad))
* Avoid rendering empty columns as part of detailed results rendering of eval results ([5cb35db](https://github.com/google/adk-python/commit/5cb35db921bf86b5ad0012046bd19fa7cc1e6abb))
* Clear the behavior of disallow_transfer_to_parent ([48ddd07](https://github.com/google/adk-python/commit/48ddd078941f9240b10f052b6de171c310bc2bc6))
* Disable the scheduled execution for issue triage workflow ([a02f321](https://github.com/google/adk-python/commit/a02f321f1bdb8be9ad1873db804e0e8393268dc3))
* Include delimiter when matching events from parent nodes in content processor ([b8a2b6c](https://github.com/google/adk-python/commit/b8a2b6c57080ae29d7a02df7d9fcc2f961d422d2))
* Improve Tau-bench ADK colab stability ([04dbc42](https://github.com/google/adk-python/commit/04dbc42e50ce40ef3924d1c259e425215e12c2e7))
* Implement ADK-based agent factory for Tau-bench ([c0c67c8](https://github.com/google/adk-python/commit/c0c67c8698d70ddb9ed958416661f232ef9a5ed8))
* Add util to run ADK LLM Agent with simulation environment ([87f415a](https://github.com/google/adk-python/commit/87f415a7c36a1f3b6ab84d1fe939726c6ef7f34e))
* Demonstrate CodeExecutor customization for environment setup ([8eeff35](https://github.com/google/adk-python/commit/8eeff35b35d7e1538a5c9662cc8369f6ff7962f8))
* Add sample agent for VertexAiCodeExecutor ([edfe553](https://github.com/google/adk-python/commit/edfe5539421d196ca4da14d3a37fac7b598f8c8d))
* Adds a new sample agent that demonstrates how to integrate PostgreSQL databases using the Model Context Protocol (MCP) ([45a2168](https://github.com/google/adk-python/commit/45a2168e0e6773e595ecfb825d7e4ab0a38c3a38))
* Add example for using ADK with Fast MCP sampling ([d3796f9](https://github.com/google/adk-python/commit/d3796f9b33251d28d05e6701f11e80f02a2a49e1))
* Refactor gepa sample code and clean-up user demo colab([63353b2](https://github.com/google/adk-python/commit/63353b2b74e23e97385892415c5a3f2a59c3504f))
## [1.17.0](https://github.com/google/adk-python/compare/v1.16.0...v1.17.0) (2025-10-22)
### Features
* **[Core]**
* Add a service registry to provide a generic way to register custom service implementations to be used in FastAPI server. See [short instruction](https://github.com/google/adk-python/discussions/3175#discussioncomment-14745120). ([391628f](https://github.com/google/adk-python/commit/391628fcdc7b950c6835f64ae3ccab197163c990))
* Add the ability to rewind a session to before a previous invocation ([9dce06f](https://github.com/google/adk-python/commit/9dce06f9b00259ec42241df4f6638955e783a9d1))
* Support resuming a parallel agent with multiple branches paused on tool confirmation requests ([9939e0b](https://github.com/google/adk-python/commit/9939e0b087094038b90d86c2fd35c26dd63f1157))
* Support content union as static instruction ([cc24d61](https://github.com/google/adk-python/commit/cc24d616f80c0eba2b09239b621cf3d176f144ea))
* **[Evals]**
* ADK cli allows developers to create an eval set and add an eval case ([ae139bb](https://github.com/google/adk-python/commit/ae139bb461c2e7c6be154b04f3f2c80919808d31))
* **[Integrations]**
* Allow custom request and event converters in A2aAgentExecutor ([a17f3b2](https://github.com/google/adk-python/commit/a17f3b2e6d2d48c433b42e27763f3d6df80243ca))
* **[Observability]**
* Env variable for disabling llm_request and llm_response in spans ([e50f05a](https://github.com/google/adk-python/commit/e50f05a9fc94834796876f7f112f344f788f202e))
* **[Services]**
* Allow passing extra kwargs to create_session of VertexAiSessionService ([6a5eac0](https://github.com/google/adk-python/commit/6a5eac0bdc9adc6907a28f65a3d4d7234e863049))
* Implement new methods in in-memory artifact service to support custom metadata, artifact versions, etc. ([5a543c0](https://github.com/google/adk-python/commit/5a543c00df2f7a66018df8a67efcf4ce44d4e0e4))
* Add create_time and mime_type to ArtifactVersion ([2c7a342](https://github.com/google/adk-python/commit/2c7a34259395b1294319118d0f3d1b3b867b44d6))
* Support returning all sessions when user id is none ([141318f](https://github.com/google/adk-python/commit/141318f77554ae4eb5a360bea524e98eff4a086c))
* **[Tools]**
* Support additional headers for Google API toolset ([ed37e34](https://github.com/google/adk-python/commit/ed37e343f0c997d3ee5dc98888c5e0dbd7f2a2b6))
* Introduces a new AgentEngineSandboxCodeExecutor class that supports executing agent-generated code using the Vertex AI Code Execution Sandbox API ([ee39a89](https://github.com/google/adk-python/commit/ee39a891106316b790621795b5cc529e89815a98))
* Support dynamic per-request headers in MCPToolset ([6dcbb5a](https://github.com/google/adk-python/commit/6dcbb5aca642290112a7c81162b455526c15cd14))
* Add `bypass_multi_tools_limit` option to GoogleSearchTool and VertexAiSearchTool ([9a6b850](https://github.com/google/adk-python/commit/9a6b8507f06d8367488aac653efecf665619516c), [6da7274](https://github.com/google/adk-python/commit/6da727485898137948d72906d86d78b6db6331ac))
* Extend `ReflectAndRetryToolPlugin` to support hallucinating function calls ([f51380f](https://github.com/google/adk-python/commit/f51380f9ea4534591eda76bef27407c0aa7c3fae))
* Add require_confirmation param for MCP tool/toolset ([78e74b5](https://github.com/google/adk-python/commit/78e74b5bf2d895d72025a44dbcf589f543514a50))
* **[UI]**
* Granular per agent speech configuration ([409df13](https://github.com/google/adk-python/commit/409df1378f36b436139aa909fc90a9e9a0776b3a))
### Bug Fixes
* Returns dict as result from McpTool to comply with BaseTool expectations ([4df9263](https://github.com/google/adk-python/commit/4df926388b6e9ebcf517fbacf2f5532fd73b0f71))
* Fixes the identity prompt to be one line ([7d5c6b9](https://github.com/google/adk-python/commit/7d5c6b9acf0721dd230f08df919c7409eed2b7d0))
* Fix the broken langchain importing caused by their 1.0.0 release ([c850da3](https://github.com/google/adk-python/commit/c850da3a07ec1441037ced1b654d8aacacd277ab))
* Fix BuiltInCodeExecutor to support visualizations ([ce3418a](https://github.com/google/adk-python/commit/ce3418a69de56570847d45f56ffe7139ab0a47aa))
* Relax runner app-name enforcement and improve agent origin inference ([dc4975d](https://github.com/google/adk-python/commit/dc4975dea9fb79ad887460659f8f397a537ee38f))
* Improve error message when adk web is run in wrong directory ([4a842c5](https://github.com/google/adk-python/commit/4a842c5a1334c3ee01406f796651299589fe12ab))
* Handle App objects in eval and graph endpoints ([0b73a69](https://github.com/google/adk-python/commit/0b73a6937bd84a41f79a9ada3fc782dca1d6fb11))
* Exclude `additionalProperties` from Gemini schemas ([307896a](https://github.com/google/adk-python/commit/307896aeceeb97efed352bc0217bae10423e5da6))
* Overall eval status should be NOT_EVALUATED if no invocations were evaluated ([9fbed0b](https://github.com/google/adk-python/commit/9fbed0b15afb94ec8c0c7ab60221bbc97e481b06))
* Create context cache only when prefix matches with previous request ([9e0b1fb](https://github.com/google/adk-python/commit/9e0b1fb62b06de7ecb79bf77d54a999167d001e1))
* Handle `App` instances returned by `agent_loader.load_agent` ([847df16](https://github.com/google/adk-python/commit/847df1638cbf1686aa43e8e094121d4e23e40245))
* Add support for file URIs in LiteLLM content conversion ([85ed500](https://github.com/google/adk-python/commit/85ed500871ff55c74d16e809ddae0d4db66cbc3a))
* Only exclude scores that are None ([998264a](https://github.com/google/adk-python/commit/998264a5b1b98ac660fcc1359fb2d25c84fa0d87))
* Better handling the A2A streaming tasks ([bddc70b](https://github.com/google/adk-python/commit/bddc70b5d004ba5304fe05bcbf6e08210f0e6131))
* Correctly populate context_id in remote_a2a_agent library ([2158b3c](https://github.com/google/adk-python/commit/2158b3c91531e9125761f211f125d9ab41a55e10))
* Remove unnecessary Aclosing ([2f4f561](https://github.com/google/adk-python/commit/2f4f5611bdb30bd5eb2fdb3a70f43d748371392f))
* Fix pickle data was truncated error in database session using MySql ([36c96ec](https://github.com/google/adk-python/commit/36c96ec5b356109b7c874c85d8bb24f0bf6c050d))
### Improvements
* Improve hint message in agent loader ([fe1fc75](https://github.com/google/adk-python/commit/fe1fc75c15a7983829bbe0b023f4b612b1e5c018))
* Fixes MCPToolset --> McpToolset in various places ([d4dc645](https://github.com/google/adk-python/commit/d4dc6454783f747120d407d0dc2cb78f53598d83))
* Add span for context caching handling and new cache creation ([a2d9f13](https://github.com/google/adk-python/commit/a2d9f13fa1d31e00ba9493fba321ca151cdd9366))
* Checks gemini version for `2 and above` for gemini-builtin tools ([0df6759](https://github.com/google/adk-python/commit/0df67599c0eb54a9a5df51af06483b40058953bf))
* Refactor and fix state management in the session service ([8b3ed05](https://github.com/google/adk-python/commit/8b3ed059c24903e8aca0a09d9d503b48af7df850))
* Update agent builder instructions and remove run command details ([89344da](https://github.com/google/adk-python/commit/89344da81364d921f778c8bbea93e1df6ad1097e))
* Clarify how to use adk built-in tool in instruction ([d22b8bf](https://github.com/google/adk-python/commit/d22b8bf8907e723f618dfd18e90dd0a5dbc9518c))
* Delegate the agent state reset logic to LoopAgent ([bb1ea74](https://github.com/google/adk-python/commit/bb1ea74924127d65d763a45b869da3d4ff4d5c5a))
* Adjust the instruction about default model ([214986e](https://github.com/google/adk-python/commit/214986ebeb53b2ef34c8aa37cd6403106de82c1b))
* Migrate invocation_context to callback_context ([e2072af](https://github.com/google/adk-python/commit/e2072af69f40474431b6749b7b9dc22fbcbc7730))
* Correct the callback signatures ([fa84bcb](https://github.com/google/adk-python/commit/fa84bcb5756773eadff486b99c9bd416b4faa9c6))
* Set default for `bypass_multi_tools_limit` to False for GoogleSearchTool and VertexAiSearchTool ([6da7274](https://github.com/google/adk-python/commit/6da727485898137948d72906d86d78b6db6331ac))
* Add more clear instruction to the doc updater agent about one PR for each recommended change ([b21d0a5](https://github.com/google/adk-python/commit/b21d0a50d610407be2f10b73a91274840ffdfe18))
* Add a guideline to avoid content deletion ([16b030b](https://github.com/google/adk-python/commit/16b030b2b25a9b0b489e47b4b148fc4d39aeffcb))
* Add a sample agent for the `ReflectAndRetryToolPlugin` ([9b8a4aa](https://github.com/google/adk-python/commit/9b8a4aad6fe65ef37885e5c3368d2799a2666534))
* Improve error message when adk web is run in wrong directory ([4a842c5](https://github.com/google/adk-python/commit/4a842c5a1334c3ee01406f796651299589fe12ab))
* Add span for context caching handling and new cache creation ([a2d9f13](https://github.com/google/adk-python/commit/a2d9f13fa1d31e00ba9493fba321ca151cdd9366))
* Disable the scheduled execution for issue triage workflow ([bae2102](https://github.com/google/adk-python/commit/bae21027d9bd7f811bed638ecce692262cb33fe5))
* Correct the callback signatures ([fa84bcb](https://github.com/google/adk-python/commit/fa84bcb5756773eadff486b99c9bd416b4faa9c6))
### Documentation
* Format README.md for samples ([0bdba30](https://github.com/google/adk-python/commit/0bdba3026345872fb907aedd1ed75e4135e58a30))
* Bump models in llms and llms-full to Gemini 2.5 ([ce46386](https://github.com/google/adk-python/commit/ce4638651f376fb6579993d8468ae57198134729))
* Update gemini_llm_connection.py - typo spelling correction ([e6e2767](https://github.com/google/adk-python/commit/e6e2767c3901a14187f5527540f318317dd6c8e3))
* Announce the first ADK Community Call in the README ([731bb90](https://github.com/google/adk-python/commit/731bb9078d01359ae770719a8f5c003680ed9f3e))
## [1.16.0](https://github.com/google/adk-python/compare/v1.15.1...v1.16.0) (2025-10-08)
### Features
* **[Core]**
* Implementation of LLM context compaction ([e0dd06f](https://github.com/google/adk-python/commit/e0dd06ff04f9d3c2f022873ce145aaae2de02f45))
* Support pause and resume an invocation in ADK ([ce9c39f](https://github.com/google/adk-python/commit/ce9c39f5a85ed12c22009693b5e6bc65f4641633),
[2f1040f](https://github.com/google/adk-python/commit/2f1040f296db365080b62d6372474d90196ce0d6),
[1ee01cc](https://github.com/google/adk-python/commit/1ee01cc05add44ce460d2cfd3726dceb0c76dceb),
[f005414](https://github.com/google/adk-python/commit/f005414895a57befe880fd58c0d778e499a20d8e),
[fbf7576](https://github.com/google/adk-python/commit/fbf75761bb8d89a70b32c43bbd3fa2f48b81d67c))
* **[Models]**
* Add `citation_metadata` to `LlmResponse` ([3f28e30](https://github.com/google/adk-python/commit/3f28e30c6da192e90a8100f270274cb9a55a5348))
* Add support for gemma model via gemini api ([2b5acb9](https://github.com/google/adk-python/commit/2b5acb98f577f5349e788bcf9910c8d7107e63b3))
* **[Tools]**
* Add `dry_run` functionality to BigQuery `execute_sql` tool ([960eda3](https://github.com/google/adk-python/commit/960eda3d1f2f46dc93a365eb3de03dc3483fe9bb))
* Add BigQuery analyze_contribution tool ([4bb089d](https://github.com/google/adk-python/commit/4bb089d386d4e8133e9aadbba5c42d31ff281cf6))
* Spanner ADK toolset supports customizable template SQL and parameterized SQL ([da62700](https://github.com/google/adk-python/commit/da62700d739cb505149554962a8bcfb30f9428cc))
* Support OAuth2 client credentials grant type ([5c6cdcd](https://github.com/google/adk-python/commit/5c6cdcd197a6780fc86d9183fa208f78c8a975d9))
* Add `ReflectRetryToolPlugin` to reflect from errors and retry with different arguments when tool errors ([e55b894](https://github.com/google/adk-python/commit/e55b8946d6a2e01aaf018d6a79d11d13c5286152))
* Support using `VertexAiSearchTool` built-in tool with other tools in the same agent ([4485379](https://github.com/google/adk-python/commit/4485379a049a5c84583a43c85d444ea1f1ba6f12))
* Support using google search built-in tool with other tools in the same agent ([d3148da](https://github.com/google/adk-python/commit/d3148dacc97f0a9a39b6d7a9640f7b7b0d6f9a6c))
* **[Evals]**
* Add HallucinationsV1 evaluation metric ([8c73d29](https://github.com/google/adk-python/commit/8c73d29c7557a75d64917ac503da519361d1d762))
* Add Rubric based tool use metric ([c984b9e](https://github.com/google/adk-python/commit/c984b9e5529b48fff64865a8b805e7e93942ea53))
* **[UI]**
* Adds `adk web` options for custom logo ([822efe0](https://github.com/google/adk-python/commit/822efe00659607bad2d19ec9a2d14c649fca2d8d))
* **[Observability]**
* **otel:** Switch CloudTraceSpanExporter to telemetry.googleapis.com ([bd76b46](https://github.com/google/adk-python/commit/bd76b46ce296409d929ae69c5c43347c73e7b365))
### Bug Fixes
* Adapt to new computer use tool name in genai sdk 1.41.0 ([c6dd444](https://github.com/google/adk-python/commit/c6dd444fc947571d089b784fde3a81e17b10cf28))
* Add AuthConfig json serialization in vertex ai session service ([636def3](http
gitextract_mn7a6x6v/
├── .gemini/
│ └── settings.json
├── .github/
│ ├── .release-please-manifest-v2.json
│ ├── .release-please-manifest.json
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.md
│ │ └── feature_request.md
│ ├── pull_request_template.md
│ ├── release-please-config-v2.json
│ ├── release-please-config.json
│ └── workflows/
│ ├── analyze-releases-for-adk-docs-updates.yml
│ ├── check-file-contents.yml
│ ├── copybara-pr-handler.yml
│ ├── discussion_answering.yml
│ ├── isort.yml
│ ├── issue-monitor.yml
│ ├── mypy-new-errors.yml
│ ├── mypy.yml
│ ├── pr-triage.yml
│ ├── pyink.yml
│ ├── python-unit-tests.yml
│ ├── release-cherry-pick.yml
│ ├── release-cut.yml
│ ├── release-finalize.yml
│ ├── release-please.yml
│ ├── release-publish.yml
│ ├── release-v2-cherry-pick.yml
│ ├── release-v2-cut.yml
│ ├── release-v2-finalize.yml
│ ├── release-v2-please.yml
│ ├── release-v2-publish.yml
│ ├── stale-bot.yml
│ ├── triage.yml
│ ├── upload-adk-docs-to-vertex-ai-search.yml
│ └── v2-sync.yml
├── .gitignore
├── AGENTS.md
├── CHANGELOG.md
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── autoformat.sh
├── contributing/
│ ├── README.md
│ ├── adk_project_overview_and_architecture.md
│ ├── dev/
│ │ └── utils/
│ │ └── build_llms_txt.py
│ └── samples/
│ ├── a2a_auth/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── remote_a2a/
│ │ └── bigquery_agent/
│ │ ├── __init__.py
│ │ ├── agent.json
│ │ └── agent.py
│ ├── a2a_basic/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── remote_a2a/
│ │ └── check_prime_agent/
│ │ ├── __init__.py
│ │ ├── agent.json
│ │ └── agent.py
│ ├── a2a_human_in_loop/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── remote_a2a/
│ │ └── human_in_loop/
│ │ ├── __init__.py
│ │ ├── agent.json
│ │ └── agent.py
│ ├── a2a_root/
│ │ ├── README.md
│ │ ├── agent.py
│ │ └── remote_a2a/
│ │ └── hello_world/
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── adk_answering_agent/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ ├── gemini_assistant/
│ │ │ ├── __init__.py
│ │ │ └── agent.py
│ │ ├── main.py
│ │ ├── settings.py
│ │ ├── tools.py
│ │ ├── upload_docs_to_vertex_ai_search.py
│ │ └── utils.py
│ ├── adk_documentation/
│ │ ├── __init__.py
│ │ ├── adk_docs_updater/
│ │ │ ├── __init__.py
│ │ │ ├── agent.py
│ │ │ └── main.py
│ │ ├── adk_release_analyzer/
│ │ │ ├── README.md
│ │ │ ├── __init__.py
│ │ │ ├── agent.py
│ │ │ └── main.py
│ │ ├── settings.py
│ │ ├── tools.py
│ │ └── utils.py
│ ├── adk_issue_formatting_agent/
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ ├── settings.py
│ │ └── utils.py
│ ├── adk_issue_monitoring_agent/
│ │ ├── PROMPT_INSTRUCTION.txt
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ ├── main.py
│ │ ├── settings.py
│ │ └── utils.py
│ ├── adk_knowledge_agent/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── agent.json
│ │ ├── agent.py
│ │ └── requirements.txt
│ ├── adk_pr_agent/
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── main.py
│ ├── adk_pr_triaging_agent/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ ├── main.py
│ │ ├── settings.py
│ │ └── utils.py
│ ├── adk_stale_agent/
│ │ ├── PROMPT_INSTRUCTION.txt
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ ├── main.py
│ │ ├── settings.py
│ │ └── utils.py
│ ├── adk_triaging_agent/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ ├── main.py
│ │ ├── settings.py
│ │ └── utils.py
│ ├── agent_engine_code_execution/
│ │ ├── README
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── agent_registry_agent/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── api_registry_agent/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── application_integration_agent/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── artifact_save_text/
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── authn-adk-all-in-one/
│ │ ├── README.md
│ │ ├── adk_agents/
│ │ │ ├── agent_openapi_tools/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── agent.py
│ │ │ │ └── openapi.yaml
│ │ │ ├── requirements.txt
│ │ │ └── sample.env
│ │ ├── hotel_booker_app/
│ │ │ ├── hotelbooker_core.py
│ │ │ ├── main.py
│ │ │ └── openapi.yaml
│ │ ├── idp/
│ │ │ ├── app.py
│ │ │ ├── sample.env
│ │ │ ├── sample.jwks.json
│ │ │ └── templates/
│ │ │ ├── admin.html
│ │ │ ├── consent.html
│ │ │ └── login.html
│ │ └── requirements.txt
│ ├── bigquery/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── bigquery_mcp/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── bigtable/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── built_in_multi_tools/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── cache_analysis/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ ├── run_cache_experiments.py
│ │ └── utils.py
│ ├── callbacks/
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── main.py
│ ├── code_execution/
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── gke_sandbox_agent.py
│ ├── computer_use/
│ │ ├── README.md
│ │ ├── agent.py
│ │ ├── playwright.py
│ │ └── requirements.txt
│ ├── context_offloading_with_artifact/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── core_basic_config/
│ │ ├── README.md
│ │ └── root_agent.yaml
│ ├── core_callback_config/
│ │ ├── __init__.py
│ │ ├── callbacks.py
│ │ ├── root_agent.yaml
│ │ └── tools.py
│ ├── core_custom_agent_config/
│ │ ├── __init__.py
│ │ ├── my_agents.py
│ │ └── root_agent.yaml
│ ├── core_generate_content_config_config/
│ │ └── root_agent.yaml
│ ├── crewai_tool_kwargs/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── main.py
│ ├── custom_code_execution/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── data_agent/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── dummy_services.py
│ ├── fields_output_schema/
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── fields_planner/
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── main.py
│ ├── files_retrieval_agent/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── data/
│ │ ├── adk_overview.txt
│ │ └── tools_guide.txt
│ ├── generate_image/
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── sample.session.json
│ ├── gepa/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── adk_agent.py
│ │ ├── adk_agent_test.py
│ │ ├── experiment.py
│ │ ├── gepa_tau_bench.ipynb
│ │ ├── rater_lib.py
│ │ ├── rubric_validation_template.txt
│ │ ├── run_experiment.py
│ │ ├── tau_bench_agent.py
│ │ ├── utils.py
│ │ └── voter_agent/
│ │ ├── eval_prompts.txt
│ │ ├── gepa.ipynb
│ │ ├── optimized_prompt.txt
│ │ ├── prompts.txt
│ │ ├── rubric_validation_template.txt
│ │ └── tools.py
│ ├── gke_agent_sandbox/
│ │ └── deployment_rbac.yaml
│ ├── google_api/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── google_search_agent/
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── hello_world/
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── main.py
│ ├── hello_world_anthropic/
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── main.py
│ ├── hello_world_apigeellm/
│ │ ├── .env-sample
│ │ ├── README.md
│ │ ├── agent.py
│ │ └── main.py
│ ├── hello_world_app/
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── main.py
│ ├── hello_world_gemma/
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── main.py
│ ├── hello_world_gemma3_ollama/
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── main.py
│ ├── hello_world_litellm/
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── main.py
│ ├── hello_world_litellm_add_function_to_prompt/
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── main.py
│ ├── hello_world_ma/
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── hello_world_ollama/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── main.py
│ ├── hello_world_stream_fc_args/
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── history_management/
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── main.py
│ ├── human_in_loop/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── main.py
│ ├── human_tool_confirmation/
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── integration_connector_euc_agent/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── interactions_api/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── main.py
│ ├── jira_agent/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── tools.py
│ ├── json_passing_agent/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── main.py
│ ├── langchain_structured_tool_agent/
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── langchain_youtube_search_agent/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── requirements.txt
│ ├── litellm_inline_tool_call/
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── litellm_streaming/
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── main.py
│ ├── litellm_structured_output/
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── litellm_with_fallback_models/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── live_agent_api_server_example/
│ │ ├── live_agent_example.py
│ │ └── readme.md
│ ├── live_bidi_debug_utils/
│ │ └── pcm_audio_player.py
│ ├── live_bidi_streaming_multi_agent/
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── readme.md
│ ├── live_bidi_streaming_single_agent/
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── readme.md
│ ├── live_bidi_streaming_tools_agent/
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── readme.md
│ ├── live_tool_callbacks_agent/
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── readme.md
│ ├── logprobs/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── manual_ollama_test/
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── mcp_dynamic_header_agent/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── header_server.py
│ ├── mcp_in_agent_tool_remote/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── mcp_in_agent_tool_stdio/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── mcp_postgres_agent/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── mcp_progress_callback_agent/
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── mock_progress_server.py
│ ├── mcp_server_side_sampling/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── mcp_server.py
│ ├── mcp_service_account_agent/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── mcp_sse_agent/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── filesystem_server.py
│ ├── mcp_stdio_notion_agent/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── mcp_stdio_server_agent/
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── mcp_streamablehttp_agent/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── filesystem_server.py
│ ├── mcp_toolset_auth/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ ├── main.py
│ │ └── oauth_mcp_server.py
│ ├── memory/
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── main.py
│ ├── migrate_session_db/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ ├── main.py
│ │ └── sample-output/
│ │ ├── alembic/
│ │ │ ├── README
│ │ │ ├── env.py
│ │ │ └── script.py.mako
│ │ └── alembic.ini
│ ├── multi_agent_basic_config/
│ │ ├── README.md
│ │ ├── code_tutor_agent.yaml
│ │ ├── math_tutor_agent.yaml
│ │ └── root_agent.yaml
│ ├── multi_agent_llm_config/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── prime_agent.yaml
│ │ ├── roll_agent.yaml
│ │ └── root_agent.yaml
│ ├── multi_agent_loop_config/
│ │ ├── README.md
│ │ ├── loop_agent.yaml
│ │ ├── root_agent.yaml
│ │ └── writer_agents/
│ │ ├── critic_agent.yaml
│ │ ├── initial_writer_agent.yaml
│ │ └── refiner_agent.yaml
│ ├── multi_agent_seq_config/
│ │ ├── README.md
│ │ ├── root_agent.yaml
│ │ └── sub_agents/
│ │ ├── code_refactorer_agent.yaml
│ │ ├── code_reviewer_agent.yaml
│ │ └── code_writer_agent.yaml
│ ├── multimodal_tool_results/
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── non_llm_sequential/
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── oauth2_client_credentials/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ ├── main.py
│ │ └── oauth2_test_server.py
│ ├── oauth_calendar_agent/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── output_schema_with_tools/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── parallel_functions/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── plugin_basic/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── count_plugin.py
│ │ └── main.py
│ ├── plugin_debug_logging/
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── plugin_reflect_tool_retry/
│ │ ├── README.md
│ │ ├── basic/
│ │ │ ├── __init__.py
│ │ │ └── agent.py
│ │ └── hallucinating_func_name/
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── postgres_session_service/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ ├── compose.yml
│ │ └── main.py
│ ├── pubsub/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── pydantic_argument/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── main.py
│ ├── quickstart/
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── rag_agent/
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── rewind_session/
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── main.py
│ ├── runner_debug_example/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── main.py
│ ├── services.py
│ ├── services.yaml
│ ├── session_state_agent/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── input.json
│ ├── simple_sequential_agent/
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── skills_agent/
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── skills/
│ │ ├── weather-skill/
│ │ │ ├── SKILL.md
│ │ │ ├── references/
│ │ │ │ └── weather_info.md
│ │ │ └── scripts/
│ │ │ └── get_humidity.py
│ │ └── weather_skill/
│ │ └── SKILL.md
│ ├── skills_agent_gcs/
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── slack_agent/
│ │ └── agent.py
│ ├── spanner/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── spanner_admin/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── spanner_rag_agent/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── static_instruction/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── main.py
│ ├── static_non_text_content/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── main.py
│ ├── sub_agents_config/
│ │ ├── __init__.py
│ │ ├── life_agent.py
│ │ ├── root_agent.yaml
│ │ └── work_agent.yaml
│ ├── telemetry/
│ │ ├── agent.py
│ │ └── main.py
│ ├── token_usage/
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── main.py
│ ├── tool_agent_tool_config/
│ │ ├── root_agent.yaml
│ │ ├── summarizer_agent.yaml
│ │ └── web_search_agent.yaml
│ ├── tool_builtin_config/
│ │ └── root_agent.yaml
│ ├── tool_functions_config/
│ │ ├── __init__.py
│ │ ├── root_agent.yaml
│ │ └── tools.py
│ ├── tool_human_in_the_loop_config/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── root_agent.yaml
│ │ └── tools.py
│ ├── tool_mcp_stdio_notion_config/
│ │ ├── README.md
│ │ └── root_agent.yaml
│ ├── toolbox_agent/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ └── tools.yaml
│ ├── vertex_code_execution/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ └── agent.py
│ ├── workflow_agent_seq/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ ├── main.py
│ │ └── sample.output
│ └── workflow_triage/
│ ├── README.md
│ ├── __init__.py
│ ├── agent.py
│ └── execution_agent.py
├── llms-full.txt
├── llms.txt
├── pylintrc
├── pyproject.toml
├── scripts/
│ ├── db_migration.sh
│ └── unittests.sh
├── src/
│ └── google/
│ └── adk/
│ ├── __init__.py
│ ├── a2a/
│ │ ├── __init__.py
│ │ ├── agent/
│ │ │ ├── __init__.py
│ │ │ ├── config.py
│ │ │ ├── interceptors/
│ │ │ │ ├── __init__.py
│ │ │ │ └── new_integration_extension.py
│ │ │ └── utils.py
│ │ ├── converters/
│ │ │ ├── __init__.py
│ │ │ ├── event_converter.py
│ │ │ ├── from_adk_event.py
│ │ │ ├── long_running_functions.py
│ │ │ ├── part_converter.py
│ │ │ ├── request_converter.py
│ │ │ ├── to_adk_event.py
│ │ │ └── utils.py
│ │ ├── executor/
│ │ │ ├── __init__.py
│ │ │ ├── a2a_agent_executor.py
│ │ │ ├── a2a_agent_executor_impl.py
│ │ │ ├── config.py
│ │ │ ├── executor_context.py
│ │ │ ├── task_result_aggregator.py
│ │ │ └── utils.py
│ │ ├── experimental.py
│ │ └── utils/
│ │ ├── __init__.py
│ │ ├── agent_card_builder.py
│ │ └── agent_to_a2a.py
│ ├── agents/
│ │ ├── __init__.py
│ │ ├── active_streaming_tool.py
│ │ ├── agent_config.py
│ │ ├── base_agent.py
│ │ ├── base_agent_config.py
│ │ ├── callback_context.py
│ │ ├── common_configs.py
│ │ ├── config_agent_utils.py
│ │ ├── config_schemas/
│ │ │ └── AgentConfig.json
│ │ ├── context.py
│ │ ├── context_cache_config.py
│ │ ├── invocation_context.py
│ │ ├── langgraph_agent.py
│ │ ├── live_request_queue.py
│ │ ├── llm_agent.py
│ │ ├── llm_agent_config.py
│ │ ├── loop_agent.py
│ │ ├── loop_agent_config.py
│ │ ├── mcp_instruction_provider.py
│ │ ├── parallel_agent.py
│ │ ├── parallel_agent_config.py
│ │ ├── readonly_context.py
│ │ ├── remote_a2a_agent.py
│ │ ├── run_config.py
│ │ ├── sequential_agent.py
│ │ ├── sequential_agent_config.py
│ │ └── transcription_entry.py
│ ├── apps/
│ │ ├── __init__.py
│ │ ├── app.py
│ │ ├── base_events_summarizer.py
│ │ ├── compaction.py
│ │ └── llm_event_summarizer.py
│ ├── artifacts/
│ │ ├── __init__.py
│ │ ├── artifact_util.py
│ │ ├── base_artifact_service.py
│ │ ├── file_artifact_service.py
│ │ ├── gcs_artifact_service.py
│ │ └── in_memory_artifact_service.py
│ ├── auth/
│ │ ├── __init__.py
│ │ ├── auth_credential.py
│ │ ├── auth_handler.py
│ │ ├── auth_preprocessor.py
│ │ ├── auth_provider_registry.py
│ │ ├── auth_schemes.py
│ │ ├── auth_tool.py
│ │ ├── base_auth_provider.py
│ │ ├── credential_manager.py
│ │ ├── credential_service/
│ │ │ ├── __init__.py
│ │ │ ├── base_credential_service.py
│ │ │ ├── in_memory_credential_service.py
│ │ │ └── session_state_credential_service.py
│ │ ├── exchanger/
│ │ │ ├── __init__.py
│ │ │ ├── base_credential_exchanger.py
│ │ │ ├── credential_exchanger_registry.py
│ │ │ └── oauth2_credential_exchanger.py
│ │ ├── oauth2_credential_util.py
│ │ ├── oauth2_discovery.py
│ │ └── refresher/
│ │ ├── __init__.py
│ │ ├── base_credential_refresher.py
│ │ ├── credential_refresher_registry.py
│ │ └── oauth2_credential_refresher.py
│ ├── cli/
│ │ ├── __init__.py
│ │ ├── __main__.py
│ │ ├── adk_web_server.py
│ │ ├── agent_graph.py
│ │ ├── browser/
│ │ │ ├── assets/
│ │ │ │ ├── audio-processor.js
│ │ │ │ └── config/
│ │ │ │ └── runtime-config.json
│ │ │ ├── chunk-5MGPUGAY.js
│ │ │ ├── chunk-66RH7XMI.js
│ │ │ ├── chunk-AF27AUNK.js
│ │ │ ├── chunk-ARP3QDVK.js
│ │ │ ├── chunk-BI6TV3NL.js
│ │ │ ├── chunk-FZZPD3K2.js
│ │ │ ├── chunk-GFARMTUE.js
│ │ │ ├── chunk-GLGQFQO2.js
│ │ │ ├── chunk-GLGRLUIJ.js
│ │ │ ├── chunk-MBYWPZQV.js
│ │ │ ├── chunk-N3RKSFBU.js
│ │ │ ├── chunk-R2IMOXM4.js
│ │ │ ├── chunk-RGCH6K7F.js
│ │ │ ├── chunk-ROC2DVJ2.js
│ │ │ ├── chunk-SGO5R2ED.js
│ │ │ ├── chunk-W7GRJBO5.js
│ │ │ ├── chunk-YI5XBR2B.js
│ │ │ ├── chunk-ZLSAKILO.js
│ │ │ ├── index.html
│ │ │ ├── main-7SJG752M.js
│ │ │ ├── polyfills-5CFQRCPP.js
│ │ │ └── styles-YY6V3TJU.css
│ │ ├── built_in_agents/
│ │ │ ├── README.md
│ │ │ ├── __init__.py
│ │ │ ├── adk_agent_builder_assistant.py
│ │ │ ├── agent.py
│ │ │ ├── instruction_embedded.template
│ │ │ ├── sub_agents/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── google_search_agent.py
│ │ │ │ └── url_context_agent.py
│ │ │ ├── tools/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── cleanup_unused_files.py
│ │ │ │ ├── delete_files.py
│ │ │ │ ├── explore_project.py
│ │ │ │ ├── query_schema.py
│ │ │ │ ├── read_config_files.py
│ │ │ │ ├── read_files.py
│ │ │ │ ├── search_adk_knowledge.py
│ │ │ │ ├── search_adk_source.py
│ │ │ │ ├── write_config_files.py
│ │ │ │ └── write_files.py
│ │ │ └── utils/
│ │ │ ├── __init__.py
│ │ │ ├── adk_source_utils.py
│ │ │ ├── path_normalizer.py
│ │ │ └── resolve_root_directory.py
│ │ ├── cli.py
│ │ ├── cli_create.py
│ │ ├── cli_deploy.py
│ │ ├── cli_eval.py
│ │ ├── cli_tools_click.py
│ │ ├── conformance/
│ │ │ ├── __init__.py
│ │ │ ├── _conformance_test_google_llm.py
│ │ │ ├── _generate_markdown_utils.py
│ │ │ ├── _generated_file_utils.py
│ │ │ ├── _replay_validators.py
│ │ │ ├── adk_web_server_client.py
│ │ │ ├── cli_record.py
│ │ │ ├── cli_test.py
│ │ │ └── test_case.py
│ │ ├── fast_api.py
│ │ ├── plugins/
│ │ │ ├── __init__.py
│ │ │ ├── recordings_plugin.py
│ │ │ ├── recordings_schema.py
│ │ │ └── replay_plugin.py
│ │ ├── service_registry.py
│ │ └── utils/
│ │ ├── __init__.py
│ │ ├── agent_change_handler.py
│ │ ├── agent_loader.py
│ │ ├── base_agent_loader.py
│ │ ├── cleanup.py
│ │ ├── common.py
│ │ ├── dot_adk_folder.py
│ │ ├── envs.py
│ │ ├── evals.py
│ │ ├── local_storage.py
│ │ ├── logs.py
│ │ ├── service_factory.py
│ │ ├── shared_value.py
│ │ └── state.py
│ ├── code_executors/
│ │ ├── __init__.py
│ │ ├── agent_engine_sandbox_code_executor.py
│ │ ├── base_code_executor.py
│ │ ├── built_in_code_executor.py
│ │ ├── code_execution_utils.py
│ │ ├── code_executor_context.py
│ │ ├── container_code_executor.py
│ │ ├── gke_code_executor.py
│ │ ├── unsafe_local_code_executor.py
│ │ └── vertex_ai_code_executor.py
│ ├── dependencies/
│ │ ├── __init__.py
│ │ ├── rouge_scorer.py
│ │ └── vertexai.py
│ ├── errors/
│ │ ├── __init__.py
│ │ ├── already_exists_error.py
│ │ ├── input_validation_error.py
│ │ ├── not_found_error.py
│ │ ├── session_not_found_error.py
│ │ └── tool_execution_error.py
│ ├── evaluation/
│ │ ├── __init__.py
│ │ ├── _eval_set_results_manager_utils.py
│ │ ├── _eval_sets_manager_utils.py
│ │ ├── _retry_options_utils.py
│ │ ├── agent_evaluator.py
│ │ ├── app_details.py
│ │ ├── base_eval_service.py
│ │ ├── common.py
│ │ ├── constants.py
│ │ ├── conversation_scenarios.py
│ │ ├── custom_metric_evaluator.py
│ │ ├── eval_case.py
│ │ ├── eval_config.py
│ │ ├── eval_metrics.py
│ │ ├── eval_result.py
│ │ ├── eval_rubrics.py
│ │ ├── eval_set.py
│ │ ├── eval_set_results_manager.py
│ │ ├── eval_sets_manager.py
│ │ ├── evaluation_constants.py
│ │ ├── evaluation_generator.py
│ │ ├── evaluator.py
│ │ ├── final_response_match_v1.py
│ │ ├── final_response_match_v2.py
│ │ ├── gcs_eval_set_results_manager.py
│ │ ├── gcs_eval_sets_manager.py
│ │ ├── hallucinations_v1.py
│ │ ├── in_memory_eval_sets_manager.py
│ │ ├── llm_as_judge.py
│ │ ├── llm_as_judge_utils.py
│ │ ├── local_eval_service.py
│ │ ├── local_eval_set_results_manager.py
│ │ ├── local_eval_sets_manager.py
│ │ ├── metric_evaluator_registry.py
│ │ ├── metric_info_providers.py
│ │ ├── multi_turn_task_success_evaluator.py
│ │ ├── multi_turn_tool_use_quality_evaluator.py
│ │ ├── multi_turn_trajectory_quality_evaluator.py
│ │ ├── request_intercepter_plugin.py
│ │ ├── response_evaluator.py
│ │ ├── rubric_based_evaluator.py
│ │ ├── rubric_based_final_response_quality_v1.py
│ │ ├── rubric_based_tool_use_quality_v1.py
│ │ ├── safety_evaluator.py
│ │ ├── simulation/
│ │ │ ├── __init__.py
│ │ │ ├── llm_backed_user_simulator.py
│ │ │ ├── llm_backed_user_simulator_prompts.py
│ │ │ ├── per_turn_user_simulator_quality_prompts.py
│ │ │ ├── per_turn_user_simulator_quality_v1.py
│ │ │ ├── pre_built_personas.py
│ │ │ ├── static_user_simulator.py
│ │ │ ├── user_simulator.py
│ │ │ ├── user_simulator_personas.py
│ │ │ └── user_simulator_provider.py
│ │ ├── trajectory_evaluator.py
│ │ └── vertex_ai_eval_facade.py
│ ├── events/
│ │ ├── __init__.py
│ │ ├── event.py
│ │ ├── event_actions.py
│ │ └── ui_widget.py
│ ├── examples/
│ │ ├── __init__.py
│ │ ├── base_example_provider.py
│ │ ├── example.py
│ │ ├── example_util.py
│ │ └── vertex_ai_example_store.py
│ ├── features/
│ │ ├── __init__.py
│ │ ├── _feature_decorator.py
│ │ └── _feature_registry.py
│ ├── flows/
│ │ ├── __init__.py
│ │ └── llm_flows/
│ │ ├── __init__.py
│ │ ├── _base_llm_processor.py
│ │ ├── _code_execution.py
│ │ ├── _nl_planning.py
│ │ ├── _output_schema_processor.py
│ │ ├── agent_transfer.py
│ │ ├── audio_cache_manager.py
│ │ ├── audio_transcriber.py
│ │ ├── auto_flow.py
│ │ ├── base_llm_flow.py
│ │ ├── basic.py
│ │ ├── compaction.py
│ │ ├── contents.py
│ │ ├── context_cache_processor.py
│ │ ├── functions.py
│ │ ├── identity.py
│ │ ├── instructions.py
│ │ ├── interactions_processor.py
│ │ ├── request_confirmation.py
│ │ ├── single_flow.py
│ │ └── transcription_manager.py
│ ├── integrations/
│ │ ├── README.md
│ │ ├── agent_registry/
│ │ │ ├── __init__.py
│ │ │ └── agent_registry.py
│ │ ├── api_registry/
│ │ │ ├── __init__.py
│ │ │ └── api_registry.py
│ │ ├── crewai/
│ │ │ ├── __init__.py
│ │ │ └── crewai_tool.py
│ │ ├── langchain/
│ │ │ ├── __init__.py
│ │ │ └── langchain_tool.py
│ │ └── slack/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ └── slack_runner.py
│ ├── memory/
│ │ ├── __init__.py
│ │ ├── _utils.py
│ │ ├── base_memory_service.py
│ │ ├── in_memory_memory_service.py
│ │ ├── memory_entry.py
│ │ ├── vertex_ai_memory_bank_service.py
│ │ └── vertex_ai_rag_memory_service.py
│ ├── models/
│ │ ├── __init__.py
│ │ ├── anthropic_llm.py
│ │ ├── apigee_llm.py
│ │ ├── base_llm.py
│ │ ├── base_llm_connection.py
│ │ ├── cache_metadata.py
│ │ ├── gemini_context_cache_manager.py
│ │ ├── gemini_llm_connection.py
│ │ ├── gemma_llm.py
│ │ ├── google_llm.py
│ │ ├── interactions_utils.py
│ │ ├── lite_llm.py
│ │ ├── llm_request.py
│ │ ├── llm_response.py
│ │ └── registry.py
│ ├── optimization/
│ │ ├── __init__.py
│ │ ├── agent_optimizer.py
│ │ ├── data_types.py
│ │ ├── gepa_root_agent_prompt_optimizer.py
│ │ ├── local_eval_sampler.py
│ │ ├── sampler.py
│ │ └── simple_prompt_optimizer.py
│ ├── planners/
│ │ ├── __init__.py
│ │ ├── base_planner.py
│ │ ├── built_in_planner.py
│ │ └── plan_re_act_planner.py
│ ├── platform/
│ │ ├── __init__.py
│ │ ├── thread.py
│ │ ├── time.py
│ │ └── uuid.py
│ ├── plugins/
│ │ ├── __init__.py
│ │ ├── base_plugin.py
│ │ ├── bigquery_agent_analytics_plugin.py
│ │ ├── context_filter_plugin.py
│ │ ├── debug_logging_plugin.py
│ │ ├── global_instruction_plugin.py
│ │ ├── logging_plugin.py
│ │ ├── multimodal_tool_results_plugin.py
│ │ ├── plugin_manager.py
│ │ ├── reflect_retry_tool_plugin.py
│ │ └── save_files_as_artifacts_plugin.py
│ ├── py.typed
│ ├── runners.py
│ ├── sessions/
│ │ ├── __init__.py
│ │ ├── _session_util.py
│ │ ├── base_session_service.py
│ │ ├── database_session_service.py
│ │ ├── in_memory_session_service.py
│ │ ├── migration/
│ │ │ ├── README.md
│ │ │ ├── _schema_check_utils.py
│ │ │ ├── migrate_from_sqlalchemy_pickle.py
│ │ │ ├── migrate_from_sqlalchemy_sqlite.py
│ │ │ └── migration_runner.py
│ │ ├── schemas/
│ │ │ ├── shared.py
│ │ │ ├── v0.py
│ │ │ └── v1.py
│ │ ├── session.py
│ │ ├── sqlite_session_service.py
│ │ ├── state.py
│ │ └── vertex_ai_session_service.py
│ ├── skills/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── _utils.py
│ │ ├── models.py
│ │ └── prompt.py
│ ├── telemetry/
│ │ ├── __init__.py
│ │ ├── _experimental_semconv.py
│ │ ├── google_cloud.py
│ │ ├── setup.py
│ │ ├── sqlite_span_exporter.py
│ │ └── tracing.py
│ ├── tools/
│ │ ├── __init__.py
│ │ ├── _automatic_function_calling_util.py
│ │ ├── _forwarding_artifact_service.py
│ │ ├── _function_parameter_parse_util.py
│ │ ├── _function_tool_declarations.py
│ │ ├── _gemini_schema_util.py
│ │ ├── _google_credentials.py
│ │ ├── _memory_entry_utils.py
│ │ ├── agent_simulator/
│ │ │ ├── __init__.py
│ │ │ ├── agent_simulator_config.py
│ │ │ ├── agent_simulator_engine.py
│ │ │ ├── agent_simulator_factory.py
│ │ │ ├── agent_simulator_plugin.py
│ │ │ ├── strategies/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── base.py
│ │ │ │ └── tool_spec_mock_strategy.py
│ │ │ ├── tool_connection_analyzer.py
│ │ │ └── tool_connection_map.py
│ │ ├── agent_tool.py
│ │ ├── api_registry.py
│ │ ├── apihub_tool/
│ │ │ ├── __init__.py
│ │ │ ├── apihub_toolset.py
│ │ │ └── clients/
│ │ │ ├── __init__.py
│ │ │ ├── apihub_client.py
│ │ │ └── secret_client.py
│ │ ├── application_integration_tool/
│ │ │ ├── __init__.py
│ │ │ ├── application_integration_toolset.py
│ │ │ ├── clients/
│ │ │ │ ├── connections_client.py
│ │ │ │ └── integration_client.py
│ │ │ └── integration_connector_tool.py
│ │ ├── authenticated_function_tool.py
│ │ ├── base_authenticated_tool.py
│ │ ├── base_tool.py
│ │ ├── base_toolset.py
│ │ ├── bash_tool.py
│ │ ├── bigquery/
│ │ │ ├── __init__.py
│ │ │ ├── bigquery_credentials.py
│ │ │ ├── bigquery_toolset.py
│ │ │ ├── client.py
│ │ │ ├── config.py
│ │ │ ├── data_insights_tool.py
│ │ │ ├── metadata_tool.py
│ │ │ ├── query_tool.py
│ │ │ └── search_tool.py
│ │ ├── bigtable/
│ │ │ ├── __init__.py
│ │ │ ├── bigtable_credentials.py
│ │ │ ├── bigtable_toolset.py
│ │ │ ├── client.py
│ │ │ ├── metadata_tool.py
│ │ │ ├── query_tool.py
│ │ │ └── settings.py
│ │ ├── computer_use/
│ │ │ ├── __init__.py
│ │ │ ├── base_computer.py
│ │ │ ├── computer_use_tool.py
│ │ │ └── computer_use_toolset.py
│ │ ├── crewai_tool.py
│ │ ├── data_agent/
│ │ │ ├── __init__.py
│ │ │ ├── config.py
│ │ │ ├── credentials.py
│ │ │ ├── data_agent_tool.py
│ │ │ └── data_agent_toolset.py
│ │ ├── discovery_engine_search_tool.py
│ │ ├── enterprise_search_tool.py
│ │ ├── environment_simulation/
│ │ │ ├── __init__.py
│ │ │ ├── environment_simulation_config.py
│ │ │ ├── environment_simulation_engine.py
│ │ │ ├── environment_simulation_factory.py
│ │ │ ├── environment_simulation_plugin.py
│ │ │ ├── strategies/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── base.py
│ │ │ │ └── tool_spec_mock_strategy.py
│ │ │ ├── tool_connection_analyzer.py
│ │ │ └── tool_connection_map.py
│ │ ├── example_tool.py
│ │ ├── exit_loop_tool.py
│ │ ├── function_tool.py
│ │ ├── get_user_choice_tool.py
│ │ ├── google_api_tool/
│ │ │ ├── __init__.py
│ │ │ ├── google_api_tool.py
│ │ │ ├── google_api_toolset.py
│ │ │ ├── google_api_toolsets.py
│ │ │ └── googleapi_to_openapi_converter.py
│ │ ├── google_maps_grounding_tool.py
│ │ ├── google_search_agent_tool.py
│ │ ├── google_search_tool.py
│ │ ├── google_tool.py
│ │ ├── langchain_tool.py
│ │ ├── load_artifacts_tool.py
│ │ ├── load_mcp_resource_tool.py
│ │ ├── load_memory_tool.py
│ │ ├── load_web_page.py
│ │ ├── long_running_tool.py
│ │ ├── mcp_tool/
│ │ │ ├── __init__.py
│ │ │ ├── conversion_utils.py
│ │ │ ├── mcp_session_manager.py
│ │ │ ├── mcp_tool.py
│ │ │ ├── mcp_toolset.py
│ │ │ └── session_context.py
│ │ ├── openapi_tool/
│ │ │ ├── __init__.py
│ │ │ ├── auth/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── auth_helpers.py
│ │ │ │ └── credential_exchangers/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── auto_auth_credential_exchanger.py
│ │ │ │ ├── base_credential_exchanger.py
│ │ │ │ ├── oauth2_exchanger.py
│ │ │ │ └── service_account_exchanger.py
│ │ │ ├── common/
│ │ │ │ ├── __init__.py
│ │ │ │ └── common.py
│ │ │ └── openapi_spec_parser/
│ │ │ ├── __init__.py
│ │ │ ├── openapi_spec_parser.py
│ │ │ ├── openapi_toolset.py
│ │ │ ├── operation_parser.py
│ │ │ ├── rest_api_tool.py
│ │ │ └── tool_auth_handler.py
│ │ ├── preload_memory_tool.py
│ │ ├── pubsub/
│ │ │ ├── __init__.py
│ │ │ ├── client.py
│ │ │ ├── config.py
│ │ │ ├── message_tool.py
│ │ │ ├── pubsub_credentials.py
│ │ │ └── pubsub_toolset.py
│ │ ├── retrieval/
│ │ │ ├── __init__.py
│ │ │ ├── base_retrieval_tool.py
│ │ │ ├── files_retrieval.py
│ │ │ ├── llama_index_retrieval.py
│ │ │ └── vertex_ai_rag_retrieval.py
│ │ ├── set_model_response_tool.py
│ │ ├── skill_toolset.py
│ │ ├── spanner/
│ │ │ ├── __init__.py
│ │ │ ├── admin_tool.py
│ │ │ ├── admin_toolset.py
│ │ │ ├── client.py
│ │ │ ├── metadata_tool.py
│ │ │ ├── query_tool.py
│ │ │ ├── search_tool.py
│ │ │ ├── settings.py
│ │ │ ├── spanner_credentials.py
│ │ │ ├── spanner_toolset.py
│ │ │ └── utils.py
│ │ ├── tool_configs.py
│ │ ├── tool_confirmation.py
│ │ ├── tool_context.py
│ │ ├── toolbox_toolset.py
│ │ ├── transfer_to_agent_tool.py
│ │ ├── url_context_tool.py
│ │ └── vertex_ai_search_tool.py
│ ├── utils/
│ │ ├── __init__.py
│ │ ├── _client_labels_utils.py
│ │ ├── _debug_output.py
│ │ ├── _google_client_headers.py
│ │ ├── _schema_utils.py
│ │ ├── cache_performance_analyzer.py
│ │ ├── content_utils.py
│ │ ├── context_utils.py
│ │ ├── env_utils.py
│ │ ├── feature_decorator.py
│ │ ├── instructions_utils.py
│ │ ├── model_name_utils.py
│ │ ├── output_schema_utils.py
│ │ ├── streaming_utils.py
│ │ ├── variant_utils.py
│ │ ├── vertex_ai_utils.py
│ │ └── yaml_utils.py
│ └── version.py
└── tests/
├── __init__.py
├── integration/
│ ├── __init__.py
│ ├── conftest.py
│ ├── fixture/
│ │ ├── __init__.py
│ │ ├── agent_with_config/
│ │ │ ├── __init__.py
│ │ │ └── agent.py
│ │ ├── bigquery_agent/
│ │ │ ├── README.md
│ │ │ ├── __init__.py
│ │ │ ├── agent.py
│ │ │ ├── simple.test.json
│ │ │ └── test_config.json
│ │ ├── callback_agent/
│ │ │ ├── __init__.py
│ │ │ └── agent.py
│ │ ├── context_update_test/
│ │ │ ├── __init__.py
│ │ │ ├── agent.py
│ │ │ └── successful_test.session.json
│ │ ├── context_variable_agent/
│ │ │ ├── __init__.py
│ │ │ └── agent.py
│ │ ├── ecommerce_customer_service_agent/
│ │ │ ├── __init__.py
│ │ │ ├── agent.py
│ │ │ ├── order_query.test.json
│ │ │ └── test_config.json
│ │ ├── flow_complex_spark/
│ │ │ ├── __init__.py
│ │ │ ├── agent.py
│ │ │ └── sample.session.json
│ │ ├── hello_world_agent/
│ │ │ ├── __init__.py
│ │ │ ├── agent.py
│ │ │ ├── roll_die.test.json
│ │ │ └── test_config.json
│ │ ├── hello_world_agent_async/
│ │ │ ├── __init__.py
│ │ │ ├── agent.py
│ │ │ ├── roll_die.test.json
│ │ │ └── test_config.json
│ │ ├── home_automation_agent/
│ │ │ ├── __init__.py
│ │ │ ├── agent.py
│ │ │ ├── simple_test.test.json
│ │ │ ├── simple_test2.test.json
│ │ │ ├── test_config.json
│ │ │ └── test_files/
│ │ │ ├── dependent_tool_calls.test.json
│ │ │ ├── memorizing_past_events/
│ │ │ │ ├── eval_data.test.json
│ │ │ │ └── test_config.json
│ │ │ ├── simple_multi_turn_conversation.test.json
│ │ │ ├── simple_test.test.json
│ │ │ ├── simple_test2.test.json
│ │ │ └── test_config.json
│ │ ├── tool_agent/
│ │ │ ├── __init__.py
│ │ │ └── agent.py
│ │ └── trip_planner_agent/
│ │ ├── __init__.py
│ │ ├── agent.py
│ │ ├── test_config.json
│ │ ├── test_files/
│ │ │ ├── test_config.json
│ │ │ └── trip_inquiry_sub_agent.test.json
│ │ └── trip_inquiry_multi_turn.test.json
│ ├── models/
│ │ ├── __init__.py
│ │ ├── test_gemma_llm.py
│ │ ├── test_google_llm.py
│ │ ├── test_litellm_no_function.py
│ │ └── test_litellm_with_function.py
│ ├── test_callback.py
│ ├── test_context_variable.py
│ ├── test_evaluate_agent_in_fixture.py
│ ├── test_multi_agent.py
│ ├── test_multi_turn.py
│ ├── test_single_agent.py
│ ├── test_sub_agent.py
│ ├── test_system_instruction.py
│ ├── test_tools.py
│ ├── test_vertex_ai_search_grounding_streaming.py
│ ├── test_with_test_file.py
│ ├── tools/
│ │ └── __init__.py
│ └── utils/
│ ├── __init__.py
│ ├── asserts.py
│ └── test_runner.py
└── unittests/
├── __init__.py
├── a2a/
│ ├── __init__.py
│ ├── converters/
│ │ ├── __init__.py
│ │ ├── test_event_converter.py
│ │ ├── test_event_round_trip.py
│ │ ├── test_from_adk.py
│ │ ├── test_part_converter.py
│ │ ├── test_request_converter.py
│ │ ├── test_to_adk.py
│ │ └── test_utils.py
│ ├── executor/
│ │ ├── __init__.py
│ │ ├── test_a2a_agent_executor.py
│ │ ├── test_a2a_agent_executor_impl.py
│ │ └── test_task_result_aggregator.py
│ └── utils/
│ ├── __init__.py
│ ├── test_agent_card_builder.py
│ └── test_agent_to_a2a.py
├── agents/
│ ├── __init__.py
│ ├── test_agent_clone.py
│ ├── test_agent_config.py
│ ├── test_base_agent.py
│ ├── test_callback_context.py
│ ├── test_context.py
│ ├── test_context_cache_config.py
│ ├── test_gemini_context_cache_manager.py
│ ├── test_invocation_context.py
│ ├── test_langgraph_agent.py
│ ├── test_live_request_queue.py
│ ├── test_llm_agent_callbacks.py
│ ├── test_llm_agent_error_messages.py
│ ├── test_llm_agent_fields.py
│ ├── test_llm_agent_include_contents.py
│ ├── test_llm_agent_output_save.py
│ ├── test_loop_agent.py
│ ├── test_mcp_instruction_provider.py
│ ├── test_model_callback_chain.py
│ ├── test_parallel_agent.py
│ ├── test_readonly_context.py
│ ├── test_remote_a2a_agent.py
│ ├── test_resumable_llm_agent.py
│ ├── test_run_config.py
│ └── test_sequential_agent.py
├── apps/
│ ├── __init__.py
│ ├── test_apps.py
│ ├── test_compaction.py
│ └── test_llm_event_summarizer.py
├── artifacts/
│ ├── __init__.py
│ ├── test_artifact_service.py
│ └── test_artifact_util.py
├── auth/
│ ├── __init__.py
│ ├── credential_service/
│ │ ├── __init__.py
│ │ ├── test_in_memory_credential_service.py
│ │ └── test_session_state_credential_service.py
│ ├── exchanger/
│ │ ├── __init__.py
│ │ ├── test_credential_exchanger_registry.py
│ │ └── test_oauth2_credential_exchanger.py
│ ├── refresher/
│ │ ├── __init__.py
│ │ ├── test_credential_refresher_registry.py
│ │ └── test_oauth2_credential_refresher.py
│ ├── test_auth_config.py
│ ├── test_auth_handler.py
│ ├── test_auth_preprocessor.py
│ ├── test_auth_provider_registry.py
│ ├── test_credential_manager.py
│ ├── test_oauth2_credential_util.py
│ ├── test_oauth2_discovery.py
│ └── test_toolset_auth.py
├── cli/
│ ├── __init__.py
│ ├── conformance/
│ │ ├── __init__.py
│ │ └── test_adk_web_server_client.py
│ ├── test_adk_web_server_run_live.py
│ ├── test_cli_feature_options.py
│ ├── test_cli_tools_click_option_mismatch.py
│ ├── test_cors_regex.py
│ ├── test_fast_api.py
│ ├── test_service_registry.py
│ └── utils/
│ ├── __init__.py
│ ├── test_agent_change_handler.py
│ ├── test_agent_loader.py
│ ├── test_cli.py
│ ├── test_cli_create.py
│ ├── test_cli_deploy.py
│ ├── test_cli_deploy_to_cloud_run.py
│ ├── test_cli_eval.py
│ ├── test_cli_tools_click.py
│ ├── test_dot_adk_folder.py
│ ├── test_envs.py
│ ├── test_evals.py
│ ├── test_local_storage.py
│ └── test_service_factory.py
├── code_executors/
│ ├── __init__.py
│ ├── test_agent_engine_sandbox_code_executor.py
│ ├── test_built_in_code_executor.py
│ ├── test_code_executor_context.py
│ ├── test_gke_code_executor.py
│ └── test_unsafe_local_code_executor.py
├── conftest.py
├── evaluation/
│ ├── __init__.py
│ ├── mock_gcs_utils.py
│ ├── simulation/
│ │ ├── __init__.py
│ │ ├── test_llm_backed_user_simulator.py
│ │ ├── test_llm_backed_user_simulator_prompts.py
│ │ ├── test_per_turn_user_simulation_quality_prompts.py
│ │ ├── test_per_turn_user_simulation_quality_v1.py
│ │ ├── test_pre_built_personas.py
│ │ ├── test_static_user_simulator.py
│ │ ├── test_user_simulator.py
│ │ ├── test_user_simulator_personas.py
│ │ └── test_user_simulator_provider.py
│ ├── test_app_details.py
│ ├── test_custom_metric_evaluator.py
│ ├── test_eval_case.py
│ ├── test_eval_config.py
│ ├── test_evaluation_generator.py
│ ├── test_final_response_match_v1.py
│ ├── test_final_response_match_v2.py
│ ├── test_gcs_eval_set_results_manager.py
│ ├── test_gcs_eval_sets_manager.py
│ ├── test_hallucinations_v1.py
│ ├── test_in_memory_eval_sets_manager.py
│ ├── test_llm_as_judge.py
│ ├── test_llm_as_judge_utils.py
│ ├── test_local_eval_service.py
│ ├── test_local_eval_set_results_manager.py
│ ├── test_local_eval_sets_manager.py
│ ├── test_metric_evaluator_registry.py
│ ├── test_multi_turn_task_success_evaluator.py
│ ├── test_multi_turn_tool_use_quality_evaluator.py
│ ├── test_multi_turn_trajectory_quality_evaluator.py
│ ├── test_request_intercepter_plugin.py
│ ├── test_response_evaluator.py
│ ├── test_retry_options_utils.py
│ ├── test_rubric_based_evaluator.py
│ ├── test_rubric_based_final_response_quality_v1.py
│ ├── test_rubric_based_tool_use_quality_v1.py
│ ├── test_safety_evaluator.py
│ ├── test_trajectory_evaluator.py
│ └── test_vertex_ai_eval_facade.py
├── features/
│ ├── test_feature_decorator.py
│ └── test_feature_registry.py
├── flows/
│ ├── __init__.py
│ └── llm_flows/
│ ├── __init__.py
│ ├── test_agent_transfer.py
│ ├── test_agent_transfer_system_instructions.py
│ ├── test_async_tool_callbacks.py
│ ├── test_audio_cache_manager.py
│ ├── test_base_llm_flow.py
│ ├── test_base_llm_flow_partial_handling.py
│ ├── test_base_llm_flow_realtime.py
│ ├── test_basic_processor.py
│ ├── test_code_execution.py
│ ├── test_compaction_processor.py
│ ├── test_contents.py
│ ├── test_contents_branch.py
│ ├── test_contents_function.py
│ ├── test_contents_other_agent.py
│ ├── test_context_cache_processor.py
│ ├── test_functions_error_messages.py
│ ├── test_functions_long_running.py
│ ├── test_functions_parallel.py
│ ├── test_functions_request_euc.py
│ ├── test_functions_sequential.py
│ ├── test_functions_simple.py
│ ├── test_functions_thread_pool.py
│ ├── test_identity.py
│ ├── test_instructions.py
│ ├── test_interactions_processor.py
│ ├── test_live_tool_callbacks.py
│ ├── test_model_callbacks.py
│ ├── test_nl_planning.py
│ ├── test_other_configs.py
│ ├── test_output_schema_processor.py
│ ├── test_plugin_model_callbacks.py
│ ├── test_plugin_tool_callbacks.py
│ ├── test_progressive_sse_streaming.py
│ ├── test_request_confirmation.py
│ ├── test_tool_callbacks.py
│ ├── test_tool_telemetry.py
│ └── test_transcription_manager.py
├── integrations/
│ ├── agent_registry/
│ │ ├── __init__.py
│ │ └── test_agent_registry.py
│ ├── api_registry/
│ │ ├── __init__.py
│ │ └── test_api_registry.py
│ ├── crewai/
│ │ └── test_crewai_tool.py
│ ├── langchain/
│ │ └── test_langchain_tool.py
│ └── slack/
│ └── test_slack_runner.py
├── memory/
│ ├── test_in_memory_memory_service.py
│ └── test_vertex_ai_memory_bank_service.py
├── models/
│ ├── __init__.py
│ ├── test_anthropic_llm.py
│ ├── test_apigee_llm.py
│ ├── test_cache_metadata.py
│ ├── test_completions_http_client.py
│ ├── test_gemini_llm_connection.py
│ ├── test_gemma_llm.py
│ ├── test_google_llm.py
│ ├── test_interactions_utils.py
│ ├── test_litellm.py
│ ├── test_litellm_import.py
│ ├── test_llm_request.py
│ ├── test_llm_response.py
│ └── test_models.py
├── optimization/
│ ├── gepa_root_agent_prompt_optimizer_test.py
│ ├── local_eval_sampler_test.py
│ └── simple_prompt_optimizer_test.py
├── platform/
│ ├── __init__.py
│ ├── test_time.py
│ └── test_uuid.py
├── plugins/
│ ├── __init__.py
│ ├── test_base_plugin.py
│ ├── test_bigquery_agent_analytics_plugin.py
│ ├── test_context_filtering_plugin.py
│ ├── test_debug_logging_plugin.py
│ ├── test_global_instruction_plugin.py
│ ├── test_multimodal_tool_results_plugin.py
│ ├── test_plugin_manager.py
│ ├── test_reflect_retry_tool_plugin.py
│ └── test_save_files_as_artifacts.py
├── runners/
│ ├── __init__.py
│ ├── test_pause_invocation.py
│ ├── test_resume_invocation.py
│ ├── test_run_tool_confirmation.py
│ ├── test_runner_debug.py
│ └── test_runner_rewind.py
├── sessions/
│ ├── __init__.py
│ ├── migration/
│ │ ├── test_database_schema.py
│ │ └── test_migration.py
│ ├── test_dynamic_pickle_type.py
│ ├── test_session_service.py
│ ├── test_v0_storage_event.py
│ └── test_vertex_ai_session_service.py
├── skills/
│ ├── __init__.py
│ ├── test__utils.py
│ ├── test_models.py
│ └── test_prompt.py
├── streaming/
│ ├── __init__.py
│ ├── test_live_streaming_configs.py
│ ├── test_multi_agent_streaming.py
│ ├── test_streaming.py
│ └── test_streaming_audio_storage.py
├── telemetry/
│ ├── __init__.py
│ ├── test_functional.py
│ ├── test_google_cloud.py
│ ├── test_setup.py
│ ├── test_spans.py
│ └── test_sqlite_span_exporter.py
├── test_runners.py
├── testing_utils.py
├── tools/
│ ├── __init__.py
│ ├── apihub_tool/
│ │ ├── clients/
│ │ │ ├── test_apihub_client.py
│ │ │ └── test_secret_client.py
│ │ └── test_apihub_toolset.py
│ ├── application_integration_tool/
│ │ ├── clients/
│ │ │ ├── test_connections_client.py
│ │ │ └── test_integration_client.py
│ │ ├── test_application_integration_toolset.py
│ │ └── test_integration_connector_tool.py
│ ├── bigquery/
│ │ ├── __init__
│ │ ├── test_bigquery_client.py
│ │ ├── test_bigquery_credentials.py
│ │ ├── test_bigquery_data_insights_tool.py
│ │ ├── test_bigquery_metadata_tool.py
│ │ ├── test_bigquery_query_tool.py
│ │ ├── test_bigquery_search_tool.py
│ │ ├── test_bigquery_tool_config.py
│ │ ├── test_bigquery_toolset.py
│ │ └── test_data/
│ │ └── ask_data_insights_penguins_highest_mass.yaml
│ ├── bigtable/
│ │ ├── __init__
│ │ ├── test_bigtable_credentials.py
│ │ ├── test_bigtable_metadata_tool.py
│ │ ├── test_bigtable_query_tool.py
│ │ ├── test_bigtable_toolset.py
│ │ └── test_client.py
│ ├── computer_use/
│ │ ├── __init__.py
│ │ ├── test_base_computer.py
│ │ ├── test_computer_use_tool.py
│ │ └── test_computer_use_toolset.py
│ ├── data_agent/
│ │ ├── test_data_agent_tool.py
│ │ └── test_data_agent_toolset.py
│ ├── environment_simulation/
│ │ ├── __init__.py
│ │ ├── test_environment_simulation_engine.py
│ │ ├── test_environment_simulation_factory.py
│ │ └── test_environment_simulation_plugin.py
│ ├── google_api_tool/
│ │ ├── __init__.py
│ │ ├── test_docs_batchupdate.py
│ │ ├── test_google_api_tool.py
│ │ ├── test_google_api_toolset.py
│ │ └── test_googleapi_to_openapi_converter.py
│ ├── mcp_tool/
│ │ ├── __init__.py
│ │ ├── test_conversion_utils.py
│ │ ├── test_mcp_session_manager.py
│ │ ├── test_mcp_tool.py
│ │ ├── test_mcp_toolset.py
│ │ ├── test_mcp_toolset_auth.py
│ │ └── test_session_context.py
│ ├── openapi_tool/
│ │ ├── auth/
│ │ │ ├── credential_exchangers/
│ │ │ │ ├── test_auto_auth_credential_exchanger.py
│ │ │ │ ├── test_base_auth_credential_exchanger.py
│ │ │ │ ├── test_oauth2_exchanger.py
│ │ │ │ └── test_service_account_exchanger.py
│ │ │ └── test_auth_helper.py
│ │ ├── common/
│ │ │ └── test_common.py
│ │ └── openapi_spec_parser/
│ │ ├── test.yaml
│ │ ├── test_openapi_spec_parser.py
│ │ ├── test_openapi_toolset.py
│ │ ├── test_operation_parser.py
│ │ ├── test_rest_api_tool.py
│ │ └── test_tool_auth_handler.py
│ ├── pubsub/
│ │ ├── test_pubsub_client.py
│ │ ├── test_pubsub_config.py
│ │ ├── test_pubsub_credentials.py
│ │ ├── test_pubsub_message_tool.py
│ │ └── test_pubsub_toolset.py
│ ├── retrieval/
│ │ ├── __init__.py
│ │ ├── test_base_retrieval_tool.py
│ │ ├── test_files_retrieval.py
│ │ └── test_vertex_ai_rag_retrieval.py
│ ├── spanner/
│ │ ├── __init__
│ │ ├── test_admin_tool.py
│ │ ├── test_admin_toolset.py
│ │ ├── test_metadata_tool.py
│ │ ├── test_search_tool.py
│ │ ├── test_spanner_client.py
│ │ ├── test_spanner_credentials.py
│ │ ├── test_spanner_query_tool.py
│ │ ├── test_spanner_tool_settings.py
│ │ ├── test_spanner_toolset.py
│ │ └── test_utils.py
│ ├── test_agent_tool.py
│ ├── test_authenticated_function_tool.py
│ ├── test_base_authenticated_tool.py
│ ├── test_base_google_credentials_manager.py
│ ├── test_base_tool.py
│ ├── test_base_toolset.py
│ ├── test_bash_tool.py
│ ├── test_build_function_declaration.py
│ ├── test_discovery_engine_search_tool.py
│ ├── test_enterprise_web_search_tool.py
│ ├── test_from_function_with_options.py
│ ├── test_function_tool.py
│ ├── test_function_tool_declarations.py
│ ├── test_function_tool_pydantic.py
│ ├── test_function_tool_with_import_annotations.py
│ ├── test_gemini_schema_util.py
│ ├── test_google_maps_grounding_tool.py
│ ├── test_google_search_agent_tool.py
│ ├── test_google_search_tool.py
│ ├── test_google_tool.py
│ ├── test_load_artifacts_tool.py
│ ├── test_load_mcp_resource_tool.py
│ ├── test_load_memory_tool.py
│ ├── test_long_running_tool.py
│ ├── test_set_model_response_tool.py
│ ├── test_skill_toolset.py
│ ├── test_tool_config.py
│ ├── test_transfer_to_agent_tool.py
│ ├── test_url_context_tool.py
│ └── test_vertex_ai_search_tool.py
└── utils/
├── __init__.py
├── test_cache_performance_analyzer.py
├── test_client_labels_utils.py
├── test_context_utils.py
├── test_env_utils.py
├── test_feature_decorator.py
├── test_google_client_headers.py
├── test_instructions_utils.py
├── test_model_name_utils.py
├── test_output_schema_utils.py
├── test_schema_utils.py
├── test_streaming_utils.py
├── test_vertex_ai_utils.py
└── test_yaml_utils.py
Copy disabled (too large)
Download .txt
Showing preview only (60,393K chars total). Download the full file to get everything.
SYMBOL INDEX (12984 symbols across 430 files)
FILE: contributing/dev/utils/build_llms_txt.py
function fetch_adk_python_readme (line 40) | def fetch_adk_python_readme() -> str:
function strip_java (line 51) | def strip_java(md: str) -> str:
function first_heading (line 55) | def first_heading(md: str) -> str | None:
function md_to_text (line 62) | def md_to_text(md: str) -> str:
function html_to_text (line 72) | def html_to_text(html_file: Path) -> str:
function count_tokens (line 96) | def count_tokens(text: str, model: str = "cl100k_base") -> int:
function expand_code_snippets (line 105) | def expand_code_snippets(content: str, project_root: Path) -> str:
function build_index (line 199) | def build_index(docs: Path) -> str:
function build_full (line 269) | def build_full(docs: Path) -> str:
function main (line 328) | def main() -> None:
FILE: contributing/samples/a2a_basic/agent.py
function roll_die (line 25) | def roll_die(sides: int) -> int:
FILE: contributing/samples/a2a_basic/remote_a2a/check_prime_agent/agent.py
function check_prime (line 22) | async def check_prime(nums: list[int]) -> str:
FILE: contributing/samples/a2a_human_in_loop/agent.py
function reimburse (line 22) | def reimburse(purpose: str, amount: float) -> str:
FILE: contributing/samples/a2a_human_in_loop/remote_a2a/human_in_loop/agent.py
function reimburse (line 23) | def reimburse(purpose: str, amount: float) -> str:
function ask_for_approval (line 30) | def ask_for_approval(
FILE: contributing/samples/a2a_root/remote_a2a/hello_world/agent.py
function roll_die (line 23) | def roll_die(sides: int, tool_context: ToolContext) -> int:
function check_prime (line 40) | async def check_prime(nums: list[int]) -> str:
FILE: contributing/samples/adk_answering_agent/gemini_assistant/agent.py
function search_gemini_api_docs (line 29) | def search_gemini_api_docs(queries: List[str]) -> Dict[str, Any]:
FILE: contributing/samples/adk_answering_agent/main.py
function list_most_recent_discussions (line 41) | async def list_most_recent_discussions(
function process_arguments (line 98) | def process_arguments():
function main (line 145) | async def main():
FILE: contributing/samples/adk_answering_agent/tools.py
function get_discussion_and_comments (line 27) | def get_discussion_and_comments(discussion_number: int) -> dict[str, Any]:
function add_comment_to_discussion (line 101) | def add_comment_to_discussion(
function get_label_id (line 148) | def get_label_id(label_name: str) -> str | None:
function add_label_to_discussion (line 180) | def add_label_to_discussion(
function convert_gcs_links_to_https (line 218) | def convert_gcs_links_to_https(gcs_uris: list[str]) -> Dict[str, Optiona...
FILE: contributing/samples/adk_answering_agent/upload_docs_to_vertex_ai_search.py
function cleanup_gcs_prefix (line 34) | def cleanup_gcs_prefix(project_id: str, bucket_name: str, prefix: str) -...
function upload_directory_to_gcs (line 54) | def upload_directory_to_gcs(
function import_from_gcs_to_vertex_ai (line 137) | def import_from_gcs_to_vertex_ai(
function main (line 169) | def main():
FILE: contributing/samples/adk_answering_agent/utils.py
function error_response (line 34) | def error_response(error_message: str) -> dict[str, Any]:
function run_graphql_query (line 38) | def run_graphql_query(query: str, variables: dict[str, Any]) -> dict[str...
function parse_number_string (line 48) | def parse_number_string(number_str: str | None, default_value: int = 0) ...
function _check_url_exists (line 64) | def _check_url_exists(url: str) -> bool:
function _generate_github_url (line 79) | def _generate_github_url(repo_name: str, relative_path: str) -> str:
function convert_gcs_to_https (line 84) | def convert_gcs_to_https(gcs_uri: str) -> Optional[str]:
function call_agent_async (line 154) | async def call_agent_async(
FILE: contributing/samples/adk_documentation/adk_docs_updater/main.py
function process_arguments (line 37) | def process_arguments():
function main (line 60) | async def main():
FILE: contributing/samples/adk_documentation/adk_release_analyzer/agent.py
function get_next_file_group (line 100) | def get_next_file_group(tool_context: ToolContext) -> dict[str, Any]:
function save_group_recommendations (line 136) | def save_group_recommendations(
function get_all_recommendations (line 169) | def get_all_recommendations(tool_context: ToolContext) -> dict[str, Any]:
function save_release_info (line 193) | def save_release_info(
function get_release_context (line 238) | def get_release_context(tool_context: ToolContext) -> dict[str, Any]:
function file_analyzer_instruction (line 349) | def file_analyzer_instruction(readonly_context: ReadonlyContext) -> str:
function summary_instruction (line 475) | def summary_instruction(readonly_context: ReadonlyContext) -> str:
FILE: contributing/samples/adk_documentation/adk_release_analyzer/main.py
function main (line 34) | async def main():
FILE: contributing/samples/adk_documentation/tools.py
function list_releases (line 33) | def list_releases(repo_owner: str, repo_name: str) -> Dict[str, Any]:
function get_changed_files_between_releases (line 73) | def get_changed_files_between_releases(
function clone_or_pull_repo (line 118) | def clone_or_pull_repo(
function read_local_git_repo_file_content (line 175) | def read_local_git_repo_file_content(file_path: str) -> Dict[str, Any]:
function list_directory_contents (line 211) | def list_directory_contents(directory_path: str) -> Dict[str, Any]:
function search_local_git_repo (line 248) | def search_local_git_repo(
function create_pull_request_from_changes (line 304) | def create_pull_request_from_changes(
function get_issue (line 387) | def get_issue(
function create_issue (line 410) | def create_issue(
function update_issue (line 436) | def update_issue(
function _run_git_command (line 466) | def _run_git_command(command: List[str], cwd: str) -> CompletedProcess[s...
function _find_head_commit_sha (line 479) | def _find_head_commit_sha(repo_path: str) -> str:
function _get_pull (line 493) | def _get_pull(repo_path: str) -> str:
function _get_clone (line 505) | def _get_clone(repo_url: str, repo_path: str) -> str:
function _git_grep (line 516) | def _git_grep(
function get_file_diff_for_release (line 553) | def get_file_diff_for_release(
function get_changed_files_summary (line 602) | def get_changed_files_summary(
function _get_changed_files_from_local_git (line 690) | def _get_changed_files_from_local_git(
FILE: contributing/samples/adk_documentation/utils.py
function error_response (line 33) | def error_response(error_message: str) -> Dict[str, Any]:
function get_request (line 37) | def get_request(
function get_paginated_request (line 52) | def get_paginated_request(
function post_request (line 68) | def post_request(url: str, payload: Any) -> Dict[str, Any]:
function patch_request (line 74) | def patch_request(url: str, payload: Any) -> Dict[str, Any]:
function call_agent_async (line 80) | async def call_agent_async(
function parse_suggestions (line 103) | def parse_suggestions(issue_body: str) -> List[Tuple[int, str]]:
FILE: contributing/samples/adk_issue_formatting_agent/agent.py
function list_open_issues (line 47) | def list_open_issues(issue_count: int) -> dict[str, Any]:
function get_issue (line 74) | def get_issue(issue_number: int) -> dict[str, Any]:
function add_comment_to_issue (line 91) | def add_comment_to_issue(issue_number: int, comment: str) -> dict[str, a...
function list_comments_on_issue (line 115) | def list_comments_on_issue(issue_number: int) -> dict[str, any]:
FILE: contributing/samples/adk_issue_formatting_agent/utils.py
function get_request (line 27) | def get_request(
function post_request (line 37) | def post_request(url: str, payload: Any) -> dict[str, Any]:
function error_response (line 43) | def error_response(error_message: str) -> dict[str, Any]:
function read_file (line 47) | def read_file(file_path: str) -> str:
FILE: contributing/samples/adk_issue_monitoring_agent/agent.py
function load_prompt_template (line 35) | def load_prompt_template(filename: str) -> str:
function flag_issue_as_spam (line 46) | def flag_issue_as_spam(
FILE: contributing/samples/adk_issue_monitoring_agent/main.py
function process_single_issue (line 44) | async def process_single_issue(
function main (line 157) | async def main():
FILE: contributing/samples/adk_issue_monitoring_agent/utils.py
function get_api_call_count (line 30) | def get_api_call_count() -> int:
function reset_api_call_count (line 34) | def reset_api_call_count() -> None:
function _increment_api_call_count (line 39) | def _increment_api_call_count() -> None:
function get_request (line 59) | def get_request(url: str, params: dict[str, Any] | None = None) -> Any:
function post_request (line 66) | def post_request(url: str, payload: Any) -> Any:
function error_response (line 73) | def error_response(error_message: str) -> dict[str, Any]:
function get_repository_maintainers (line 77) | def get_repository_maintainers(owner: str, repo: str) -> list[str]:
function get_issue_details (line 84) | def get_issue_details(
function get_issue_comments (line 92) | def get_issue_comments(
function get_target_issues (line 114) | def get_target_issues(owner: str, repo: str) -> list[int]:
FILE: contributing/samples/adk_knowledge_agent/agent.py
function citation_retrieval_after_model_callback (line 27) | def citation_retrieval_after_model_callback(
FILE: contributing/samples/adk_pr_agent/agent.py
function get_github_pr_info_http (line 30) | def get_github_pr_info_http(pr_number: int) -> str | None:
FILE: contributing/samples/adk_pr_agent/main.py
function main (line 27) | async def main():
FILE: contributing/samples/adk_pr_triaging_agent/agent.py
function get_pull_request_details (line 57) | def get_pull_request_details(pr_number: int) -> str:
function add_label_to_pr (line 161) | def add_label_to_pr(pr_number: int, label: str) -> dict[str, Any]:
function add_comment_to_pr (line 196) | def add_comment_to_pr(pr_number: int, comment: str) -> dict[str, Any]:
FILE: contributing/samples/adk_pr_triaging_agent/main.py
function main (line 34) | async def main():
FILE: contributing/samples/adk_pr_triaging_agent/utils.py
function run_graphql_query (line 36) | def run_graphql_query(query: str, variables: dict[str, Any]) -> dict[str...
function get_request (line 46) | def get_request(url: str, params: dict[str, Any] | None = None) -> Any:
function get_diff (line 55) | def get_diff(url: str) -> str:
function post_request (line 62) | def post_request(url: str, payload: Any) -> dict[str, Any]:
function error_response (line 69) | def error_response(error_message: str) -> dict[str, Any]:
function read_file (line 74) | def read_file(file_path: str) -> str:
function parse_number_string (line 84) | def parse_number_string(number_str: str | None, default_value: int = 0) ...
function call_agent_async (line 100) | async def call_agent_async(
FILE: contributing/samples/adk_stale_agent/agent.py
function _get_cached_maintainers (line 58) | def _get_cached_maintainers() -> List[str]:
function load_prompt_template (line 106) | def load_prompt_template(filename: str) -> str:
function _fetch_graphql_data (line 124) | def _fetch_graphql_data(item_number: int) -> Dict[str, Any]:
function _build_history_timeline (line 208) | def _build_history_timeline(
function _replay_history_to_find_state (line 306) | def _replay_history_to_find_state(
function get_issue_state (line 361) | def get_issue_state(item_number: int) -> Dict[str, Any]:
function _format_days (line 462) | def _format_days(hours: float) -> str:
function add_label_to_issue (line 474) | def add_label_to_issue(item_number: int, label_name: str) -> dict[str, A...
function remove_label_from_issue (line 491) | def remove_label_from_issue(
function add_stale_label_and_comment (line 510) | def add_stale_label_and_comment(item_number: int) -> dict[str, Any]:
function alert_maintainer_of_edit (line 540) | def alert_maintainer_of_edit(item_number: int) -> dict[str, Any]:
function close_as_stale (line 559) | def close_as_stale(item_number: int) -> dict[str, Any]:
FILE: contributing/samples/adk_stale_agent/main.py
function process_single_issue (line 40) | async def process_single_issue(issue_number: int) -> Tuple[float, int]:
function main (line 104) | async def main():
FILE: contributing/samples/adk_stale_agent/utils.py
function get_api_call_count (line 39) | def get_api_call_count() -> int:
function reset_api_call_count (line 50) | def reset_api_call_count() -> None:
function _increment_api_call_count (line 57) | def _increment_api_call_count() -> None:
function get_request (line 99) | def get_request(url: str, params: Optional[Dict[str, Any]] = None) -> Any:
function post_request (line 123) | def post_request(url: str, payload: Any) -> Any:
function patch_request (line 144) | def patch_request(url: str, payload: Any) -> Any:
function delete_request (line 165) | def delete_request(url: str) -> Any:
function error_response (line 187) | def error_response(error_message: str) -> Dict[str, Any]:
function get_old_open_issue_numbers (line 200) | def get_old_open_issue_numbers(
FILE: contributing/samples/adk_triaging_agent/agent.py
function list_untriaged_issues (line 86) | def list_untriaged_issues(issue_count: int) -> dict[str, Any]:
function add_label_to_issue (line 147) | def add_label_to_issue(issue_number: int, label: str) -> dict[str, Any]:
function add_owner_to_issue (line 180) | def add_owner_to_issue(issue_number: int, label: str) -> dict[str, Any]:
function change_issue_type (line 224) | def change_issue_type(issue_number: int, issue_type: str) -> dict[str, A...
FILE: contributing/samples/adk_triaging_agent/main.py
function fetch_specific_issue_details (line 40) | async def fetch_specific_issue_details(issue_number: int):
function call_agent_async (line 92) | async def call_agent_async(
function main (line 120) | async def main():
FILE: contributing/samples/adk_triaging_agent/utils.py
function get_request (line 26) | def get_request(
function post_request (line 36) | def post_request(url: str, payload: Any) -> dict[str, Any]:
function patch_request (line 42) | def patch_request(url: str, payload: Any) -> dict[str, Any]:
function error_response (line 48) | def error_response(error_message: str) -> dict[str, Any]:
function parse_number_string (line 52) | def parse_number_string(number_str: str, default_value: int = 0) -> int:
FILE: contributing/samples/agent_engine_code_execution/agent.py
function base_system_instruction (line 21) | def base_system_instruction():
FILE: contributing/samples/artifact_save_text/agent.py
function log_query (line 21) | async def log_query(tool_context: ToolContext, query: str):
FILE: contributing/samples/authn-adk-all-in-one/hotel_booker_app/hotelbooker_core.py
class HotelBooker (line 20) | class HotelBooker:
method __init__ (line 25) | def __init__(self, db_name="data.db"):
method _get_db_connection (line 29) | def _get_db_connection(self):
method _initialize_db (line 35) | def _initialize_db(self):
method is_token_valid (line 115) | def is_token_valid(self, conn, token):
method get_available_hotels (line 120) | def get_available_hotels(self, cursor, location=None):
method book_a_room (line 137) | def book_a_room(
method get_booking_details (line 211) | def get_booking_details(self, cursor, booking_id=None, guest_name=None):
FILE: contributing/samples/authn-adk-all-in-one/hotel_booker_app/main.py
function get_oidc_config (line 45) | def get_oidc_config():
function get_jwks (line 58) | def get_jwks():
function get_db (line 77) | def get_db():
function close_db (line 86) | def close_db(exception):
function is_token_valid (line 92) | def is_token_valid(token: str):
function token_required (line 150) | def token_required(f):
function get_hotels (line 174) | def get_hotels():
function book_room (line 195) | def book_room():
function get_details (line 233) | def get_details():
FILE: contributing/samples/authn-adk-all-in-one/idp/app.py
function generate_jwt (line 127) | def generate_jwt(payload, key, alg="RS256"):
function create_access_token (line 137) | def create_access_token(client_id, scopes, user_sub=None):
function create_id_token (line 165) | def create_id_token(client_id, user_data, scopes, nonce=None):
function openid_configuration (line 189) | def openid_configuration():
function jwks_endpoint (line 194) | def jwks_endpoint():
function authorize (line 199) | def authorize():
function consent (line 232) | def consent():
function generate_token (line 319) | def generate_token():
function index (line 468) | def index():
function admin_portal (line 474) | def admin_portal():
function admin_update_config (line 484) | def admin_update_config():
function admin_add_user (line 503) | def admin_add_user():
function admin_add_client (line 533) | def admin_add_client():
FILE: contributing/samples/bigtable/agent.py
function search_hotels_by_location (line 69) | def search_hotels_by_location(
FILE: contributing/samples/built_in_multi_tools/agent.py
function roll_die (line 31) | def roll_die(sides: int, tool_context: ToolContext) -> int:
FILE: contributing/samples/cache_analysis/agent.py
function analyze_data_patterns (line 37) | def analyze_data_patterns(
function research_literature (line 89) | def research_literature(
function generate_test_scenarios (line 172) | def generate_test_scenarios(
function optimize_system_performance (line 268) | def optimize_system_performance(
function analyze_security_vulnerabilities (line 366) | def analyze_security_vulnerabilities(
function design_scalability_architecture (line 455) | def design_scalability_architecture(
function benchmark_performance (line 559) | def benchmark_performance(
FILE: contributing/samples/cache_analysis/run_cache_experiments.py
function create_agent_variant (line 54) | def create_agent_variant(base_app, model_name: str, cache_enabled: bool):
function run_cache_comparison_experiment (line 97) | async def run_cache_comparison_experiment(
function analyze_cache_performance_from_sessions (line 314) | async def analyze_cache_performance_from_sessions(
function get_experiment_labels (line 416) | def get_experiment_labels(model_name: str) -> Dict[str, str]:
function calculate_averaged_results (line 437) | def calculate_averaged_results(
function _calculate_std (line 525) | def _calculate_std(values):
function save_results (line 534) | def save_results(results: Dict[str, Any], filename: str):
function main (line 541) | async def main():
FILE: contributing/samples/cache_analysis/utils.py
function call_agent_async (line 26) | async def call_agent_async(
function get_test_prompts (line 86) | def get_test_prompts() -> List[str]:
function run_experiment_batch (line 133) | async def run_experiment_batch(
FILE: contributing/samples/callbacks/agent.py
function roll_die (line 24) | def roll_die(sides: int, tool_context: ToolContext) -> int:
function check_prime (line 41) | async def check_prime(nums: list[int]) -> str:
function before_agent_callback (line 69) | async def before_agent_callback(callback_context):
function after_agent_callback (line 74) | async def after_agent_callback(callback_context):
function before_model_callback (line 79) | async def before_model_callback(callback_context, llm_request):
function after_model_callback (line 84) | async def after_model_callback(callback_context, llm_response):
function after_agent_cb1 (line 89) | def after_agent_cb1(callback_context):
function after_agent_cb2 (line 93) | def after_agent_cb2(callback_context):
function after_agent_cb3 (line 106) | def after_agent_cb3(callback_context):
function before_agent_cb1 (line 110) | def before_agent_cb1(callback_context):
function before_agent_cb2 (line 114) | def before_agent_cb2(callback_context):
function before_agent_cb3 (line 118) | def before_agent_cb3(callback_context):
function before_tool_cb1 (line 122) | def before_tool_cb1(tool, args, tool_context):
function before_tool_cb2 (line 126) | def before_tool_cb2(tool, args, tool_context):
function before_tool_cb3 (line 130) | def before_tool_cb3(tool, args, tool_context):
function after_tool_cb1 (line 134) | def after_tool_cb1(tool, args, tool_context, tool_response):
function after_tool_cb2 (line 138) | def after_tool_cb2(tool, args, tool_context, tool_response):
function after_tool_cb3 (line 143) | def after_tool_cb3(tool, args, tool_context, tool_response):
FILE: contributing/samples/callbacks/main.py
function main (line 33) | async def main():
FILE: contributing/samples/code_execution/agent.py
function base_system_instruction (line 21) | def base_system_instruction():
FILE: contributing/samples/code_execution/gke_sandbox_agent.py
function gke_agent_system_instruction (line 21) | def gke_agent_system_instruction():
FILE: contributing/samples/computer_use/playwright.py
class PlaywrightComputer (line 74) | class PlaywrightComputer(BaseComputer):
method __init__ (line 77) | def __init__(
method initialize (line 92) | async def initialize(self):
method environment (line 145) | async def environment(self):
method close (line 149) | async def close(self, exc_type, exc_val, exc_tb):
method open_web_browser (line 166) | async def open_web_browser(self) -> ComputerState:
method click_at (line 169) | async def click_at(self, x: int, y: int):
method hover_at (line 175) | async def hover_at(self, x: int, y: int):
method type_text_at (line 181) | async def type_text_at(
method _horizontal_document_scroll (line 205) | async def _horizontal_document_scroll(
method scroll_document (line 220) | async def scroll_document(
method scroll_at (line 232) | async def scroll_at(
method wait (line 261) | async def wait(self, seconds: int) -> ComputerState:
method go_back (line 265) | async def go_back(self) -> ComputerState:
method go_forward (line 270) | async def go_forward(self) -> ComputerState:
method search (line 275) | async def search(self) -> ComputerState:
method navigate (line 278) | async def navigate(self, url: str) -> ComputerState:
method key_combination (line 283) | async def key_combination(self, keys: list[str]) -> ComputerState:
method drag_and_drop (line 297) | async def drag_and_drop(
method current_state (line 312) | async def current_state(self) -> ComputerState:
method screen_size (line 320) | async def screen_size(self) -> tuple[int, int]:
method highlight_mouse (line 323) | async def highlight_mouse(self, x: int, y: int):
FILE: contributing/samples/context_offloading_with_artifact/agent.py
class CustomLoadArtifactsTool (line 42) | class CustomLoadArtifactsTool(LoadArtifactsTool):
method _append_artifacts_to_llm_request (line 53) | async def _append_artifacts_to_llm_request(
function query_large_data (line 118) | async def query_large_data(query: str, tool_context: ToolContext) -> dict:
class QueryLargeDataTool (line 179) | class QueryLargeDataTool(FunctionTool):
method __init__ (line 188) | def __init__(self):
method process_llm_request (line 192) | async def process_llm_request(
FILE: contributing/samples/core_callback_config/callbacks.py
function before_agent_callback (line 4) | async def before_agent_callback(callback_context):
function after_agent_callback (line 9) | async def after_agent_callback(callback_context):
function before_model_callback (line 14) | async def before_model_callback(callback_context, llm_request):
function after_model_callback (line 19) | async def after_model_callback(callback_context, llm_response):
function after_agent_callback1 (line 24) | def after_agent_callback1(callback_context):
function after_agent_callback2 (line 28) | def after_agent_callback2(callback_context):
function after_agent_callback3 (line 41) | def after_agent_callback3(callback_context):
function before_agent_callback1 (line 45) | def before_agent_callback1(callback_context):
function before_agent_callback2 (line 49) | def before_agent_callback2(callback_context):
function before_agent_callback3 (line 53) | def before_agent_callback3(callback_context):
function before_tool_callback1 (line 57) | def before_tool_callback1(tool, args, tool_context):
function before_tool_callback2 (line 61) | def before_tool_callback2(tool, args, tool_context):
function before_tool_callback3 (line 65) | def before_tool_callback3(tool, args, tool_context):
function after_tool_callback1 (line 69) | def after_tool_callback1(tool, args, tool_context, tool_response):
function after_tool_callback2 (line 73) | def after_tool_callback2(tool, args, tool_context, tool_response):
function after_tool_callback3 (line 78) | def after_tool_callback3(tool, args, tool_context, tool_response):
FILE: contributing/samples/core_callback_config/tools.py
function roll_die (line 6) | def roll_die(sides: int, tool_context: ToolContext) -> int:
function check_prime (line 23) | def check_prime(nums: list[int]) -> str:
FILE: contributing/samples/core_custom_agent_config/my_agents.py
class MyCustomAgentConfig (line 33) | class MyCustomAgentConfig(BaseAgentConfig):
class MyCustomAgent (line 41) | class MyCustomAgent(BaseAgent):
method _parse_config (line 48) | def _parse_config(
method _run_async_impl (line 58) | async def _run_async_impl(
FILE: contributing/samples/crewai_tool_kwargs/agent.py
class SearchInput (line 30) | class SearchInput(BaseModel):
class CustomSearchTool (line 45) | class CustomSearchTool(BaseTool):
method _run (line 60) | def _run(self, query: str, **kwargs) -> str:
FILE: contributing/samples/crewai_tool_kwargs/main.py
function main (line 33) | async def main():
FILE: contributing/samples/custom_code_execution/agent.py
function _load_font_file (line 47) | def _load_font_file(font_url: str, font_filename: str) -> Optional[File]:
class CustomCodeExecutor (line 61) | class CustomCodeExecutor(VertexAiCodeExecutor):
method execute_code (line 65) | def execute_code(
function base_system_instruction (line 87) | def base_system_instruction():
FILE: contributing/samples/dummy_services.py
class FooMemoryService (line 31) | class FooMemoryService(BaseMemoryService):
method __init__ (line 34) | def __init__(self, uri: str | None = None, **kwargs):
method add_session_to_memory (line 44) | async def add_session_to_memory(self, session: Session):
method search_memory (line 48) | async def search_memory(
class BarMemoryService (line 65) | class BarMemoryService(BaseMemoryService):
method __init__ (line 68) | def __init__(self, uri: str | None = None, **kwargs):
method add_session_to_memory (line 78) | async def add_session_to_memory(self, session: Session):
method search_memory (line 82) | async def search_memory(
FILE: contributing/samples/fields_output_schema/agent.py
class WeatherData (line 19) | class WeatherData(BaseModel):
function get_current_year (line 25) | def get_current_year() -> str:
FILE: contributing/samples/fields_planner/agent.py
function roll_die (line 24) | def roll_die(sides: int, tool_context: ToolContext) -> int:
function check_prime (line 41) | async def check_prime(nums: list[int]) -> str:
FILE: contributing/samples/fields_planner/main.py
function main (line 32) | async def main():
FILE: contributing/samples/generate_image/agent.py
function generate_image (line 21) | async def generate_image(prompt: str, tool_context: 'ToolContext'):
FILE: contributing/samples/gepa/adk_agent.py
class EnvResponse (line 40) | class EnvResponse(Protocol):
class Env (line 49) | class Env(Protocol):
method step (line 52) | def step(self, action: types.Part) -> EnvResponse:
method reset (line 56) | def reset(self, task_index: int) -> EnvResponse:
class _Tool (line 61) | class _Tool(base_tool.BaseTool):
class Config (line 64) | class Config:
method __init__ (line 67) | def __init__(
method _get_declaration (line 85) | def _get_declaration(self) -> types.FunctionDeclaration:
method run_async (line 88) | async def run_async(self, *, args: Dict[str, Any], tool_context: Any) ...
function _default_retry_options (line 104) | def _default_retry_options() -> types.HttpRetryOptions:
function _adk_agent (line 113) | def _adk_agent(
class _UserAgent (line 161) | class _UserAgent(base_agent.BaseAgent):
class Config (line 166) | class Config:
method _run_async_impl (line 169) | async def _run_async_impl(self, ctx: Any) -> Any:
function run_environment_loop (line 208) | def run_environment_loop(
FILE: contributing/samples/gepa/adk_agent_test.py
class _TestPlugin (line 26) | class _TestPlugin(base_plugin.BasePlugin):
method __init__ (line 28) | def __init__(self, outputs):
method before_model_callback (line 34) | async def before_model_callback(self, *, callback_context, llm_request):
class EnvResponse (line 47) | class EnvResponse:
class _TestEnv (line 53) | class _TestEnv:
method __init__ (line 55) | def __init__(self, responses):
method step (line 59) | def step(self, action):
method reset (line 68) | def reset(self, task_index: int):
function test_default_flow (line 73) | def test_default_flow():
function test_intermediary_step_is_done (line 163) | def test_intermediary_step_is_done():
function test_intermediary_tool_step_is_done (line 199) | def test_intermediary_tool_step_is_done():
function test_llm_request (line 278) | def test_llm_request():
function test_model_name_is_set (line 318) | def test_model_name_is_set():
FILE: contributing/samples/gepa/experiment.py
function run_tau_bench_rollouts (line 50) | def run_tau_bench_rollouts(
class TauBenchDataInst (line 236) | class TauBenchDataInst(TypedDict):
class TauBenchTrajectory (line 242) | class TauBenchTrajectory(TypedDict):
class TauBenchRolloutOutput (line 247) | class TauBenchRolloutOutput(TypedDict):
class TauBenchAdapter (line 254) | class TauBenchAdapter(
method __init__ (line 263) | def __init__(
method evaluate (line 305) | def evaluate(
method make_reflective_dataset (line 371) | def make_reflective_dataset(
function _get_dataset (line 453) | def _get_dataset(ds: Dataset) -> list[TauBenchDataInst]:
function _get_datasets (line 461) | def _get_datasets(
class Dataset (line 489) | class Dataset:
class ExperimentConfig (line 497) | class ExperimentConfig:
function _rater (line 517) | def _rater(config: ExperimentConfig) -> rater_lib.Rater:
function run_gepa (line 528) | def run_gepa(
function run_eval (line 597) | def run_eval(output_dir: str, instructions: str, config: ExperimentConfig):
FILE: contributing/samples/gepa/rater_lib.py
function parse_rubric_validation_response (line 30) | def parse_rubric_validation_response(
function format_user_agent_conversation (line 90) | def format_user_agent_conversation(conv: list[dict[str, Any]]) -> str:
class Rater (line 132) | class Rater:
method __init__ (line 135) | def __init__(
method __call__ (line 161) | def __call__(self, messages: list[dict[str, Any]]) -> dict[str, Any]:
FILE: contributing/samples/gepa/run_experiment.py
function main (line 94) | def main(argv: Sequence[str]) -> None:
FILE: contributing/samples/gepa/tau_bench_agent.py
class _EnvWrapper (line 40) | class _EnvWrapper:
method __init__ (line 43) | def __init__(self, env: envs.Env):
method step (line 46) | def step(self, action: types.Part) -> adk_agent.EnvResponse:
method reset (line 60) | def reset(self, task_index: int) -> adk_agent.EnvResponse:
function _convert_tool (line 64) | def _convert_tool(tool_def: dict[str, Any]) -> types.FunctionDeclaration:
class _TauBenchPlugin (line 73) | class _TauBenchPlugin(base_plugin.BasePlugin):
method on_model_error_callback (line 76) | async def on_model_error_callback(
class _ADKAgent (line 90) | class _ADKAgent(tool_calling_agent.ToolCallingAgent):
method solve (line 93) | def solve(
function adk_agent_factory (line 149) | def adk_agent_factory(
FILE: contributing/samples/gepa/utils.py
class FilterInferenceWarnings (line 26) | class FilterInferenceWarnings(logging.Filter):
method filter (line 29) | def filter(self, record: logging.LogRecord) -> bool:
function reflection_inference_fn (line 39) | def reflection_inference_fn(model: str) -> Callable[[str], str]:
FILE: contributing/samples/gepa/voter_agent/tools.py
function get_voting_options (line 77) | def get_voting_options(
function set_voting_round (line 108) | def set_voting_round(
function store_vote_to_bigquery (line 138) | def store_vote_to_bigquery(
function get_vote_summary (line 229) | def get_vote_summary(tool_context: ToolContext) -> Dict[str, Any]:
FILE: contributing/samples/hello_world/agent.py
function roll_die (line 22) | def roll_die(sides: int, tool_context: ToolContext) -> int:
function check_prime (line 39) | async def check_prime(nums: list[int]) -> str:
FILE: contributing/samples/hello_world/main.py
function main (line 30) | async def main():
FILE: contributing/samples/hello_world_anthropic/agent.py
function roll_die (line 22) | def roll_die(sides: int) -> int:
function check_prime (line 34) | async def check_prime(nums: list[int]) -> str:
FILE: contributing/samples/hello_world_anthropic/main.py
function main (line 32) | async def main():
FILE: contributing/samples/hello_world_apigeellm/agent.py
function roll_die (line 22) | def roll_die(sides: int, tool_context: ToolContext) -> int:
function check_prime (line 39) | async def check_prime(nums: list[int]) -> str:
FILE: contributing/samples/hello_world_apigeellm/main.py
function main (line 31) | async def main():
FILE: contributing/samples/hello_world_app/agent.py
function roll_die (line 32) | def roll_die(sides: int, tool_context: ToolContext) -> int:
function check_prime (line 49) | async def check_prime(nums: list[int]) -> str:
class CountInvocationPlugin (line 122) | class CountInvocationPlugin(BasePlugin):
method __init__ (line 125) | def __init__(self) -> None:
method before_agent_callback (line 132) | async def before_agent_callback(
method before_model_callback (line 139) | async def before_model_callback(
FILE: contributing/samples/hello_world_app/main.py
function main (line 30) | async def main():
FILE: contributing/samples/hello_world_gemma/agent.py
function roll_die (line 23) | def roll_die(sides: int) -> int:
function check_prime (line 35) | async def check_prime(nums: list[int]) -> str:
FILE: contributing/samples/hello_world_gemma/main.py
function main (line 33) | async def main():
FILE: contributing/samples/hello_world_gemma3_ollama/agent.py
function roll_die (line 25) | def roll_die(sides: int) -> int:
function check_prime (line 37) | async def check_prime(nums: list[int]) -> str:
FILE: contributing/samples/hello_world_gemma3_ollama/main.py
function main (line 32) | async def main():
FILE: contributing/samples/hello_world_litellm/agent.py
function roll_die (line 22) | def roll_die(sides: int) -> int:
function check_prime (line 34) | async def check_prime(nums: list[int]) -> str:
FILE: contributing/samples/hello_world_litellm/main.py
function main (line 32) | async def main():
FILE: contributing/samples/hello_world_litellm_add_function_to_prompt/agent.py
function roll_die (line 23) | def roll_die(sides: int) -> int:
function check_prime (line 35) | def check_prime(number: int) -> str:
FILE: contributing/samples/hello_world_litellm_add_function_to_prompt/main.py
function main (line 32) | async def main():
FILE: contributing/samples/hello_world_ma/agent.py
function roll_die (line 24) | def roll_die(sides: int) -> int:
function check_prime (line 49) | def check_prime(nums: list[int]) -> str:
FILE: contributing/samples/hello_world_ollama/agent.py
function roll_die (line 21) | def roll_die(sides: int) -> int:
function check_prime (line 33) | def check_prime(numbers: list[int]) -> str:
FILE: contributing/samples/hello_world_ollama/main.py
function main (line 33) | async def main():
FILE: contributing/samples/hello_world_stream_fc_args/agent.py
function concat_number_and_string (line 19) | def concat_number_and_string(num: int, s: str) -> str:
function write_document (line 32) | def write_document(document: str) -> dict[str, str]:
FILE: contributing/samples/history_management/agent.py
function roll_die (line 23) | def roll_die(sides: int, tool_context: ToolContext) -> int:
function check_prime (line 40) | async def check_prime(nums: list[int]) -> str:
function create_slice_history_callback (line 68) | def create_slice_history_callback(n_recent_turns):
FILE: contributing/samples/history_management/main.py
function main (line 33) | async def main():
FILE: contributing/samples/human_in_loop/agent.py
function reimburse (line 23) | def reimburse(purpose: str, amount: float) -> str:
function ask_for_approval (line 30) | def ask_for_approval(
FILE: contributing/samples/human_in_loop/main.py
function main (line 42) | async def main():
FILE: contributing/samples/human_tool_confirmation/agent.py
function reimburse (line 24) | def reimburse(amount: int, tool_context: ToolContext) -> str:
function confirmation_threshold (line 29) | async def confirmation_threshold(
function request_time_off (line 36) | def request_time_off(days: int, tool_context: ToolContext):
FILE: contributing/samples/interactions_api/agent.py
function get_current_weather (line 34) | def get_current_weather(city: str) -> dict:
FILE: contributing/samples/interactions_api/main.py
function call_agent_async (line 63) | async def call_agent_async(
function test_basic_text_generation (line 133) | async def test_basic_text_generation(runner: Runner, session_id: str):
function test_function_calling (line 148) | async def test_function_calling(runner: Runner, session_id: str):
function test_multi_turn_conversation (line 167) | async def test_multi_turn_conversation(runner: Runner, session_id: str):
function test_google_search_tool (line 218) | async def test_google_search_tool(runner: Runner, session_id: str):
function test_custom_function_tool (line 238) | async def test_custom_function_tool(runner: Runner, session_id: str):
function check_interactions_api_available (line 267) | def check_interactions_api_available() -> bool:
function run_all_tests (line 279) | async def run_all_tests():
function interactive_mode (line 331) | async def interactive_mode():
function main (line 379) | def main():
FILE: contributing/samples/json_passing_agent/agent.py
class PizzaOrder (line 25) | class PizzaOrder(BaseModel):
function get_available_sizes (line 34) | def get_available_sizes() -> list[str]:
function get_available_crusts (line 39) | def get_available_crusts() -> list[str]:
function get_available_toppings (line 44) | def get_available_toppings() -> list[str]:
function calculate_price (line 70) | def calculate_price(tool_context: ToolContext) -> str:
FILE: contributing/samples/json_passing_agent/main.py
function main (line 29) | async def main():
FILE: contributing/samples/langchain_structured_tool_agent/agent.py
function add (line 26) | async def add(x, y) -> int:
function minus (line 32) | def minus(x, y) -> int:
class AddSchema (line 37) | class AddSchema(BaseModel):
class MinusSchema (line 42) | class MinusSchema(BaseModel):
FILE: contributing/samples/litellm_inline_tool_call/agent.py
class InlineJsonToolClient (line 29) | class InlineJsonToolClient(LiteLLMClient):
method acompletion (line 32) | async def acompletion(self, model, messages, tools, **kwargs):
function _find_last_role (line 86) | def _find_last_role(
function _coerce_to_text (line 96) | def _coerce_to_text(content: Any) -> str:
function _extract_timezone (line 116) | def _extract_timezone(messages: list[dict[str, Any]]) -> str | None:
function get_current_time (line 137) | def get_current_time(timezone_str: str) -> dict[str, str]:
FILE: contributing/samples/litellm_streaming/main.py
function _run_prompt (line 34) | async def _run_prompt(
function main (line 84) | async def main() -> None:
FILE: contributing/samples/litellm_structured_output/agent.py
class CitySummary (line 25) | class CitySummary(BaseModel):
FILE: contributing/samples/litellm_with_fallback_models/agent.py
function roll_die (line 23) | def roll_die(sides: int, tool_context: ToolContext) -> int:
function before_model_callback (line 42) | async def before_model_callback(callback_context, llm_request):
function after_model_callback (line 49) | async def after_model_callback(callback_context, llm_response):
FILE: contributing/samples/live_agent_api_server_example/live_agent_example.py
function init_pyaudio_playback (line 134) | def init_pyaudio_playback():
function create_text_request_payload (line 179) | def create_text_request_payload(text: str) -> str:
function create_audio_request_payload (line 187) | def create_audio_request_payload(audio_bytes: bytes, mime_type: str) -> ...
class AudioStreamingComponent (line 199) | class AudioStreamingComponent:
method stop_audio_streaming (line 201) | async def stop_audio_streaming(self):
method start_audio_streaming (line 209) | async def start_audio_streaming(
class AgentResponseAudioPlayer (line 291) | class AgentResponseAudioPlayer:
method cleanup_pyaudio_playback (line 293) | def cleanup_pyaudio_playback(self):
method _play_audio_pyaudio_handler (line 319) | def _play_audio_pyaudio_handler(
method play_audio_data (line 384) | async def play_audio_data(self, audio_bytes: bytes, mime_type: str):
function ensure_session_exists (line 397) | async def ensure_session_exists(
function websocket_client (line 437) | async def websocket_client():
FILE: contributing/samples/live_bidi_streaming_multi_agent/agent.py
function roll_die (line 25) | def roll_die(sides: int) -> int:
function check_prime (line 64) | def check_prime(nums: list[int]) -> str:
function get_current_weather (line 120) | def get_current_weather(location: str):
FILE: contributing/samples/live_bidi_streaming_single_agent/agent.py
function roll_die (line 22) | def roll_die(sides: int, tool_context: ToolContext) -> int:
function check_prime (line 39) | async def check_prime(nums: list[int]) -> str:
FILE: contributing/samples/live_bidi_streaming_tools_agent/agent.py
function monitor_stock_price (line 24) | async def monitor_stock_price(stock_symbol: str) -> AsyncGenerator[str, ...
function monitor_video_stream (line 51) | async def monitor_video_stream(
function stop_streaming (line 117) | def stop_streaming(function_name: str):
FILE: contributing/samples/live_tool_callbacks_agent/agent.py
function get_weather (line 27) | def get_weather(location: str, tool_context: ToolContext) -> Dict[str, A...
function calculate_async (line 47) | async def calculate_async(operation: str, x: float, y: float) -> Dict[st...
function log_activity (line 77) | def log_activity(message: str, tool_context: ToolContext) -> Dict[str, s...
function before_tool_audit_callback (line 98) | def before_tool_audit_callback(
function before_tool_security_callback (line 119) | def before_tool_security_callback(
function before_tool_async_callback (line 142) | async def before_tool_async_callback(
function after_tool_enhancement_callback (line 169) | def after_tool_enhancement_callback(
function after_tool_async_callback (line 190) | async def after_tool_async_callback(
FILE: contributing/samples/logprobs/agent.py
function append_logprobs_to_response (line 28) | async def append_logprobs_to_response(
FILE: contributing/samples/mcp_dynamic_header_agent/header_server.py
function get_tenant_data (line 32) | def get_tenant_data(context: Context) -> dict:
FILE: contributing/samples/mcp_progress_callback_agent/agent.py
function simple_progress_callback (line 62) | async def simple_progress_callback(
function progress_callback_factory (line 82) | def progress_callback_factory(
FILE: contributing/samples/mcp_progress_callback_agent/mock_progress_server.py
function list_tools (line 38) | async def list_tools() -> list[Tool]:
function call_tool (line 84) | async def call_tool(name: str, arguments: dict) -> list[TextContent]:
function main (line 150) | async def main():
FILE: contributing/samples/mcp_server_side_sampling/mcp_server.py
function analyze_sentiment (line 48) | async def analyze_sentiment(text: str, ctx: Context) -> dict:
FILE: contributing/samples/mcp_sse_agent/filesystem_server.py
function read_file (line 28) | def read_file(filepath: str) -> str:
function list_directory (line 36) | def list_directory(dirpath: str) -> list:
function get_cwd (line 43) | def get_cwd() -> str:
function file_system_prompt (line 50) | def file_system_prompt() -> str:
function shutdown (line 56) | async def shutdown(signal, loop):
FILE: contributing/samples/mcp_streamablehttp_agent/filesystem_server.py
function read_file (line 29) | def read_file(filepath: str) -> str:
function list_directory (line 37) | def list_directory(dirpath: str) -> list:
function get_cwd (line 44) | def get_cwd() -> str:
function sample_data (line 55) | def sample_data() -> str:
function shutdown (line 68) | async def shutdown(signal, loop):
FILE: contributing/samples/mcp_toolset_auth/main.py
function run_demo (line 48) | async def run_demo():
FILE: contributing/samples/mcp_toolset_auth/oauth_mcp_server.py
function validate_auth_header (line 45) | def validate_auth_header(request: Request) -> bool:
function get_user_profile (line 62) | def get_user_profile(user_id: str, context: Context) -> dict:
function list_users (line 82) | def list_users(context: Context) -> dict:
function auth_middleware (line 103) | async def auth_middleware(request: Request, call_next):
FILE: contributing/samples/memory/agent.py
function update_current_time (line 24) | def update_current_time(callback_context: CallbackContext):
FILE: contributing/samples/memory/main.py
function main (line 31) | async def main():
FILE: contributing/samples/migrate_session_db/agent.py
function roll_die (line 21) | def roll_die(sides: int) -> int:
function check_prime (line 33) | async def check_prime(nums: list[int]) -> str:
FILE: contributing/samples/migrate_session_db/main.py
function main (line 32) | async def main():
FILE: contributing/samples/migrate_session_db/sample-output/alembic/env.py
function run_migrations_offline (line 43) | def run_migrations_offline() -> None:
function run_migrations_online (line 67) | def run_migrations_online() -> None:
FILE: contributing/samples/multi_agent_llm_config/__init__.py
function roll_die (line 8) | def roll_die(sides: int) -> int:
function check_prime (line 13) | def check_prime(nums: list[int]) -> str:
FILE: contributing/samples/multimodal_tool_results/agent.py
function get_image (line 24) | def get_image():
FILE: contributing/samples/oauth2_client_credentials/agent.py
function create_auth_config (line 35) | def create_auth_config() -> AuthConfig:
function get_weather_data (line 67) | def get_weather_data(city: str = "San Francisco", credential=None) -> str:
FILE: contributing/samples/oauth2_client_credentials/main.py
function process_arguments (line 38) | def process_arguments():
function process_message (line 66) | async def process_message(runner, session_id, message):
function call_agent_async (line 74) | async def call_agent_async(runner, user_id, session_id, prompt):
function main (line 98) | async def main():
FILE: contributing/samples/oauth2_client_credentials/oauth2_test_server.py
class TokenResponse (line 64) | class TokenResponse(BaseModel):
function openid_configuration (line 73) | async def openid_configuration():
function authorize (line 93) | async def authorize(
function token_endpoint (line 131) | async def token_endpoint(
function handle_client_credentials (line 179) | async def handle_client_credentials(
function handle_authorization_code (line 204) | async def handle_authorization_code(
function get_weather (line 254) | async def get_weather(
function root (line 298) | async def root():
FILE: contributing/samples/oauth_calendar_agent/agent.py
function redact_event_content (line 58) | def redact_event_content(event_content: str) -> str:
function list_calendar_events (line 69) | def list_calendar_events(
function update_time (line 122) | def update_time(callback_context: CallbackContext):
FILE: contributing/samples/output_schema_with_tools/agent.py
class PersonInfo (line 29) | class PersonInfo(BaseModel):
function search_wikipedia (line 39) | def search_wikipedia(query: str) -> str:
function get_current_year (line 72) | def get_current_year() -> str:
FILE: contributing/samples/parallel_functions/agent.py
function get_weather (line 25) | async def get_weather(city: str, tool_context: ToolContext) -> dict:
function get_currency_rate (line 75) | async def get_currency_rate(
function calculate_distance (line 122) | async def calculate_distance(
function get_population (line 177) | async def get_population(cities: List[str], tool_context: ToolContext) -...
FILE: contributing/samples/plugin_basic/count_plugin.py
class CountInvocationPlugin (line 21) | class CountInvocationPlugin(BasePlugin):
method __init__ (line 24) | def __init__(self) -> None:
method before_agent_callback (line 31) | async def before_agent_callback(
method before_model_callback (line 38) | async def before_model_callback(
FILE: contributing/samples/plugin_basic/main.py
function hello_world (line 26) | async def hello_world(tool_context: ToolContext, query: str):
function main (line 40) | async def main():
FILE: contributing/samples/plugin_debug_logging/agent.py
function get_weather (line 34) | def get_weather(city: str) -> dict[str, Any]:
function calculate (line 67) | def calculate(expression: str) -> dict[str, Any]:
FILE: contributing/samples/plugin_reflect_tool_retry/basic/agent.py
function guess_number_tool (line 26) | def guess_number_tool(query: int) -> dict[str, Any]:
class CustomRetryPlugin (line 51) | class CustomRetryPlugin(ReflectAndRetryToolPlugin):
method extract_error_from_result (line 53) | async def extract_error_from_result(
FILE: contributing/samples/plugin_reflect_tool_retry/hallucinating_func_name/agent.py
function roll_die (line 30) | def roll_die(sides: int, tool_context: ToolContext) -> int:
function after_model_callback (line 47) | def after_model_callback(
FILE: contributing/samples/postgres_session_service/agent.py
function get_current_time (line 23) | def get_current_time() -> str:
FILE: contributing/samples/postgres_session_service/main.py
function main (line 30) | async def main():
FILE: contributing/samples/pydantic_argument/agent.py
class UserProfile (line 25) | class UserProfile(pydantic.BaseModel):
class UserPreferences (line 33) | class UserPreferences(pydantic.BaseModel):
class CompanyProfile (line 41) | class CompanyProfile(pydantic.BaseModel):
function create_full_user_account (line 50) | def create_full_user_account(
function create_entity_profile (line 103) | def create_entity_profile(entity: Union[UserProfile, CompanyProfile]) ->...
FILE: contributing/samples/pydantic_argument/main.py
function call_agent_async (line 33) | async def call_agent_async(runner, user_id, session_id, prompt):
function main (line 52) | async def main():
FILE: contributing/samples/quickstart/agent.py
function get_weather (line 18) | def get_weather(city: str) -> dict:
function get_current_time (line 42) | def get_current_time(city: str) -> dict:
FILE: contributing/samples/rewind_session/agent.py
function update_state (line 20) | async def update_state(tool_context: ToolContext, key: str, value: str) ...
function load_state (line 26) | async def load_state(tool_context: ToolContext, key: str) -> dict:
function save_artifact (line 31) | async def save_artifact(
function load_artifact (line 43) | async def load_artifact(tool_context: ToolContext, filename: str) -> dict:
FILE: contributing/samples/rewind_session/main.py
function highlight (line 43) | def highlight(text: str) -> str:
function call_agent_async (line 56) | async def call_agent_async(
function main (line 90) | async def main():
FILE: contributing/samples/runner_debug_example/agent.py
function get_weather (line 21) | def get_weather(city: str, tool_context: ToolContext) -> str:
function calculate (line 53) | def calculate(expression: str) -> str:
FILE: contributing/samples/runner_debug_example/main.py
function example_minimal (line 24) | async def example_minimal():
function example_multiple_messages (line 37) | async def example_multiple_messages():
function example_conversation_persistence (line 54) | async def example_conversation_persistence():
function example_separate_sessions (line 75) | async def example_separate_sessions():
function example_with_tools (line 106) | async def example_with_tools():
function example_capture_events (line 132) | async def example_capture_events():
function example_with_run_config (line 162) | async def example_with_run_config():
function example_comparison (line 185) | async def example_comparison():
function main (line 220) | async def main():
FILE: contributing/samples/services.py
function foo_memory_factory (line 22) | def foo_memory_factory(uri: str, **kwargs) -> FooMemoryService:
FILE: contributing/samples/session_state_agent/agent.py
function assert_session_values (line 33) | async def assert_session_values(
function before_agent_callback (line 79) | async def before_agent_callback(
function before_model_callback (line 98) | async def before_model_callback(
function after_model_callback (line 117) | async def after_model_callback(
function after_agent_callback (line 142) | async def after_agent_callback(callback_context: CallbackContext):
FILE: contributing/samples/simple_sequential_agent/agent.py
function roll_die (line 23) | def roll_die(sides: int) -> int:
function check_prime (line 48) | def check_prime(nums: list[int]) -> str:
FILE: contributing/samples/skills_agent/agent.py
class GetTimezoneTool (line 28) | class GetTimezoneTool(BaseTool):
method __init__ (line 31) | def __init__(self):
method _get_declaration (line 37) | def _get_declaration(self) -> types.FunctionDeclaration | None:
method run_async (line 53) | async def run_async(self, *, args: dict, tool_context) -> str:
function get_current_humidity (line 57) | def get_current_humidity(location: str) -> str:
FILE: contributing/samples/skills_agent/skills/weather-skill/scripts/get_humidity.py
function get_humidity (line 18) | def get_humidity(location: str) -> str:
FILE: contributing/samples/skills_agent_gcs/agent.py
function main (line 80) | async def main():
FILE: contributing/samples/slack_agent/agent.py
function main (line 25) | async def main():
FILE: contributing/samples/spanner/agent.py
function count_rows_in_table (line 94) | def count_rows_in_table(
function search_hotels (line 131) | def search_hotels(
FILE: contributing/samples/static_instruction/agent.py
function eat (line 120) | def eat(tool_context: ToolContext) -> str:
function get_hunger_state (line 142) | def get_hunger_state(last_fed_timestamp: float) -> str:
function provide_dynamic_instruction (line 168) | def provide_dynamic_instruction(ctx: ReadonlyContext | None = None):
FILE: contributing/samples/static_instruction/main.py
function call_agent_async (line 37) | async def call_agent_async(
function test_hunger_states (line 64) | async def test_hunger_states(runner):
function main (line 138) | async def main():
FILE: contributing/samples/static_non_text_content/agent.py
function create_static_instruction_with_file_upload (line 55) | def create_static_instruction_with_file_upload():
FILE: contributing/samples/static_non_text_content/main.py
function call_agent_async (line 34) | async def call_agent_async(
function process_arguments (line 60) | def process_arguments():
function run_default_test_prompts (line 95) | async def run_default_test_prompts(runner):
function single_prompt_mode (line 160) | async def single_prompt_mode(runner, prompt: str):
function main (line 175) | async def main():
FILE: contributing/samples/telemetry/agent.py
function roll_die (line 24) | def roll_die(sides: int, tool_context: ToolContext) -> int:
function check_prime (line 41) | async def check_prime(nums: list[int]) -> str:
FILE: contributing/samples/telemetry/main.py
function main (line 34) | async def main():
FILE: contributing/samples/token_usage/agent.py
function roll_die (line 28) | def roll_die(sides: int, tool_context: ToolContext) -> int:
FILE: contributing/samples/token_usage/main.py
function main (line 34) | async def main():
FILE: contributing/samples/tool_functions_config/tools.py
function roll_die (line 20) | def roll_die(sides: int, tool_context: ToolContext) -> int:
function check_prime (line 37) | async def check_prime(nums: list[int]) -> str:
FILE: contributing/samples/tool_human_in_the_loop_config/tools.py
function reimburse (line 20) | def reimburse(purpose: str, amount: float) -> str:
function ask_for_approval (line 27) | def ask_for_approval(
FILE: contributing/samples/vertex_code_execution/agent.py
function base_system_instruction (line 21) | def base_system_instruction():
FILE: contributing/samples/workflow_agent_seq/main.py
function main (line 30) | async def main():
FILE: contributing/samples/workflow_triage/agent.py
function update_execution_plan (line 22) | def update_execution_plan(
FILE: contributing/samples/workflow_triage/execution_agent.py
function before_agent_callback_check_relevance (line 27) | def before_agent_callback_check_relevance(
function instruction_provider_for_execution_summary_agent (line 83) | def instruction_provider_for_execution_summary_agent(
FILE: src/google/adk/a2a/agent/config.py
class ParametersConfig (line 44) | class ParametersConfig(BaseModel):
class RequestInterceptor (line 56) | class RequestInterceptor(BaseModel):
class A2aRemoteAgentConfig (line 82) | class A2aRemoteAgentConfig(BaseModel):
FILE: src/google/adk/a2a/agent/interceptors/new_integration_extension.py
function _before_request (line 33) | async def _before_request(
FILE: src/google/adk/a2a/agent/utils.py
function execute_before_request_interceptors (line 32) | async def execute_before_request_interceptors(
function execute_after_request_interceptors (line 57) | async def execute_after_request_interceptors(
FILE: src/google/adk/a2a/converters/event_converter.py
function _serialize_metadata_value (line 90) | def _serialize_metadata_value(value: Any) -> str:
function _get_context_metadata (line 108) | def _get_context_metadata(
function _create_artifact_id (line 161) | def _create_artifact_id(
function _process_long_running_tool (line 180) | def _process_long_running_tool(a2a_part: A2APart, event: Event) -> None:
function convert_a2a_task_to_event (line 202) | def convert_a2a_task_to_event(
function convert_a2a_message_to_event (line 270) | def convert_a2a_message_to_event(
function convert_event_to_a2a_message (line 372) | def convert_event_to_a2a_message(
function _create_error_status_event (line 420) | def _create_error_status_event(
function _create_status_update_event (line 468) | def _create_status_update_event(
function convert_event_to_a2a_events (line 533) | def convert_event_to_a2a_events(
FILE: src/google/adk/a2a/converters/from_adk_event.py
function _convert_adk_parts_to_a2a_parts (line 87) | def _convert_adk_parts_to_a2a_parts(
function create_error_status_event (line 125) | def create_error_status_event(
function convert_event_to_a2a_events (line 160) | def convert_event_to_a2a_events(
function _serialize_value (line 230) | def _serialize_value(value: Any) -> Optional[Any]:
function _add_event_metadata (line 256) | def _add_event_metadata(
FILE: src/google/adk/a2a/converters/long_running_functions.py
class LongRunningFunctions (line 45) | class LongRunningFunctions:
method __init__ (line 48) | def __init__(
method has_long_running_function_calls (line 56) | def has_long_running_function_calls(self) -> bool:
method process_event (line 60) | def process_event(self, event: Event) -> Event:
method create_long_running_function_call_event (line 95) | def create_long_running_function_call_event(
method _return_long_running_parts (line 123) | def _return_long_running_parts(self) -> List[A2APart]:
method _mark_long_running_function_call (line 139) | def _mark_long_running_function_call(self, a2a_part: A2APart) -> None:
function handle_user_input (line 166) | def handle_user_input(context: RequestContext) -> TaskStatusUpdateEvent ...
FILE: src/google/adk/a2a/converters/part_converter.py
function convert_a2a_part_to_genai_part (line 58) | def convert_a2a_part_to_genai_part(
function convert_genai_part_to_a2a_part (line 177) | def convert_genai_part_to_a2a_part(
FILE: src/google/adk/a2a/converters/request_converter.py
class AgentRunRequest (line 32) | class AgentRunRequest(BaseModel):
function _get_user_id (line 64) | def _get_user_id(request: RequestContext) -> str:
function convert_a2a_request_to_agent_run_request (line 78) | def convert_a2a_request_to_agent_run_request(
FILE: src/google/adk/a2a/converters/to_adk_event.py
function _convert_a2a_parts_to_adk_parts (line 128) | def _convert_a2a_parts_to_adk_parts(
function _create_event (line 170) | def _create_event(
function convert_a2a_task_to_event (line 203) | def convert_a2a_task_to_event(
function convert_a2a_message_to_event (line 261) | def convert_a2a_message_to_event(
function convert_a2a_status_update_to_event (line 299) | def convert_a2a_status_update_to_event(
function convert_a2a_artifact_update_to_event (line 342) | def convert_a2a_artifact_update_to_event(
FILE: src/google/adk/a2a/converters/utils.py
function _get_adk_metadata_key (line 22) | def _get_adk_metadata_key(key: str) -> str:
function _to_a2a_context_id (line 39) | def _to_a2a_context_id(app_name: str, user_id: str, session_id: str) -> ...
function _from_a2a_context_id (line 62) | def _from_a2a_context_id(
FILE: src/google/adk/a2a/executor/a2a_agent_executor.py
class A2aAgentExecutor (line 58) | class A2aAgentExecutor(AgentExecutor):
method __init__ (line 71) | def __init__(
method _resolve_runner (line 86) | async def _resolve_runner(self) -> Runner:
method cancel (line 111) | async def cancel(self, context: RequestContext, event_queue: EventQueue):
method execute (line 121) | async def execute(
method _handle_request (line 202) | async def _handle_request(
method _prepare_session (line 327) | async def _prepare_session(
method _check_new_version_extension (line 354) | def _check_new_version_extension(self, context: RequestContext):
FILE: src/google/adk/a2a/executor/a2a_agent_executor_impl.py
class _A2aAgentExecutor (line 59) | class _A2aAgentExecutor(AgentExecutor):
method __init__ (line 65) | def __init__(
method cancel (line 76) | async def cancel(self, context: RequestContext, event_queue: EventQueue):
method execute (line 82) | async def execute(
method _handle_request (line 189) | async def _handle_request(
method _resolve_runner (line 258) | async def _resolve_runner(self) -> Runner:
method _resolve_session (line 278) | async def _resolve_session(
method _get_invocation_metadata (line 301) | def _get_invocation_metadata(
FILE: src/google/adk/a2a/executor/config.py
class ExecuteInterceptor (line 45) | class ExecuteInterceptor:
class A2aAgentExecutorConfig (line 85) | class A2aAgentExecutorConfig(BaseModel):
FILE: src/google/adk/a2a/executor/executor_context.py
class ExecutorContext (line 20) | class ExecutorContext:
method __init__ (line 23) | def __init__(
method app_name (line 36) | def app_name(self) -> str:
method user_id (line 40) | def user_id(self) -> str:
method session_id (line 44) | def session_id(self) -> str:
method runner (line 48) | def runner(self) -> Runner:
FILE: src/google/adk/a2a/executor/task_result_aggregator.py
class TaskResultAggregator (line 26) | class TaskResultAggregator:
method __init__ (line 29) | def __init__(self):
method process_event (line 33) | def process_event(self, event: Event):
method task_state (line 66) | def task_state(self) -> TaskState:
method task_status_message (line 70) | def task_status_message(self) -> Message | None:
FILE: src/google/adk/a2a/executor/utils.py
function execute_before_agent_interceptors (line 28) | async def execute_before_agent_interceptors(
function execute_after_event_interceptors (line 39) | async def execute_after_event_interceptors(
function execute_after_agent_interceptors (line 56) | async def execute_after_agent_interceptors(
FILE: src/google/adk/a2a/utils/agent_card_builder.py
class AgentCardBuilder (line 41) | class AgentCardBuilder:
method __init__ (line 49) | def __init__(
method build (line 71) | async def build(self) -> AgentCard:
function _build_primary_skills (line 99) | async def _build_primary_skills(agent: BaseAgent) -> List[AgentSkill]:
function _build_llm_agent_skills (line 107) | async def _build_llm_agent_skills(agent: LlmAgent) -> List[AgentSkill]:
function _build_sub_agent_skills (line 143) | async def _build_sub_agent_skills(agent: BaseAgent) -> List[AgentSkill]:
function _build_tool_skills (line 171) | async def _build_tool_skills(agent: LlmAgent) -> List[AgentSkill]:
function _build_planner_skill (line 202) | def _build_planner_skill(agent: LlmAgent) -> AgentSkill:
function _build_code_executor_skill (line 215) | def _build_code_executor_skill(agent: LlmAgent) -> AgentSkill:
function _build_non_llm_agent_skills (line 228) | async def _build_non_llm_agent_skills(agent: BaseAgent) -> List[AgentSki...
function _build_orchestration_skill (line 261) | def _build_orchestration_skill(
function _get_agent_type (line 284) | def _get_agent_type(agent: BaseAgent) -> str:
function _get_agent_skill_name (line 298) | def _get_agent_skill_name(agent: BaseAgent) -> str:
function _build_agent_description (line 308) | def _build_agent_description(agent: BaseAgent) -> str:
function _build_llm_agent_description_with_instructions (line 329) | def _build_llm_agent_description_with_instructions(agent: LlmAgent) -> str:
function _replace_pronouns (line 354) | def _replace_pronouns(text: str) -> str:
function _get_workflow_description (line 385) | def _get_workflow_description(agent: BaseAgent) -> Optional[str]:
function _build_sequential_description (line 400) | def _build_sequential_description(agent: SequentialAgent) -> str:
function _build_parallel_description (line 416) | def _build_parallel_description(agent: ParallelAgent) -> str:
function _build_loop_description (line 432) | def _build_loop_description(agent: LoopAgent) -> str:
function _get_default_description (line 451) | def _get_default_description(agent: BaseAgent) -> str:
function _extract_inputs_from_examples (line 467) | def _extract_inputs_from_examples(examples: Optional[list[dict]]) -> lis...
function _extract_examples_from_agent (line 494) | async def _extract_examples_from_agent(
function _convert_example_tool_examples (line 517) | def _convert_example_tool_examples(tool: ExampleTool) -> List[Dict]:
function _extract_examples_from_instruction (line 535) | def _extract_examples_from_instruction(
function _get_input_modes (line 561) | def _get_input_modes(agent: BaseAgent) -> Optional[List[str]]:
function _get_output_modes (line 571) | def _get_output_modes(agent: BaseAgent) -> Optional[List[str]]:
FILE: src/google/adk/a2a/utils/agent_to_a2a.py
function _load_agent_card (line 40) | def _load_agent_card(
function to_a2a (line 76) | def to_a2a(
FILE: src/google/adk/agents/active_streaming_tool.py
class ActiveStreamingTool (line 26) | class ActiveStreamingTool(BaseModel):
FILE: src/google/adk/agents/agent_config.py
function agent_config_discriminator (line 41) | def agent_config_discriminator(v: Any) -> str:
class AgentConfig (line 72) | class AgentConfig(RootModel[ConfigsUnion]):
FILE: src/google/adk/agents/base_agent.py
class BaseAgentState (line 75) | class BaseAgentState(BaseModel):
class BaseAgent (line 86) | class BaseAgent(BaseModel):
method _load_agent_state (line 168) | def _load_agent_state(
method _create_agent_state_event (line 187) | def _create_agent_state_event(
method clone (line 211) | def clone(
method run_async (line 274) | async def run_async(
method run_live (line 307) | async def run_live(
method _run_async_impl (line 336) | async def _run_async_impl(
method _run_live_impl (line 352) | async def _run_live_impl(
method root_agent (line 369) | def root_agent(self) -> BaseAgent:
method find_agent (line 376) | def find_agent(self, name: str) -> Optional[BaseAgent]:
method find_sub_agent (line 389) | def find_sub_agent(self, name: str) -> Optional[BaseAgent]:
method _create_invocation_context (line 403) | def _create_invocation_context(
method canonical_before_agent_callbacks (line 411) | def canonical_before_agent_callbacks(self) -> list[_SingleAgentCallback]:
method canonical_after_agent_callbacks (line 423) | def canonical_after_agent_callbacks(self) -> list[_SingleAgentCallback]:
method _handle_before_agent_callback (line 434) | async def _handle_before_agent_callback(
method _handle_after_agent_callback (line 492) | async def _handle_after_agent_callback(
method model_post_init (line 552) | def model_post_init(self, __context: Any) -> None:
method validate_name (line 557) | def validate_name(cls, value: str):
method validate_sub_agents_unique_names (line 574) | def validate_sub_agents_unique_names(
method __set_parent_agent_for_sub_agents (line 611) | def __set_parent_agent_for_sub_agents(self) -> BaseAgent:
method from_config (line 625) | def from_config(
method _parse_config (line 649) | def _parse_config(
method __create_kwargs (line 671) | def __create_kwargs(
FILE: src/google/adk/agents/base_agent_config.py
class BaseAgentConfig (line 38) | class BaseAgentConfig(BaseModel):
FILE: src/google/adk/agents/common_configs.py
class ArgumentConfig (line 32) | class ArgumentConfig(BaseModel):
class CodeConfig (line 48) | class CodeConfig(BaseModel):
class AgentRefConfig (line 86) | class AgentRefConfig(BaseModel):
method validate_exactly_one_field (line 134) | def validate_exactly_one_field(self) -> AgentRefConfig:
FILE: src/google/adk/agents/config_agent_utils.py
function from_config (line 35) | def from_config(config_path: str) -> BaseAgent:
function _resolve_agent_class (line 67) | def _resolve_agent_class(agent_class: str) -> type[BaseAgent]:
function _load_config_from_path (line 83) | def _load_config_from_path(config_path: str) -> AgentConfig:
function resolve_fully_qualified_name (line 107) | def resolve_fully_qualified_name(name: str) -> Any:
function resolve_agent_reference (line 117) | def resolve_agent_reference(
function _resolve_agent_code_reference (line 146) | def _resolve_agent_code_reference(code: str) -> Any:
function resolve_code_reference (line 175) | def resolve_code_reference(code_config: CodeConfig) -> Any:
function resolve_callbacks (line 204) | def resolve_callbacks(callbacks_config: List[CodeConfig]) -> Any:
FILE: src/google/adk/agents/context.py
class Context (line 42) | class Context(ReadonlyContext):
method __init__ (line 45) | def __init__(
method function_call_id (line 77) | def function_call_id(self) -> str | None:
method function_call_id (line 82) | def function_call_id(self, value: str | None) -> None:
method tool_confirmation (line 87) | def tool_confirmation(self) -> ToolConfirmation | None:
method tool_confirmation (line 92) | def tool_confirmation(self, value: ToolConfirmation | None) -> None:
method state (line 98) | def state(self) -> State:
method actions (line 107) | def actions(self) -> EventActions:
method load_artifact (line 115) | async def load_artifact(
method save_artifact (line 138) | async def save_artifact(
method get_artifact_version (line 167) | async def get_artifact_version(
method list_artifacts (line 190) | async def list_artifacts(self) -> list[str]:
method save_credential (line 204) | async def save_credential(self, auth_config: AuthConfig) -> None:
method load_credential (line 216) | async def load_credential(
method get_auth_response (line 233) | def get_auth_response(self, auth_config: AuthConfig) -> AuthCredential...
method request_credential (line 250) | def request_credential(self, auth_config: AuthConfig) -> None:
method request_confirmation (line 278) | def request_confirmation(
method add_session_to_memory (line 314) | async def add_session_to_memory(self) -> None:
method add_events_to_memory (line 338) | async def add_events_to_memory(
method add_memory (line 368) | async def add_memory(
method search_memory (line 395) | async def search_memory(self, query: str) -> SearchMemoryResponse:
method render_ui_widget (line 419) | def render_ui_widget(self, ui_widget: UiWidget) -> None:
FILE: src/google/adk/agents/context_cache_config.py
class ContextCacheConfig (line 26) | class ContextCacheConfig(BaseModel):
method ttl_string (line 76) | def ttl_string(self) -> str:
method __str__ (line 80) | def __str__(self) -> str:
FILE: src/google/adk/agents/invocation_context.py
class LlmCallsLimitExceededError (line 47) | class LlmCallsLimitExceededError(Exception):
class RealtimeCacheEntry (line 51) | class RealtimeCacheEntry(BaseModel):
class _InvocationCostManager (line 70) | class _InvocationCostManager(BaseModel):
method increment_and_enforce_llm_calls_limit (line 81) | def increment_and_enforce_llm_calls_limit(
class InvocationContext (line 100) | class InvocationContext(BaseModel):
method is_resumable (line 225) | def is_resumable(self) -> bool:
method set_agent_state (line 232) | def set_agent_state(
method reset_sub_agent_states (line 264) | def reset_sub_agent_states(
method populate_invocation_agent_states (line 283) | def populate_invocation_agent_states(self) -> None:
method increment_llm_call_count (line 314) | def increment_llm_call_count(
method app_name (line 328) | def app_name(self) -> str:
method user_id (line 332) | def user_id(self) -> str:
method _get_events (line 336) | def _get_events(
method should_pause_invocation (line 363) | def should_pause_invocation(self, event: Event) -> bool:
method _find_matching_function_call (line 400) | def _find_matching_function_call(
function new_invocation_context_id (line 416) | def new_invocation_context_id() -> str:
FILE: src/google/adk/agents/langgraph_agent.py
function _get_last_human_messages (line 34) | def _get_last_human_messages(events: list[Event]) -> list[HumanMessage]:
class LangGraphAgent (line 52) | class LangGraphAgent(BaseAgent):
method _run_async_impl (line 65) | async def _run_async_impl(
method _get_messages (line 103) | def _get_messages(
method _get_conversation_with_agent (line 123) | def _get_conversation_with_agent(
FILE: src/google/adk/agents/live_request_queue.py
class LiveRequest (line 26) | class LiveRequest(BaseModel):
class LiveRequestQueue (line 60) | class LiveRequestQueue:
method __init__ (line 63) | def __init__(self):
method close (line 66) | def close(self):
method send_content (line 69) | def send_content(self, content: types.Content):
method send_realtime (line 72) | def send_realtime(self, blob: types.Blob):
method send_activity_start (line 75) | def send_activity_start(self):
method send_activity_end (line 79) | def send_activity_end(self):
method send (line 83) | def send(self, req: LiveRequest):
method get (line 86) | async def get(self) -> LiveRequest:
FILE: src/google/adk/agents/llm_agent.py
function _convert_tool_union_to_tools (line 139) | async def _convert_tool_union_to_tools(
class LlmAgent (line 187) | class LlmAgent(BaseAgent):
method _run_async_impl (line 459) | async def _run_async_impl(
method _run_live_impl (line 499) | async def _run_live_impl(
method canonical_model (line 510) | def canonical_model(self) -> BaseLlm:
method set_default_model (line 528) | def set_default_model(cls, model: Union[str, BaseLlm]) -> None:
method _resolve_default_model (line 537) | def _resolve_default_model(cls) -> BaseLlm:
method canonical_instruction (line 544) | async def canonical_instruction(
method canonical_global_instruction (line 568) | async def canonical_global_instruction(
method canonical_tools (line 602) | async def canonical_tools(
method canonical_before_model_callbacks (line 627) | def canonical_before_model_callbacks(
method canonical_after_model_callbacks (line 641) | def canonical_after_model_callbacks(self) -> list[_SingleAfterModelCal...
method canonical_on_model_error_callbacks (line 653) | def canonical_on_model_error_callbacks(
method canonical_before_tool_callbacks (line 667) | def canonical_before_tool_callbacks(
method canonical_after_tool_callbacks (line 681) | def canonical_after_tool_callbacks(
method canonical_on_tool_error_callbacks (line 695) | def canonical_on_tool_error_callbacks(
method _llm_flow (line 709) | def _llm_flow(self) -> BaseLlmFlow:
method _get_subagent_to_resume (line 719) | def _get_subagent_to_resume(
method __get_agent_to_run (line 764) | def __get_agent_to_run(self, agent_name: str) -> BaseAgent:
method _get_available_agent_names (line 784) | def _get_available_agent_names(self) -> list[str]:
method __get_transfer_to_agent_or_none (line 805) | def __get_transfer_to_agent_or_none(
method __maybe_save_output_to_state (line 821) | def __maybe_save_output_to_state(self, event: Event):
method __model_validator_after (line 854) | def __model_validator_after(self) -> LlmAgent:
method validate_generate_content_config (line 859) | def validate_generate_content_config(
method model_post_init (line 877) | def model_post_init(self, __context: Any) -> None:
method _resolve_tools (line 895) | def _resolve_tools(
method _parse_config (line 954) | def _parse_config(
FILE: src/google/adk/agents/llm_agent_config.py
class LlmAgentConfig (line 35) | class LlmAgentConfig(BaseAgentConfig):
method _normalize_model_code (line 76) | def _normalize_model_code(cls, data: Any) -> dict[str, Any] | Any:
method _validate_model_sources (line 94) | def _validate_model_sources(self) -> LlmAgentConfig:
FILE: src/google/adk/agents/loop_agent.py
class LoopAgentState (line 42) | class LoopAgentState(BaseAgentState):
class LoopAgent (line 52) | class LoopAgent(BaseAgent):
method _run_async_impl (line 70) | async def _run_async_impl(
method _get_start_state (line 125) | def _get_start_state(
method _run_live_impl (line 149) | async def _run_live_impl(
method _parse_config (line 158) | def _parse_config(
FILE: src/google/adk/agents/loop_agent_config.py
class LoopAgentConfig (line 30) | class LoopAgentConfig(BaseAgentConfig):
FILE: src/google/adk/agents/mcp_instruction_provider.py
class McpInstructionProvider (line 32) | class McpInstructionProvider(InstructionProvider):
method __init__ (line 35) | def __init__(
method __call__ (line 56) | async def __call__(self, context: ReadonlyContext) -> str:
FILE: src/google/adk/agents/parallel_agent.py
function _create_branch_ctx_for_sub_agent (line 35) | def _create_branch_ctx_for_sub_agent(
function _merge_agent_run (line 51) | async def _merge_agent_run(
function _merge_agent_run_pre_3_11 (line 89) | async def _merge_agent_run_pre_3_11(
class ParallelAgent (line 150) | class ParallelAgent(BaseAgent):
method _run_async_impl (line 164) | async def _run_async_impl(
method _run_live_impl (line 212) | async def _run_live_impl(
FILE: src/google/adk/agents/parallel_agent_config.py
class ParallelAgentConfig (line 28) | class ParallelAgentConfig(BaseAgentConfig):
FILE: src/google/adk/agents/readonly_context.py
class ReadonlyContext (line 30) | class ReadonlyContext:
method __init__ (line 32) | def __init__(
method user_content (line 39) | def user_content(self) -> Optional[types.Content]:
method invocation_id (line 44) | def invocation_id(self) -> str:
method agent_name (line 49) | def agent_name(self) -> str:
method state (line 54) | def state(self) -> MappingProxyType[str, Any]:
method session (line 59) | def session(self) -> Session:
method user_id (line 64) | def user_id(self) -> str:
method run_config (line 69) | def run_config(self) -> Optional[RunConfig]:
FILE: src/google/adk/agents/remote_a2a_agent.py
class AgentCardResolutionError (line 95) | class AgentCardResolutionError(Exception):
class A2AClientError (line 102) | class A2AClientError(Exception):
class RemoteA2aAgent (line 109) | class RemoteA2aAgent(BaseAgent):
method __init__ (line 124) | def __init__(
method _ensure_httpx_client (line 213) | async def _ensure_httpx_client(self) -> httpx.AsyncClient:
method _resolve_agent_card_from_url (line 241) | async def _resolve_agent_card_from_url(self, url: str) -> AgentCard:
method _resolve_agent_card_from_file (line 264) | async def _resolve_agent_card_from_file(self, file_path: str) -> Agent...
method _resolve_agent_card (line 285) | async def _resolve_agent_card(self) -> AgentCard:
method _validate_agent_card (line 294) | async def _validate_agent_card(self, agent_card: AgentCard) -> None:
method _ensure_resolved (line 311) | async def _ensure_resolved(self) -> None:
method _create_a2a_request_for_user_function_response (line 346) | def _create_a2a_request_for_user_function_response(
method _is_remote_response (line 373) | def _is_remote_response(self, event: Event) -> bool:
method _construct_message_parts_from_session (line 380) | def _construct_message_parts_from_session(
method _handle_a2a_response (line 432) | async def _handle_a2a_response(
method _handle_a2a_response_v2 (line 539) | async def _handle_a2a_response_v2(
method _run_async_impl (line 609) | async def _run_async_impl(
method _run_live_impl (line 751) | async def _run_live_impl(
method cleanup (line 761) | async def cleanup(self) -> None:
FILE: src/google/adk/agents/run_config.py
class ToolThreadPoolConfig (line 36) | class ToolThreadPoolConfig(BaseModel):
class StreamingMode (line 54) | class StreamingMode(Enum):
class RunConfig (line 184) | class RunConfig(BaseModel):
method check_for_deprecated_save_live_audio (line 346) | def check_for_deprecated_save_live_audio(cls, data: Any) -> Any:
method validate_max_llm_calls (line 361) | def validate_max_llm_calls(cls, value: int) -> int:
FILE: src/google/adk/agents/sequential_agent.py
class SequentialAgentState (line 41) | class SequentialAgentState(BaseAgentState):
class SequentialAgent (line 48) | class SequentialAgent(BaseAgent):
method _run_async_impl (line 55) | async def _run_async_impl(
method _get_start_index (line 94) | def _get_start_index(
method _run_live_impl (line 120) | async def _run_live_impl(
FILE: src/google/adk/agents/sequential_agent_config.py
class SequentialAgentConfig (line 28) | class SequentialAgentConfig(BaseAgentConfig):
FILE: src/google/adk/agents/transcription_entry.py
class TranscriptionEntry (line 25) | class TranscriptionEntry(BaseModel):
FILE: src/google/adk/apps/app.py
function validate_app_name (line 30) | def validate_app_name(name: str) -> None:
class ResumabilityConfig (line 42) | class ResumabilityConfig(BaseModel):
class EventsCompactionConfig (line 63) | class EventsCompactionConfig(BaseModel):
method _validate_token_params (line 101) | def _validate_token_params(self) -> EventsCompactionConfig:
class App (line 111) | class App(BaseModel):
method _validate_name (line 149) | def _validate_name(self) -> App:
FILE: src/google/adk/apps/base_events_summarizer.py
class BaseEventsSummarizer (line 26) | class BaseEventsSummarizer(abc.ABC):
method maybe_summarize_events (line 30) | async def maybe_summarize_events(
FILE: src/google/adk/apps/compaction.py
function _count_text_chars_in_content (line 32) | def _count_text_chars_in_content(content: types.Content | None) -> int:
function _valid_compactions (line 42) | def _valid_compactions(
function _is_compaction_subsumed (line 66) | def _is_compaction_subsumed(
function _estimate_prompt_token_count (line 91) | def _estimate_prompt_token_count(
function _latest_prompt_token_count (line 122) | def _latest_prompt_token_count(
function _latest_compaction_event (line 142) | def _latest_compaction_event(events: list[Event]) -> Event | None:
function _latest_compaction_end_timestamp (line 161) | def _latest_compaction_end_timestamp(events: list[Event]) -> float:
function _has_token_threshold_config (line 171) | def _has_token_threshold_config(config: EventsCompactionConfig | None) -...
function _has_sliding_window_config (line 180) | def _has_sliding_window_config(config: EventsCompactionConfig | None) ->...
function _ensure_compaction_summarizer (line 189) | def _ensure_compaction_summarizer(
function _events_to_compact_for_token_threshold (line 205) | def _events_to_compact_for_token_threshold(
function _event_function_call_ids (line 262) | def _event_function_call_ids(event: Event) -> set[str]:
function _event_function_response_ids (line 271) | def _event_function_response_ids(event: Event) -> set[str]:
function _pending_function_call_ids (line 280) | def _pending_function_call_ids(events: list[Event]) -> set[str]:
function _has_pending_function_call (line 297) | def _has_pending_function_call(event: Event, pending_ids: set[str]) -> b...
function _truncate_events_before_pending_function_call (line 303) | def _truncate_events_before_pending_function_call(
function _safe_token_compaction_split_index (line 313) | def _safe_token_compaction_split_index(
function _run_compaction_for_token_threshold_config (line 349) | async def _run_compaction_for_token_threshold_config(
function _run_compaction_for_token_threshold (line 396) | async def _run_compaction_for_token_threshold(
function _run_compaction_for_sliding_window (line 414) | async def _run_compaction_for_sliding_window(
FILE: src/google/adk/apps/llm_event_summarizer.py
class LlmEventSummarizer (line 30) | class LlmEventSummarizer(BaseEventsSummarizer):
method __init__ (line 57) | def __init__(
method _format_events_for_prompt (line 73) | def _format_events_for_prompt(self, events: list[Event]) -> str:
method maybe_summarize_events (line 83) | async def maybe_summarize_events(
FILE: src/google/adk/artifacts/artifact_util.py
class ParsedArtifactUri (line 25) | class ParsedArtifactUri(NamedTuple):
function parse_artifact_uri (line 43) | def parse_artifact_uri(uri: str) -> Optional[ParsedArtifactUri]:
function get_artifact_uri (line 78) | def get_artifact_uri(
function is_artifact_ref (line 103) | def is_artifact_ref(artifact: types.Part) -> bool:
FILE: src/google/adk/artifacts/base_artifact_service.py
class ArtifactVersion (line 34) | class ArtifactVersion(BaseModel):
function ensure_part (line 68) | def ensure_part(artifact: Union[types.Part, dict[str, Any]]) -> types.Part:
class BaseArtifactService (line 88) | class BaseArtifactService(ABC):
method save_artifact (line 92) | async def save_artifact(
method load_artifact (line 127) | async def load_artifact(
method list_artifact_keys (line 154) | async def list_artifact_keys(
method delete_artifact (line 172) | async def delete_artifact(
method list_versions (line 191) | async def list_versions(
method list_artifact_versions (line 213) | async def list_artifact_versions(
method get_artifact_version (line 237) | async def get_artifact_version(
FILE: src/google/adk/artifacts/file_artifact_service.py
function _iter_artifact_dirs (line 44) | def _iter_artifact_dirs(root: Path) -> list[Path]:
function _file_uri_to_path (line 57) | def _file_uri_to_path(uri: str) -> Optional[Path]:
function _file_has_user_namespace (line 68) | def _file_has_user_namespace(filename: str) -> bool:
function _strip_user_namespace (line 73) | def _strip_user_namespace(filename: str) -> str:
function _to_posix_path (line 80) | def _to_posix_path(path_value: str) -> PurePosixPath:
function _resolve_scoped_artifact_path (line 88) | def _resolve_scoped_artifact_path(
function _is_user_scoped (line 136) | def _is_user_scoped(session_id: Optional[str], filename: str) -> bool:
function _user_artifacts_dir (line 141) | def _user_artifacts_dir(base_root: Path) -> Path:
function _session_artifacts_dir (line 146) | def _session_artifacts_dir(base_root: Path, session_id: str) -> Path:
function _versions_dir (line 151) | def _versions_dir(artifact_dir: Path) -> Path:
function _metadata_path (line 156) | def _metadata_path(artifact_dir: Path, version: int) -> Path:
function _list_versions_on_disk (line 161) | def _list_versions_on_disk(artifact_dir: Path) -> list[int]:
class FileArtifactVersion (line 176) | class FileArtifactVersion(ArtifactVersion):
class FileArtifactService (line 189) | class FileArtifactService(BaseArtifactService):
method __init__ (line 212) | def __init__(self, root_dir: Path | str):
method _base_root (line 221) | def _base_root(self, user_id: str, /) -> Path:
method _scope_root (line 225) | def _scope_root(
method _artifact_dir (line 241) | def _artifact_dir(
method _build_artifact_version (line 256) | def _build_artifact_version(
method _canonical_uri (line 285) | def _canonical_uri(
method _latest_metadata (line 303) | def _latest_metadata(
method save_artifact (line 313) | async def save_artifact(
method _save_artifact_sync (line 340) | def _save_artifact_sync(
method load_artifact (line 406) | async def load_artifact(
method _load_artifact_sync (line 423) | def _load_artifact_sync(
method list_artifact_keys (line 477) | async def list_artifact_keys(
method _list_artifact_keys_sync (line 490) | def _list_artifact_keys_sync(
method delete_artifact (line 522) | async def delete_artifact(
method _delete_artifact_sync (line 546) | def _delete_artifact_sync(
method list_versions (line 562) | async def list_versions(
method _list_versions_sync (line 578) | def _list_versions_sync(
method list_artifact_versions (line 592) | async def list_artifact_versions(
method _list_artifact_versions_sync (line 608) | def _list_artifact_versions_sync(
method get_artifact_version (line 636) | async def get_artifact_version(
method _get_artifact_version_sync (line 654) | def _get_artifact_version_sync(
function _write_metadata (line 687) | def _write_metadata(
function _read_metadata (line 712) | def _read_metadata(path: Path) -> Optional[FileArtifactVersion]:
FILE: src/google/adk/artifacts/gcs_artifact_service.py
class GcsArtifactService (line 43) | class GcsArtifactService(BaseArtifactService):
method __init__ (line 46) | def __init__(self, bucket_name: str, **kwargs):
method save_artifact (line 60) | async def save_artifact(
method load_artifact (line 81) | async def load_artifact(
method list_artifact_keys (line 100) | async def list_artifact_keys(
method delete_artifact (line 111) | async def delete_artifact(
method list_versions (line 128) | async def list_versions(
method _file_has_user_namespace (line 144) | def _file_has_user_namespace(self, filename: str) -> bool:
method _get_blob_prefix (line 156) | def _get_blob_prefix(
method _get_blob_name (line 173) | def _get_blob_name(
method _save_artifact (line 197) | def _save_artifact(
method _load_artifact (line 244) | def _load_artifact(
method _list_artifact_keys (line 276) | def _list_artifact_keys(
method _delete_artifact (line 307) | def _delete_artifact(
method _list_versions (line 328) | def _list_versions(
method _get_artifact_version_sync (line 360) | def _get_artifact_version_sync(
method _list_artifact_versions_sync (line 397) | def _list_artifact_versions_sync(
method list_artifact_versions (line 432) | async def list_artifact_versions(
method get_artifact_version (line 449) | async def get_artifact_version(
FILE: src/google/adk/artifacts/in_memory_artifact_service.py
class _ArtifactEntry (line 37) | class _ArtifactEntry:
class InMemoryArtifactService (line 49) | class InMemoryArtifactService(BaseArtifactService, BaseModel):
method _file_has_user_namespace (line 58) | def _file_has_user_namespace(self, filename: str) -> bool:
method _artifact_path (line 70) | def _artifact_path(
method save_artifact (line 98) | async def save_artifact(
method load_artifact (line 148) | async def load_artifact(
method list_artifact_keys (line 200) | async def list_artifact_keys(
method delete_artifact (line 218) | async def delete_artifact(
method list_versions (line 232) | async def list_versions(
method list_artifact_versions (line 247) | async def list_artifact_versions(
method get_artifact_version (line 262) | async def get_artifact_version(
FILE: src/google/adk/auth/auth_credential.py
class BaseModelWithConfig (line 31) | class BaseModelWithConfig(BaseModel):
class HttpCredentials (line 40) | class HttpCredentials(BaseModelWithConfig):
method model_validate (line 48) | def model_validate(cls, data: Dict[str, Any]) -> "HttpCredentials":
class HttpAuth (line 56) | class HttpAuth(BaseModelWithConfig):
class OAuth2Auth (line 68) | class OAuth2Auth(BaseModelWithConfig):
class ServiceAccountCredential (line 97) | class ServiceAccountCredential(BaseModelWithConfig):
class ServiceAccount (line 148) | class ServiceAccount(BaseModelWithConfig):
method _validate_config (line 172) | def _validate_config(self) -> ServiceAccount:
class AuthCredentialTypes (line 190) | class AuthCredentialTypes(str, Enum):
class AuthCredential (line 214) | class AuthCredential(BaseModelWithConfig):
FILE: src/google/adk/auth/auth_handler.py
class AuthHandler (line 38) | class AuthHandler:
method __init__ (line 44) | def __init__(self, auth_config: AuthConfig):
method exchange_auth_token (line 47) | async def exchange_auth_token(
method parse_and_store_auth_response (line 56) | async def parse_and_store_auth_response(self, state: State) -> None:
method _validate (line 71) | def _validate(self) -> None:
method get_auth_response (line 75) | def get_auth_response(self, state: State) -> AuthCredential:
method generate_auth_request (line 79) | def generate_auth_request(self) -> AuthConfig:
method generate_auth_uri (line 140) | def generate_auth_uri(
FILE: src/google/adk/auth/auth_preprocessor.py
function _store_auth_and_collect_resume_targets (line 40) | async def _store_auth_and_collect_resume_targets(
class _AuthLlmRequestProcessor (line 127) | class _AuthLlmRequestProcessor(BaseLlmRequestProcessor):
method run_async (line 131) | async def run_async(
FILE: src/google/adk/auth/auth_provider_registry.py
class AuthProviderRegistry (line 26) | class AuthProviderRegistry:
method __init__ (line 29) | def __init__(self):
method register (line 32) | def register(
method get_provider (line 45) | def get_provider(self, auth_scheme: AuthScheme) -> BaseAuthProvider | ...
FILE: src/google/adk/auth/auth_schemes.py
class OpenIdConnectWithConfig (line 32) | class OpenIdConnectWithConfig(SecurityBase):
class OAuthGrantType (line 49) | class OAuthGrantType(str, Enum):
method from_flow (line 58) | def from_flow(flow: OAuthFlows) -> "OAuthGrantType":
class ExtendedOAuth2 (line 76) | class ExtendedOAuth2(OAuth2):
FILE: src/google/adk/auth/auth_tool.py
function _stable_model_digest (line 29) | def _stable_model_digest(model: BaseModel) -> str:
class AuthConfig (line 51) | class AuthConfig(BaseModelWithConfig):
method __init__ (line 82) | def __init__(self, **data):
method get_credential_key (line 97) | def get_credential_key(self):
class AuthToolArguments (line 138) | class AuthToolArguments(BaseModelWithConfig):
FILE: src/google/adk/auth/base_auth_provider.py
class BaseAuthProvider (line 28) | class BaseAuthProvider(ABC):
method get_auth_credential (line 32) | async def get_auth_credential(
FILE: src/google/adk/auth/credential_manager.py
class CredentialManager (line 42) | class CredentialManager:
method __init__ (line 80) | def __init__(
method register_credential_exchanger (line 116) | def register_credential_exchanger(
method request_credential (line 129) | async def request_credential(self, context: CallbackContext) -> None:
method get_auth_credential (line 137) | async def get_auth_credential(
method _load_existing_credential (line 210) | async def _load_existing_credential(
method _load_from_credential_service (line 222) | async def _load_from_credential_service(
method _load_from_auth_response (line 233) | async def _load_from_auth_response(
method _exchange_credential (line 239) | async def _exchange_credential(
method _refresh_credential (line 260) | async def _refresh_credential(
method _is_credential_ready (line 278) | def _is_credential_ready(self) -> bool:
method _validate_credential (line 291) | async def _validate_credential(self) -> None:
method _save_credential (line 326) | async def _save_credential(
method _populate_auth_scheme (line 336) | async def _populate_auth_scheme(self) -> bool:
method _missing_oauth_info (line 371) | def _missing_oauth_info(self) -> bool:
method _is_client_credentials_flow (line 390) | def _is_client_credentials_flow(self) -> bool:
FILE: src/google/adk/auth/credential_service/base_credential_service.py
class BaseCredentialService (line 28) | class BaseCredentialService(ABC):
method load_credential (line 33) | async def load_credential(
method save_credential (line 56) | async def save_credential(
FILE: src/google/adk/auth/credential_service/in_memory_credential_service.py
class InMemoryCredentialService (line 29) | class InMemoryCredentialService(BaseCredentialService):
method __init__ (line 32) | def __init__(self):
method load_credential (line 37) | async def load_credential(
method save_credential (line 46) | async def save_credential(
method _get_bucket_for_current_context (line 56) | def _get_bucket_for_current_context(
FILE: src/google/adk/auth/credential_service/session_state_credential_service.py
class SessionStateCredentialService (line 29) | class SessionStateCredentialService(BaseCredentialService):
method load_credential (line 36) | async def load_credential(
method save_credential (line 60) | async def save_credential(
FILE: src/google/adk/auth/exchanger/base_credential_exchanger.py
class CredentialExchangeError (line 28) | class CredentialExchangeError(Exception):
class ExchangeResult (line 32) | class ExchangeResult(NamedTuple):
class BaseCredentialExchanger (line 38) | class BaseCredentialExchanger(abc.ABC):
method exchange (line 46) | async def exchange(
FILE: src/google/adk/auth/exchanger/credential_exchanger_registry.py
class CredentialExchangerRegistry (line 28) | class CredentialExchangerRegistry:
method __init__ (line 31) | def __init__(self):
method register (line 34) | def register(
method get_exchanger (line 47) | def get_exchanger(
FILE: src/google/adk/auth/exchanger/oauth2_credential_exchanger.py
class OAuth2CredentialExchanger (line 47) | class OAuth2CredentialExchanger(BaseCredentialExchanger):
method exchange (line 51) | async def exchange(
method _determine_grant_type (line 104) | def _determine_grant_type(
method _exchange_client_credentials (line 130) | async def _exchange_client_credentials(
method _normalize_auth_uri (line 165) | def _normalize_auth_uri(self, auth_uri: str | None) -> str | None:
method _exchange_authorization_code (line 173) | async def _exchange_authorization_code(
FILE: src/google/adk/auth/oauth2_credential_util.py
function create_oauth2_session (line 34) | def create_oauth2_session(
function update_credential_with_tokens (line 101) | def update_credential_with_tokens(
FILE: src/google/adk/auth/oauth2_discovery.py
class AuthorizationServerMetadata (line 33) | class AuthorizationServerMetadata(BaseModel):
class ProtectedResourceMetadata (line 44) | class ProtectedResourceMetadata(BaseModel):
class OAuth2DiscoveryManager (line 52) | class OAuth2DiscoveryManager:
method discover_auth_server_metadata (line 55) | async def discover_auth_server_metadata(
method discover_resource_metadata (line 106) | async def discover_resource_metadata(
FILE: src/google/adk/auth/refresher/base_credential_refresher.py
class CredentialRefresherError (line 27) | class CredentialRefresherError(Exception):
class BaseCredentialRefresher (line 32) | class BaseCredentialRefresher(abc.ABC):
method is_refresh_needed (line 40) | async def is_refresh_needed(
method refresh (line 57) | async def refresh(
FILE: src/google/adk/auth/refresher/credential_refresher_registry.py
class CredentialRefresherRegistry (line 29) | class CredentialRefresherRegistry:
method __init__ (line 32) | def __init__(self):
method register (line 35) | def register(
method get_refresher (line 48) | def get_refresher(
FILE: src/google/adk/auth/refresher/oauth2_credential_refresher.py
class OAuth2CredentialRefresher (line 45) | class OAuth2CredentialRefresher(BaseCredentialRefresher):
method is_refresh_needed (line 49) | async def is_refresh_needed(
method refresh (line 77) | async def refresh(
FILE: src/google/adk/cli/adk_web_server.py
function _parse_cors_origins (line 113) | def _parse_cors_origins(
class ApiServerSpanExporter (line 141) | class ApiServerSpanExporter(export_lib.SpanExporter):
method __init__ (line 143) | def __init__(self, trace_dict):
method export (line 146) | def export(
method force_flush (line 162) | def force_flush(self, timeout_millis: int = 30000) -> bool:
class InMemoryExporter (line 166) | class InMemoryExporter(export_lib.SpanExporter):
method __init__ (line 168) | def __init__(self, trace_dict):
method export (line 174) | def export(
method force_flush (line 191) | def force_flush(self, timeout_millis: int = 30000) -> bool:
method get_finished_spans (line 194) | def get_finished_spans(self, session_id: str):
method clear (line 200) | def clear(self):
class RunAgentRequest (line 204) | class RunAgentRequest(common.BaseModel):
class CreateSessionRequest (line 217) | class CreateSessionRequest(common.BaseModel):
class SaveArtifactRequest (line 234) | class SaveArtifactRequest(common.BaseModel):
class AddSessionToEvalSetRequest (line 247) | class AddSessionToEvalSetRequest(common.BaseModel):
class RunEvalRequest (line 253) | class RunEvalRequest(common.BaseModel):
class UpdateMemoryRequest (line 269) | class UpdateMemoryRequest(common.BaseModel):
class UpdateSessionRequest (line 276) | class UpdateSessionRequest(common.BaseModel):
class RunEvalResult (line 283) | class RunEvalResult(common.BaseModel):
class RunEvalResponse (line 301) | class RunEvalResponse(common.BaseModel):
class GetEventGraphResult (line 305) | class GetEventGraphResult(common.BaseModel):
class CreateEvalSetRequest (line 309) | class CreateEvalSetRequest(common.BaseModel):
class ListEvalSetsResponse (line 313) | class ListEvalSetsResponse(common.BaseModel):
class EvalResult (line 317) | class EvalResult(EvalSetResult):
class ListEvalResultsResponse (line 325) | class ListEvalResultsResponse(common.BaseModel):
class ListMetricsInfoResponse (line 329) | class ListMetricsInfoResponse(common.BaseModel):
class AppInfo (line 333) | class AppInfo(common.BaseModel):
class ListAppsResponse (line 341) | class ListAppsResponse(common.BaseModel):
function _setup_telemetry (line 345) | def _setup_telemetry(
function _otel_env_vars_enabled (line 364) | def _otel_env_vars_enabled() -> bool:
function _setup_gcp_telemetry (line 376) | def _setup_gcp_telemetry(
function _setup_telemetry_from_env (line 418) | def _setup_telemetry_from_env(
function _setup_instrumentation_lib_if_installed (line 435) | def _setup_instrumentation_lib_if_installed():
class AdkWebServer (line 450) | class AdkWebServer:
method __init__ (line 485) | def __init__(
method get_runner_async (line 520) | async def get_runner_async(self, app_name: str) -> Runner:
method _get_root_agent (line 554) | def _get_root_agent(self, agent_or_app: BaseAgent | App) -> BaseAgent:
method _create_runner (line 560) | def _create_runner(self, agentic_app: App) -> Runner:
method _instantiate_extra_plugins (line 571) | def _instantiate_extra_plugins(self) -> list[BasePlugin]:
method _import_plugin_object (line 589) | def _import_plugin_object(self, qualified_name: str) -> Any:
method _setup_runtime_config (line 607) | def _setup_runtime_config(self, web_assets_dir: str):
method _create_session (line 654) | async def _create_session(
method get_fast_api_app (line 681) | def get_fast_api_app(
FILE: src/google/adk/cli/agent_graph.py
function build_graph (line 41) | async def build_graph(
function get_agent_graph (line 285) | async def get_agent_graph(root_agent, highlights_pairs, image=False):
FILE: src/google/adk/cli/browser/assets/audio-processor.js
class AudioProcessor (line 17) | class AudioProcessor extends AudioWorkletProcessor {
method constructor (line 18) | constructor() {
method process (line 25) | process(inputs, outputs, parameters) {
method resample (line 39) | resample(audioData) {
FILE: src/google/adk/cli/browser/chunk-5MGPUGAY.js
class i (line 1) | class i extends f{value=c.required();label=c.required();inputChecked=s((...
method handleChange (line 1) | handleChange(t){let n=this.value()?.path;!(t.target instanceof HTMLInp...
FILE: src/google/adk/cli/browser/chunk-66RH7XMI.js
class n (line 1) | class n extends y{action=h.required();handleClick(){let t=this.action();...
method handleClick (line 1) | handleClick(){let t=this.action();t&&super.sendAction(t)}
FILE: src/google/adk/cli/browser/chunk-AF27AUNK.js
class a (line 1) | class a extends b{value=n.required();label=n("");minValue=n.required();m...
method handleInput (line 1) | handleInput(t){let i=this.value()?.path;!(t.target instanceof HTMLInpu...
FILE: src/google/adk/cli/browser/chunk-ARP3QDVK.js
function E (line 1) | function E(n,O){if(n&1&&(l(0,"label",2),T(1),s()),n&2){let t=M(),i=P(0);...
class n (line 1) | class n extends D{text=r.required();label=r.required();inputType=r.requi...
method handleInput (line 1) | handleInput(t){let i=this.text()?.path;!(t.target instanceof HTMLInput...
FILE: src/google/adk/cli/browser/chunk-BI6TV3NL.js
function D (line 1) | function D(e,P){if(e&1&&(c(0,"section"),m(1,"audio",1),u()),e&2){let t=v...
class e (line 1) | class e extends _{url=M.required();resolvedUrl=C(()=>this.resolvePrimiti...
FILE: src/google/adk/cli/browser/chunk-FZZPD3K2.js
class i (line 1) | class i extends N{value=l.required();enableDate=l.required();enableTime=...
method handleInput (line 1) | handleInput(t){let n=this.value()?.path;!(t.target instanceof HTMLInpu...
method padNumber (line 1) | padNumber(t){return t.toString().padStart(2,"0")}
FILE: src/google/adk/cli/browser/chunk-GFARMTUE.js
function _ (line 1) | function _(e,D){if(e&1&&(m(0,"section")(1,"span",1),f(2),d()()),e&2){let...
class e (line 1) | class e extends M{name=I.required();resolvedName=C(()=>this.resolvePrimi...
FILE: src/google/adk/cli/browser/chunk-GLGQFQO2.js
function B (line 1) | function B(n,m){if(n&1){let t=g();l(0,"button",2),T("click",function(){l...
class n (line 1) | class n extends L{selectedIndex=b(0);tabs=w.required();buttonClasses=$((...
FILE: src/google/adk/cli/browser/chunk-GLGRLUIJ.js
function l (line 1) | function l(i,e){for(var t=0;t<e.length;t++){var r=e[t];r.enumerable=r.en...
function l (line 1) | function l(i,e){var t=[],r=!0,n=!1,o=void 0;try{for(var c=i[Symbol.itera...
function A (line 1) | function A(l){var i=arguments.length>1&&arguments[1]!==void 0?arguments[...
function l (line 1) | function l(i,e,t,r){O(this,l);var n=this;function o(a){if(a.startsWith("...
function l (line 1) | function l(){O(this,l),this._events=[]}
function U (line 1) | function U(l){var i=document.createElement("div");return i.innerHTML=l,i...
function T (line 1) | function T(l,i,e){var t=!1;function r(a,s,p){return Math.max(s,Math.min(...
function _ (line 2) | function _(l,i){return(i||document).querySelector(l)}
function M (line 2) | function M(l){l.preventDefault(),l.stopPropagation()}
function D (line 2) | function D(l,i,e,t,r){l.add(i,P,function(n){e.indexOf(n.key)>=0&&(r&&M(n...
function l (line 2) | function l(i){O(this,l),this.settings={popup:"right",layout:"default",al...
function n (line 2) | function n(s,p,u){for(var f in s)u&&u.indexOf(f)>=0||(p[f]=s[f])}
function o (line 2) | function o(s,p,u){n.add(s,p,u)}
function b (line 2) | function b(I,C,L){C.style.left=L*100+"%"}
function m (line 2) | function m(I,C,L){C.style.top=L*100+"%"}
FILE: src/google/adk/cli/browser/chunk-MBYWPZQV.js
function P (line 1) | function P(i,p){if(i&1&&(l(0,"option",2),d(1),a()),i&2){let t=p.$implici...
class i (line 1) | class i extends b{options=c.required();value=c.required();description=c....
method handleChange (line 1) | handleChange(t){let o=this.value()?.path;!(t.target instanceof HTMLSel...
FILE: src/google/adk/cli/browser/chunk-N3RKSFBU.js
function H (line 1) | function H(t,U){if(t&1&&(g(0,"section"),v(1,"img",1),p()),t&2){let e=f()...
class t (line 1) | class t extends I{url=r.required();usageHint=r.required();resolvedUrl=s(...
FILE: src/google/adk/cli/browser/chunk-R2IMOXM4.js
class e (line 1) | class e extends m{static \u0275fac=(()=>{let i;return function(t){return...
FILE: src/google/adk/cli/browser/chunk-RGCH6K7F.js
function M (line 1) | function M(e){let t=me;return me=e,t}
function ji (line 1) | function ji(){return me}
function Jt (line 1) | function Jt(e){if(Li)throw new Error("");if(me===null)return;me.consumer...
function xh (line 1) | function xh(){ja++}
function wn (line 1) | function wn(e){if(!(pr(e)&&!e.dirty)&&!(!e.dirty&&e.lastCleanEpoch===ja)...
function Ba (line 1) | function Ba(e){if(e.consumers===void 0)return;let t=Li;Li=!0;try{for(let...
function Va (line 1) | function Va(){return me?.consumerAllowSignalWrites!==!1}
function Jv (line 1) | function Jv(e){e.dirty=!0,Ba(e),e.consumerMarkedDirty?.(e)}
function dr (line 1) | function dr(e){e.dirty=!1,e.lastCleanEpoch=ja}
function It (line 1) | function It(e){return e&&Ih(e),M(e)}
function Ih (line 1) | function Ih(e){e.producersTail=void 0,e.recomputing=!0}
function Xt (line 1) | function Xt(e,t){M(t),e&&Th(e)}
function Th (line 1) | function Th(e){e.recomputing=!1;let t=e.producersTail,n=t!==void 0?t.nex...
function fr (line 1) | function fr(e){for(let t=e.producers;t!==void 0;t=t.nextProducer){let n=...
function en (line 1) | function en(e){if(pr(e)){let t=e.producers;for(;t!==void 0;)t=Ha(t)}e.pr...
function Sh (line 1) | function Sh(e,t){let n=e.consumersTail,r=pr(e);if(n!==void 0?(t.nextCons...
function Ha (line 1) | function Ha(e){let t=e.producer,n=e.nextProducer,r=e.nextConsumer,o=e.pr...
function pr (line 1) | function pr(e){return e.consumerIsAlwaysLive||e.consumers!==void 0}
function yo (line 1) | function yo(e){Kv?.(e)}
function Xv (line 1) | function Xv(e,t){let n=t.producersTail;if(n!==void 0){let r=t.producers;...
function bo (line 1) | function bo(e,t){return Object.is(e,t)}
function vo (line 1) | function vo(e,t){let n=Object.create(eD);n.computation=e,t!==void 0&&(n....
method producerMustRecompute (line 1) | producerMustRecompute(e){return e.value===Qt||e.value===Cn}
method producerRecomputeValue (line 1) | producerRecomputeValue(e){if(e.value===Cn)throw new Error("");let t=e.va...
function tD (line 1) | function tD(){throw new Error}
function Ah (line 1) | function Ah(e){Mh(e)}
function $a (line 1) | function $a(e){Mh=e}
function Ua (line 1) | function Ua(e,t){let n=Object.create(Do);n.value=e,t!==void 0&&(n.equal=...
function Nh (line 1) | function Nh(e){return Jt(e),e.value}
function xn (line 1) | function xn(e,t){Va()||Ah(e),e.equal(e.value,t)||(e.value=t,rD(e))}
function Bi (line 1) | function Bi(e,t){Va()||Ah(e),xn(e,t(e.value))}
function rD (line 1) | function rD(e){e.version++,xh(),Ba(e),nD?.(e)}
function za (line 1) | function za(e){let t=M(null);try{return e()}finally{M(t)}}
function Ga (line 1) | function Ga(e){if(e.dirty=!1,e.version>0&&!fr(e))return;e.version++;let ...
function k (line 1) | function k(e){return typeof e=="function"}
function hr (line 1) | function hr(e){let n=e(r=>{Error.call(r),r.stack=new Error().stack});ret...
function In (line 3) | function In(e,t){if(e){let n=e.indexOf(t);0<=n&&e.splice(n,1)}}
method constructor (line 3) | constructor(t){this.initialTeardown=t,this.closed=!1,this._parentage=nul...
method unsubscribe (line 3) | unsubscribe(){let t;if(!this.closed){this.closed=!0;let{_parentage:n}=th...
method add (line 3) | add(t){var n;if(t&&t!==this)if(this.closed)kh(t);else{if(t instanceof e)...
method _hasParent (line 3) | _hasParent(t){let{_parentage:n}=this;return n===t||Array.isArray(n)&&n.i...
method _addParent (line 3) | _addParent(t){let{_parentage:n}=this;this._parentage=Array.isArray(n)?(n...
method _removeParent (line 3) | _removeParent(t){let{_parentage:n}=this;n===t?this._parentage=null:Array...
method remove (line 3) | remove(t){let{_finalizers:n}=this;n&&In(n,t),t instanceof e&&t._removePa...
function Hi (line 3) | function Hi(e){return e instanceof X||e&&"closed"in e&&k(e.remove)&&k(e....
function kh (line 3) | function kh(e){k(e)?e():e.unsubscribe()}
method setTimeout (line 3) | setTimeout(e,t,...n){let{delegate:r}=gr;return r?.setTimeout?r.setTimeou...
method clearTimeout (line 3) | clearTimeout(e){let{delegate:t}=gr;return(t?.clearTimeout||clearTimeout)...
function $i (line 3) | function $i(e){gr.setTimeout(()=>{let{onUnhandledError:t}=We;if(t)t(e);e...
function Tt (line 3) | function Tt(){}
function Fh (line 3) | function Fh(e){return Za("E",void 0,e)}
function Oh (line 3) | function Oh(e){return Za("N",e,void 0)}
function Za (line 3) | function Za(e,t,n){return{kind:e,value:t,error:n}}
function mr (line 3) | function mr(e){if(We.useDeprecatedSynchronousErrorHandling){let t=!Tn;if...
function Ph (line 3) | function Ph(e){We.useDeprecatedSynchronousErrorHandling&&Tn&&(Tn.errorTh...
method constructor (line 3) | constructor(t){super(),this.isStopped=!1,t?(this.destination=t,Hi(t)&&t....
method create (line 3) | static create(t,n,r){return new Ze(t,n,r)}
method next (line 3) | next(t){this.isStopped?Qa(Oh(t),this):this._next(t)}
method error (line 3) | error(t){this.isStopped?Qa(Fh(t),this):(this.isStopped=!0,this._error(t))}
method complete (line 3) | complete(){this.isStopped?Qa(Rh,this):(this.isStopped=!0,this._complete())}
method unsubscribe (line 3) | unsubscribe(){this.closed||(this.isStopped=!0,super.unsubscribe(),this.d...
method _next (line 3) | _next(t){this.destination.next(t)}
method _error (line 3) | _error(t){try{this.destination.error(t)}finally{this.unsubscribe()}}
method _complete (line 3) | _complete(){try{this.destination.complete()}finally{this.unsubscribe()}}
function Ya (line 3) | function Ya(e,t){return oD.call(e,t)}
method constructor (line 3) | constructor(t){this.partialObserver=t}
method next (line 3) | next(t){let{partialObserver:n}=this;if(n.next)try{n.next(t)}catch(r){Ui(...
method error (line 3) | error(t){let{partialObserver:n}=this;if(n.error)try{n.error(t)}catch(r){...
method complete (line 3) | complete(){let{partialObserver:t}=this;if(t.complete)try{t.complete()}ca...
method constructor (line 3) | constructor(t,n,r){super();let o;if(k(t)||!t)o={next:t??void 0,error:n??...
function Ui (line 3) | function Ui(e){We.useDeprecatedSynchronousErrorHandling?Ph(e):$i(e)}
function iD (line 3) | function iD(e){throw e}
function Qa (line 3) | function Qa(e,t){let{onStoppedNotification:n}=We;n&&gr.setTimeout(()=>n(...
function De (line 3) | function De(e){return e}
function uD (line 3) | function uD(...e){return Ja(e)}
function Ja (line 3) | function Ja(e){return e.length===0?De:e.length===1?e[0]:function(n){retu...
class e (line 3) | class e{constructor(n){n&&(this._subscribe=n)}lift(n){let r=new e;return...
method constructor (line 3) | constructor(n){n&&(this._subscribe=n)}
method lift (line 3) | lift(n){let r=new e;return r.source=this,r.operator=n,r}
method subscribe (line 3) | subscribe(n,r,o){let i=cD(n)?n:new Ze(n,r,o);return mr(()=>{let{operat...
method _trySubscribe (line 3) | _trySubscribe(n){try{return this._subscribe(n)}catch(r){n.error(r)}}
method forEach (line 3) | forEach(n,r){return r=Lh(r),new r((o,i)=>{let s=new Ze({next:u=>{try{n...
method _subscribe (line 3) | _subscribe(n){var r;return(r=this.source)===null||r===void 0?void 0:r....
method [yr] (line 3) | [yr](){return this}
method pipe (line 3) | pipe(...n){return Ja(n)(this)}
method toPromise (line 3) | toPromise(n){return n=Lh(n),new n((r,o)=>{let i;this.subscribe(s=>i=s,...
method constructor (line 3) | constructor(){super(),this.closed=!1,this.currentObservers=null,this.o...
method lift (line 3) | lift(n){let r=new zi(this,this);return r.operator=n,r}
method _throwIfClosed (line 3) | _throwIfClosed(){if(this.closed)throw new Bh}
method next (line 3) | next(n){mr(()=>{if(this._throwIfClosed(),!this.isStopped){this.current...
method error (line 3) | error(n){mr(()=>{if(this._throwIfClosed(),!this.isStopped){this.hasErr...
method complete (line 3) | complete(){mr(()=>{if(this._throwIfClosed(),!this.isStopped){this.isSt...
method unsubscribe (line 3) | unsubscribe(){this.isStopped=this.closed=!0,this.observers=this.curren...
method observed (line 3) | get observed(){var n;return((n=this.observers)===null||n===void 0?void...
method _trySubscribe (line 3) | _trySubscribe(n){return this._throwIfClosed(),super._trySubscribe(n)}
method _subscribe (line 3) | _subscribe(n){return this._throwIfClosed(),this._checkFinalizedStatuse...
method _innerSubscribe (line 3) | _innerSubscribe(n){let{hasError:r,isStopped:o,observers:i}=this;return...
method _checkFinalizedStatuses (line 3) | _checkFinalizedStatuses(n){let{hasError:r,thrownError:o,isStopped:i}=t...
method asObservable (line 3) | asObservable(){let n=new B;return n.source=this,n}
method hasPendingTasks (line 4) | get hasPendingTasks(){return this.destroyed?!1:this.pendingTask.value}
method hasPendingTasksObservable (line 4) | get hasPendingTasksObservable(){return this.destroyed?new B(n=>{n.next...
method add (line 4) | add(){!this.hasPendingTasks&&!this.destroyed&&this.pendingTask.next(!0...
method has (line 4) | has(n){return this.pendingTasks.has(n)}
method remove (line 4) | remove(n){this.pendingTasks.delete(n),this.debugTaskTracker?.remove(n)...
method ngOnDestroy (line 4) | ngOnDestroy(){this.pendingTasks.clear(),this.hasPendingTasks&&this.pen...
method constructor (line 4) | constructor(n,r){this.view=n,this.node=r}
method add (line 4) | add(){let n=this.internalPendingTasks.add();return()=>{this.internalPe...
method run (line 4) | run(n){let r=this.add();n().catch(this.errorHandler).finally(r)}
method constructor (line 4) | constructor(n){this.nativeElement=n}
method execute (line 4) | execute(){this.impl?.execute()}
method constructor (line 4) | constructor(){b(Dt,{optional:!0})}
method execute (line 4) | execute(){let n=this.sequences.size>0;n&&W(q.AfterRenderHooksStart),th...
method register (line 4) | register(n){let{view:r}=n;r!==void 0?((r[Vn]??=[]).push(n),zn(r),r[L]|...
method addSequence (line 4) | addSequence(n){this.sequences.add(n),this.scheduler.notify(7)}
method unregister (line 4) | unregister(n){this.executing&&this.sequences.has(n)?(n.erroredOrDestro...
method maybeTrace (line 4) | maybeTrace(n,r){return r?r.run(_u.AFTER_NEXT_RENDER,n):n()}
method constructor (line 4) | constructor(n,r,o){this._declarationLView=n,this._declarationTContaine...
method ssrId (line 4) | get ssrId(){return this._declarationTContainer.tView?.ssrId||null}
method createEmbeddedView (line 4) | createEmbeddedView(n,r){return this.createEmbeddedViewImpl(n,r)}
method createEmbeddedViewImpl (line 4) | createEmbeddedViewImpl(n,r,o){let i=li(this._declarationLView,this._de...
method constructor (line 4) | constructor(n){this._injector=n}
method getOrCreateStandaloneInjector (line 4) | getOrCreateStandaloneInjector(n){if(!n.standalone)return null;if(!this...
method ngOnDestroy (line 4) | ngOnDestroy(){try{for(let n of this.cachedInjectors.values())n!==null&...
method log (line 4) | log(n){console.log(n)}
method warn (line 4) | warn(n){console.warn(n)}
method constructor (line 4) | constructor(n,r,o){this._ngZone=n,this.registry=r,As()&&(this._destroy...
method _watchAngularEvents (line 4) | _watchAngularEvents(){let n=this._ngZone.onUnstable.subscribe({next:()...
method isStable (line 4) | isStable(){return this._isZoneStable&&!this._ngZone.hasPendingMacrotasks}
method _runCallbacksIfReady (line 4) | _runCallbacksIfReady(){if(this.isStable())queueMicrotask(()=>{for(;thi...
method getPendingTasks (line 4) | getPendingTasks(){return this._taskTrackingZone?this._taskTrackingZone...
method addCallback (line 4) | addCallback(n,r,o){let i=-1;r&&r>0&&(i=setTimeout(()=>{this._callbacks...
method whenStable (line 4) | whenStable(n,r,o){if(o&&!this._taskTrackingZone)throw new Error('Task ...
method registerApplication (line 4) | registerApplication(n){this.registry.registerApplication(n,this)}
method unregisterApplication (line 4) | unregisterApplication(n){this.registry.unregisterApplication(n)}
method findProviders (line 4) | findProviders(n,r,o){return[]}
method registerApplication (line 4) | registerApplication(n,r){this._applications.set(n,r)}
method unregisterApplication (line 4) | unregisterApplication(n){this._applications.delete(n)}
method unregisterAllApplications (line 4) | unregisterAllApplications(){this._applications.clear()}
method getTestability (line 4) | getTestability(n){return this._applications.get(n)||null}
method getAllTestabilities (line 4) | getAllTestabilities(){return Array.from(this._applications.values())}
method getAllRootElements (line 4) | getAllRootElements(){return Array.from(this._applications.keys())}
method findTestabilityInTree (line 4) | findTestabilityInTree(n,r=!0){return $d?.findTestabilityInTree(this,n,...
method constructor (line 4) | constructor(){}
method runInitializers (line 4) | runInitializers(){if(this.initialized)return;let n=[];for(let o of thi...
method allViews (line 4) | get allViews(){return[...(this.includeAllTestViews?this.allTestViews:t...
method destroyed (line 4) | get destroyed(){return this._destroyed}
method isStable (line 4) | get isStable(){return this.internalPendingTask.hasPendingTasksObservab...
method constructor (line 4) | constructor(){b(Dt,{optional:!0})}
method whenStable (line 4) | whenStable(){let n;return new Promise(r=>{n=this.isStable.subscribe({n...
method injector (line 4) | get injector(){return this._injector}
method bootstrap (line 4) | bootstrap(n,r){return this.bootstrapImpl(n,r)}
method bootstrapImpl (line 4) | bootstrapImpl(n,r,o=we.NULL){return this._injector.get(be).run(()=>{W(...
method tick (line 4) | tick(){this.zonelessEnabled||(this.dirtyFlags|=1),this._tick()}
method _tick (line 4) | _tick(){W(q.ChangeDetectionStart),this.tracingSnapshot!==null?this.tra...
method synchronize (line 4) | synchronize(){this._rendererFactory===null&&!this._injector.destroyed&...
method synchronizeOnce (line 4) | synchronizeOnce(){this.dirtyFlags&16&&(this.dirtyFlags&=-17,this.rootE...
method syncDirtyFlagsWithViews (line 4) | syncDirtyFlagsWithViews(){if(this.allViews.some(({_lView:n})=>$o(n))){...
method attachView (line 4) | attachView(n){let r=n;this._views.push(r),r.attachToAppRef(this)}
method detachView (line 4) | detachView(n){let r=n;Qo(this._views,r),r.detachFromAppRef()}
method _loadComponent (line 4) | _loadComponent(n){this.attachView(n.hostView);try{this.tick()}catch(o)...
method ngOnDestroy (line 4) | ngOnDestroy(){if(!this._destroyed)try{this._destroyListeners.forEach(n...
method onDestroy (line 4) | onDestroy(n){return this._destroyListeners.push(n),()=>Qo(this._destro...
method destroy (line 4) | destroy(){if(this._destroyed)throw new _(406,!1);let n=this._injector;...
method viewCount (line 4) | get viewCount(){return this._views.length}
method compileModuleSync (line 4) | compileModuleSync(n){return new cu(n)}
method compileModuleAsync (line 4) | compileModuleAsync(n){return Promise.resolve(this.compileModuleSync(n))}
method compileModuleAndAllComponentsSync (line 4) | compileModuleAndAllComponentsSync(n){let r=this.compileModuleSync(n),o...
method compileModuleAndAllComponentsAsync (line 4) | compileModuleAndAllComponentsAsync(n){return Promise.resolve(this.comp...
method clearCache (line 4) | clearCache(){}
method clearCacheFor (line 4) | clearCacheFor(n){}
method getModuleId (line 4) | getModuleId(n){}
method constructor (line 4) | constructor(){this.subscriptions.add(this.appRef.afterTick.subscribe((...
method switchToMicrotaskScheduler (line 4) | switchToMicrotaskScheduler(){this.ngZone.runOutsideAngular(()=>{let n=...
method notify (line 4) | notify(n){if(!this.zonelessEnabled&&n===5)return;switch(n){case 0:{thi...
method shouldScheduleTick (line 4) | shouldScheduleTick(){return!(this.appRef.destroyed||this.pendingRender...
method tick (line 4) | tick(){if(this.runningTick||this.appRef.destroyed)return;if(this.appRe...
method ngOnDestroy (line 4) | ngOnDestroy(){this.subscriptions.unsubscribe(),this.cleanup()}
method cleanup (line 4) | cleanup(){if(this.runningTick=!1,this.cancelScheduledCallback?.(),this...
method constructor (line 4) | constructor(n){this.factories=n}
method create (line 4) | static create(n,r){if(r!=null){let o=r.factories.slice();n=n.concat(o)...
method extend (line 4) | static extend(n){return{provide:e,useFactory:()=>{let r=b(e,{optional:...
method find (line 4) | find(n){let r=this.factories.find(o=>o.supports(n));if(r!=null)return ...
method constructor (line 4) | constructor(n){this.factories=n}
method create (line 4) | static create(n,r){if(r){let o=r.factories.slice();n=n.concat(o)}retur...
method extend (line 4) | static extend(n){return{provide:e,useFactory:()=>{let r=b(e,{optional:...
method find (line 4) | find(n){let r=this.factories.find(o=>o.supports(n));if(r)return r;thro...
method constructor (line 4) | constructor(n){}
method constructor (line 422) | constructor(n={mapCtor:Map,arrayCtor:Array,setCtor:Set,objCtor:Object}...
method getSurfaces (line 422) | getSurfaces(){return this.#r}
method clearSurfaces (line 422) | clearSurfaces(){this.#r.clear()}
method processMessages (line 422) | processMessages(n){for(let r of n)r.beginRendering&&this.#g(r.beginRen...
method getData (line 422) | getData(n,r,o=e.DEFAULT_SURFACE_ID){let i=this.#i(o);if(!i)return null...
method setData (line 422) | setData(n,r,o,i=e.DEFAULT_SURFACE_ID){if(!n){console.warn("No componen...
method resolvePath (line 422) | resolvePath(n,r){return n.startsWith("/")?n:r&&r!=="/"?r.endsWith("/")...
method #d (line 422) | #d(n){if(typeof n!="string")return n;let r=n.trim();if(r.startsWith("{...
method #u (line 422) | #u(n){let r=new this.#t;for(let o of n){if(!$(o)||!("key"in o))continu...
method #a (line 422) | #a(n,r,o){if(Array.isArray(o)&&(o.length===0||$(o[0])&&"key"in o[0]))i...
method #f (line 422) | #f(n){return"/"+n.replace(/\[(\d+)\]/g,".$1").split(".").filter(i=>i.l...
method #p (line 422) | #p(n,r){let o=this.#f(r).split("/").filter(s=>s),i=n;for(let s of o){i...
method #i (line 422) | #i(n){let r=this.#r.get(n);return r||(r=new this.#e({rootComponentId:n...
method #g (line 422) | #g(n,r){let o=this.#i(r);o.rootComponentId=n.root,o.styles=n.styles??{...
method #m (line 422) | #m(n,r){let o=this.#i(r);for(let i of n.components)o.components.set(i....
method #y (line 422) | #y(n,r){let o=this.#i(r),i=n.path??"/";this.#a(o.dataModel,i,n.content...
method #b (line 422) | #b(n){this.#r.delete(n.surfaceId)}
method #c (line 422) | #c(n){if(!n.rootComponentId){n.componentTree=null;return}let r=new thi...
method #h (line 422) | #h(n){return Object.keys(n).find(r=>r.startsWith("value"))}
method #s (line 422) | #s(n,r,o,i,s=""){let u=`${n}${s}`,{components:a}=r;if(!a.has(n))return...
method #l (line 422) | #l(n,r,o,i,s=""){if(typeof n=="string"&&r.components.has(n))return thi...
method historyGo (line 422) | historyGo(n){throw new Error("")}
method constructor (line 422) | constructor(){super(),this._location=window.location,this._history=win...
method getBaseHrefFromDOM (line 422) | getBaseHrefFromDOM(){return Et().getBaseHref(this._doc)}
method onPopState (line 422) | onPopState(n){let r=Et().getGlobalEventTarget(this._doc,"window");retu...
method onHashChange (line 422) | onHashChange(n){let r=Et().getGlobalEventTarget(this._doc,"window");re...
method href (line 422) | get href(){return this._location.href}
method protocol (line 422) | get protocol(){return this._location.protocol}
method hostname (line 422) | get hostname(){return this._location.hostname}
method port (line 422) | get port(){return this._location.port}
method pathname (line 422) | get pathname(){return this._location.pathname}
method search (line 422) | get search(){return this._location.search}
method hash (line 422) | get hash(){return this._location.hash}
method pathname (line 422) | set pathname(n){this._location.pathname=n}
method pushState (line 422) | pushState(n,r,o){this._history.pushState(n,r,o)}
method replaceState (line 422) | replaceState(n,r,o){this._history.replaceState(n,r,o)}
method forward (line 422) | forward(){this._history.forward()}
method back (line 422) | back(){this._history.back()}
method historyGo (line 422) | historyGo(n=0){this._history.go(n)}
method getState (line 422) | getState(){return this._history.state}
method historyGo (line 422) | historyGo(n){throw new Error("")}
method constructor (line 422) | constructor(n,r){super(),this._platformLocation=n,this._baseHref=r??th...
method ngOnDestroy (line 422) | ngOnDestroy(){for(;this._removeListenerFns.length;)this._removeListene...
method onPopState (line 422) | onPopState(n){this._removeListenerFns.push(this._platformLocation.onPo...
method getBaseHref (line 422) | getBaseHref(){return this._baseHref}
method prepareExternalUrl (line 422) | prepareExternalUrl(n){return ia(this._baseHref,n)}
method path (line 422) | path(n=!1){let r=this._platformLocation.pathname+it(this._platformLoca...
method pushState (line 422) | pushState(n,r,o,i){let s=this.prepareExternalUrl(o+it(i));this._platfo...
method replaceState (line 422) | replaceState(n,r,o,i){let s=this.prepareExternalUrl(o+it(i));this._pla...
method forward (line 422) | forward(){this._platformLocation.forward()}
method back (line 422) | back(){this._platformLocation.back()}
method getState (line 422) | getState(){return this._platformLocation.getState()}
method historyGo (line 422) | historyGo(n=0){this._platformLocation.historyGo?.(n)}
method constructor (line 422) | constructor(n){this._locationStrategy=n;let r=this._locationStrategy.g...
method ngOnDestroy (line 422) | ngOnDestroy(){this._urlChangeSubscription?.unsubscribe(),this._urlChan...
method path (line 422) | path(n=!1){return this.normalize(this._locationStrategy.path(n))}
method getState (line 422) | getState(){return this._locationStrategy.getState()}
method isCurrentPathEqualTo (line 422) | isCurrentPathEqualTo(n,r=""){return this.path()==this.normalize(n+it(r))}
method normalize (line 422) | normalize(n){return e.stripTrailingSlash(P2(this._basePath,m1(n)))}
method prepareExternalUrl (line 422) | prepareExternalUrl(n){return n&&n[0]!=="/"&&(n="/"+n),this._locationSt...
method go (line 422) | go(n,r="",o=null){this._locationStrategy.pushState(o,"",n,r),this._not...
method replaceState (line 422) | replaceState(n,r="",o=null){this._locationStrategy.replaceState(o,"",n...
method forward (line 422) | forward(){this._locationStrategy.forward()}
method back (line 422) | back(){this._locationStrategy.back()}
method historyGo (line 422) | historyGo(n=0){this._locationStrategy.historyGo?.(n)}
method onUrlChange (line 422) | onUrlChange(n){return this._urlChangeListeners.push(n),this._urlChange...
method _notifyUrlChangeListeners (line 422) | _notifyUrlChangeListeners(n="",r){this._urlChangeListeners.forEach(o=>...
method subscribe (line 422) | subscribe(n,r,o){return this._subject.subscribe({next:n,error:r??void ...
method constructor (line 422) | constructor(n,r){super(),this._platformLocation=n,r!=null&&(this._base...
method ngOnDestroy (line 422) | ngOnDestroy(){for(;this._removeListenerFns.length;)this._removeListene...
method onPopState (line 422) | onPopState(n){this._removeListenerFns.push(this._platformLocation.onPo...
method getBaseHref (line 422) | getBaseHref(){return this._baseHref}
method path (line 422) | path(n=!1){let r=this._platformLocation.hash??"#";return r.length>0?r....
method prepareExternalUrl (line 422) | prepareExternalUrl(n){let r=ia(this._baseHref,n);return r.length>0?"#"...
method pushState (line 422) | pushState(n,r,o,i){let s=this.prepareExternalUrl(o+it(i))||this._platf...
method replaceState (line 422) | replaceState(n,r,o,i){let s=this.prepareExternalUrl(o+it(i))||this._pl...
method forward (line 422) | forward(){this._platformLocation.forward()}
method back (line 422) | back(){this._platformLocation.back()}
method getState (line 422) | getState(){return this._platformLocation.getState()}
method historyGo (line 422) | historyGo(n=0){this._platformLocation.historyGo?.(n)}
method constructor (line 422) | constructor(n,r){this._ngEl=n,this._renderer=r}
method klass (line 422) | set klass(n){this.initialClasses=n!=null?n.trim().split(Jf):v1}
method ngClass (line 422) | set ngClass(n){this.rawClass=typeof n=="string"?n.trim().split(Jf):n}
method ngDoCheck (line 422) | ngDoCheck(){for(let r of this.initialClasses)this._updateState(r,!0);l...
method _updateState (line 422) | _updateState(n,r){let o=this.stateMap.get(n);o!==void 0?(o.enabled!==r...
method _applyStateDiff (line 422) | _applyStateDiff(){for(let n of this.stateMap){let r=n[0],o=n[1];o.chan...
method _toggleClass (line 422) | _toggleClass(n,r){n=n.trim(),n.length>0&&n.split(Jf).forEach(o=>{r?thi...
method componentInstance (line 422) | get componentInstance(){return this._componentRef?.instance??null}
method constructor (line 422) | constructor(n){this._viewContainerRef=n}
method _needToReCreateNgModuleInstance (line 422) | _needToReCreateNgModuleInstance(n){return n.ngComponentOutletNgModule!...
method _needToReCreateComponentInstance (line 422) | _needToReCreateComponentInstance(n){return n.ngComponentOutlet!==void ...
method ngOnChanges (line 422) | ngOnChanges(n){if(this._needToReCreateComponentInstance(n)&&(this._vie...
method ngDoCheck (line 422) | ngDoCheck(){if(this._componentRef){if(this.ngComponentOutletInputs)for...
method ngOnDestroy (line 422) | ngOnDestroy(){this._moduleRef?.destroy()}
method _applyInputStateDiff (line 422) | _applyInputStateDiff(n){for(let[r,o]of this._inputsUsed)o?(n.setInput(...
method ngForOf (line 422) | set ngForOf(n){this._ngForOf=n,this._ngForOfDirty=!0}
method ngForTrackBy (line 422) | set ngForTrackBy(n){this._trackByFn=n}
method ngForTrackBy (line 422) | get ngForTrackBy(){return this._trackByFn}
method constructor (line 422) | constructor(n,r,o){this._viewContainer=n,this._template=r,this._differ...
method ngForTemplate (line 422) | set ngForTemplate(n){n&&(this._template=n)}
method ngDoCheck (line 422) | ngDoCheck(){if(this._ngForOfDirty){this._ngForOfDirty=!1;let n=this._n...
method _applyChanges (line 422) | _applyChanges(n){let r=this._viewContainer;n.forEachOperation((o,i,s)=...
method ngTemplateContextGuard (line 422) | static ngTemplateContextGuard(n,r){return!0}
method constructor (line 422) | constructor(n,r){this._viewContainer=n,this._thenTemplateRef=r}
method ngIf (line 422) | set ngIf(n){this._context.$implicit=this._context.ngIf=n,this._updateV...
method ngIfThen (line 422) | set ngIfThen(n){E1(n,!1),this._thenTemplateRef=n,this._thenViewRef=nul...
method ngIfElse (line 422) | set ngIfElse(n){E1(n,!1),this._elseTemplateRef=n,this._elseViewRef=nul...
method _updateView (line 422) | _updateView(){this._context.$implicit?this._thenViewRef||(this._viewCo...
method ngTemplateContextGuard (line 422) | static ngTemplateContextGuard(n,r){return!0}
method constructor (line 422) | constructor(n,r,o){this._ngEl=n,this._differs=r,this._renderer=o}
method ngStyle (line 422) | set ngStyle(n){this._ngStyle=n,!this._differ&&n&&(this._differ=this._d...
method ngDoCheck (line 422) | ngDoCheck(){if(this._differ){let n=this._differ.diff(this._ngStyle);n&...
method _setStyle (line 422) | _setStyle(n,r){let[o,i]=n.split("."),s=o.indexOf("-")===-1?void 0:nt.D...
method _applyChanges (line 422) | _applyChanges(n){n.forEachRemovedItem(r=>this._setStyle(r.key,null)),n...
method constructor (line 422) | constructor(n){this._viewContainerRef=n}
method ngOnChanges (line 422) | ngOnChanges(n){if(this._shouldRecreateView(n)){let r=this._viewContain...
method _shouldRecreateView (line 422) | _shouldRecreateView(n){return!!n.ngTemplateOutlet||!!n.ngTemplateOutle...
method _createContextForwardProxy (line 422) | _createContextForwardProxy(){return new Proxy({},{set:(n,r,o)=>this.ng...
method constructor (line 422) | constructor(n){this._ref=n}
method ngOnDestroy (line 422) | ngOnDestroy(){this._subscription&&this._dispose(),this._ref=null}
method transform (line 422) | transform(n){if(!this._obj){if(n)try{this.markForCheckOnValueUpdate=!1...
method _subscribe (line 422) | _subscribe(n){this._obj=n,this._strategy=this._selectStrategy(n),this....
method _selectStrategy (line 422) | _selectStrategy(n){if(gi(n))return G2;if(Ou(n))return W2;throw q2(e,n)}
method _dispose (line 422) | _dispose(){this._strategy.dispose(this._subscription),this._latestValu...
method _updateLatestValue (line 422) | _updateLatestValue(n,r){n===this._obj&&(this._latestValue=r,this.markF...
method constructor (line 422) | constructor(n){this.differs=n}
method transform (line 422) | transform(n,r=_1){if(!n||!(n instanceof Map)&&typeof n!="object")retur...
method constructor (line 422) | constructor(n){super(n)}
method supports (line 422) | supports(n){return!0}
method addEventListener (line 422) | addEventListener(n,r,o,i){return n.addEventListener(r,o,i),()=>this.re...
method removeEventListener (line 422) | removeEventListener(n,r,o,i){return n.removeEventListener(r,o,i)}
method constructor (line 422) | constructor(n,r){this._zone=r,n.forEach(s=>{s.manager=this});let o=n.f...
method addEventListener (line 422) | addEventListener(n,r,o,i){return this._findPluginFor(r).addEventListen...
method getZone (line 422) | getZone(){return this._zone}
method _findPluginFor (line 422) | _findPluginFor(n){let r=this._eventNameToPlugin.get(n);if(r)return r;i...
method constructor (line 422) | constructor(n,r,o,i={}){this.doc=n,this.appId=r,this.nonce=o,J2(n,r,th...
method addStyles (line 422) | addStyles(n,r){for(let o of n)this.addUsage(o,this.inline,I1);r?.forEa...
method removeStyles (line 422) | removeStyles(n,r){for(let o of n)this.removeUsage(o,this.inline);r?.fo...
method addUsage (line 422) | addUsage(n,r,o){let i=r.get(n);i?i.usage++:r.set(n,{usage:1,elements:[...
method removeUsage (line 422) | removeUsage(n,r){let o=r.get(n);o&&(o.usage--,o.usage<=0&&(x1(o.elemen...
method ngOnDestroy (line 422) | ngOnDestroy(){for(let[,{elements:n}]of[...this.inline,...this.external...
method addHost (line 422) | addHost(n){this.hosts.add(n);for(let[r,{elements:o}]of this.inline)o.p...
method removeHost (line 422) | removeHost(n){this.hosts.delete(n)}
method addElement (line 422) | addElement(n,r){return this.nonce&&r.setAttribute("nonce",this.nonce),...
method constructor (line 422) | constructor(n,r,o,i,s,u,a=null,c=null){this.eventManager=n,this.shared...
method createRenderer (line 422) | createRenderer(n,r){if(!n||!r)return this.defaultRenderer;let o=this.g...
method getOrCreateRenderer (line 422) | getOrCreateRenderer(n,r){let o=this.rendererByCompId,i=o.get(r.id);if(...
method ngOnDestroy (line 422) | ngOnDestroy(){this.rendererByCompId.clear()}
method componentReplaced (line 422) | componentReplaced(n){this.rendererByCompId.delete(n)}
method build (line 422) | build(){return new XMLHttpRequest}
method constructor (line 422) | constructor(n){super(n)}
method supports (line 422) | supports(n){return e.parseEventName(n)!=null}
method addEventListener (line 422) | addEventListener(n,r,o,i){let s=e.parseEventName(r),u=e.eventCallback(...
method parseEventName (line 422) | static parseEventName(n){let r=n.toLowerCase().split("."),o=r.shift();...
method matchEventFullKeyCode (line 422) | static matchEventFullKeyCode(n,r){let o=aT[n.key]||n.key,i="";return r...
method eventCallback (line 422) | static eventCallback(n,r,o){return i=>{e.matchEventFullKeyCode(i,n)&&o...
method _normalizeKey (line 422) | static _normalizeKey(n){return n==="esc"?"escape":n}
method constructor (line 422) | constructor(){}
method constructor (line 423) | constructor(n){this.xhrFactory=n}
method maybePropagateTrace (line 423) | maybePropagateTrace(n){return this.tracingService?.propagate?this.trac...
method handle (line 423) | handle(n){if(n.method==="JSONP")throw new _(-2800,!1);let r=this.xhrFa...
method constructor (line 423) | constructor(n,r){this.backend=n,this.injector=r}
method handle (line 423) | handle(n){if(this.chain===null){let r=Array.from(new Set([...this.inje...
method constructor (line 423) | constructor(n){this.handler=n}
method request (line 423) | request(n,r,o={}){let i;if(n instanceof so)i=n;else{let a;o.headers in...
method delete (line 423) | delete(n,r={}){return this.request("DELETE",n,r)}
method get (line 423) | get(n,r={}){return this.request("GET",n,r)}
method head (line 423) | head(n,r={}){return this.request("HEAD",n,r)}
method jsonp (line 423) | jsonp(n,r){return this.request("JSONP",n,{params:new qt().append(r,"JS...
method options (line 423) | options(n,r={}){return this.request("OPTIONS",n,r)}
method patch (line 423) | patch(n,r,o={}){return this.request("PATCH",n,dp(o,r))}
method post (line 423) | post(n,r,o={}){return this.request("POST",n,dp(o,r))}
method put (line 423) | put(n,r,o={}){return this.request("PUT",n,dp(o,r))}
method getToken (line 423) | getToken(){let n=this.doc.cookie||"";return n!==this.lastCookieString&...
method constructor (line 423) | constructor(n){this._doc=n}
method getTitle (line 423) | getTitle(){return this._doc.title}
method setTitle (line 423) | setTitle(n){this._doc.title=n||""}
method constructor (line 423) | constructor(n){super(),this._doc=n}
method sanitize (line 423) | sanitize(n,r){if(r==null)return null;switch(n){case Le.NONE:return r;c...
method bypassSecurityTrustHtml (line 423) | bypassSecurityTrustHtml(n){return dd(n)}
method bypassSecurityTrustStyle (line 423) | bypassSecurityTrustStyle(n){return fd(n)}
method bypassSecurityTrustScript (line 423) | bypassSecurityTrustScript(n){return pd(n)}
method bypassSecurityTrustUrl (line 423) | bypassSecurityTrustUrl(n){return hd(n)}
method bypassSecurityTrustResourceUrl (line 423) | bypassSecurityTrustResourceUrl(n){return gd(n)}
method setData (line 438) | setData(n,r,o,i){return super.setData(n,r,o,i??void 0)}
method dispatch (line 438) | dispatch(n){let r=new le;return this.events.next({message:n,completion...
method sendAction (line 438) | sendAction(n){let r=this.component(),o=this.surfaceId()??void 0,i={};i...
method resolvePrimitive (line 438) | resolvePrimitive(n){let r=this.component(),o=this.surfaceId();return!n...
method getUniqueId (line 438) | getUniqueId(n){return`${n}-${HM++}`}
method constructor (line 438) | constructor(){Zo(()=>{let o=this.surfaceId(),i=this.component();de(()=...
method ngOnDestroy (line 438) | ngOnDestroy(){this.isDestroyed=!0,this.clear()}
method render (line 438) | render(n,r){return at(this,null,function*(){let o=this.catalog[r.type]...
method clear (line 438) | clear(){this.currentRef?.destroy(),this.currentRef=null}
method render (line 438) | render(n,r){r&&this.applyTagClassMap(r);let o=this.markdownIt.render(n...
method applyTagClassMap (line 438) | applyTagClassMap(n){Object.entries(n).forEach(([r,o])=>{let i;switch(r...
method unapplyTagClassMap (line 438) | unapplyTagClassMap(){for(let[n,r]of this.originalClassMap)this.markdow...
method areHintedStyles (line 438) | areHintedStyles(n){return typeof n!="object"||!n||Array.isArray(n)?!1:...
function Lh (line 3) | function Lh(e){var t;return(t=e??We.Promise)!==null&&t!==void 0?t:Promise}
function aD (line 3) | function aD(e){return e&&k(e.next)&&k(e.error)&&k(e.complete)}
function cD (line 3) | function cD(e){return e&&e instanceof Sn||aD(e)&&Hi(e)}
function Xa (line 3) | function Xa(e){return k(e?.lift)}
function j (line 3) | function j(e){return t=>{if(Xa(t))return t.lift(function(n){try{return e...
function R (line 3) | function R(e,t,n,r,o){return new ec(e,t,n,r,o)}
method constructor (line 3) | constructor(t,n,r,o,i,s){super(t),this.onFinalize=i,this.shouldUnsubscri...
method unsubscribe (line 3) | unsubscribe(){var t;if(!this.shouldUnsubscribe||this.shouldUnsubscribe()...
function jh (line 3) | function jh(){return j((e,t)=>{let n=null;e._refCount++;let r=R(t,void 0...
method constructor (line 3) | constructor(t,n){super(),this.source=t,this.subjectFactory=n,this._subje...
method _subscribe (line 3) | _subscribe(t){return this.getSubject().subscribe(t)}
method getSubject (line 3) | getSubject(){let t=this._subject;return(!t||t.isStopped)&&(this._subject...
method _teardown (line 3) | _teardown(){this._refCount=0;let{_connection:t}=this;this._subject=this....
method connect (line 3) | connect(){let t=this._connection;if(!t){t=this._connection=new X;let n=t...
method refCount (line 3) | refCount(){return jh()(this)}
method schedule (line 3) | schedule(e){let t=requestAnimationFrame,n=cancelAnimationFrame,{delegate...
method requestAnimationFrame (line 3) | requestAnimationFrame(...e){let{delegate:t}=br;return(t?.requestAnimatio...
method cancelAnimationFrame (line 3) | cancelAnimationFrame(...e){let{delegate:t}=br;return(t?.cancelAnimationF...
class e (line 3) | class e extends B{constructor(){super(),this.closed=!1,this.currentObser...
method constructor (line 3) | constructor(n){n&&(this._subscribe=n)}
method lift (line 3) | lift(n){let r=new e;return r.source=this,r.operator=n,r}
method subscribe (line 3) | subscribe(n,r,o){let i=cD(n)?n:new Ze(n,r,o);return mr(()=>{let{operat...
method _trySubscribe (line 3) | _trySubscribe(n){try{return this._subscribe(n)}catch(r){n.error(r)}}
method forEach (line 3) | forEach(n,r){return r=Lh(r),new r((o,i)=>{let s=new Ze({next:u=>{try{n...
method _subscribe (line 3) | _subscribe(n){var r;return(r=this.source)===null||r===void 0?void 0:r....
method [yr] (line 3) | [yr](){return this}
method pipe (line 3) | pipe(...n){return Ja(n)(this)}
method toPromise (line 3) | toPromise(n){return n=Lh(n),new n((r,o)=>{let i;this.subscribe(s=>i=s,...
method constructor (line 3) | constructor(){super(),this.closed=!1,this.currentObservers=null,this.o...
method lift (line 3) | lift(n){let r=new zi(this,this);return r.operator=n,r}
method _throwIfClosed (line 3) | _throwIfClosed(){if(this.closed)throw new Bh}
method next (line 3) | next(n){mr(()=>{if(this._throwIfClosed(),!this.isStopped){this.current...
method error (line 3) | error(n){mr(()=>{if(this._throwIfClosed(),!this.isStopped){this.hasErr...
method complete (line 3) | complete(){mr(()=>{if(this._throwIfClosed(),!this.isStopped){this.isSt...
method unsubscribe (line 3) | unsubscribe(){this.isStopped=this.closed=!0,this.observers=this.curren...
method observed (line 3) | get observed(){var n;return((n=this.observers)===null||n===void 0?void...
method _trySubscribe (line 3) | _trySubscribe(n){return this._throwIfClosed(),super._trySubscribe(n)}
method _subscribe (line 3) | _subscribe(n){return this._throwIfClosed(),this._checkFinalizedStatuse...
method _innerSubscribe (line 3) | _innerSubscribe(n){let{hasError:r,isStopped:o,observers:i}=this;return...
method _checkFinalizedStatuses (line 3) | _checkFinalizedStatuses(n){let{hasError:r,thrownError:o,isStopped:i}=t...
method asObservable (line 3) | asObservable(){let n=new B;return n.source=this,n}
method hasPendingTasks (line 4) | get hasPendingTasks(){return this.destroyed?!1:this.pendingTask.value}
method hasPendingTasksObservable (line 4) | get hasPendingTasksObservable(){return this.destroyed?new B(n=>{n.next...
method add (line 4) | add(){!this.hasPendingTasks&&!this.destroyed&&this.pendingTask.next(!0...
method has (line 4) | has(n){return this.pendingTasks.has(n)}
method remove (line 4) | remove(n){this.pendingTasks.delete(n),this.debugTaskTracker?.remove(n)...
method ngOnDestroy (line 4) | ngOnDestroy(){this.pendingTasks.clear(),this.hasPendingTasks&&this.pen...
method constructor (line 4) | constructor(n,r){this.view=n,this.node=r}
method add (line 4) | add(){let n=this.internalPendingTasks.add();return()=>{this.internalPe...
method run (line 4) | run(n){let r=this.add();n().catch(this.errorHandler).finally(r)}
method constructor (line 4) | constructor(n){this.nativeElement=n}
method execute (line 4) | execute(){this.impl?.execute()}
method constructor (line 4) | constructor(){b(Dt,{optional:!0})}
method execute (line 4) | execute(){let n=this.sequences.size>0;n&&W(q.AfterRenderHooksStart),th...
method register (line 4) | register(n){let{view:r}=n;r!==void 0?((r[Vn]??=[]).push(n),zn(r),r[L]|...
method addSequence (line 4) | addSequence(n){this.sequences.add(n),this.scheduler.notify(7)}
method unregister (line 4) | unregister(n){this.executing&&this.sequences.has(n)?(n.erroredOrDestro...
method maybeTrace (line 4) | maybeTrace(n,r){return r?r.run(_u.AFTER_NEXT_RENDER,n):n()}
method constructor (line 4) | constructor(n,r,o){this._declarationLView=n,this._declarationTContaine...
method ssrId (line 4) | get ssrId(){return this._declarationTContainer.tView?.ssrId||null}
method createEmbeddedView (line 4) | createEmbeddedView(n,r){return this.createEmbeddedViewImpl(n,r)}
method createEmbeddedViewImpl (line 4) | createEmbeddedViewImpl(n,r,o){let i=li(this._declarationLView,this._de...
method constructor (line 4) | constructor(n){this._injector=n}
method getOrCreateStandaloneInjector (line 4) | getOrCreateStandaloneInjector(n){if(!n.standalone)return null;if(!this...
method ngOnDestroy (line 4) | ngOnDestroy(){try{for(let n of this.cachedInjectors.values())n!==null&...
method log (line 4) | log(n){console.log(n)}
method warn (line 4) | warn(n){console.warn(n)}
method constructor (line 4) | constructor(n,r,o){this._ngZone=n,this.registry=r,As()&&(this._destroy...
method _watchAngularEvents (line 4) | _watchAngularEvents(){let n=this._ngZone.onUnstable.subscribe({next:()...
method isStable (line 4) | isStable(){return this._isZoneStable&&!this._ngZone.hasPendingMacrotasks}
method _runCallbacksIfReady (line 4) | _runCallbacksIfReady(){if(this.isStable())queueMicrotask(()=>{for(;thi...
method getPendingTasks (line 4) | getPendingTasks(){return this._taskTrackingZone?this._taskTrackingZone...
method addCallback (line 4) | addCallback(n,r,o){let i=-1;r&&r>0&&(i=setTimeout(()=>{this._callbacks...
method whenStable (line 4) | whenStable(n,r,o){if(o&&!this._taskTrackingZone)throw new Error('Task ...
method registerApplication (line 4) | registerApplication(n){this.registry.registerApplication(n,this)}
method unregisterApplication (line 4) | unregisterApplication(n){this.registry.unregisterApplication(n)}
method findProviders (line 4) | findProviders(n,r,o){return[]}
method registerApplication (line 4) | registerApplication(n,r){this._applications.set(n,r)}
method unregisterApplication (line 4) | unregisterApplication(n){this._applications.delete(n)}
method unregisterAllApplications (line 4) | unregisterAllApplications(){this._applications.clear()}
method getTestability (line 4) | getTestability(n){return this._applications.get(n)||null}
method getAllTestabilities (line 4) | getAllTestabilities(){return Array.from(this._applications.values())}
method getAllRootElements (line 4) | getAllRootElements(){return Array.from(this._applications.keys())}
method findTestabilityInTree (line 4) | findTestabilityInTree(n,r=!0){return $d?.findTestabilityInTree(this,n,...
method constructor (line 4) | constructor(){}
method runInitializers (line 4) | runInitializers(){if(this.initialized)return;let n=[];for(let o of thi...
method allViews (line 4) | get allViews(){return[...(this.includeAllTestViews?this.allTestViews:t...
method destroyed (line 4) | get destroyed(){return this._destroyed}
method isStable (line 4) | get isStable(){return this.internalPendingTask.hasPendingTasksObservab...
method constructor (line 4) | constructor(){b(Dt,{optional:!0})}
method whenStable (line 4) | whenStable(){let n;return new Promise(r=>{n=this.isStable.subscribe({n...
method injector (line 4) | get injector(){return this._injector}
method bootstrap (line 4) | bootstrap(n,r){return this.bootstrapImpl(n,r)}
method bootstrapImpl (line 4) | bootstrapImpl(n,r,o=we.NULL){return this._injector.get(be).run(()=>{W(...
method tick (line 4) | tick(){this.zonelessEnabled||(this.dirtyFlags|=1),this._tick()}
method _tick (line 4) | _tick(){W(q.ChangeDetectionStart),this.tracingSnapshot!==null?this.tra...
method synchronize (line 4) | synchronize(){this._rendererFactory===null&&!this._injector.destroyed&...
method synchronizeOnce (line 4) | synchronizeOnce(){this.dirtyFlags&16&&(this.dirtyFlags&=-17,this.rootE...
method syncDirtyFlagsWithViews (line 4) | syncDirtyFlagsWithViews(){if(this.allViews.some(({_lView:n})=>$o(n))){...
method attachView (line 4) | attachView(n){let r=n;this._views.push(r),r.attachToAppRef(this)}
method detachView (line 4) | detachView(n){let r=n;Qo(this._views,r),r.detachFromAppRef()}
method _loadComponent (line 4) | _loadComponent(n){this.attachView(n.hostView);try{this.tick()}catch(o)...
method ngOnDestroy (line 4) | ngOnDestroy(){if(!this._destroyed)try{this._destroyListeners.forEach(n...
method onDestroy (line 4) | onDestroy(n){return this._destroyListeners.push(n),()=>Qo(this._destro...
method destroy (line 4) | destroy(){if(this._destroyed)throw new _(406,!1);let n=this._injector;...
method viewCount (line 4) | get viewCount(){return this._views.length}
method compileModuleSync (line 4) | compileModuleSync(n){return new cu(n)}
method compileModuleAsync (line 4) | compileModuleAsync(n){return Promise.resolve(this.compileModuleSync(n))}
method compileModuleAndAllComponentsSync (line 4) | compileModuleAndAllComponentsSync(n){let r=this.compileModuleSync(n),o...
method compileModuleAndAllComponentsAsync (line 4) | compileModuleAndAllComponentsAsync(n){return Promise.resolve(this.comp...
method clearCache (line 4) | clearCache(){}
method clearCacheFor (line 4) | clearCacheFor(n){}
method getModuleId (line 4) | getModuleId(n){}
method constructor (line 4) | constructor(){this.subscriptions.add(this.appRef.afterTick.subscribe((...
method switchToMicrotaskScheduler (line 4) | switchToMicrotaskScheduler(){this.ngZone.runOutsideAngular(()=>{let n=...
method notify (line 4) | notify(n){if(!this.zonelessEnabled&&n===5)return;switch(n){case 0:{thi...
method shouldScheduleTick (line 4) | shouldScheduleTick(){return!(this.appRef.destroyed||this.pendingRender...
method tick (line 4) | tick(){if(this.runningTick||this.appRef.destroyed)return;if(this.appRe...
method ngOnDestroy (line 4) | ngOnDestroy(){this.subscriptions.unsubscribe(),this.cleanup()}
method cleanup (line 4) | cleanup(){if(this.runningTick=!1,this.cancelScheduledCallback?.(),this...
method constructor (line 4) | constructor(n){this.factories=n}
method create (line 4) | static create(n,r){if(r!=null){let o=r.factories.slice();n=n.concat(o)...
method extend (line 4) | static extend(n){return{provide:e,useFactory:()=>{let r=b(e,{optional:...
method find (line 4) | find(n){let r=this.factories.find(o=>o.supports(n));if(r!=null)return ...
method constructor (line 4) | constructor(n){this.factories=n}
method create (line 4) | static create(n,r){if(r){let o=r.factories.slice();n=n.concat(o)}retur...
method extend (line 4) | static extend(n){return{provide:e,useFactory:()=>{let r=b(e,{optional:...
method find (line 4) | find(n){let r=this.factories.find(o=>o.supports(n));if(r)return r;thro...
method constructor (line 4) | constructor(n){}
method constructor (line 422) | constructor(n={mapCtor:Map,arrayCtor:Array,setCtor:Set,objCtor:Object}...
method getSurfaces (line 422) | getSurfaces(){return this.#r}
method clearSurfaces (line 422) | clearSurfaces(){this.#r.clear()}
method processMessages (line 422) | processMessages(n){for(let r of n)r.beginRendering&&this.#g(r.beginRen...
method getData (line 422) | getData(n,r,o=e.DEFAULT_SURFACE_ID){let i=this.#i(o);if(!i)return null...
method setData (line 422) | setData(n,r,o,i=e.DEFAULT_SURFACE_ID){if(!n){console.warn("No componen...
method resolvePath (line 422) | resolvePath(n,r){return n.startsWith("/")?n:r&&r!=="/"?r.endsWith("/")...
method #d (line 422) | #d(n){if(typeof n!="string")return n;let r=n.trim();if(r.startsWith("{...
method #u (line 422) | #u(n){let r=new this.#t;for(let o of n){if(!$(o)||!("key"in o))continu...
method #a (line 422) | #a(n,r,o){if(Array.isArray(o)&&(o.length===0||$(o[0])&&"key"in o[0]))i...
method #f (line 422) | #f(n){return"/"+n.replace(/\[(\d+)\]/g,".$1").split(".").filter(i=>i.l...
method #p (line 422) | #p(n,r){let o=this.#f(r).split("/").filter(s=>s),i=n;for(let s of o){i...
method #i (line 422) | #i(n){let r=this.#r.get(n);return r||(r=new this.#e({rootComponentId:n...
method #g (line 422) | #g(n,r){let o=this.#i(r);o.rootComponentId=n.root,o.styles=n.styles??{...
method #m (line 422) | #m(n,r){let o=this.#i(r);for(let i of n.components)o.components.set(i....
method #y (line 422) | #y(n,r){let o=this.#i(r),i=n.path??"/";this.#a(o.dataModel,i,n.content...
method #b (line 422) | #b(n){this.#r.delete(n.surfaceId)}
method #c (line 422) | #c(n){if(!n.rootComponentId){n.componentTree=null;return}let r=new thi...
method #h (line 422) | #h(n){return Object.keys(n).find(r=>r.startsWith("value"))}
method #s (line 422) | #s(n,r,o,i,s=""){let u=`${n}${s}`,{components:a}=r;if(!a.has(n))return...
method #l (line 422) | #l(n,r,o,i,s=""){if(typeof n=="string"&&r.components.has(n))return thi...
method historyGo (line 422) | historyGo(n){throw new Error("")}
method constructor (line 422) | constructor(){super(),this._location=window.location,this._history=win...
method getBaseHrefFromDOM (line 422) | getBaseHrefFromDOM(){return Et().getBaseHref(this._doc)}
method onPopState (line 422) | onPopState(n){let r=Et().getGlobalEventTarget(this._doc,"window");retu...
method onHashChange (line 422) | onHashChange(n){let r=Et().getGlobalEventTarget(this._doc,"window");re...
method href (line 422) | get href(){return this._location.href}
method protocol (line 422) | get protocol(){return this._location.protocol}
method hostname (line 422) | get hostname(){return this._location.hostname}
method port (line 422) | get port(){return this._location.port}
method pathname (line 422) | get pathname(){return this._location.pathname}
method search (line 422) | get search(){return this._location.search}
method hash (line 422) | get hash(){return this._location.hash}
method pathname (line 422) | set pathname(n){this._location.pathname=n}
method pushState (line 422) | pushState(n,r,o){this._history.pushState(n,r,o)}
method replaceState (line 422) | replaceState(n,r,o){this._history.replaceState(n,r,o)}
method forward (line 422) | forward(){this._history.forward()}
method back (line 422) | back(){this._history.back()}
method historyGo (line 422) | historyGo(n=0){this._history.go(n)}
method getState (line 422) | getState(){return this._history.state}
method historyGo (line 422) | historyGo(n){throw new Error("")}
method constructor (line 422) | constructor(n,r){super(),this._platformLocation=n,this._baseHref=r??th...
method ngOnDestroy (line 422) | ngOnDestroy(){for(;this._removeListenerFns.length;)this._removeListene...
method onPopState (line 422) | onPopState(n){this._removeListenerFns.push(this._platformLocation.onPo...
method getBaseHref (line 422) | getBaseHref(){return this._baseHref}
method prepareExternalUrl (line 422) | prepareExternalUrl(n){return ia(this._baseHref,n)}
method path (line 422) | path(n=!1){let r=this._platformLocation.pathname+it(this._platformLoca...
method pushState (line 422) | pushState(n,r,o,i){let s=this.prepareExternalUrl(o+it(i));this._platfo...
method replaceState (line 422) | replaceState(n,r,o,i){let s=this.prepareExternalUrl(o+it(i));this._pla...
method forward (line 422) | forward(){this._platformLocation.forward()}
method back (line 422) | back(){this._platformLocation.back()}
method getState (line 422) | getState(){return this._platformLocation.getState()}
method historyGo (line 422) | historyGo(n=0){this._platformLocation.historyGo?.(n)}
method constructor (line 422) | constructor(n){this._locationStrategy=n;let r=this._locationStrategy.g...
method ngOnDestroy (line 422) | ngOnDestroy(){this._urlChangeSubscription?.unsubscribe(),this._urlChan...
method path (line 422) | path(n=!1){return this.normalize(this._locationStrategy.path(n))}
method getState (line 422) | getState(){return this._locationStrategy.getState()}
method isCurrentPathEqualTo (line 422) | isCurrentPathEqualTo(n,r=""){return this.path()==this.normalize(n+it(r))}
method normalize (line 422) | normalize(n){return e.stripTrailingSlash(P2(this._basePath,m1(n)))}
method prepareExternalUrl (line 422) | prepareExternalUrl(n){return n&&n[0]!=="/"&&(n="/"+n),this._locationSt...
method go (line 422) | go(n,r="",o=null){this._locationStrategy.pushState(o,"",n,r),this._not...
method replaceState (line 422) | replaceState(n,r="",o=null){this._locationStrategy.replaceState(o,"",n...
method forward (line 422) | forward(){this._locationStrategy.forward()}
method back (line 422) | back(){this._locationStrategy.back()}
method historyGo (line 422) | historyGo(n=0){this._locationStrategy.historyGo?.(n)}
method onUrlChange (line 422) | onUrlChange(n){return this._urlChangeListeners.push(n),this._urlChange...
method _notifyUrlChangeListeners (line 422) | _notifyUrlChangeListeners(n="",r){this._urlChangeListeners.forEach(o=>...
method subscribe (line 422) | subscribe(n,r,o){return this._subject.subscribe({next:n,error:r??void ...
method constructor (line 422) | constructor(n,r){super(),this._platformLocation=n,r!=null&&(this._base...
method ngOnDestroy (line 422) | ngOnDestroy(){for(;this._removeListenerFns.length;)this._removeListene...
method onPopState (line 422) | onPopState(n){this._removeListenerFns.push(this._platformLocation.onPo...
method getBaseHref (line 422) | getBaseHref(){return this._baseHref}
method path (line 422) | path(n=!1){let r=this._platformLocation.hash??"#";return r.length>0?r....
method prepareExternalUrl (line 422) | prepareExternalUrl(n){let r=ia(this._baseHref,n);return r.length>0?"#"...
method pushState (line 422) | pushState(n,r,o,i){let s=this.prepareExternalUrl(o+it(i))||this._platf...
method replaceState (line 422) | replaceState(n,r,o,i){let s=this.prepareExternalUrl(o+it(i))||this._pl...
method forward (line 422) | forward(){this._platformLocation.forward()}
method back (line 422) | back(){this._platformLocation.back()}
method getState (line 422) | getState(){return this._platformLocation.getState()}
method historyGo (line 422) | historyGo(n=0){this._platformLocation.historyGo?.(n)}
method constructor (line 422) | constructor(n,r){this._ngEl=n,this._renderer=r}
method klass (line 422) | set klass(n){this.initialClasses=n!=null?n.trim().split(Jf):v1}
method ngClass (line 422) | set ngClass(n){this.rawClass=typeof n=="string"?n.trim().split(Jf):n}
method ngDoCheck (line 422) | ngDoCheck(){for(let r of this.initialClasses)this._updateState(r,!0);l...
method _updateState (line 422) | _updateState(n,r){let o=this.stateMap.get(n);o!==void 0?(o.enabled!==r...
method _applyStateDiff (line 422) | _applyStateDiff(){for(let n of this.stateMap){let r=n[0],o=n[1];o.chan...
method _toggleClass (line 422) | _toggleClass(n,r){n=n.trim(),n.length>0&&n.split(Jf).forEach(o=>{r?thi...
method componentInstance (line 422) | get componentInstance(){return this._componentRef?.instance??null}
method constructor (line 422) | constructor(n){this._viewContainerRef=n}
method _needToReCreateNgModuleInstance (line 422) | _needToReCreateNgModuleInstance(n){return n.ngComponentOutletNgModule!...
method _needToReCreateComponentInstance (line 422) | _needToReCreateComponentInstance(n){return n.ngComponentOutlet!==void ...
method ngOnChanges (line 422) | ngOnChanges(n){if(this._needToReCreateComponentInstance(n)&&(this._vie...
method ngDoCheck (line 422) | ngDoCheck(){if(this._componentRef){if(this.ngComponentOutletInputs)for...
method ngOnDestroy (line 422) | ngOnDestroy(){this._moduleRef?.destroy()}
method _applyInputStateDiff (line 422) | _applyInputStateDiff(n){for(let[r,o]of this._inputsUsed)o?(n.setInput(...
method ngForOf (line 422) | set ngForOf(n){this._ngForOf=n,this._ngForOfDirty=!0}
method ngForTrackBy (line 422) | set ngForTrackBy(n){this._trackByFn=n}
method ngForTrackBy (line 422) | get ngForTrackBy(){return this._trackByFn}
method constructor (line 422) | constructor(n,r,o){this._viewContainer=n,this._template=r,this._differ...
method ngForTemplate (line 422) | set ngForTemplate(n){n&&(this._template=n)}
method ngDoCheck (line 422) | ngDoCheck(){if(this._ngForOfDirty){this._ngForOfDirty=!1;let n=this._n...
method _applyChanges (line 422) | _applyChanges(n){let r=this._viewContainer;n.forEachOperation((o,i,s)=...
method ngTemplateContextGuard (line 422) | static ngTemplateContextGuard(n,r){return!0}
method constructor (line 422) | constructor(n,r){this._viewContainer=n,this._thenTemplateRef=r}
method ngIf (line 422) | set ngIf(n){this._context.$implicit=this._context.ngIf=n,this._updateV...
method ngIfThen (line 422) | set ngIfThen(n){E1(n,!1),this._thenTemplateRef=n,this._thenViewRef=nul...
method ngIfElse (line 422) | set ngIfElse(n){E1(n,!1),this._elseTemplateRef=n,this._elseViewRef=nul...
method _updateView (line 422) | _updateView(){this._context.$implicit?this._thenViewRef||(this._viewCo...
method ngTemplateContextGuard (line 422) | static ngTemplateContextGuard(n,r){return!0}
method constructor (line 422) | constructor(n,r,o){this._ngEl=n,this._differs=r,this._renderer=o}
method ngStyle (line 422) | set ngStyle(n){this._ngStyle=n,!this._differ&&n&&(this._differ=this._d...
method ngDoCheck (line 422) | ngDoCheck(){if(this._differ){let n=this._differ.diff(this._ngStyle);n&...
method _setStyle (line 422) | _setStyle(n,r){let[o,i]=n.split("."),s=o.indexOf("-")===-1?void 0:nt.D...
method _applyChanges (line 422) | _applyChanges(n){n.forEachRemovedItem(r=>this._setStyle(r.key,null)),n...
method constructor (line 422) | constructor(n){this._viewContainerRef=n}
method ngOnChanges (line 422) | ngOnChanges(n){if(this._shouldRecreateView(n)){let r=this._viewContain...
method _shouldRecreateView (line 422) | _shouldRecreateView(n){return!!n.ngTemplateOutlet||!!n.ngTemplateOutle...
method _createContextForwardProxy (line 422) | _createContextForwardProxy(){return new Proxy({},{set:(n,r,o)=>this.ng...
method constructor (line 422) | constructor(n){this._ref=n}
method ngOnDestroy (line 422) | ngOnDestroy(){this._subscription&&this._dispose(),this._ref=null}
method transform (line 422) | transform(n){if(!this._obj){if(n)try{this.markForCheckOnValueUpdate=!1...
method _subscribe (line 422) | _subscribe(n){this._obj=n,this._strategy=this._selectStrategy(n),this....
method _selectStrategy (line 422) | _selectStrategy(n){if(gi(n))return G2;if(Ou(n))return W2;throw q2(e,n)}
method _dispose (line 422) | _dispose(){this._strategy.dispose(this._subscription),this._latestValu...
method _updateLatestValue (line 422) | _updateLatestValue(n,r){n===this._obj&&(this._latestValue=r,this.markF...
method constructor (line 422) | constructor(n){this.differs=n}
method transform (line 422) | transform(n,r=_1){if(!n||!(n instanceof Map)&&typeof n!="object")retur...
method constructor (line 422) | constructor(n){super(n)}
method supports (line 422) | supports(n){return!0}
method addEventListener (line 422) | addEventListener(n,r,o,i){return n.addEventListener(r,o,i),()=>this.re...
method removeEventListener (line 422) | removeEventListener(n,r,o,i){return n.removeEventListener(r,o,i)}
method constructor (line 422) | constructor(n,r){this._zone=r,n.forEach(s=>{s.manager=this});let o=n.f...
method addEventListener (line 422) | addEventListener(n,r,o,i){return this._findPluginFor(r).addEventListen...
method getZone (line 422) | getZone(){return this._zone}
method _findPluginFor (line 422) | _findPluginFor(n){let r=this._eventNameToPlugin.get(n);if(r)return r;i...
method constructor (line 422) | constructor(n,r,o,i={}){this.doc=n,this.appId=r,this.nonce=o,J2(n,r,th...
method addStyles (line 422) | addStyles(n,r){for(let o of n)this.addUsage(o,this.inline,I1);r?.forEa...
method removeStyles (line 422) | removeStyles(n,r){for(let o of n)this.removeUsage(o,this.inline);r?.fo...
method addUsage (line 422) | addUsage(n,r,o){let i=r.get(n);i?i.usage++:r.set(n,{usage:1,elements:[...
method removeUsage (line 422) | removeUsage(n,r){let o=r.get(n);o&&(o.usage--,o.usage<=0&&(x1(o.elemen...
method ngOnDestroy (line 422) | ngOnDestroy(){for(let[,{elements:n}]of[...this.inline,...this.external...
method addHost (line 422) | addHost(n){this.hosts.add(n);for(let[r,{elements:o}]of this.inline)o.p...
method removeHost (line 422) | removeHost(n){this.hosts.delete(n)}
method addElement (line 422) | addElement(n,r){return this.nonce&&r.setAttribute("nonce",this.nonce),...
method constructor (line 422) | constructor(n,r,o,i,s,u,a=null,c=null){this.eventManager=n,this.shared...
method createRenderer (line 422) | createRenderer(n,r){if(!n||!r)return this.defaultRenderer;let o=this.g...
method getOrCreateRenderer (line 422) | getOrCreateRenderer(n,r){let o=this.rendererByCompId,i=o.get(r.id);if(...
method ngOnDestroy (line 422) | ngOnDestroy(){this.rendererByCompId.clear()}
method componentReplaced (line 422) | componentReplaced(n){this.rendererByCompId.delete(n)}
method build (line 422) | build(){return new XMLHttpRequest}
method constructor (line 422) | constructor(n){super(n)}
method supports (line 422) | supports(n){return e.parseEventName(n)!=null}
method addEventListener (line 422) | addEventListener(n,r,o,i){let s=e.parseEventName(r),u=e.eventCallback(...
method parseEventName (line 422) | static parseEventName(n){let r=n.toLowerCase().split("."),o=r.shift();...
method matchEventFullKeyCode (line 422) | static matchEventFullKeyCode(n,r){let o=aT[n.key]||n.key,i="";return r...
method eventCallback (line 422) | static eventCallback(n,r,o){return i=>{e.matchEventFullKeyCode(i,n)&&o...
method _normalizeKey (line 422) | static _normalizeKey(n){return n==="esc"?"escape":n}
method constructor (line 422) | constructor(){}
method constructor (line 423) | constructor(n){this.xhrFactory=n}
method maybePropagateTrace (line 423) | maybePropagateTrace(n){return this.tracingService?.propagate?this.trac...
method handle (line 423) | handle(n){if(n.method==="JSONP")throw new _(-2800,!1);let r=this.xhrFa...
method constructor (line 423) | constructor(n,r){this.backend=n,this.injector=r}
method handle (line 423) | handle(n){if(this.chain===null){let r=Array.from(new Set([...this.inje...
method constructor (line 423) | constructor(n){this.handler=n}
method request (line 423) | request(n,r,o={}){let i;if(n instanceof so)i=n;else{let a;o.headers in...
method delete (line 423) | delete(n,r={}){return this.request("DELETE",n,r)}
method get (line 423) | get(n,r={}){return this.request("GET",n,r)}
method head (line 423) | head(n,r={}){return this.request("HEAD",n,r)}
method jsonp (line 423) | jsonp(n,r){return this.request("JSONP",n,{params:new qt().append(r,"JS...
method options (line 423) | options(n,r={}){return this.request("OPTIONS",n,r)}
method patch (line 423) | patch(n,r,o={}){return this.request("PATCH",n,dp(o,r))}
method post (line 423) | post(n,r,o={}){return this.request("POST",n,dp(o,r))}
method put (line 423) | put(n,r,o={}){return this.request("PUT",n,dp(o,r))}
method getToken (line 423) | getToken(){let n=this.doc.cookie||"";return n!==this.lastCookieString&...
method constructor (line 423) | constructor(n){this._doc=n}
method getTitle (line 423) | getTitle(){return this._doc.title}
method setTitle (line 423) | setTitle(n){this._doc.title=n||""}
method constructor (line 423) | constructor(n){super(),this._doc=n}
method sanitize (line 423) | sanitize(n,r){if(r==null)return null;switch(n){case Le.NONE:return r;c...
method bypassSecurityTrustHtml (line 423) | bypassSecurityTrustHtml(n){return dd(n)}
method bypassSecurityTrustStyle (line 423) | bypassSecurityTrustStyle(n){return fd(n)}
method bypassSecurityTrustScript (line 423) | bypassSecurityTrustScript(n){return pd(n)}
method bypassSecurityTrustUrl (line 423) | bypassSecurityTrustUrl(n){return hd(n)}
method bypassSecurityTrustResourceUrl (line 423) | bypassSecurityTrustResourceUrl(n){return gd(n)}
method setData (line 438) | setData(n,r,o,i){return super.setData(n,r,o,i??void 0)}
method dispatch (line 438) | dispatch(n){let r=new le;return this.events.next({message:n,completion...
method sendAction (line 438) | sendAction(n){let r=this.component(),o=this.surfaceId()??void 0,i={};i...
method resolvePrimitive (line 438) | resolvePrimitive(n){let r=this.component(),o=this.surfaceId();return!n...
method getUniqueId (line 438) | getUniqueId(n){return`${n}-${HM++}`}
method constructor (line 438) | constructor(){Zo(()=>{let o=this.surfaceId(),i=this.component();de(()=...
method ngOnDestroy (line 438) | ngOnDestroy(){this.isDestroyed=!0,this.clear()}
method render (line 438) | render(n,r){return at(this,null,function*(){let o=this.catalog[r.type]...
method clear (line 438) | clear(){this.currentRef?.destroy(),this.currentRef=null}
method render (line 438) | render(n,r){r&&this.applyTagClassMap(r);let o=this.markdownIt.render(n...
method applyTagClassMap (line 438) | applyTagClassMap(n){Object.entries(n).forEach(([r,o])=>{let i;switch(r...
method unapplyTagClassMap (line 438) | unapplyTagClassMap(){for(let[n,r]of this.originalClassMap)this.markdow...
method areHintedStyles (line 438) | areHintedStyles(n){return typeof n!="object"||!n||Array.isArray(n)?!1:...
method constructor (line 3) | constructor(t,n){super(),this.destination=t,this.source=n}
method next (line 3) | next(t){var n,r;(r=(n=this.destination)===null||n===void 0?void 0:n.next...
method error (line 3) | error(t){var n,r;(r=(n=this.destination)===null||n===void 0?void 0:n.err...
method complete (line 3) | complete(){var t,n;(n=(t=this.destination)===null||t===void 0?void 0:t.c...
method _subscribe (line 3) | _subscribe(t){var n,r;return(r=(n=this.source)===null||n===void 0?void 0...
method constructor (line 3) | constructor(t){super(),this._value=t}
method value (line 3) | get value(){return this.getValue()}
method _subscribe (line 3) | _subscribe(t){let n=super._subscribe(t);return!n.closed&&t.next(this._va...
method getValue (line 3) | getValue(){let{hasError:t,thrownError:n,_value:r}=this;if(t)throw n;retu...
method next (line 3) | next(t){super.next(this._value=t)}
method now (line 3) | now(){return(_o.delegate||Date).now()}
method constructor (line 3) | constructor(t=1/0,n=1/0,r=_o){super(),this._bufferSize=t,this._windowTim...
method next (line 3) | next(t){let{isStopped:n,_buffer:r,_infiniteTimeWindow:o,_timestampProvid...
method _subscribe (line 3) | _subscribe(t){this._throwIfClosed(),this._trimBuffer();let n=this._inner...
method _trimBuffer (line 3) | _trimBuffer(){let{_bufferSize:t,_timestampProvider:n,_buffer:r,_infinite...
method constructor (line 3) | constructor(t,n){super()}
method schedule (line 3) | schedule(t,n=0){return this}
method setInterval (line 3) | setInterval(e,t,...n){let{delegate:r}=wo;return r?.setInterval?r.setInte...
method clearInterval (line 3) | clearInterval(e){let{delegate:t}=wo;return(t?.clearInterval||clearInterv...
method constructor (line 3) | constructor(t,n){super(t,n),this.scheduler=t,this.work=n,this.pending=!1}
method schedule (line 3) | schedule(t,n=0){var r;if(this.closed)return this;this.state=t;let o=this...
method requestAsyncId (line 3) | requestAsyncId(t,n,r=0){return wo.setInterval(t.flush.bind(t,this),r)}
method recycleAsyncId (line 3) | recycleAsyncId(t,n,r=0){if(r!=null&&this.delay===r&&this.pending===!1)re...
method execute (line 3) | execute(t,n){if(this.closed)return new Error("executing a cancelled acti...
method _execute (line 3) | _execute(t,n){let r=!1,o;try{this.work(t)}catch(i){r=!0,o=i||new Error("...
method unsubscribe (line 3) | unsubscribe(){if(!this.closed){let{id:t,scheduler:n}=this,{actions:r}=n;...
function Vh (line 3) | function Vh(e){return e in rc?(delete rc[e],!0):!1}
method setImmediate (line 3) | setImmediate(e){let t=lD++;return rc[t]=!0,nc||(nc=Promise.resolve()),nc...
method clearImmediate (line 3) | clearImmediate(e){Vh(e)}
method setImmediate (line 3) | setImmediate(...e){let{delegate:t}=xo;return(t?.setImmediate||dD)(...e)}
method clearImmediate (line 3) | clearImmediate(e){let{delegate:t}=xo;return(t?.clearImmediate||fD)(e)}
method constructor (line 3) | constructor(t,n){super(t,n),this.scheduler=t,this.work=n}
method requestAsyncId (line 3) | requestAsyncId(t,n,r=0){return r!==null&&r>0?super.requestAsyncId(t,n,r)...
method recycleAsyncId (line 3) | recycleAsyncId(t,n,r=0){var o;if(r!=null?r>0:this.delay>0)return super.r...
method constructor (line 3) | constructor(t,n=e.now){this.schedulerActionCtor=t,this.now=n}
method schedule (line 3) | schedule(t,n=0,r){return new this.schedulerActionCtor(this,t).schedule(r...
method constructor (line 3) | constructor(t,n=vr.now){super(t,n),this.actions=[],this._active=!1}
method flush (line 3) | flush(t){let{actions:n}=this;if(this._active){n.push(t);return}let r;thi...
method flush (line 3) | flush(t){this._active=!0;let n=this._scheduled;this._scheduled=void 0;le...
method constructor (line 3) | constructor(t,n){super(t,n),this.scheduler=t,this.work=n}
method requestAsyncId (line 3) | requestAsyncId(t,n,r=0){return r!==null&&r>0?super.requestAsyncId(t,n,r)...
method recycleAsyncId (line 3) | recycleAsyncId(t,n,r=0){var o;if(r!=null?r>0:this.delay>0)return super.r...
method flush (line 3) | flush(t){this._active=!0;let n;t?n=t.id:(n=this._scheduled,this._schedul...
function Qi (line 3) | function Qi(e){return e&&k(e.schedule)}
function ic (line 3) | function ic(e){return e[e.length-1]}
function rn (line 3) | function rn(e){return k(ic(e))?e.pop():void 0}
function ct (line 3) | function ct(e){return Qi(ic(e))?e.pop():void 0}
function $h (line 3) | function $h(e,t){return typeof ic(e)=="number"?e.pop():t}
function ZN (line 3) | function ZN(e,t,n,r){var o=arguments.length,i=o<3?t:r===null?r=Object.ge...
function zh (line 3) | function zh(e,t,n,r){function o(i){return i instanceof n?i:new n(functio...
function Uh (line 3) | function Uh(e){var t=typeof Symbol=="function"&&Symbol.iterator,n=t&&e[t...
function Mn (line 3) | function Mn(e){return this instanceof Mn?(this.v=e,this):new Mn(e)}
function qh (line 3) | function qh(e,t,n){if(!Symbol.asyncIterator)throw new TypeError("Symbol....
function Gh (line 3) | function Gh(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyn...
function Ki (line 3) | function Ki(e){return k(e?.then)}
function Ji (line 3) | function Ji(e){return k(e[yr])}
function Xi (line 3) | function Xi(e){return Symbol.asyncIterator&&k(e?.[Symbol.asyncIterator])}
function es (line 3) | function es(e){return new TypeError(`You provided ${e!==null&&typeof e==...
function gD (line 3) | function gD(){return typeof Symbol!="function"||!Symbol.iterator?"@@iter...
function ns (line 3) | function ns(e){return k(e?.[ts])}
function rs (line 3) | function rs(e){return qh(this,arguments,function*(){let n=e.getReader();...
function os (line 3) | function os(e){return k(e?.getReader)}
function z (line 3) | function z(e){if(e instanceof B)return e;if(e!=null){if(Ji(e))return mD(...
function mD (line 3) | function mD(e){return new B(t=>{let n=e[yr]();if(k(n.subscribe))return n...
function yD (line 3) | function yD(e){return new B(t=>{for(let n=0;n<e.length&&!t.closed;n++)t....
function bD (line 3) | function bD(e){return new B(t=>{e.then(n=>{t.closed||(t.next(n),t.comple...
function vD (line 3) | function vD(e){return new B(t=>{for(let n of e)if(t.next(n),t.closed)ret...
function Wh (line 3) | function Wh(e){return new B(t=>{ED(e,t).catch(n=>t.error(n))})}
function DD (line 3) | function DD(e){return Wh(rs(e))}
function ED (line 3) | function ED(e,t){var n,r,o,i;return zh(this,void 0,void 0,function*(){tr...
function Se (line 3) | function Se(e,t,n,r=0,o=!1){let i=t.schedule(function(){n(),o?e.add(this...
function Io (line 3) | function Io(e,t=0){return j((n,r)=>{n.subscribe(R(r,o=>Se(r,e,()=>r.next...
function is (line 3) | function is(e,t=0){return j((n,r)=>{r.add(e.schedule(()=>n.subscribe(r),...
function Zh (line 3) | function Zh(e,t){return z(e).pipe(is(t),Io(t))}
function Yh (line 3) | function Yh(e,t){return z(e).pipe(is(t),Io(t))}
function Qh (line 3) | function Qh(e,t){return new B(n=>{let r=0;return t.schedule(function(){r...
function Kh (line 3) | function Kh(e,t){return new B(n=>{let r;return Se(n,t,()=>{r=e[ts](),Se(...
function ss (line 3) | function ss(e,t){if(!e)throw new Error("Iterable cannot be null");return...
function Jh (line 3) | function Jh(e,t){return ss(rs(e),t)}
function Xh (line 3) | function Xh(e,t){if(e!=null){if(Ji(e))return Zh(e,t);if(Er(e))return Qh(...
function lt (line 3) | function lt(e,t){return t?Xh(e,t):z(e)}
function us (line 3) | function us(...e){let t=ct(e);return lt(e,t)}
function _D (line 3) | function _D(e,t){let n=k(e)?e:()=>e,r=o=>o.error(n());return new B(t?o=>...
function CD (line 3) | function CD(e){return!!e&&(e instanceof B||k(e.lift)&&k(e.subscribe))}
function sc (line 3) | function sc(e,t){let n=typeof t=="object";return new Promise((r,o)=>{let...
function e0 (line 3) | function e0(e){return e instanceof Date&&!isNaN(e)}
function Ee (line 3) | function Ee(e,t){return j((n,r)=>{let o=0;n.subscribe(R(r,i=>{r.next(e.c...
function xD (line 3) | function xD(e,t){return wD(t)?e(...t):e(t)}
function _r (line 3) | function _r(e){return Ee(t=>xD(e,t))}
function as (line 3) | function as(e){if(e.length===1){let t=e[0];if(ID(t))return{args:t,keys:n...
function AD (line 3) | function AD(e){return e&&typeof e=="object"&&TD(e)===SD}
function cs (line 3) | function cs(e,t){return e.reduce((n,r,o)=>(n[r]=t[o],n),{})}
function ND (line 3) | function ND(...e){let t=ct(e),n=rn(e),{args:r,keys:o}=as(e);if(r.length=...
function kD (line 3) | function kD(e,t,n=De){return r=>{t0(t,()=>{let{length:o}=e,i=new Array(o...
function t0 (line 3) | function t0(e,t,n){e?Se(n,e,t):t()}
function n0 (line 3) | function n0(e,t,n,r,o,i,s,u){let a=[],c=0,l=0,d=!1,h=()=>{d&&!a.length&&...
function Mt (line 3) | function Mt(e,t,n=1/0){return k(t)?Mt((r,o)=>Ee((i,s)=>t(r,i,o,s))(z(e(r...
function To (line 3) | function To(e=1/0){return Mt(De,e)}
function r0 (line 3) | function r0(){return To(1)}
function ls (line 3) | function ls(...e){return r0()(lt(e,ct(e)))}
function RD (line 3) | function RD(e){return new B(t=>{z(e()).subscribe(t)})}
function FD (line 3) | function FD(...e){let t=rn(e),{args:n,keys:r}=as(e),o=new B(i=>{let{leng...
function uc (line 3) | function uc(e,t,n,r){if(k(n)&&(r=n,n=void 0),r)return uc(e,t,n).pipe(_r(...
function o0 (line 3) | function o0(e,t){return n=>r=>e[n](t,r)}
function jD (line 3) | function jD(e){return k(e.addListener)&&k(e.removeListener)}
function BD (line 3) | function BD(e){return k(e.on)&&k(e.off)}
function VD (line 3) | function VD(e){return k(e.addEventListener)&&k(e.removeEventListener)}
function ac (line 3) | function ac(e=0,t,n=oc){let r=-1;return t!=null&&(Qi(t)?n=t:r=t),new B(o...
function HD (line 3) | function HD(...e){let t=ct(e),n=$h(e,1/0),r=e;return r.length?r.length==...
function i0 (line 3) | function i0(e){return e.length===1&&UD(e[0])?e[0]:e}
function on (line 3) | function on(e,t){return j((n,r)=>{let o=0;n.subscribe(R(r,i=>e.call(t,i,...
function zD (line 3) | function zD(...e){let t=rn(e),n=i0(e);return n.length?new B(r=>{let o=n....
function s0 (line 3) | function s0(e){return j((t,n)=>{let r=!1,o=null,i=null,s=!1,u=()=>{if(i?...
function qD (line 3) | function qD(e,t=Dr){return s0(()=>ac(e,t))}
function cc (line 3) | function cc(e){return j((t,n)=>{let r=null,o=!1,i;r=t.subscribe(R(n,void...
function lc (line 3) | function lc(e,t){return k(t)?Mt(e,t,1):Mt(e,1)}
function u0 (line 3) | function u0(e,t=Dr){return j((n,r)=>{let o=null,i=null,s=null,u=()=>{if(...
function a0 (line 3) | function a0(e){return j((t,n)=>{let r=!1;t.subscribe(R(n,o=>{r=!0,n.next...
function dc (line 3) | function dc(e){return e<=0?()=>St:j((t,n)=>{let r=0;t.subscribe(R(n,o=>{...
function GD (line 3) | function GD(e){return Ee(()=>e)}
function c0 (line 3) | function c0(e,t=De){return e=e??WD,j((n,r)=>{let o,i=!0;n.subscribe(R(r,...
function WD (line 3) | function WD(e,t){return e===t}
function l0 (line 3) | function l0(e=ZD){return j((t,n)=>{let r=!1;t.subscribe(R(n,o=>{r=!0,n.n...
function ZD (line 3) | function ZD(){return new An}
function ds (line 3) | function ds(e){return j((t,n)=>{try{t.subscribe(n)}finally{n.add(e)}})}
function YD (line 3) | function YD(e,t){let n=arguments.length>=2;return r=>r.pipe(e?on((o,i)=>...
function QD (line 3) | function QD(e){return e<=0?()=>St:j((t,n)=>{let r=[];t.subscribe(R(n,o=>...
function d0 (line 3) | function d0(){return j((e,t)=>{let n,r=!1;e.subscribe(R(t,o=>{let i=n;n=...
function fs (line 3) | function fs(e={}){let{connector:t=()=>new le,resetOnError:n=!0,resetOnCo...
function fc (line 3) | function fc(e,t,...n){if(t===!0){e();return}if(t===!1)return;let r=new Z...
function f0 (line 3) | function f0(e,t,n){let r,o=!1;return e&&typeof e=="object"?{bufferSize:r...
function p0 (line 3) | function p0(e){return on((t,n)=>e<=n)}
function h0 (line 3) | function h0(...e){let t=ct(e);return j((n,r)=>{(t?ls(e,n,t):ls(e,n)).sub...
function ps (line 3) | function ps(e,t){return j((n,r)=>{let o=null,i=0,s=!1,u=()=>s&&!o&&r.com...
function KD (line 3) | function KD(e){return j((t,n)=>{z(e).subscribe(R(n,()=>n.complete(),Tt))...
function JD (line 3) | function JD(e,t=!1){return j((n,r)=>{let o=0;n.subscribe(R(r,i=>{let s=e...
function g0 (line 3) | function g0(e,t,n){let r=k(e)||t||n?{next:e,error:t,complete:n}:e;return...
function XD (line 3) | function XD(...e){let t=rn(e);return j((n,r)=>{let o=e.length,i=new Arra...
function hs (line 3) | function hs(){return pc}
function dt (line 3) | function dt(e){let t=pc;return pc=e,t}
function Cr (line 3) | function Cr(e){return e===m0||e?.name==="\u0275NotFound"}
function hc (line 3) | function hc(e,t,n){let r=Object.create(eE);r.source=e,r.computation=t,n!...
function y0 (line 3) | function y0(e,t){wn(e),xn(e,t),dr(e)}
function b0 (line 3) | function b0(e,t){wn(e),Bi(e,t),dr(e)}
method producerMustRecompute (line 3) | producerMustRecompute(e){return e.value===Qt||e.value===Cn}
method producerRecomputeValue (line 3) | producerRecomputeValue(e){if(e.value===Cn)throw new Error("");let t=e.va...
method constructor (line 3) | constructor(t,n){super(pt(t,n)),this.code=t}
function tE (line 3) | function tE(e){return`NG0${Math.abs(e)}`}
function pt (line 3) | function pt(e,t){return`${tE(e)}${t?": "+t:""}`}
function G (line 3) | function G(e){for(let t in e)if(e[t]===G)return t;throw Error("")}
function C0 (line 3) | function C0(e,t){for(let n in t)t.hasOwnProperty(n)&&!e.hasOwnProperty(n...
function kt (line 3) | function kt(e){if(typeof e=="string")return e;if(Array.isArray(e))return...
function _s (line 4) | function _s(e,t){return e?t?`${e} ${t}`:e:t||""}
function Cs (line 4) | function Cs(e){return e.__forward_ref__=Cs,e.toString=function(){return ...
function ue (line 4) | function ue(e){return Tc(e)?e():e}
function Tc (line 4) | function Tc(e){return typeof e=="function"&&e.hasOwnProperty(nE)&&e.__fo...
function I (line 4) | function I(e){return{token:e.token,providedIn:e.providedIn||null,factory...
function ht (line 4) | function ht(e){return{providers:e.providers||[],imports:e.imports||[]}}
function Fo (line 4) | function Fo(e){return oE(e,ws)}
function rE (line 4) | function rE(e){return Fo(e)!==null}
function oE (line 4) | function oE(e,t){return e.hasOwnProperty(t)&&e[t]||null}
function iE (line 4) | function iE(e){let t=e?.[ws]??null;return t||null}
function mc (line 4) | function mc(e){return e&&e.hasOwnProperty(ms)?e[ms]:null}
method constructor (line 4) | constructor(t,n){this._desc=t,this.\u0275prov=void 0,typeof n=="number"?...
method multi (line 4) | get multi(){return this}
method toString (line 4) | toString(){return`InjectionToken ${this._desc}`}
function Sc (line 4) | function Sc(e){return e&&!!e.\u0275providers}
function Rc (line 4) | function Rc(e){return Is(e,"@NgModule"),e[kc]||null}
function gt (line 4) | function gt(e){return Is(e,"@Component"),e[Mc]||null}
function xs (line 4) | function xs(e){return Is(e,"@Directive"),e[Ac]||null}
function w0 (line 4) | function w0(e){return Is(e,"@Pipe"),e[Nc]||null}
function Is (line 4) | function Is(e,t){if(e==null)throw new _(-919,!1)}
function Ne (line 4) | function Ne(e){return typeof e=="string"?e:e==null?"":String(e)}
function x0 (line 4) | function x0(e){return typeof e=="function"?e.name||e.toString():typeof e...
function Fc (line 4) | function Fc(e,t){return T0("",-200,t)}
function Ts (line 4) | function Ts(e,t){throw new _(-201,!1)}
function T0 (line 4) | function T0(e,t,n){let r=new _(t,e);return r[I0]=t,r[sE]=e,n&&(r[uE]=n),r}
function aE (line 4) | function aE(e){return e[I0]}
function S0 (line 4) | function S0(){return yc}
function _e (line 4) | function _e(e){let t=yc;return yc=e,t}
function Oc (line 4) | function Oc(e,t,n){let r=Fo(e);if(r&&r.providedIn=="root")return r.value...
method constructor (line 4) | constructor(t){this.injector=t}
method retrieve (line 4) | retrieve(t,n){let r=kn(n)||0;try{return this.injector.get(t,r&8?null:Nn,...
function dE (line 4) | function dE(e,t=0){let n=hs();if(n===void 0)throw new _(-203,!1);if(n===...
function A (line 4) | function A(e,t=0){return(S0()||dE)(ue(e),t)}
function b (line 4) | function b(e,t){return A(e,kn(t))}
function kn (line 4) | function kn(e){return typeof e>"u"||typeof e=="number"?e:0|(e.optional&&...
function fE (line 4) | function fE(e){return{optional:!!(e&8),host:!!(e&1),self:!!(e&2),skipSel...
function vc (line 4) | function vc(e){let t=[];for(let n=0;n<e.length;n++){let r=ue(e[n]);if(Ar...
function pE (line 4) | function pE(e){return e[lE]}
function sn (line 4) | function sn(e,t){let n=e.hasOwnProperty(Mo);return n?e[Mo]:null}
function M0 (line 4) | function M0(e,t,n){if(e.length!==t.length)return!1;for(let r=0;r<e.lengt...
function A0 (line 4) | function A0(e){return e.flat(Number.POSITIVE_INFINITY)}
function Ss (line 4) | function Ss(e,t){e.forEach(n=>Array.isArray(n)?Ss(n,t):t(n))}
function Pc (line 4) | function Pc(e,t,n){t>=e.length?e.push(n):e.splice(t,0,n)}
function Oo (line 4) | function Oo(e,t){return t>=e.length-1?e.pop():e.splice(t,1)[0]}
function N0 (line 4) | function N0(e,t){let n=[];for(let r=0;r<e;r++)n.push(t);return n}
function k0 (line 4) | function k0(e,t,n,r){let o=e.length;if(o==t)e.push(n,r);else if(o===1)e....
function Po (line 4) | function Po(e,t,n){let r=xr(e,t);return r>=0?e[r|1]=n:(r=~r,k0(e,r,t,n)),r}
function Ms (line 4) | function Ms(e,t){let n=xr(e,t);if(n>=0)return e[n|1]}
function xr (line 4) | function xr(e,t){return hE(e,t,1)}
function hE (line 4) | function hE(e,t,n){let r=0,o=e.length>>n;for(;o!==r;){let i=r+(o-r>>1),s...
method get (line 4) | get(t,n=Nn){if(n===Nn){let o=T0("",-201);throw o.name="\u0275NotFound",o...
function Pn (line 4) | function Pn(e){return{\u0275providers:e}}
function R0 (line 4) | function R0(...e){return{\u0275providers:Bc(!0,e),\u0275fromNgModule:!0}}
function Bc (line 4) | function Bc(e,...t){let n=[],r=new Set,o,i=s=>{n.push(s)};return Ss(t,s=...
function F0 (line 4) | function F0(e,t){for(let n=0;n<e.length;n++){let{ngModule:r,providers:o}...
function ys (line 4) | function ys(e,t,n,r){if(e=ue(e),!e)return!1;let o=null,i=mc(e),s=!i&>(...
function Vc (line 4) | function Vc(e,t){for(let n of e)Sc(n)&&(n=n.\u0275providers),Array.isArr...
function O0 (line 4) | function O0(e){return e!==null&&typeof e=="object"&&gE in e}
function mE (line 4) | function mE(e){return!!(e&&e.useExisting)}
function yE (line 4) | function yE(e){return!!(e&&e.useFactory)}
function Rn (line 4) | function Rn(e){return typeof e=="function"}
function P0 (line 4) | function P0(e){return!!e.useClass}
function Tr (line 4) | function Tr(){return gc===void 0&&(gc=new Ao),gc}
method destroyed (line 4) | get destroyed(){return this._destroyed}
method constructor (line 4) | constructor(t,n,r,o){super(),this.parent=n,this.source=r,this.scopes=o,E...
method retrieve (line 4) | retrieve(t,n){let r=kn(n)||0;try{return this.get(t,Nn,r)}catch(o){if(Cr(...
method destroy (line 4) | destroy(){So(this),this._destroyed=!0;let t=M(null);try{for(let r of thi...
method onDestroy (line 4) | onDestroy(t){return So(this),this._onDestroyHooks.push(t),()=>this.remov...
method runInContext (line 4) | runInContext(t){So(this);let n=dt(this),r=_e(void 0),o;try{return t()}fi...
method get (line 4) | get(t,n=Nn,r){if(So(this),t.hasOwnProperty(v0))return t[v0](this);let o=...
method resolveInjectorInitializers (line 4) | resolveInjectorInitializers(){let t=M(null),n=dt(this),r=_e(void 0),o;tr...
method toString (line 4) | toString(){let t=[],n=this.records;for(let r of n.keys())t.push(kt(r));r...
method processProvider (line 4) | processProvider(t){t=ue(t);let n=Rn(t)?t:ue(t&&t.provide),r=vE(t);if(!Rn...
method hydrate (line 4) | hydrate(t,n,r){let o=M(null);try{if(n.value===D0)throw Fc(kt(t));return ...
method injectableDefInScope (line 4) | injectableDefInScope(t){if(!t.providedIn)return!1;let n=ue(t.providedIn)...
method removeOnDestroy (line 4) | removeOnDestroy(t){let n=this._onDestroyHooks.indexOf(t);n!==-1&&this._o...
function Dc (line 4) | function Dc(e){let t=Fo(e),n=t!==null?t.factory:sn(e);if(n!==null)return...
function bE (line 4) | function bE(e){if(e.length>0)throw new _(204,!1);let n=iE(e);return n!==...
function vE (line 4) | function vE(e){if(O0(e))return wr(void 0,e.useValue);{let t=Hc(e);return...
function Hc (line 4) | function Hc(e,t,n){let r;if(Rn(e)){let o=ue(e);return sn(o)||Dc(o)}else ...
function So (line 4) | function So(e){if(e.destroyed)throw new _(205,!1)}
function wr (line 4) | function wr(e,t,n=!1){return{factory:e,value:t,multi:n?[]:void 0}}
function DE (line 4) | function DE(e){return!!e.deps}
function EE (line 4) | function EE(e){return e!==null&&typeof e=="object"&&typeof e.ngOnDestroy...
function _E (line 4) | function _E(e){return typeof e=="function"||typeof e=="object"&&e.ngMeta...
function Ec (line 4) | function Ec(e,t){for(let n of e)Array.isArray(n)?Ec(n,t):n&&Sc(n)?Ec(n.\...
function Sr (line 4) | function Sr(e,t){let n;e instanceof Fn?(So(e),n=e):n=new bc(e);let r,o=d...
function As (line 4) | function As(){return S0()!==void 0||hs()!=null}
function CE (line 4) | function CE(e){if(!As())throw new _(-203,!1)}
function bt (line 4) | function bt(e){return Array.isArray(e)&&typeof e[L0]=="object"}
function Ke (line 4) | function Ke(e){return Array.isArray(e)&&e[L0]===!0}
function qc (line 4) | function qc(
Copy disabled (too large)
Download .json
Condensed preview — 1514 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (16,136K chars).
[
{
"path": ".gemini/settings.json",
"chars": 37,
"preview": "{\n \"contextFileName\": \"AGENTS.md\"\n}\n"
},
{
"path": ".github/.release-please-manifest-v2.json",
"chars": 27,
"preview": "{\n \".\": \"2.0.0-alpha.0\"\n}\n"
},
{
"path": ".github/.release-please-manifest.json",
"chars": 20,
"preview": "{\n \".\": \"1.27.2\"\n}\n"
},
{
"path": ".github/ISSUE_TEMPLATE/bug_report.md",
"chars": 1791,
"preview": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n## 🔴 Required In"
},
{
"path": ".github/ISSUE_TEMPLATE/feature_request.md",
"chars": 1608,
"preview": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n** Please mak"
},
{
"path": ".github/pull_request_template.md",
"chars": 1820,
"preview": "**Please ensure you have read the [contribution guide](https://github.com/google/adk-python/blob/main/CONTRIBUTING.md) b"
},
{
"path": ".github/release-please-config-v2.json",
"chars": 1422,
"preview": "{\n \"$schema\": \"https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json\",\n \"packages\": {\n "
},
{
"path": ".github/release-please-config.json",
"chars": 1432,
"preview": "{\n \"$schema\": \"https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json\",\n \"last-release-s"
},
{
"path": ".github/workflows/analyze-releases-for-adk-docs-updates.yml",
"chars": 1295,
"preview": "name: Analyze New Release for ADK Docs Updates\n\non:\n # Runs on every new release.\n release:\n types: [published]\n #"
},
{
"path": ".github/workflows/check-file-contents.yml",
"chars": 5045,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": ".github/workflows/copybara-pr-handler.yml",
"chars": 4780,
"preview": "name: Copybara PR Handler\n\non:\n push:\n branches:\n - main\n workflow_dispatch:\n inputs:\n pr_number:\n "
},
{
"path": ".github/workflows/discussion_answering.yml",
"chars": 1864,
"preview": "name: ADK Answering Agent for Discussions\n\non:\n discussion:\n types: [created]\n discussion_comment:\n types: [crea"
},
{
"path": ".github/workflows/isort.yml",
"chars": 2006,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": ".github/workflows/issue-monitor.yml",
"chars": 1920,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": ".github/workflows/mypy-new-errors.yml",
"chars": 2317,
"preview": "name: Mypy New Error Check\n\non:\n push:\n branches: [ main ]\n pull_request:\n branches: [ main ]\n\n\njobs:\n mypy-dif"
},
{
"path": ".github/workflows/mypy.yml",
"chars": 551,
"preview": "name: Mypy Type Check\n\non:\n workflow_dispatch:\n\njobs:\n mypy:\n runs-on: ubuntu-latest\n strategy:\n matrix:\n "
},
{
"path": ".github/workflows/pr-triage.yml",
"chars": 1351,
"preview": "name: ADK Pull Request Triaging Agent\n\non:\n pull_request_target:\n types: [opened, reopened, edited]\n workflow_dispa"
},
{
"path": ".github/workflows/pyink.yml",
"chars": 2068,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": ".github/workflows/python-unit-tests.yml",
"chars": 1535,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": ".github/workflows/release-cherry-pick.yml",
"chars": 1381,
"preview": "# Step 3 (optional): Cherry-picks a commit from main to the release/candidate branch.\n# Use between step 1 and step 4 to"
},
{
"path": ".github/workflows/release-cut.yml",
"chars": 1415,
"preview": "# Step 1: Starts the release process by creating a release/candidate branch.\n# Generates a changelog PR for review (step"
},
{
"path": ".github/workflows/release-finalize.yml",
"chars": 3218,
"preview": "# Step 4: Triggers when the changelog PR is merged to release/candidate.\n# Records last-release-sha and renames release/"
},
{
"path": ".github/workflows/release-please.yml",
"chars": 1352,
"preview": "# Runs release-please to create/update a PR with version bump and changelog.\n# Triggered only by workflow_dispatch (from"
},
{
"path": ".github/workflows/release-publish.yml",
"chars": 1717,
"preview": "# Step 6: Builds and publishes the package to PyPI from a release/v{version} branch.\n# Creates a merge-back PR (step 7) "
},
{
"path": ".github/workflows/release-v2-cherry-pick.yml",
"chars": 1404,
"preview": "# Step 3 (v2, optional): Cherry-picks a commit from v2 to the release/v2-candidate branch.\n# Use between step 1 and step"
},
{
"path": ".github/workflows/release-v2-cut.yml",
"chars": 1459,
"preview": "# Step 1 (v2): Starts the v2 release process by creating a release/v2-candidate branch.\n# Generates a changelog PR for r"
},
{
"path": ".github/workflows/release-v2-finalize.yml",
"chars": 3262,
"preview": "# Step 4 (v2): Triggers when the changelog PR is merged to release/v2-candidate.\n# Records last-release-sha and renames "
},
{
"path": ".github/workflows/release-v2-please.yml",
"chars": 1389,
"preview": "# Runs release-please to create/update a PR with version bump and changelog for v2.\n# Triggered only by workflow_dispatc"
},
{
"path": ".github/workflows/release-v2-publish.yml",
"chars": 2616,
"preview": "# Step 6 (v2): Builds and publishes the v2 package to PyPI from a release/v{version} branch.\n# Converts semver pre-relea"
},
{
"path": ".github/workflows/stale-bot.yml",
"chars": 1635,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": ".github/workflows/triage.yml",
"chars": 1712,
"preview": "name: ADK Issue Triaging Agent\n\non:\n issues:\n types: [opened, labeled]\n schedule:\n # Run every 6 hours to triage"
},
{
"path": ".github/workflows/upload-adk-docs-to-vertex-ai-search.yml",
"chars": 1728,
"preview": "name: Upload ADK Docs to Vertex AI Search\n\non:\n # Runs once per day at 16:00 UTC\n schedule:\n - cron: '00 16 * * *'\n "
},
{
"path": ".github/workflows/v2-sync.yml",
"chars": 1897,
"preview": "# Automatically creates a PR to merge main (v1) into v2 to keep v2 up to date.\n# The oncall is responsible for reviewing"
},
{
"path": ".gitignore",
"chars": 1193,
"preview": "# Python\n__pycache__/\n*.py[cod]\n*$py.class\n*.so\n.Python\nbuild/\ndevelop-eggs/\ndist/\ndownloads/\neggs/\n.eggs/\nlib/\nlib64/\np"
},
{
"path": "AGENTS.md",
"chars": 30689,
"preview": "# AI Coding Assistant Context\n\nThis document provides context for AI coding assistants (Claude Code, Gemini\nCLI, GitHub "
},
{
"path": "CHANGELOG.md",
"chars": 188210,
"preview": "# Changelog\n\n## [1.27.2](https://github.com/google/adk-python/compare/v1.27.1...v1.27.2) (2026-03-17)\n### Bug Fixes\n * "
},
{
"path": "CONTRIBUTING.md",
"chars": 7747,
"preview": "# How to contribute\n\nWe'd love to accept your patches and contributions to this project.\n\n- [How to contribute](#how-t"
},
{
"path": "LICENSE",
"chars": 11357,
"preview": "\n Apache License\n Version 2.0, January 2004\n "
},
{
"path": "README.md",
"chars": 8183,
"preview": "# Agent Development Kit (ADK)\n\n[](LICENSE)\n[;\n# you may no"
},
{
"path": "contributing/README.md",
"chars": 785,
"preview": "# Contributing Resources\n\nThis folder hosts resources for ADK contributors, for example, testing samples etc.\n\n## Sample"
},
{
"path": "contributing/adk_project_overview_and_architecture.md",
"chars": 3931,
"preview": "# ADK Project Overview and Architecture\n\nGoogle Agent Development Kit (ADK) for Python\n\n## Core Philosophy & Architectur"
},
{
"path": "contributing/dev/utils/build_llms_txt.py",
"chars": 11641,
"preview": "#!/usr/bin/env python3\n# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n#"
},
{
"path": "contributing/samples/a2a_auth/README.md",
"chars": 8449,
"preview": "# A2A OAuth Authentication Sample Agent\n\nThis sample demonstrates the **Agent-to-Agent (A2A)** architecture with **OAuth"
},
{
"path": "contributing/samples/a2a_auth/__init__.py",
"chars": 595,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/a2a_auth/agent.py",
"chars": 2266,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/a2a_auth/remote_a2a/bigquery_agent/__init__.py",
"chars": 595,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/a2a_auth/remote_a2a/bigquery_agent/agent.json",
"chars": 1122,
"preview": "{\n \"capabilities\": {},\n \"defaultInputModes\": [\"text/plain\"],\n \"defaultOutputModes\": [\"application/json\"],\n \"descript"
},
{
"path": "contributing/samples/a2a_auth/remote_a2a/bigquery_agent/agent.py",
"chars": 2449,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/a2a_basic/README.md",
"chars": 5073,
"preview": "# A2A Basic Sample Agent\n\nThis sample demonstrates the **Agent-to-Agent (A2A)** architecture in the Agent Development Ki"
},
{
"path": "contributing/samples/a2a_basic/__init__.py",
"chars": 595,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/a2a_basic/agent.py",
"chars": 3996,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/a2a_basic/remote_a2a/check_prime_agent/__init__.py",
"chars": 595,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/a2a_basic/remote_a2a/check_prime_agent/agent.json",
"chars": 652,
"preview": "{\n \"capabilities\": {},\n \"defaultInputModes\": [\"text/plain\"],\n \"defaultOutputModes\": [\"application/json\"],\n \"descript"
},
{
"path": "contributing/samples/a2a_basic/remote_a2a/check_prime_agent/agent.py",
"chars": 2286,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/a2a_human_in_loop/README.md",
"chars": 7403,
"preview": "# A2A Human-in-the-Loop Sample Agent\n\nThis sample demonstrates the **Agent-to-Agent (A2A)** architecture with **Human-in"
},
{
"path": "contributing/samples/a2a_human_in_loop/__init__.py",
"chars": 595,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/a2a_human_in_loop/agent.py",
"chars": 1794,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/a2a_human_in_loop/remote_a2a/human_in_loop/__init__.py",
"chars": 595,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/a2a_human_in_loop/remote_a2a/human_in_loop/agent.json",
"chars": 1186,
"preview": "{\n \"capabilities\": {},\n \"defaultInputModes\": [\"text/plain\"],\n \"defaultOutputModes\": [\"application/json\"],\n \"descript"
},
{
"path": "contributing/samples/a2a_human_in_loop/remote_a2a/human_in_loop/agent.py",
"chars": 1903,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/a2a_root/README.md",
"chars": 4155,
"preview": "# A2A Root Sample Agent\n\nThis sample demonstrates how to use a **remote Agent-to-Agent (A2A) agent as the root agent** i"
},
{
"path": "contributing/samples/a2a_root/agent.py",
"chars": 947,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/a2a_root/remote_a2a/hello_world/__init__.py",
"chars": 595,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/a2a_root/remote_a2a/hello_world/agent.py",
"chars": 4133,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/adk_answering_agent/README.md",
"chars": 5699,
"preview": "# ADK Answering Agent\n\nThe ADK Answering Agent is a Python-based agent designed to help answer questions in GitHub discu"
},
{
"path": "contributing/samples/adk_answering_agent/__init__.py",
"chars": 595,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/adk_answering_agent/agent.py",
"chars": 5247,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/adk_answering_agent/gemini_assistant/__init__.py",
"chars": 595,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/adk_answering_agent/gemini_assistant/agent.py",
"chars": 3900,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/adk_answering_agent/main.py",
"chars": 7385,
"preview": "\"\"\"ADK Answering Agent main script.\"\"\"\n\n# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 ("
},
{
"path": "contributing/samples/adk_answering_agent/settings.py",
"chars": 1624,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/adk_answering_agent/tools.py",
"chars": 7429,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/adk_answering_agent/upload_docs_to_vertex_ai_search.py",
"chars": 8028,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/adk_answering_agent/utils.py",
"chars": 5719,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/adk_documentation/__init__.py",
"chars": 574,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/adk_documentation/adk_docs_updater/__init__.py",
"chars": 595,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/adk_documentation/adk_docs_updater/agent.py",
"chars": 7248,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/adk_documentation/adk_docs_updater/main.py",
"chars": 5040,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/adk_documentation/adk_release_analyzer/README.md",
"chars": 3782,
"preview": "# ADK Release Analyzer Agent\n\nThe ADK Release Analyzer Agent is a Python-based agent designed to help keep\ndocumentation"
},
{
"path": "contributing/samples/adk_documentation/adk_release_analyzer/__init__.py",
"chars": 595,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/adk_documentation/adk_release_analyzer/agent.py",
"chars": 23484,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/adk_documentation/adk_release_analyzer/main.py",
"chars": 2071,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/adk_documentation/settings.py",
"chars": 1141,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/adk_documentation/tools.py",
"chars": 27420,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/adk_documentation/utils.py",
"chars": 4284,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/adk_issue_formatting_agent/__init__.py",
"chars": 595,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/adk_issue_formatting_agent/agent.py",
"chars": 10236,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/adk_issue_formatting_agent/settings.py",
"chars": 1110,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/adk_issue_formatting_agent/utils.py",
"chars": 1633,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/adk_issue_monitoring_agent/PROMPT_INSTRUCTION.txt",
"chars": 1162,
"preview": "You are the automated security and moderation agent for the {OWNER}/{REPO} repository.\n\nYou will be provided with an Iss"
},
{
"path": "contributing/samples/adk_issue_monitoring_agent/README.md",
"chars": 3579,
"preview": "# ADK Issue Monitoring Agent 🛡️\n\nAn intelligent, cost-optimized, automated moderation agent built with the **Google Agen"
},
{
"path": "contributing/samples/adk_issue_monitoring_agent/__init__.py",
"chars": 595,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/adk_issue_monitoring_agent/agent.py",
"chars": 4096,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/adk_issue_monitoring_agent/main.py",
"chars": 6768,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/adk_issue_monitoring_agent/settings.py",
"chars": 1522,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/adk_issue_monitoring_agent/utils.py",
"chars": 4860,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/adk_knowledge_agent/README.md",
"chars": 694,
"preview": "# Agent Knowledge Agent\n\nAn intelligent assistant for performing Vertex AI Search to find ADK knowledge\nand documentatio"
},
{
"path": "contributing/samples/adk_knowledge_agent/__init__.py",
"chars": 595,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/adk_knowledge_agent/agent.json",
"chars": 660,
"preview": "{\n \"capabilities\": {},\n \"defaultInputModes\": [\"text/plain\"],\n \"defaultOutputModes\": [\"application/json\"],\n \"descript"
},
{
"path": "contributing/samples/adk_knowledge_agent/agent.py",
"chars": 2576,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/adk_knowledge_agent/requirements.txt",
"chars": 23,
"preview": "google-adk[a2a]==1.15.1"
},
{
"path": "contributing/samples/adk_pr_agent/__init__.py",
"chars": 595,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/adk_pr_agent/agent.py",
"chars": 4845,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/adk_pr_agent/main.py",
"chars": 2430,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/adk_pr_triaging_agent/README.md",
"chars": 3524,
"preview": "# ADK Pull Request Triaging Assistant\n\nThe ADK Pull Request (PR) Triaging Assistant is a Python-based agent designed to "
},
{
"path": "contributing/samples/adk_pr_triaging_agent/__init__.py",
"chars": 595,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/adk_pr_triaging_agent/agent.py",
"chars": 10504,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/adk_pr_triaging_agent/main.py",
"chars": 2195,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/adk_pr_triaging_agent/settings.py",
"chars": 1076,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/adk_pr_triaging_agent/utils.py",
"chars": 3583,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/adk_stale_agent/PROMPT_INSTRUCTION.txt",
"chars": 4167,
"preview": "You are a highly intelligent repository auditor for '{OWNER}/{REPO}'.\nYour job is to analyze a specific issue and report"
},
{
"path": "contributing/samples/adk_stale_agent/README.md",
"chars": 4829,
"preview": "# ADK Stale Issue Auditor Agent\n\nThis directory contains an autonomous, **GraphQL-powered** agent designed to audit a Gi"
},
{
"path": "contributing/samples/adk_stale_agent/__init__.py",
"chars": 595,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/adk_stale_agent/agent.py",
"chars": 18920,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/adk_stale_agent/main.py",
"chars": 6196,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/adk_stale_agent/settings.py",
"chars": 2393,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/adk_stale_agent/utils.py",
"chars": 6888,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/adk_triaging_agent/README.md",
"chars": 4871,
"preview": "# ADK Issue Triaging Assistant\n\nThe ADK Issue Triaging Assistant is a Python-based agent designed to help manage and tri"
},
{
"path": "contributing/samples/adk_triaging_agent/__init__.py",
"chars": 595,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/adk_triaging_agent/agent.py",
"chars": 11004,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/adk_triaging_agent/main.py",
"chars": 6558,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/adk_triaging_agent/settings.py",
"chars": 1186,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/adk_triaging_agent/utils.py",
"chars": 1854,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/agent_engine_code_execution/README",
"chars": 1723,
"preview": "# OAuth Sample\n\n## Introduction\n\nThis sample data science agent uses Agent Engine Code Execution Sandbox to execute LLM "
},
{
"path": "contributing/samples/agent_engine_code_execution/__init__.py",
"chars": 595,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/agent_engine_code_execution/agent.py",
"chars": 4526,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/agent_registry_agent/README.md",
"chars": 1576,
"preview": "# Agent Registry Sample\n\nThis sample demonstrates how to use the `AgentRegistry` client to discover agents and MCP serve"
},
{
"path": "contributing/samples/agent_registry_agent/__init__.py",
"chars": 595,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/agent_registry_agent/agent.py",
"chars": 2331,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/api_registry_agent/README.md",
"chars": 848,
"preview": "# BigQuery API Registry Agent\n\nThis agent demonstrates how to use `ApiRegistry` to discover and interact with Google Clo"
},
{
"path": "contributing/samples/api_registry_agent/__init__.py",
"chars": 595,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/api_registry_agent/agent.py",
"chars": 1739,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/application_integration_agent/README.md",
"chars": 2009,
"preview": "# Application Integration Agent Sample\n\n## Introduction\n\nThis sample demonstrates how to use the `ApplicationIntegration"
},
{
"path": "contributing/samples/application_integration_agent/__init__.py",
"chars": 595,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/application_integration_agent/agent.py",
"chars": 2260,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/artifact_save_text/__init__.py",
"chars": 595,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/artifact_save_text/agent.py",
"chars": 1575,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/authn-adk-all-in-one/README.md",
"chars": 4645,
"preview": "## ADK Authentication Demo (All in one - Agent, IDP and The app)\n\nThis folder contains everything you need to run the AD"
},
{
"path": "contributing/samples/authn-adk-all-in-one/adk_agents/agent_openapi_tools/__init__.py",
"chars": 595,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/authn-adk-all-in-one/adk_agents/agent_openapi_tools/agent.py",
"chars": 2080,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/authn-adk-all-in-one/adk_agents/agent_openapi_tools/openapi.yaml",
"chars": 6746,
"preview": "openapi: 3.0.0\ninfo:\n title: Hotel Booker API\n description: A simple API for managing hotel bookings, with a custom cl"
},
{
"path": "contributing/samples/authn-adk-all-in-one/adk_agents/requirements.txt",
"chars": 17,
"preview": "google-adk==1.12\n"
},
{
"path": "contributing/samples/authn-adk-all-in-one/adk_agents/sample.env",
"chars": 167,
"preview": "# General Agent Configuration\nGOOGLE_GENAI_USE_VERTEXAI=False\nGOOGLE_API_KEY=NOT_SET\nGOOGLE_MODEL=gemini-2.5-flash\nOAUTH"
},
{
"path": "contributing/samples/authn-adk-all-in-one/hotel_booker_app/hotelbooker_core.py",
"chars": 8261,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/authn-adk-all-in-one/hotel_booker_app/main.py",
"chars": 7589,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/authn-adk-all-in-one/hotel_booker_app/openapi.yaml",
"chars": 6746,
"preview": "openapi: 3.0.0\ninfo:\n title: Hotel Booker API\n description: A simple API for managing hotel bookings, with a custom cl"
},
{
"path": "contributing/samples/authn-adk-all-in-one/idp/app.py",
"chars": 17245,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/authn-adk-all-in-one/idp/sample.env",
"chars": 593,
"preview": "GENERATE_JWT=true\n\n# Steps - \n# 1. ssh-keygen -t rsa -b 2048 -m PEM -f private_key.pem\n# 2. When asked about passphrase "
},
{
"path": "contributing/samples/authn-adk-all-in-one/idp/sample.jwks.json",
"chars": 66,
"preview": "{\n \"keys\": [\n \"Replace with JWKS from jwkset.com/generate\"\n ]\n}"
},
{
"path": "contributing/samples/authn-adk-all-in-one/idp/templates/admin.html",
"chars": 10132,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width"
},
{
"path": "contributing/samples/authn-adk-all-in-one/idp/templates/consent.html",
"chars": 1507,
"preview": "<!DOCTYPE html>\n\n<html lang=\"en\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initi"
},
{
"path": "contributing/samples/authn-adk-all-in-one/idp/templates/login.html",
"chars": 1361,
"preview": "<!DOCTYPE html>\n\n<html lang=\"en\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initi"
},
{
"path": "contributing/samples/authn-adk-all-in-one/requirements.txt",
"chars": 107,
"preview": "google-adk==1.12\nFlask==3.1.3\nflask-cors==6.0.1\npython-dotenv==1.1.1\nPyJWT[crypto]==2.10.1\nrequests==2.32.4"
},
{
"path": "contributing/samples/bigquery/README.md",
"chars": 6572,
"preview": "# BigQuery Tools Sample\n\n## Introduction\n\nThis sample agent demonstrates the BigQuery first-party tools in ADK,\ndistribu"
},
{
"path": "contributing/samples/bigquery/__init__.py",
"chars": 595,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/bigquery/agent.py",
"chars": 4201,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/bigquery_mcp/README.md",
"chars": 1669,
"preview": "# BigQuery MCP Toolset Sample\n\n## Introduction\n\nThis sample agent demonstrates using ADK's `McpToolset` to interact with"
},
{
"path": "contributing/samples/bigquery_mcp/__init__.py",
"chars": 595,
"preview": "# Copyright 2025 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/bigquery_mcp/agent.py",
"chars": 2000,
"preview": "# Copyright 2025 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/bigtable/README.md",
"chars": 3584,
"preview": "# Bigtable Tools Sample\n\n## Introduction\n\nThis sample agent demonstrates the Bigtable first-party tools in ADK,\ndistribu"
},
{
"path": "contributing/samples/bigtable/__init__.py",
"chars": 595,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/bigtable/agent.py",
"chars": 4878,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/built_in_multi_tools/README.md",
"chars": 703,
"preview": "This agent is to demonstrate that the built-in google search tool and the\nVertexAiSearchTool can be used together with o"
},
{
"path": "contributing/samples/built_in_multi_tools/__init__.py",
"chars": 595,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/built_in_multi_tools/agent.py",
"chars": 2172,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/cache_analysis/README.md",
"chars": 4928,
"preview": "# Cache Analysis Research Assistant\n\nThis sample demonstrates ADK context caching features with a comprehensive research"
},
{
"path": "contributing/samples/cache_analysis/__init__.py",
"chars": 616,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/cache_analysis/agent.py",
"chars": 41892,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/cache_analysis/run_cache_experiments.py",
"chars": 23952,
"preview": "#!/usr/bin/env python3\n# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n#"
},
{
"path": "contributing/samples/cache_analysis/utils.py",
"chars": 8990,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/callbacks/__init__.py",
"chars": 595,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/callbacks/agent.py",
"chars": 6281,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/callbacks/main.py",
"chars": 2669,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/code_execution/__init__.py",
"chars": 595,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/code_execution/agent.py",
"chars": 4242,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/code_execution/gke_sandbox_agent.py",
"chars": 1904,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/computer_use/README.md",
"chars": 2886,
"preview": "# Computer Use Agent\n\nThis directory contains a computer use agent that can operate a browser to complete user tasks. Th"
},
{
"path": "contributing/samples/computer_use/agent.py",
"chars": 1456,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/computer_use/playwright.py",
"chars": 11227,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/computer_use/requirements.txt",
"chars": 60,
"preview": "termcolor==3.1.0\nplaywright==1.52.0\nbrowserbase==1.3.0\nrich\n"
},
{
"path": "contributing/samples/context_offloading_with_artifact/README.md",
"chars": 3410,
"preview": "# Sales Assistant Agent with Context Offloading\n\nThis agent acts as a sales assistant, capable of generating and retriev"
},
{
"path": "contributing/samples/context_offloading_with_artifact/__init__.py",
"chars": 595,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/context_offloading_with_artifact/agent.py",
"chars": 9322,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/core_basic_config/README.md",
"chars": 83,
"preview": "# Basic Config-based Agent\n\nThis sample only covers:\n\n* name\n* description\n* model\n"
},
{
"path": "contributing/samples/core_basic_config/root_agent.yaml",
"chars": 536,
"preview": "# yaml-language-server: $schema=https://raw.githubusercontent.com/google/adk-python/refs/heads/main/src/google/adk/agent"
},
{
"path": "contributing/samples/core_callback_config/__init__.py",
"chars": 574,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/core_callback_config/callbacks.py",
"chars": 1887,
"preview": "from google.genai import types\n\n\nasync def before_agent_callback(callback_context):\n print('@before_agent_callback')\n "
},
{
"path": "contributing/samples/core_callback_config/root_agent.yaml",
"chars": 2849,
"preview": "# yaml-language-server: $schema=https://raw.githubusercontent.com/google/adk-python/refs/heads/main/src/google/adk/agent"
},
{
"path": "contributing/samples/core_callback_config/tools.py",
"chars": 1120,
"preview": "import random\n\nfrom google.adk.tools.tool_context import ToolContext\n\n\ndef roll_die(sides: int, tool_context: ToolContex"
},
{
"path": "contributing/samples/core_custom_agent_config/__init__.py",
"chars": 574,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/core_custom_agent_config/my_agents.py",
"chars": 2084,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/core_custom_agent_config/root_agent.yaml",
"chars": 296,
"preview": "# yaml-language-server: $schema=https://raw.githubusercontent.com/google/adk-python/refs/heads/main/src/google/adk/agent"
},
{
"path": "contributing/samples/core_generate_content_config_config/root_agent.yaml",
"chars": 573,
"preview": "# yaml-language-server: $schema=https://raw.githubusercontent.com/google/adk-python/refs/heads/main/src/google/adk/agent"
},
{
"path": "contributing/samples/crewai_tool_kwargs/README.md",
"chars": 3932,
"preview": "# CrewAI Tool **kwargs Parameter Handling\n\nThis sample demonstrates how `CrewaiTool` correctly handles tools with\n`**kwa"
},
{
"path": "contributing/samples/crewai_tool_kwargs/__init__.py",
"chars": 595,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/crewai_tool_kwargs/agent.py",
"chars": 3607,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/crewai_tool_kwargs/main.py",
"chars": 3118,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
},
{
"path": "contributing/samples/custom_code_execution/README.md",
"chars": 2929,
"preview": "# Custom Code Executor Agent Sample\n\nThis directory contains a sample agent that demonstrates how to customize a\n`CodeEx"
},
{
"path": "contributing/samples/custom_code_execution/__init__.py",
"chars": 595,
"preview": "# Copyright 2026 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this f"
}
]
// ... and 1314 more files (download for full content)
About this extraction
This page contains the full source code of the google/adk-python GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1514 files (21.2 MB), approximately 4.0M tokens, and a symbol index with 12984 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.