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