#!/usr/bin/env python3 """ agent67/run.py — Lambda 个人助理 🐂 ==================================== 一个能直接操控电脑的全能型 AI 助手,基于 lambdagent 构建。 使用 Claude Code Max Plan,无需 API Key。 Lambda 演算解读: λ = Memory(Loop(Brain >> parse_action >> route_execute)) 能力: 💻 终端命令执行 📁 文件管理 🌐 浏览器控制 🚀 应用启动/切换 📊 系统信息查询 📸 屏幕截图 用法: python run.py # 使用 Claude Code Max Plan (默认) python run.py --api # 使用 API Key 模式 python run.py --model opus # 指定模型 """ from __future__ import annotations import argparse import sys import os from pathlib import Path # ── 路径设置 ────────────────────────────────────────────── PROJECT_ROOT = Path(__file__).resolve().parent.parent.parent # Paper08/ AGENT_DIR = Path(__file__).resolve().parent # agent67/ sys.path.insert(0, str(PROJECT_ROOT)) sys.path.insert(0, str(AGENT_DIR.parent)) # agentexample/ from agent67.core.assistant import PersonalAssistant from agent67.core.config import detect_backend, BANNER, BACKEND_OLLAMA def main(): parser = argparse.ArgumentParser(description="🐂 lambda — 个人助理") parser.add_argument("--api", action="store_true", help="使用 API Key 模式(而非 Claude Code CLI)") parser.add_argument("--claude", action="store_true", help="强制使用 Claude Code Max Plan (跳过 Ollama 检测)") parser.add_argument("--ollama", action="store_true", help="使用 Ollama 本地模型 (qwen2.5:7b)") parser.add_argument("--model", type=str, default=None, help="指定模型 (默认: 自动检测)") args = parser.parse_args() print(BANNER) # 检测后端 model, use_api, backend = detect_backend() # 命令行覆盖 if args.claude: from agent67.core.config import BACKEND_CLAUDE_CODE backend = BACKEND_CLAUDE_CODE model = args.model or "sonnet" use_api = False print("✅ 强制使用 Claude Code Max Plan") elif args.ollama: backend = BACKEND_OLLAMA model = args.model or "qwen2.5:7b" use_api = False elif args.api: use_api = True backend = "api" if not model: print("⚠️ --api 模式需要设置 API Key 环境变量:") print(" export ANTHROPIC_API_KEY=sk-ant-...") return if args.model and not args.ollama: model = args.model if not model and not backend: print("⚠️ 未找到可用的 LLM 后端。") print(" 方式 1: ollama serve && ollama pull qwen2.5:7b (本地模型)") print(" 方式 2: 安装 Claude Code: npm install -g @anthropic-ai/claude-code") print(" 方式 3: export ANTHROPIC_API_KEY=sk-ant-...") return assistant = PersonalAssistant(model=model, use_api=use_api, backend=backend) print() while True: try: user_input = input("You: ").strip() except (EOFError, KeyboardInterrupt): print("\n👋 lambda 下线了,再见!") break if not user_input: continue if user_input.lower() in ("exit", "quit", "bye", "再见"): print("👋 lambda 下线了,祝你有美好的一天!") 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 print() response = assistant.chat(user_input) # 如果是流式模式,response 已经在 chat() 中逐字显示过 # 只有非流式模式才在这里打印 if not (hasattr(assistant.brain, 'stream') and assistant.brain.stream): print(f"🐂 lambda: {response}") print() if __name__ == "__main__": main()