fleet-rlm v0.6.2
Released 2026-06-29.
Added
- Change: Added bring-your-own-key (BYOK) LLM provider profiles scoped per
tenant/user in hostedAUTH_MODE=neon, with Fernet-at-rest encryption of API
keys viaFLEET_SECRET_ENCRYPTION_KEYandhas_api_key/ masked-preview-only
responses.
Outcome: Hosted users can bind their own planner/delegate LLM credentials
without leaking plaintext to the API surface or mutating process environment. - Change: Added per-workspace encrypted
DAYTONA_*credential persistence
(workspace_runtime_settings) so each workspace can run Daytona sandboxes
under its own API key in hosted mode.
Outcome: Chat and runtime paths resolve a per-user Daytona config before
falling back to the server-level env default. - Change: Added
DSPY_LM_CUSTOM_PROVIDER/DSPY_DELEGATE_LM_CUSTOM_PROVIDER
opt-in env vars that pass an explicitcustom_llm_providerhint to litellm.
Outcome: OpenAI-compatible bare-model endpoints can opt into theopenai
hint without forcing it on non-OpenAI providers like Anthropic. - Change: Added a
skippedfield toPATCH /api/v1/runtime/settings
responses listing masked-round-trip keys that were intentionally not persisted.
Outcome: Clients can distinguish persisted keys (updated) from skipped
masked/empty round-trips instead of being told a no-op save landed. - Change: Added Alembic migrations scoping
llm_role_bindingsto users
(PKidUUID +tenant_id/user_id/workspace_id), hardening Neon auth
tables, identity constraints, execution-step indexes, and tightening the
workspace_runtime_settingsunique constraint to(tenant_id, workspace_id).
Outcome: Profile/role-binding tables are tenant/user-isolated and the
workspace-settings upsert target is tenant-aware.
Changed
- Change: Clarified that
litellmis installed only as DSPy's transitive
dependency — it is no longer listed in[project].dependencies(it never
was, but the policy is now mechanically enforced). The
[tool.uv].override-dependenciespinlitellm>=1.87.0remains the
mechanism closing 7 documented CVEs.
Outcome:tests/unit/test_litellm_invariant.pynow parses
pyproject.tomlviatomlliband fails iflitellmis ever re-added to
direct deps or removed from the override pin. - Change: Pinned
fastapi[standard]exactly to==0.139.0(latest PyPI
release, Jul 1 2026) instead of the prior>=0.138.2floor, and re-locked
uv.lockaccordingly.
Outcome: Installs are reproducible on the current validated FastAPI
release instead of floating forward unpredictably. - Change: Rewrote
README.mdwith a tighter structure, updated feature
list, current 0.6.2 product surfaces, and refreshed quickstart/validation
commands.
Outcome: Onboarding reflects the actual routed surfaces
(/app/workspace,/app/optimization,/app/volumes,/app/settings)
and the currentmake/pnpmvalidation lanes. - Change: Updated
docs/SUMMARY.mdanddocs/index.mdto surface the
DSPy optimization/evaluation, releasing, and RLM capability-evaluation
pages that were present on disk but missing from the table of contents.
Outcome: The docs TOC matches the on-disk doc set. - Change: Reworked
PATCH /api/v1/runtime/settingsso hosted
AUTH_MODE=neon(BYOK routing) persistsDAYTONA_*keys per-workspace as
encrypted ciphertext instead of returning403; non-Daytona keys remain
local-only.
Outcome: Hosted workspaces can save their own Daytona credentials while
the rest of the runtime settings surface stays locked down. - Change:
GET /api/v1/runtime/settingsnow logs (without leaking values)
when a storedDAYTONA_API_KEYfails to decrypt, and the PATCH path treats an
empty incoming value for a key with an existing stored credential as a no-op.
Outcome: Decrypt failures are observable instead of silent, and a failed
GET no longer enables an empty save that wipes the stored key. - Change: Upgraded a comprehensive set of direct, optional, and dev dependencies in
pyproject.tomlto their latest stable 2026 semver floors. This includes bumpingpypdf(>=6.13.3),typer(>=0.26.7,<1),rich(>=15.0.0,<16),sqlalchemy[asyncio](>=2.0.51,<3),sqlmodel(>=0.0.39),tomli(>=2.4.1),fastapi[standard](>=0.138.1),opentelemetry-exporter-otlp-proto-grpc(>=1.42.1),posthog(>=7.21.0),alembic(>=1.18.5,<2),pytest(>=9.1.1),ruff(>=0.15.20), andty(>=0.0.50), while keepingcryptographycompatible withmlflow's strict upper bounds.
Outcome: The workspace benefits from modern security patches, performance gains, and library robust alignment across all backend and CLI layers. - Change: Bumped the
litellmoverride-dependency floor to>=1.87.0to resolve critical vulnerabilities and ensure secure API proxy integration.
Outcome: Built-in model orchestration maintains secure, up-to-date Litellm clients for core workspace tasks.
Removed
- Change: Deleted the legacy tracked
plan/planning directory (old
phase-planning markdown and notebooks that were gitignored but
force-tracked) and the ephemeraldspy-review-report.mdreport.
Outcome: The repo root no longer carries stale phase-planning artifacts
or one-off review reports; neither path was referenced by docs, AGENTS, or
source.
Fixed
- Change: Made legacy XOR-encrypted profile ciphertext backward-compatible
withFLEET_SECRET_ENCRYPTION_KEYrotation by trying candidate secrets
(FLEET_SECRET_ENCRYPTION_KEY,DEV_JWT_SECRET,change-me) on decrypt.
Outcome: SettingFLEET_SECRET_ENCRYPTION_KEYno longer renders pre-existing
BYOK profile keys undecryptable; old rows continue to decrypt until re-encrypted
to thefernet:format. - Change: Removed the in-place mutation of the shared
LmDeps.planner_lm
singleton from the/runtime/tests/lmBYOK smoke test; the per-user planner
is now invoked directly.
Outcome: A connectivity test can no longer swap another user's in-flight
chat onto a foreign BYOK LM (cross-tenant credential leak) — shared state is
never touched. - Change: Stopped forcing
custom_llm_provider="openai"for every bare model
with anapi_baseon the env-based LM path; the hint is now opt-in via
DSPY_LM_CUSTOM_PROVIDER.
Outcome: Env configs pointing at non-OpenAI-compatible providers (e.g.
Anthropic) no longer send OpenAI-format requests and 400. - Change: Tightened
upsert_workspace_runtime_settingto conflict on
(tenant_id, workspace_id)with a matching unique constraint.
Outcome: The workspace-settings upsert is tenant-aware (defense-in-depth
alongside the existing composite FK and UUID-v7 defaults).
Installation
pip install fleet-rlm==0.6.2