---
title: "Completions API, new sandbox providers, and sandbox.env"
date: "2026-03-07"
---

## 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.

At the time of this release, the CLI's `fabro llm` commands could target the server instead of calling providers directly. That CLI namespace has since been removed.

## 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).

Daytona provides cloud sandbox VMs with full lifecycle support.

```toml title="run.toml"
[execution]
environment = "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.

```toml title="run.toml"
[sandbox.env]
API_KEY = "sk-..."
FEATURE_FLAG = "true"
```

<Warning>
**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.
</Warning>

<Warning>
**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
</Warning>

<Warning>
**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.
</Warning>

## More

<Accordion title="API">
- 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; the old `fabro llm chat` CLI wrapper has since been removed
- Verification API reorganized: `/verifications` split into `/verification/criteria` and `/verification/controls`
</Accordion>

<Accordion title="CLI">
- This release added `fabro llm prompt/chat --server-url`, but the `fabro llm` CLI namespace was later removed
- `fabro model list --server <target>` now fetches the model list from the Fabro 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
</Accordion>

<Accordion title="Workflows">
- `[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
</Accordion>

<Accordion title="Improvements">
- 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
</Accordion>

<Accordion title="Fixes">
- 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
</Accordion>
