惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

G
Google Developers Blog
GbyAI
GbyAI
Y
Y Combinator Blog
The GitHub Blog
The GitHub Blog
B
Blog
博客园 - 叶小钗
V
Visual Studio Blog
小众软件
小众软件
阮一峰的网络日志
阮一峰的网络日志
博客园 - 聂微东
S
SegmentFault 最新的问题
Engineering at Meta
Engineering at Meta
博客园 - Franky
V
V2EX
人人都是产品经理
人人都是产品经理
H
Hackread – Cybersecurity News, Data Breaches, AI and More
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
月光博客
月光博客
IT之家
IT之家
T
The Blog of Author Tim Ferriss
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
C
Check Point Blog
N
Netflix TechBlog - Medium
博客园 - 【当耐特】

MarkTechPost

A Coding Implementation of End-to-End Brain Decoding from MEG Signals Using NeuralSet and Deep Learning for Predicting Linguistic Features Meta Introduces Autodata: An Agentic Framework That Turns AI Models into Autonomous Data Scientists for High-Quality Training Data Creation A Coding Guide on LLM Post Training with TRL from Supervised Fine Tuning to DPO and GRPO Reasoning Qwen AI Releases Qwen-Scope: An Open-Source Sparse AutoEncoders (SAE) Suite That Turns LLM Internal Features into Practical Development Tools A Coding Deep Dive into Agentic UI, Generative UI, State Synchronization, and Interrupt-Driven Approval Flows Moonshot AI Open-Sources FlashKDA: CUTLASS Kernels for Kimi Delta Attention with Variable-Length Batching and H20 Benchmarks Microsoft Research’s World-R1 Uses Flow-GRPO and 3D-Aware Rewards to Inject Geometric Consistency Into Wan 2.1 Without Architectural Changes A Coding Implementation on Pyright Type Checking Covering Generics, Protocols, Strict Mode, Type Narrowing, and Modern Python Typing IBM Releases Two Granite Speech 4.1 2B Models: Autoregressive ASR with Translation and Non-Autoregressive Editing for Fast Inference Top 10 KV Cache Compression Techniques for LLM Inference: Reducing Memory Overhead Across Eviction, Quantization, and Low-Rank Methods Qwen Team Releases FlashQLA: a High-Performance Linear Attention Kernel Library That Achieves Up to 3× Speedup on NVIDIA Hopper GPUs Step by Step Guide to Build a Complete PII Detection and Redaction Pipeline with OpenAI Privacy Filter Meta FAIR Releases NeuralSet: A Python Package for Neuro-AI That Supports fMRI, M/EEG, Spikes, and HuggingFace Embeddings smol-audio: A Colab-Friendly Notebook Collection for Fine-Tuning Whisper, Parakeet, Voxtral, Granite Speech, and Audio Flamingo 3 A Coding Implementation on Document Parsing Benchmarking with LlamaIndex ParseBench Using Python, Hugging Face, and Evaluation Metrics Poolside AI Introduces Laguna XS.2 and M.1: Agentic Coding Models Reaching 68.2% and 72.5% on SWE-bench Verified How to Build Traceable and Evaluated LLM Workflows Using Promptflow, Prompty, and OpenAI OpenAI Releases Privacy Filter: A 1.5B-Parameter Open-Source PII Redaction Model with 50M Active Parameters Top 10 Physical AI Models Powering Real-World Robots in 2026 How to Build a Lightweight Vision-Language-Action-Inspired Embodied Agent with Latent World Modeling and Model Predictive Control Meet Talkie-1930: A 13B Open-Weight LLM Trained on Pre-1931 English Text for Historical Reasoning and Generalization Research Build a Reinforcement Learning Powered Agent that Learns to Retrieve Relevant Long-Term Memories for Accurate LLM Question Answering OpenMOSS Releases MOSS-Audio: An Open-Source Foundation Model for Speech, Sound, Music, and Time-Aware Audio Reasoning Meta AI Releases Sapiens2: A High-Resolution Human-Centric Vision Model for Pose, Segmentation, Normals, Pointmap, and Albedo The LoRA Assumption That Breaks in Production How to Build a Fully Searchable AI Knowledge Base with OpenKB, OpenRouter, and Llama How to Build Smarter Multilingual Text Wrapping with BudouX Through Parsing, HTML Rendering, Model Introspection, and Toy Training Top 7 Benchmarks That Actually Matter for Agentic Reasoning in Large Language Models RAG Without Vectors: How PageIndex Retrieves by Reasoning A Coding Tutorial on Datashader on Rendering Massive Datasets with High-Performance Python Visual Analytics
A Coding Implementation to Build Multi-Agent AI Systems w...
Asif Razzaq · 2026-04-16 · via MarkTechPost

