Skip to content

Release v0.20.0#1334

Open
kovtcharov-amd wants to merge 1 commit into
mainfrom
v0.20.0-release
Open

Release v0.20.0#1334
kovtcharov-amd wants to merge 1 commit into
mainfrom
v0.20.0-release

Conversation

@kovtcharov-amd
Copy link
Copy Markdown
Collaborator

GAIA v0.20.0 Release Notes

GAIA v0.20.0 is a feature release centered on giving agents a choice of hardware and giving users finer control over what each agent can see and do. Agents can now run on CPU, GPU, or the Ryzen AI NPU, selectable per-agent from the Agent UI or the CLI. MCP connectors gain a second control axis — activations — so a granted connector's tools only land in an agent's prompt when explicitly switched on, keeping small-model tool selection sharp. A new terminal-native Agent Hub opens when you run gaia with no arguments. The email agent gets batch organize tools that turn bulk inbox work from minutes into seconds, and RAG now indexes PowerPoint files natively. Underneath the features, this release lands a large security, first-boot-robustness, and test-coverage hardening pass.

Why upgrade:

  • Multi-device per-agent selection (CPU / GPU / NPU) — each agent declares the devices it supports; users pick one via the Agent UI dropdown or --device {cpu,gpu,npu}, with gaia init --profile npu handling NPU detection, FLM backend install, and model download. GPU stays the default.
  • Per-agent MCP tool-visibility activations — granted connectors no longer dump every tool into every agent's prompt; activations are explicit opt-in per (connector, agent), and CLI/SDK toggles now emit the same live connector.activation.changed SSE update the UI already used.
  • Agent Hub TUI — running gaia with no args opens a terminal-native hub to browse, search, launch, and manage agents in a ~21MB standalone binary with sub-200ms startup.
  • 10x faster email organization — seven new batch organize tools cut bulk inbox operations from ~13 LLM round-trips to 2–3 steps (~488s → ~30–60s, ~12K → ~1.2K tokens).
  • Native PowerPoint (.pptx) RAG.pptx uploads are indexed directly (text, tables, speaker notes, plus VLM analysis of embedded images) instead of telling users to "save as PDF first."
  • Security & first-boot robustness — symlink write-guard bypass closed on Python 3.10/3.11, write guardrails extended to four more file tools, and a corrupt-model misdiagnosis that triggered a destructive ~25 GB re-download is fixed.

What's New

Multi-Device Support — CPU, GPU, and Ryzen AI NPU

Before this release, GAIA inference defaulted to GPU via llama.cpp with no way to target an alternative device — users with XDNA2 NPUs had no path to power-efficient local inference, and there was no framework for per-agent device selection. PR #1252 adds that framework: each agent declares which devices it supports via DeviceConfig tuples, and users select a device per-agent through an Agent UI dropdown or the --device {cpu,gpu,npu} CLI flag.

GPU remains the default. The NPU path uses the FLM backend (gemma4-it-e2b-FLM); CPU falls back automatically with a latency warning. gaia init --profile npu handles NPU detection, FLM backend installation, and model download. Eval-verified on a Ryzen AI MAX+ PRO 395, the NPU matches or exceeds GPU output quality (personality 3/3 @ 9.5/10, context retention 4/4 @ 9.8/10) at ~24 tok/s.

Per-Agent MCP Tool-Visibility Activations

Layered on the connectors framework, PR #1219 (issue #1005) splits connector control into two independent axes: grants (credential access, already shipped) and activations (which of a connector's MCP tools land in an agent's prompt). Previously, every granted connector surfaced all of its tools to every agent that held the grant — a ChatAgent with several MCP servers granted could carry ~30 extra tool descriptions in its system prompt, bloating context and degrading small-model tool selection. Activations default to off and are opt-in per (connector, agent) pair.

PR #1309 (issue #1226) closes the loop for non-UI writes: activation toggles from gaia connectors activations activate/deactivate and direct SDK calls now emit the same live connector.activation.changed SSE update the HTTP router already sent, so the Agent UI's "Active for" panel reflects CLI/SDK changes without a manual refresh.

Agent Hub TUI

