Skip to content

Release v0.6.2

Latest

Choose a tag to compare

@github-actions github-actions released this 03 Jul 17:30

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 hosted AUTH_MODE=neon, with Fernet-at-rest encryption of API
    keys via FLEET_SECRET_ENCRYPTION_KEY and has_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 explicit custom_llm_provider hint to litellm.
    Outcome: OpenAI-compatible bare-model endpoints can opt into the openai
    hint without forcing it on non-OpenAI providers like Anthropic.
  • Change: Added a skipped field to PATCH /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_bindings to users
    (PK id UUID + tenant_id/user_id/workspace_id), hardening Neon auth
    tables, identity constraints, execution-step indexes, and tightening the
    workspace_runtime_settings unique 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 litellm is 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-dependencies pin litellm>=1.87.0 remains the
    mechanism closing 7 documented CVEs.
    Outcome: tests/unit/test_litellm_invariant.py now parses
    pyproject.toml via tomllib and fails if litellm is 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.2 floor, and re-locked
    uv.lock accordingly.
    Outcome: Installs are reproducible on the current validated FastAPI
    release instead of floating forward unpredictably.
  • Change: Rewrote README.md with 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 current make/pnpm validation lanes.
  • Change: Updated docs/SUMMARY.md and docs/index.md to 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/settings so hosted
    AUTH_MODE=neon (BYOK routing) persists DAYTONA_* keys per-workspace as
    encrypted ciphertext instead of returning 403; 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/settings now logs (without leaking values)
    when a stored DAYTONA_API_KEY fails 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.toml to their latest stable 2026 semver floors. This includes bumping pypdf (>=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), and ty (>=0.0.50), while keeping cryptography compatible with mlflow'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 litellm override-dependency floor to >=1.87.0 to 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 ephemeral dspy-review-report.md report.
    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
    with FLEET_SECRET_ENCRYPTION_KEY rotation by trying candidate secrets
    (FLEET_SECRET_ENCRYPTION_KEY, DEV_JWT_SECRET, change-me) on decrypt.
    Outcome: Setting FLEET_SECRET_ENCRYPTION_KEY no longer renders pre-existing
    BYOK profile keys undecryptable; old rows continue to decrypt until re-encrypted
    to the fernet: format.
  • Change: Removed the in-place mutation of the shared LmDeps.planner_lm
    singleton from the /runtime/tests/lm BYOK 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 an api_base on 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_setting to 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