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
+74
View File
@@ -0,0 +1,74 @@
from functools import lru_cache
from pydantic_settings import BaseSettings, SettingsConfigDict
class Settings(BaseSettings):
model_config = SettingsConfigDict(
env_file=".env",
env_file_encoding="utf-8",
case_sensitive=False,
extra="ignore",
)
app_env: str = "development"
app_name: str = "zhuangxiu-api"
log_level: str = "INFO"
api_host: str = "0.0.0.0"
api_port: int = 8000
cors_origins: str = "http://localhost:3000"
database_url: str = "postgresql+psycopg://zhuangxiu:zhuangxiu@localhost:5432/zhuangxiu"
redis_url: str = "redis://localhost:6379/0"
s3_endpoint: str = ""
s3_public_endpoint: str = ""
s3_access_key_id: str = ""
s3_secret_access_key: str = ""
s3_region: str = "us-east-1"
s3_bucket_inputs: str = "renovation-inputs"
s3_bucket_derived: str = "renovation-derived"
s3_bucket_renders: str = "renovation-renders"
s3_force_path_style: bool = True
s3_presigned_url_ttl_seconds: int = 900
baidu_ocr_enabled: bool = False
baidu_ocr_api_key: str = ""
baidu_ocr_secret_key: str = ""
baidu_ocr_token_url: str = "https://aip.baidubce.com/oauth/2.0/token"
llm_default_provider: str = "openai"
openai_api_key: str = ""
openai_base_url: str = "https://api.openai.com/v1"
openai_text_model: str = "gpt-5"
openai_image_model: str = "gpt-image-2"
gemini_api_key: str = ""
gemini_model: str = "gemini-3-pro"
ark_api_key: str = ""
seedream_model_endpoint: str = ""
image_provider_priority: str = "seedream,openai,gemini"
gpu_service_url: str = "http://localhost:8100"
gpu_service_token: str = ""
jwt_secret: str = ""
session_secret: str = ""
app_encryption_key: str = ""
webhook_signing_secret: str = ""
langfuse_enabled: bool = False
langfuse_host: str = "http://localhost:3001"
langfuse_public_key: str = ""
langfuse_secret_key: str = ""
sentry_dsn: str = ""
sentry_environment: str = "development"
sentry_traces_sample_rate: float = 0
@property
def cors_origin_list(self) -> list[str]:
return [origin.strip() for origin in self.cors_origins.split(",") if origin.strip()]
@lru_cache
def get_settings() -> Settings:
return Settings()