QUICKSTART.md - 快速上手指南
examples/production_template/ - 生产级模板
examples/content_finder/ - 实战案例
pip install -r requirements.txt
pip install dbutils pymysql # browser 模块依赖
cp .env.example .env
# 编辑 .env 填入 OPENROUTER_API_KEY
python examples/production_template/run.py
examples/content_finder/demo.py 查看效果examples/production_template/ 的代码结构examples/production_template/ 作为起点┌─────────────────────────────────────┐
│ AgentRunner │
│ ┌──────────┐ ┌──────────┐ │
│ │ LLM │ │ Trace │ │
│ │ Call │ │ Store │ │
│ └──────────┘ └──────────┘ │
└─────────────────────────────────────┘
│
┌──────┴──────┐
│ │
┌───▼───┐ ┌───▼────┐
│ Tools │ │ Skills │
│ │ │ │
│ 工具 │ │ 技能 │
│ 能力 │ │ 知识 │
└───────┘ └────────┘
@tool 装饰器.md 文件,使用 YAML frontmatter@tool(description="简洁清晰的描述")
async def my_tool(
param: str, # 明确的参数类型
optional: str = "default", # 可选参数有默认值
ctx: ToolContext = None, # 上下文参数
) -> ToolResult:
"""
详细的文档字符串
Args:
param: 参数说明
optional: 可选参数说明
"""
try:
# 业务逻辑
result = do_something(param)
return ToolResult(
title="成功",
output="结果描述",
data={"key": "value"}, # 结构化数据
)
except Exception as e:
logger.error(f"错误: {e}", exc_info=True)
return ToolResult(
title="失败",
output=str(e),
error=True,
)
---
name: skill-name
description: 简短描述
category: 分类
---
# 技能名称
## 何时使用
- 明确的使用场景
- 具体的触发条件
## 工作流程
1. 第一步做什么
2. 第二步做什么
3. 如何验证结果
## 最佳实践
- 实用的建议
- 常见陷阱
# 使用环境变量
MODEL = os.getenv("MODEL", "default-model")
# 验证配置
if not API_KEY:
raise ValueError("API_KEY 未设置")
# 创建必要的目录
Path(output_dir).mkdir(parents=True, exist_ok=True)
try:
result = await agent.run(task)
except Exception as e:
logger.error(f"执行失败: {e}", exc_info=True)
# 发送告警
# 保存错误信息
# 返回友好的错误消息
runner = AgentRunner(llm_call=llm, trace_store=store)
async for item in runner.run(
messages=[{"role": "user", "content": "任务"}],
config=RunConfig(model="claude-sonnet-4.5"),
):
if isinstance(item, Message):
print(item.content)
# 1. 定义工具
@tool(description="我的工具")
async def my_tool(param: str, ctx: ToolContext = None) -> ToolResult:
return ToolResult(output="结果")
# 2. 确保工具被导入
import my_tools # 触发 @tool 注册
# 3. 运行
runner = AgentRunner(llm_call=llm, trace_store=store)
async for item in runner.run(...):
pass
# 1. 创建 skills/my-skill.md
# 2. 加载 skills
runner = AgentRunner(
llm_call=llm,
trace_store=store,
skills_dir="./skills",
)
# 3. 指定使用的 skills
config = RunConfig(skills=["my-skill"])
class MyAgent:
def __init__(self, config):
self.runner = AgentRunner(...)
async def run(self, task: str) -> Dict:
try:
result = await self._execute(task)
self._save_result(result)
return result
except Exception as e:
self._handle_error(e)
raise
# 简单任务:使用 Haiku(快+便宜)
llm = create_openrouter_llm_call(model="anthropic/claude-haiku-4.5")
# 复杂任务:使用 Sonnet(平衡)
llm = create_openrouter_llm_call(model="anthropic/claude-sonnet-4.5")
# 极难任务:使用 Opus(最强)
llm = create_openrouter_llm_call(model="anthropic/claude-opus-4.6")
config = RunConfig(
max_iterations=20, # 防止无限循环
)
config = RunConfig(
enable_prompt_caching=True, # Claude 模型支持
)
config = RunConfig(
agent_type="explore", # 只读权限,更快
)
async for item in runner.run(...):
print(f"[{type(item).__name__}] {item}")
trace = await trace_store.get_trace(trace_id)
for msg in trace.messages:
print(f"{msg.role}: {msg.content}")
python api_server.py
# 访问 http://localhost:8000/api/traces
logging.basicConfig(level=logging.DEBUG)
my_agent/
├── run.py # 主程序
├── tools/ # 自定义工具
│ ├── __init__.py
│ ├── api.py
│ └── database.py
├── skills/ # Skills
│ ├── main.md
│ └── helper.md
├── .env # 环境变量
├── .env.example # 环境变量示例
├── requirements.txt # 依赖
└── README.md # 说明文档
examples/content_finder/demo.pyexamples/production_template/agent/README.md 和 agent/docs/examples/ 目录开始构建你的 Agent 吧! 🚀