Files
aiagent/scripts/seed_max_agent.py
renjianbo beff3fac8d fix: delete agent 500 error + dynamic personality + deployment guide
- Fix delete agent 500: clean up FK records (agent_llm_logs, permissions,
  schedules, executions, team_members) and unbind goals/tasks before delete
- Remove hardcoded personality templates in Android, replace with dynamic
  system prompt generation from name + description
- Set promptSectionsEnabled=false to bypass PromptComposer for personality
- Add Tencent Cloud Linux deployment guide (Docker Compose)
- Accumulated backend service updates, frontend UI fixes, Android app changes

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-06-29 01:17:21 +08:00

380 lines
15 KiB
Python
Raw 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 — 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 Prompt989 字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()