Build a Simple AI Agent in JustPipes — No Code Required

*A step-by-step guide to creating your first AI agent using Just247Pipes’ visual pipeline components.*

Introduction

Building AI agents used to mean writing hundreds of lines of orchestration code — managing prompts, routing LLM calls, handling memory, connecting tools, and adding safety rails. Just247Pipes changes all of that. With its drag-and-drop pipeline editor, you can assemble a fully functional AI agent from pre-built components in minutes.

In this article, we’ll build a simple conversational AI agent that can:

– ✅ Chat with users using a large language model

– ✅ Remember conversation history across sessions

– ✅ Call external tools (calculator, web search, etc.)

– ✅ Guard against unsafe content on inputs and outputs

The best part? Zero code. Just connect the pipes.

What is Just247Pipes?

Just247Pipes is a visual pipeline framework for building AI workflows. Instead of writing glue code, you connect components — each with clearly defined input ports, output ports, and configurable properties. Data flows between components through these ports, just like pipes in a plumbing system.

Every component in Just247Pipes follows the same schema:

You configure the properties, connect the ports, and the pipeline runs.

Our Simple AI Agent Architecture

Here’s the architecture we’re building — a conversational agent with memory, tool use, and safety guardrails:

 Data Flow

1. User Input enters the pipeline

2. Content Guard (Input) filters and validates the input for safety

3. Plan & Execute Agent orchestrates the reasoning process

4. LLM Router handles model selection and API calls

5. Memory Store persists conversation context

6. Tool Registry executes external tools when needed

7. Content Guard (Output) filters the response for safety

8. User Output delivers the final response

Step 1: The Pipeline Skeleton

Every Just247Pipes pipeline starts with a JSON configuration. Here’s our skeleton:

{
  "pipeline": {
    "name": "simple-ai-agent",
    "version": "1.0",
    "description": "A simple conversational AI agent with memory, tools, and guardrails",
    "components": [],
    "connections": []
  }
}

We’ll fill in the components and connections as we build each part.

Step 2: Add the LLM Router

PropertyTypeDefaultDescription
llm_providerselectopenaiLLM provider (openai, anthropic, google, local)
model_namestringgpt-4o-miniModel to use
temperaturenumber0.7Response creativity (0.0–2.0)
max_tokensinteger2048Maximum response tokens
enable_streamingbooleantrueStream responses token-by-token
timeout_secondsinteger60Request timeout

Input/Output Ports

LLM Router

  INPUTS:  prompt (string) ➜ The prompt to send to the LLM

            context (object) ➜ Additional context

            model_override (string) ➜ Override default model

  OUTPUTS: response (string) ➜ LLM response text

            usage (object) ➜ Token usage statistics

            model_used (string) ➜ Which model was used

Configuration

{
  "type": "router",
  "name": "LLM Router",
  "properties": {
    "llm_provider": "openai",
    "model_name": "gpt-4o-mini",
    "temperature": 0.7,
    "max_tokens": 2048,
    "enable_streaming": true,
    "timeout_seconds": 60,
    "enable_fallback": true,
    "fallback_model": "gpt-3.5-turbo",
    "enable_retry": true,
    "max_retries": 3
  }
}

Step 3: Add the Plan & Execute Agent

The Plan & Execute Agent is the orchestrator. It receives a task, creates a structured plan, then executes it step-by-step — calling tools and the LLM as needed.

Component Schema

PropertyTypeDefaultDescription
prompt_sourceselectautoAuto-generate prompts or use custom
plan_iterationsinteger3Max plan revision cycles
max_stepsinteger20Maximum execution steps
max_retriesinteger3Retries per step
llm_modelstringgpt-4o-miniLLM for planning/execution
memory_typeselectconversationMemory strategy (buffer, conversation, vector)
enable_toolsbooleanfalseEnable tool calling
max_tool_iterationsinteger3Max tool loops per step
verbosebooleanfalseDetailed logging

Input/Output Ports

