Contexts

View as Markdown

ContextBuilder API

API reference for ContextBuilder and Step classes, enabling multi-step conversation workflows.

Class Definitions

1from signalwire_agents.core.contexts import ContextBuilder, Step

Overview

Contexts define structured conversation workflows with multiple steps.

Context Structure:

  • Context - A named conversation workflow
    • Steps - Sequential conversation phases
      • Prompt text or POM sections
      • Completion criteria
      • Available functions
      • Navigation rules

Step Class

Constructor

1Step(name: str) # Step name/identifier

set_text

1def set_text(self, text: str) -> 'Step'

Set the step’s prompt text directly.

1step = Step("greeting")
2step.set_text("Welcome the caller and ask how you can help.")

add_section

1def add_section(self, title: str, body: str) -> 'Step'

Add a POM section to the step.

1step = Step("collect_info")
2step.add_section("Task", "Collect the caller's name and phone number.")
3step.add_section("Guidelines", "Be polite and patient.")

add_bullets

1def add_bullets(self, title: str, bullets: List[str]) -> 'Step'

Add a section with bullet points.

1step.add_bullets("Requirements", [
2 "Get full legal name",
3 "Verify phone number",
4 "Confirm email address"
5])

set_step_criteria

1def set_step_criteria(self, criteria: str) -> 'Step'

Define when this step is complete.

1step.set_step_criteria(
2 "Step is complete when caller has provided their name and phone number."
3)

set_functions

1def set_functions(self, functions: Union[str, List[str]]) -> 'Step'

Set which functions are available in this step.

1## Disable all functions
2step.set_functions("none")
3
4## Allow specific functions
5step.set_functions(["lookup_account", "verify_identity"])

set_valid_steps

1def set_valid_steps(self, steps: List[str]) -> 'Step'

Set which steps can be navigated to.

1step.set_valid_steps(["confirmation", "error_handling"])

set_valid_contexts

1def set_valid_contexts(self, contexts: List[str]) -> 'Step'

Set which contexts can be navigated to.

1step.set_valid_contexts(["support", "billing"])

Step Context Switch Methods

set_reset_system_prompt

1def set_reset_system_prompt(self, system_prompt: str) -> 'Step'

Set system prompt for context switching.

set_reset_user_prompt

1def set_reset_user_prompt(self, user_prompt: str) -> 'Step'

Set user prompt for context switching.

set_reset_consolidate

1def set_reset_consolidate(self, consolidate: bool) -> 'Step'

Set whether to consolidate conversation on context switch.

set_reset_full_reset

1def set_reset_full_reset(self, full_reset: bool) -> 'Step'

Set whether to do full reset on context switch.

ContextBuilder Class

Constructor

1ContextBuilder()

Create a new context builder.

add_context

1def add_context(
2 self,
3 name: str, # Context name
4 steps: List[Step] # List of steps
5) -> 'ContextBuilder'

Add a context with its steps.

1builder = ContextBuilder()
2builder.add_context("main", [
3 Step("greeting").set_text("Greet the caller"),
4 Step("collect").set_text("Collect information"),
5 Step("confirm").set_text("Confirm details")
6])

set_default_context

1def set_default_context(self, name: str) -> 'ContextBuilder'

Set the default starting context.

1builder.set_default_context("main")

build

1def build(self) -> Dict[str, Any]

Build the contexts structure for SWML.

Using with AgentBase

1from signalwire_agents import AgentBase
2from signalwire_agents.core.contexts import ContextBuilder, Step
3
4agent = AgentBase(name="workflow-agent")
5
6## Create context builder
7builder = ContextBuilder()
8
9## Define steps for main context
10greeting = (
11 Step("greeting")
12 .set_text("Welcome the caller and ask how you can help today.")
13 .set_functions("none")
14 .set_valid_steps(["collect_info"])
15)
16
17collect = (
18 Step("collect_info")
19 .add_section("Task", "Collect the caller's information.")
20 .add_bullets("Required Information", [
21 "Full name",
22 "Account number",
23 "Reason for calling"
24 ])
25 .set_step_criteria("Complete when all information is collected.")
26 .set_functions(["lookup_account"])
27 .set_valid_steps(["process", "error"])
28)
29
30process = (
31 Step("process")
32 .set_text("Process the caller's request based on collected information.")
33 .set_valid_steps(["farewell"])
34)
35
36farewell = (
37 Step("farewell")
38 .set_text("Thank the caller and end the conversation.")
39 .set_functions("none")
40)
41
42## Add context
43builder.add_context("main", [greeting, collect, process, farewell])
44builder.set_default_context("main")
45
46## Apply to agent
47agent.set_contexts(builder)

Multiple Contexts Example

1builder = ContextBuilder()
2
3## Main menu context
4main_steps = [
5 Step("menu")
6 .set_text("Present options: sales, support, or billing.")
7 .set_valid_contexts(["sales", "support", "billing"])
8]
9builder.add_context("main", main_steps)
10
11## Sales context
12sales_steps = [
13 Step("qualify")
14 .set_text("Understand what product the caller is interested in.")
15 .set_functions(["check_inventory", "get_pricing"])
16 .set_valid_steps(["quote"]),
17
18 Step("quote")
19 .set_text("Provide pricing and availability.")
20 .set_valid_steps(["close"]),
21
22 Step("close")
23 .set_text("Close the sale or schedule follow-up.")
24 .set_valid_contexts(["main"])
25]
26builder.add_context("sales", sales_steps)
27
28## Support context
29support_steps = [
30 Step("diagnose")
31 .set_text("Understand the customer's issue.")
32 .set_functions(["lookup_account", "check_status"])
33 .set_valid_steps(["resolve"]),
34
35 Step("resolve")
36 .set_text("Resolve the issue or escalate.")
37 .set_functions(["create_ticket", "transfer_call"])
38 .set_valid_contexts(["main"])
39]
40builder.add_context("support", support_steps)
41
42builder.set_default_context("main")

Step Flow Diagram

Step Navigation.
Step Navigation

Generated SWML Structure

The contexts system generates SWML with this structure:

1{
2 "version": "1.0.0",
3 "sections": {
4 "main": [{
5 "ai": {
6 "contexts": {
7 "default": "main",
8 "main": {
9 "steps": [
10 {
11 "name": "greeting",
12 "text": "Welcome the caller...",
13 "functions": "none",
14 "valid_steps": ["collect_info"]
15 },
16 {
17 "name": "collect_info",
18 "text": "## Task\nCollect information...",
19 "step_criteria": "Complete when...",
20 "functions": ["lookup_account"],
21 "valid_steps": ["process", "error"]
22 }
23 ]
24 }
25 }
26 }
27 }]
28 }
29}

Context Design Tips

Step criteria best practices:

  • Be specific: “Complete when user provides full name AND phone number”
  • Avoid ambiguity: Don’t use “when done” or “when finished”
  • Include failure conditions: “Complete when verified OR after 3 failed attempts”

Function availability:

  • Use set_functions("none") for greeting/farewell steps where no actions are needed
  • Limit functions to what’s relevant for each step to prevent LLM confusion
  • Always include escape routes (transfer, escalate) where appropriate

See Also

TopicReference
Contexts guideContexts & Workflows
State managementState Management
Context switching in functionsSwaigFunctionResult API - swml_change_step(), swml_change_context()

Troubleshooting

IssueSolution
Step not changingVerify step name matches exactly in set_valid_steps()
Functions unavailableCheck set_functions() includes the function name
Infinite loopEnsure step criteria can be met; add timeout handling
Context not foundVerify context name in set_valid_contexts()