|
|
@@ -34,20 +34,45 @@ def detect_backend() -> tuple[str, bool, str]:
|
|
|
检测可用的 LLM 后端。
|
|
|
|
|
|
返回: (model_name, use_api, backend_type)
|
|
|
- - backend_type="claude_code" → Claude Code CLI (Max Plan, 无需 API Key, 最强)
|
|
|
+ - 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 (Qwen2.5, GLM-4 等, 能力较弱)
|
|
|
+ - backend_type="ollama" → 本地 Ollama 小模型 (fallback)
|
|
|
|
|
|
- 优先级: Claude Code CLI > API > Ollama
|
|
|
- (Claude Code 能力最强且免费,优先使用)
|
|
|
+ 优先级: Ollama 大模型(≥30B) > Claude Code > API > Ollama 小模型
|
|
|
"""
|
|
|
- # 1. 检测 Claude Code CLI (最强,优先)
|
|
|
+ # 强模型名单(≥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
|
|
|
|
|
|
- # 2. 云端 API
|
|
|
+ # 3. 云端 API
|
|
|
if os.environ.get("ANTHROPIC_API_KEY"):
|
|
|
model = "claude-sonnet-4-20250514"
|
|
|
print("✅ 使用 Anthropic API ({})".format(model))
|
|
|
@@ -61,20 +86,19 @@ def detect_backend() -> tuple[str, bool, str]:
|
|
|
print("✅ 使用 OpenAI API ({})".format(model))
|
|
|
return model, True, BACKEND_API
|
|
|
|
|
|
- # 3. Ollama 本地模型 (fallback, 能力较弱)
|
|
|
+ # 4. Ollama 小模型 (fallback)
|
|
|
try:
|
|
|
from .ollama_lam import ollama_available
|
|
|
models = ollama_available()
|
|
|
if models:
|
|
|
- preferred = ["qwen2.5:32b", "qwen2.5:14b", "glm4:9b", "qwen2.5:7b", "llama3.1:8b"]
|
|
|
selected = None
|
|
|
- for p in preferred:
|
|
|
- if p in models:
|
|
|
- selected = p
|
|
|
+ for m in WEAK_MODELS:
|
|
|
+ if m in models:
|
|
|
+ selected = m
|
|
|
break
|
|
|
if not selected:
|
|
|
selected = models[0]
|
|
|
- print("⚠️ 使用 Ollama 本地模型 ({}) — 能力有限,推荐安装 Claude Code".format(selected))
|
|
|
+ print("⚠️ 使用 Ollama 小模型 ({}) — 能力有限".format(selected))
|
|
|
print(" 可用模型: {}".format(", ".join(models[:5])))
|
|
|
return selected, False, BACKEND_OLLAMA
|
|
|
except Exception:
|