Plan & Execute Agent

  INPUTS:  task (string) ➜ Task description to solve

            context (object) ➜ Execution context & prior knowledge

            tools (array) ➜ Available tools for execution

            tools_filter (string) ➜ Filter tools by tag

  OUTPUTS: plan (object) ➜ Generated execution plan (JSON)

            current_step (object) ➜ Status of current step

            final_result (object) ➜ Final task result

            state (object) ➜ Full execution state (persistent)

            tools_used (array) ➜ Tools that were executed

            tool_steps (array) ➜ Tool execution steps

Configuration

{
  "type": "plan_execute_agent",
  "name": "Plan & Execute Agent",
  "properties": {
    "prompt_source": "auto",
    "plan_iterations": 3,
    "max_steps": 20,
    "max_retries": 3,
    "llm_model": "gpt-4o-mini",
    "memory_type": "conversation",
    "enable_tools": true,
    "max_tool_iterations": 3,
    "require_specific_format": false,
    "output_parser": "structured",
    "verbose": false
  }
}

Step 4: Add the Memory Store

The Memory Store gives your agent persistence — it remembers previous conversations and can retrieve relevant context using semantic search.

Component Schema

PropertyTypeDefaultDescription
memory_typeselectsqliteStorage backend (sqlite, redis, postgresql, mongodb, filesystem, memory)
enable_conversation_historybooleantrueStore conversation history
enable_semantic_searchbooleantrueEnable semantic/vector search
embedding_modelselecttext-embedding-ada-002Model for embeddings
enable_vector_searchbooleantrueVector similarity search
similarity_thresholdnumber0.7Minimum similarity score
retention_daysinteger30How long to keep entries

Input/Output Ports

Memory Store

  INPUTS:  write (object) ➜ Data to write to memory

            read_query (object) ➜ Query to retrieve data

            delete_query (object) ➜ Query to delete data

  OUTPUTS: read (object) ➜ Data retrieved from memory

            write_status (string) ➜ Write operation status

            memory_stats (object) ➜ Memory usage statistics

Configuration

{
  "type": "memory",
  "name": "Memory Store",
  "properties": {
    "memory_type": "sqlite",
    "storage_path": "./memory/",
    "enable_conversation_history": true,
    "max_conversation_length": 1000,
    "enable_semantic_search": true,
    "embedding_model": "text-embedding-ada-002",
    "enable_vector_search": true,
    "similarity_threshold": 0.7,
    "retention_days": 30,
    "enable_memory_caching": true,
    "cache_size_mb": 256,
    "enable_memory_pruning": true,
    "pruning_strategy": "lru"
  }
}

Step 5: Add the Tool Registry

The Tool Registry lets your agent execute actions — from simple calculators to web searches and custom API calls.

Component Schema

