Skip to Content

Core Concepts

Architecture Overview

isA Agent SDK is built on LangGraph and provides a complete agent execution framework with nodes, state management, and streaming support.

Agent Execution Flow

User Query ↓ SenseNode (Session validation, intent classification, tool discovery) ↓ SummarizationNode (Compress history if context window is filling — conditional) ↓ ReasonNode (Analyze request, plan approach, LLM interaction) ↓ ToolNode (Execute MCP tools) OR ResponseNode (Format response) │ │ ├─ AgentExecutorNode │ │ (DAG/wavefront execution │ │ for multi-step plans) │ │ ↓ │ │ ToolNode (loop) │ ↓ ↓ ↓ GuardrailNode (Safety checks, compliance — optional) ↓ FailsafeNode (Error recovery — on failure) ↓ Result

Core Components

1. Agent State

The AgentState is a TypedDict that flows through the graph:

class AgentState(TypedDict): messages: List[BaseMessage] # Conversation history session_id: str # Session identifier shared_state: Dict[str, Any] # Mutable shared data task_list: List[Dict] # Flat task list task_dag: Optional[DAGState] # DAG task structure current_task_index: int # Current task in flat list confidence: float # Response confidence score # ... and more

State fields use annotated reducers for merging:

  • preserve_latest - Keep the most recent value
  • add_messages - Append to message list
  • sum_numeric - Add numeric values
  • merge_dicts - Deep merge dictionaries

2. Nodes

Nodes are the building blocks of agent execution:

SenseNode (Entry)

  • Validates session existence or creates new sessions
  • Classifies intent (simple vs. complex)
  • Discovers available tools and skills
  • Prepares enhanced system prompt
  • Handles event-driven triggers in proactive mode

ReasonNode

  • Analyzes the current request and plans the approach
  • Handles LLM interactions via ModelCallingMixin
  • Manages streaming responses and token billing
  • Determines if tools are needed and routes to next node
  • Detects sensitive requests for human-in-the-loop

ToolNode

  • Executes tool calls provided by MCP servers (e.g. Read, Write, Edit, Bash from isA_MCP)
  • Manages MCP tool discovery and invocation
  • Handles autonomous task planning
  • Detects and builds DAG structures from task lists

ResponseNode

  • Formats final responses
  • Applies output format schemas
  • Handles structured outputs
  • Validates response structure

GuardrailNode

  • Applies safety guardrails
  • Checks for PII and sensitive data
  • Enforces compliance rules (HIPAA, etc.)
  • Sanitizes or blocks responses based on violations

SummarizationNode

  • Compresses conversation history when context window fills using the official LangGraph RemoveMessage pattern
  • Preserves the last N messages (default: 5) in full, summarizes older messages via LLM
  • Uses a fast/cheap model (default: gpt-4o-mini) for summary generation
  • Token-aware compression with estimated savings logging
  • Graceful fallback — if summarization fails, the conversation continues unchanged
  • Use the should_summarize helper as a conditional edge to trigger based on message count thresholds
from isa_agent_sdk.nodes import SummarizationNode node = SummarizationNode(preserve_last_n=5, summary_model="gpt-4o-mini")

AgentExecutorNode

  • Coordinates multi-step task execution across flat lists and DAG-based dependency graphs
  • When task_dag is present in state, uses DAGScheduler to compute wavefronts via Kahn’s algorithm and executes each wavefront in parallel
  • When only task_list is present, iterates tasks sequentially using current_task_index
  • Cascades failures to dependent tasks (marks downstream as SKIPPED)
  • Integrates with SwarmOrchestrator for multi-agent DAG execution where different agents handle different tasks

FailsafeNode

  • Handles errors gracefully
  • Categorizes error types (UNCERTAINTY, INSUFFICIENT_INFO, etc.)
  • Provides context-aware fallback responses
  • Ensures transparent failure communication

3. Execution Modes

The SDK supports three execution modes:

Reactive (Default)

  • Responds to explicit requests only
  • No proactive suggestions
  • Straightforward request-response pattern

Collaborative

  • Creates checkpoints for human approval
  • Requests permission for sensitive operations
  • Interactive workflow with user involvement
  • Durable execution with state persistence

Proactive

  • Anticipates user needs
  • Suggests next actions
  • More autonomous behavior
  • Still respects tool permissions

4. Streaming

All agent operations support streaming:

async for msg in query("Hello"): if msg.is_text: print(msg.content, end="") elif msg.is_tool_use: print(f"\n[Using {msg.tool_name}]") elif msg.is_tool_result: print(f"[Result: {msg.content[:50]}...]")

Message types:

  • is_text - Text content
  • is_tool_use - Tool invocation
  • is_tool_result - Tool execution result
  • is_error - Error message
  • is_result - Final result (for structured outputs)

5. Multi-Agent Systems

MultiAgentOrchestrator

Fixed routing with explicit router function:

