380 lines
15 KiB
Python
380 lines
15 KiB
Python
|
|
"""创建功能最强大的自主 Agent — Pro 模型 + 全工具 + 向量记忆 + 自主学习
|
|||
|
|
|
|||
|
|
用法:
|
|||
|
|
python scripts/seed_max_agent.py
|
|||
|
|
python scripts/seed_max_agent.py --name "我的助手" --desc "自定义描述"
|
|||
|
|
"""
|
|||
|
|
import json
|
|||
|
|
import urllib.request
|
|||
|
|
import urllib.parse
|
|||
|
|
import uuid
|
|||
|
|
import sys
|
|||
|
|
import argparse
|
|||
|
|
|
|||
|
|
BASE = "http://localhost:8037"
|
|||
|
|
|
|||
|
|
# ─── 全部可用工具(从平台 GET /api/v1/tools 获取) ───
|
|||
|
|
ALL_TOOLS = [
|
|||
|
|
# 文件操作
|
|||
|
|
"file_read", "file_write", "list_files", "grep_search",
|
|||
|
|
# 网络请求
|
|||
|
|
"http_request", "web_search", "check_website", "url_parse", "browser_use",
|
|||
|
|
# 数据处理
|
|||
|
|
"text_analyze", "text_summarize", "json_process", "json_tool",
|
|||
|
|
"math_calculate", "random_generate", "regex_test",
|
|||
|
|
"csv_processor", "excel_process", "pdf_generate",
|
|||
|
|
"base64_codec", "crypto_util", "html_to_markdown",
|
|||
|
|
# 数据库 & 系统
|
|||
|
|
"database_query", "system_info", "datetime", "timestamp",
|
|||
|
|
# 代码 & 开发
|
|||
|
|
"code_execute", "execute_code", "code_tool_create",
|
|||
|
|
"git_operation", "git_log", "project_scaffold", "project_scan",
|
|||
|
|
"docker_manage", "deploy_push", "adb_log",
|
|||
|
|
# AI Agent 扩展
|
|||
|
|
"agent_call", "agent_create", "tool_register",
|
|||
|
|
"task_plan", "self_review", "capability_check", "extension_log",
|
|||
|
|
"create_task", "assign_task", "check_progress", "notify_user",
|
|||
|
|
# 知识图谱
|
|||
|
|
"knowledge_graph_search", "knowledge_graph_add",
|
|||
|
|
"entity_search", "learning_path",
|
|||
|
|
# 多模态
|
|||
|
|
"image_ocr", "image_vision", "speech_to_text", "text_to_speech",
|
|||
|
|
# 飞书集成
|
|||
|
|
"feishu_create_doc", "feishu_create_sheet", "feishu_create_calendar_event",
|
|||
|
|
"feishu_search_contacts", "feishu_send_approval",
|
|||
|
|
"feishu_read_messages", "feishu_upload_file",
|
|||
|
|
# DevOps & 测试
|
|||
|
|
"create_gitea_issue", "parse_test_result_file",
|
|||
|
|
"schedule_create", "schedule_list", "schedule_delete",
|
|||
|
|
# 网络 & IP
|
|||
|
|
"ip_info", "shorten_url",
|
|||
|
|
# 其他
|
|||
|
|
"extract_info",
|
|||
|
|
]
|
|||
|
|
|
|||
|
|
|
|||
|
|
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(username="admin", password="123456"):
|
|||
|
|
"""登录获取 token,支持 admin 或自定义账号"""
|
|||
|
|
status, data = req("POST", "/api/v1/auth/login",
|
|||
|
|
headers={"Content-Type": "application/x-www-form-urlencoded"},
|
|||
|
|
raw_body=urllib.parse.urlencode(
|
|||
|
|
{"username": username, "password": password}).encode())
|
|||
|
|
if status != 200:
|
|||
|
|
print(f"Login failed ({status}): {data}")
|
|||
|
|
return None
|
|||
|
|
token = data["access_token"]
|
|||
|
|
print(f"OK Login: {token[:20]}... (ws={data.get('ws','')[:8]}...)")
|
|||
|
|
return {"Authorization": f"Bearer {token}", "Content-Type": "application/json"}
|
|||
|
|
|
|||
|
|
|
|||
|
|
def make_workflow_pro(name, system_prompt, tools=None, model="deepseek-v4-pro",
|
|||
|
|
provider="deepseek", temperature=0.8, max_iterations=15):
|
|||
|
|
"""构建 Pro 级工作流配置,含完整向量记忆+自主学习。
|
|||
|
|
|
|||
|
|
参数:
|
|||
|
|
name: Agent 名称
|
|||
|
|
system_prompt: 系统提示词
|
|||
|
|
tools: 工具列表,None/空列表 = 全部工具
|
|||
|
|
model: deepseek-v4-pro | deepseek-v4-flash | gpt-4o
|
|||
|
|
temperature: 0-1,越高越有创造性
|
|||
|
|
max_iterations: ReAct 最大迭代步数
|
|||
|
|
"""
|
|||
|
|
if tools is None:
|
|||
|
|
tools = []
|
|||
|
|
|
|||
|
|
_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": 380, "y": 200},
|
|||
|
|
"data": {
|
|||
|
|
"label": name,
|
|||
|
|
"system_prompt": system_prompt,
|
|||
|
|
"model": model,
|
|||
|
|
"provider": provider,
|
|||
|
|
"temperature": temperature,
|
|||
|
|
"max_iterations": max_iterations,
|
|||
|
|
# ── 工具配置 ──
|
|||
|
|
"tools": tools,
|
|||
|
|
"selected_tools": tools,
|
|||
|
|
"enable_tools": True,
|
|||
|
|
# ── 三级记忆架构 ──
|
|||
|
|
"memory": True,
|
|||
|
|
"memory_persist": True, # 对话写入 MySQL
|
|||
|
|
"memory_vector_enabled": True, # 向量语义检索
|
|||
|
|
"memory_vector_top_k": 20, # 检索最相关 20 条
|
|||
|
|
"memory_learning": True, # 自主学习模式
|
|||
|
|
"memory_max_history": 25, # 上下文最大消息数
|
|||
|
|
},
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"id": _end_id,
|
|||
|
|
"type": "end",
|
|||
|
|
"position": {"x": 640, "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},
|
|||
|
|
],
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
# ══════════════════════════════════════════════════════════════════
|
|||
|
|
# 豆包风格通用 System Prompt(989 字,6 大特质)
|
|||
|
|
# ══════════════════════════════════════════════════════════════════
|
|||
|
|
|
|||
|
|
PRO_SYSTEM_PROMPT = """你是豆包,字节跳动推出的AI对话助手。你的使命是用温暖、自然、真挚的方式陪伴用户,成为他们工作生活中值得信赖的伙伴。
|
|||
|
|
|
|||
|
|
## 核心特质
|
|||
|
|
|
|||
|
|
### 1. 温暖自然的对话风格
|
|||
|
|
- 语气像朋友聊天,不冷冰冰、不机械
|
|||
|
|
- 适当使用语气词(呢、呀、嘛、哈~)让对话更生动
|
|||
|
|
- 根据用户情绪调整态度:开心时一起高兴,低落时温柔安慰
|
|||
|
|
- 用口语化的表达替代书面语,让每个回复都有温度
|
|||
|
|
- 主动关心用户的感受和需求
|
|||
|
|
|
|||
|
|
### 2. 知识问答与搜索
|
|||
|
|
- 准确回答各类知识问题,涵盖科学、历史、文化、生活等领域
|
|||
|
|
- 涉及实时信息时主动使用 web_search 工具获取最新内容
|
|||
|
|
- 回答结构清晰,用表格、列表帮助用户快速理解
|
|||
|
|
- 不确定时会诚实说明,并给出进一步获取信息的建议
|
|||
|
|
|
|||
|
|
### 3. 多模态理解
|
|||
|
|
- 支持图片描述和视觉问答(image_vision)
|
|||
|
|
- 支持从图片中提取文字(image_ocr)
|
|||
|
|
- 支持语音转文字和文字转语音
|
|||
|
|
- 能处理Excel、PDF、Word等办公文档
|
|||
|
|
|
|||
|
|
### 4. 创意写作
|
|||
|
|
- 写故事、诗歌、散文、剧本等文学创作
|
|||
|
|
- 文案策划:广告语、品牌故事、产品介绍
|
|||
|
|
- 润色改写:帮用户的文字更有文采、更打动人
|
|||
|
|
- 根据不同场景调整文风:正式的、幽默的、文艺的、可爱的
|
|||
|
|
|
|||
|
|
### 5. 代码辅助
|
|||
|
|
- 解答编程问题,给出可直接运行的代码
|
|||
|
|
- 帮用户调试bug、优化性能、重构代码
|
|||
|
|
- 解释技术概念,用通俗语言让新手也能理解
|
|||
|
|
- 支持Python、JavaScript、TypeScript、Java、Go等主流语言
|
|||
|
|
|
|||
|
|
### 6. 情感陪伴
|
|||
|
|
- 认真倾听用户的烦恼,给予同理心回应
|
|||
|
|
- 分享积极正能量,但不强行灌鸡汤
|
|||
|
|
- 记住用户说过的重要事情,在后续对话中自然提及
|
|||
|
|
- 用适当的emoji和语气让文字更有感染力 ✨
|
|||
|
|
|
|||
|
|
## 回复格式偏好
|
|||
|
|
- 优先用清晰的标题分段,方便用户阅读
|
|||
|
|
- 技术内容用代码块标注语言类型
|
|||
|
|
- 结构化信息用表格呈现
|
|||
|
|
- 适当使用emoji增添亲和力,但不过度
|
|||
|
|
- 思考过程简洁高效,不啰嗦
|
|||
|
|
|
|||
|
|
## 安全边界
|
|||
|
|
- 拒绝生成违法、暴力、色情等有害内容
|
|||
|
|
- 医疗建议只提供通用信息,提醒用户咨询专业医生
|
|||
|
|
- 金融建议只提供基础知识,不构成投资建议
|
|||
|
|
- 涉及隐私信息时主动提醒用户注意保护
|
|||
|
|
|
|||
|
|
我是豆包,很高兴认识你 ~ 今天有什么可以帮你的吗? ✨"""
|
|||
|
|
|
|||
|
|
|
|||
|
|
# ══════════════════════════════════════════════════════════════════
|
|||
|
|
# Agent 模板定义
|
|||
|
|
# ══════════════════════════════════════════════════════════════════
|
|||
|
|
|
|||
|
|
AGENTS = [
|
|||
|
|
{
|
|||
|
|
"name": "智能助手 Pro Max",
|
|||
|
|
"description": "最强大全功能AI助手:deepseek-v4-pro + 60+工具 + 向量记忆 + 自主学习 + 多模态理解 + 飞书集成",
|
|||
|
|
"system_prompt": PRO_SYSTEM_PROMPT,
|
|||
|
|
"tools": ALL_TOOLS,
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"name": "代码大师 Pro",
|
|||
|
|
"description": "专业编程助手:代码生成/调试/重构/审查 + Git操作 + Docker部署 + 项目脚手架",
|
|||
|
|
"system_prompt": """你是代码大师 CodeMaster,世界顶级的全栈软件工程师 AI。
|
|||
|
|
|
|||
|
|
## 核心能力
|
|||
|
|
- **多语言精通**:Python / JavaScript / TypeScript / Java / Go / Rust / C++ / Kotlin / Swift
|
|||
|
|
- **全栈能力**:前端(React/Vue/Angular) + 后端(FastAPI/Express/Spring) + 数据库(MySQL/PostgreSQL/MongoDB)
|
|||
|
|
- **工程实践**:CI/CD、Docker、Git工作流、测试驱动开发
|
|||
|
|
|
|||
|
|
## 工作流程
|
|||
|
|
1. 深入理解需求,必要时追问澄清
|
|||
|
|
2. 搜索现有最佳实践和方案(web_search)
|
|||
|
|
3. 分析项目上下文(project_scan, grep_search, list_files)
|
|||
|
|
4. 编写高质量、可测试、有注释的代码(code_execute)
|
|||
|
|
5. 代码审查和性能优化(self_review)
|
|||
|
|
6. 如有需要,创建可复用工具(code_tool_create)
|
|||
|
|
|
|||
|
|
## 代码风格
|
|||
|
|
- 类型安全优先(TypeScript / Python type hints)
|
|||
|
|
- 遵循语言社区最佳实践和风格指南
|
|||
|
|
- 错误处理完善,边界条件考虑周全
|
|||
|
|
- 代码块始终标注语言类型""",
|
|||
|
|
"tools": ALL_TOOLS,
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"name": "产品架构师 Pro",
|
|||
|
|
"description": "产品规划与技术架构:需求分析/产品设计/架构评审/技术方案/竞品分析",
|
|||
|
|
"system_prompt": """你是产品架构师 ArchiPro,资深产品+架构双栖专家。
|
|||
|
|
|
|||
|
|
## 核心能力
|
|||
|
|
- **产品思维**:能从用户价值和商业价值两个维度分析需求
|
|||
|
|
- **架构设计**:熟悉微服务、事件驱动、CQRS、DDD 等架构模式
|
|||
|
|
- **技术选型**:能根据团队能力和业务场景给出合理的技术栈建议
|
|||
|
|
- **文档产出**:BRD/PRD/技术方案/架构图/API 设计
|
|||
|
|
|
|||
|
|
## 工作流程
|
|||
|
|
1. 理清业务目标和用户场景
|
|||
|
|
2. 拆解需求为功能模块
|
|||
|
|
3. 设计系统架构和数据模型
|
|||
|
|
4. Web搜索参考业界方案
|
|||
|
|
5. 如果需要,创建子Agent负责专项设计
|
|||
|
|
6. 产出结构化文档
|
|||
|
|
|
|||
|
|
## 产出格式
|
|||
|
|
- 需求分析用表格呈现(场景/角色/目标/优先级)
|
|||
|
|
- 架构设计用分层图描述
|
|||
|
|
- API设计用 OpenAPI 风格
|
|||
|
|
- 风险评估和里程碑规划""",
|
|||
|
|
"tools": ALL_TOOLS,
|
|||
|
|
},
|
|||
|
|
]
|
|||
|
|
|
|||
|
|
|
|||
|
|
# ══════════════════════════════════════════════════════════════════
|
|||
|
|
# 主程序
|
|||
|
|
# ══════════════════════════════════════════════════════════════════
|
|||
|
|
|
|||
|
|
def main():
|
|||
|
|
parser = argparse.ArgumentParser(description="创建 Pro Max 级别 Agent")
|
|||
|
|
parser.add_argument("--name", help="自定义 Agent 名称")
|
|||
|
|
parser.add_argument("--desc", help="自定义 Agent 描述")
|
|||
|
|
parser.add_argument("--prompt", help="自定义 System Prompt(文件路径或直接文本)")
|
|||
|
|
parser.add_argument("--model", default="deepseek-v4-pro", help="模型名称")
|
|||
|
|
parser.add_argument("--user", default="admin", help="登录用户名")
|
|||
|
|
parser.add_argument("--pass", dest="password", default="123456", help="登录密码")
|
|||
|
|
parser.add_argument("--base", default="http://localhost:8037", help="API 地址")
|
|||
|
|
args = parser.parse_args()
|
|||
|
|
|
|||
|
|
global BASE
|
|||
|
|
BASE = args.base
|
|||
|
|
|
|||
|
|
# 登录
|
|||
|
|
auth = login(username=args.user, password=args.password)
|
|||
|
|
if not auth:
|
|||
|
|
print("Login failed, abort.")
|
|||
|
|
sys.exit(1)
|
|||
|
|
|
|||
|
|
# 确定要创建的 Agent 列表
|
|||
|
|
if args.name:
|
|||
|
|
prompt = PRO_SYSTEM_PROMPT
|
|||
|
|
if args.prompt:
|
|||
|
|
try:
|
|||
|
|
with open(args.prompt, "r", encoding="utf-8") as f:
|
|||
|
|
prompt = f.read()
|
|||
|
|
except FileNotFoundError:
|
|||
|
|
prompt = args.prompt
|
|||
|
|
agents_to_create = [{
|
|||
|
|
"name": args.name,
|
|||
|
|
"description": args.desc or "自定义 Pro Max Agent",
|
|||
|
|
"system_prompt": prompt,
|
|||
|
|
"tools": ALL_TOOLS,
|
|||
|
|
}]
|
|||
|
|
else:
|
|||
|
|
agents_to_create = AGENTS
|
|||
|
|
|
|||
|
|
# 批量创建
|
|||
|
|
ok = 0
|
|||
|
|
fail = 0
|
|||
|
|
for a in agents_to_create:
|
|||
|
|
wf = make_workflow_pro(
|
|||
|
|
a["name"],
|
|||
|
|
a["system_prompt"],
|
|||
|
|
tools=a.get("tools", ALL_TOOLS),
|
|||
|
|
model=args.model,
|
|||
|
|
)
|
|||
|
|
agent_config = {
|
|||
|
|
"name": a["name"],
|
|||
|
|
"description": a.get("description", ""),
|
|||
|
|
"workflow_config": wf,
|
|||
|
|
"budget_config": {
|
|||
|
|
"max_llm_invocations": 200,
|
|||
|
|
"max_tool_calls": 500,
|
|||
|
|
"timeout_seconds": 300,
|
|||
|
|
},
|
|||
|
|
"category": "llm",
|
|||
|
|
"tags": ["pro", "max", "all-tools", "vector-memory"],
|
|||
|
|
"is_public": True,
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
status, data = req("POST", "/api/v1/agents", headers=auth, body=agent_config)
|
|||
|
|
|
|||
|
|
if status in (200, 201):
|
|||
|
|
agent_id = data.get("id", "")
|
|||
|
|
print(f" OK {a['name']}")
|
|||
|
|
print(f" ID: {agent_id}")
|
|||
|
|
print(f" Status: {data.get('status', '?')}")
|
|||
|
|
|
|||
|
|
# 自动发布
|
|||
|
|
pub_status, pub_data = req(
|
|||
|
|
"PUT", f"/api/v1/agents/{agent_id}",
|
|||
|
|
headers=auth, body={"status": "published"}
|
|||
|
|
)
|
|||
|
|
if pub_status in (200, 201):
|
|||
|
|
print(f" Published: OK")
|
|||
|
|
print(f" Chat URL: http://localhost:3001/agent-chat/{agent_id}")
|
|||
|
|
else:
|
|||
|
|
print(f" Publish failed: {pub_data}")
|
|||
|
|
|
|||
|
|
ok += 1
|
|||
|
|
elif status == 409:
|
|||
|
|
print(f" - {a['name']} (already exists)")
|
|||
|
|
ok += 1
|
|||
|
|
else:
|
|||
|
|
print(f" FAIL {a['name']} (HTTP {status}): {json.dumps(data, ensure_ascii=False)[:200]}")
|
|||
|
|
fail += 1
|
|||
|
|
print()
|
|||
|
|
|
|||
|
|
print(f"=" * 50)
|
|||
|
|
print(f"Done: {ok} ok, {fail} failed")
|
|||
|
|
|
|||
|
|
if ok > 0:
|
|||
|
|
print(f"\nFrontend: http://localhost:3001/agents")
|
|||
|
|
print(f"Go to Agent Management to see your new Pro Max agents!")
|
|||
|
|
|
|||
|
|
|
|||
|
|
if __name__ == "__main__":
|
|||
|
|
main()
|