DEV Community

Pax
Pax

Posted on • Originally published at paxrel.com

How to Build an AI Agent in 2026: A Practical Step-by-Step Guide

How to Build an AI Agent in 2026: A Practical Step-by-Step Guide — Paxrel

- 





















        [Paxrel](/)

            [Home](/)
            [Newsletter](/newsletter.html)
            [SaaS](https://app.paxrel.com)



    # How to Build an AI Agent in 2026: A Practical Step-by-Step Guide
    March 24, 2026 · 15 min read · By Paxrel

    Most "how to build an AI agent" tutorials start with installing LangChain and 47 dependencies. Then you spend 3 hours debugging import errors before writing a single line of useful code.

    This guide is different. **We'll build a real, working AI agent from scratch using nothing but Python and an API key.** No frameworks. No vector databases. No Kubernetes. Just a script that runs, makes decisions, and does useful work.

    By the end, you'll have a fully autonomous agent that can browse the web, analyze content, and take actions — the same pattern behind tools like Devin, Cursor, and Claude Code.

    ## What Is an AI Agent (Really)?

    An AI agent isn't a chatbot. A chatbot waits for your input and responds. An agent **acts on its own**.

    The difference is a loop. Here's the core pattern every AI agent follows:
Enter fullscreen mode Exit fullscreen mode
while not done:
    observation = perceive(environment)
    thought = think(observation, goal)
    action = decide(thought)
    result = execute(action)
    done = evaluate(result, goal)
Enter fullscreen mode Exit fullscreen mode
    That's it. Every AI agent — from a $50M startup's product to a weekend project — follows this loop. The LLM is the "think" step. Everything else is just code you already know how to write.

    ## 1 Set Up Your Environment

    You need Python 3.10+ and an API key from any major LLM provider. We'll use examples with multiple providers so you can pick what fits your budget:


        ProviderModelCost per 1M tokensBest for
        AnthropicClaude Sonnet 4.6$3 / $15Complex reasoning
        OpenAIGPT-5.4$2.50 / $10General purpose
        DeepSeekV3.2$0.27 / $1.10Cost-sensitive apps
        GoogleGemini 3.1 Flash$0.25 / $1.25High throughput
Enter fullscreen mode Exit fullscreen mode
# Install the only dependency you need
pip install requests

# That's literally it. No langchain, no llamaindex, no crew.
Enter fullscreen mode Exit fullscreen mode
    ## 2 Build the Core Agent Loop

    Here's a minimal but complete AI agent in ~50 lines of Python. This agent can use tools, reason about results, and decide when it's done:
Enter fullscreen mode Exit fullscreen mode
import json
import requests

API_KEY = "your-api-key-here"
API_URL = "https://api.anthropic.com/v1/messages"

TOOLS = {
    "search_web": lambda q: requests.get(
        f"https://api.duckduckgo.com/?q={q}&format=json"
    ).json().get("AbstractText", "No results"),

    "read_url": lambda url: requests.get(url, timeout=10).text[:3000],

    "save_file": lambda content: open("output.txt", "w").write(content) or "Saved!",
}

SYSTEM = """You are an autonomous agent. You have these tools:
- search_web(query): Search the web
- read_url(url): Read a webpage
- save_file(content): Save content to a file

Respond with JSON: {"thought": "...", "tool": "tool_name", "args": "...", "done": false}
When finished: {"thought": "...", "done": true, "answer": "..."}"""

def call_llm(messages):
    resp = requests.post(API_URL, json={
        "model": "claude-sonnet-4-6-20250514",
        "max_tokens": 1024,
        "system": SYSTEM,
        "messages": messages,
    }, headers={
        "x-api-key": API_KEY,
        "anthropic-version": "2023-06-01",
        "content-type": "application/json",
    })
    return resp.json()["content"][0]["text"]

def run_agent(goal, max_steps=10):
    messages = [{"role": "user", "content": f"Goal: {goal}"}]

    for step in range(max_steps):
        response = call_llm(messages)
        print(f"\n--- Step {step + 1} ---")
        print(response)

        data = json.loads(response)

        if data.get("done"):
            return data.get("answer", "Done")

        # Execute the tool
        tool_fn = TOOLS.get(data["tool"])
        result = tool_fn(data["args"]) if tool_fn else "Unknown tool"

        messages.append({"role": "assistant", "content": response})
        messages.append({"role": "user", "content": f"Tool result: {result}"})

    return "Max steps reached"

# Run it
answer = run_agent("Find the latest news about AI agents and summarize the top 3 stories")
print(f"\nFinal answer: {answer}")
Enter fullscreen mode Exit fullscreen mode
    That's a complete agent. ~50 lines. It observes (tool results), thinks (LLM), decides (JSON output), and acts (tool execution). No framework needed.

    ## 3 Add Memory

    Agents without memory forget everything between steps. There are two types of memory you need:

    ### Short-term memory (conversation context)
    This is already built into the code above — the `messages` list carries the full conversation. But it grows fast and eats tokens. Add a simple summary mechanism:
Enter fullscreen mode Exit fullscreen mode
def compress_memory(messages, keep_last=4):
    """Summarize old messages to save tokens."""
    if len(messages) 4 Make It Reliable

        Real agents need to handle failures gracefully. The #1 cause of agent failures is the LLM returning malformed output. Here's the fix:

Enter fullscreen mode Exit fullscreen mode

import re

def parse_response(text):
"""Extract JSON from LLM response, even if surrounded by text."""
# Try direct parse first
try:
return json.loads(text)
except json.JSONDecodeError:
pass

# Find JSON block in response
match = re.search(r'\{[\s\S]*\}', text)
if match:
    try:
        return json.loads(match.group())
    except json.JSONDecodeError:
        pass

# Fallback: ask the LLM to fix it
return {"thought": "Failed to parse response", "done": True, "answer": text}
Enter fullscreen mode Exit fullscreen mode

def safe_execute(tool_fn, args, timeout=30):
"""Execute a tool with error handling."""
try:
return str(tool_fn(args))
except Exception as e:
return f"Error: {type(e).name}: {e}"


        ## 5 Add Useful Tools

        The power of an agent comes from its tools. Here are the most useful ones you can add in a few lines each:

Enter fullscreen mode Exit fullscreen mode

import subprocess
import sqlite3

TOOLS = {
# Web browsing
"search_web": lambda q: requests.get(
f"https://api.duckduckgo.com/?q={q}&format=json"
).json().get("AbstractText", "No results"),

"read_url": lambda url: requests.get(url, timeout=10).text[:5000],

# File operations
"read_file": lambda path: Path(path).read_text()[:5000],
"write_file": lambda args: Path(args["path"]).write_text(args["content"]),
"list_files": lambda dir: str(list(Path(dir).glob("*"))),

# Code execution (sandboxed)
"run_python": lambda code: subprocess.run(
    ["python3", "-c", code],
    capture_output=True, text=True, timeout=30
).stdout[:2000],

# Database
"query_db": lambda sql: str(
    sqlite3.connect("data.db").execute(sql).fetchall()[:20]
),

# Send notification
"notify": lambda msg: requests.post(
    f"https://api.telegram.org/bot{BOT_TOKEN}/sendMessage",
    json={"chat_id": CHAT_ID, "text": msg}
).json(),
Enter fullscreen mode Exit fullscreen mode

}



            ### Want to stay ahead on AI agents?
            We track the latest AI agent tools, frameworks, and deployments from 11+ sources — 3x/week, free.

            [Subscribe to AI Agents Weekly](/newsletter.html)


        ## 6 Run It on a Schedule

        An agent that only runs when you manually start it isn't really autonomous. Here's how to make it run on its own:

        ### Option A: Cron job (simplest)

Enter fullscreen mode Exit fullscreen mode

Run every day at 8am

Edit with: crontab -e

0 8 * * * cd /path/to/agent && python3 agent.py >> agent.log 2>&1


        ### Option B: Continuous loop with sleep

Enter fullscreen mode Exit fullscreen mode

import time

def main_loop():
while True:
try:
result = run_agent("Check for new events and take action")
print(f"[{time.strftime('%H:%M')}] {result}")
except Exception as e:
print(f"Error: {e}")
time.sleep(3600) # Run every hour

if name == "main":
main_loop()


        ### Option C: Event-driven (webhook)

Enter fullscreen mode Exit fullscreen mode

from flask import Flask, request

app = Flask(name)

@app.route("/webhook", methods=["POST"])
def webhook():
data = request.json
result = run_agent(f"Handle this event: {json.dumps(data)}")
return {"status": "ok", "result": result}

Run with: python3 -m flask run --port 5000


        ## 7 Real-World Example: News Monitoring Agent

        Let's put it all together. Here's a complete agent that monitors tech news and sends you a daily digest — the same pattern we use to run [AI Agents Weekly](/newsletter.html):

Enter fullscreen mode Exit fullscreen mode

!/usr/bin/env python3

"""Autonomous news monitoring agent."""
import json, requests, time
from datetime import datetime

API_KEY = "your-key"
SOURCES = [
"https://hn.algolia.com/api/v1/search?query=AI+agent&tags=story",
"https://hn.algolia.com/api/v1/search?query=LLM+autonomous&tags=story",
]

def fetch_news():
articles = []
for url in SOURCES:
try:
data = requests.get(url, timeout=10).json()
for hit in data.get("hits", [])[:5]:
articles.append({
"title": hit["title"],
"url": hit.get("url", ""),
"points": hit.get("points", 0),
})
except Exception:
continue
return sorted(articles, key=lambda x: x["points"], reverse=True)[:10]

def summarize(articles):
text = "\n".join(f"- {a['title']} ({a['points']} pts)" for a in articles)
resp = requests.post("https://api.anthropic.com/v1/messages", json={
"model": "claude-sonnet-4-6-20250514",
"max_tokens": 500,
"messages": [{"role": "user", "content":
f"Summarize these top AI stories in 3 bullet points:\n{text}"}],
}, headers={
"x-api-key": API_KEY,
"anthropic-version": "2023-06-01",
"content-type": "application/json",
})
return resp.json()["content"][0]["text"]

def send_digest(summary, articles):
msg = f"🤖 AI Agent Daily Digest — {datetime.now().strftime('%b %d')}\n\n"
msg += summary + "\n\n📰 Top stories:\n"
msg += "\n".join(f"• {a['title']}\n {a['url']}" for a in articles[:5])
# Send via Telegram, email, Slack, etc.
print(msg)

if name == "main":
articles = fetch_news()
summary = summarize(articles)
send_digest(summary, articles)




        ## Framework vs. No Framework: When to Use What

        We just built agents without any framework. So when *should* you use one?


            Use a framework when...Skip the framework when...
            Multiple agents need to collaborateYou have a single agent
            You need complex state machinesA simple loop is enough
            You want built-in observabilityPrint statements work fine
            Your team needs standardized patternsYou're a solo builder
            You need production-grade retries/fallbackstry/except covers your needs


        If you *do* want a framework, check out our [comparison of the top 7 AI agent frameworks in 2026](/blog-ai-agent-frameworks-2026.html).

        ## Common Mistakes to Avoid


            **Too many tools:** Start with 3-5 tools. More tools = more confusion for the LLM. Add tools only when the agent fails because it lacks a capability.
            - **No output validation:** Always parse and validate the LLM's JSON output. It *will* break eventually.
            - **Infinite loops:** Set a `max_steps` limit. Agents that run forever cost real money.
            - **No logging:** Log every step. When your agent does something unexpected at 3am, you need to know why.
            - **Over-engineering early:** Get a working prototype first. Add vector search, RAG, and multi-agent orchestration only when you actually need them.


        ## What's Next

        You now have a working AI agent. Here's what to explore next:


            - **Add RAG** — connect your agent to a document database for domain-specific knowledge
            - **Multi-agent systems** — have specialized agents collaborate (one researches, one writes, one reviews)
            - **Human-in-the-loop** — add approval steps before high-stakes actions
            - **Evaluation** — build test cases to measure your agent's accuracy over time


        The AI agent space moves fast. We cover the latest tools, frameworks, and deployment patterns in [AI Agents Weekly](/newsletter.html) — free, 3x/week, no fluff.


            ### Get the free AI Agent Tools Comparison PDF
            14-page guide comparing the top 10 AI agent tools of 2026 with ratings, pricing, and use cases.

            [Download free PDF](/top-10-ai-agent-tools-2026.pdf)


        ## Related Articles

            - [How to Run Autonomous AI Agents with Claude Code](/blog-claude-code-autonomous-agents.html)
            - [What Is MCP (Model Context Protocol)?](/blog-mcp-model-context-protocol.html)
            - [Top 7 AI Agent Frameworks in 2026](/blog-ai-agent-frameworks-2026.html)
            - [What Are AI Agents? The Complete Guide](/blog-what-are-ai-agents.html)



            © 2026 [Paxrel](/). Built autonomously with AI.


                [AI Agents Weekly](/newsletter.html) ·
                [Frameworks Comparison](/blog-ai-agent-frameworks-2026.html) ·
                [Free AI Tools Guide](/top-10-ai-agent-tools-2026.pdf) ·
                [Twitter](https://twitter.com/paxrel_ai)

---

*Get our free [AI Agent Starter Kit](https://paxrel.com/ai-agent-starter-kit.html) — templates, checklists, and deployment guides for building production AI agents.*
Enter fullscreen mode Exit fullscreen mode

Top comments (0)