Running gaia with no arguments now opens the Agent Hub — a terminal-native hub for discovering, searching, and launching GAIA agents (PR #1186). Previously the Go TUI only supported gaia chat --subprocess <binary>; now users get a full agent browser with a dashboard, fuzzy search, voting, and agent lifecycle management in a ~21MB standalone binary that starts in under 200ms.

Faster Email Agent — Batch Organize Tools

Bulk inbox work in the email agent was expensive: marking 9 emails read took ~13 LLM round-trips (~488s, ~12K tokens) because each tool operated on a single message ID, and parallel tool-call attempts hit a generic retry prompt that could loop until max_steps exhaustion. PR #1067 adds seven batch organize tools that reduce bulk operations to 2–3 steps (~30–60s, ~1.2K tokens) — roughly 10x faster and 10x cheaper. Parallel tool-call failures now get a targeted retry prompt, the --trace/--show_stats CLI flags pass through correctly, and a new force_llm config flag enables full LLM triage of every email.

PowerPoint (.pptx) Extraction for RAG

Uploading a .pptx previously told users to save it as PDF first. PR #1224 indexes PowerPoint natively — extracting text from shapes, tables, and speaker notes, with VLM analysis of embedded images when a vision model is available. The implementation mirrors the existing PDF pipeline (same VLMClient integration, [Page N] markers, merge strategy, and metadata structure) so downstream chunking and retrieval are unchanged. A zip-bomb guard checks uncompressed size before opening (500 MB limit), and WMF/EMF metafiles are skipped gracefully since PIL cannot decode them.

Bug Fixes

  • Corrupt-download misdiagnosis triggered a destructive re-download (PR #1300, closes #1294) — Ordinary model-load failures (resource limits, ctx_size, GPU/backend startup, port conflicts) all surface from Lemonade as "llama-server failed to start", and the classifier treated that generic string as file corruption. On a fresh install it sent first-boot into a destructive delete + ~25 GB re-download that couldn't fix the real problem. The bare failure is no longer mistaken for corruption — it surfaces as an actionable LemonadeClientError and the model cache is left intact.
  • First-boot dead-end on a genuinely corrupt model (PR #1302, closes #1293) — When the Agent UI backend detected a corrupt model on first boot it called input("[y/N]") inside the FastAPI lifespan threadpool, which has no TTY; input() raised EOFError and left users with a broken UI requiring a manual force-redownload. The repair path is now fully non-interactive in the boot context.
  • Symlink write-guard bypass on Python 3.10/3.11 (PR #1256) — Symlinks pointing into blocked directories (.ssh, C:\Windows, /etc, …) were not detected by is_write_blocked() on Python < 3.12. Surfaced by the new Python version matrix, the fix drops a redundant .resolve() so os.path.realpath is the single source of truth across versions.
  • Write guardrails extended to four unprotected file tools (PR #1188, closes #955) — write_python_file, write_markdown_file, and two more tools only had basic path checks; they now enforce the same validate_write() blocklist/size validation, pre-overwrite backups, and audit logging as write_file/edit_file.
  • Spinner clobbered interactive security prompts (PR #1208, issue #1089) — The CLI progress spinner kept writing on a background thread during path-access confirmation prompts, eating the first character of option labels (es / o / lways). The spinner is now paused before prompting.
  • gaia init failed on Arch/Fedora and crashed on Wayland (PR #1218) — gaia init hardcoded an add-apt-repository path that fails on non-Debian distros; it now skips the PPA install when a Lemonade server is already reachable, and disables the Chromium WaylandColorManagement feature to prevent a SIGTRAP crash on Wayland compositors.
  • TLS hostname preserved in pinned-IP HTTPS requests (PR #1209, issue #1207) — PinnedIPAdapter now carries the original hostname through for SNI/cert validation instead of validating against the pinned IP.
  • Agent UI memory API on random backend ports (PR #1257) — memoryApi now uses the dynamic API base so it works when the backend binds a non-default port.
  • Agent export no longer aborts on an unreadable directory (PR #1221) — Unreadable agent directories are skipped during export rather than failing the whole pass.
  • faiss AVX fallback log noise suppressed (PR #1222) — The AVX2/AVX-512 fallback chatter faiss prints on import is now quieted.

Tooling, Testing & CI

This release lands a large test-infrastructure and CI-hardening pass:

  • Codecov integration with coverage gates (PR #1245) — Unit-test runs now upload coverage.xml (py3.12 leg only) with a 60% project / 70% patch target so regressions surface before merge.
  • Python version matrix + macOS smoke lane (PR #1247) — CI now exercises Python 3.10/3.11/3.12 and a macOS smoke leg, with path-filter fixes; this matrix surfaced the symlink guard bug above.
  • New test coverage across the stack — Vitest + React Testing Library component infrastructure (PR #1249), llama.cpp backend integration paths (PR #1248), eval scorecard/audit/runner/judge (PR #1243), RoutingAgent/code validators/OpenAI provider (PR #1244), and doc code-example extraction + syntax validation (PR #1250).
  • Installer test hardening (PR #1251) — Artifact validation and scenario parametrization for the installer suite.
  • Post-publish PyPI smoke test (PR #1239) — The publish pipeline now installs the freshly published wheel from PyPI and verifies gaia --version and the console entry points.
  • Dependency review scanning (PR #1246) and stricter test workflows (PR #1240, which removes || true masking and adds timeouts + log uploads).
  • test_jira.py made collectable (PR #1241) and stale electron test assertions updated (PR #1210).
  • mypy errors resolved across the codebase (PRs #1253 and #1296).
  • Value-prop-first release notes via the gaia-release skill (PR #1330).
  • Installer repo-root resolution fixed (PRs #1326 and #1332) and .claude/launch.json symlink replaced with a repo-local definition (PR #1228).

Full Changelog

44 commits since v0.19.0:

Full Changelog: v0.19.0...v0.20.0


Release checklist

  • util/validate_release_notes.py docs/releases/v0.20.0.mdx passes
  • src/gaia/version.py0.20.0
  • src/gaia/apps/webui/package.json0.20.0
  • Navbar label in docs/docs.jsonv0.20.0 · Lemonade 10.2.0
  • All 44 commits in range (v0.19.0..HEAD) are represented in the notes
  • Review from @kovtcharov-amd addressed

@github-actions github-actions Bot added the documentation Documentation changes label Jun 1, 2026
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 1, 2026

Summary

This is a clean, well-executed release documentation PR that correctly bumps the version to 0.20.0 across all three required locations and ships accurate, value-prop-first release notes covering all 44 commits in the range. The notes follow GAIA's "lead with impact, not implementation" style consistently and the navigation wiring in docs/docs.json is correct.

Issues Found

🟢 Minor — One changelog entry lacks conventional-commits prefix (docs/releases/v0.20.0.mdx:154)

The Full Changelog entry for PR #1221 reads:

d05ddc52 — Skip unreadable agent dirs during export (#1221)

Every other entry follows type(scope): description format. This is the original commit message (this PR can't change it), so flagging it only for awareness — future commits should follow the convention.


🟢 Minor — Frontmatter description is 233 characters (docs/releases/v0.20.0.mdx:2)

Mintlify uses this field for SEO meta-description; most search engines truncate at ~160 characters. The v0.19.0 notes have a similarly long description (255 chars), so this is a project-wide pattern rather than an error. Trimming to ≤160 chars would improve SEO, but it's not blocking.

description: "Per-agent CPU/GPU/NPU selection, MCP tool-visibility activations, Agent Hub TUI, 10x faster email batch tools, native .pptx RAG, and a broad security and test-infrastructure hardening pass."

Strengths

  • Version consistencysrc/gaia/version.py, src/gaia/apps/webui/package.json, and the docs/docs.json navbar label are all bumped together; no drift between the three locations.
  • Accurate changelog coverage — the Full Changelog section accounts for all 44 commits in the v0.19.0..v0.20.0 range, including the two installers fixes (fix(installer): resolve repo root correctly in scripts under installer/ #1326, fix(installer): resolve repo root correctly in bash scripts under installer/ #1332) that landed late in the cycle.
  • Release notes prose quality — each section leads with the user-observable before/after state ("previously told users to save it as PDF first", "sent first-boot into a destructive delete + ~25 GB re-download"), with PR and issue links for every change, no Claude attribution anywhere, and no padded "what changed" enumeration.

Verdict

Approve. No blocking issues. The single actionable suggestion (trimming the frontmatter description) is optional. The PR is ready to merge.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment