concept ~19 min
Pipeline Context Integration

- [What is Pipeline Context?](#what-is-pipeline-context)

Pipeline Context Integration

Table of Contents

TPipe enables pipes to share context within a pipeline through the pipeline’s shared context window. This allows pipes to build upon each other’s results and maintain context continuity throughout multi-stage processing.

What is Pipeline Context?

Pipeline context is a shared ContextWindow that belongs to the pipeline itself:

class Pipeline {
    var context = ContextWindow()  // Shared across all pipes in pipeline
}

Purpose:

  • Context continuity: Maintain context across pipeline stages
  • Result sharing: Pass processed information between pipes
  • Cumulative learning: Build context as pipeline progresses
  • Stage coordination: Enable pipes to work together on complex tasks

Pipeline Context

val pipe = BedrockPipe()
    .pullPipelineContext()  // Pulls from parent pipeline

Characteristics:

  • Shared only within the current pipeline
  • Exists for the duration of pipeline execution
  • Accumulates results from previous pipes
  • Good for stage-to-stage data flow

Context Sources

TPipe supports multiple context sources that can be used together:

  • Pipeline context - pullPipelineContext() - Shared context within the current pipeline
  • Global context - pullGlobalContext() - Persistent context from ContextBank
  • Page-specific context - setPageKey() - Organized global context retrieval

Non-Exclusive Context Behavior

Both global and pipeline context can be enabled simultaneously. When both are active:

  • Pipeline context provides the base context from previous pipeline stages
  • Global context is merged with pipeline context, adding additional information
  • Page keys organize global context into specific sections
val pipe = BedrockPipe()
    .pullGlobalContext()      // Pulls from ContextBank
    .setPageKey("userData")   // Specific global context page
    .pullPipelineContext()    // Also pulls pipeline context - both are used together

Pulling Pipeline Context

Basic Pipeline Context Access

val pipe = BedrockPipe()
    .pullPipelineContext()  // Enable pipeline context retrieval
    .autoInjectContext("Use the pipeline context data from previous processing stages.")

What this does:

  • Retrieves the current pipeline’s context window
  • Includes all context accumulated by previous pipes
  • Provides access to results from earlier pipeline stages

Pipeline Context with Processing

val analysisPipe = BedrockPipe()
    .setSystemPrompt("Analyze the input and extract key information.")
    .setTransformationFunction { content ->
        // Store analysis results in pipe's context
        content.context.addLoreBookEntry("analysis", content.text, weight = 10)
        content.context.contextElements.add("Analysis completed at ${System.currentTimeMillis()}")
        content
    }
    .updatePipelineContextOnExit()  // Push context to pipeline

val generationPipe = BedrockPipe()
    .pullPipelineContext()  // Pull analysis results
    .autoInjectContext("Use the analysis results from the previous stage.")
    .setSystemPrompt("Generate content based on the analysis provided.")

val pipeline = Pipeline()
    .add(analysisPipe)    // Stage 1: Analysis
    .add(generationPipe)  // Stage 2: Generation (uses analysis results)

Updating Pipeline Context

Automatic Context Updates

val pipe = BedrockPipe()
    .pullPipelineContext()
    .updatePipelineContextOnExit()  // Automatically merge context back to pipeline
    .setTransformationFunction { content ->
        // Modify context during processing
        content.context.addLoreBookEntry("processedData", content.text, weight = 8)
        content.context.contextElements.add("Processing stage completed")
        content
    }

What updatePipelineContextOnExit() does:

  • Merges the pipe’s context back into the pipeline context
  • Happens after successful pipe execution
  • Includes any modifications made during processing
  • Makes results available to subsequent pipes

Manual Context Updates

val pipe = BedrockPipe()
    .pullPipelineContext()
    .setTransformationFunction { content ->
        // Manually update pipeline context
        val pipeline = getCurrentPipeline()  // Hypothetical method
        pipeline.context.merge(content.context)
        
        content
    }

Context Flow Patterns

Sequential Processing with Context Accumulation

// Stage 1: Input processing
val inputProcessor = BedrockPipe()
    .setSystemPrompt("Process and clean the input data.")
    .setTransformationFunction { content ->
        val cleanedData = cleanInput(content.text)
        content.context.addLoreBookEntry("cleanedInput", cleanedData, weight = 5)
        content.context.contextElements.add("Input processing completed")
        content.text = cleanedData
        content
    }
    .updatePipelineContextOnExit()

// Stage 2: Analysis using cleaned input
val analyzer = BedrockPipe()
    .pullPipelineContext()  // Gets cleaned input from stage 1
    .autoInjectContext("Use the cleaned input data for analysis.")
    .setSystemPrompt("Analyze the cleaned data and extract insights.")
    .setTransformationFunction { content ->
        val insights = extractInsights(content.text)
        content.context.addLoreBookEntry("insights", insights, weight = 8)
        content.context.contextElements.add("Analysis completed")
        content.text = insights
        content
    }
    .updatePipelineContextOnExit()

// Stage 3: Report generation using all previous results
val reportGenerator = BedrockPipe()
    .pullPipelineContext()  // Gets cleaned input + insights
    .autoInjectContext("Use all previous processing results to generate a comprehensive report.")
    .setSystemPrompt("Generate a detailed report based on the analysis.")

val pipeline = Pipeline()
    .add(inputProcessor)   // Adds cleaned input to context
    .add(analyzer)         // Adds insights to context  
    .add(reportGenerator)  // Uses all accumulated context

Conditional Context Flow

val conditionalProcessor = BedrockPipe()
    .pullPipelineContext()
    .setPreValidationFunction { contextWindow, content ->
        // Modify context based on previous pipeline results
        val previousResults = contextWindow.loreBookKeys["analysis"]?.value ?: ""
        
        if (previousResults.contains("complex")) {
            // Add additional context for complex cases
            val additionalContext = ContextBank.getContextFromBank("complexProcessingRules")
            contextWindow.merge(additionalContext)
        }
        
        contextWindow
    }
    .autoInjectContext("Use pipeline context and any additional context based on complexity.")

Context Validation and Correction

val validationPipe = BedrockPipe()
    .pullPipelineContext()
    .setValidatorFunction { content ->
        // Validate using pipeline context
        val previousAnalysis = content.context.loreBookKeys["analysis"]?.value ?: ""
        val currentResult = content.text
        
        val isConsistent = validateConsistency(previousAnalysis, currentResult)
        
        if (!isConsistent) {
            // Add correction context
            content.context.contextElements.add("Inconsistency detected, correction needed")
            content.repeat()  // Retry with correction context
            return@setValidatorFunction false
        }
        
        true
    }
    .updatePipelineContextOnExit()

Advanced Pipeline Context Patterns

Multi-Branch Context Merging

// Branch A: Technical analysis
val technicalAnalysis = BedrockPipe()
    .setSystemPrompt("Perform technical analysis.")
    .setTransformationFunction { content ->
        content.context.addLoreBookEntry("technicalAnalysis", content.text, weight = 7)
        content
    }
    .updatePipelineContextOnExit()

// Branch B: Business analysis  
val businessAnalysis = BedrockPipe()
    .setSystemPrompt("Perform business analysis.")
    .setTransformationFunction { content ->
        content.context.addLoreBookEntry("businessAnalysis", content.text, weight = 7)
        content
    }
    .updatePipelineContextOnExit()

// Merger: Combines both analyses
val analysisMerger = BedrockPipe()
    .pullPipelineContext()  // Gets both technical and business analysis
    .autoInjectContext("Combine the technical and business analyses.")
    .setSystemPrompt("Create a comprehensive analysis combining technical and business perspectives.")

// Note: This would require pipeline branching/merging capabilities

Context-Driven Pipeline Routing

val routingPipe = BedrockPipe()
    .pullPipelineContext()
    .setValidatorFunction { content ->
        val pipelineContext = content.context
        val analysisType = pipelineContext.loreBookKeys["analysisType"]?.value ?: ""
        
        when (analysisType) {
            "technical" -> {
                content.jumpToPipe("technicalProcessor")
                false
            }
            "business" -> {
                content.jumpToPipe("businessProcessor")
                false
            }
            "comprehensive" -> {
                content.jumpToPipe("comprehensiveProcessor")
                false
            }
            else -> true  // Continue normal flow
        }
    }

Context Cleanup and Optimization

val contextOptimizer = BedrockPipe()
    .pullPipelineContext()
    .setPreValidationFunction { contextWindow, content ->
        // Clean up and optimize context before final processing
        
        // Remove low-weight entries
        contextWindow.loreBookKeys.values.removeIf { it.weight < 5 }
        
        // Limit context elements to most recent
        if (contextWindow.contextElements.size > 10) {
            contextWindow.contextElements = contextWindow.contextElements.takeLast(10).toMutableList()
        }
        
        // Merge duplicate entries
        contextWindow.contextElements = contextWindow.contextElements.distinct().toMutableList()
        
        contextWindow
    }
    .autoInjectContext("Use the optimized pipeline context.")

Practical Examples

Document Processing Pipeline

val documentPipeline = Pipeline()
    .add(BedrockPipe()
        .setSystemPrompt("Extract document metadata and structure.")
        .setTransformationFunction { content ->
            val metadata = extractMetadata(content.text)
            content.context.addLoreBookEntry("documentMetadata", metadata, weight = 10)
            content.context.contextElements.add("Document type: ${getDocumentType(metadata)}")
            content
        }
        .updatePipelineContextOnExit()
    )
    .add(BedrockPipe()
        .pullPipelineContext()
        .autoInjectContext("Use document metadata for content analysis.")
        .setSystemPrompt("Analyze document content based on its type and structure.")
        .setTransformationFunction { content ->
            val analysis = analyzeContent(content.text)
            content.context.addLoreBookEntry("contentAnalysis", analysis, weight = 9)
            content
        }
        .updatePipelineContextOnExit()
    )
    .add(BedrockPipe()
        .pullPipelineContext()
        .autoInjectContext("Use metadata and analysis for summary generation.")
        .setSystemPrompt("Generate a comprehensive summary using all available information.")
    )

Multi-Stage Validation Pipeline

val validationPipeline = Pipeline()
    .add(BedrockPipe()
        .setSystemPrompt("Perform initial content validation.")
        .setTransformationFunction { content ->
            val validationResults = performInitialValidation(content.text)
            content.context.addLoreBookEntry("initialValidation", validationResults, weight = 8)
            content.context.contextElements.add("Initial validation completed")
            content
        }
        .updatePipelineContextOnExit()
    )
    .add(BedrockPipe()
        .pullPipelineContext()
        .autoInjectContext("Use initial validation results for detailed analysis.")
        .setSystemPrompt("Perform detailed validation based on initial results.")
        .setValidatorFunction { content ->
            val initialResults = content.context.loreBookKeys["initialValidation"]?.value ?: ""
            val detailedResults = content.text
            
            validateConsistency(initialResults, detailedResults)
        }
        .updatePipelineContextOnExit()
    )
    .add(BedrockPipe()
        .pullPipelineContext()
        .autoInjectContext("Use all validation results for final assessment.")
        .setSystemPrompt("Provide final validation assessment and recommendations.")
    )

Multi-Context Game Pipeline with MiniBank

val gamePipeline = Pipeline()
    .add(BedrockPipe()
        .setSystemPrompt("Process player action and update game state.")
        .pullPipelineContext()
        .setPageKey("playerStats, worldState, inventory, questLog")
        .setTransformationFunction { content ->
            val miniBank = content.workspaceContext
            val action = extractPlayerAction(content.text)
            
            // Update different context pages based on action
            when (action.type) {
                "move" -> {
                    miniBank.contextMap["playerStats"]?.contextElements?.add("Stamina: ${action.staminaCost}")
                    miniBank.contextMap["worldState"]?.addLoreBookEntry("playerLocation", action.newLocation, weight = 10)
                }
                "useItem" -> {
                    miniBank.contextMap["inventory"]?.loreBookKeys?.remove(action.itemUsed)
                    miniBank.contextMap["playerStats"]?.contextElements?.add("Item used: ${action.itemUsed}")
                }
                "questAction" -> {
                    miniBank.contextMap["questLog"]?.contextElements?.add("Quest progress: ${action.questUpdate}")
                    miniBank.contextMap["playerStats"]?.contextElements?.add("Experience: +${action.expGained}")
                }
            }
            
            content
        }
        .updatePipelineContextOnExit()  // All MiniBank updates pushed to pipeline
    )
    .add(BedrockPipe()
        .pullPipelineContext()  // Receives updated MiniBank with all game state changes
        .autoInjectContext("Use updated game context to generate appropriate response.")
        .setSystemPrompt("Generate game response based on current state and player action.")
        .setTransformationFunction { content ->
            val miniBank = content.workspaceContext
            
            // Add response metadata to appropriate context pages
            miniBank.contextMap["worldState"]?.contextElements?.add("Response generated: ${System.currentTimeMillis()}")
            miniBank.contextMap["playerStats"]?.contextElements?.add("Last interaction: ${content.text.take(50)}")
            
            content
        }
        .updatePipelineContextOnExit()  // Final state pushed back to pipeline
    )

Best Practices

1. Setting Pipeline Context

val pipeline = Pipeline()

// Set context window
val contextWindow = ContextWindow()
contextWindow.addLoreBookEntry("gameState", "Current game status", 10)
pipeline.setContextWindow(contextWindow)

// Set mini bank for multi-page context
val miniBank = MiniBank()
miniBank.contextMap["worldState"] = ContextWindow()
miniBank.contextMap["playerData"] = ContextWindow()
pipeline.setMiniBank(miniBank)

2. Clear Context Updates

// Good: Descriptive context entries
.setTransformationFunction { content ->
    content.context.addLoreBookEntry("userAnalysis", analysisResult, weight = 8)
    content.context.contextElements.add("Analysis stage completed at ${timestamp}")
    content
}

// Good: Descriptive MiniBank updates
.setTransformationFunction { content ->
    val miniBank = content.workspaceContext
    miniBank.contextMap["userAnalysis"]?.addLoreBookEntry("result", analysisResult, weight = 8)
    miniBank.contextMap["processingLog"]?.contextElements?.add("Analysis completed at ${timestamp}")
    content
}

// Avoid: Generic or unclear context
.setTransformationFunction { content ->
    content.context.addLoreBookEntry("data", content.text, weight = 5)
    content
}

2. Appropriate Context Sharing

// Use pipeline context for stage-to-stage communication
.pullPipelineContext()
.updatePipelineContextOnExit()

// Use global context for cross-pipeline data
.pullGlobalContext()
.setPageKey("sharedKnowledge")

// Use MiniBank for organized multi-context scenarios
.pullPipelineContext()
.setPageKey("context1, context2, context3")  // Automatically uses MiniBank
.updatePipelineContextOnExit()  // MiniBank changes pushed to pipeline

3. Context Validation

// Single context validation
.setPreValidationFunction { contextWindow, content ->
    if (!contextWindow.loreBookKeys.containsKey("requiredData")) {
        throw IllegalStateException("Required pipeline context missing")
    }
    contextWindow
}

// MiniBank validation
.setPreValidationMiniBankFunction { miniBank, content ->
    val requiredPages = listOf("userSession", "gameState")
    requiredPages.forEach { pageKey ->
        if (!miniBank.contextMap.containsKey(pageKey)) {
            throw IllegalStateException("Required context page missing: $pageKey")
        }
    }
    miniBank
}

4. Context Cleanup

// Clean up single context
.setTransformationFunction { content ->
    content.context.contextElements.removeIf { it.startsWith("temp_") }
    content
}

// Clean up MiniBank contexts
.setTransformationFunction { content ->
    val miniBank = content.workspaceContext
    miniBank.contextMap.values.forEach { contextWindow ->
        contextWindow.contextElements.removeIf { it.startsWith("temp_") }
    }
    content
}

6. Appropriate Merge Settings

// Default emplacement: Good for most cases
val standardPipe = BedrockPipe()
    .pullPipelineContext()
    .updatePipelineContextOnExit()  // Uses default emplacement

// Append mode: Good for cumulative data
val storyPipe = BedrockPipe()
    .pullPipelineContext()
    .enableAppendLoreBookScheme()  // Accumulate story events
    .updatePipelineContextOnExit()

// Immutable mode: Good for protecting reference data
val analysisPipe = BedrockPipe()
    .pullPipelineContext()
    .enableImmutableLoreBook()  // Protect reference data
    .updatePipelineContextOnExit()

// Choose based on use case:
// - Emplacement: General data updates, replacing values
// - Append: Story writing, event logging, cumulative data
// - Immutable: Read-only scenarios, protecting critical context

Pipeline context integration enables sophisticated multi-stage processing where each pipe builds upon the work of previous stages, creating powerful workflows that maintain context continuity and enable complex AI processing patterns.

MiniBank Integration with Pipeline Context

When pipes use multiple page keys, they work with MiniBank instead of a single ContextWindow. The MiniBank can be modified through developer-in-the-loop functions and automatically updates the pipeline context.

Accessing MiniBank in DITL Functions

val pipe = BedrockPipe()
    .pullPipelineContext()
    .setPageKey("userProfile, gameState, inventory")  // Creates MiniBank
    .setTransformationFunction { content ->
        // Access MiniBank through content.workspaceContext
        val miniBank = content.workspaceContext
        
        // Modify specific context pages
        val userProfile = miniBank.contextMap["userProfile"]
        userProfile?.contextElements?.add("User action: ${extractAction(content.text)}")
        
        val gameState = miniBank.contextMap["gameState"]
        gameState?.addLoreBookEntry("currentAction", content.text, weight = 7)
        
        content
    }
    .updatePipelineContextOnExit()  // MiniBank automatically pushed to pipeline

MiniBank vs ContextWindow in DITL Functions

// Single context (ContextWindow)
.setTransformationFunction { content ->
    // Access through content.context
    content.context.addLoreBookEntry("result", content.text, weight = 5)
    content
}

// Multiple contexts (MiniBank)  
.setTransformationFunction { content ->
    // Access through content.workspaceContext
    val miniBank = content.workspaceContext
    miniBank.contextMap["specificPage"]?.addLoreBookEntry("result", content.text, weight = 5)
    content
}

Automatic MiniBank Pipeline Updates

val multiContextPipe = BedrockPipe()
    .pullPipelineContext()
    .setPageKey("analysis, generation, validation")
    .setTransformationFunction { content ->
        val miniBank = content.workspaceContext
        
        // Update analysis page
        miniBank.contextMap["analysis"]?.contextElements?.add("Analysis: ${content.text}")
        
        // Update generation page with results
        miniBank.contextMap["generation"]?.addLoreBookEntry("output", content.text, weight = 8)
        
        // Update validation page with quality metrics
        val quality = assessQuality(content.text)
        miniBank.contextMap["validation"]?.contextElements?.add("Quality: $quality")
        
        content
    }
    .updatePipelineContextOnExit()  // All MiniBank changes automatically pushed to pipeline

// Next pipe in pipeline automatically receives updated MiniBank
val nextPipe = BedrockPipe()
    .pullPipelineContext()  // Gets updated MiniBank with all changes
    .autoInjectContext("Use the updated multi-page context from previous processing.")

MiniBank Pre-Validation Updates

val pipe = BedrockPipe()
    .pullPipelineContext()
    .setPageKey("userSession, gameData, preferences")
    .setPreValidationMiniBankFunction { miniBank, content ->
        // Modify MiniBank before AI processing
        val userSession = miniBank.contextMap["userSession"]
        val gameData = miniBank.contextMap["gameData"]
        val preferences = miniBank.contextMap["preferences"]
        
        // Update based on input analysis
        val inputType = analyzeInput(content?.text ?: "")
        when (inputType) {
            "gameAction" -> {
                gameData?.contextElements?.add("Pending action: ${content?.text}")
                userSession?.contextElements?.add("Last action type: game")
            }
            "preference" -> {
                val newPref = extractPreference(content?.text ?: "")
                preferences?.contextElements?.add("New preference: $newPref")
                userSession?.contextElements?.add("Preferences updated")
            }
        }
        
        miniBank  // Modified MiniBank returned and used for processing
    }
    .updatePipelineContextOnExit()  // Updated MiniBank pushed to pipeline

Context Merge Settings

When pipes update pipeline context using updatePipelineContextOnExit(), TPipe provides merge settings that control how LoreBook entries are handled during the merge process.

Default Merge Behavior (Emplacement)

val pipe = BedrockPipe()
    .pullPipelineContext()
    .updatePipelineContextOnExit()  // Uses default emplacement merge
    .setTransformationFunction { content ->
        // Add or update LoreBook entries
        content.context.addLoreBookEntry("userAction", "User clicked button", weight = 5)
        content.context.addLoreBookEntry("timestamp", System.currentTimeMillis().toString(), weight = 3)
        content
    }

Default behavior (emplaceLorebook = true):

  • New keys: Added to pipeline context
  • Existing keys: Completely replaced with new values
  • Context elements: Always merged (added to existing list)
  • Conversation history: Always merged

Append Mode Merge

val pipe = BedrockPipe()
    .pullPipelineContext()
    .enableAppendLoreBookScheme()  // Enable append mode
    .updatePipelineContextOnExit()
    .setTransformationFunction { content ->
        // LoreBook entries will be appended, not replaced
        content.context.addLoreBookEntry("storyEvents", "Character entered the room", weight = 7)
        content.context.addLoreBookEntry("storyEvents", "Character spoke to NPC", weight = 7)
        content
    }

Append behavior (appendLoreBook = true):

  • New keys: Added to pipeline context
  • Existing keys: New content appended to existing values
  • Result: existingValue + " " + newValue
  • Use case: Creative writing, story generation, cumulative events

Immutable LoreBook Mode

val pipe = BedrockPipe()
    .pullPipelineContext()
    .enableImmutableLoreBook()  // Disable all LoreBook updates
    .updatePipelineContextOnExit()
    .setTransformationFunction { content ->
        // LoreBook changes will be ignored during merge
        content.context.addLoreBookEntry("protectedData", "This won't update pipeline", weight = 10)
        
        // Context elements still merge normally
        content.context.contextElements.add("This will be added to pipeline")
        content
    }

Immutable behavior (emplaceLorebook = false, appendLoreBook = false):

  • LoreBook entries: No changes merged to pipeline
  • Context elements: Still merged normally
  • Conversation history: Still merged normally
  • Use case: Protecting critical context from modification

Merge Setting Combinations

Standard Emplacement (Default)

val pipe = BedrockPipe()
    .pullPipelineContext()
    .updatePipelineContextOnExit()  // emplaceLorebook=true, appendLoreBook=false

Behavior:

  • New LoreBook keys: Added
  • Existing LoreBook keys: Replaced
  • Context elements: Merged
  • Best for: Most general use cases

Append Mode

val pipe = BedrockPipe()
    .pullPipelineContext()
    .enableAppendLoreBookScheme()  // emplaceLorebook=false, appendLoreBook=true
    .updatePipelineContextOnExit()

Behavior:

  • New LoreBook keys: Added
  • Existing LoreBook keys: Content appended
  • Context elements: Merged
  • Best for: Creative writing, story generation, event logging

Immutable Mode

val pipe = BedrockPipe()
    .pullPipelineContext()
    .enableImmutableLoreBook()  // emplaceLorebook=false, appendLoreBook=false
    .updatePipelineContextOnExit()

Behavior:

  • New LoreBook keys: Ignored
  • Existing LoreBook keys: Unchanged
  • Context elements: Merged
  • Best for: Read-only context scenarios, protecting critical data

MiniBank Merge Settings

MiniBank merge settings work the same way, applying to each ContextWindow within the MiniBank:

val pipe = BedrockPipe()
    .pullPipelineContext()
    .setPageKey("storyEvents, characterData, worldState")
    .enableAppendLoreBookScheme()  // Applies to all MiniBank pages
    .updatePipelineContextOnExit()
    .setTransformationFunction { content ->
        val miniBank = content.workspaceContext
        
        // All pages use append mode for LoreBook entries
        miniBank.contextMap["storyEvents"]?.addLoreBookEntry("events", "New event occurred", weight = 6)
        miniBank.contextMap["characterData"]?.addLoreBookEntry("personality", "Shows courage", weight = 8)
        miniBank.contextMap["worldState"]?.addLoreBookEntry("weather", "Storm approaching", weight = 4)
        
        content
    }

Practical Merge Examples

Story Writing Pipeline with Append Mode

val storyPipeline = Pipeline()
    .add(BedrockPipe()
        .setSystemPrompt("Generate story events based on user input.")
        .pullPipelineContext()
        .enableAppendLoreBookScheme()  // Accumulate story events
        .updatePipelineContextOnExit()
        .setTransformationFunction { content ->
            val storyEvent = extractStoryEvent(content.text)
            content.context.addLoreBookEntry("storyEvents", storyEvent, weight = 7)
            content.context.addLoreBookEntry("timeline", "Event at ${System.currentTimeMillis()}", weight = 5)
            content
        }
    )
    .add(BedrockPipe()
        .pullPipelineContext()  // Gets accumulated story events
        .enableAppendLoreBookScheme()  // Continue accumulating
        .updatePipelineContextOnExit()
        .autoInjectContext("Use accumulated story events to maintain continuity.")
        .setSystemPrompt("Continue the story maintaining consistency with previous events.")
    )

Data Analysis with Immutable Reference Data

val analysisPipeline = Pipeline()
    .add(BedrockPipe()
        .setSystemPrompt("Load reference data for analysis.")
        .pullPipelineContext()
        .updatePipelineContextOnExit()
        .setTransformationFunction { content ->
            // Load reference data that shouldn't be modified
            content.context.addLoreBookEntry("referenceData", loadReferenceData(), weight = 10)
            content.context.addLoreBookEntry("analysisRules", loadAnalysisRules(), weight = 10)
            content
        }
    )
    .add(BedrockPipe()
        .pullPipelineContext()
        .enableImmutableLoreBook()  // Protect reference data from modification
        .updatePipelineContextOnExit()
        .autoInjectContext("Use reference data for analysis but do not modify it.")
        .setSystemPrompt("Analyze data using the provided reference information.")
        .setTransformationFunction { content ->
            // Analysis results added to context elements (still merged)
            content.context.contextElements.add("Analysis result: ${content.text}")
            
            // Attempts to modify LoreBook will be ignored during merge
            content.context.addLoreBookEntry("referenceData", "Modified data", weight = 5)  // Ignored
            content
        }
    )

Multi-Context Game with Mixed Merge Settings

val gamePipe = BedrockPipe()
    .pullPipelineContext()
    .setPageKey("playerStats, gameEvents, worldData")
    .setTransformationFunction { content ->
        val miniBank = content.workspaceContext
        
        // Different merge strategies for different context types
        val action = extractPlayerAction(content.text)
        
        when (action.type) {
            "levelUp" -> {
                // Replace player stats (emplacement)
                miniBank.contextMap["playerStats"]?.addLoreBookEntry("level", action.newLevel.toString(), weight = 10)
                miniBank.contextMap["playerStats"]?.addLoreBookEntry("experience", action.newExp.toString(), weight = 10)
            }
            "storyEvent" -> {
                // Accumulate game events (would use append if enabled)
                miniBank.contextMap["gameEvents"]?.addLoreBookEntry("events", action.eventDescription, weight = 8)
            }
            "worldChange" -> {
                // Update world state (emplacement)
                miniBank.contextMap["worldData"]?.addLoreBookEntry("currentState", action.newWorldState, weight = 9)
            }
        }
        
        content
    }

// Configure different merge settings for different scenarios
when (gameMode) {
    "story" -> gamePipe.enableAppendLoreBookScheme()  // Accumulate story events
    "competitive" -> gamePipe.enableImmutableLoreBook()  // Protect game rules
    else -> gamePipe  // Use default emplacement
}

gamePipe.updatePipelineContextOnExit()

Pipeline Global Context Updates

Pipelines can automatically update the global ContextBank when they complete execution, making their accumulated context available to other pipelines and applications.

⚠️ Important Warning: Pipeline global context updates perform a full emplace (complete replacement) of the target ContextBank page, not a merge. This means any existing context in the target page will be completely overwritten. Use with caution when multiple pipelines might be updating the same global context page.

Basic Global Context Update

val pipeline = Pipeline()
    .useGlobalContext()  // Enable automatic global context updates
    .add(BedrockPipe()
        .setSystemPrompt("Analyze user input and extract insights.")
        .setTransformationFunction { content ->
            content.context.addLoreBookEntry("userInsights", content.text, weight = 8)
            content.context.contextElements.add("Analysis completed at ${System.currentTimeMillis()}")
            content
        }
        .updatePipelineContextOnExit()
    )
    .add(BedrockPipe()
        .pullPipelineContext()
        .setSystemPrompt("Generate recommendations based on insights.")
        .setTransformationFunction { content ->
            content.context.addLoreBookEntry("recommendations", content.text, weight = 7)
            content
        }
        .updatePipelineContextOnExit()
    )

// ⚠️ WARNING: When pipeline completes, it will REPLACE (not merge) the global context
// Any existing context in ContextBank will be completely overwritten

// When pipeline completes, accumulated context automatically pushed to ContextBank

What happens:

  • Pipeline accumulates context from all pipes
  • On completion, pipeline context is pushed to global ContextBank
  • Other pipelines can access this context via pullGlobalContext()

Global Context with Page Keys

val analysisPipeline = Pipeline()
    .useGlobalContext("analysisResults")  // Update specific global page
    .add(BedrockPipe()
        .setSystemPrompt("Perform data analysis.")
        .setTransformationFunction { content ->
            content.context.addLoreBookEntry("analysisData", content.text, weight = 9)
            content.context.contextElements.add("Analysis type: comprehensive")
            content
        }
        .updatePipelineContextOnExit()
    )

// Pipeline context stored in ContextBank under "analysisResults" page key

val reportPipeline = Pipeline()
    .add(BedrockPipe()
        .pullGlobalContext()
        .setPageKey("analysisResults")  // Access analysis results from previous pipeline
        .autoInjectContext("Use analysis results to generate report.")
        .setSystemPrompt("Generate report based on analysis data.")
    )

Multi-Page Global Updates

val multiContextPipeline = Pipeline()
    .useGlobalContext("userSession, gameState, preferences")  // Multiple global pages
    .add(BedrockPipe()
        .setPageKey("userSession, gameState, preferences")  // Work with multiple contexts
        .setTransformationFunction { content ->
            val miniBank = content.workspaceContext
            
            // Update different context pages
            miniBank.contextMap["userSession"]?.addLoreBookEntry("lastAction", content.text, weight = 6)
            miniBank.contextMap["gameState"]?.contextElements?.add("State updated: ${System.currentTimeMillis()}")
            miniBank.contextMap["preferences"]?.addLoreBookEntry("recentChoice", extractChoice(content.text), weight = 5)
            
            content
        }
        .updatePipelineContextOnExit()
    )

// Each MiniBank page automatically updated in global ContextBank:
// - ContextBank["userSession"] gets updated userSession context
// - ContextBank["gameState"] gets updated gameState context  
// - ContextBank["preferences"] gets updated preferences context

Cross-Pipeline Communication Pattern

// Pipeline 1: Data processing
val processingPipeline = Pipeline()
    .useGlobalContext("processedData")
    .add(BedrockPipe()
        .setSystemPrompt("Process and clean input data.")
        .setTransformationFunction { content ->
            val cleanedData = processData(content.text)
            content.context.addLoreBookEntry("cleanedData", cleanedData, weight = 10)
            content.context.contextElements.add("Processing completed")
            content.text = cleanedData
            content
        }
        .updatePipelineContextOnExit()
    )

// Pipeline 2: Analysis (runs after processing)
val analysisPipeline = Pipeline()
    .useGlobalContext("analysisResults")
    .add(BedrockPipe()
        .pullGlobalContext()
        .setPageKey("processedData")  // Use results from processing pipeline
        .autoInjectContext("Use processed data for analysis.")
        .setSystemPrompt("Analyze the processed data.")
        .setTransformationFunction { content ->
            val analysis = analyzeData(content.text)
            content.context.addLoreBookEntry("analysis", analysis, weight = 9)
            content
        }
        .updatePipelineContextOnExit()
    )

// Pipeline 3: Reporting (uses both previous results)
val reportPipeline = Pipeline()
    .add(BedrockPipe()
        .pullGlobalContext()
        .setPageKey("processedData, analysisResults")  // Use both previous results
        .autoInjectContext("Use processed data and analysis results for comprehensive reporting.")
        .setSystemPrompt("Generate comprehensive report.")
    )

Global Context Update Behavior

Single Context Pipeline

val pipeline = Pipeline()
    .useGlobalContext()  // No page key specified
    .add(pipe1)
    .add(pipe2)

// Result: Pipeline context replaces default banked context in ContextBank

Page-Specific Pipeline

val pipeline = Pipeline()
    .useGlobalContext("specificPage")  // Page key specified
    .add(pipe1)
    .add(pipe2)

// Result: Pipeline context stored under "specificPage" in ContextBank

Multi-Page Pipeline

val pipeline = Pipeline()
    .useGlobalContext("page1, page2, page3")  // Multiple page keys
    .add(BedrockPipe().setPageKey("page1, page2, page3"))  // Pipe uses MiniBank

// Result: Each MiniBank page stored separately in ContextBank
// - ContextBank["page1"] = miniBank.contextMap["page1"]
// - ContextBank["page2"] = miniBank.contextMap["page2"]  
// - ContextBank["page3"] = miniBank.contextMap["page3"]

Practical Global Context Examples

Session Management System

// User interaction pipeline
val userPipeline = Pipeline()
    .useGlobalContext("userSession${userId}")
    .add(BedrockPipe()
        .setSystemPrompt("Process user interaction and update session.")
        .setTransformationFunction { content ->
            content.context.addLoreBookEntry("lastInteraction", content.text, weight = 7)
            content.context.contextElements.add("Session updated: ${System.currentTimeMillis()}")
            content.context.contextElements.add("User ID: $userId")
            content
        }
        .updatePipelineContextOnExit()
    )

// Later, other pipelines can access user session
val recommendationPipeline = Pipeline()
    .add(BedrockPipe()
        .pullGlobalContext()
        .setPageKey("userSession${userId}")
        .autoInjectContext("Use user session data for personalized recommendations.")
        .setSystemPrompt("Generate personalized recommendations.")
    )

Multi-Stage Document Processing

// Stage 1: Document parsing
val parsingPipeline = Pipeline()
    .useGlobalContext("documentMetadata, documentContent")
    .add(BedrockPipe()
        .setPageKey("documentMetadata, documentContent")
        .setTransformationFunction { content ->
            val miniBank = content.workspaceContext
            val metadata = extractMetadata(content.text)
            val cleanContent = cleanDocument(content.text)
            
            miniBank.contextMap["documentMetadata"]?.addLoreBookEntry("metadata", metadata, weight = 10)
            miniBank.contextMap["documentContent"]?.addLoreBookEntry("content", cleanContent, weight = 10)
            
            content
        }
        .updatePipelineContextOnExit()
    )

// Stage 2: Document analysis (uses parsed results)
val analysisPipeline = Pipeline()
    .useGlobalContext("documentAnalysis")
    .add(BedrockPipe()
        .pullGlobalContext()
        .setPageKey("documentMetadata, documentContent")
        .autoInjectContext("Use document metadata and content for analysis.")
        .setSystemPrompt("Analyze document based on metadata and content.")
        .setTransformationFunction { content ->
            content.context.addLoreBookEntry("analysis", content.text, weight = 9)
            content
        }
        .updatePipelineContextOnExit()
    )

// Stage 3: Report generation (uses all previous results)
val reportPipeline = Pipeline()
    .add(BedrockPipe()
        .pullGlobalContext()
        .setPageKey("documentMetadata, documentContent, documentAnalysis")
        .autoInjectContext("Use all document processing results for comprehensive report.")
        .setSystemPrompt("Generate final document report.")
    )

Game State Management

// Player action pipeline
val actionPipeline = Pipeline()
    .useGlobalContext("gameState${gameId}")
    .add(BedrockPipe()
        .setSystemPrompt("Process player action and update game state.")
        .setTransformationFunction { content ->
            val action = processPlayerAction(content.text)
            content.context.addLoreBookEntry("lastAction", action.description, weight = 8)
            content.context.addLoreBookEntry("gameState", action.newGameState, weight = 10)
            content.context.contextElements.add("Turn: ${action.turnNumber}")
            content
        }
        .updatePipelineContextOnExit()
    )

// Game AI response pipeline (uses updated game state)
val aiResponsePipeline = Pipeline()
    .add(BedrockPipe()
        .pullGlobalContext()
        .setPageKey("gameState${gameId}")
        .autoInjectContext("Use current game state to generate AI response.")
        .setSystemPrompt("Generate appropriate AI response based on game state.")
    )

Next Steps

Now that you understand context sharing within pipelines, learn about developer-in-the-loop processing:

Developer-in-the-Loop Functions - Code-based validation and transformation