| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 |
- #!/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()
|