Chains

Build and execute multi-step AI workflows with the SDK

Chains allow you to build complex multi-step AI workflows where outputs from one step feed into the next. Perfect for content pipelines, data processing, and complex reasoning tasks.

List Chains

const chains = await client.chains.list({
  mine: true,
  limit: 100
})

chains.forEach(chain => {
  console.log(`${chain.name} - ${chain.steps.length} steps`)
  console.log(`  Intent tags: ${chain.intentTags.join(', ')}`)
  console.log(`  Active: ${chain.isActive}`)
})

Get a Chain

const chain = await client.chains.get('chain-id')

console.log(chain.name)
console.log('Required inputs:', chain.requiredInputs)
console.log(`Steps: ${chain.steps.length}`)

chain.steps.forEach(step => {
  console.log(`  Step ${step.order}: ${step.type}`)
  console.log(`    Output key: ${step.outputKey}`)
})

Create a Chain

Create a new chain with required inputs defined as a JSON Schema.

const chain = await client.chains.create({
  name: 'content-pipeline',
  description: 'Generate, refine, and optimize content',

  // Intent tags for routing (required, minimum 1)
  intentTags: ['content', 'blog', 'writing'],

  // Define what inputs this chain needs
  requiredInputs: {
    type: 'object',
    properties: {
      topic: {
        type: 'string',
        description: 'Content topic'
      },
      audience: {
        type: 'string',
        description: 'Target audience'
      }
    },
    required: ['topic']
  },

  isActive: true  // Enable for routing
})

console.log(`Created chain: ${chain.id}`)
Intent tags are required and used by the routing system to match user queries to the right chain.

Add Steps to Chain

Build your workflow by adding steps. Each step can reference previous step outputs or the chain's initial input.

// Step 1: Generate outline
await client.chains.createStep(chain.id, {
  order: 0,
  type: 'PROMPT',
  promptId: 'outline-generator-id',

  // Map inputs using template syntax
  inputMapping: {
    topic: '{{input.topic}}',        // From chain input
    audience: '{{input.audience}}'    // From chain input
  },

  outputKey: 'outline'  // This step's output variable name
})

// Step 2: Write content based on outline
await client.chains.createStep(chain.id, {
  order: 1,
  type: 'PROMPT',
  promptId: 'content-writer-id',

  inputMapping: {
    outline: '{{outline}}',          // From step 1
    topic: '{{input.topic}}',        // From chain input
    audience: '{{input.audience}}'   // From chain input
  },

  outputKey: 'draft'
})

// Step 3: Polish and refine
await client.chains.createStep(chain.id, {
  order: 2,
  type: 'PROMPT',
  promptId: 'editor-id',

  inputMapping: {
    content: '{{draft}}'             // From step 2
  },

  outputKey: 'final_content'
})

Template Syntax

Use double curly braces to reference variables:

  • {{input.field_name}} - From chain's initial input
  • {{output_key}} - From previous step's output
The SDK automatically populates inputMapping based on prompt input schemas when you create steps through the UI.

Execute a Chain

Execute a chain with input data. The chain will run all steps in order and return the final output.

const result = await client.chains.execute('chain-id', {
  topic: 'The Future of AI in Healthcare',
  audience: 'Healthcare Professionals'
})

console.log('Final Output:')
console.log(result.output)
console.log()
console.log('Execution Metrics:')
console.log(`  Status: ${result.status}`)
console.log(`  Total Latency: ${result.latencyMs}ms`)
console.log(`  Total Cost: $${result.costUsd}`)
console.log()
console.log('Step-by-Step Results:')
result.steps.forEach(step => {
  console.log(`  Step ${step.order + 1}:`)
  console.log(`    Latency: ${step.latencyMs}ms`)
  console.log(`    Output: ${step.output.substring(0, 100)}...`)

  if (step.error) {
    console.log(`    Error: ${step.error}`)
  }
})

Update a Chain

const updated = await client.chains.update('chain-id', {
  name: 'improved-content-pipeline',
  description: 'Updated description',
  intentTags: ['content', 'blog', 'writing', 'marketing'],
  isActive: true,

  // Update required inputs schema
  requiredInputs: {
    type: 'object',
    properties: {
      topic: { type: 'string' },
      audience: { type: 'string' },
      tone: {
        type: 'string',
        enum: ['professional', 'casual', 'technical']
      }
    },
    required: ['topic']
  }
})

Delete a Chain

await client.chains.delete('chain-id')
console.log('Chain deleted')

Complete Example: Content Pipeline

import Prompt Forge from '@promptforge/sdk'

const client = new Prompt Forge({
  apiKey: process.env.PROMPTFORGE_API_KEY
})

async function createAndExecutePipeline() {
  // Create chain
  const chain = await client.chains.create({
    name: 'blog-post-pipeline',
    description: 'Complete blog post generation workflow',
    intentTags: ['blog', 'content', 'writing'],
    requiredInputs: {
      type: 'object',
      properties: {
        topic: { type: 'string' },
        keywords: { type: 'string' }
      },
      required: ['topic']
    }
  })

  // Add steps
  await client.chains.createStep(chain.id, {
    order: 0,
    type: 'PROMPT',
    promptId: 'research-prompt-id',
    inputMapping: {
      topic: '{{input.topic}}'
    },
    outputKey: 'research'
  })

  await client.chains.createStep(chain.id, {
    order: 1,
    type: 'PROMPT',
    promptId: 'outline-prompt-id',
    inputMapping: {
      topic: '{{input.topic}}',
      research: '{{research}}'
    },
    outputKey: 'outline'
  })

  await client.chains.createStep(chain.id, {
    order: 2,
    type: 'PROMPT',
    promptId: 'writer-prompt-id',
    inputMapping: {
      outline: '{{outline}}',
      keywords: '{{input.keywords}}'
    },
    outputKey: 'final'
  })

  // Execute chain
  const result = await client.chains.execute(chain.id, {
    topic: 'Best Practices for API Design',
    keywords: 'REST, GraphQL, versioning, documentation'
  })

  console.log('Generated Blog Post:')
  console.log(result.output)
  console.log(`\nTotal cost: $${result.costUsd}`)
  console.log(`Total time: ${result.latencyMs}ms`)
}

createAndExecutePipeline()

Next Steps