Mini Orchestration Cookbooks
Why This Exists
This chapter is for builders who want working patterns, not theory.
Use these cookbooks when you want:
- GenAI to handle model-facing intelligence.
- Locus to handle memory, recall policy, explainability, and safe transforms.
- A repeatable orchestration shape you can adapt by domain.
For a fast picker by outcome, go to Cookbook Overview.
Core Pattern
Every cookbook in this chapter follows the same loop:
- Ingest events into STTP memory.
- Recall context with explicit scoring and fallback policy.
- Explain the retrieval path before high-impact actions.
- Optionally run transform in dry-run before mutation.
- Pass grounded context into a prompt template for model response.
GenAI Hookup: Provider and Routing
Use GenAI as the model interface and keep memory orchestration in Locus.
#![allow(unused)]
fn main() {
use std::collections::HashMap;
use std::sync::Arc;
use anyhow::Result;
use locus_sdk::prelude::{
AiRoutingConfig, InMemoryAiProviderRegistry, ProviderModelProfile,
};
#[cfg(feature = "genai-provider")]
use locus_sdk::prelude::GenaiProviderAdapter;
fn build_registry_and_routing() -> Result<(Arc<InMemoryAiProviderRegistry>, AiRoutingConfig)> {
let mut registry = InMemoryAiProviderRegistry::new();
#[cfg(feature = "genai-provider")]
registry.register(GenaiProviderAdapter::new(
"genai",
Some("text-embedding-3-small".to_string()),
));
let mut providers = HashMap::new();
providers.insert(
"genai".to_string(),
ProviderModelProfile {
semantic_model: Some("text-embedding-3-small".to_string()),
avec_embedding_model: Some("text-embedding-3-small".to_string()),
avec_scoring_model: Some("gpt-4o-mini".to_string()),
},
);
let routing = AiRoutingConfig {
default_provider_id: Some("genai".to_string()),
providers,
};
Ok((Arc::new(registry), routing))
}
}
Integration note:
- Configure credentials for your selected GenAI provider in environment variables.
- Keep provider IDs stable across environments for predictable routing behavior.
Composition Primer
The MemoryCompositionService gives you high-level orchestration:
recall_with_explainfor grounded context with retrieval diagnostics.daily_rollupfor memory compression over time windows.transform_then_recall_verifyfor safe write-preview and immediate validation.build_content_from_textfor deterministic content construction.
Cookbook 1: Support Copilot (Fast Resolution)
Intent:
- Pull the smallest high-confidence context window.
- Generate a customer-safe next action grounded in prior resolutions.
use anyhow::Result;
use std::sync::Arc;
use locus_core_rs::{InMemoryNodeStore, NodeStore};
use locus_sdk::prelude::{
FallbackPolicy, MemoryCompositionService, MemoryRecallRequest, MemoryScoring,
};
#[tokio::main]
async fn main() -> Result<()> {
let store: Arc<dyn NodeStore> = Arc::new(InMemoryNodeStore::new());
let composition = MemoryCompositionService::new(store);
let result = composition
.recall_with_explain(&MemoryRecallRequest {
query_text: Some("billing mismatch after plan upgrade".to_string()),
scoring: MemoryScoring {
alpha: 0.70,
beta: 0.30,
fallback_policy: FallbackPolicy::OnEmpty,
..Default::default()
},
..Default::default()
})
.await?;
println!(
"retrieved={}, path={:?}, stages={}",
result.recall.retrieved,
result.explain.retrieval_path,
result.explain.stages.len()
);
Ok(())
}
Prompt template:
system:
You are a support resolution assistant.
Use only provided context. If evidence is weak, say so explicitly.
user:
Issue: {{live_issue_summary}}
Top memory context:
{{ranked_context_snippets}}
Return:
1) likely root cause
2) next best action
3) confidence (0-1)
4) what evidence is still missing
Cookbook 2: Incident Triage Captain (Explain Before Escalate)
Intent:
- Keep response speed high.
- Require explain trace before severity escalation.
use anyhow::Result;
use std::sync::Arc;
use locus_core_rs::{InMemoryNodeStore, NodeStore};
use locus_sdk::prelude::{
FallbackPolicy, MemoryCompositionService, MemoryRecallRequest, MemoryScoring,
StrictnessMode,
};
#[tokio::main]
async fn main() -> Result<()> {
let store: Arc<dyn NodeStore> = Arc::new(InMemoryNodeStore::new());
let composition = MemoryCompositionService::new(store);
let triage = composition
.recall_with_explain(&MemoryRecallRequest {
query_text: Some("unusual outbound auth failures".to_string()),
scoring: MemoryScoring {
alpha: 0.75,
beta: 0.25,
fallback_policy: FallbackPolicy::Always,
strictness: StrictnessMode::Precision,
..Default::default()
},
..Default::default()
})
.await?;
println!("path={:?}", triage.explain.retrieval_path);
println!("fallback_triggered={}", triage.explain.fallback_triggered);
Ok(())
}
Prompt template:
system:
You are an incident triage assistant. Never recommend irreversible action without evidence.
user:
Signal summary: {{signal_summary}}
Explain trace:
{{explain_stages}}
Top evidence:
{{context_snippets}}
Return:
1) severity recommendation
2) containment candidates
3) risks of false positive
4) evidence citations
Cookbook 3: Release Reliability Coach (Dry-Run First)
Intent:
- Preview transform impact before writes.
- Validate retrieval quality immediately after transform simulation.
use anyhow::Result;
use std::sync::Arc;
use locus_core_rs::{InMemoryNodeStore, NodeStore};
use locus_sdk::prelude::{
InMemoryAiProviderRegistry, MemoryCompositionService, MemoryRecallRequest,
MemoryTransformOperation, MemoryTransformRequest, MemoryTransformThenRecallRequest,
};
#[tokio::main]
async fn main() -> Result<()> {
let store: Arc<dyn NodeStore> = Arc::new(InMemoryNodeStore::new());
let composition = MemoryCompositionService::new(store);
let providers = Arc::new(InMemoryAiProviderRegistry::new());
let result = composition
.transform_then_recall_verify(
providers,
&MemoryTransformThenRecallRequest {
transform: MemoryTransformRequest {
operation: MemoryTransformOperation::EmbedBackfill,
dry_run: true,
batch_size: 25,
max_nodes: 500,
..Default::default()
},
recall: MemoryRecallRequest {
query_text: Some("release rollback patterns".to_string()),
..Default::default()
},
},
)
.await?;
println!("selected={}, updated={}", result.transform.selected, result.transform.updated);
println!("retrieved={}", result.recall.retrieved);
Ok(())
}
Prompt template:
system:
You are a release reliability assistant.
Prefer conservative recommendations when regression evidence is incomplete.
user:
Release context: {{release_context}}
Transform preview: {{transform_summary}}
Recall context: {{recall_summary}}
Return:
1) promote / hold / rollback recommendation
2) top risk factors
3) confidence
4) mandatory verification checks
Cookbook 4: Research Synthesizer (Deterministic Memory Build)
Intent:
- Structure raw research notes into deterministic memory content.
- Ask the model to synthesize only after context is structured and scoped.
use anyhow::Result;
use std::sync::Arc;
use locus_core_rs::{InMemoryNodeStore, NodeStore};
use locus_sdk::prelude::{
CompositeInputItem, CompositeNodeFromTextOptions, CompositeNodeFromTextRequest,
CompositeRole, MemoryCompositionService,
};
fn main() -> Result<()> {
let store: Arc<dyn NodeStore> = Arc::new(InMemoryNodeStore::new());
let composition = MemoryCompositionService::new(store);
let structured = composition.build_content_from_text(&CompositeNodeFromTextRequest {
items: vec![CompositeInputItem {
role: CompositeRole::Document,
text: "Policy memo highlights housing supply bottlenecks".to_string(),
avec_override: None,
context: vec![],
}],
options: CompositeNodeFromTextOptions {
allow_llm_avec_fallback: false,
max_recursion_depth: 3,
..Default::default()
},
})?;
println!("resolved_avec_count={}", structured.resolved_avec_count);
println!("requires_llm_avec={}", structured.requires_llm_avec);
Ok(())
}
Prompt template:
system:
You are a research synthesis assistant.
Preserve uncertainty and disagreement; do not collapse conflicting evidence.
user:
Question: {{research_question}}
Structured context payload:
{{structured_content}}
Return:
1) synthesis
2) competing interpretations
3) confidence per claim
4) additional evidence needed
Prompting Rules That Work Well With STTP
- Require evidence-cited outputs for high-impact decisions.
- Ask for explicit confidence fields rather than vague certainty language.
- Pass retrieval metadata to the prompt when using explain-driven guardrails.
- Preserve contradictions in output instead of forcing a single narrative.
Anti-Patterns
- Letting model responses bypass retrieval and explain checks.
- Running transforms without dry-run in fresh environments.
- Using broad session scopes that mix unrelated workflows.
- Tuning alpha and beta without checking retrieval_path drift.
Where To Go Next
- For domain presets, continue with Agent Blueprints by Domain.
- For API-level examples, use Examples.
- For rollout safeguards, use Integration and Operations.