Sandbox escape via dunder attribute validation bypass in LocalPythonExecutor. Fixed in v1.21.0 but architectural issues persist.
smolagents (HuggingFace)
watch⚠️ RESEARCH/EXPERIMENTATION ONLY. 26,100 GitHub stars; 443K PyPI/month. CVE-2025-9959 (JFrog, CVSS 7.6): sandbox escape via LocalPythonExecutor. NCC Group (2025-07-28): arbitrary file read/write + RCE via prompt injection — architectural mitigation only. Docker/E2B sandboxing is a hard requirement, not optional.
Where it wins
26,160 GitHub stars — strong research community (driven by HuggingFace brand + 'Open Deep Research' virality, 395 HN points)
CodeAgent paradigm (code-based tool-calling vs JSON) is genuinely differentiated
Best for HuggingFace model experimentation and academic research
456K PyPI/month — research-grade adoption
Where to be skeptical
⚠️ CVE-2025-9959 (JFrog, CVSS 7.6): LocalPythonExecutor sandbox escape via dunder attribute validation bypass. Fixed in v1.21.0 but architectural risk remains.
⚠️ NCC Group (2025-07-28): additional_authorized_imports enables arbitrary file read/write + RCE via prompt injection. No code-level patch — Docker/E2B required.
Last stable release v1.24.0 (2026-01-16) — 2 months ago, moderate commit velocity
Cannot be deployed in production with LocalPythonExecutor under any configuration
Editorial verdict
Research and experimentation only. LocalPythonExecutor must NOT be used in production under any circumstances. Two independent security firms (JFrog + NCC Group) confirmed this. Docker or E2B sandboxing is an architectural requirement. Best for: evaluating CodeAgent paradigm, HuggingFace model experimentation, academic research.
Source
Related

Claude Code
98Anthropic's official agentic coding CLI. v2.1.81 (Mar 20) shipped `--bare`, smarter worktree resume, and improved MCP OAuth while the repo crossed 82,204 stars and logged ~14 commits/week across 10+ maintainers. Terminal-native, tool-use-driven, with deep file system + shell access, #1 SWE-bench Pro standardized (45.89%), ~4% of GitHub public commits (SemiAnalysis), $2.5B annualized revenue. 8M+ npm weekly downloads. Opus 4.6 with 1M context.
LangGraph
95#1 Python agent framework by production evidence — 40.2M PyPI downloads/month, Fortune 500 deployments (LinkedIn, Uber, Replit, Elastic, Klarna, Cloudflare, Coinbase), ~400 LangGraph Platform companies, LangSmith rated best-in-class observability. Stable v1.x API, model-agnostic, MCP support.
Pydantic AI
95#3 Python agent framework by downloads — 15.6M PyPI/month. Built by the Pydantic team. Runtime type enforcement is a genuine differentiator no other framework offers. V1 shipped with Temporal integration for durable execution and Logfire observability. Emerging pattern: 'Pydantic AI for agent logic, LangGraph for orchestration' (ZenML).
AutoGen (Microsoft)
95⚠️ MAINTENANCE MODE — Microsoft officially confirmed bug fixes and security patches only, no new features (VentureBeat 2026-02-19). 55.9K stars but only 1.57M PyPI/month — DL/star ratio of 28, the most inflated among active frameworks. Being replaced by Microsoft Agent Framework (AutoGen + Semantic Kernel merge, GA targeted ~Q2 2026). Teams on AutoGen should plan migration.
Public evidence
additional_authorized_imports enables arbitrary file read/write and potential RCE via prompt injection. Architectural mitigation only — Docker or E2B required. Two independent firms confirm: do not deploy LocalPythonExecutor in production.
Raw GitHub source
GitHub README peek
Constrained peek so you can sanity-check the source material without leaving the site.
smolagents is a library that enables you to run powerful agents in a few lines of code. It offers:
✨ Simplicity: the logic for agents fits in ~1,000 lines of code (see agents.py). We kept abstractions to their minimal shape above raw code!
🧑💻 First-class support for Code Agents. Our CodeAgent writes its actions in code (as opposed to "agents being used to write code"). To make it secure, we support executing in sandboxed environments via Blaxel, E2B, Modal, Docker, or Pyodide+Deno WebAssembly sandbox.
🤗 Hub integrations: you can share/pull tools or agents to/from the Hub for instant sharing of the most efficient agents!
🌐 Model-agnostic: smolagents supports any LLM. It can be a local transformers or ollama model, one of many providers on the Hub, or any model from OpenAI, Anthropic and many others via our LiteLLM integration.
👁️ Modality-agnostic: Agents support text, vision, video, even audio inputs! Cf this tutorial for vision.
🛠️ Tool-agnostic: you can use tools from any MCP server, from LangChain, you can even use a Hub Space as a tool.
Full documentation can be found here.
[!NOTE] Check the our launch blog post to learn more about
smolagents!
Quick demo
First install the package with a default set of tools:
pip install "smolagents[toolkit]"
Then define your agent, give it the tools it needs and run it!
from smolagents import CodeAgent, WebSearchTool, InferenceClientModel
model = InferenceClientModel()
agent = CodeAgent(tools=[WebSearchTool()], model=model, stream_outputs=True)
agent.run("How many seconds would it take for a leopard at full speed to run through Pont des Arts?")
https://github.com/user-attachments/assets/84b149b4-246c-40c9-a48d-ba013b08e600
You can even share your agent to the Hub, as a Space repository:
agent.push_to_hub("m-ric/my_agent")
# agent.from_hub("m-ric/my_agent") to load an agent from Hub
Our library is LLM-agnostic: you could switch the example above to any inference provider.
<details> <summary> <b>InferenceClientModel, gateway for all <a href="https://huggingface.co/docs/inference-providers/index">inference providers</a> supported on HF</b></summary>from smolagents import InferenceClientModel
model = InferenceClientModel(
model_id="deepseek-ai/DeepSeek-R1",
provider="together",
)
</details>
<details>
<summary> <b>LiteLLM to access 100+ LLMs</b></summary>
from smolagents import LiteLLMModel
model = LiteLLMModel(
model_id="anthropic/claude-4-sonnet-latest",
temperature=0.2,
api_key=os.environ["ANTHROPIC_API_KEY"]
)
</details>
<details>
<summary> <b>OpenAI-compatible servers: Together AI</b></summary>
import os
from smolagents import OpenAIModel
model = OpenAIModel(
model_id="deepseek-ai/DeepSeek-R1",
api_base="https://api.together.xyz/v1/", # Leave this blank to query OpenAI servers.
api_key=os.environ["TOGETHER_API_KEY"], # Switch to the API key for the server you're targeting.
)
</details>
<details>
<summary> <b>OpenAI-compatible servers: OpenRouter</b></summary>
import os
from smolagents import OpenAIModel
model = OpenAIModel(
model_id="openai/gpt-4o",
api_base="https://openrouter.ai/api/v1", # Leave this blank to query OpenAI servers.
api_key=os.environ["OPENROUTER_API_KEY"], # Switch to the API key for the server you're targeting.
)
</details>
<details>
<summary> <b>Local `transformers` model</b></summary>
from smolagents import TransformersModel
model = TransformersModel(
model_id="Qwen/Qwen3-Next-80B-A3B-Thinking",
max_new_tokens=4096,
device_map="auto"
)