""" agent67.core.config — 配置与常量 """ from __future__ import annotations import os import shutil BANNER = """ ╔══════════════════════════════════════════════════════════╗ ║ 🐂 lambda v3 — Java/Python 全栈 + ML 专家 ║ ║ powered by lambdagent (42 tools + PaaS services) ║ ╠══════════════════════════════════════════════════════════╣ ║ ║ ║ 📁 文件/代码编辑 🔍 代码搜索 (6种语言) ║ ║ 💻 Shell + Git 🌐 Web 搜索/获取 ║ ║ 📓 Notebook/文档生成 🧠 知识库 + OCR ║ ║ 🧪 自动化测试 💾 持久记忆 + 学习 ║ ║ 📋 任务/调度/通知 🖥️ 系统/浏览器/截屏 ║ ║ ║ ║ exit 退出 | trace 追踪 | stats 统计 | history 历史 ║ ╚══════════════════════════════════════════════════════════╝ """ WAKE_WORD = "lambda" # 后端类型常量 BACKEND_CLAUDE_CODE = "claude_code" BACKEND_OLLAMA = "ollama" BACKEND_API = "api" def detect_backend() -> tuple[str, bool, str]: """ 检测可用的 LLM 后端。 返回: (model_name, use_api, backend_type) - backend_type="ollama" → 本地 Ollama 大模型 (≥30B, 首选) - backend_type="claude_code" → Claude Code CLI (Max Plan, 无需 API Key) - backend_type="api" → 云端 API (Anthropic/DashScope/OpenAI) - backend_type="ollama" → 本地 Ollama 小模型 (fallback) 优先级: Ollama 大模型(≥30B) > Claude Code > API > Ollama 小模型 """ # 强模型名单(≥30B 参数,本地运行优先) STRONG_MODELS = [ "qwen2.5-coder:32b", "qwen2.5:32b", "qwen2.5:72b", "deepseek-coder-v2:33b", "codellama:34b", "llama3.1:70b", "mixtral:8x7b", ] # 弱模型名单(fallback) WEAK_MODELS = [ "qwen2.5-coder:7b", "qwen2.5:14b", "qwen2.5:7b", "glm4:9b", "llama3.1:8b", "deepseek-coder:6.7b", ] # 1. 检测 Ollama 大模型(本地、隐私、免费、够强) try: from .ollama_lam import ollama_available models = ollama_available() if models: for m in STRONG_MODELS: if m in models: print("✅ 使用 Ollama 本地大模型 ({})".format(m)) print(" 可用模型: {}".format(", ".join(models[:5]))) return m, False, BACKEND_OLLAMA except Exception: pass # 2. Claude Code CLI if shutil.which("claude"): print("✅ 使用 Claude Code Max Plan (无需 API Key)") print(" 模型: claude sonnet (通过 claude CLI)") return "sonnet", False, BACKEND_CLAUDE_CODE # 3. 云端 API if os.environ.get("ANTHROPIC_API_KEY"): model = "claude-sonnet-4-20250514" print("✅ 使用 Anthropic API ({})".format(model)) return model, True, BACKEND_API elif os.environ.get("DASHSCOPE_API_KEY"): model = "qwen-max" print("✅ 使用 DashScope API ({})".format(model)) return model, True, BACKEND_API elif os.environ.get("OPENAI_API_KEY"): model = "gpt-4o" print("✅ 使用 OpenAI API ({})".format(model)) return model, True, BACKEND_API # 4. Ollama 小模型 (fallback) try: from .ollama_lam import ollama_available models = ollama_available() if models: selected = None for m in WEAK_MODELS: if m in models: selected = m break if not selected: selected = models[0] print("⚠️ 使用 Ollama 小模型 ({}) — 能力有限".format(selected)) print(" 可用模型: {}".format(", ".join(models[:5]))) return selected, False, BACKEND_OLLAMA except Exception: pass return "", False, ""