AI Workflows

Build multi-step AI pipelines with sequential and parallel execution, variable passing between steps, and webhook notifications. Supports Anthropic, OpenAI, Gemini, Replicate, and more.

Create a Workflow

Define a multi-step AI pipeline with dependencies:

create-workflow.ts
import { Stack0 } from '@stack0/sdk'
const stack0 = new Stack0({
apiKey: process.env.STACK0_API_KEY!
})
const workflow = await stack0.workflows.create({
projectSlug: 'my-project',
slug: 'content-pipeline',
name: 'Content Generation Pipeline',
description: 'Generate blog posts with AI',
steps: [
{
id: 'generate-outline',
type: 'llm',
name: 'Generate Outline',
provider: 'anthropic',
model: 'claude-3-5-sonnet-20241022',
prompt: 'Create an outline for a blog post about {{topic}}',
outputVariable: 'outline',
},
{
id: 'write-content',
type: 'llm',
name: 'Write Content',
provider: 'openai',
model: 'gpt-4o',
prompt: 'Write a blog post based on this outline:\n\n{{steps.generate-outline.output}}',
dependsOn: ['generate-outline'],
outputVariable: 'content',
},
],
variables: {
topic: { type: 'string', required: true },
},
})

Run a Workflow

Execute a workflow with input variables:

run-workflow.ts
// Start workflow execution (async)
const run = await stack0.workflows.run({
projectSlug: 'my-project',
workflowId: 'workflow_abc123',
variables: {
topic: 'AI in Healthcare',
},
webhook: {
url: 'https://yourapp.com/webhook',
secret: 'your-webhook-secret',
},
metadata: {
userId: 'user_123',
},
})
console.log('Run ID:', run.id)
console.log('Status:', run.status)

Run and Wait

Execute a workflow and automatically wait for completion:

run-and-wait.ts
const result = await stack0.workflows.runAndWait({
projectSlug: 'my-project',
workflowId: 'workflow_abc123',
variables: {
topic: 'AI in Healthcare',
},
}, {
pollInterval: 2000,
timeout: 120000,
})
console.log('Status:', result.status)
console.log('Output:', result.output)
console.log('Duration:', result.totalDurationMs, 'ms')
console.log('Credits used:', result.creditsUsed)

Step Types

Available step types for building workflows:

TypeDescriptionProviders
llmText generation with AI modelsAnthropic, OpenAI, Gemini
imageImage generationReplicate, Stack0
videoVideo generationReplicate, Kling
audioAudio generationElevenLabs, Replicate
codeExecute custom code-
httpMake HTTP requests-
transformTransform data between steps-
conditionConditional branching-
loopIterate over arrays-

LLM Step Configuration

Configure text generation steps with AI models:

llm-step.ts
{
id: 'generate-summary',
type: 'llm',
name: 'Summarize Content',
provider: 'anthropic', // 'anthropic' | 'openai' | 'gemini'
model: 'claude-3-5-sonnet-20241022',
prompt: 'Summarize this content: {{content}}',
systemPrompt: 'You are a helpful assistant that creates concise summaries.',
temperature: 0.7,
maxTokens: 4096,
responseFormat: 'text', // 'text' | 'json'
dependsOn: ['previous-step'],
outputVariable: 'summary',
}

Image Generation Step

Generate images with AI models:

image-step.ts
{
id: 'generate-image',
type: 'image',
name: 'Generate Hero Image',
provider: 'replicate',
model: 'stability-ai/sdxl',
prompt: 'A futuristic city at sunset, high detail, photorealistic',
width: 1024,
height: 1024,
outputVariable: 'heroImage',
}

HTTP Step

Make HTTP requests to external APIs:

http-step.ts
{
id: 'fetch-data',
type: 'http',
name: 'Fetch External Data',
method: 'POST',
url: 'https://api.example.com/data',
headers: {
'Authorization': 'Bearer {{apiKey}}',
'Content-Type': 'application/json',
},
body: {
query: '{{searchQuery}}',
},
outputVariable: 'externalData',
}

Variable Interpolation

Use {{variable}} syntax to reference variables and step outputs:

variable-interpolation.ts
// Reference input variables
prompt: 'Write about {{topic}}'
// Reference step outputs
prompt: 'Expand on: {{steps.generate-outline.output}}'
// Reference nested data
prompt: 'Use this title: {{steps.generate-metadata.output.title}}'
// Reference arrays
prompt: 'Process these items: {{steps.fetch-data.output.items}}'

Get Run Status

Check the status of a workflow run:

get-run-status.ts
const run = await stack0.workflows.getRun({
projectSlug: 'my-project',
id: 'run_xyz789',
})
console.log('Status:', run.status)
console.log('Progress:', `${run.completedSteps}/${run.totalSteps}`)
// Check individual step states
for (const [stepId, state] of Object.entries(run.stepStates)) {
console.log(`${stepId}: ${state.status}`)
if (state.error) {
console.log(` Error: ${state.error}`)
}
}

List Runs

Query workflow runs with filters:

list-runs.ts
const { items, total, hasMore } = await stack0.workflows.listRuns({
projectSlug: 'my-project',
workflowId: 'workflow_abc123', // Optional: filter by workflow
status: 'completed', // 'pending' | 'running' | 'completed' | 'failed' | 'cancelled'
limit: 50,
offset: 0,
})
for (const run of items) {
console.log(`[${run.status}] ${run.id}`)
console.log(` Duration: ${run.totalDurationMs}ms`)
console.log(` Credits: ${run.creditsUsed}`)
}

Cancel Run

Cancel a running workflow:

cancel-run.ts
await stack0.workflows.cancelRun({
projectSlug: 'my-project',
id: 'run_xyz789',
})

Manage Workflows

List, update, and delete workflows:

manage-workflows.ts
// List workflows
const { workflows } = await stack0.workflows.list({
projectSlug: 'my-project',
limit: 20,
})
// Get a specific workflow
const workflow = await stack0.workflows.get({
projectSlug: 'my-project',
id: 'workflow_abc123',
})
// Update a workflow
await stack0.workflows.update({
projectSlug: 'my-project',
id: 'workflow_abc123',
name: 'Updated Pipeline Name',
isActive: true,
})
// Delete a workflow
await stack0.workflows.delete({
projectSlug: 'my-project',
id: 'workflow_abc123',
})

Webhook Events

Configure webhooks to receive workflow notifications:

webhook-payload.json
// Webhook payload example
{
"event": "run.completed",
"timestamp": "2025-01-15T10:30:00Z",
"data": {
"id": "run_xyz789",
"workflowId": "workflow_abc123",
"status": "completed",
"output": {
"outline": "1. Introduction...",
"content": "AI is transforming..."
},
"totalDurationMs": 12500,
"creditsUsed": 15
}
}
// Available events:
// - run.started
// - run.completed
// - run.failed
// - step.completed