In this tutorial, we build an advanced, production-ready agentic system using SmolAgents and demonstrate how modern, lightweight AI agents can reason, execute code, dynamically manage tools, and collaborate across multiple agents. We start by installing dependencies and configuring a powerful yet efficient LLM backend, and then progressively design custom tools, including mathematical utilities, memory storage, and web search capabilities. We explore both CodeAgent and ToolCallingAgent paradigms, understand how tools are managed dynamically through the agent.tools dictionary, and implement multi-agent orchestration.

import subprocess, sys


def pip(*args):
   subprocess.check_call([sys.executable, "-m", "pip", "install", "-q", *args])


pip("smolagents[all]", "duckduckgo-search", "wikipedia", "rich")


import os, math, textwrap
from rich.console import Console
from rich.panel   import Panel
from rich.table   import Table
from rich         import print as rprint


console = Console()


def section(title: str, color: str = "bold cyan"):
   console.rule(f"[{color}]{title}[/{color}]")


def show(label: str, value):
   console.print(Panel(str(value), title=f"[bold yellow]{label}[/bold yellow]", expand=False))


import getpass


OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
if not OPENAI_API_KEY:
   OPENAI_API_KEY = getpass.getpass("🔑 Enter your OpenAI API key: ")
   os.environ["OPENAI_API_KEY"] = OPENAI_API_KEY


console.print("[green]✓ OpenAI API key loaded.[/green]")


section("SECTION 1 · SmolAgents Architecture")


console.print(Panel("""
SmolAgents (HuggingFace) is a minimalist agent framework.
Current stable release: 1.24.0   |   Using: OpenAI gpt-4o-mini


CORE ABSTRACTIONS
 Tool
 agent.tools (dict)
 ToolCollection
 LiteLLMModel
 CodeAgent
 ToolCallingAgent


MULTI-AGENT  (v1.8+ API)
 Pass sub-agents directly via  managed_agents=[sub_agent]
 Sub-agents need  name=  and  description=  set at init.
 ManagedAgent wrapper class was removed in v1.8.0.


EXECUTION LOOP (CodeAgent)
 Task ──► LLM writes Python ──► sandbox executes it
      ◄── observation (tool output / exception) ◄──
 Repeats up to max_steps, then calls final_answer(...)
""", title="[bold green]Architecture[/bold green]"))

We install all required dependencies and set up the execution environment. We configure secure API key loading and initialize the rich console utilities for structured output formatting. We also introduce the architectural overview of SmolAgents to establish a strong conceptual foundation before building agents.

section("SECTION 2 · Building Custom Tools")


from smolagents import Tool, tool


@tool
def celsius_to_fahrenheit(celsius: float) -> str:
   return f"{celsius}°C = {celsius * 9/5 + 32:.2f}°F"


class PrimeTool(Tool):


   name        = "prime_checker"
   description = (
       "If composite, returns the smallest prime factor."
   )
   inputs = {
       "n": {"type": "integer", "description": "Positive integer to test."}
   }
   output_type = "string"


   def forward(self, n: int) -> str:
       if n < 2:
           return f"{n} is not prime (must be >= 2)."
       for i in range(2, int(math.isqrt(n)) + 1):
           if n % i == 0:
               return f"{n} is NOT prime. Smallest factor: {i}."
       return f"{n} IS prime!"


class MemoTool(Tool):


   name        = "memory_store"
   description = (
       "Stores or retrieves key-value pairs. "
       "action='set' stores key+value; "
       "action='get' retrieves by key; "
       "action='list' shows all keys."
   )
   inputs = {
       "action": {"type": "string", "description": "set | get | list"},
       "key":    {"type": "string", "description": "Memory key (skip for list)", "nullable": True},
       "value":  {"type": "string", "description": "Value to store (set only)",  "nullable": True},
   }
   output_type = "string"


   def __init__(self, *args, **kwargs):
       super().__init__(*args, **kwargs)
       self._store: dict[str, str] = {}


   def forward(self, action: str, key: str = None, value: str = None) -> str:
       if action == "set":
           self._store[key] = value
           return f"Stored '{key}' = '{value}'"
       elif action == "get":
           return self._store.get(key, f"Key '{key}' not found.")
       elif action == "list":
           return "Keys: " + ", ".join(self._store.keys()) if self._store else "Memory empty."
       return "Unknown action. Use: set | get | list"

We define custom tools using both decorator-based and class-based approaches to demonstrate flexibility in tool creation. We implement mathematical reasoning and a stateful memory tool to enable persistent interactions across agent steps. We structure the tools with clear schemas so the agents can interpret and invoke them correctly.

class DuckDuckGoTool(Tool):


   name        = "web_search"
   description = "Performs a web search and returns top results as plain text."
   inputs = {
       "query":       {"type": "string",  "description": "The search query."},
       "max_results": {"type": "integer", "description": "Results to return (1-10).", "nullable": True},
   }
   output_type = "string"


   def forward(self, query: str, max_results: int = 3) -> str:
       try:
           from duckduckgo_search import DDGS
           with DDGS() as ddgs:
               results = [
                   f"* {r['title']}\n  {r['href']}\n  {r['body'][:200]}"
                   for r in ddgs.text(query, max_results=max_results)
               ]
           return "\n\n".join(results) if results else "No results found."
       except Exception as e:
           return f"Search failed: {e}"


@tool
def factorial(n: int) -> str:
   return f"{n}! = {math.factorial(n)}"


show("celsius_to_fahrenheit(100)", celsius_to_fahrenheit(100))
show("PrimeTool — 97",             PrimeTool().forward(97))
show("PrimeTool — 100",            PrimeTool().forward(100))
m = MemoTool()
m.forward("set", "author", "Ada Lovelace")
show("MemoTool get 'author'",      m.forward("get", "author"))


section("SECTION 3 · Managing Tools  (agent.tools dict)")


console.print(Panel("""
The Toolbox class was removed in v1.x.
Tools live in  agent.tools, a plain Python dict keyed by tool name.
""", title="[bold green]Tools Dict[/bold green]"))


section("SECTION 4 · LLM Engines")


console.print(Panel("""
SmolAgents supports multiple LLM backends via  LiteLLMModel.
We use  gpt-4o-mini.
""", title="[bold green]Engine Options[/bold green]"))


from smolagents import LiteLLMModel


MODEL_ID = "openai/gpt-4o-mini"
engine   = LiteLLMModel(model_id=MODEL_ID, api_key=OPENAI_API_KEY)
console.print(f"[green]Engine ready:[/green] {MODEL_ID}")

We extend the system with a web search tool and a factorial utility to broaden the agent’s capabilities. We test the tools independently to verify correctness before integrating them into agents. We also initialize the LLM engine using LiteLLMModel, preparing the core reasoning backend for execution.

section("SECTION 5 · CodeAgent")


from smolagents import CodeAgent


code_agent = CodeAgent(
   tools           = [celsius_to_fahrenheit, PrimeTool(), MemoTool(), DuckDuckGoTool()],
   model           = engine,
   max_steps       = 6,
   verbosity_level = 1,
)


