From 3890e35cf2aa9e5d5e4f38985ad82fe109087db9 Mon Sep 17 00:00:00 2001 From: Ashpreet Date: Tue, 7 Jul 2026 01:41:04 +0100 Subject: [PATCH 1/3] chore: reconcile to agno 2.7.0a7 + agnoctl 0.1.0a7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - agno[os,slack] -> ==2.7.0a7 (pin + regenerated requirements), matching the AgentOS Starter reference. - evals/wiring.py (W5): a7 folded AllDrivesGoogleDriveTools into GoogleDriveTools (corpora / supports_all_drives / include_items_from_all_drives), and GDriveContextProvider now defaults to full Shared-Drive coverage. The invariant check now asserts those flags instead of the removed subclass — same intent, a7 mechanism. Main app (scout/contexts.py) needs no change. - railway.json: numReplicas 2 -> 1 (single-replica scheduler; >1 double-fires the in-process cron — see the Starters' decisions.md). Verified on this branch (cred-free): a7 resolves, ruff clean, mypy clean (19 files), docker builds, all 24 agno imports resolve, and the full wiring suite (9/9 code invariants) passes on a7. Behavioral/judge evals NOT run (no creds). Co-Authored-By: Claude Opus 4.8 (1M context) --- evals/wiring.py | 28 ++++++++++++++++++---------- pyproject.toml | 2 +- railway.json | 2 +- requirements.txt | 22 +++------------------- 4 files changed, 23 insertions(+), 31 deletions(-) diff --git a/evals/wiring.py b/evals/wiring.py index 8e53944..ebdbb18 100644 --- a/evals/wiring.py +++ b/evals/wiring.py @@ -204,22 +204,30 @@ def w4_context_protocol_shape() -> None: def w5_gdrive_uses_alldrives_subclass() -> None: - """GDrive provider must use `AllDrivesGoogleDriveTools`, not bare `GoogleDriveTools`. - - The bare upstream toolkit queries `corpora=user` and misses every file - the SA doesn't own directly (shared folders, Shared Drives). Regressing - to bare `GoogleDriveTools` silently breaks every real deployment, so - pin the subclass here. + """GDrive provider must cover Shared Drives, not just user-owned files. + + A bare ``corpora=user`` toolkit misses every file the service account + doesn't own directly (shared folders, Shared Drives). As of agno 2.7 the + dedicated ``AllDrivesGoogleDriveTools`` subclass was folded into + ``GoogleDriveTools`` via the ``corpora`` / ``supports_all_drives`` / + ``include_items_from_all_drives`` params, and ``GDriveContextProvider`` + defaults them to full-drive coverage — so pin those flags here instead of + the (now-removed) subclass. """ from agno.context.gdrive import GDriveContextProvider - from agno.context.gdrive.tools import AllDrivesGoogleDriveTools provider = GDriveContextProvider(service_account_path="/tmp/eval-wiring-stub.json") toolkit = provider._ensure_tools() - if not isinstance(toolkit, AllDrivesGoogleDriveTools): + missing = [ + flag + for flag in ("supports_all_drives", "include_items_from_all_drives") + if not getattr(toolkit, flag, False) + ] + if missing or getattr(toolkit, "corpora", None) != "allDrives": raise AssertionError( - f"GDriveContextProvider._ensure_tools() returned {type(toolkit).__name__}; " - f"expected AllDrivesGoogleDriveTools so shared-folder / Shared-Drive files are visible" + "GDriveContextProvider toolkit is not configured for Shared-Drive coverage " + f"(corpora={getattr(toolkit, 'corpora', None)!r}, missing flags={missing}); " + "expected corpora='allDrives' + supports_all_drives + include_items_from_all_drives" ) diff --git a/pyproject.toml b/pyproject.toml index 073b7d8..28037bc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -8,7 +8,7 @@ license-files = ["LICENSE"] authors = [{ name = "Agno", email = "hello@agno.com" }] dependencies = [ - "agno[os,slack]", + "agno[os,slack]==2.7.0a7", "aiohttp", "google-api-python-client", "google-auth-httplib2", diff --git a/railway.json b/railway.json index dbbcb53..ee7830a 100644 --- a/railway.json +++ b/railway.json @@ -6,7 +6,7 @@ }, "deploy": { "runtime": "V2", - "numReplicas": 2, + "numReplicas": 1, "startCommand": "uvicorn app.main:app --host 0.0.0.0 --port 8000", "sleepApplication": false, "useLegacyStacker": false, diff --git a/requirements.txt b/requirements.txt index e7566f5..9473cd8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,7 @@ # This file was autogenerated by uv via the following command: -# ./scripts/generate_requirements.sh upgrade -agno==2.6.4 +# ./scripts/generate_requirements.sh +agno==2.7.0a7 +agnoctl==0.1.0a7 aiohappyeyeballs==2.6.1 aiohttp==3.13.5 aiosignal==1.4.0 @@ -15,16 +16,9 @@ click==8.3.3 croniter==6.2.2 cryptography==47.0.0 distro==1.9.0 -dnspython==2.8.0 docstring-parser==0.18.0 -email-validator==2.3.0 fastapi==0.136.1 -fastapi-cli==0.0.24 -fastapi-cloud-cli==0.17.1 -fastar==0.11.0 frozenlist==1.8.0 -gitdb==4.0.12 -gitpython==3.1.48 google-api-core==2.30.3 google-api-python-client==2.194.0 google-auth==2.49.2 @@ -36,18 +30,15 @@ h2==4.3.0 hpack==4.1.0 httpcore==1.0.9 httplib2==0.31.2 -httptools==0.7.1 httpx==0.28.1 httpx-sse==0.4.3 hyperframe==6.1.0 idna==3.13 importlib-metadata==8.7.1 -jinja2==3.1.6 jiter==0.14.0 jsonschema==4.26.0 jsonschema-specifications==2025.9.1 markdown-it-py==4.0.0 -markupsafe==3.0.3 mcp==1.27.0 mdurl==0.1.2 multidict==6.7.1 @@ -74,7 +65,6 @@ pyasn1-modules==0.4.2 pycparser==3.0 pydantic==2.13.3 pydantic-core==2.46.3 -pydantic-extra-types==2.11.1 pydantic-settings==2.14.0 pygments==2.20.0 pyjwt==2.12.1 @@ -88,14 +78,10 @@ referencing==0.37.0 requests==2.33.1 requests-oauthlib==2.0.0 rich==15.0.0 -rich-toolkit==0.19.7 -rignore==0.7.6 rpds-py==0.30.0 -sentry-sdk==2.58.0 shellingham==1.5.4 six==1.17.0 slack-sdk==3.41.0 -smmap==5.0.3 sniffio==1.3.1 sqlalchemy==2.0.49 sse-starlette==3.4.1 @@ -107,8 +93,6 @@ typing-inspection==0.4.2 uritemplate==4.2.0 urllib3==2.6.3 uvicorn==0.46.0 -uvloop==0.22.1 -watchfiles==1.1.1 websockets==16.0 wrapt==1.17.3 yarl==1.23.0 From 8f73ddee8c7790307b646629a51e4cd592c41bdf Mon Sep 17 00:00:00 2001 From: Ashpreet Date: Tue, 7 Jul 2026 13:12:45 +0100 Subject: [PATCH 2/3] agno 2.7.0 + agnoctl 0.1.0: bump to the first stable release of the v2.7 line Co-Authored-By: Claude Fable 5 --- pyproject.toml | 2 +- requirements.txt | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 28037bc..51ca4e9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -8,7 +8,7 @@ license-files = ["LICENSE"] authors = [{ name = "Agno", email = "hello@agno.com" }] dependencies = [ - "agno[os,slack]==2.7.0a7", + "agno[os,slack]==2.7.0", "aiohttp", "google-api-python-client", "google-auth-httplib2", diff --git a/requirements.txt b/requirements.txt index 9473cd8..2838ed4 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,7 @@ # This file was autogenerated by uv via the following command: # ./scripts/generate_requirements.sh -agno==2.7.0a7 -agnoctl==0.1.0a7 +agno==2.7.0 +agnoctl==0.1.0 aiohappyeyeballs==2.6.1 aiohttp==3.13.5 aiosignal==1.4.0 From ede20c0414a1961935e3547c18455f76ea312fa1 Mon Sep 17 00:00:00 2001 From: Ashpreet Date: Tue, 7 Jul 2026 13:15:20 +0100 Subject: [PATCH 3/3] style: ruff-format evals/wiring.py Co-Authored-By: Claude Fable 5 --- evals/wiring.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/evals/wiring.py b/evals/wiring.py index ebdbb18..ea49a93 100644 --- a/evals/wiring.py +++ b/evals/wiring.py @@ -219,9 +219,7 @@ def w5_gdrive_uses_alldrives_subclass() -> None: provider = GDriveContextProvider(service_account_path="/tmp/eval-wiring-stub.json") toolkit = provider._ensure_tools() missing = [ - flag - for flag in ("supports_all_drives", "include_items_from_all_drives") - if not getattr(toolkit, flag, False) + flag for flag in ("supports_all_drives", "include_items_from_all_drives") if not getattr(toolkit, flag, False) ] if missing or getattr(toolkit, "corpora", None) != "allDrives": raise AssertionError(