Tutorials演示:研究团队
Updated February 24, 2026
演示:研究团队
一个路由代理使用 project mod 对专门代理之间的研究任务进行结构化的任务委派与协调。
演示:带路由器的研究团队
路由器代理使用 项目模块 在专门化代理之间协调研究任务。本演示展示了结构化任务委派、代理组和多步骤工作流。
重要: 重要: 如果你正在运行它们,请停止你的网络。
你将学到的内容
- 使用项目模块进行任务管理
- 基于路由的协调模式
- 代理组和权限
- 使用
send_event的事件驱动任务委派 - 项目模板
架构
┌─────────────────┐
Research │ Router │
Request ────►│ (coordinator) │
└────────┬────────┘
│ task.delegate
┌──────────────┴──────────────┐
│ │
▼ ▼
┌─────────────┐ ┌───────────┐
│ web-searcher│ │ analyst │
│ (find info) │ │ (reason) │
└──────┬──────┘ └─────┬─────┘
│ │
└──────────────┬──────────────┘
│ task.complete
▼
┌─────────────────┐
│ Router │
│ (compile report)│
└─────────────────┘代理
| 代理 | 组 | 角色 | 职责 |
|---|---|---|---|
| router | 协调者 | 协调者 | 接收请求、分配任务、汇总结果 |
| web-searcher | 研究者 | 信息收集者 | 网络搜索、Hacker News 查询 |
| analyst | 研究者 | 综合者 | 分析与结论 |
前提条件
- 已安装 OpenAgents (
pip install openagents) - 一个 LLM 的 API 密钥
# Optional: Set the OpenAI base URL
export OPENAI_BASE_URL="your-base-url-here"
# Must: Set the OpenAI API key
export OPENAI_API_KEY="your-key-here"可选(用于更好的网络搜索):
export BRAVE_API_KEY="your-brave-key" # Falls back to DuckDuckGo if not set快速开始
终端 1:启动网络
openagents network start demos/03_research_team/终端 2:启动路由器
openagents agent start demos/03_research_team/agents/router.yaml终端 3:启动网络搜索器
openagents agent start demos/03_research_team/agents/web_searcher.yaml终端 4:启动分析员
openagents agent start demos/03_research_team/agents/analyst.yaml使用 Studio 连接
打开 http://localhost:8050,并连接到 localhost:8700。
试一试
- 在 Studio 中导航到 项目 部分
- 使用 "研究任务" 模板创建一个新项目
- 将目标设为类似于:
"研究 Rust 与 Go 在后端开发中的优缺点"

- 观察代理如何协作:
- 路由器接收请求并将其委派给网页搜索器
- 网页搜索器收集信息并返回发现
- 路由器将分析委派给分析员
- 分析员综合信息并提供结论
- 路由器汇总并交付最终报告
配置深入解析
使用代理组的网络配置
# demos/03_research_team/network.yaml
network:
name: "ResearchTeam"
default_agent_group: guest
# Define agent groups with different permissions
agent_groups:
coordinators:
description: "Router agents that coordinate research tasks"
password_hash:
researchers:
description: "Worker agents that execute research tasks"
password_hash: ...
mods:
# Default workspace for event handling
- name: "openagents.mods.workspace.default"
enabled: true
config:
custom_events_enabled: true
# Project management mod
- name: "openagents.mods.workspace.project"
enabled: true
config:
max_concurrent_projects: 5
project_templates:
research_task:
name: "Research Task"
description: "Structured research with search and analysis"
agent_groups: ["coordinators", "researchers"]
context: |
Research Task Workflow:
1. Router receives request and delegates search
2. Web-searcher returns findings
3. Router delegates analysis
4. Analyst synthesizes conclusions
5. Router compiles final report路由器代理配置
# demos/03_research_team/agents/router.yaml
type: "openagents.agents.collaborator_agent.CollaboratorAgent"
agent_id: "router"
config:
model_name: "gpt-4o-mini"
# Limit iterations to prevent duplicate sends
max_iterations: 3
instruction: |
You are the ROUTER - a simple coordinator.
Make ONE action per event, then call finish().
YOUR TOOLS:
- send_project_message(project_id, content) - message the user
- send_event(event_name, destination_id, payload) - delegate tasks
- complete_project(project_id, summary) - finish the project
- finish() - MUST call this last
RULE: Make ONE tool call, then call finish(). Never call send_event twice.
react_to_all_messages: false
triggers:
- event: "project.notification.started"
instruction: |
Project started. Do these 2 things IN ORDER:
1. send_event(event_name="task.delegate", destination_id="web-searcher",
payload={"task_id": "s1", "query": "[the goal from payload]"})
2. finish()
- event: "task.complete"
instruction: |
A task completed. Check who sent it:
IF source is "web-searcher":
1. send_event to analyst with the results
2. finish()
IF source is "analyst":
1. send_project_message with summary
2. complete_project
3. finish()
mods:
- name: "openagents.mods.workspace.project"
enabled: true
- name: "openagents.mods.workspace.default"
enabled: true
connection:
host: "localhost"
port: 8700
transport: "grpc"
agent_group: "coordinators" # Join as coordinator关键模式
事件驱动的任务委派
路由器使用 send_event 来委派工作:
# Conceptual flow
send_event(
event_name="task.delegate",
destination_id="web-searcher",
payload={"task_id": "s1", "query": "Rust vs Go comparison"}
)工作者响应:
send_event(
event_name="task.complete",
destination_id="router",
payload={"task_id": "s1", "results": "...findings..."}
)防止重复操作
路由器使用 max_iterations: 3 和显式规则来防止:
- 针对单个触发器多次发送事件
- 无限委派循环
- 向用户发送重复消息
项目模板
模板为不同的研究类型提供结构:
| 模板 | 使用场景 |
|---|---|
research_task | 包含搜索与分析的一般研究 |
comparison_research | 比较两个或多个主题 |
deep_dive | 对单一主题的深入研究 |
网络搜索工具
# demos/03_research_team/tools/web_search.py
def search_web(query: str, count: int = 5) -> str:
"""Search using Brave (if API key) or DuckDuckGo."""
# Tries Brave first, falls back to DuckDuckGo
def fetch_webpage(url: str, max_length: int = 8000) -> str:
"""Fetch and extract text content from a webpage."""
def search_hackernews(query: str, count: int = 5) -> str:
"""Search Hacker News using Algolia API."""定制化建议
增加更多专家
# agents/fact_checker.yaml
agent_id: "fact-checker"
config:
instruction: |
You verify claims made by other agents.
Cross-reference sources and flag inconsistencies.创建自定义模板
# In network.yaml
project_templates:
competitor_analysis:
name: "Competitor Analysis"
description: "Research competitors in a market"
context: |
1. Identify key competitors
2. Gather data on each
3. Compare strengths/weaknesses
4. Provide strategic recommendations故障排除
路由器发送重复事件
- 验证已设置
max_iterations: 3 - 检查说明是否写着 "只进行一次工具调用"
- 确保在每个操作后调用
finish()
任务未完成
- 检查所有智能体是否已连接
- 验证 agent_group 分配是否与权限匹配
- 在智能体终端中查找错误
网络搜索失败
- 如果没有 BRAVE_API_KEY,会回退到 DuckDuckGo
- 检查网络连接
- 某些查询可能会被限流
接下来做什么?
- 语法检查论坛 - 查看具有自动语法检查的论坛模块
- Python 接口教程 - 深入介绍以编程方式的代理开发
Was this helpful?