console.print("\n[bold]Initial agent.tools keys:[/bold]", list(code_agent.tools.keys()))
code_agent.tools["factorial"] = factorial
console.print("[dim]After adding factorial:[/dim]", list(code_agent.tools.keys()))


console.print("\n[bold yellow]Task 1:[/bold yellow]")
result1 = code_agent.run(
   "Convert boiling point (100C) and body temperature (37C) to Fahrenheit. "
   "Which is higher and by how much?"
)
show("CodeAgent — Task 1", result1)


console.print("\n[bold yellow]Task 2:[/bold yellow]")
result2 = code_agent.run("What is 17 times 19? Is that result prime? Also check 7919.")
show("CodeAgent — Task 2", result2)


console.print("\n[bold yellow]Task 3:[/bold yellow]")
result3 = code_agent.run("Compute 10! using the factorial tool.")
show("CodeAgent — Task 3", result3)

We construct a CodeAgent that can write and execute Python dynamically to solve multi-step problems. We demonstrate runtime tool injection by adding a new tool without rebuilding the agent. We then execute progressively complex reasoning tasks to validate chaining, arithmetic computation, and tool coordination.

section("SECTION 6 · ToolCallingAgent (ReAct)")


from smolagents import ToolCallingAgent


react_agent = ToolCallingAgent(
   tools           = [celsius_to_fahrenheit, PrimeTool(), MemoTool()],
   model           = engine,
   max_steps       = 5,
   verbosity_level = 1,
)


console.print("\n[bold yellow]Task 4:[/bold yellow]")
result4 = react_agent.run(
   "Then retrieve both facts and summarise them."
)
show("ToolCallingAgent — Task 4", result4)


section("SECTION 7 · Multi-Agent Orchestration  (v1.8+ API)")


math_agent = CodeAgent(
   tools           = [PrimeTool()],
   model           = engine,
   max_steps       = 4,
   name            = "math_specialist",
   description     = "Handles mathematical questions and primality checks.",
   verbosity_level = 0,
)


research_agent = ToolCallingAgent(
   tools           = [DuckDuckGoTool(), MemoTool()],
   model           = engine,
   max_steps       = 4,
   name            = "research_specialist",
   description     = "Searches the web and stores or retrieves facts from memory.",
   verbosity_level = 0,
)


manager_agent = CodeAgent(
   tools           = [],
   model           = engine,
   managed_agents  = [math_agent, research_agent],
   max_steps       = 8,
   verbosity_level = 1,
)


console.print("\n[bold yellow]Task 5:[/bold yellow]")
result5 = manager_agent.run(
   "Find out what year Python was first released (use research_specialist), "
   "then check whether that year is a prime number (use math_specialist)."
)
show("Manager Agent — Task 5", result5)

We build a ToolCallingAgent to showcase structured ReAct-style reasoning with controlled tool invocation. We then implement a multi-agent orchestration system where specialized agents collaborate under a manager agent. We demonstrate delegation, coordination, and cross-agent reasoning to solve compound tasks efficiently.

In conclusion, we constructed a fully functional multi-agent system capable of reasoning, searching, calculating, storing memory, and delegating tasks between specialized agents. We demonstrated how SmolAgents enables flexible tool integration, runtime extensibility, and structured collaboration without unnecessary architectural complexity. We showed how CodeAgent executes real Python logic for advanced chaining, while ToolCallingAgent ensures structured, auditable reasoning loops. Finally, we implemented a manager agent that coordinates specialized sub-agents, proving how scalable orchestration can be achieved with minimal overhead.


Check out the Full Implementation Code and Notebook. Also, feel free to follow us on Twitter and don’t forget to join our 130k+ ML SubReddit and Subscribe to our Newsletter. Wait! are you on telegram? now you can join us on telegram as well.

Need to partner with us for promoting your GitHub Repo OR Hugging Face Page OR Product Release OR Webinar etc.? Connect with us