Skip to content

Orchestration Adapters

Adapters decide where orchestration runs execute and how durable they are. Task and workflow definitions do not change when you switch adapters.

Use createMemoryAdapter() when you want:

  • no external infrastructure
  • fast local development
  • lightweight tests

Tradeoffs:

  • no durability across process restarts
  • no cross-process coordination
const adapter = createMemoryAdapter({ concurrency: 10 });

Use createSqliteAdapter() when you want:

  • durable local or single-node execution
  • restart recovery without Redis
  • persistent run and step state

Tradeoffs:

  • still a single-process or single-node shape
  • not the right fit for distributed worker fleets
const adapter = createSqliteAdapter({
path: './data/orchestration.db',
concurrency: 10,
});

Use createBullMQOrchestrationAdapter() when you want:

  • Redis-backed durability
  • repeatable schedules
  • BullMQ workers and queues
  • progress updates through QueueEvents

Tradeoffs:

  • requires Redis
  • signals are not supported
  • you now operate queue infrastructure
import { createBullMQOrchestrationAdapter } from '@lastshotlabs/slingshot-orchestration-bullmq';
const adapter = createBullMQOrchestrationAdapter({
connection: { host: '127.0.0.1', port: 6379 },
prefix: 'orch',
concurrency: 10,
});

When used through createOrchestrationPackage(), the plugin starts and shuts down the adapter for you. When used directly through createOrchestrationRuntime(), the adapter now lazily starts on first use, so runTask() / runWorkflow() do not require a separate manual start() call.

Use createTemporalOrchestrationAdapter() from @lastshotlabs/slingshot-orchestration-temporal when you want:

  • distributed workers across multiple machines
  • durable workflow history, timers, retries, and signals
  • Temporal-native scheduling and visibility
  • Slingshot task/workflow definitions running on a real Temporal cluster

Tradeoffs:

  • requires an existing Temporal service or Temporal Cloud namespace
  • requires a separate Node-based worker process
  • operationally heavier than SQLite or BullMQ
import { Client, Connection } from '@temporalio/client';
import { createTemporalOrchestrationAdapter } from '@lastshotlabs/slingshot-orchestration-temporal';
const connection = await Connection.connect({ address: 'localhost:7233' });
const client = new Client({ connection, namespace: 'default' });
const adapter = createTemporalOrchestrationAdapter({
client,
connection,
namespace: 'default',
workflowTaskQueue: 'slingshot-workflows',
defaultActivityTaskQueue: 'slingshot-activities',
ownsConnection: false,
});

Temporal worker processes are separate from the HTTP server. For real deployments, pair the adapter with createTemporalOrchestrationWorker() so workflow code and activity handlers can poll the configured task queues.

CapabilityMemorySQLiteBullMQTemporal
Core executionYesYesYesYes
SchedulingNoNoYesYes
Run listingYesYesYesYes
Progress subscriptionsYesYesYesYes
SignalsNoNoNoYes

These providers are planned but not shipped in the current worktree:

  • Trigger.dev
  • Step Functions

If you need those today, the answer is still “not implemented”, not “hidden behind a flag”.