Skip to content

Reasoning Strategies

A reasoning: block upgrades an agent from one LLM call to a multi-step think-act-observe loop that plans, calls tools, and reflects before answering.

Quick Start

SOUL.yaml (excerpt)
reasoning:
  strategy: react
  max_steps: 6
  step_timeout: 30s
  total_timeout: 3m

Agents without a reasoning: block keep the classic single-call behavior untouched — the loop is strictly opt-in.

Configuration

Key Default Meaning
strategy (off) auto, react, plan_execute, flow, or any custom registered name.
max_steps 8 Hard ceiling on think-act-observe iterations.
max_plan_steps 6 Plan decomposition cap (plan_execute only).
step_timeout 30s Context deadline for each individual step.
total_timeout 180s Deadline for the whole task.

The LLM backend is derived automatically from llm.provider — Ollama, Anthropic, OpenAI (and OpenAI-compatible endpoints such as Groq, Together, or vLLM) are supported, with Ollama as the fallback. There is exactly one place to configure the model: the agent's llm block.

Choosing a Strategy

Strategy How it works Reach for it when
react Iterative loop: think → pick a tool → observe → repeat until done, then reflect into a final answer. Exploratory tasks where each step depends on the last result.
plan_execute Decomposes the task into a plan up front (capped by max_plan_steps), executes the steps, then reflects. Tasks with a knowable shape — gather X, compute Y, write Z.
auto A keyword heuristic picks react or plan_execute per task. You don't want to decide.
flow Walks a declarative graph you define under workflow.nodes/edges — deterministic routing with bounded cycles. See Flow Graphs. The path should be authored, not improvised.

Custom strategies registered through the SDK (sdk/reasoning + registry.RegisterReasoningStrategy) are selected the same way — put their registered name in strategy:. See docs/REASONING_STRATEGIES.md in the repo for the author-side contract.

Tip

A typo'd or unregistered strategy name never bricks an agent — the engine falls back to ReAct and the run completes with the default loop.

Tool Access Inside the Loop

The loop sees the agent's full tool surface: declared Python tools, built-ins, MCP tools, plugin tools, and peer agents. Every call is bridged through the same dispatch path as the classic loop, so the Python sandbox, audit log, confirmation gates, and MCP/plugin allowlists all apply unchanged. Tool failures become observations the loop can react to — they never abort the run.

Watching It Think

Reasoning runs are fully observable:

  • Chat — the thinking section above the reply expands to show each step's thought, the tool it chose, and a preview of the observation.
  • Activity — the run emits engine events you can follow live or audit later:
Event Payload
reasoning.start strategy, max_steps, tool count
reasoning.step per step: index, thought, tool, observation (truncated), duration_ms
reasoning.result steps, confident, duration_ms

tool.call / tool.result events stream in real time as each step executes, exactly like the classic loop.

Self-Updating Rulebooks

Reasoning interacts with procedural memory. When the agent opts in:

brain_memory:
  procedural:
    enabled: true
    auto_update: true

the loop's final reflection may propose updated operating rules, and the engine persists them as a new immutable version of the agent's rulebook, emitting a rulebook.updated event. Without auto_update: true the proposal is discarded. Every version is kept with provenance, you can diff and roll back from the GUI, and a locked rulebook refuses all writes (the run itself still succeeds). See Agent Memory & Rulebooks.

Warning

auto_update: true lets an agent rewrite its own instructions after each run. Versioning makes drift visible and reversible, but review the history periodically — or lock the rulebook once behavior is where you want it.

Example: A Researcher That Plans

id: deep-researcher
name: Deep Researcher
description: Multi-step research with planning and reflection.
trigger: channel
channels: [http]

llm:
  provider: anthropic
  model: claude-sonnet-4-6

system_prompt: |
  Research thoroughly. Cite every claim with a source.

builtins: [web_search]
knowledge: [internal-docs]

reasoning:
  strategy: plan_execute
  max_plan_steps: 5
  max_steps: 10
  step_timeout: 45s
  total_timeout: 5m

brain_memory:
  procedural:
    enabled: true
    auto_update: false   # inject rules, but don't self-modify

enabled: true

Ask it a question in Chat and open the thinking section: you'll see the plan land first, then each step execute with its tool call and observation, then the reflection that becomes the reply.