Upstream merge#4
Merged
Merged
Conversation
PiperOrigin-RevId: 860929058
…tor and add threshold to custom metric function expected signature Co-authored-by: Joseph Pagadora <jcpagadora@google.com> PiperOrigin-RevId: 861268984
Co-authored-by: Ankur Sharma <ankusharma@google.com> PiperOrigin-RevId: 861335865
…date_time of storage is later than the current in memory session object This changes the behavior of how we handle stale session, instead of reject the transaction entirely, we aggresively refresh the session. Removed synchronous inspect(self).session calls within StorageSession.update_timestamp_tz and _dialect_name. This introspection was causing deadlocks/hangs when used with sqlalchemy.ext.asyncio in Python 3.13. Closes issue: #1733 Co-authored-by: Shangjie Chen <deanchen@google.com> PiperOrigin-RevId: 861353058
…e for users that don't set it PiperOrigin-RevId: 861738532
Fix #4257 https://click.palletsprojects.com/en/stable/documentation/#escaping-click-s-wrapping Co-authored-by: Ankur <ankusharma@google.com>
…improve file filtering Co-authored-by: Xuan Yang <xygoogle@google.com> PiperOrigin-RevId: 861784867
Details: * The Sampler allows ADK agent optimizers to request evals and receive detailed eval results that can be used to guide agent optimization. * This interface allows developers to run custom evaluations if needed for their agent. An implementation to interface with the inbuilt LocalEvalService shall be published shortly in a follow-up PR. * The AgentOptimizer interface describes the general framework for an ADK agent optimizer that uses the Sampler interface to optimize an ADK agent. * data_types.py contains generic types and base classes to allow intercommunication between the AgentOptimizer, Sampler, and developer code. Co-authored-by: Keyur Joshi <keyurj@google.com> PiperOrigin-RevId: 861849691
* The main fix is in eval_metrics.py * Removed some deprecated paths in the FastAPI server * Added a unit test to catch future breakages * Bump fastapi version to be 0.124.1 to capture the fix in fastapi/fastapi#14482 * Removed the upper-bound restriction on fastapi version which was used to temporarily fix the issue Fixes #3173 Co-authored-by: Liang Wu <wuliang@google.com> PiperOrigin-RevId: 861867708
Include the underlying exception message in the ConnectionError raised when session.list_tools() fails. PiperOrigin-RevId: 861889733
…ad_resource, list_resources, get_resource_info) This allows users to access MCP resources on their own within agent logic / using custom tools. I plan on also later adding it to the agent state. Co-authored-by: Kathy Wu <wukathy@google.com> PiperOrigin-RevId: 861910520
…nt due to code_execution_result.output is None PiperOrigin-RevId: 861933883
Merge #4276 This adds 2 mypy GitHub Actions checks: * `mypy.yml` runs mypy on every PR. This will list all errors, so it shouldn't block until errors are resolved. * `mypy-new-errors.yml` compares the PR branch to `main` to ensure no new mypy errors are introduced. This check can be made blocking now and can be removed once all errors are resolved in favor of `mypy.yml`. ### Checklist - [x] I have read the [CONTRIBUTING.md](https://github.com/google/adk-python/blob/main/CONTRIBUTING.md) document. - [x] I have performed a self-review of my own code. - [x] I have commented my code, particularly in hard-to-understand areas. - [x] I have added tests that prove my fix is effective or that my feature works. - [x] New and existing unit tests pass locally with my changes. - [x] I have manually tested my changes end-to-end. - [x] Any dependent changes have been merged and published in downstream modules. COPYBARA_INTEGRATE_REVIEW=#4276 from sararob:mypy-gh-actions 6313077 PiperOrigin-RevId: 862226296
MCPToolset has been deprecated, use McpToolset instead. Co-authored-by: Kathy Wu <wukathy@google.com> PiperOrigin-RevId: 862457868
…t of the toolset Co-authored-by: Xiang (Sean) Zhou <seanzhougoogle@google.com> PiperOrigin-RevId: 862597425
Since we will save MCP resource contents to the artifact service, no need to do post-processing based on mime type. Also fixed the implementation; the correct method to call is session.read_resource(uri). Co-authored-by: Kathy Wu <wukathy@google.com> PiperOrigin-RevId: 862885513
Fixes: #3780 Co-authored-by: Xuan Yang <xygoogle@google.com> PiperOrigin-RevId: 862897383
Improves test reliability by guaranteeing the BigQueryAgentAnalyticsPlugin is shut down after each test execution. This is achieved by wrapping test logic in try/finally blocks, using a yield fixture, or employing a new asynccontextmanager to ensure the plugin.shutdown() method is always called, preventing potential resource leaks between tests. PiperOrigin-RevId: 862951816
Close: #4067 Co-authored-by: Xuan Yang <xygoogle@google.com> PiperOrigin-RevId: 862965769
This CL enhances asyncio event loop management and test isolation. - **BigQuery Analytics Plugin:** Ensure the asyncio event loop is consistently closed within the BigQuery analytics plugin. This prevents potential resource leaks. Add checks to handle potential deadlocks in Python 3.13+ when creating loops during interpreter shutdown. - **Test Thread Pool Cleanup:** Introduce a pytest fixture (`cleanup_thread_pools`) to automatically shut down and clear all tool-related thread pools after each test run in `test_functions_thread_pool.py`. This improves test isolation and prevents order-dependent test failures. - **Streaming Test Loop Restoration:** Refactor event loop handling in `test_streaming.py`. A new `_run_with_loop` method is introduced in the custom test runners to create a temporary event loop for each test execution, run the coroutine, and crucially, restore the original event loop afterwards. This prevents tests from interfering with each other's loop state. - **Resource Closure:** Ensure services are closed properly in tests by adding `await service.close()` in `test_service_factory.py` and using `async with session_service` in `test_session_service.py`. PiperOrigin-RevId: 863305565
This change introduces a new function, _validate_agent_import, which attempts to import the user's agent.py file before the deployment process begins. This helps catch common issues such as missing dependencies, incorrect relative imports, or syntax errors in the agent code early, providing more informative error messages to the user. Co-authored-by: George Weale <gweale@google.com> PiperOrigin-RevId: 863310033
…sion For providers that typically require file IDs (like OpenAI and Azure), if a file URI is an HTTP/HTTPS URL and the MIME type is image, video, or audio, convert it to the corresponding URL-based content type (e.g., "image_url") instead of using the generic "file" type Close #4112 Co-authored-by: George Weale <gweale@google.com> PiperOrigin-RevId: 863311703
Fixes issue#3328 Co-authored-by: Liang Wu <wuliang@google.com> PiperOrigin-RevId: 863314939
The `_part_has_payload` helper now returns False for parts containing a function response, preventing the addition of fallback user content when a user turn consists solely of tool outputs. Close #4249 Co-authored-by: George Weale <gweale@google.com> PiperOrigin-RevId: 863319497
The ADK web server's /run_sse endpoint now yields a JSON object like {"error": "..."} when an exception occurs during event generation. The adk_web_server_client is updated to detect this error payload and raise a RuntimeError.
Close #4291
Co-authored-by: George Weale <gweale@google.com>
PiperOrigin-RevId: 863475838
…ack_context This seems a breaking change, but actually credential manager is used internally only and also it won't work if some one call it using callback context Co-authored-by: Xiang (Sean) Zhou <seanzhougoogle@google.com> PiperOrigin-RevId: 863534476
…et_tools
This change adds framework-level support for resolving toolset authentication before calling get_tools(). Key changes:
- Add _resolve_toolset_auth() method in BaseLlmFlow that iterates
through toolsets, checks for auth config, and resolves credentials
via CredentialManager before tool listing
- Add TOOLSET_AUTH_CREDENTIAL_ID_PREFIX constant for identifying
toolset auth requests
- Add skip logic in auth_preprocessor to not resume function calls
for toolset auth (they do not need it)
- Add get_auth_response() method to CallbackContext for retrieving
auth credentials from session state
- Update CredentialManager to accept CallbackContext instead of
requiring ToolContext
When a toolset needs authentication but credentials are not available, the flow yields an adk_request_credential event and interrupts the invocation, allowing the user to complete the OAuth flow before retrying.
Co-authored-by: Xiang (Sean) Zhou <seanzhougoogle@google.com>
PiperOrigin-RevId: 863543036
…nd others
Update existing toolsets to utilize the new toolset authentication framework. Key changes:
- McpToolset: Add _auth_config instance variable, _get_auth_headers()
method to build auth headers from exchanged credentials, and
get_auth_config() override. Auth headers are now included when
creating MCP sessions.
- OpenAPIToolset: Add _auth_config and get_auth_config() to expose
auth configuration to the framework.
- ApplicationIntegrationToolset: Add _auth_config and get_auth_config().
- APIHubToolset: Add _auth_config and get_auth_config().
When ADK resolves toolset auth before calling get_tools(), it populates exchanged_auth_credential on the auth_config. Toolsets can then use this credential when making authenticated requests.
Also update test fixtures in test_apihub_toolset.py to use real auth objects instead of mocks that fail pydantic validation.
Co-authored-by: Xiang (Sean) Zhou <seanzhougoogle@google.com>
PiperOrigin-RevId: 863764941
Problem: The test test_openapi_json_schema_accessible was failing because Pydantic couldn't generate a JSON schema for mcp.client.session.ClientSession, which is part of genai_types.ToolListUnion. Root Cause: The AgentDetails model in src/google/adk/evaluation/app_details.py:37 had tool_declarations: genai_types.ToolListUnion, and ToolListUnion includes mcp.client.session.ClientSession which doesn't have Pydantic core schema support. This model is used in the FastAPI app through EvalCase → Invocation → AppDetails → AgentDetails, causing OpenAPI schema generation to fail. Solution: Changed the type annotation from genai_types.ToolListUnion to list[Any] in two places: AgentDetails.tool_declarations _ToolDeclarations.tool_declarations This allows Pydantic to generate the OpenAPI schema while maintaining runtime compatibility (the field still accepts the same values). Co-authored-by: Xiang (Sean) Zhou <seanzhougoogle@google.com> PiperOrigin-RevId: 863765002
… tool listing Co-authored-by: Xiang (Sean) Zhou <seanzhougoogle@google.com> PiperOrigin-RevId: 864133951
…ool from system instruction The list_skills method is not for model tool listing, but for giving the developer flexibility to load the skill name/description at runtime (from discussion in go/orcas-rfc-555) Co-authored-by: Kathy Wu <wukathy@google.com> PiperOrigin-RevId: 871406905
…uctions Co-authored-by: Xiang (Sean) Zhou <seanzhougoogle@google.com> PiperOrigin-RevId: 871410286
… call to get_default_persona_registry PiperOrigin-RevId: 871422993
``` ┌──────────────────────────────┬─────────────────┬───────────────────────────────────────────────┐ │ Feature │ First Available │ Used In │ ├──────────────────────────────┼─────────────────┼───────────────────────────────────────────────┤ │ SkipJsonSchema │ 2.1.0 │ evaluation/eval_metrics.py │ ├──────────────────────────────┼─────────────────┼───────────────────────────────────────────────┤ │ AliasChoices │ 2.1.0 │ models/gemma_llm.py │ ├──────────────────────────────┼─────────────────┼───────────────────────────────────────────────┤ │ SerializeAsAny │ 2.1.0 │ agents/workflow/workflow_graph.py │ ├──────────────────────────────┼─────────────────┼───────────────────────────────────────────────┤ │ Discriminator, Tag │ 2.5.0 │ agents/agent_config.py │ ├──────────────────────────────┼─────────────────┼───────────────────────────────────────────────┤ │ ser_json_bytes in ConfigDict │ 2.5.0 │ events/event.py, agents/live_request_queue.py │ ├──────────────────────────────┼─────────────────┼───────────────────────────────────────────────┤ │ Field(deprecated=True) │ 2.7.0 │ agents/run_config.py │ └──────────────────────────────┴─────────────────┴───────────────────────────────────────────────┘ ``` Co-authored-by: Wei Sun (Jack) <weisun@google.com> PiperOrigin-RevId: 871478269
… sample agent The `BigQueryToolConfig` now sets `max_query_result_rows=50` explicitly to showcase this particular configuration. PiperOrigin-RevId: 871709345
## Problem When performing authentication flows via `OAUTH2` or `OPEN_ID_CONNECT`, the native `OAuth2Token` response from identity providers, like Google OAuth, often includes an `id_token` alongside the `access_token` and `refresh_token`. [MCP Toolbox](https://googleapis.github.io/genai-toolbox/resources/authservices/google/) implements authentication through ID Tokens and [integrates with ADK](https://google.github.io/adk-docs/integrations/mcp-toolbox-for-databases/) to provide easy tools management for the end-users. However, the ADK's `update_credential_with_tokens` utility explicitly drops the `id_token`, preventing agents and tools from verifying user identity or extracting OIDC claims securely. Furthermore, the `OAuth2Auth` model does not have a designated field for `id_token`. ## Solution 1. Added an `id_token: Optional[str] = None` field to the `OAuth2Auth` pydantic model in `auth_credential.py`. 2. Updated `update_credential_with_tokens` in `oauth2_credential_util.py` to correctly extract and map `tokens.get("id_token")` into the `OAuth2Auth` credential object. 3. Updated the relevant unit tests to ensure `id_token` is asserted and preserved during credential updates. ### Testing Plan - I have added or updated unit tests for my change. - All unit tests pass locally. PiperOrigin-RevId: 871801313
…ommit sha in the branch * use last-release-sha to locate the previous release commit in main for CHANGELOG generating. * release tag can now use the commit sha in release branch Co-authored-by: Wei Sun (Jack) <weisun@google.com> PiperOrigin-RevId: 871909085
PiperOrigin-RevId: 872026960
Co-authored-by: Xiang (Sean) Zhou <seanzhougoogle@google.com> PiperOrigin-RevId: 872062719
The `add_memory` methods in `Context` and `BaseMemoryService` now accept `MemoryEntry` objects in addition to strings. The Vertex AI Memory Bank service implementation is updated to handle these new types Co-authored-by: George Weale <gweale@google.com> PiperOrigin-RevId: 872108561
Co-authored-by: George Weale <gweale@google.com> PiperOrigin-RevId: 872503435
This change allows `add_memory` to use the `memories.generate` API with `direct_memories_source` when `custom_metadata["enable_consolidation"]` is set to True. This enables server-side consolidation of the provided memories Co-authored-by: George Weale <gweale@google.com> PiperOrigin-RevId: 872554004
Co-authored-by: George Weale <gweale@google.com> PiperOrigin-RevId: 872948208
Merge #4171 **Problem:** The BigQuery ADK tools currently lack the ability to search for and discover BigQuery assets using the Dataplex Catalog. Users cannot leverage Dataplex's search capabilities within the ADK to find relevant data assets before querying them. **Solution:** This PR integrates a new search_catalog_tool into the BigQuery ADK. This tool utilizes the dataplex catalog client library to interact with the Dataplex API, allowing users to search the catalog. **Unit Tests:** - [x] I have added or updated unit tests for my change. - [x] All unit tests pass locally. Added the screenshots of the manual adk web UI tests - https://docs.google.com/document/d/1c_lMW7NYGKuLAvPFmSkLehbqySeNyXQIhzQlvo3ixmQ/edit?usp=sharing ### Checklist - [x] I have read the [CONTRIBUTING.md](https://github.com/google/adk-python/blob/main/CONTRIBUTING.md) document. - [x] I have performed a self-review of my own code. - [x] I have commented my code, particularly in hard-to-understand areas. - [x] I have added tests that prove my fix is effective or that my feature works. - [x] New and existing unit tests pass locally with my changes. - [x] I have manually tested my changes end-to-end. - [x] Any dependent changes have been merged and published in downstream modules. COPYBARA_INTEGRATE_REVIEW=#4171 from sahaajaaa:sahaajaaa-bq-adk 3dbbaa4 PiperOrigin-RevId: 872951141
Previously we resolved tools sequentially by awaiting _convert_tool_union_to_tools() in a loop -- reduce the latency by resolving tools concurrently. Co-authored-by: Kathy Wu <wukathy@google.com> PiperOrigin-RevId: 872979105
In live mode, when the model calls an unregistered tool, ADK now runs on_tool_error_callback before failing. If the callback returns a response, ADK emits that function response and continues; otherwise it keeps the old ValueError Co-authored-by: George Weale <gweale@google.com> PiperOrigin-RevId: 872996178
Co-authored-by: George Weale <gweale@google.com> PiperOrigin-RevId: 873000092
PiperOrigin-RevId: 873013637
PiperOrigin-RevId: 873049983
Co-authored-by: Liang Wu <wuliang@google.com> PiperOrigin-RevId: 873072872
Client library for the Agent Registry API that allows users to discover, look up, and connect to agents and MCP servers cataloged in the registry. Co-authored-by: Kathy Wu <wukathy@google.com> PiperOrigin-RevId: 873073675
Co-authored-by: George Weale <gweale@google.com> PiperOrigin-RevId: 873080640
Compact session events before LLM calls when token threshold is exceeded Co-authored-by: George Weale <gweale@google.com> PiperOrigin-RevId: 873095899
Co-authored-by: Xuan Yang <xygoogle@google.com> PiperOrigin-RevId: 873097395
…th LiteLLM 1.81+ Updates _model_response_to_chunk to better handle LiteLLM's streaming delta/message structure, including prioritizing delta when it contains meaningful content and preserving reasoning_content Close #4225 Co-authored-by: George Weale <gweale@google.com> PiperOrigin-RevId: 873097502
…n hierarchy fix to BigQuery Agent Analytics plugin This CL adds four enhancements to the BigQuery Agent Analytics plugin and fixes a span hierarchy corruption bug. - **Schema Auto-Upgrade:** Additive-only schema migration that automatically adds missing columns to existing BQ tables on startup. A `adk_schema_version` label on the table (starting at `"1"`, bumped with each schema change) makes the check idempotent — the diff runs at most once per version. Enabled by default (`auto_schema_upgrade=True`) because upgrades are additive-only and fail-safe. Pre-versioning tables (no label) are treated as outdated, diffed, and stamped. No previous schema versions need to be stored; the logic diffs actual columns against the current canonical schema. - **Tool Provenance:** Adds `tool_origin` to TOOL_* event content, distinguishing six origin types — `LOCAL` (FunctionTool), `MCP` (McpTool), `A2A` (AgentTool wrapping RemoteA2aAgent), `SUB_AGENT` (AgentTool), `TRANSFER_AGENT` (TransferToAgentTool), and `UNKNOWN` (fallback) — via `isinstance()` checks with lazy imports to avoid circular dependencies. - **HITL Tracing:** Emits dedicated HITL event types (`HITL_CONFIRMATION_REQUEST`, `HITL_CREDENTIAL_REQUEST`, `HITL_INPUT_REQUEST` + `_COMPLETED` variants) for human-in-the-loop interactions. Detection lives in `on_event_callback` (for synthetic `adk_request_*` FunctionCall events emitted by the framework) and `on_user_message_callback` (for `adk_request_*` FunctionResponse completions sent by the user), not in tool callbacks — because `adk_request_*` names are synthetic function calls that bypass `before_tool_callback`/`after_tool_callback` entirely. - **Span Hierarchy Fix (#4561):** Removes `context.attach()`/`context.detach()` calls from `TraceManager.push_span()`, `attach_current_span()`, and `pop_span()`. The plugin was injecting its spans into the shared OTel context, which corrupted the framework's span hierarchy when an external exporter (e.g. `opentelemetry-instrumentation-vertexai`) was active — causing `call_llm` to be re-parented under `llm_request` and parent spans to show shorter durations than children. The plugin now tracks span_id/parent_span_id via its internal contextvar stack without mutating ambient OTel context. Co-authored-by: Haiyuan Cao <haiyuan@google.com> PiperOrigin-RevId: 873114688
…d auto-injection Close gaps between ADK's Agent Skills implementation and the public Agent Skills spec (agentskills.io/specification): - Frontmatter: add field validators for name (kebab-case, max 64), description (non-empty, max 1024), compatibility (max 500); add allowed-tools alias; add extra='allow'; add populate_by_name - utils: extract _parse_skill_md helper; use model_validate() for alias support; enforce name-dir matching; add validate_skill_dir() and read_skill_properties() - prompt: accept Union[Frontmatter, Skill]; - skill_toolset: add scripts/ resource loading; auto-inject system instruction (with inject_instruction opt-out); duplicate name check; _list_skills() returns Skill objects - sample agent: remove manual instruction (auto-injected now) Co-authored-by: Haiyuan Cao <haiyuan@google.com> PiperOrigin-RevId: 873177060
The default table ID for the BigQueryAgentAnalyticsPlugin is changed from "agent_events_v2" to "agent_events". The class docstring is also updated to remove the "v2.0" reference. Co-authored-by: Haiyuan Cao <haiyuan@google.com> PiperOrigin-RevId: 873485931
This change introduces an interceptor mechanism allowing custom logic to be executed before agent runs, after each event, and after the agent run completes. New dependencies are added to support these features. PiperOrigin-RevId: 873952199
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Please ensure you have read the contribution guide before creating a pull request.
Link to Issue or Description of Change
1. Link to an existing issue (if applicable):
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:
Please include a summary of passed
pytestresults.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
Additional context
Add any other context or screenshots about the feature request here.