def router(state, last_result): outputs = state.get("outputs", {}) if "planner" not in outputs: return "planner" if "renderer" not in outputs: return "renderer" return None

Best for: Known routing patterns, sequential workflows.

SwarmOrchestrator

Dynamic routing with LLM-directed handoffs:

swarm = SwarmOrchestrator( agents=[researcher, writer], entry_agent="researcher", max_handoffs=5, )

Agents decide when to hand off via [HANDOFF: agent_name] directives.

Best for: Dynamic workflows, specialist agents, collaborative tasks.

6. DAG Task Execution

Tasks with dependencies execute in wavefronts:

tasks = [ {"id": "a", "title": "Task A"}, {"id": "b", "title": "Task B", "depends_on": ["a"]}, {"id": "c", "title": "Task C", "depends_on": ["a"]}, {"id": "d", "title": "Task D", "depends_on": ["b", "c"]}, ]

Execution order:

Wavefront 0: [a] # No dependencies Wavefront 1: [b, c] # Depend on a (parallel) Wavefront 2: [d] # Depends on b and c

Features:

  • Cycle detection - Kahn’s algorithm validates DAG structure
  • Failure cascade - Failed tasks mark dependents as SKIPPED
  • Multi-agent - Different agents execute different tasks in parallel
  • Status tracking - PENDING → READY → RUNNING → COMPLETED/FAILED/SKIPPED

7. Options Configuration

ISAAgentOptions controls agent behavior:

options = ISAAgentOptions( allowed_tools=["Read", "Edit", "Bash"], execution_mode="collaborative", max_iterations=20, confidence_threshold=0.7, system_prompt="You are a helpful assistant.", skills=["documentation", "code-review"], output_format=OutputFormat.from_pydantic(MySchema), )

Key options:

  • allowed_tools - Tool whitelist
  • execution_mode - reactive/collaborative/proactive
  • max_iterations - Maximum graph iterations (must be > 0)
  • confidence_threshold - Minimum confidence for responses (0.0-1.0)
  • system_prompt - System prompt or SystemPromptConfig
  • skills - Skills to load
  • output_format - Structured output schema

8. Human-in-the-Loop

Request permission before dangerous operations:

authorized = await request_tool_permission( "delete_file", {"path": "important_data.txt"} )

Create checkpoints for durable execution:

await checkpoint("before_deployment", { "version": "2.0.0", "environment": "production" })

9. Sessions and Memory

Sessions maintain conversation context:

# Create session session = await create_session(user_id="user123") # Query with session async for msg in query( "What did we discuss earlier?", options=ISAAgentOptions(session_id=session.id) ): print(msg.content)

Sessions store:

  • Conversation history
  • Shared state
  • Checkpoints
  • Task progress

10. Tools

Important: The SDK provides the tool execution framework only — it contains no built-in tools. All tools are provided externally by MCP (Model Context Protocol) servers. The primary tool server is isA_MCP, which exposes 190+ tools over the MCP transport.

Common tools available via MCP servers:

  • Read - Read files
  • Write - Create/overwrite files
  • Edit - Edit specific file sections
  • Bash - Execute shell commands
  • WebSearch - Search the web
  • WebFetch - Fetch web content
  • Glob - Find files by pattern
  • Grep - Search file contents

Custom tools can be defined in-process using the @tool decorator or by connecting additional MCP servers.

11. Skills

Skills are reusable agent capabilities defined in markdown:

.isa/skills/my-skill/SKILL.md

Skills are loaded:

  1. First from .isa/skills/ (local, project-specific)
  2. Then from MCP servers (shared, global)

This allows project-specific overrides of global skills.

Data Flow

Query Execution

query(prompt, options) → SmartAgentGraphBuilder.build() → Graph execution with streaming → AgentMessage stream → User receives responses

Swarm Execution

swarm.run(prompt) → Entry agent runs with handoff prompt injection → Parse response for [HANDOFF:] or [COMPLETE] → If handoff: switch agent, inject context → If complete: return SwarmRunResult → Max handoffs safety cap

DAG Execution

swarm.run_dag(tasks) → DAGScheduler.build_dag(tasks) → DAGScheduler.validate(dag) → DAGScheduler.compute_wavefronts(dag) → For each wavefront: → Run all tasks in parallel (per agent) → Aggregate results → Pass to dependent tasks → Return SwarmRunResult with agent_outputs

Best Practices

  1. Set appropriate max_iterations - Default is 3, but complex tasks need 15-20 for proper reasoning cycles
  2. Use collaborative mode for risky operations - Get human approval before destructive actions
  3. Leverage DAG for complex workflows - Dependencies ensure correct execution order
  4. Use Swarm for specialist agents - Each agent focuses on one skill
  5. Configure tools carefully - Only allow tools needed for the task
  6. Use structured outputs for data - Type-safe with Pydantic schemas
  7. Handle errors gracefully - Check msg.is_error in streaming
  8. Test with comprehensive coverage - Follow patterns in test_*.py files

Next Steps