PropertyTypeDefaultDescription
tool_registry_typeselectbuiltinRegistry type (builtin, mcp, custom, openapi)
enable_builtin_toolsbooleantrueInclude built-in tools
builtin_toolsarray`[calculator, text_processor, date_time, file_reader, web_search]Built-in tools to enable
enable_tool_cachingbooleantrueCache identical tool results
enable_tool_chainingbooleantrueAllow chaining multiple tools
max_chain_lengthinteger5Max tools in a chain
enable_tool_parallelismbooleantrueExecute tools in parallel
max_concurrent_toolsinteger5Max tools running simultaneously

Input/Output Ports

Tool Registry

  INPUTS:  tool_request (object) ➜ Tool execution request with function name and parameters

            context (object) ➜ Additional context for execution

  OUTPUTS: tool_result (object) ➜ Result from tool execution

            tool_status (string) ➜ Execution status (success/error/timeout)

            available_tools (array) ➜ List of available tools

Configuration

{
  "type": "tool",
  "name": "Tool Registry",
  "properties": {
    "tool_registry_type": "builtin",
    "enable_builtin_tools": true,
    "builtin_tools": [
      "calculator",
      "text_processor",
      "date_time",
      "file_reader",
      "web_search"
    ],
    "enable_tool_caching": true,
    "cache_ttl_seconds": 300,
    "enable_tool_chaining": true,
    "max_chain_length": 5,
    "enable_tool_parallelism": true,
    "max_concurrent_tools": 5,
    "enable_tool_permissions": true,
    "enable_fallback_tools": true,
    "retry_failed_tools": true,
    "max_retries": 3
  }
}

Step 6: Add Content Guardrails

The Content Guard protects your agent — filtering unsafe content on both input and output. We’ll use two instances: one for input and one for output.

Component Schema

PropertyTypeDefaultDescription
guard_modeselectfilterGuard mode (filter, block, warn, log_only)
enable_profanity_filterbooleantrueFilter offensive language
enable_toxicity_detectionbooleantrueDetect toxic content
toxicity_thresholdnumber0.7Minimum score to flag content
enable_pii_detectionbooleantrueDetect & protect personal info
pii_actionselectmaskAction on PII (mask, remove, redact, flag)
enable_length_limitsbooleantrueEnforce content length
max_lengthinteger10000Maximum content length

Input/Output Ports

Content Guard

  INPUTS:  content_in (any) ➜ Content to be filtered and validated

            context (object) ➜ Additional context for evaluation

  OUTPUTS: filtered_out (any) ➜ Filtered and safe content output

            guard_status (object) ➜ Guard evaluation status and details

            violations (array) ➜ List of detected violations

Configuration — Input Guard

{
  "type": "guardrail",
  "name": "Input Guard",
  "properties": {
    "guard_mode": "block",
    "enable_profanity_filter": true,
    "enable_toxicity_detection": true,
    "toxicity_threshold": 0.7,
    "enable_pii_detection": true,
    "pii_action": "mask",
    "pii_types": ["email", "phone", "ssn", "credit_card", "address"],
    "enable_content_classification": true,
    "blocked_categories": ["hate_speech", "self_harm"],
    "enable_length_limits": true,
    "max_length": 5000,
    "enable_context_awareness": true,
    "context_window_size": 10
  }
}

Configuration — Output Guard

{
  "type": "guardrail",
  "name": "Output Guard",
  "properties": {
    "guard_mode": "filter",
    "enable_profanity_filter": true,
    "enable_toxicity_detection": true,
    "toxicity_threshold": 0.5,
    "enable_pii_detection": true,
    "pii_action": "redact",
    "enable_content_classification": true,
    "blocked_categories": ["hate_speech", "self_harm", "violence"],
    "enable_fact_checking": false,
    "enable_guard_logging": true,
    "log_violations": true
  }
}

Step 7: Complete Pipeline — Wiring It All Together

Now let’s connect everything. Here’s the complete pipeline JSON:

{
  "pipeline": {
    "name": "simple-ai-agent",
    "version": "1.0",
    "description": "A simple conversational AI agent with memory, tools, and guardrails",
    "components": [
      {
        "id": "input_guard",
        "type": "guardrail",
        "name": "Input Guard",
        "properties": {
          "guard_mode": "block",
          "enable_profanity_filter": true,
          "enable_toxicity_detection": true,
          "toxicity_threshold": 0.7,
          "enable_pii_detection": true,
          "pii_action": "mask",
          "pii_types": ["email", "phone", "ssn", "credit_card", "address"],
          "blocked_categories": ["hate_speech", "self_harm"],
          "enable_length_limits": true,
          "max_length": 5000,
          "enable_context_awareness": true
        }
      },
      {
        "id": "agent",
        "type": "plan_execute_agent",
        "name": "Plan & Execute Agent",
        "properties": {
          "prompt_source": "auto",
          "plan_iterations": 3,
          "max_steps": 20,
          "max_retries": 3,
          "llm_model": "gpt-4o-mini",
          "memory_type": "conversation",
          "enable_tools": true,
          "max_tool_iterations": 3,
          "output_parser": "structured"
        }
      },
      {
        "id": "llm_router",
        "type": "router",
        "name": "LLM Router",
        "properties": {
          "llm_provider": "openai",
          "model_name": "gpt-4o-mini",
          "temperature": 0.7,
          "max_tokens": 2048,
          "enable_streaming": true,
          "enable_fallback": true,
          "fallback_model": "gpt-3.5-turbo"
        }
      },
      {
        "id": "memory",
        "type": "memory",
        "name": "Memory Store",
        "properties": {
          "memory_type": "sqlite",
          "enable_conversation_history": true,
          "enable_semantic_search": true,
          "embedding_model": "text-embedding-ada-002",
          "similarity_threshold": 0.7,
          "retention_days": 30
        }
      },
      {
        "id": "tools",
        "type": "tool",
        "name": "Tool Registry",
        "properties": {
          "tool_registry_type": "builtin",
          "enable_builtin_tools": true,
          "builtin_tools": ["calculator", "text_processor", "date_time", "web_search"],
          "enable_tool_caching": true,
          "enable_tool_chaining": true,
          "max_chain_length": 5,
          "enable_tool_parallelism": true,
          "max_concurrent_tools": 5
        }
      },
      {
        "id": "output_guard",
        "type": "guardrail",
        "name": "Output Guard",
        "properties": {
          "guard_mode": "filter",
          "enable_profanity_filter": true,
          "enable_toxicity_detection": true,
          "toxicity_threshold": 0.5,
          "enable_pii_detection": true,
          "pii_action": "redact",
          "blocked_categories": ["hate_speech", "self_harm", "violence"],
          "enable_guard_logging": true,
          "log_violations": true
        }
      }
    ],
    "connections": [
      {
        "from": { "component": "input_guard", "port": "filtered_out" },
        "to": { "component": "agent", "port": "task" }
      },
      {
        "from": { "component": "input_guard", "port": "guard_status" },
        "to": { "component": "agent", "port": "context" }
      },
      {
        "from": { "component": "agent", "port": "final_result" },
        "to": { "component": "output_guard", "port": "content_in" }
      },
      {
        "from": { "component": "memory", "port": "read" },
        "to": { "component": "agent", "port": "context" }
      },
      {
        "from": { "component": "agent", "port": "state" },
        "to": { "component": "memory", "port": "write" }
      },
      {
        "from": { "component": "tools", "port": "available_tools" },
        "to": { "component": "agent", "port": "tools" }
      },
      {
        "from": { "component": "agent", "port": "tool_steps" },
        "to": { "component": "tools", "port": "tool_request" }
      },
      {
        "from": { "component": "agent", "port": "current_step" },
        "to": { "component": "llm_router", "port": "prompt" }
      },
      {
        "from": { "component": "llm_router", "port": "response" },
        "to": { "component": "agent", "port": "initial_state" }
      }
    ]
  }
}

How It Works: End-to-End Walkthrough

Let’s trace a user message through the pipeline:

Example: “What’s 15% of 2,340?”

Step 1 ─ INPUT GUARD

────────────────────

  User input: “What’s 15% of 2,340?”

  ✅ No violations detected

  ✅ No PII found

  → Passes through filtered_out port

Step 2 ─ MEMORY STORE (Read)

────────────────────

  Query: Search for prior context with this user

  → Returns: [] (first conversation)

Step 3 ─ PLAN & EXECUTE AGENT

────────────────────

  Task: “What’s 15% of 2,340?”

  Context: {conversation_history: []}

  Agent creates a plan:

  ┌────────────────────────────────┐

  │ Plan:                           │

  │ 1. Use calculator tool         │

  │    to compute 15% of 2340     │

  │ 2. Return result to user       │

  └────────────────────────────────┘

Step 4 ─ TOOL REGISTRY

────────────────────

  Tool request: calculator.multiply(0.15, 2340)

  → Result: 351

Step 5 ─ LLM ROUTER

────────────────────

  Prompt: “Formulate a natural response for: 15% of 2,340 = 351”

  Model: gpt-4o-mini

  → Response: “15% of 2,340 is 351.”

Step 6 ─ OUTPUT GUARD

────────────────────

  Content: “15% of 2,340 is 351.”

  ✅ No violations

  ✅ No PII leakage

  → Passes through filtered_out port

Step 7 ─ MEMORY STORE (Write)

────────────────────

  Writes: {role: “assistant”, content: “15% of 2,340 is 351.”}

Step 8 ─ USER OUTPUT

────────────────────

  Final response: “15% of 2,340 is 351.”

Component Reference

Here’s a quick-reference table of all the components used in our agent:

ComponentTypeCategoryPurpose
Input Guardguardrailagent-servicesFilters unsafe user input
Output Guardguardrailagent-servicesFilters unsafe AI output
Plan & Execute Agentplan_execute_agentprocessingOrchestrates reasoning & tool use
LLM RouterrouterprocessingRoutes to language models
Memory Storememoryagent-servicesPersists conversation & context
Tool Registrytoolagent-servicesExecutes external tools

Customization Ideas

Once you have the basic agent running, try these enhancements:

 🔧 Add MCP Tools

Replace the builtin tool registry with MCP (Model Context Protocol) for external tool servers:

{
  "tool_registry_type": "mcp",
  "mcp_server_url": "https://your-mcp-server.com",
  "mcp_api_key": "${MCP_API_KEY}",
  "mcp_timeout": 10000
}

🔧 Use Vector Memory

Switch from SQLite to a vector database for semantic memory retrieval:

{
  "memory_type": "redis",
  "enable_semantic_search": true,
  "enable_vector_search": true,
  "embedding_model": "text-embedding-3-small",
  "vector_dimension": 1536,
  "connection_string": "${REDIS_URL}"
}

🔧 Add Custom Guard Rules

Add your own content filtering rules:

{
  "enable_custom_rules": true,
  "custom_rules": "{\"block_competitors\": [\"BrandX\", \"BrandY\"], \"require_disclaimer\": true}"
}

🔧 Upgrade the LLM

Switch to a more powerful model for complex tasks:

{
  "llm_provider": "openai",
  "model_name": "gpt-4o",
  "temperature": 0.3,
  "max_tokens": 4096
}

🔧 Add Fallback Models

Ensure reliability with automatic model fallbacks:

{
  "enable_fallback": true,
  "fallback_model": "gpt-4o-mini",
  "enable_retry": true,
  "max_retries": 3,
  "retry_delay_ms": 1000
}

Key Properties at a Glance

LLM Router — Most Important Settings

PropertyDefaultRecommendedNotes
model_namegpt-4o-minigpt-4o-mini for simple tasksUse gpt-4o for complex reasoning
temperature0.70.3–0.7Lower = more deterministic
max_tokens20482048Increase for long responses
enable_streamingtruetrueBetter UX with streaming
enable_fallbacktruetrueAlways enable for reliability

Content Guard — Most Important Settings

PropertyDefaultRecommendedNotes
guard_modefilterblock for input, filter for outputBlock dangerous input, filter output
toxicity_threshold0.70.7Lower = more strict
pii_actionmaskmask for input, redact for outputProtects user privacy
enable_pii_detectiontruetrueEssential for production
blocked_categorieshate_speech, self_harmhate_speech, self_harm, violenceAdd categories as needed

Tool Registry — Most Important Settings

PropertyDefaultRecommendedNotes
tool_registry_typebuiltinbuiltin for startSwitch to mcp for custom tools
builtin_tools5 toolsStart with calculator + web_searchAdd more as needed
enable_tool_chainingtruetrueLets agent chain tool calls
enable_tool_parallelismtruetrueFaster execution
max_concurrent_tools55Increase for I/O-heavy agents

Troubleshooting

ProblemLikely CauseSolution
Agent doesn’t call toolsenable_tools is falseSet to `true` in Plan & Execute Agent
No conversation memoryMemory not connectedConnect memory.read → agent.context
Unsafe output slips throughOutput guard too lenientLower toxicity_threshold to 0.5
Tool timeoutsDefault timeout too lowIncrease timeout_ms in Tool Registry
Agent loops infinitelyNo step limitSet max_steps in Plan & Execute Agent
High latencySynchronous tool callsEnable enable_tool_parallelism

Conclusion

Just247Pipes makes building AI agents as simple as connecting pipes. With just 6 components and 9 connections, we built a production-ready agent that:

– 🧠 Thinks with Plan & Execute reasoning

– 💬 Remembers with persistent Memory Store

– 🔨 Acts with built-in Tool Registry

– 🛡️ Protects with dual Content Guards

– ⚡ Scales with configurable LLM routing

The entire pipeline is defined in a single JSON file — no code, no frameworks, no boilerplate. Just pipes.

Ready to build your own agent?

Order on-premise

Report an issue

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *