Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
9b609fa
feat(context): enable recoverable compression by default in SDK and S…
Sep 26, 2026
b04970d
fix(context): validate model capacity and repair PR checks
Sep 28, 2026
a10207c
fix(ci): complete license headers and report safe failure locations
Sep 28, 2026
6e8bac4
test(context): stabilize deadlines and refresh generated project fixt…
Sep 28, 2026
e14e505
test(context): synchronize stream interruption and guarantee cleanup
Sep 28, 2026
e942473
test(studio): make review ZIP fixtures independent of wall clock
Sep 28, 2026
b29cd8b
feat(context): default to model-free retrieval and externalize model …
Sep 30, 2026
b1692f9
test(context): make shared deadline checks independent of scheduling
Sep 30, 2026
f33f74f
test(context): make index timeout contracts independent of scheduling
Sep 30, 2026
cd2320c
test(context): separate ingestion correctness from host scheduling
Sep 30, 2026
544050d
fix(deps): declare installable ADK compatibility range
Sep 30, 2026
70eeb1e
fix(tests): make SQLite timeout recovery contracts deterministic
Sep 30, 2026
b3c1a42
feat(context): expand reviewed model capacities and enforce input cei…
Sep 30, 2026
9d45f02
fix(studio): align generated defaults with reviewed capacities
Sep 30, 2026
6742712
feat(context): add bounded native preparation for embedding indexes
Oct 1, 2026
70d298a
fix(ci): separate Sidecar setup and execution time budgets
Oct 1, 2026
44bba18
test(context): make child timeout regression independent of host sche…
Oct 1, 2026
4a0b181
feat(context): enable configured embedding preparation and model rera…
Oct 2, 2026
7720826
build(studio): refresh bundle after main integration
Oct 9, 2026
271c81f
chore(context): narrow PR scope and preserve regression coverage
Oct 9, 2026
4501a9f
Merge upstream main into context compression PR
Oct 11, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
77 changes: 77 additions & 0 deletions .github/scripts/report_pytest_failures.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
# Copyright (c) 2025 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.

"""Expose CI failure locations without publishing assertion payloads or secrets."""

import importlib.metadata
from pathlib import Path
import re
import sys
import xml.etree.ElementTree as ET


def failure_locations(report: Path) -> list[str]:
if not report.exists():
return ["JUnit report unavailable; check the preceding installation/test step."]
locations = []
for case in ET.parse(report).getroot().iter("testcase"):
failure = next((x for x in case if x.tag in {"failure", "error"}), None)
if failure is None:
continue
# Test parameters and assertion text can contain credentials or prompts.
# Publish only Python identifiers and repository test source locations.
name = case.get("name", "").split("[", 1)[0]
name = name if re.fullmatch(r"[a-zA-Z_][a-zA-Z_0-9]*", name) else "collection"
classname = case.get("classname", "")
classname = (
classname
if re.fullmatch(r"[a-zA-Z_][a-zA-Z_0-9.]*", classname)
else "tests"
)
source = re.findall(
r"^(tests/[a-zA-Z_0-9/]+\.py):(\d+):", failure.text or "", re.MULTILINE
)
suffix = f" at {source[-1][0]}:{source[-1][1]}" if source else ""
locations.append(f"{classname}.{name}{suffix}")
return locations


def main() -> None:
packages = [
"google-adk",
"litellm",
"google-genai",
"pydantic",
"pytest",
"pytest-asyncio",
"sqlalchemy",
"aiosqlite",
"agentkit-sdk-python",
"opentelemetry-sdk",
]
versions = []
for name in packages:
try:
version = importlib.metadata.version(name)
except importlib.metadata.PackageNotFoundError:
version = "missing"
if re.fullmatch(r"[a-zA-Z0-9._+!-]+", version):
versions.append(f"{name}={version}")
print("::notice title=Dependency versions::" + "; ".join(versions))
for location in failure_locations(Path(sys.argv[1]))[:30]:
print("::error title=Pytest failure location::" + location)


if __name__ == "__main__":
main()
85 changes: 85 additions & 0 deletions .github/workflows/context-compression-gate.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
name: Context Compression Gate

on:
workflow_call:
pull_request:
paths:
- 'veadk/context/**'
- 'veadk/agent.py'
- 'veadk/runner.py'
- 'veadk/memory/**'
- 'veadk/agents/**'
- 'veadk/models/**'
- 'veadk/cli/generated_agent_*.py'
- 'veadk/cli/cli_frontend.py'
- 'veadk/integrations/agentkit/app.py'
- 'frontend/src/create/**'
- 'frontend/src/adk/client.ts'
- 'frontend/src/ui/AgentTopology.tsx'
- 'frontend/src/i18n/resources/**'
- 'frontend/tests/contextCompression*.test.mjs'
- 'veadk/extensions/harness/plugins/compactor/**'
- 'tests/context/**'
- 'tests/agent/**'
- 'tests/cli/test_generated_agent_backend_codegen*.py'
- 'evaluations/context_compression/**'
- 'tests/models/**'
- 'tests/run_context_compression_gate.py'
- 'tests/test_context_release_gate.py'
- 'tests/fixtures/adk_dependency_metadata.json'
- 'tests/test_ci_failure_summary.py'
- '.github/scripts/report_pytest_failures.py'
- '.github/workflows/context-compression-gate.yaml'
- '.github/workflows/publish-tag-to-pypi.yaml'
- '.github/workflows/publish-studio-release.yaml'
- 'pyproject.toml'
- 'uv.lock'

