Hugging Face 的轻量 Agent 框架,CodeAgent 直接生成并执行 Python 动作。
smolagents 用很少的抽象实现 ReAct 循环:模型每一步输出思考和一个动作,框架执行工具并把观察结果写回记忆。CodeAgent 把动作写成 Python 代码,表达力强、适合数据处理;ToolCallingAgent 用 JSON 工具调用,约束更强、对模型能力要求更低。
工具可以用 @tool 装饰普通函数,或继承 Tool 定义 name、description、inputs、output_type 和 forward。模型侧支持 InferenceClientModel、LiteLLMModel、TransformersModel 等;max_steps 默认 20,add_base_tools=True 会加入内置工具。
安全边界要特别注意:本地 Python executor 基于 AST 限制导入,不是强隔离沙箱,不能用来执行不可信代码。生产或面向用户的场景应使用 executor_type="docker"、"e2b"、"modal" 等远程执行器,并限制导入、步数和网络。
安装基础包;需要网页搜索等工具时再装 toolkit 额外依赖:
pip install -U "smolagents[toolkit]"
export HF_TOKEN="hf_..."
用 CodeAgent 跑一个最小任务,模型通过 HF Inference 调用:
from smolagents import CodeAgent, InferenceClientModel
model = InferenceClientModel(model_id="Qwen/Qwen2.5-Coder-32B-Instruct")
agent = CodeAgent(tools=[], model=model, max_steps=8)
print(agent.run("计算 2 的 10 次方,并解释每一步"))
需要工具调用而不是代码执行时换 ToolCallingAgent:
from smolagents import ToolCallingAgent, WebSearchTool, InferenceClientModel
agent = ToolCallingAgent(tools=[WebSearchTool()], model=InferenceClientModel(), max_steps=8)
print(agent.run("查一下 Milvus 最新稳定版本"))
用 @tool 定义自定义工具,docstring 的 Args 会进入参数说明:
from smolagents import tool
@tool
def disk_free(path: str) -> int:
"""返回指定路径的可用字节数。
Args:
path: 要检查的目录路径。
"""
import shutil
return shutil.disk_usage(path).free
给 CodeAgent 放开必要导入,并限制步数;不要开放整个标准库:
from smolagents import CodeAgent, InferenceClientModel
agent = CodeAgent(tools=[], model=InferenceClientModel(),
additional_authorized_imports=["pandas", "numpy"],
max_steps=10)
print(agent.run("统计 data.csv 的行数"))
把代码执行放进 Docker,退出上下文时清理容器:
from smolagents import CodeAgent, InferenceClientModel
with CodeAgent(tools=[], model=InferenceClientModel(), executor_type="docker") as agent:
print(agent.run("列出当前目录文件并统计数量"))
用 LiteLLM 接本地 Ollama 的 OpenAI 兼容接口:
from smolagents import CodeAgent, LiteLLMModel
model = LiteLLMModel(model_id="ollama_chat/qwen2.5-coder:7b", api_base="http://localhost:11434")
agent = CodeAgent(tools=[], model=model, max_steps=6)
print(agent.run("写一个检查磁盘使用率的 Python 片段"))
CLI 适合快速验证,--imports 和 --tools 控制能力边界:
smolagent "统计当前目录下最大的 5 个文件" \
--model-type InferenceClientModel --model-id "Qwen/Qwen2.5-Coder-32B-Instruct" \
--imports "os pathlib" --tools ""
查看每一步的记忆和工具结果,便于定位错误:
print(len(agent.memory.steps))
print(agent.write_memory_to_messages())
additional_authorized_imports 只写顶层包不够,用到子模块时要显式加入;缺权限会抛 InterpreterError,而不是模型答错。max_steps 时默认 20,复杂任务可能提前停止;调大上限同时设置 final_answer_checks,避免无限循环。agent.memory.steps。Args,模型拿不到参数说明;用 @tool 时先检查生成的 schema。HF_TOKEN,并在 429 时降低并发或换 provider。push_to_hub 要求工具代码自包含,导入写在函数内部;依赖宿主全局变量的工具上传后会失败。GradioUI 默认保留记忆,多用户场景会串上下文;设置 reset_agent_memory=True 或每个会话新建 Agent。additional_authorized_imports 只开放必要模块,设置 max_steps 限制循环,并用 executor_type="docker" 或 "e2b" 做隔离。