How to Build Agentic AI from Scratch for Free - blog ryuzaki

How to Build Agentic AI from Scratch for Free

I still cringe thinking about the month I burned over $400 on cloud API credits just trying to make a basic task bot. My bank account was crying, and my agent kept getting stuck in infinite loops anyway.

That painful month taught me a huge lesson: you don’t need deep pockets or fancy enterprise frameworks to build powerful AI agents. You can build a fully functional, self-reasoning agent on your own laptop without spending a single dime.

How to Build Agentic AI from Scratch for Free

In this guide, I’m going to show you step-by-step how I built my first zero-cost agent. We’ll skip the hype, use plain Python, run local open-source models, and set up a custom reasoning loop from scratch.

What Makes an AI "Agentic" Anyway?

Before we start writing code, let's clear up the confusion between a standard chatbot and an agent. Standard chatbots just reply to what you type based on what they already know.

An agentic AI goes further because it can plan steps, choose tools, examine results, and adapt its behavior to achieve a goal. It runs inside a decision loop often called the ReAct (Reason + Act) pattern.

               +-----------------------+
               |      User Input       |
               +-----------+-----------+
                           |
                           v
              +------------+------------+
              |    1. Think (Reason)    |
              +------------+------------+
                           |
                           v
              +------------+------------+
              |  2. Act (Tool Call)     |
              +------------+------------+
                           |
                           v
              +------------+------------+
              | 3. Observe (Get Result) |
              +------------+------------+
                           |
      Does the answer complete the goal?
             /                   \
        [ No ]                  [ Yes ]
          |                        |
          v                        v
(Loop back to Think)      (Deliver Final Output)

Think of it like hiring a research assistant. If you ask them to find the weather in Tokyo and calculate your trip budget, they don't just guess. They search the web, open a calculator, check their math, and hand you the final answer.

The Core Architecture of an Agent

To make an agent work without external paid libraries, you need four core ingredients:

  • The Brain (LLM): The core language model that parses context and makes decisions.

  • Tools: Python functions the model can trigger, like custom search tools, database queries, or math functions.

  • The Loop (Reasoning): A standard while loop that handles the conversation state until a solution is reached.

  • Memory: A local buffer storing previous prompts, tool executions, and system notes.

The $0 Local Tech Stack

To keep this completely free, we're going to avoid cloud providers entirely. Everything will run on your computer hardware using open-source tools.

Here is what we are using for our build:

ComponentTool ChoiceCostWhy We're Using It
Model RuntimeOllama$0.00Lets you download and run open-source LLMs locally on CPU or GPU.
LLM Modelllama3.2 or qwen2.5$0.00Compact, highly capable open models that support native function calling.
LanguagePython 3.10+$0.00Clean environment for defining tools and driving the execution loop.
Client SDKollama Python library$0.00Simple, official library to stream messages and execute tool schema.

Pro Tip: If your machine doesn't have a dedicated GPU, stick with lightweight 3B parameter models like llama3.2:3b or qwen2.5:3b. They run smoothly on standard laptops with 8GB of RAM!

Step 1: Set Up Your Free Local Model Server

First, we need to install Ollama so our machine can run open-source models natively. Head over to ollama.com and download the installer for your operating system.

Once installed, open your command terminal and pull down a tool-capable model like Llama 3.2:

Bash
ollama pull llama3.2

After the download finishes, test it in terminal with a quick prompt. If it responds quickly, your local server is ready. Now, open your project directory and install the Python library:

Bash
pip install ollama

Step 2: Define Your Custom Python Tools

An agent isn't an agent unless it can interact with the outside world. Tools are simply standard Python functions that we expose to the LLM.

Let me show you a real mistake I made early on. I forgot to add type hints and docstrings to my functions, and the model kept passing invalid parameters! Clear docstrings are what tell the model how and when to use a tool.

Let's create two practical tools in a file named agent.py:

Python
import ollama

def add_numbers(a: float, b: float) -> float:
    """Adds two numbers together. Use this for math operations."""
    return float(a) + float(b)

def get_system_status() -> str:
    """Returns fake internal system status data for testing purposes."""
    return "All local system services operational. Memory usage: 42%."

# Map tool names directly to Python functions
available_tools = {
    'add_numbers': add_numbers,
    'get_system_status': get_system_status,
}

Step 3: Build the Reasoning Loop from Scratch

Many developers jump straight into massive frameworks like LangChain or AutoGen when starting out. But learning how the raw loop works under the hood gives you far better control over your code.

The loop works like this: send context to Ollama, check if the response requests a tool call, execute the tool locally, and feed the result back to the LLM.

Here is the complete zero-framework agent script:

Python
import ollama

# 1. Define tools
def add_numbers(a: float, b: float) -> float:
    """Adds two numbers together."""
    return a + b

def get_system_status() -> str:
    """Returns system status info."""
    return "All systems normal. CPU at 18%."

tools_map = {
    'add_numbers': add_numbers,
    'get_system_status': get_system_status
}

def run_agent(user_prompt: str):
    # Initialize message list with system instruction
    messages = [
        {"role": "system", "content": "You are a helpful agent. Use tools to answer when needed."},
        {"role": "user", "content": user_prompt}
    ]

    max_iterations = 5
    step = 0

    while step < max_iterations:
        step += 1
        print(f"\n--- [Iteration {step}] ---")

        # Query the local model
        response = ollama.chat(
            model='llama3.2',
            messages=messages,
            tools=[add_numbers, get_system_status]
        )

        message = response['message']
        messages.append(message)

        # Check if model wants to call a tool
        tool_calls = message.get('tool_calls')
        
        if not tool_calls:
            # No tools needed, final answer reached
            print(f"Agent Answer: {message['content']}")
            break

        # Execute requested tools
        for tool in tool_calls:
            func_name = tool['function']['name']
            args = tool['function']['arguments']
            
            print(f"Action: Calling {func_name} with args {args}")
            
            if func_name in tools_map:
                result = tools_map[func_name](**args)
                print(f"Observation: {result}")

                # Feed observation back into message history
                messages.append({
                    'role': 'tool',
                    'content': str(result),
                })

# Run the local agent
run_agent("Can you check system status and add 145.5 plus 320.5?")

What I Wish I Knew Before Building Agents

When I built my first custom agent loop, I ran into three brutal roadblocks that almost made me quit. Knowing these beforehand will save you hours of debugging pain!

1. The Death Loop Problem

Without a strict max_iterations ceiling, an agent might call the same broken function endlessly. Always wrap your execution loop in a strict fallback guard like step < 5.

2. Context Window Creep

Every back-and-forth observation adds tokens to your memory array. On small local models, long conversation logs will degrade performance or crash memory. Keep system prompts tight and trim ancient messages if conversations drag on.

3. Model Hallucinations on Tool Inputs

Sometimes smaller local LLMs fail to format JSON parameters properly. To fix this, use explicit Python type annotations inside tool definitions, or write quick input validation blocks inside your function calls.

Key Takeaways for Building Free Agents

  • No Cloud Required: Open-source models like Llama 3.2 running on Ollama allow full offline agent development at zero cost.

  • Raw Code First: Avoid complex third-party libraries when learning; a basic while loop handles ReAct reasoning cleanly.

  • Safety Rules Matter: Always set a max iteration limit to prevent infinite tool execution loops.

  • Clear Docstrings: Write explicit Python function descriptions so the LLM understands when to trigger tools.

Belum ada Komentar untuk "How to Build Agentic AI from Scratch for Free"

Posting Komentar

Iklan Atas Artikel

Iklan Tengah Artikel 1

Iklan Tengah Artikel 2

Iklan Bawah Artikel