feat: scaffold agentic interior design workflow

This commit is contained in:
Codex
2026-08-01 21:07:17 +08:00
parent 77779bd3a9
commit 6a15217d55
42 changed files with 7156 additions and 1 deletions
@@ -0,0 +1,49 @@
from dataclasses import dataclass
from app.config import Settings
def _configured(value: str) -> bool:
return bool(value) and not value.startswith("replace_with_")
@dataclass(frozen=True)
class ProviderCapability:
provider: str
configured: bool
strengths: tuple[str, ...]
class ModelRouter:
def __init__(self, settings: Settings) -> None:
self.settings = settings
def capabilities(self) -> list[ProviderCapability]:
return [
ProviderCapability(
provider="seedream",
configured=_configured(self.settings.ark_api_key)
and bool(self.settings.seedream_model_endpoint),
strengths=("中文风格指令", "快速方向探索"),
),
ProviderCapability(
provider="openai",
configured=_configured(self.settings.openai_api_key),
strengths=("局部编辑", "多轮一致性", "遮罩修改"),
),
ProviderCapability(
provider="gemini",
configured=_configured(self.settings.gemini_api_key),
strengths=("多参考图理解", "复杂视觉指令"),
),
]
def choose_image_provider(self, task: str) -> str:
configured = {item.provider for item in self.capabilities() if item.configured}
priorities = [item.strip() for item in self.settings.image_provider_priority.split(",")]
if task == "masked_edit" and "openai" in configured:
return "openai"
for provider in priorities:
if provider in configured:
return provider
raise RuntimeError("No image provider is configured.")