PromptisePromptise
Docs
GitHub
promptise
[n.05/07]> Reasoning Engine

Agents that think the way the job requires.

A support bot, a researcher and a code reviewer should not reason the same way, yet most frameworks give every agent one generic loop. With the Reasoning Engine you design the process each agent follows (how it plans, checks and decides), so its behaviour fits the job instead of fighting it.

GitHub
loop backplanactobservereflectanswer
Reasoning as a graph of typed steps: plan, act, observe, loop back when the result is not good enough, reflect, then answer. Each step can run on its own model.
[n.01/07]> the problem

Most agents get one generic loop for every task.

The default agent pattern is: the model calls tools, reads the results, calls more tools and answers. It works, and it is the only shape on offer.

// 001

One size fits all

Data analysis, research, coding and planning all get the same reasoning pattern, whatever the task needs.

// 002

No self-correction

When the agent makes a mistake it keeps going. There is no reflection, no re-planning and no quality gate.

// 003

No production safety

No retry on failure, no budget enforcement, no way to abort a critical step that went wrong.

[n.02/07]> the solution

Assemble reasoning from proven building blocks.

Pick the nodes you need. There are twenty built-in node types, several prebuilt patterns, and you can build your own. Choose a pattern to see which nodes it uses.

The agent builds its own path from a pool of nodes.

Plan

Break the task into subgoals and self-evaluate the plan.

Think

Analyze gaps, rate confidence, recommend the next step.

Act

Execute tools from your MCP servers.

Reflect

Self-evaluate, spot mistakes, suggest corrections.

Observe

Interpret tool results and extract entities and facts.

Critique

Challenge the answer with counter-arguments.

Synthesize

Combine every finding into the final answer.

Validate

A quality gate with pass and fail routing.

PathPlan→Think→Act→Observe→Reflect→Synthesize

The pool the agent chooses from. It decides the order at runtime.

[n.03/07]> why it matters

Different jobs need different thinking.

A research agent should not think like a code reviewer, and neither should reason like a support bot. Design the process each one uses. Pick a use case to see its pattern and code.

[01] Deep research

Plan, search, verify, synthesize.

A research agent that plans its investigation, searches several sources, cross-checks what it finds and writes a cited report. A generic tool loop would just keep searching until it has enough text.Plan → Act → Observe → Validate → Synthesize

What you get
  • PlanNode sets a research strategy up front
  • ValidateNode catches contradictions between sources and loops back to search
  • SynthesizeNode produces a structured report
research_agent.pypython
agent = await build_agent(    model="openai:gpt-5-mini",    servers={"search": search_server},    agent_pattern=PromptGraph("researcher", nodes=[        PlanNode("plan", is_entry=True),        PromptNode("search", inject_tools=True),        ObserveNode("observe"),        ValidateNode("verify",            criteria=["Sources agree", "No contradictions"],            on_fail="search"),  # loop back if invalid        SynthesizeNode("report", is_terminal=True),    ]),)
[n.04/07]> the key insight

Let the agent choose its next step, from the steps you allow.

In autonomous mode, the default, you do not wire edges. You give the agent a pool of nodes and it picks the next one at each step, from their descriptions.

Depth that fits the question

The same pool handles different questions differently. A simple one might go Act then Synthesize. A hard one might run Plan, Act, Think, Act, Reflect, Act, Synthesize. The reasoning depth adapts to the task.

Or wire it yourself

For predictable pipelines, switch to static mode and wire every edge. You can also mix both: some paths fixed, some decided at runtime.

autonomous.pypython
PromptGraph("agent", nodes=[    PlanNode("plan", is_entry=True),    PromptNode("act", inject_tools=True),    ThinkNode("think"),    SynthesizeNode("answer", is_terminal=True),])# the agent decides: plan -> act -> think -> act -> answer
static.pypython
graph = PromptGraph("pipeline", mode="static", nodes=[    PromptNode("extract", is_entry=True),    PromptNode("analyze"),    PromptNode("report", is_terminal=True),])graph.sequential("extract", "analyze", "report")# always: extract -> analyze -> report
[n.05/07]> production safety

Production behaviour on any step, in one line.

Retries, caching and error recovery are flags on a node, not code you write and maintain. There are eighteen, and each is one line.

// 001

CRITICAL

Abort the graph if this node fails.

abort
// 002

RETRYABLE

Retry with exponential backoff.

retry
// 003

CACHEABLE

Cache the result by its input keys.

cache
// 004

SKIP_ON_ERROR

Skip this node if the previous one failed.

recover
// 005

NO_HISTORY

Give the node a clean context.

context
// 006

LIGHTWEIGHT

Run it on a smaller model.

cost
flags.pypython
from promptise.engine import NodeFlag # one flag, one production behaviorPromptNode("fetch",    flags={NodeFlag.CRITICAL,           NodeFlag.RETRYABLE,           NodeFlag.CACHEABLE},)
[n.06/07]> fully extensible

Encode your own expertise as reusable steps.

The twenty built-in nodes are a starting point, not a ceiling. Custom nodes can carry their own logic, instructions, tools, models, data flow and guards.

[01] @node decorator

Turn a function into a node.

The simplest way to add custom logic: decorate an async function and return a NodeResult.

custom_node.pypython
from promptise.engine import node, NodeResult @node("fetch_data")async def fetch_data(state):    data = await api.get(...)    state.context["data"] = data    return NodeResult(node_name="fetch_data", output=data)
[n.07/07]> performance

The engine stays out of the way, so you pay for the model, not the framework.

Precomputed edge indexes, cached system prompts and parallel tool execution keep the engine out of the way. Your agent is only as slow as the LLM provider.

20

Built-in node types

18

Typed node flags

10

Prebuilt patterns

0.009ms

Per-node engine overhead
Overhead measured by the engine’s own benchmark with a mocked LLM; real latency is dominated by the model call.

Build your first custom reasoning pattern.

Define the nodes, pick a pattern, and let the engine handle the rest.

Read the docsCustom patterns guide
Promptise - AI Framework LogoPromptise

The foundation layer for agentic intelligence. Build, secure and operate autonomous AI systems with Promptise Foundry.

pip install promptise

[01] Foundry

  • MCPcast
  • The Promptise Agent
  • Reasoning Engine
  • MCP
  • Agent Runtime
  • Prompt Engineering
  • Execution Engine
  • Agent Identity

[02] Resources

  • Documentation
  • GitHub
  • Guides
  • Learning Paths
  • Questions

[03] Company

  • About
  • Terms of Service
  • Privacy Policy
  • Cookie Policy
  • Subprocessors

© 2026 Promptise by Manser Ventures. All rights reserved.

Open source · Python