#!/usr/bin/env python3 """ agent67v2/run.py — Lambda v2 多智能体个人助理 🐑 ================================================= v2 架构: 协调者 + 5个专业微代理 协调者: 轻量级 ReAct, 只做任务分析和分派 微代理: code / shell / web / memory / system 三大改进: 1. 拆分: 42工具 → 5个微代理, 每个代理工具少 → 响应快 2. 复用: 每个微代理注册为 Skill, 可被任何编排器调用 3. 懒加载: ToolSearch 元工具按需发现, 首次响应快 2-3x 用法: python run.py # 使用 Claude Code (默认) python run.py --api # 使用 API Key python run.py --model opus # 指定模型 python run.py --verbose # 详细模式 """ from __future__ import annotations import argparse import os import sys from pathlib import Path # 路径设置 PROJECT_ROOT = Path(__file__).resolve().parent.parent.parent AGENT_DIR = Path(__file__).resolve().parent sys.path.insert(0, str(PROJECT_ROOT)) sys.path.insert(0, str(AGENT_DIR.parent)) BANNER = """ ╔═══════════════════════════════════════════════════╗ ║ 🐑 lambda v2 — 多智能体协作版个人助手 ║ ║ ║ ║ 架构: Coordinator + 5 Micro-Agents ║ ║ ┌──────────┐ ║ ║ │Coordinator│─→ code-agent (文件/代码/Git) ║ ║ │ (分析+ │─→ shell-agent (终端命令) ║ ║ │ 分派) │─→ web-agent (搜索/知识库) ║ ║ │ │─→ memory-agent (记忆/任务) ║ ║ │ │─→ system-agent (系统控制) ║ ║ └──────────┘ ║ ║ ║ ║ 命令: trace | stats | history | exit ║ ╚═══════════════════════════════════════════════════╝ """ def main(): parser = argparse.ArgumentParser(description="🐑 lambda v2 — 多智能体个人助理") parser.add_argument("--api", action="store_true", help="使用 API Key 模式") parser.add_argument("--ollama", action="store_true", help="使用 Ollama 本地模型") parser.add_argument("--model", type=str, default=None, help="指定模型 (默认: 自动检测)") parser.add_argument("--verbose", action="store_true", help="详细模式") args = parser.parse_args() print(BANNER) # 检测后端 (与 agent67 一致的优先级) try: from agent67.core.config import detect_backend, BACKEND_OLLAMA model, use_api, backend = detect_backend() except ImportError: import shutil if shutil.which("claude"): model, use_api, backend = "sonnet", False, "claude_code" print("✅ 使用 Claude Code Max Plan (无需 API Key)") elif os.environ.get("ANTHROPIC_API_KEY"): model, use_api, backend = "claude-sonnet-4-20250514", True, "api" print("✅ 使用 Anthropic API") else: model, use_api, backend = args.model or "sonnet", args.api, "" print("⚠️ 未检测到 LLM 后端,将使用标准 Lam") if args.ollama: backend = "ollama" model = args.model or "qwen2.5:7b" use_api = False elif args.api: use_api = True backend = "api" if args.model: model = args.model # 创建协调者 from agent67v2.core.coordinator import CoordinatorAssistant print(" 🔄 初始化微代理注册表...") assistant = CoordinatorAssistant( model=model or "sonnet", use_api=use_api, backend=backend, verbose=args.verbose, ) print(" ✅ 5 个微代理已就绪\n") while True: try: user_input = input("You: ").strip() except (EOFError, KeyboardInterrupt): print("\n👋 lambda v2 下线了,再见!") break if not user_input: continue if user_input.lower() in ("exit", "quit", "bye", "再见"): print("👋 lambda v2 下线了,祝你有美好的一天!") break if user_input.lower() == "trace": assistant.print_trace() continue if user_input.lower() == "stats": assistant.print_stats() continue if user_input.lower() == "history": print("\n📜 对话历史:") for entry in assistant.conversation_history: print(f" [{entry['role']}] {entry['content'][:100]}") print() continue if user_input.lower() == "skills": from lambdagent.skills import SkillRegistry registry = SkillRegistry() print(f"\n📦 已注册技能 ({len(registry)} 个):") for name in registry.list_all(): skill = registry.get(name) print(f" • {name}: {skill.description}") print(f" tags: {skill.tags}") print(f" stats: {skill.stats}") print() continue print() response = assistant.chat(user_input) is_streaming = hasattr(assistant.brain, 'stream') and assistant.brain.stream if not is_streaming: print(f"🐑 lambda v2: {response}") print() if __name__ == "__main__": main()