Skip to main content

Completions API with SSE streaming

Fabro now exposes a POST /completions endpoint for single-turn LLM completions. You can use it for structured output via JSON Schema, one-off prompts, or building custom frontends on top of Fabro’s model routing. Streaming uses Anthropic-style SSE events (message_start, content_block_delta, message_stop, etc.), so you get tokens as they’re generated rather than waiting for the full response. The CLI’s fabro llm commands can now target the server instead of calling providers directly:
fabro llm prompt "Summarize this file" --mode server
fabro llm chat --mode server

Two new sandbox providers: exe.dev and Sprites

Fabro now supports three sandbox environments for running agent stages. In addition to Daytona, you can now use exe.dev VMs or Sprites (powered by Fly.io). exe.dev (beta) manages ephemeral VMs through SSH with separate management and data plane connections. Sprites uses the sprite CLI to provision Fly.io VMs with full sandbox lifecycle support.
run.toml
[execution]
environment = "exe"    # or "sprites" or "daytona"

Sandbox environment variables

You can now pass environment variables to sandboxes directly from your workflow config using the new [sandbox.env] section. This is useful for passing API keys, feature flags, or other configuration that agents need inside the sandbox — without baking them into Dockerfiles or snapshot images.
run.toml
[sandbox.env]
API_KEY = "sk-..."
FEATURE_FLAG = "true"
CLI commands renamed. fabro agent is now fabro exec and fabro models is now fabro model.To migrate, update any scripts or aliases that reference the old command names.
Verification API paths have changed. /verifications is now split into /verification/criteria and /verification/controls. The run sub-resource moved from /runs/{id}/verifications to /runs/{id}/verification.To migrate:
  1. Regenerate your TypeScript client: cd lib/packages/fabro-api-client && bun run generate
  2. Update any direct API calls to use the new paths
Removed API endpoints. The following endpoints have been removed:
  • GET /projects and GET /projects/{name}/branches — projects and branches are no longer exposed via the API
  • POST /workflows/{name}/runs — use POST /runs instead (identical functionality)
To migrate, regenerate your TypeScript client and update any direct API calls.

More

  • New POST /completions endpoint for single-turn LLM completions with SSE streaming and structured output via JSON Schema
  • New GET /models endpoint exposes the full LLM model catalog with pagination
  • New POST /models/{id}/test endpoint for testing model connectivity in server mode
  • Session endpoints for interactive LLM chat via fabro llm chat --mode server
  • Verification API reorganized: /verifications split into /verification/criteria and /verification/controls
  • fabro llm prompt --mode server routes prompts through the Fabro server
  • fabro llm chat --mode server enables interactive chat sessions through the server
  • fabro model list --mode standalone|server controls whether model list comes from local config or server
  • Added --goal arg to fabro run start to override the workflow goal from the command line
  • Turn and tool-call counts now display correctly in non-TTY mode
  • [sandbox.env] passes environment variables from workflow config to sandbox execution
  • project_memory attribute for prompt nodes provides persistent context across turns
  • @file references in DOT prompts are now inlined at prepare time, including untracked files
  • dockerfile = { path = "..." } in snapshot config lets you specify a custom Dockerfile location
  • Checkpoint exclude globs skip bulky artifacts from git checkpoint commits
  • Metadata branch pushed to origin after checkpoint in Remote (Daytona) mode
  • Stage logs now stream in real-time while CLI agents are working
  • Sub-workflow context diffs no longer leak child engine-internal keys into the parent run
  • Configurable git author identity for checkpoint commits via [git.author] in config
  • Auto-install agent CLIs (like claude or codex) in sandboxes at runtime when missing
  • Default OpenAI model upgraded from gpt-5.3 to gpt-5.4
  • New models added to catalog: gpt-5.3-codex-spark and claude-sonnet-4-6
  • apply_patch parser now accepts bare @@ hunk headers (compatibility with GPT-5.4 output)
  • imagegen tool for Gemini-based image generation
  • Fixed stall watchdog killing agents during long LLM reasoning turns — streaming events now correctly reset the timer
  • Fixed OpenAI reasoning SSE events being silently swallowed, causing stall watchdog to fire during extended reasoning phases
  • Fixed orphaned OpenAI reasoning items after context compaction causing “item provided without required following item” errors
  • Fixed push credentials for public repos in Daytona sandboxes
  • Fixed Daytona CLI installation with rootless Node.js install and better error messages