permissions:
contents: read

jobs:
studio-contracts:
runs-on: ubuntu-latest
timeout-minutes: 10
defaults:
run:
working-directory: frontend
steps:
- uses: actions/checkout@v4
with:
persist-credentials: false
- uses: actions/setup-node@v4
with:
node-version: '22'
cache: npm
cache-dependency-path: frontend/package-lock.json
- run: npm ci --ignore-scripts --no-audit --no-fund
- run: node --test tests/contextCompression*.test.mjs
contracts:
runs-on: ubuntu-latest
timeout-minutes: 15
strategy:
fail-fast: false
matrix:
python: ['3.10', '3.12']
# Keep installable targets aligned with pyproject.toml. ADK >=2.3
# conflicts with AgentKit 0.8.x's OTel cap; rejection is regression
# tested in test_context_release_gate.py, not claimed as support.
adk: ['1.34.0', '2.1.0', '2.2.0']
steps:
- uses: actions/checkout@v4
with:
persist-credentials: false
- uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python }}
- name: Install fixed ADK compatibility target
run: python -m pip install -e '.[dev]' 'google-adk==${{ matrix.adk }}'
- name: Check installed dependency consistency
run: python -m pip check
- name: Run isolated SDK and Runner contracts
run: python tests/run_context_compression_gate.py -q --junitxml="$GITHUB_WORKSPACE/context-contracts.xml"
- name: Report failure locations and dependency versions
if: failure()
run: python .github/scripts/report_pytest_failures.py context-contracts.xml
5 changes: 4 additions & 1 deletion .github/workflows/harness-sidecar-release-gate.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,8 @@ jobs:
backend-gate:
name: Backend gate
runs-on: ubuntu-latest
timeout-minutes: 3
# Dependency setup must not consume the Sidecar execution time limit.
timeout-minutes: 10
steps:
- uses: actions/checkout@v4

Expand All @@ -99,9 +100,11 @@ jobs:
uv.lock

- name: Install Python test dependencies
timeout-minutes: 5
run: python -m pip install -e '.[dev]'

- name: Run Python Sidecar checks in parallel
timeout-minutes: 3
shell: bash
run: |
set -euo pipefail
Expand Down
4 changes: 4 additions & 0 deletions .github/workflows/publish-studio-release.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -44,13 +44,17 @@ concurrency:
cancel-in-progress: ${{ github.event_name == 'pull_request' }}

jobs:
context-compression-gate:
uses: ./.github/workflows/context-compression-gate.yaml

harness-sidecar-release-gate:
if: >-
github.repository == 'volcengine/veadk-python' &&
github.event_name == 'pull_request'
uses: ./.github/workflows/harness-sidecar-release-gate.yaml

verify:
needs: context-compression-gate
if: >-
github.repository == 'volcengine/veadk-python' &&
(github.event_name == 'pull_request' || github.ref == 'refs/heads/main')
Expand Down
5 changes: 4 additions & 1 deletion .github/workflows/publish-tag-to-pypi.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,14 @@ on:
workflow_dispatch:

jobs:
context-compression-gate:
uses: ./.github/workflows/context-compression-gate.yaml

harness-sidecar-release-gate:
uses: ./.github/workflows/harness-sidecar-release-gate.yaml

build:
needs: harness-sidecar-release-gate
needs: [harness-sidecar-release-gate, context-compression-gate]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
Expand Down
10 changes: 9 additions & 1 deletion .github/workflows/unit-tests.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ jobs:
runs-on: ubuntu-latest
timeout-minutes: 30
strategy:
fail-fast: false
matrix:
python-version: ["3.10", "3.12"]

Expand Down Expand Up @@ -65,7 +66,14 @@ jobs:
# `codex_smoke` is excluded here rather than relying on its
# CODEX_RUN_SMOKE opt-in alone: it spawns a real Codex subprocess and
# binds two real loopback ports, which must never run under `-n 16`.
pytest -n 16 -m "not codex_smoke"
pytest -n 16 -m "not codex_smoke" --junitxml=unit-tests.xml

- name: Report failure locations and dependency versions
if: failure()
run: |
if [ -x .venv/bin/python ]; then
.venv/bin/python .github/scripts/report_pytest_failures.py unit-tests.xml
fi

# Real Codex binary + real OS sandbox + real shim socket, against a stubbed
# model backend (no credentials, no network egress). Kept out of the matrix
Expand Down
15 changes: 15 additions & 0 deletions evaluations/context_compression/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# Copyright (c) 2025 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.

"""Synthetic, paired context-compression evaluation; no network on import."""
Loading
Loading