Force every LLM stage onto DeepSeek and stop Anthropic Console uploads.

PROVIDER_*=anthropic and Claude fallbacks now coerce to DeepSeek, skills stay local, and default_model_version bumps without upload_skills.py.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-09-10 22:56:49 +02:00
co-authored by Cursor
parent 7aed64cae5
commit 3e43bb6ecb
9 changed files with 109 additions and 72 deletions
+5 -11
View File
@@ -26,17 +26,12 @@ DEEPSEEK_REASONING_EFFORT=high
# -- AI provider routing -----------------------------------------------------
# Default provider for every stage; per-stage env vars override.
# Valid values: deepseek | anthropic | gemini
# Valid values: deepseek | gemini (anthropic is ignored and coerced to deepseek)
PROVIDER_DEFAULT=deepseek
# PROVIDER_VALIDATION=deepseek
# PROVIDER_AUTO_RESOLVE=deepseek
# -- Anthropic (optional fallback) -------------------------------------------
# ANTHROPIC_API_KEY=sk-ant-...
# ANTHROPIC_MODEL=claude-sonnet-4-6
# MODEL_PINTABLE=
# MODEL_PATTERN=
# MODEL_VALIDATION=
# Anthropic is not used. Do not set ANTHROPIC_API_KEY.
# -- Gemini (optional) -------------------------------------------------------
# GEMINI_API_KEY=
@@ -44,10 +39,9 @@ PROVIDER_DEFAULT=deepseek
# MODEL_VALIDATION_GEMINI=
# -- Per-stage fallback ------------------------------------------------------
# If set, the stage retries once with FALLBACK_PROVIDER_<STAGE> /
# FALLBACK_MODEL_<STAGE> when the primary provider raises.
# FALLBACK_PROVIDER_VALIDATION=anthropic
# FALLBACK_MODEL_VALIDATION=claude-sonnet-4-6
# If set, the stage retries once. Anthropic is ignored (DeepSeek only).
# FALLBACK_PROVIDER_VALIDATION=deepseek
# FALLBACK_MODEL_VALIDATION=deepseek-flash
# -- Storage -----------------------------------------------------------------
# Set GCS_BUCKET to store projects/library in Google Cloud Storage.
+13 -8
View File
@@ -220,9 +220,16 @@ class Settings(BaseSettings):
return bool(self.email_sender and self.email_frontend_url)
def provider_for_stage(self, stage: str) -> str:
"""Return the LLM provider name for a pipeline stage."""
"""Return the LLM provider name for a pipeline stage.
Anthropic is never used: any ``PROVIDER_*=anthropic`` override is
coerced to DeepSeek.
"""
override = getattr(self, f"provider_{stage}", "")
return override or self.provider_default
name = override or self.provider_default
if name == "anthropic":
return "deepseek"
return name
def model_for_stage(self, stage: str) -> str:
"""Return the model for a pipeline stage, provider-aware.
@@ -247,7 +254,7 @@ class Settings(BaseSettings):
when the primary provider raises.
"""
fb_provider = getattr(self, f"fallback_provider_{stage}", "")
if not fb_provider:
if not fb_provider or fb_provider == "anthropic":
return None
fb_model = getattr(self, f"fallback_model_{stage}", "")
if not fb_model:
@@ -269,15 +276,13 @@ class Settings(BaseSettings):
def has_llm_credentials(self) -> bool:
"""True if the configured default provider has an API key."""
name = self.provider_default
if name == "anthropic":
name = "deepseek"
if name == "deepseek":
return bool(self.deepseek_api_key)
if name == "gemini":
return bool(self.gemini_api_key)
if name == "anthropic":
return bool(self.anthropic_api_key)
return bool(
self.deepseek_api_key or self.anthropic_api_key or self.gemini_api_key
)
return bool(self.deepseek_api_key)
def get_skill_or_none(self, name: str) -> tuple[str | None, str | None]:
"""Return (skill_id, version) or (None, None) if the Anthropic
+1 -2
View File
@@ -5,8 +5,7 @@ Ports the extraction steps from run_pipeline.py to async:
- extract_pattern: Passive MPN pattern
- extract_specs: Component specs (discrete, connectors, crystals, etc.)
Skills (SKILL.md + validate.py) run locally for DeepSeek/Gemini. Anthropic
can still use Console Skills when a skill_id is in skills_manifest.json.
Skills (SKILL.md + validate.py) run locally against DeepSeek. Do not use Anthropic Console Skills.
"""
from __future__ import annotations
+3 -2
View File
@@ -24,8 +24,9 @@ def get_provider_by_name(name: str) -> LLMProvider:
from backend.services.llm.deepseek_provider import DeepSeekProvider
return DeepSeekProvider()
if name == "anthropic":
from backend.services.llm.anthropic_provider import AnthropicProvider
return AnthropicProvider()
log.warning("Anthropic is disabled — using DeepSeek instead")
from backend.services.llm.deepseek_provider import DeepSeekProvider
return DeepSeekProvider()
if name == "gemini":
from backend.services.llm.gemini_provider import GeminiProvider
return GeminiProvider()
+1 -1
View File
@@ -1,5 +1,5 @@
{
"default_model_version": "1.7.0",
"default_model_version": "1.8.0",
"extract-pintable": {
"skill_id": "skill_01VMWPZuvuZAe4LmLbmsNWNY",
"latest_version": "1784798970179642",