> ## Documentation Index
> Fetch the complete documentation index at: https://docs.fabro.sh/llms.txt
> Use this file to discover all available pages before exploring further.

# Completions API, new sandbox providers, and sandbox.env

## 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" theme={"languages":{"custom":["/languages/dot.json","/languages/fabro.json"]}}
[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" theme={"languages":{"custom":["/languages/dot.json","/languages/fabro.json"]}}
[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>
