config.py 3.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. """
  2. agent67.core.config — 配置与常量
  3. """
  4. from __future__ import annotations
  5. import os
  6. import shutil
  7. BANNER = """
  8. ╔══════════════════════════════════════════════════════════╗
  9. ║ 🐑 lambda v2 — 个人助理 + 编程助手 ║
  10. ║ powered by lambdagent (21 built-in tools) ║
  11. ╠══════════════════════════════════════════════════════════╣
  12. ║ ║
  13. ║ 📁 文件读写编辑 🔍 代码搜索 ║
  14. ║ 💻 Shell 执行 🔀 Git 工作流 ║
  15. ║ 🌐 Web 搜索/获取 📓 Notebook 编辑 ║
  16. ║ 🚀 应用/浏览器控制 📊 系统信息/截屏 ║
  17. ║ 📋 任务管理 🧪 自动化测试 ║
  18. ║ ║
  19. ║ 输入 'exit' 退出 | 'trace' 追踪 | 'stats' 统计 ║
  20. ╚══════════════════════════════════════════════════════════╝
  21. """
  22. WAKE_WORD = "lambda"
  23. # 后端类型常量
  24. BACKEND_CLAUDE_CODE = "claude_code"
  25. BACKEND_OLLAMA = "ollama"
  26. BACKEND_API = "api"
  27. def detect_backend() -> tuple[str, bool, str]:
  28. """
  29. 检测可用的 LLM 后端。
  30. 返回: (model_name, use_api, backend_type)
  31. - backend_type="claude_code" → Claude Code CLI (Max Plan, 无需 API Key, 最强)
  32. - backend_type="api" → 云端 API (Anthropic/DashScope/OpenAI)
  33. - backend_type="ollama" → 本地 Ollama (Qwen2.5, GLM-4 等, 能力较弱)
  34. 优先级: Claude Code CLI > API > Ollama
  35. (Claude Code 能力最强且免费,优先使用)
  36. """
  37. # 1. 检测 Claude Code CLI (最强,优先)
  38. if shutil.which("claude"):
  39. print("✅ 使用 Claude Code Max Plan (无需 API Key)")
  40. print(" 模型: claude sonnet (通过 claude CLI)")
  41. return "sonnet", False, BACKEND_CLAUDE_CODE
  42. # 2. 云端 API
  43. if os.environ.get("ANTHROPIC_API_KEY"):
  44. model = "claude-sonnet-4-20250514"
  45. print("✅ 使用 Anthropic API ({})".format(model))
  46. return model, True, BACKEND_API
  47. elif os.environ.get("DASHSCOPE_API_KEY"):
  48. model = "qwen-max"
  49. print("✅ 使用 DashScope API ({})".format(model))
  50. return model, True, BACKEND_API
  51. elif os.environ.get("OPENAI_API_KEY"):
  52. model = "gpt-4o"
  53. print("✅ 使用 OpenAI API ({})".format(model))
  54. return model, True, BACKEND_API
  55. # 3. Ollama 本地模型 (fallback, 能力较弱)
  56. try:
  57. from .ollama_lam import ollama_available
  58. models = ollama_available()
  59. if models:
  60. preferred = ["qwen2.5:32b", "qwen2.5:14b", "glm4:9b", "qwen2.5:7b", "llama3.1:8b"]
  61. selected = None
  62. for p in preferred:
  63. if p in models:
  64. selected = p
  65. break
  66. if not selected:
  67. selected = models[0]
  68. print("⚠️ 使用 Ollama 本地模型 ({}) — 能力有限,推荐安装 Claude Code".format(selected))
  69. print(" 可用模型: {}".format(", ".join(models[:5])))
  70. return selected, False, BACKEND_OLLAMA
  71. except Exception:
  72. pass
  73. return "", False, ""