在 AI Agent 的开发中,一个健壮的 Loop 循环(Agent Loop)是其处理复杂任务的核心。simple-agent 作为一款轻量级框架,通过其简洁的接口将 LLM、工具(Tools)和状态(Context)有机结合。
本文将调研 simple-agent 的核心接口,构建一套完备的 Agent Loop 示例,并解析其背后的设计逻辑。
核心接口分析
simple-agent 的设计哲学是“去重型化”,其核心接口围绕着 Agent 类展开:
Agent()初始化:支持自定义 LLM 配置(通过 LiteLLM 支持 100+ 模型)、System Prompt 以及工具目录。run(task):单轮任务执行,适合一次性的问答或任务。chat(message):多轮会话管理,自动维护 Context 状态,这是实现“Agent 记忆”的关键。- Skills System:支持 Tier 1(元数据)到 Tier 2(指令)的渐进式加载,有效减少 token 消耗。
完备的 Agent Loop 示例
以下代码展示了一个具备工具调用与上下文感知的 Agent 运行逻辑:
from simple_agent import SimpleAgent
# 1. 初始化:设置模型与行为约束
agent = SimpleAgent(
model="openrouter/anthropic/claude-3.5-sonnet",
system_prompt="你是一个能够执行网络诊断的专业 AI 助理。",
enable_skills=True
)
# 2. 模拟真实 Agent Loop
def run_agent_loop(task: str):
print(f"--- 任务开始: {task} ---")
# 获取初始结果
response = agent.run(task)
# 3. 循环判断与迭代(模拟生产逻辑)
iterations = 0
while not response['success'] and iterations < 5:
print(f"迭代 {iterations}: 尝试自我修正...")
response = agent.chat("请根据之前的错误重新规划你的工具调用。")
iterations += 1
return response['result']
# 执行
result = run_agent_loop("检查 google.com 的连接性,并根据结果提供建议")
print(f"最终结果: {result}")
关键技术解读
1. 状态维持与“内存”
LLM 本身是无状态的,Agent 的“记忆”完全依赖于 SimpleAgent 类内部的对话历史管理。在 chat() 接口调用时,框架会自动把最新的交互追加到历史列表中,并重新作为整个上下文发送给 LLM。这种实现方式确保了 Agent 的一致性。
2. 工具调用(Tool Calling)的闭环
Agent Loop 的核心在于执行器。当 LLM 选择调用工具时,simple-agent 的循环逻辑会自动解析其输出,运行对应的 Python 函数,并将返回结果作为 tool_result 喂回给模型。这种“规划-执行-反思”的模式,是复杂任务自动化的前提。
3. 渐进式披露(Progressive Disclosure)
该库引入了 Tiered Skill 机制。Agent 默认只加载技能的元数据(Tier 1),当模型在推理过程中发现当前任务需要特定工具时,再动态加载完整的指令(Tier 2)。这种做法极大优化了长文本输入时的 Token 压力,非常适合企业级 Agent 部署。
参考调研:基于 satish860/simple-agent 项目源码及接口文档。