Initial commit: TradeMate 外贸小助手 MVP
项目结构: - backend/ Python FastAPI 后端 - uni-app/ uni-app跨端前端 - docs/ 设计文档 - docker-compose.yml Docker编排 - nginx/scripts/systemd 运维配置 已完成功能: - 用户认证 (JWT) - 智能翻译 + 回复建议 - 营销素材生成 - 客户管理 + 沉默检测 - 报价单管理 - 产品库管理 - 汇率换算 - 推送通知 (uni-push) - WhatsApp Webhook框架 - Celery定时任务
This commit is contained in:
@@ -0,0 +1,73 @@
|
||||
from pydantic_settings import BaseSettings
|
||||
from typing import Optional
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
PROJECT_ROOT = Path(__file__).resolve().parents[2]
|
||||
ENV_FILE = PROJECT_ROOT / ".env"
|
||||
|
||||
|
||||
class Settings(BaseSettings):
|
||||
model_config = {"env_file": str(ENV_FILE), "extra": "ignore"}
|
||||
|
||||
APP_NAME: str = "TradeMate"
|
||||
|
||||
SECRET_KEY: str
|
||||
JWT_ALGORITHM: str = "HS256"
|
||||
ACCESS_TOKEN_EXPIRE_MINUTES: int = 60
|
||||
REFRESH_TOKEN_EXPIRE_DAYS: int = 30
|
||||
|
||||
DATABASE_URL: str
|
||||
DB_ECHO: bool = False
|
||||
|
||||
REDIS_URL: str = "redis://localhost:6379/0"
|
||||
|
||||
CELERY_BROKER_URL: str = "redis://localhost:6379/1"
|
||||
CELERY_RESULT_BACKEND: str = "redis://localhost:6379/2"
|
||||
|
||||
OPENAI_API_KEY: Optional[str] = None
|
||||
ANTHROPIC_API_KEY: Optional[str] = None
|
||||
DEEPL_API_KEY: Optional[str] = None
|
||||
|
||||
LOCAL_MODEL_ENABLED: bool = False
|
||||
LOCAL_MODEL_URL: str = "http://localhost:8001"
|
||||
|
||||
WHATSAPP_API_TOKEN: Optional[str] = None
|
||||
WHATSAPP_PHONE_NUMBER_ID: Optional[str] = None
|
||||
WHATSAPP_WEBHOOK_VERIFY_TOKEN: Optional[str] = None
|
||||
|
||||
WECHAT_APP_ID: Optional[str] = None
|
||||
WECHAT_APP_SECRET: Optional[str] = None
|
||||
|
||||
EXCHANGE_RATE_API_KEY: Optional[str] = None
|
||||
|
||||
UPLOAD_DIR: str = "./uploads"
|
||||
MAX_UPLOAD_SIZE: int = 10 * 1024 * 1024
|
||||
|
||||
FRONTEND_URL: str = "http://localhost:3000"
|
||||
BACKEND_URL: str = "http://localhost:8000"
|
||||
|
||||
AI_ROUTING: dict = {
|
||||
"translate": {"primary": "deepl", "fallback": ["openai", "local"]},
|
||||
"reply": {"primary": "openai", "fallback": ["anthropic", "local"]},
|
||||
"marketing": {"primary": "anthropic", "fallback": ["openai", "local"]},
|
||||
"extract": {"primary": "openai", "fallback": ["anthropic"]},
|
||||
"quotation": {"primary": "openai", "fallback": ["anthropic"]},
|
||||
}
|
||||
|
||||
FREE_DAILY_TRANSLATE_CHARS: int = 5000
|
||||
FREE_DAILY_REPLIES: int = 20
|
||||
FREE_DAILY_MARKETING: int = 5
|
||||
FREE_MAX_CUSTOMERS: int = 5
|
||||
FREE_MAX_PRODUCTS: int = 1
|
||||
FREE_DAILY_QUOTATIONS: int = 3
|
||||
|
||||
PRO_DAILY_TRANSLATE_CHARS: int = 50000
|
||||
PRO_DAILY_REPLIES: int = 200
|
||||
PRO_DAILY_MARKETING: int = 50
|
||||
PRO_MAX_CUSTOMERS: int = 100
|
||||
PRO_MAX_PRODUCTS: int = 20
|
||||
PRO_DAILY_QUOTATIONS: int = 30
|
||||
|
||||
|
||||
settings = Settings()
|
||||
Reference in New Issue
Block a user