Conversation
SummaryClean, scope-tight release PR for v0.17.3: four files touched, exactly what a release bump requires — version in Issues FoundNone blocking. A couple of very minor observations: 🟢 Minor — external link to playbook uses an absolute site-relative path ( The link reads 🟢 Minor — "closes #451" appears in two places ( "closes #451" is repeated in both the Smarter PDF Handling section and the Bug Fixes bullet for the same PR. Harmless but slightly redundant in user-facing notes. Strengths
VerdictApprove. Ready to merge as-is. The two minor nits above are stylistic and not worth blocking a release PR over. |
GAIA v0.17.3 Release Notes
GAIA v0.17.3 is an extensibility and resilience release. You can now package your own agents into a custom GAIA installer and seed them on first launch, point GAIA at alternative OpenAI-compatible inference servers from the C++ library (Ollama, for example), and start from three new reference agents (weather, RAG Q&A, HTML mockup) that execute against real Lemonade hardware in CI. It also hardens the RAG cache against an insecure-deserialization class of bug (CWE-502) — all users should upgrade.
Why upgrade:
/v1base URLs instead of rewriting them to/api/v1, so servers that expose the standard/v1path (Ollama, for example) work out of the box.pickledeserialization with JSON + HMAC-SHA256 (CWE-502). Unsigned or tampered caches are rejected and transparently rebuilt on the next query.EncryptedPDFError,CorruptedPDFError) instead of generic failures, and the RAG index is hardened for concurrent queries.What's New
Custom Installers and Agent Portability
You can now package a custom GAIA installer that ships with your own agents pre-loaded, and move agents between machines with export/import (PR #795). On Windows, the official installer now includes the Lemonade Server MSI and runs it during install, so a fresh machine has the complete local-LLM stack after a single download (PR #781).
What you can do:
~/.gaia/agents/to a portable bundle withgaia agents exportand import it on another machine withgaia agents importdocs/playbooks/custom-installer/index.mdxto distribute GAIA with your agents pre-loaded — useful for workshops, team deployments, and internal toolingUnder the hood:
gaia agents export/gaia agents importCLI commands round-trip agents between machines as portable bundlessrc/gaia/apps/webui/services/agent-seeder.cjs) copies<resourcesPath>/agents/<id>/into~/.gaia/agents/<id>/the first time the app startslemonade-server-minimal.msiinto$PLUGINSDIRand runs it viamsiexec /i ... /qn /norestartduring install (auto-cleaned on exit)Broader Backend Compatibility in the C++ Library
The C++ library now preserves OpenAI-compatible
/v1base URLs (PR #773) instead of rewriting them to/api/v1. That means inference servers that expose the standard OpenAI/v1path — for example, Ollama athttp://localhost:11434/v1— work out of the box without needing a special adapter.Reference Agents and Real-Hardware Integration Tests
Three new example agents and a Strix-runner CI workflow land together (PR #340).
What you can do:
examples/weather_agent.py,examples/rag_doc_agent.py, orexamples/product_mockup_agent.pyas a starting point for your own agentsUnder the hood:
tests/integration/test_example_agents.pyexecutes agents and validates responses with a 5-minute-per-test timeout.github/workflows/test_examples.ymlruns on the self-hosted Strix runner (stxlabel) with Lemonade servingQwen3-4B-Instruct-2507-GGUFSmarter PDF Handling in RAG
Encrypted and corrupted PDFs now surface as distinct, actionable errors (
EncryptedPDFError,CorruptedPDFError,EmptyPDFError) instead of generic failures or silent 0-chunk indexes (PR #784, closes #451). Encrypted PDFs are detected before extraction; corrupted PDFs are caught during extraction with a clear message. Combined with the indexing-failure surfacing in PR #723, you get a visible indexing-failed status the moment a document fails — and the RAG index itself is now thread-safe under concurrent queries (PR #746).Security
RAG Cache Deserialization Replaced with JSON + HMAC
Fixes an insecure-deserialization issue in the RAG cache (CWE-502, PR #768). Previously, cached document indexes were serialized with Python
pickle; if an attacker could write to~/.gaia/— via a shared drive, a sync conflict, or a malicious extension — loading that cache could execute arbitrary code.v0.17.3 replaces
picklewith signed JSON: caches are now serialized as JSON and authenticated with HMAC-SHA256 using a per-install key stored at~/.gaia/cache/hmac.key. Unsigned or tampered caches are rejected and transparently rebuilt on the next query. Old.pklcaches from previous GAIA versions are ignored and re-indexed the next time you query a document.You should upgrade if you share
~/.gaia/across machines (Dropbox, iCloud, network home directories), run GAIA in a multi-user environment, or have ever imported RAG caches from another source.Bug Fixes
RuntimeErrorin the SDK and surfaces asindexing_status: failedin the UI, instead of looking like a silent success. Covers RAG SDK, background indexing, and re-index paths.EncryptedPDFErrorandCorruptedPDFErrorexceptions instead of generic failures, so you see exactly what went wrong.RLockprotection around index mutation paths and rebuilds chunk/index state atomically before publishing it, so concurrent queries read consistent snapshots and failed rebuilds no longer leak partial state.Invalid Request: expected JSON objectinstead of an HTTP 500 from aTypeError..appbundle inside the DMG now carries an ad-hoc signature, so Gatekeeper presents a single "Open Anyway" bypass in System Settings instead of the unrecoverable "is damaged" error. Full Apple Developer ID signing is still being finalized.Release & CI
publishenvironment gate governs PyPI, npm, and installer publishing.claude-code-actioncall sites tov1.0.99(pinned by SHA, fixes an issue-handler hang), bumped--max-turnsfrom 20 to 50 on bothpr-reviewandpr-commentfor deeper analysis, upgraded to Opus 4.7, standardized 23 subagent definitions with explicit when-to-use sections and tool allowlists, and added agent-builder tooling (manifest schema,lint.py --agents, BuilderAgent mixins).Docs
Full Changelog
21 commits since v0.17.2:
6d3f3f71— fix: replace misplaced decorative cursor with tracked terminal block cursor (fix: replace misplaced decorative cursor with tracked terminal block cursor #727)874cf2a3— fix: Ask Agent indexes and attaches files before sending to chat (fix: Ask Agent indexes and attaches files before sending to chat #725)4fa121e2— fix: surface document indexing failures instead of silent 0-chunk success (fix: surface document indexing failures instead of silent 0-chunk success #723)34b1d06e— fix(ci): ad-hoc sign macOS DMG instead of skipping code signing (fix(ci): ad-hoc sign macOS DMG instead of skipping code signing #765)7188b83c— Roadmap overhaul: milestone-aligned plans with voice-first P0 and 9 new plan documents (Roadmap overhaul: milestone-aligned plans with voice-first P0 and 9 new plan documents #710)1beddac5— cpp: support Ollama-compatible /v1 endpoints (cpp: support Ollama-compatible /v1 endpoints #773)cf9ac995— fix: harden rag index thread safety (fix: harden rag index thread safety #746)1c55c31b— fix(ci): remove legacy electron apps from publish, single approval gate (fix(ci): remove legacy electron apps from publish, single approval gate #758)52946a7a— feat(installer): bundle Lemonade Server MSI into Windows installer (Installer: Bundle Lemonade Server into GAIA installer #774) (feat(installer): bundle Lemonade Server MSI into Windows installer (#774) #781)e96b3686— ci(claude): review infra + conventions + subagent overhaul + agent-builder tooling (ci(claude): review infra + conventions + subagent overhaul + agent-builder tooling #783)058674b5— fix(rag): detect encrypted and corrupted PDFs with actionable errors (Handle password-protected and corrupted PDFs gracefully #451) (fix(rag): detect encrypted and corrupted PDFs with actionable errors (#451) #784)7bcb5d51— fix: replace insecure pickle deserialization with JSON + HMAC in RAG cache (CWE-502) (fix: replace insecure pickle deserialization with JSON + HMAC in RAG cache (CWE-502) #768)a5167e5f— fix: keep file-search count aligned with accessible results (fix: keep file-search count aligned with accessible results #754)da5ba458— ci(claude): migrate to claude-code-action v1.0.99 + fix issue-handler hang (ci(claude): migrate to claude-code-action v1.0.99 + fix issue-handler hang #797)03f546b9— ci(claude): bump pr-review and pr-comment --max-turns 20 -> 50 (ci(claude): bump pr-review and pr-comment --max-turns 20 -> 50 #799)4119d564— docs(faq): clarify data-privacy answer re: external LLM providers (docs(faq): clarify data-privacy answer re: external LLM providers #798)0cfbcf41— Add example agents and integration test workflow (Add example agents and integration test workflow #340)c4bd15fb— docs: fix drift between docs and source (docs review pass 1 + 2) (docs: fix drift between docs and source (docs review pass 1 + 2) #794)407ed5b8— docs(plans): add email triage agent spec (docs(plans): add email triage agent spec #796)06fb04a4— fix(mcp): guard JSON-RPC handler against non-dict body (fix(mcp): guard JSON-RPC handler against non-dict body #803)880ad603— feat(installer): custom installer guide, agent export/import, first-launch seeder (feat(installer): custom installer guide, agent export/import, first-launch seeder #795)Full Changelog: v0.17.2...v0.17.3
Release checklist
util/validate_release_notes.py docs/releases/v0.17.3.mdx --tag v0.17.3passessrc/gaia/version.py→0.17.3src/gaia/apps/webui/package.json→0.17.3docs/docs.json→v0.17.3 · Lemonade 10.0.0