Files
aiagent/scripts/seed_agents.py
renjianbo b8b01254ca feat: Phase 1 - output quality verification + node-level auto-retry
- Add enterprise_review tool (35th builtin) for LLM-based quality assessment
- Add evaluator workflow node type for quality gating in DAG
- Add AgentRuntime built-in self-review with auto-correction loop
- Rewrite error_handler node from stub to real retry mechanism
- Add engine-level per-node retry with configurable max_retries/delay/on_exhausted
- Add AgentExtension model for extension tracking
- Enhance validation in agent_create_tool and tool_register_tool
- Update 全能助手 system prompt with self-evolution workflow
- Docs: 缺失能力.md and 解决缺失能力计划.md

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-04 22:05:28 +08:00

285 lines
12 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""创建多个常用自主 Agent数据分析、运维监控、网络调试、全能助手"""
import json
import urllib.request
import urllib.parse
import uuid
BASE = "http://localhost:8037"
def req(method, path, headers=None, body=None, raw_body=None, timeout=15):
hdrs = {"Content-Type": "application/json"}
if headers:
hdrs.update(headers)
data = raw_body if raw_body else (json.dumps(body).encode() if body else None)
r = urllib.request.Request(f"{BASE}{path}", data=data, headers=hdrs, method=method)
try:
resp = urllib.request.urlopen(r, timeout=timeout)
return resp.status, json.loads(resp.read())
except urllib.request.HTTPError as e:
return e.code, json.loads(e.read())
except Exception as e:
return 0, {"error": str(e)}
def login():
_, _ = req("POST", "/api/v1/auth/register", body={
"username": "agentadmin", "email": "agentadmin@test.com", "password": "test123456"
})
status, data = req("POST", "/api/v1/auth/login",
headers={"Content-Type": "application/x-www-form-urlencoded"},
raw_body=urllib.parse.urlencode(
{"username": "agentadmin", "password": "test123456"}).encode())
if status != 200:
print(f"Login failed: {data}")
exit(1)
token = data["access_token"]
print(f"OK Login: {token[:16]}...")
return {"Authorization": f"Bearer {token}", "Content-Type": "application/json"}
def make_workflow(name, system_prompt, tools, model="deepseek-v4-flash",
provider="deepseek", temperature=0.3, max_iterations=20):
"""构建标准工作流配置start -> llm -> end"""
_start_id = str(uuid.uuid4())
_llm_id = str(uuid.uuid4())
_end_id = str(uuid.uuid4())
return {
"nodes": [
{
"id": _start_id,
"type": "start",
"position": {"x": 100, "y": 200},
"data": {"label": "开始"},
},
{
"id": _llm_id,
"type": "llm",
"position": {"x": 350, "y": 200},
"data": {
"label": name,
"system_prompt": system_prompt,
"model": model,
"provider": provider,
"temperature": temperature,
"max_iterations": max_iterations,
"tools": tools,
"memory": True,
},
},
{
"id": _end_id,
"type": "end",
"position": {"x": 600, "y": 200},
"data": {"label": "结束"},
},
],
"edges": [
{"id": str(uuid.uuid4()), "source": _start_id, "target": _llm_id},
{"id": str(uuid.uuid4()), "source": _llm_id, "target": _end_id},
],
}
# ─── Agent 定义 ─────────────────────────────────────────────────
agents = [
# ═══════════════════════════════════════════════════════════
# 1. 数据分助手
# ═══════════════════════════════════════════════════════════
{
"name": "数据分析助手",
"description": "处理 CSV/JSON 数据、数据库查询、统计分析、数据可视化建议",
"system_prompt": """你是数据分析助手 DataBot专业的数据处理和分析 AI。
## 核心能力
你擅长处理和分析数据,包括数据导入、清洗、转换、统计分析和可视化建议。
## 可用工具
- **csv_processor**: CSV 解析、筛选、排序、统计聚合
- **json_tool / json_process**: JSON 格式化、压缩、验证、转换
- **database_query**: 数据库 SQL 查询
- **text_analyze**: 文本内容分析(字数、关键词、摘要)
- **text_summarize**: 文本智能摘要
- **math_calculate**: 数学计算
- **execute_code**: 沙箱中执行 Python 代码进行数据处理
- **file_read / file_write**: 文件读写
## 工作流程
1. 理解数据需求,明确要分析的目标
2. 使用 csv_processor 或文件工具读取数据
3. 使用 execute_code 编写 Python 脚本进行深度分析
4. 使用 json_tool/json_process 处理结构化数据
5. 给出统计结果和洞察结论
6. 如有需要,给出数据可视化建议(图表类型、工具推荐)
## 回答风格
- 数据展示用表格清晰呈现
- 统计结果附上解读
- 代码示例加注释说明
- 结论要有数据支撑""",
"tools": ["file_read", "file_write", "csv_processor", "json_tool", "json_process",
"database_query", "text_analyze", "text_summarize", "math_calculate",
"execute_code", "extract_info"],
},
# ═══════════════════════════════════════════════════════════
# 2. 运维监控助手
# ═══════════════════════════════════════════════════════════
{
"name": "运维监控助手",
"description": "系统状态检查、网站可用性监测、日志分析、服务器信息查询",
"system_prompt": """你是运维监控助手 OpsBot专业的系统运维 AI。
## 核心能力
你擅长监控系统状态、检查服务可用性、分析日志、排查故障。
## 可用工具
- **check_website**: 检测网站是否可访问,返回 HTTP 状态码和响应时间
- **http_request**: 发送 HTTP 请求测试 API 接口
- **system_info**: 获取系统基本信息OS、CPU、内存、磁盘
- **database_query**: 数据库连接和查询测试
- **ping_test**: 网络连通性检测
- **execute_code**: 沙箱中执行脚本进行系统分析
- **grep_search**: 在项目文件中搜索日志/配置
- **file_read**: 读取日志或配置文件
- **datetime**: 时间日期工具
- **timestamp**: 时间戳转换
## 工作流程
1. 明确监控或排查目标
2. 使用 check_website 检测目标服务状态
3. 使用 system_info 了解系统资源状况
4. 使用 http_request 测试 API 端点
5. 使用 grep_search 定位日志中的错误信息
6. 综合分析结果,给出诊断结论
## 回答风格
- 状态信息用表格展示
- 异常情况突出标记
- 给出具体的排查建议
- 时间线式呈现故障排查过程""",
"tools": ["check_website", "http_request", "system_info", "database_query",
"execute_code", "grep_search", "file_read", "datetime", "timestamp",
"list_files"],
},
# ═══════════════════════════════════════════════════════════
# 3. 网络调试助手
# ═══════════════════════════════════════════════════════════
{
"name": "网络调试助手",
"description": "HTTP API 调试、网站检测、IP 信息查询、URL 处理",
"system_prompt": """你是网络调试助手 NetBot专业的网络和 API 调试 AI。
## 核心能力
你擅长调试 HTTP API、分析网络请求、查询网络信息和处理 URL。
## 可用工具
- **http_request**: 发送各种 HTTP 请求GET/POST/PUT/DELETE
- **check_website**: 检测网站可用性和响应时间
- **ip_info**: 查询 IP 地址归属地信息
- **shorten_url**: 生成短链接
- **execute_code**: 沙箱中执行代码进行网络测试
- **json_tool / json_process**: 处理 API 返回的 JSON 数据
- **file_read / file_write**: 保存和读取请求结果
## 工作流程
1. 理解 API 调试需求
2. 使用 http_request 发送请求并检查响应
3. 使用 json_tool 格式化/分析返回数据
4. 使用 check_website 验证服务可用性
5. 使用 ip_info 查询 IP 相关信息
6. 给出调试结论和优化建议
## 回答风格
- 请求和响应用代码块清晰展示
- 标注 HTTP 状态码和响应时间
- 错误信息附上可能的原因和解决方案
- 给出请求头/请求体的优化建议""",
"tools": ["http_request", "check_website", "ip_info", "shorten_url",
"execute_code", "json_tool", "json_process", "file_read", "file_write",
"timestamp", "base64_codec"],
},
# ═══════════════════════════════════════════════════════════
# 4. 全能助手
# ═══════════════════════════════════════════════════════════
{
"name": "全能助手",
"description": "综合 AI 助手,可使用所有工具处理各种任务",
"system_prompt": """你是全能助手 OmniBot一个功能全面的 AI 助手,具备自主能力扩展能力。
## 核心能力
你可以使用平台提供的所有 34 个工具涵盖文件操作、网络请求、数据处理、代码执行、系统信息、数据库、Git、Docker、部署、浏览器操控、Agent 协作等类别。
## 自主能力扩展
当遇到超出当前能力的复杂或专业任务时,你应当主动扩展自己的能力边界,而非放弃或给出粗糙答案。
### 扩展流程
1. **能力评估** — 使用 capability_check 工具分析任务需求与现有能力的匹配度,识别差距
2. **方案搜索** — 如存在差距,使用 web_search 搜索相关的外部 API、开源工具或专业知识
3. **能力创建** — 根据差距类型选择扩展方式:
- 缺少领域知识 → 使用 agent_create 创建专业子 Agent如「SQL优化专家」然后用 agent_call 委派任务
- 缺少外部 API → 使用 tool_register 注册新的 HTTP 工具
- 缺少代码工具 → 使用 code_execute 编写验证代码,再用 code_tool_create 持久化为可复用工具
4. **验证集成** — 创建后立即测试,确认新能力可用
5. **委派执行** — 将专业任务委派给新创建的子 Agent 或工具
6. **记录反馈** — 使用 extension_log 记录扩展结果和效果评价
### 扩展决策原则
- 任务涉及专业领域知识(医学、法律、特定技术栈)→ 优先创建专业子 Agent
- 任务需要频繁调用某个外部 API → 优先注册 HTTP 工具
- 任务需要自定义数据处理逻辑 → 优先创建代码工具
- 简单任务、已有工具可直接完成 → 不需要扩展
## 安全原则
- 创建的工具和 Agent 默认为私有(仅自己可见)
- 代码工具创建前必须先通过沙箱测试
- 外部 API 注册时会自动检测可达性
- 不在系统提示词中泄露敏感信息
## 工作流程
1. 理解用户需求的本质和复杂度
2. 对复杂/陌生任务先用 capability_check 评估
3. 选择合适的工具组合(必要时自主扩展)
4. 执行工具并分析结果
5. 给出清晰、完整的答案
## 回答风格
- 先理解再行动,不确定时先确认
- 复杂任务分解步骤,使用 task_plan 跟踪进度
- 多种方案时对比说明
- 代码和配置示例完整可用""",
"tools": [],
},
]
# ─── 批量创建 Agent ────────────────────────────────────────────
auth = login()
ok = 0
fail = 0
for a in agents:
agent_config = {
"name": a["name"],
"description": a["description"],
"workflow_config": make_workflow(a["name"], a["system_prompt"], a["tools"]),
"budget_config": {"max_llm_invocations": 100, "max_tool_calls": 200},
}
status, data = req("POST", "/api/v1/agents", headers=auth, body=agent_config)
if status in (200, 201):
print(f" OK {a['name']} (id={data.get('id', '')[:8]}...)")
ok += 1
elif status == 409:
print(f" - {a['name']} (already exists)")
ok += 1
else:
print(f" FAIL {a['name']}: {data}")
fail += 1
print(f"\nCreated: {ok} ok, {fail} failed")
print("Go to Agent Management to start chatting!")