From ad8cc3ed5822f4717380971ffc7cbd2bf81140bf Mon Sep 17 00:00:00 2001 From: shanchunhua Date: Tue, 13 Oct 2026 11:40:18 +0800 Subject: [PATCH 1/3] fix(deps): support google adk 2.7 baseline --- ...10-12-google-adk-opentelemetry-baseline.md | 119 ++++++++++++++++++ ...12-google-adk-opentelemetry-baseline.zh.md | 119 ++++++++++++++++++ pyproject.toml | 12 +- .../README.md | 59 +++++++++ .../README.zh.md | 59 +++++++++ tests/cli/test_frontend_sandbox.py | 12 +- tests/cli/test_studio_startup_imports.py | 7 +- .../extensions/harness/test_sidecar_wheel.py | 3 +- .../test_runtime_dependency_compatibility.py | 60 +++++++++ uv.lock | 107 +++++++++------- veadk/utils/patches.py | 12 +- 11 files changed, 514 insertions(+), 55 deletions(-) create mode 100644 prd-spec/bugfixes/runtime-dependency-compatibility/2026-10-12-google-adk-opentelemetry-baseline.md create mode 100644 prd-spec/bugfixes/runtime-dependency-compatibility/2026-10-12-google-adk-opentelemetry-baseline.zh.md create mode 100644 specs/runtime-dependency-compatibility/README.md create mode 100644 specs/runtime-dependency-compatibility/README.zh.md create mode 100644 tests/test_runtime_dependency_compatibility.py diff --git a/prd-spec/bugfixes/runtime-dependency-compatibility/2026-10-12-google-adk-opentelemetry-baseline.md b/prd-spec/bugfixes/runtime-dependency-compatibility/2026-10-12-google-adk-opentelemetry-baseline.md new file mode 100644 index 000000000..70b6ba485 --- /dev/null +++ b/prd-spec/bugfixes/runtime-dependency-compatibility/2026-10-12-google-adk-opentelemetry-baseline.md @@ -0,0 +1,119 @@ +# Align package dependency metadata for Google ADK and OpenTelemetry + +[中文版](2026-10-12-google-adk-opentelemetry-baseline.zh.md) + +- Change ID: `runtime-dependency-compatibility` +- Created/revised: 2026-10-13 +- Status: implemented +- Related component spec: [Runtime dependency compatibility](../../../specs/runtime-dependency-compatibility/README.md) +- Scope: main package dependency metadata, the main development lock, metadata regression tests, and minimal ADK 2.7 build-graph/Studio compatibility coverage. Studio, sandbox, generated project, managed sidecar, and Docker dependency declarations are intentionally out of scope. + +## Background and evidence + +Two upstream Google ADK commits fix session event timestamp determinism and UTC storage/filtering: + +- `4ca975eb9acd30a64b2c8615a93d31dada63052c`: `fix(sessions): make event reads deterministic and timezone-correct` +- `1b8ed3d9c0b125852df1902dd32b65bcab63ce1d`: `fix(sessions): store and filter event timestamps in UTC` + +Those fixes are available in Google ADK `2.7.0` and later. The local VeADK lock previously selected Google ADK `2.2.0`. + +The confirmed resolver blockers were: + +- AgentKit SDK's old OpenTelemetry upper bounds. They were fixed by publishing `agentkit-sdk-python==0.8.9`. +- VeADK's direct `opentelemetry-exporter-otlp==1.37.0` exact pin. + +Fresh resolver evidence on 2026-10-13 showed that an unconstrained `google-adk>=2.7.0` selects `google-adk==2.11.0`. The targeted compatibility suite failed on that line because ADK 2.11 removed or changed internals VeADK still patches, including `google.adk.flows.llm_flows.functions.__call_tool_async`, and piagent tool execution then saw a missing `run_config` on the test invocation context. This PR therefore supports the current 2.7 compatibility window as `google-adk>=2.7.0,<2.8.0`. + +## Goals + +- Raise VeADK's Google ADK requirement to `google-adk>=2.7.0,<2.8.0` so the UTC session timestamp fixes are available while avoiding known ADK 2.8+ compatibility risk. +- Keep VeADK's AgentKit requirement flexible at `agentkit-sdk-python>=0.8.5` so new installs can resolve to `0.8.9` without forcing an exact pin. +- Keep VeADK's direct OpenTelemetry exporter flexible at `opentelemetry-exporter-otlp>=1.37.0`. +- Update the main development `uv.lock` to the current compatible resolution. +- Preserve ADK 2.7 build-graph and Studio lazy GenAI behavior covered by regression tests. + +## Non-goals + +- Do not change Studio, sandbox, generated project, managed sidecar, or Docker dependency declarations in this change. +- Do not pin VeADK to `agentkit-sdk-python==0.8.9`. +- Do not support ADK `2.8.0` or later in this PR; that requires a separate compatibility pass for changed ADK internals. +- Do not publish packages, Docker images, sandbox images, or Studio assets. + +## Requirements + +- `FR-1`: Package metadata must use `google-adk>=2.7.0,<2.8.0` for the base dependency and `google-adk[eval]>=2.7.0,<2.8.0` for the eval extra. +- `FR-2`: Package metadata must keep `agentkit-sdk-python>=0.8.5`. +- `FR-3`: Package metadata must use `opentelemetry-exporter-otlp>=1.37.0`, not an exact pin. +- `FR-4`: The main `uv.lock` metadata must reflect the updated package metadata and resolve Google ADK to a compatible 2.7.x release. +- `FR-5`: Regression tests must cover package metadata and lock metadata. +- `FR-6`: ADK build-graph serialization must continue to expose VeADK nested `sub_agents` under ADK 2.7.x. +- `FR-7`: Studio startup tests must continue to verify lazy GenAI model loading under ADK 2.7.x telemetry APIs. + +## Design and contract impact + +Update the published package dependency metadata and the main development lock: + +- `google-adk>=2.7.0,<2.8.0` +- `agentkit-sdk-python>=0.8.5` +- `opentelemetry-exporter-otlp>=1.37.0` + +`google-adk[eval]` uses the same `>=2.7.0,<2.8.0` window. The `harness-sidecar` optional dependency keeps the same AgentKit lower bound. + +The `google-adk<2.8.0` upper bound is deliberate. It prevents fresh installs from selecting currently unverified ADK 2.8+ releases after the targeted suite reproduced ADK 2.11 incompatibility. + +ADK 2.7's graph serializer skips Pydantic fields marked `exclude=True`; VeADK's `Agent.sub_agents` uses that flag. The build-graph compatibility patch therefore adds `sub_agents` from the live VeADK agent only when ADK's serialized result omits them. + +ADK 2.7 no longer exposes `_experimental_semconv.transformers` in the Studio test path. The test now falls back to `google.genai.models.t` while preserving the assertion that Studio defers the real GenAI models module until first use. + +No persistent state, security boundary, or public Python API changes are introduced. + +## Implementation tasks + +| Task | Requirements | Affected files | +| --- | --- | --- | +| `T-1` | `FR-1`, `FR-2`, `FR-3` | `pyproject.toml` | +| `T-2` | `FR-4` | `uv.lock` | +| `T-3` | `FR-5` | `tests/test_runtime_dependency_compatibility.py` | +| `T-4` | `FR-6` | `veadk/utils/patches.py`, `tests/cli/test_frontend_trace.py` | +| `T-5` | `FR-7` | `tests/cli/test_studio_startup_imports.py` | +| `T-6` | all | PRD/spec reconciliation and verification record | + +## Verification and acceptance + +| Requirement | Acceptance criterion | Result/evidence | +| --- | --- | --- | +| `FR-1` | Package metadata uses `google-adk>=2.7.0,<2.8.0` and `google-adk[eval]>=2.7.0,<2.8.0` | pass | +| `FR-2` | `agentkit-sdk-python>=0.8.5` remains in package metadata | pass | +| `FR-3` | `opentelemetry-exporter-otlp>=1.37.0` remains flexible | pass | +| `FR-4` | `uv.lock` metadata reflects the updated package metadata and resolves ADK 2.7.x | pass: lock resolves `google-adk==2.7.1` | +| `FR-5` | targeted dependency metadata tests pass | pass | +| `FR-6` | nested VeADK agents appear in ADK build-graph JSON | pass | +| `FR-7` | Studio lazy GenAI startup tests pass under ADK 2.7.x | pass | + +## Risks and open questions + +- Users with existing lock files or constraints can still remain on older dependency selections until they update those files. +- ADK `2.8.0` and later are intentionally excluded until VeADK adapts to upstream internal API changes. +- Studio, sandbox, generated project, managed sidecar, and Docker paths still have their existing dependency declarations and should be handled separately if product owners decide to update those surfaces. + +## Review and approval + +- User approved upgrading ADK directly in this PR on 2026-10-13 and asked to add an upper bound if higher ADK versions are incompatible. +- Direct design review (`review-spec` unavailable): scope, dependency bounds, lock behavior, ADK 2.7 compatibility, ADK 2.11 failure evidence, and bilingual equivalence reviewed. + +## Delivery record + +### Verification (2026-10-13, working diff) + +| Check | Result | +| --- | --- | +| PyPI version check for `google-adk` | pass: latest stable observed as `2.11.0`; unrestricted `>=2.7.0` would select a newer line | +| `uv lock --upgrade-package google-adk` with unrestricted `>=2.7.0` | fail for compatibility scope: resolved `google-adk==2.11.0`; targeted suite failed on ADK internal changes | +| `uv lock --upgrade-package google-adk` with `>=2.7.0,<2.8.0` | pass: resolved `google-adk==2.7.1` | +| `uv run --extra dev pytest -q tests/test_runtime_dependency_compatibility.py tests/extensions/harness/test_sidecar_wheel.py::test_wheel_metadata_keeps_sidecar_optional_and_sdk_constraints_aligned tests/cli/test_frontend_sandbox.py::test_snapshot_metadata_survives_older_sdk_and_scopes_cards tests/runtime/piagent/test_piagent_runtime.py::test_piagent_runtime_emits_canonical_bridge_tool_events tests/runtime/piagent/test_piagent_runtime.py::test_piagent_runtime_exposes_before_model_added_tools tests/test_adk_sync_tool_thread_pool_patch.py::test_run_code_uses_agent_thread_pool_when_configured tests/tools/builtin_tools/create_agent/test_create_agent_toolset.py::test_runner_transfers_from_create_agents_to_dynamic_sub_agent tests/cli/test_frontend_trace.py::test_build_graph_serializes_nested_veadk_agent_models tests/cli/test_studio_startup_imports.py::test_studio_fast_api_defers_genai_models_until_first_request tests/cli/test_studio_startup_imports.py::test_studio_deferred_genai_models_support_openapi_first_use` | pass: 11 passed | +| `uv run --extra dev pre-commit run --all-files` | pass | +| `git diff --check` | pass | +| `uv run --extra dev pytest -n 2 -m "not codex_smoke and not piagent_smoke"` | fail: 6913 passed, 55 skipped, 4 xfailed, 16 failed. The failed run included stale assertions fixed by this change and Codex runtime tests missing the optional `openai_codex` package under `--extra dev`. The Codex failure subset passed with `--extra codex`. | +| `uv run --extra dev --extra codex pytest -q` for the 10 failed Codex runtime tests | pass: 10 passed | + +This change is complete for the main package dependency and ADK 2.7 compatibility scope. Studio, sandbox, generated project, managed sidecar, and Docker dependency declarations are deferred. diff --git a/prd-spec/bugfixes/runtime-dependency-compatibility/2026-10-12-google-adk-opentelemetry-baseline.zh.md b/prd-spec/bugfixes/runtime-dependency-compatibility/2026-10-12-google-adk-opentelemetry-baseline.zh.md new file mode 100644 index 000000000..c4d5a82d5 --- /dev/null +++ b/prd-spec/bugfixes/runtime-dependency-compatibility/2026-10-12-google-adk-opentelemetry-baseline.zh.md @@ -0,0 +1,119 @@ +# 对齐 Google ADK 与 OpenTelemetry 的包依赖元数据 + +[English](2026-10-12-google-adk-opentelemetry-baseline.md) + +- 变更 ID:`runtime-dependency-compatibility` +- 创建/修订日期:2026-10-13 +- 状态:implemented +- 相关组件规格:[Runtime dependency compatibility](../../../specs/runtime-dependency-compatibility/README.zh.md) +- 范围:主包依赖元数据、主开发 lock、元数据回归测试,以及最小 ADK 2.7 build-graph/Studio 兼容覆盖。Studio、sandbox、生成项目、托管 sidecar 和 Docker 依赖声明有意不在本次范围内。 + +## 背景与证据 + +两个上游 Google ADK commit 修复了 session event 时间戳确定性以及 UTC 存储/过滤问题: + +- `4ca975eb9acd30a64b2c8615a93d31dada63052c`:`fix(sessions): make event reads deterministic and timezone-correct` +- `1b8ed3d9c0b125852df1902dd32b65bcab63ce1d`:`fix(sessions): store and filter event timestamps in UTC` + +这些修复从 Google ADK `2.7.0` 开始可用。VeADK 本地 lock 此前解析到 Google ADK `2.2.0`。 + +已确认的 resolver 阻塞点是: + +- AgentKit SDK 旧的 OpenTelemetry 上限;该问题已通过发布 `agentkit-sdk-python==0.8.9` 修复。 +- VeADK 直接声明的 `opentelemetry-exporter-otlp==1.37.0` 精确 pin。 + +2026-10-13 的全新 resolver 证据显示,不加上限的 `google-adk>=2.7.0` 会选择 `google-adk==2.11.0`。目标兼容测试在该版本线上失败,因为 ADK 2.11 移除或改变了 VeADK 仍在 patch 的内部入口,包括 `google.adk.flows.llm_flows.functions.__call_tool_async`;piagent 工具执行还会在测试 invocation context 上遇到缺失 `run_config` 的问题。因此本 PR 将当前支持窗口定义为 `google-adk>=2.7.0,<2.8.0`。 + +## 目标 + +- 将 VeADK 的 Google ADK 需求提升到 `google-adk>=2.7.0,<2.8.0`,确保包含 UTC session 时间戳修复,同时避开已知 ADK 2.8+ 兼容风险。 +- 保持 VeADK 的 AgentKit 需求为灵活的 `agentkit-sdk-python>=0.8.5`,使全新安装可以解析到 `0.8.9`,但不做精确 pin。 +- 保持 VeADK 直接的 OpenTelemetry exporter 依赖为灵活的 `opentelemetry-exporter-otlp>=1.37.0`。 +- 将主开发 `uv.lock` 更新到当前兼容解析。 +- 保持回归测试覆盖的 ADK 2.7 build-graph 与 Studio lazy GenAI 行为。 + +## 非目标 + +- 不在本次变更中修改 Studio、sandbox、生成项目、托管 sidecar 或 Docker 依赖声明。 +- 不把 VeADK pin 到 `agentkit-sdk-python==0.8.9`。 +- 不在本 PR 支持 ADK `2.8.0` 或更高版本;这需要单独适配已变化的 ADK 内部 API。 +- 不发布包、Docker 镜像、sandbox 镜像或 Studio 资产。 + +## 需求 + +- `FR-1`:基础依赖必须使用 `google-adk>=2.7.0,<2.8.0`,eval extra 必须使用 `google-adk[eval]>=2.7.0,<2.8.0`。 +- `FR-2`:包元数据必须保持 `agentkit-sdk-python>=0.8.5`。 +- `FR-3`:包元数据必须使用 `opentelemetry-exporter-otlp>=1.37.0`,而不是精确 pin。 +- `FR-4`:主 `uv.lock` 元数据必须反映更新后的包元数据,并将 Google ADK 解析到兼容的 2.7.x 版本。 +- `FR-5`:回归测试必须覆盖包元数据和 lock 元数据。 +- `FR-6`:ADK build-graph 序列化在 ADK 2.7.x 下必须继续暴露 VeADK 嵌套 `sub_agents`。 +- `FR-7`:Studio 启动测试必须继续验证 ADK 2.7.x telemetry API 下的 lazy GenAI model 加载。 + +## 设计与契约影响 + +更新发布包依赖元数据和主开发 lock: + +- `google-adk>=2.7.0,<2.8.0` +- `agentkit-sdk-python>=0.8.5` +- `opentelemetry-exporter-otlp>=1.37.0` + +`google-adk[eval]` 使用同样的 `>=2.7.0,<2.8.0` 窗口。`harness-sidecar` optional dependency 保持相同的 AgentKit 下限。 + +`google-adk<2.8.0` 上限是有意设置的。目标测试已复现 ADK 2.11 不兼容,因此该上限避免全新安装选择当前未验证的 ADK 2.8+ 版本。 + +ADK 2.7 的 graph serializer 会跳过 Pydantic 中标记 `exclude=True` 的字段;VeADK 的 `Agent.sub_agents` 使用了该标记。因此 build-graph 兼容 patch 只在 ADK 原生序列化结果缺失 `sub_agents` 时,从运行中的 VeADK agent 补回子 Agent。 + +ADK 2.7 在 Studio 测试路径中不再暴露 `_experimental_semconv.transformers`。测试现在 fallback 到 `google.genai.models.t`,同时保留“Studio 在首次真正使用前延迟加载真实 GenAI models 模块”的断言。 + +本次变更不引入持久化状态、安全边界或公开 Python API 变化。 + +## 实施任务 + +| 任务 | 需求 | 影响文件 | +| --- | --- | --- | +| `T-1` | `FR-1`, `FR-2`, `FR-3` | `pyproject.toml` | +| `T-2` | `FR-4` | `uv.lock` | +| `T-3` | `FR-5` | `tests/test_runtime_dependency_compatibility.py` | +| `T-4` | `FR-6` | `veadk/utils/patches.py`, `tests/cli/test_frontend_trace.py` | +| `T-5` | `FR-7` | `tests/cli/test_studio_startup_imports.py` | +| `T-6` | all | PRD/spec 对齐和验证记录 | + +## 验证与验收 + +| 需求 | 验收标准 | 结果/证据 | +| --- | --- | --- | +| `FR-1` | 包元数据使用 `google-adk>=2.7.0,<2.8.0` 和 `google-adk[eval]>=2.7.0,<2.8.0` | pass | +| `FR-2` | 包元数据保留 `agentkit-sdk-python>=0.8.5` | pass | +| `FR-3` | `opentelemetry-exporter-otlp>=1.37.0` 保持灵活 | pass | +| `FR-4` | `uv.lock` 元数据反映更新后的包元数据并解析 ADK 2.7.x | pass:lock 解析为 `google-adk==2.7.1` | +| `FR-5` | 目标依赖元数据测试通过 | pass | +| `FR-6` | 嵌套 VeADK agents 出现在 ADK build-graph JSON 中 | pass | +| `FR-7` | Studio lazy GenAI 启动测试在 ADK 2.7.x 下通过 | pass | + +## 风险与开放问题 + +- 已有 lock 文件或 constraints 的用户仍可能停留在旧依赖选择,直到他们更新这些文件。 +- ADK `2.8.0` 及更高版本被有意排除,直到 VeADK 适配上游内部 API 变化。 +- Studio、sandbox、生成项目、托管 sidecar 和 Docker 路径仍保留现有依赖声明;如果产品负责人决定更新这些表面,应另行处理。 + +## 评审与批准 + +- 用户在 2026-10-13 明确批准在此 PR 中直接升级 ADK,并要求如果更高 ADK 版本存在不兼容就设置上限。 +- 直接设计评审(`review-spec` 不可用):已评审范围、依赖边界、lock 行为、ADK 2.7 兼容性、ADK 2.11 失败证据和中英文等价性。 + +## 交付记录 + +### 验证(2026-10-13,working diff) + +| 检查 | 结果 | +| --- | --- | +| `google-adk` PyPI 版本检查 | pass:观察到最新稳定版为 `2.11.0`;不设上限的 `>=2.7.0` 会选择更新版本线 | +| 在无限制 `>=2.7.0` 下运行 `uv lock --upgrade-package google-adk` | fail(针对兼容范围):解析为 `google-adk==2.11.0`;目标测试因 ADK 内部变化失败 | +| 在 `>=2.7.0,<2.8.0` 下运行 `uv lock --upgrade-package google-adk` | pass:解析为 `google-adk==2.7.1` | +| `uv run --extra dev pytest -q tests/test_runtime_dependency_compatibility.py tests/extensions/harness/test_sidecar_wheel.py::test_wheel_metadata_keeps_sidecar_optional_and_sdk_constraints_aligned tests/cli/test_frontend_sandbox.py::test_snapshot_metadata_survives_older_sdk_and_scopes_cards tests/runtime/piagent/test_piagent_runtime.py::test_piagent_runtime_emits_canonical_bridge_tool_events tests/runtime/piagent/test_piagent_runtime.py::test_piagent_runtime_exposes_before_model_added_tools tests/test_adk_sync_tool_thread_pool_patch.py::test_run_code_uses_agent_thread_pool_when_configured tests/tools/builtin_tools/create_agent/test_create_agent_toolset.py::test_runner_transfers_from_create_agents_to_dynamic_sub_agent tests/cli/test_frontend_trace.py::test_build_graph_serializes_nested_veadk_agent_models tests/cli/test_studio_startup_imports.py::test_studio_fast_api_defers_genai_models_until_first_request tests/cli/test_studio_startup_imports.py::test_studio_deferred_genai_models_support_openapi_first_use` | pass:11 passed | +| `uv run --extra dev pre-commit run --all-files` | pass | +| `git diff --check` | pass | +| `uv run --extra dev pytest -n 2 -m "not codex_smoke and not piagent_smoke"` | fail:6913 passed,55 skipped,4 xfailed,16 failed。该失败运行包含已在本变更中修复的旧断言,以及在 `--extra dev` 下缺少 optional `openai_codex` 包的 Codex runtime 测试。Codex 失败子集在 `--extra codex` 下通过。 | +| 对 10 个失败的 Codex runtime 测试运行 `uv run --extra dev --extra codex pytest -q` | pass:10 passed | + +本次变更已完成主包依赖和 ADK 2.7 兼容范围。Studio、sandbox、生成项目、托管 sidecar 和 Docker 依赖声明延后处理。 diff --git a/pyproject.toml b/pyproject.toml index ca58dfb44..a4e64a995 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -20,11 +20,11 @@ dependencies = [ "pydantic-settings==2.10.1", # Config management "a2a-sdk>=0.3.7,<1.0.0", # For Google Agent2Agent protocol "deprecated==1.2.18", - "google-adk>=1.34.0", # For basic agent architecture + "google-adk>=2.7.0,<2.8.0", # For basic agent architecture # litellm and sqlalchemy are required by code paths veadk always uses # (LiteLlm models, sessions). google-adk ships them in base on 1.x but moved # them behind extras ([extensions]/[db]) on 2.x, so declare them directly to - # stay compatible across google-adk >= 1.34.0 (including 2.x). + # stay compatible across google-adk >= 2.7.0,<2.8.0. "litellm>=1.83.7,<=1.83.14", # google-adk LiteLlm model ([extensions] on 2.x) # The `asyncio` extra is what pulls greenlet, which SQLAlchemy's async # engine requires and which ADK's DatabaseSessionService therefore needs. @@ -33,7 +33,7 @@ dependencies = [ # required" on the first session write to sqlite/mysql/postgres. CI never # saw it: ubuntu-latest is x86_64, where the marker matches. "sqlalchemy[asyncio]>=2,<3", # google-adk sessions ([db] on 2.x) - "opentelemetry-exporter-otlp==1.37.0", + "opentelemetry-exporter-otlp>=1.37.0", "opentelemetry-instrumentation-logging>=0.56b0", "wrapt==1.17.2", # For patching built-in functions "volcengine-python-sdk>=5.0.36", # For Volcengine API and Ark Responses context management @@ -41,7 +41,7 @@ dependencies = [ "agent-pilot-sdk==0.1.2", # Prompt optimization by Volcengine AgentPilot/PromptPilot toolkits "fastmcp>=2.12.3", # For running MCP "trustedmcp==0.0.5", # For running TrustedMCP - "mcp==1.26.0", # Bumped to satisfy google-adk 1.34.0 requirement + "mcp==1.26.0", # Bumped to satisfy google-adk requirement "cookiecutter==2.6.0", # For cloud deploy "omegaconf==2.3.0", # For agent builder "psycopg2-binary>=2.9.10", # For PostgreSQL database (short term memory) @@ -113,13 +113,13 @@ pdf = [] # Backward-compatible alias; PDF support is now installed by default eval = [ "prometheus-client>=0.22.1", # For exporting data to Prometheus pushgateway "deepeval>=3.2.6", # For DeepEval-based evaluation - "google-adk[eval]>=1.34.0", # For Google ADK-based evaluation + "google-adk[eval]>=2.7.0,<2.8.0", # For Google ADK-based evaluation ] harness = [ "headroom", ] harness-sidecar = [ - "agentkit-sdk-python>=0.8.1,<0.9.0", + "agentkit-sdk-python>=0.8.5", ] cli = [] sandbox = [ diff --git a/specs/runtime-dependency-compatibility/README.md b/specs/runtime-dependency-compatibility/README.md new file mode 100644 index 000000000..378673ae4 --- /dev/null +++ b/specs/runtime-dependency-compatibility/README.md @@ -0,0 +1,59 @@ +# Runtime Dependency Compatibility + +[中文版](README.zh.md) + +- **Component ID:** `runtime-dependency-compatibility` +- **Status:** draft; implemented changes are governed by the related PRD +- **Revision:** 2026-10-13 +- **Related PRD:** [Align package dependency metadata for Google ADK and OpenTelemetry](../../prd-spec/bugfixes/runtime-dependency-compatibility/2026-10-12-google-adk-opentelemetry-baseline.md) +- **Owned code:** `pyproject.toml`, `uv.lock`, package-metadata regression tests, and narrow ADK compatibility patches covered by the related PRD. +- **Dependent upstream:** `google-adk`, `agentkit-sdk-python`, and OpenTelemetry Python packages. + +## Responsibility and non-goals + +This component owns VeADK's published Python package dependency metadata and the main development lock for the Google ADK, AgentKit SDK, and OpenTelemetry compatibility line. + +It does not own Studio, sandbox, generated project, managed sidecar, or Docker dependency declarations in this scoped change. Those surfaces may have their own rollout constraints and should be updated separately if needed. + +## Entry points and dependencies + +- Package metadata: `pyproject.toml`. +- Development lock: `uv.lock`. +- Regression coverage: tests that assert package metadata, lock metadata, and the ADK 2.7 compatibility paths named in the related PRD. +- External dependency owners: Google ADK, AgentKit SDK, and OpenTelemetry Python. + +## Contract + +- `CON-1`: VeADK package metadata MUST use a verified Google ADK compatibility window. For the 2026-10-13 baseline, that range is `google-adk>=2.7.0,<2.8.0`. +- `CON-2`: VeADK package metadata MUST NOT exact-pin the OpenTelemetry exporter to `1.37.0`. For the 2026-10-13 baseline, it is `opentelemetry-exporter-otlp>=1.37.0`. +- `CON-3`: VeADK package metadata MUST keep AgentKit flexible enough for fresh installs to resolve to the latest compatible AgentKit SDK. For the 2026-10-13 baseline, it is `agentkit-sdk-python>=0.8.5`. +- `CON-4`: The main `uv.lock` is a development resolver output. It SHOULD be regenerated after package metadata changes when referenced package versions are available. +- `CON-5`: Regression tests MUST check package metadata, lock metadata, and the ADK 2.7 compatibility paths affected by this change. + +## Data and configuration + +The source of truth for VeADK package dependencies is `pyproject.toml`. `uv.lock` records a concrete development resolution and does not directly constrain normal `pip install veadk-python` consumers. + +## Security and isolation + +This component must not include credentials, signed URLs, production logs, or personal data in dependency evidence. Dependency resolution may access public package indexes during verification; live cloud/provider operations are outside this contract. + +## Compatibility and evolution + +Changing dependency lower bounds, upper bounds, or exact pins requires a bugfix or feature PRD, resolver evidence, and affected package metadata tests. ADK `2.8.0` and later are outside the current verified window because targeted tests reproduced incompatibility on ADK `2.11.0`. Generated projects, Studio, sandbox, managed sidecar, and Docker dependency changes are outside this scoped contract and should be handled by their owning surfaces. + +## Observability and failures + +Failures surface as resolver errors, package metadata regressions, or lock metadata regressions. They should be reported explicitly with the package and constraint that caused the conflict. + +## Verification + +| Contract | Validation | +| --- | --- | +| `CON-1`, `CON-2`, `CON-3` | Package metadata regression test | +| `CON-4` | `uv lock` | +| `CON-5` | Lock metadata regression test and targeted ADK compatibility tests | + +## Change record + +- 2026-10-13: Scoped the component to main package metadata, the main development lock, and minimal ADK 2.7 compatibility coverage. Package metadata uses `google-adk>=2.7.0,<2.8.0`, keeps `agentkit-sdk-python>=0.8.5`, and keeps `opentelemetry-exporter-otlp>=1.37.0`. diff --git a/specs/runtime-dependency-compatibility/README.zh.md b/specs/runtime-dependency-compatibility/README.zh.md new file mode 100644 index 000000000..f2bfa2470 --- /dev/null +++ b/specs/runtime-dependency-compatibility/README.zh.md @@ -0,0 +1,59 @@ +# 运行时依赖兼容性 + +[English](README.md) + +- **Component ID:** `runtime-dependency-compatibility` +- **状态:** draft;已实现变更由相关 PRD 管理 +- **修订日期:** 2026-10-13 +- **相关 PRD:** [Align package dependency metadata for Google ADK and OpenTelemetry](../../prd-spec/bugfixes/runtime-dependency-compatibility/2026-10-12-google-adk-opentelemetry-baseline.zh.md) +- **拥有代码:** `pyproject.toml`、`uv.lock`、包元数据回归测试,以及相关 PRD 覆盖的窄范围 ADK 兼容 patch。 +- **依赖上游:** `google-adk`、`agentkit-sdk-python` 和 OpenTelemetry Python 包。 + +## 职责和非目标 + +本组件负责维护 VeADK 发布 Python 包依赖元数据,以及 Google ADK、AgentKit SDK 和 OpenTelemetry 兼容线对应的主开发 lock。 + +本次收窄变更不负责 Studio、sandbox、生成项目、managed sidecar 或 Docker 的依赖声明。这些入口可能有各自的发布和回滚约束,如需更新应单独处理。 + +## 入口点和依赖 + +- 包元数据:`pyproject.toml`。 +- 开发 lock:`uv.lock`。 +- 回归覆盖:断言包元数据、lock 元数据以及相关 PRD 指定的 ADK 2.7 兼容路径的测试。 +- 外部依赖所有者:Google ADK、AgentKit SDK 和 OpenTelemetry Python。 + +## 契约 + +- `CON-1`:VeADK 包元数据必须使用已验证的 Google ADK 兼容窗口。对于 2026-10-13 基线,该范围是 `google-adk>=2.7.0,<2.8.0`。 +- `CON-2`:VeADK 包元数据不得把 OpenTelemetry exporter 精确 pin 到 `1.37.0`。对于 2026-10-13 基线,该范围是 `opentelemetry-exporter-otlp>=1.37.0`。 +- `CON-3`:VeADK 包元数据必须保持 AgentKit 足够灵活,使全新安装可以解析到最新兼容 AgentKit SDK。对于 2026-10-13 基线,该范围是 `agentkit-sdk-python>=0.8.5`。 +- `CON-4`:主 `uv.lock` 是开发 resolver 输出。包元数据变更后,若引用的包版本可获取,应重新生成。 +- `CON-5`:回归测试必须检查包元数据、lock 元数据以及本次变更影响的 ADK 2.7 兼容路径。 + +## 数据和配置 + +VeADK 包依赖的事实来源是 `pyproject.toml`。`uv.lock` 记录一个具体开发解析结果,不会直接约束普通 `pip install veadk-python` 用户。 + +## 安全和隔离 + +本组件不得在依赖证据中包含凭据、签名 URL、生产日志或个人数据。验证时依赖解析可以访问公开包索引;真实云/服务商操作不在本契约范围内。 + +## 兼容性和演进 + +修改依赖下限、上限或精确 pin 需要 bugfix 或 feature PRD、resolver 证据和受影响包元数据测试。ADK `2.8.0` 及更高版本不在当前已验证窗口内,因为目标测试已在 ADK `2.11.0` 复现不兼容。生成项目、Studio、sandbox、managed sidecar 和 Docker 的依赖变更不在本次收窄契约内,应由其所属入口单独处理。 + +## 可观测性和失败 + +失败表现为 resolver 错误、包元数据回退或 lock 元数据回退。报告时应明确冲突的包和约束。 + +## 验证 + +| 契约 | 验证 | +| --- | --- | +| `CON-1`, `CON-2`, `CON-3` | 包元数据回归测试 | +| `CON-4` | `uv lock` | +| `CON-5` | lock 元数据回归测试和目标 ADK 兼容测试 | + +## 变更记录 + +- 2026-10-13:将组件范围收窄到主包元数据、主开发 lock 和最小 ADK 2.7 兼容覆盖。包元数据使用 `google-adk>=2.7.0,<2.8.0`,保持 `agentkit-sdk-python>=0.8.5`,并保持 `opentelemetry-exporter-otlp>=1.37.0`。 diff --git a/tests/cli/test_frontend_sandbox.py b/tests/cli/test_frontend_sandbox.py index adfbd15aa..34dfa98d1 100644 --- a/tests/cli/test_frontend_sandbox.py +++ b/tests/cli/test_frontend_sandbox.py @@ -4523,7 +4523,17 @@ def delete_session(self, request: object) -> None: @pytest.mark.asyncio -async def test_snapshot_metadata_survives_older_sdk_and_scopes_cards() -> None: +async def test_snapshot_metadata_survives_older_sdk_and_scopes_cards( + monkeypatch: pytest.MonkeyPatch, +) -> None: + from veadk.cli import agentkit_session_metadata + + monkeypatch.setattr( + agentkit_session_metadata, + "_model_supports_alias", + lambda _model, _alias: False, + ) + class Client: def _invoke_api(self, *, api_action, request, response_type): assert api_action == "ListSessionSnapshots" diff --git a/tests/cli/test_studio_startup_imports.py b/tests/cli/test_studio_startup_imports.py index 15107db79..1bd44841c 100644 --- a/tests/cli/test_studio_startup_imports.py +++ b/tests/cli/test_studio_startup_imports.py @@ -1057,7 +1057,12 @@ def sample_tool(value: str) -> str: tracing._instrumented_with_opentelemetry_instrumentation_google_genai(), bool, ) - transformed = _experimental_semconv.transformers.t_contents("hello") + transformers = getattr(_experimental_semconv, "transformers", None) + if transformers is None: + from google.genai import models as genai_models_module + + transformers = genai_models_module.t + transformed = transformers.t_contents("hello") assert transformed[0].parts[0].text == "hello" if not real_models_module_loaded(): raise SystemExit("Google GenAI client not loaded for real telemetry use") diff --git a/tests/extensions/harness/test_sidecar_wheel.py b/tests/extensions/harness/test_sidecar_wheel.py index 9953ebe3d..915c3ead4 100644 --- a/tests/extensions/harness/test_sidecar_wheel.py +++ b/tests/extensions/harness/test_sidecar_wheel.py @@ -119,8 +119,7 @@ def test_wheel_metadata_keeps_sidecar_optional_and_sdk_constraints_aligned( if item.marker is not None and "harness-sidecar" in str(item.marker) ] assert len(sidecar_extra) == 1 - assert ">=0.8.1" in str(sidecar_extra[0].specifier) - assert "<0.9.0" in str(sidecar_extra[0].specifier) + assert ">=0.8.5" in str(sidecar_extra[0].specifier) forbidden = { "agentkit-harness-sidecar-integration", diff --git a/tests/test_runtime_dependency_compatibility.py b/tests/test_runtime_dependency_compatibility.py new file mode 100644 index 000000000..6d1f2945d --- /dev/null +++ b/tests/test_runtime_dependency_compatibility.py @@ -0,0 +1,60 @@ +# Copyright (c) 2026 Beijing Volcano Engine Technology Co., Ltd. and/or its affiliates. +# +# 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 + +try: + import tomllib +except ModuleNotFoundError: # pragma: no cover - exercised on Python 3.10. + import tomli as tomllib +from pathlib import Path + + +ROOT = Path(__file__).resolve().parents[1] +GOOGLE_ADK_BASELINE = "google-adk>=2.7.0,<2.8.0" +GOOGLE_ADK_EVAL_BASELINE = "google-adk[eval]>=2.7.0,<2.8.0" +AGENTKIT_BASELINE = "agentkit-sdk-python>=0.8.5" +OPENTELEMETRY_EXPORTER_BASELINE = "opentelemetry-exporter-otlp>=1.37.0" + + +def _pyproject() -> dict[str, object]: + return tomllib.loads((ROOT / "pyproject.toml").read_text(encoding="utf-8")) + + +def test_project_dependency_metadata_uses_runtime_compatibility_baseline() -> None: + pyproject = _pyproject() + dependencies = pyproject["project"]["dependencies"] + optional = pyproject["project"]["optional-dependencies"] + + assert GOOGLE_ADK_BASELINE in dependencies + assert OPENTELEMETRY_EXPORTER_BASELINE in dependencies + assert AGENTKIT_BASELINE in dependencies + assert GOOGLE_ADK_EVAL_BASELINE in optional["eval"] + assert AGENTKIT_BASELINE in optional["harness-sidecar"] + + +def test_lock_metadata_matches_project_dependency_baseline() -> None: + lock = (ROOT / "uv.lock").read_text(encoding="utf-8") + + assert '{ name = "agentkit-sdk-python", specifier = ">=0.8.5" }' in lock + assert ( + '{ name = "agentkit-sdk-python", marker = "extra == ' + '\'harness-sidecar\'", specifier = ">=0.8.5" }' + ) in lock + assert '{ name = "google-adk", specifier = ">=2.7.0,<2.8.0" }' in lock + assert ( + '{ name = "google-adk", extras = ["eval"], marker = "extra == ' + '\'eval\'", specifier = ">=2.7.0,<2.8.0" }' + ) in lock + assert '{ name = "opentelemetry-exporter-otlp", specifier = ">=1.37.0" }' in lock diff --git a/uv.lock b/uv.lock index 757e83711..3540d671d 100644 --- a/uv.lock +++ b/uv.lock @@ -75,7 +75,7 @@ wheels = [ [[package]] name = "agentkit-sdk-python" -version = "0.8.5" +version = "0.8.9" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "a2a-sdk" }, @@ -104,9 +104,9 @@ dependencies = [ { name = "volcengine" }, { name = "websocket-client" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/af/f4/329578ae11985752877deb7d171b9bb0ddc24ee4bc1eccf6aaae368f1391/agentkit_sdk_python-0.8.5.tar.gz", hash = "sha256:9352face74e62b8d8fd9a89898e0858b04e31ea408d76cc422b81f974ee313b2", size = 601628, upload-time = "2026-08-28T08:05:10.915Z" } +sdist = { url = "https://files.pythonhosted.org/packages/24/1e/e6fef2ff0a54fc8cb854e48b4dd82ee27a7aa5570ca5cb1b15716746f500/agentkit_sdk_python-0.8.9.tar.gz", hash = "sha256:226d868f340b77d3c0113c57a7c55c83a8719d5e13195ef939d12bd810905af5", size = 610207, upload-time = "2026-10-13T02:34:30.875Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f6/a0/40470fbd86532c5d9b1b38d94652cb6d1e60f7c7302f61ed0a4dd7bf5135/agentkit_sdk_python-0.8.5-py3-none-any.whl", hash = "sha256:9b8f8666a60f8f7aaabdffedba69e65259d04dcd916551972a552afcc26be30d", size = 809707, upload-time = "2026-08-28T08:05:09.415Z" }, + { url = "https://files.pythonhosted.org/packages/60/93/2417a81bf1a23a938594c99072ae178dbf5fd568e749cb8419b4a85228fa/agentkit_sdk_python-0.8.9-py3-none-any.whl", hash = "sha256:5bf428303615da6c730c6e84f2e4d3de1dd2accab554301a457ab307ed7c5c4f", size = 818571, upload-time = "2026-10-13T02:34:28.96Z" }, ] [[package]] @@ -1503,9 +1503,10 @@ wheels = [ [[package]] name = "google-adk" -version = "2.2.0" +version = "2.7.1" source = { registry = "https://pypi.org/simple" } dependencies = [ + { name = "aiohttp" }, { name = "aiosqlite" }, { name = "authlib" }, { name = "click" }, @@ -1531,16 +1532,18 @@ dependencies = [ { name = "watchdog" }, { name = "websockets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/4a/65/3ff3f50b10dac3323ddecd694515e9f9ed345886e0eaf666d0e42c90748b/google_adk-2.2.0.tar.gz", hash = "sha256:04cb6318aba8829fe7c941ee1b456ccb4745253898c13595708c9eb07b4582ff", size = 3391545, upload-time = "2026-06-04T22:15:12.9Z" } +sdist = { url = "https://files.pythonhosted.org/packages/02/55/63336b5cd9679a32b36cb14971a7461811db20126bb63cb092fe653b8d54/google_adk-2.7.1.tar.gz", hash = "sha256:0485bfba1a04960a3784eb67531491475be1a3f8acefcc5c880a906857ecb3e2", size = 3806947, upload-time = "2026-08-17T18:33:11.841Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/64/f5/44a3b20b17bac130497f2d1dde8b93c90cfc026983cd94f24488d540ea70/google_adk-2.2.0-py3-none-any.whl", hash = "sha256:ebdf3d931dc2b9c5b30d995358fc2ae99d59594c48a4aaf7496869ccd2c5f245", size = 3912613, upload-time = "2026-06-04T22:15:15.411Z" }, + { url = "https://files.pythonhosted.org/packages/a4/ed/6b3da8b43525d9b28a95836abb1042abc26fe1e8be9f63eb01c18b70d4d4/google_adk-2.7.1-py3-none-any.whl", hash = "sha256:cd21e37c9846a80086fd880924aa5548e625ef85178122b40cda81ef5316129f", size = 4396591, upload-time = "2026-08-17T18:33:09.596Z" }, ] [package.optional-dependencies] eval = [ { name = "gepa" }, { name = "google-cloud-aiplatform", extra = ["evaluation"] }, + { name = "google-cloud-texttospeech" }, { name = "jinja2" }, + { name = "nltk" }, { name = "pandas", version = "2.3.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "pandas", version = "3.0.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "rouge-score" }, @@ -1592,7 +1595,7 @@ requests = [ [[package]] name = "google-cloud-aiplatform" -version = "2.1.0" +version = "1.165.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "certifi" }, @@ -1609,9 +1612,9 @@ dependencies = [ { name = "pydantic" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6f/cc/0c562f5d268f07234e712ee8822dd81ec4c836559f449d9e5e91e9aa2025/google_cloud_aiplatform-2.1.0.tar.gz", hash = "sha256:964eca160d4af48a2e04b5ee476fb4d38c84388f23b4420e2c71b30151d625bd", size = 11331982, upload-time = "2026-09-01T19:11:15.526Z" } +sdist = { url = "https://files.pythonhosted.org/packages/13/19/45df8264bf80dcc133c777822390c503aa75b878a57e9286d6f520b08c87/google_cloud_aiplatform-1.165.1.tar.gz", hash = "sha256:bd62ba7590255cacd66f9d0439eb731060af460d35bb48dbbeeefce9dfc0a359", size = 11325730, upload-time = "2026-08-19T21:12:30.858Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c2/26/10f3d4ab6333672ff43ad56255b74e672c2a59b21b7a054632d05b7dd677/google_cloud_aiplatform-2.1.0-py2.py3-none-any.whl", hash = "sha256:de5c6dace6cb81943fc6ee1fad02f7a02e9b18e50c24b267bd9627f6b9cd3d14", size = 9452898, upload-time = "2026-09-01T19:11:08.19Z" }, + { url = "https://files.pythonhosted.org/packages/b4/66/08c325e817a2713f23a028badc72220fc4b80521e999211ad9d935176446/google_cloud_aiplatform-1.165.1-py2.py3-none-any.whl", hash = "sha256:93874bd7993d1d901291595df693a8b9d4d7c89b93d4f41f8664d73f088dec89", size = 9456088, upload-time = "2026-08-19T21:12:26.018Z" }, ] [package.optional-dependencies] @@ -1692,6 +1695,22 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/06/6f/d69f0e185e08ddb58c323a0a935af2b492907b5de362bc08933b0a3b5644/google_cloud_storage-3.13.1-py3-none-any.whl", hash = "sha256:98208de6c21e85cecd3eb44551894efff33d98365500e178867d4305854a770a", size = 341486, upload-time = "2026-08-06T06:23:36.548Z" }, ] +[[package]] +name = "google-cloud-texttospeech" +version = "2.38.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "google-api-core", extra = ["grpc"] }, + { name = "google-auth" }, + { name = "grpcio" }, + { name = "proto-plus" }, + { name = "protobuf" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a1/1b/1d0044f402f13dc7765f3a9f74eace951893bf2d440c28b41f6adc2dbf71/google_cloud_texttospeech-2.38.0.tar.gz", hash = "sha256:c9a50f609ae0ccd0465a91029333848011ba713fadf189bdd110ec07c3d22cc1", size = 191253, upload-time = "2026-10-01T18:18:32.568Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1f/92/a59d62405b3e4f8cbbb9dc6f7e3c81beda9585bb49dfbc02ae773de839ae/google_cloud_texttospeech-2.38.0-py3-none-any.whl", hash = "sha256:a9a4e5cf3b848c2c93e24e769b8acb11442c64a2fffff14a98be80379919bc5e", size = 198330, upload-time = "2026-10-01T18:12:45.443Z" }, +] + [[package]] name = "google-crc32c" version = "1.8.0" @@ -3347,45 +3366,44 @@ async = [ [[package]] name = "opentelemetry-api" -version = "1.37.0" +version = "1.42.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "importlib-metadata" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/63/04/05040d7ce33a907a2a02257e601992f0cdf11c73b33f13c4492bf6c3d6d5/opentelemetry_api-1.37.0.tar.gz", hash = "sha256:540735b120355bd5112738ea53621f8d5edb35ebcd6fe21ada3ab1c61d1cd9a7", size = 64923, upload-time = "2025-09-11T10:29:01.662Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b4/1c/125e1c936c0873796771b7f04f6c93b9f1bf5d424cea90fda94a99f61da8/opentelemetry_api-1.42.1.tar.gz", hash = "sha256:56c63bea9f77b62856be8c47600474acad853b2924b99b1687c4cb6297166716", size = 72296, upload-time = "2026-05-21T16:32:49.335Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/91/48/28ed9e55dcf2f453128df738210a980e09f4e468a456fa3c763dbc8be70a/opentelemetry_api-1.37.0-py3-none-any.whl", hash = "sha256:accf2024d3e89faec14302213bc39550ec0f4095d1cf5ca688e1bfb1c8612f47", size = 65732, upload-time = "2025-09-11T10:28:41.826Z" }, + { url = "https://files.pythonhosted.org/packages/a3/ca/9520cc1f3dfbbd03ac5903bbf55833e257bc64b1cf30fa8b0d6df374d821/opentelemetry_api-1.42.1-py3-none-any.whl", hash = "sha256:51a69edacadbc03a8950ace1c4c21099cacc538820ac2c9e36277e78cebba714", size = 61311, upload-time = "2026-05-21T16:32:28.822Z" }, ] [[package]] name = "opentelemetry-exporter-otlp" -version = "1.37.0" +version = "1.42.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-exporter-otlp-proto-grpc" }, { name = "opentelemetry-exporter-otlp-proto-http" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/64/df/47fde1de15a3d5ad410e98710fac60cd3d509df5dc7ec1359b71d6bf7e70/opentelemetry_exporter_otlp-1.37.0.tar.gz", hash = "sha256:f85b1929dd0d750751cc9159376fb05aa88bb7a08b6cdbf84edb0054d93e9f26", size = 6145, upload-time = "2025-09-11T10:29:03.075Z" } +sdist = { url = "https://files.pythonhosted.org/packages/08/94/8637919a5d01f81dacf510234bc0110b944f4687a6e96b0a02adf2f6bdce/opentelemetry_exporter_otlp-1.42.1.tar.gz", hash = "sha256:2d9ebaed714377a67d224d46795ddcc11d2c877fa5de35fda70b6f3b010729a9", size = 6086, upload-time = "2026-05-21T16:32:51.963Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f5/23/7e35e41111e3834d918e414eca41555d585e8860c9149507298bb3b9b061/opentelemetry_exporter_otlp-1.37.0-py3-none-any.whl", hash = "sha256:bd44592c6bc7fc3e5c0a9b60f2ee813c84c2800c449e59504ab93f356cc450fc", size = 7019, upload-time = "2025-09-11T10:28:44.094Z" }, + { url = "https://files.pythonhosted.org/packages/6c/4d/c26080295a36fd22e201fefd7cb9c22cd203189b1af8cd73b158382b7ad8/opentelemetry_exporter_otlp-1.42.1-py3-none-any.whl", hash = "sha256:aedd54545bb0587cd45210abdc8be545af9c01413f3307786e276df1e3c83bee", size = 6733, upload-time = "2026-05-21T16:32:31.261Z" }, ] [[package]] name = "opentelemetry-exporter-otlp-proto-common" -version = "1.37.0" +version = "1.42.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-proto" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/dc/6c/10018cbcc1e6fff23aac67d7fd977c3d692dbe5f9ef9bb4db5c1268726cc/opentelemetry_exporter_otlp_proto_common-1.37.0.tar.gz", hash = "sha256:c87a1bdd9f41fdc408d9cc9367bb53f8d2602829659f2b90be9f9d79d0bfe62c", size = 20430, upload-time = "2025-09-11T10:29:03.605Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0e/9c/216acfeaedadf2e1937f4373929b20f73197c5c4a2546d4f584b7fa63813/opentelemetry_exporter_otlp_proto_common-1.42.1.tar.gz", hash = "sha256:04f1f01fb597c4249dfcd7f8b861c902c2102369d376d9d346ff38de4469a2ee", size = 21433, upload-time = "2026-05-21T16:32:55.526Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/08/13/b4ef09837409a777f3c0af2a5b4ba9b7af34872bc43609dda0c209e4060d/opentelemetry_exporter_otlp_proto_common-1.37.0-py3-none-any.whl", hash = "sha256:53038428449c559b0c564b8d718df3314da387109c4d36bd1b94c9a641b0292e", size = 18359, upload-time = "2025-09-11T10:28:44.939Z" }, + { url = "https://files.pythonhosted.org/packages/d6/43/2375e7612e1121a4518c17603b6e0b03ad94f565aafad53f464dc5be2bf6/opentelemetry_exporter_otlp_proto_common-1.42.1-py3-none-any.whl", hash = "sha256:f48d395ab815b444da118868977e9798ea354c25737d5cf39578ae894011c140", size = 17327, upload-time = "2026-05-21T16:32:33.387Z" }, ] [[package]] name = "opentelemetry-exporter-otlp-proto-grpc" -version = "1.37.0" +version = "1.42.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "googleapis-common-protos" }, @@ -3396,14 +3414,14 @@ dependencies = [ { name = "opentelemetry-sdk" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d1/11/4ad0979d0bb13ae5a845214e97c8d42da43980034c30d6f72d8e0ebe580e/opentelemetry_exporter_otlp_proto_grpc-1.37.0.tar.gz", hash = "sha256:f55bcb9fc848ce05ad3dd954058bc7b126624d22c4d9e958da24d8537763bec5", size = 24465, upload-time = "2025-09-11T10:29:04.172Z" } +sdist = { url = "https://files.pythonhosted.org/packages/87/87/ca7fc790dfdbcf4f9e9aab14a39ef1b7508ead13707e283de0b3131478d2/opentelemetry_exporter_otlp_proto_grpc-1.42.1.tar.gz", hash = "sha256:975c4461f167dd8ed8857d68d3b6b25f3d272eab896f6a9470d0f5b90e2faf15", size = 27140, upload-time = "2026-05-21T16:32:56.162Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/39/17/46630b74751031a658706bef23ac99cdc2953cd3b2d28ec90590a0766b3e/opentelemetry_exporter_otlp_proto_grpc-1.37.0-py3-none-any.whl", hash = "sha256:aee5104835bf7993b7ddaaf380b6467472abaedb1f1dbfcc54a52a7d781a3890", size = 19305, upload-time = "2025-09-11T10:28:45.776Z" }, + { url = "https://files.pythonhosted.org/packages/89/2b/28ba5b128f47fe8c3bab541000d6feb4b5a9bd26623ca013406f01c0fb60/opentelemetry_exporter_otlp_proto_grpc-1.42.1-py3-none-any.whl", hash = "sha256:0ae1177e2038b18a929b3098215243631ef91136cba26b7e2b12790ceb7e87cc", size = 19617, upload-time = "2026-05-21T16:32:34.278Z" }, ] [[package]] name = "opentelemetry-exporter-otlp-proto-http" -version = "1.37.0" +version = "1.42.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "googleapis-common-protos" }, @@ -3414,14 +3432,14 @@ dependencies = [ { name = "requests" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5d/e3/6e320aeb24f951449e73867e53c55542bebbaf24faeee7623ef677d66736/opentelemetry_exporter_otlp_proto_http-1.37.0.tar.gz", hash = "sha256:e52e8600f1720d6de298419a802108a8f5afa63c96809ff83becb03f874e44ac", size = 17281, upload-time = "2025-09-11T10:29:04.844Z" } +sdist = { url = "https://files.pythonhosted.org/packages/77/32/826bfa1d80ecea24f47808de03cd4a0d13c17ecc07712f45123f0f61e4ac/opentelemetry_exporter_otlp_proto_http-1.42.1.tar.gz", hash = "sha256:bf142a21035d7571ac3a09cb2e5639f49886f243972883cfe777ed3bf02b734d", size = 25406, upload-time = "2026-05-21T16:32:56.807Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e9/e9/70d74a664d83976556cec395d6bfedd9b85ec1498b778367d5f93e373397/opentelemetry_exporter_otlp_proto_http-1.37.0-py3-none-any.whl", hash = "sha256:54c42b39945a6cc9d9a2a33decb876eabb9547e0dcb49df090122773447f1aef", size = 19576, upload-time = "2025-09-11T10:28:46.726Z" }, + { url = "https://files.pythonhosted.org/packages/d3/96/82cb223a1502f0787d4bbff12907f5f8d870a50731febcd5818d93ef9555/opentelemetry_exporter_otlp_proto_http-1.42.1-py3-none-any.whl", hash = "sha256:00a16da1b312a1d6c7233d600d557c91df71125af73020f3b9a7765bd699d59d", size = 21793, upload-time = "2026-05-21T16:32:35.277Z" }, ] [[package]] name = "opentelemetry-instrumentation" -version = "0.58b0" +version = "0.63b1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-api" }, @@ -3429,61 +3447,62 @@ dependencies = [ { name = "packaging" }, { name = "wrapt" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f6/36/7c307d9be8ce4ee7beb86d7f1d31027f2a6a89228240405a858d6e4d64f9/opentelemetry_instrumentation-0.58b0.tar.gz", hash = "sha256:df640f3ac715a3e05af145c18f527f4422c6ab6c467e40bd24d2ad75a00cb705", size = 31549, upload-time = "2025-09-11T11:42:14.084Z" } +sdist = { url = "https://files.pythonhosted.org/packages/da/6d/4de72d97ff54db1ed270c7a59c9b904b917c0ac7af429c086c388b824ddb/opentelemetry_instrumentation-0.63b1.tar.gz", hash = "sha256:32368d6ae52c8de20aa790a6ad86b10a76f09956092337ae37d675773990e541", size = 41081, upload-time = "2026-05-21T16:36:14.206Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d4/db/5ff1cd6c5ca1d12ecf1b73be16fbb2a8af2114ee46d4b0e6d4b23f4f4db7/opentelemetry_instrumentation-0.58b0-py3-none-any.whl", hash = "sha256:50f97ac03100676c9f7fc28197f8240c7290ca1baa12da8bfbb9a1de4f34cc45", size = 33019, upload-time = "2025-09-11T11:41:00.624Z" }, + { url = "https://files.pythonhosted.org/packages/35/a1/9314e621c143e4d82a5bf7a43c2ff7a745d31023506336857607c8c543cc/opentelemetry_instrumentation-0.63b1-py3-none-any.whl", hash = "sha256:f1986716d52cc316ea5f60189098726a9071d8ecc0eee96c9ed110be08bade9c", size = 35577, upload-time = "2026-05-21T16:34:56.818Z" }, ] [[package]] name = "opentelemetry-instrumentation-logging" -version = "0.58b0" +version = "0.63b1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-api" }, { name = "opentelemetry-instrumentation" }, + { name = "opentelemetry-semantic-conventions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e2/65/db3ce7a7eda7ae70338339baeb80894e283d24a0036a0021745e54a5b874/opentelemetry_instrumentation_logging-0.58b0.tar.gz", hash = "sha256:1475e531cf0e1c03e1c42995fcf312767edaadfe335d04d1d3b27c9a8c8c7049", size = 9969, upload-time = "2025-09-11T11:42:40.384Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d1/cf/119381b1ae446fb07921a452e3a8e1887aa87f9856225f9829958dc20063/opentelemetry_instrumentation_logging-0.63b1.tar.gz", hash = "sha256:aa57d1bcb8931186b5dde565e9c17c572cf02412572d962da5b1a17ee5637d2c", size = 19823, upload-time = "2026-05-21T16:36:37.276Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a7/d7/40f03745f540630b9e5712dfe5971b9a3f0032df89c5f7bdd167db7ebafc/opentelemetry_instrumentation_logging-0.58b0-py3-none-any.whl", hash = "sha256:9bc59602be50e21c4946de9026de3c00556b5f5845c25c834518a0b63ba897b9", size = 12577, upload-time = "2025-09-11T11:41:36.395Z" }, + { url = "https://files.pythonhosted.org/packages/b6/71/1ba447311adf33023be14a1a309852c4cf74219f095d0055a54c1824d9ff/opentelemetry_instrumentation_logging-0.63b1-py3-none-any.whl", hash = "sha256:6b3aac8d18bc897468814d5ce4ed00f9d43588c583b4ba2288267e191b96d944", size = 15993, upload-time = "2026-05-21T16:35:35.851Z" }, ] [[package]] name = "opentelemetry-proto" -version = "1.37.0" +version = "1.42.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "protobuf" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/dd/ea/a75f36b463a36f3c5a10c0b5292c58b31dbdde74f6f905d3d0ab2313987b/opentelemetry_proto-1.37.0.tar.gz", hash = "sha256:30f5c494faf66f77faeaefa35ed4443c5edb3b0aa46dad073ed7210e1a789538", size = 46151, upload-time = "2025-09-11T10:29:11.04Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b4/55/63eac3e1089b768ba014091fdd2ae8a9a440c821ef5e2b786909c94c8836/opentelemetry_proto-1.42.1.tar.gz", hash = "sha256:c6a51e6b4f05ae63565f3a113217f3d2bfaec68f78c02d7a6c85f9010d1cfca6", size = 45839, upload-time = "2026-05-21T16:33:03.937Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c4/25/f89ea66c59bd7687e218361826c969443c4fa15dfe89733f3bf1e2a9e971/opentelemetry_proto-1.37.0-py3-none-any.whl", hash = "sha256:8ed8c066ae8828bbf0c39229979bdf583a126981142378a9cbe9d6fd5701c6e2", size = 72534, upload-time = "2025-09-11T10:28:56.831Z" }, + { url = "https://files.pythonhosted.org/packages/41/9d/171c02c84a76940b7e601805b3bb536985aded9168fbcc9ba52f0a730fa2/opentelemetry_proto-1.42.1-py3-none-any.whl", hash = "sha256:dedb74cba2886c59c7789b227a7a670613025a07489040050aedff6e5c0fb43c", size = 71782, upload-time = "2026-05-21T16:32:44.867Z" }, ] [[package]] name = "opentelemetry-sdk" -version = "1.37.0" +version = "1.42.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-api" }, { name = "opentelemetry-semantic-conventions" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f4/62/2e0ca80d7fe94f0b193135375da92c640d15fe81f636658d2acf373086bc/opentelemetry_sdk-1.37.0.tar.gz", hash = "sha256:cc8e089c10953ded765b5ab5669b198bbe0af1b3f89f1007d19acd32dc46dda5", size = 170404, upload-time = "2025-09-11T10:29:11.779Z" } +sdist = { url = "https://files.pythonhosted.org/packages/40/f7/b390bd9bfd703bf98a68fea1f27786c6872331fd617164a54b8a59bdc008/opentelemetry_sdk-1.42.1.tar.gz", hash = "sha256:8c834e8f8c9ba4171d4ec843d0cb8a67e4c7394d3f9e9297e582cbd9456ddbf7", size = 239262, upload-time = "2026-05-21T16:33:04.641Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9f/62/9f4ad6a54126fb00f7ed4bb5034964c6e4f00fcd5a905e115bd22707e20d/opentelemetry_sdk-1.37.0-py3-none-any.whl", hash = "sha256:8f3c3c22063e52475c5dbced7209495c2c16723d016d39287dfc215d1771257c", size = 131941, upload-time = "2025-09-11T10:28:57.83Z" }, + { url = "https://files.pythonhosted.org/packages/8f/6b/4287766cfbde577ae2272e8884abac325aeaac0d64f41c61d5b8cc595105/opentelemetry_sdk-1.42.1-py3-none-any.whl", hash = "sha256:083cd4bbfaa5aa7b5a9e552430d9951219967cfb27aa61feb13a77aba1fc839d", size = 170907, upload-time = "2026-05-21T16:32:45.894Z" }, ] [[package]] name = "opentelemetry-semantic-conventions" -version = "0.58b0" +version = "0.63b1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-api" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/aa/1b/90701d91e6300d9f2fb352153fb1721ed99ed1f6ea14fa992c756016e63a/opentelemetry_semantic_conventions-0.58b0.tar.gz", hash = "sha256:6bd46f51264279c433755767bb44ad00f1c9e2367e1b42af563372c5a6fa0c25", size = 129867, upload-time = "2025-09-11T10:29:12.597Z" } +sdist = { url = "https://files.pythonhosted.org/packages/93/99/4d7dd6df64795951413ce6e815f8cf1eb191daf7196ae86574589643d5f3/opentelemetry_semantic_conventions-0.63b1.tar.gz", hash = "sha256:3daf963611334b365e98a57438183eb012d3bfb40b2d931a9af613476b8701a9", size = 148340, upload-time = "2026-05-21T16:33:05.455Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/07/90/68152b7465f50285d3ce2481b3aec2f82822e3f52e5152eeeaf516bab841/opentelemetry_semantic_conventions-0.58b0-py3-none-any.whl", hash = "sha256:5564905ab1458b96684db1340232729fce3b5375a06e140e8904c78e4f815b28", size = 207954, upload-time = "2025-09-11T10:28:59.218Z" }, + { url = "https://files.pythonhosted.org/packages/cb/7a/7fe66f5f3682b1dd47d88cc4e11f1c6c0966b737de2d16671146e23c39a5/opentelemetry_semantic_conventions-0.63b1-py3-none-any.whl", hash = "sha256:dfe5ef4dee82586b746f522b818ceb298d00b3d59f660042bd79404bff8d0682", size = 203713, upload-time = "2026-05-21T16:32:47.016Z" }, ] [[package]] @@ -5894,7 +5913,7 @@ requires-dist = [ { name = "a2ui-agent-sdk", marker = "extra == 'a2ui'", specifier = ">=0.2.1" }, { name = "agent-pilot-sdk", specifier = "==0.1.2" }, { name = "agentkit-sdk-python", specifier = ">=0.8.5" }, - { name = "agentkit-sdk-python", marker = "extra == 'harness-sidecar'", specifier = ">=0.8.1,<0.9.0" }, + { name = "agentkit-sdk-python", marker = "extra == 'harness-sidecar'", specifier = ">=0.8.5" }, { name = "aiomysql", specifier = "==0.3.2" }, { name = "anthropic", marker = "extra == 'sandbox'", specifier = ">=0.40.0" }, { name = "async-timeout", marker = "python_full_version < '3.11'", specifier = ">=5,<6" }, @@ -5906,8 +5925,8 @@ requires-dist = [ { name = "fastapi", marker = "extra == 'codex'" }, { name = "fastmcp", specifier = ">=2.12.3" }, { name = "filetype", specifier = "==1.2.0" }, - { name = "google-adk", specifier = ">=1.34.0" }, - { name = "google-adk", extras = ["eval"], marker = "extra == 'eval'", specifier = ">=1.34.0" }, + { name = "google-adk", specifier = ">=2.7.0,<2.8.0" }, + { name = "google-adk", extras = ["eval"], marker = "extra == 'eval'", specifier = ">=2.7.0,<2.8.0" }, { name = "headroom", marker = "extra == 'harness'" }, { name = "httpx", specifier = ">=0.27,<1" }, { name = "httpx", extras = ["socks"], marker = "extra == 'sandbox'", specifier = ">=0.27.0" }, @@ -5926,7 +5945,7 @@ requires-dist = [ { name = "omegaconf", specifier = "==2.3.0" }, { name = "openai-codex", marker = "extra == 'codex'", specifier = "==0.159.2" }, { name = "opensearch-py", marker = "extra == 'extensions'", specifier = ">=2.8.0" }, - { name = "opentelemetry-exporter-otlp", specifier = "==1.37.0" }, + { name = "opentelemetry-exporter-otlp", specifier = ">=1.37.0" }, { name = "opentelemetry-instrumentation-logging", specifier = ">=0.56b0" }, { name = "openviking-sdk", specifier = ">=0.1.9" }, { name = "pillow", specifier = ">=10.0.0" }, diff --git a/veadk/utils/patches.py b/veadk/utils/patches.py index 25c50ce5b..f5e811e04 100644 --- a/veadk/utils/patches.py +++ b/veadk/utils/patches.py @@ -363,7 +363,17 @@ def patch_adk_build_graph_serialization() -> None: @functools.wraps(original_serialize_agent) def veadk_serialize_agent(*args, **kwargs): - return _sanitize_adk_graph_value(original_serialize_agent(*args, **kwargs)) + agent = args[0] if args else kwargs.get("agent") + serialized = _sanitize_adk_graph_value( + original_serialize_agent(*args, **kwargs) + ) + if isinstance(serialized, dict) and "sub_agents" not in serialized: + sub_agents = getattr(agent, "sub_agents", None) + if sub_agents: + serialized["sub_agents"] = [ + veadk_serialize_agent(sub_agent) for sub_agent in sub_agents + ] + return serialized graph_serialization.serialize_agent = veadk_serialize_agent graph_serialization._veadk_build_graph_serialization_patched = True From 243c1fcd70e14bd97c0e6c606d6b61a0b77286ae Mon Sep 17 00:00:00 2001 From: shanchunhua Date: Tue, 13 Oct 2026 15:28:07 +0800 Subject: [PATCH 2/3] fix(frontend): type wecom authorization result --- frontend/src/adk/wecomAuthorization.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/frontend/src/adk/wecomAuthorization.ts b/frontend/src/adk/wecomAuthorization.ts index 9be608962..2084374bf 100644 --- a/frontend/src/adk/wecomAuthorization.ts +++ b/frontend/src/adk/wecomAuthorization.ts @@ -5,6 +5,11 @@ import defaultSdk, { // The package creates a singleton listener on import; attempts own their instances. defaultSdk.destroy(); +type WecomBotInfo = { + botid?: unknown; + secret?: unknown; +}; + export class WecomAuthorizationError extends Error { constructor(public readonly code: string) { super("WeCom authorization failed"); @@ -45,7 +50,7 @@ export function authorizeWecom( debug: false, }) .then( - (bot) => { + (bot: WecomBotInfo | null | undefined) => { if (settled) return; if ( typeof bot?.botid !== "string" || From f79e5ad2104701386c40b28d2323d98f8d6e05e2 Mon Sep 17 00:00:00 2001 From: shanchunhua Date: Tue, 13 Oct 2026 15:56:04 +0800 Subject: [PATCH 3/3] fix(runtime): default piagent invocation run config --- .../2026-10-12-google-adk-opentelemetry-baseline.md | 1 + .../2026-10-12-google-adk-opentelemetry-baseline.zh.md | 1 + veadk/runtime/piagent/tools_bridge.py | 6 +++++- 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/prd-spec/bugfixes/runtime-dependency-compatibility/2026-10-12-google-adk-opentelemetry-baseline.md b/prd-spec/bugfixes/runtime-dependency-compatibility/2026-10-12-google-adk-opentelemetry-baseline.md index 70b6ba485..fe2e3aef9 100644 --- a/prd-spec/bugfixes/runtime-dependency-compatibility/2026-10-12-google-adk-opentelemetry-baseline.md +++ b/prd-spec/bugfixes/runtime-dependency-compatibility/2026-10-12-google-adk-opentelemetry-baseline.md @@ -111,6 +111,7 @@ No persistent state, security boundary, or public Python API changes are introdu | `uv lock --upgrade-package google-adk` with unrestricted `>=2.7.0` | fail for compatibility scope: resolved `google-adk==2.11.0`; targeted suite failed on ADK internal changes | | `uv lock --upgrade-package google-adk` with `>=2.7.0,<2.8.0` | pass: resolved `google-adk==2.7.1` | | `uv run --extra dev pytest -q tests/test_runtime_dependency_compatibility.py tests/extensions/harness/test_sidecar_wheel.py::test_wheel_metadata_keeps_sidecar_optional_and_sdk_constraints_aligned tests/cli/test_frontend_sandbox.py::test_snapshot_metadata_survives_older_sdk_and_scopes_cards tests/runtime/piagent/test_piagent_runtime.py::test_piagent_runtime_emits_canonical_bridge_tool_events tests/runtime/piagent/test_piagent_runtime.py::test_piagent_runtime_exposes_before_model_added_tools tests/test_adk_sync_tool_thread_pool_patch.py::test_run_code_uses_agent_thread_pool_when_configured tests/tools/builtin_tools/create_agent/test_create_agent_toolset.py::test_runner_transfers_from_create_agents_to_dynamic_sub_agent tests/cli/test_frontend_trace.py::test_build_graph_serializes_nested_veadk_agent_models tests/cli/test_studio_startup_imports.py::test_studio_fast_api_defers_genai_models_until_first_request tests/cli/test_studio_startup_imports.py::test_studio_deferred_genai_models_support_openapi_first_use` | pass: 11 passed | +| `uv run --extra dev pytest -q -n 4 tests/runtime/piagent/test_piagent_runtime.py` | pass: 55 passed; verifies PiAgent fake invocation contexts now provide the ADK 2.7 `run_config` expected by tool execution | | `uv run --extra dev pre-commit run --all-files` | pass | | `git diff --check` | pass | | `uv run --extra dev pytest -n 2 -m "not codex_smoke and not piagent_smoke"` | fail: 6913 passed, 55 skipped, 4 xfailed, 16 failed. The failed run included stale assertions fixed by this change and Codex runtime tests missing the optional `openai_codex` package under `--extra dev`. The Codex failure subset passed with `--extra codex`. | diff --git a/prd-spec/bugfixes/runtime-dependency-compatibility/2026-10-12-google-adk-opentelemetry-baseline.zh.md b/prd-spec/bugfixes/runtime-dependency-compatibility/2026-10-12-google-adk-opentelemetry-baseline.zh.md index c4d5a82d5..e51dcab0c 100644 --- a/prd-spec/bugfixes/runtime-dependency-compatibility/2026-10-12-google-adk-opentelemetry-baseline.zh.md +++ b/prd-spec/bugfixes/runtime-dependency-compatibility/2026-10-12-google-adk-opentelemetry-baseline.zh.md @@ -111,6 +111,7 @@ ADK 2.7 在 Studio 测试路径中不再暴露 `_experimental_semconv.transforme | 在无限制 `>=2.7.0` 下运行 `uv lock --upgrade-package google-adk` | fail(针对兼容范围):解析为 `google-adk==2.11.0`;目标测试因 ADK 内部变化失败 | | 在 `>=2.7.0,<2.8.0` 下运行 `uv lock --upgrade-package google-adk` | pass:解析为 `google-adk==2.7.1` | | `uv run --extra dev pytest -q tests/test_runtime_dependency_compatibility.py tests/extensions/harness/test_sidecar_wheel.py::test_wheel_metadata_keeps_sidecar_optional_and_sdk_constraints_aligned tests/cli/test_frontend_sandbox.py::test_snapshot_metadata_survives_older_sdk_and_scopes_cards tests/runtime/piagent/test_piagent_runtime.py::test_piagent_runtime_emits_canonical_bridge_tool_events tests/runtime/piagent/test_piagent_runtime.py::test_piagent_runtime_exposes_before_model_added_tools tests/test_adk_sync_tool_thread_pool_patch.py::test_run_code_uses_agent_thread_pool_when_configured tests/tools/builtin_tools/create_agent/test_create_agent_toolset.py::test_runner_transfers_from_create_agents_to_dynamic_sub_agent tests/cli/test_frontend_trace.py::test_build_graph_serializes_nested_veadk_agent_models tests/cli/test_studio_startup_imports.py::test_studio_fast_api_defers_genai_models_until_first_request tests/cli/test_studio_startup_imports.py::test_studio_deferred_genai_models_support_openapi_first_use` | pass:11 passed | +| `uv run --extra dev pytest -q -n 4 tests/runtime/piagent/test_piagent_runtime.py` | pass:55 passed;验证 PiAgent fake invocation context 已提供 ADK 2.7 工具执行期望的 `run_config` | | `uv run --extra dev pre-commit run --all-files` | pass | | `git diff --check` | pass | | `uv run --extra dev pytest -n 2 -m "not codex_smoke and not piagent_smoke"` | fail:6913 passed,55 skipped,4 xfailed,16 failed。该失败运行包含已在本变更中修复的旧断言,以及在 `--extra dev` 下缺少 optional `openai_codex` 包的 Codex runtime 测试。Codex 失败子集在 `--extra codex` 下通过。 | diff --git a/veadk/runtime/piagent/tools_bridge.py b/veadk/runtime/piagent/tools_bridge.py index d0fd641df..38f008ff6 100644 --- a/veadk/runtime/piagent/tools_bridge.py +++ b/veadk/runtime/piagent/tools_bridge.py @@ -103,9 +103,9 @@ async def build_executable_tools( bundle = PiToolBundle() seen: set[str] = set() - readonly_context = ReadonlyContext(ctx) _ensure_invocation_context_defaults(ctx, agent) + readonly_context = ReadonlyContext(ctx) def _skip(name: str, reason: str) -> None: logger.warning(f"piagent: skipping tool {name!r}: {reason}") @@ -456,6 +456,10 @@ def _ensure_invocation_context_defaults(ctx: InvocationContext, agent: Agent) -> _set_default_attr(agent, callback_name, []) if getattr(ctx, "agent", None) is None: _set_default_attr(ctx, "agent", agent) + if getattr(ctx, "run_config", None) is None: + from google.adk.agents import RunConfig + + _set_default_attr(ctx, "run_config", RunConfig()) if getattr(ctx, "plugin_manager", None) is None: _set_default_attr(ctx, "plugin_manager", _NoopPluginManager())