Back to Rivet

Flue

website/src/content/docs/integrations/flue.mdx

2.3.94.9 KB
Original Source

import { Hosting } from "@/components/docs/Hosting";

{/* Sync policy: rivet-dev/agentos/examples/{flue,vercel-eve} are the source of truth. Before changing either integration, manually read both agentOS examples and guides and compare every hardcoded snippet in both Rivet guides: website/src/content/docs/integrations/{flue,vercel-eve}.mdx. Do not use CodeSnippet here: the source files live in another repository and importing them would couple Rivet's docs build to agentOS. Copy Flue code from rivet-dev/agentos/examples/flue and Eve code from rivet-dev/agentos/examples/vercel-eve. Update both repositories whenever either example changes. */}

<Info> This integration is in beta. APIs may change between releases. </Info>

Flue owns the agent runtime and session lifecycle. Rivet maps each agent instance and workflow run to a durable Rivet Actor, while agentOS gives each Flue context an isolated VM with a persistent /workspace filesystem.

View the complete example →

Quickstart

<Steps> <Step title="Create a Flue project">
sh
mkdir my-agent && cd my-agent
npm init -y
npm pkg set type=module

# Install the Flue packages
npm add "@flue/runtime@npm:@rivet-dev/[email protected]"
npm add --save-dev "@flue/cli@npm:@rivet-dev/[email protected]"

# Install the Rivet packages
npm add @rivet-dev/flue @rivet-dev/agentos @rivet-dev/agentos-flue rivetkit

# Initialize the project
npx flue init --target node
  • @flue/cli and @flue/runtime: Build and run the Flue project using Rivet's preview Flue packages.
  • @rivet-dev/flue: Runs Flue agents and workflows as Rivet Actors.
  • @rivet-dev/agentos and @rivet-dev/agentos-flue: Provide the agentOS VM and connect Flue's sandbox API to it.

This uses Rivet's Flue fork. We're working to merge its extension APIs upstream so Flue can support actor-model runtimes without a Rivet fork.

</Step> <Step title="Register agentOS with the Rivet target">

Create actors.ts:

ts
import { agentOS, setup } from "@rivet-dev/agentos";

const vm = agentOS({
	// Configure software, permissions, mounts, and resource limits here.
});

export const registry = setup({ use: { vm } });

Update flue.config.ts:

ts
import { defineConfig } from "@flue/cli/config";
import { rivet } from "@rivet-dev/flue";

export default defineConfig({
	target: rivet(),
});
</Step> <Step title="Use agentOS as the Flue sandbox">

Create agents/assistant.ts:

ts
import { createAgent } from "@flue/runtime";
import { agentOSSandbox } from "@rivet-dev/agentos-flue";
import { registry } from "../actors.js";

export default createAgent(() => ({
	model: "anthropic/claude-sonnet-5",
	sandbox: agentOSSandbox({ actor: "vm", registry }),
}));
</Step> <Step title="Run Flue">

Set the provider key required by your model, such as ANTHROPIC_API_KEY, in .env.

Run the agent:

sh
npx flue run assistant --id local \
  --input '{"message":"Write hello from Flue to /workspace/hello.txt, run wc -c /workspace/hello.txt, then read the file back."}'
</Step> <Step title="Deploy">

Deploy to one of the supported platforms:

<Hosting /> </Step> </Steps>

Runtime model

Each Flue agent instance and workflow run has its own Rivet Actor and SQLite database. Direct prompts and dispatch() inputs use the same durable admission path, so accepted work can recover after interruption.

Normal agent and workflow requests return their 202 receipt after persisting the admission, its canonical input event, and a recovery alarm. Rivet then owns the turn as background work through c.keepAwake(...); the caller does not remain attached while the model or workflow runs. Workflow requests with ?wait=result are the explicit exception and stay open until the result is available.

The agentOS adapter derives a stable VM actor key from the Flue context ID. Reusing a context reconnects to the same durable /workspace filesystem.

<Note> agentOS does not support Cloudflare Workers yet. It works with Node.js, Bun, or Deno on platforms such as Railway, Kubernetes, or Vercel. </Note>

Configuration

rivet() accepts an optional actors module path, defaulting to ./actors.ts. That module must export a registry created with setup(); the target adds its generated actors to that registry.

agentOSSandbox() accepts:

OptionRequiredDescription
actorYesagentOS actor name from the registry, such as vm.
registryYesThe same application registry exported from actors.ts.
paramsNoParameters passed when connecting to a new agentOS actor.
cwdNoSandbox working directory. Defaults to /workspace.
clientNoExisting client configured for the same registry.

Read the agentOS + Flue documentation →