""" 应用配置 """ from pathlib import Path from pydantic_settings import BaseSettings from typing import List # 无论从项目根还是 backend 目录启动,始终加载 backend/.env _BACKEND_DIR = Path(__file__).resolve().parent.parent.parent _ENV_PATH = _BACKEND_DIR / ".env" class Settings(BaseSettings): """应用设置""" # 应用基本信息 APP_NAME: str = "天工智能体平台" APP_VERSION: str = "1.0.0" ENVIRONMENT: str = "dev" # dev | staging | prod DEBUG: bool = False SQL_ECHO: bool = False # 独立于 DEBUG 的 SQL 日志开关,生产环境必须为 False SECRET_KEY: str = "dev-secret-key-change-in-production" # 数据库配置(MySQL)— 生产环境必须通过环境变量设置 DATABASE_URL: str = "" # Redis配置 REDIS_URL: str = "redis://localhost:6379/0" # 会话记忆:除 Redis 外是否写入 MySQL(persistent_user_memories),实现跨重启、跨 TTL 的永久记忆 MEMORY_PERSIST_DB_ENABLED: bool = True # 本地文件工具(file_read / file_write):允许读写的根目录。空字符串表示使用「backend 的上一级目录」作为仓库根。 LOCAL_FILE_TOOLS_ROOT: str = "" LOCAL_FILE_READ_MAX_BYTES: int = 2_097_152 # 单次读取上限(默认 2MB) LOCAL_FILE_WRITE_MAX_BYTES: int = 2_097_152 # 单次写入内容上限(UTF-8 字节) # http_request 工具:写入 LLM 上下文的响应体最大字符数(HTML/JSON 过大时截断,避免超过模型 context) HTTP_REQUEST_MAX_BODY_CHARS: int = 32_000 # web_search 工具:Bing Search API Key(Azure 免费层 1000 次/月),留空则使用 DuckDuckGo BING_SEARCH_API_KEY: str = "" # web_search 工具:HTTP 代理地址(DuckDuckGo 在国内无法访问时使用),如 http://127.0.0.1:7890 SEARCH_PROXY: str = "" # 图片 OCR(file_read 对 png/jpg 等):Tesseract 可执行文件路径,Windows 示例 C:/Program Files/Tesseract-OCR/tesseract.exe TESSERACT_CMD: str = "" # 自定义 tessdata 目录(内含 chi_sim.traineddata 等)。留空时若 LOCAL_FILE_TOOLS_ROOT/tessdata 下存在 .traineddata 则自动使用 TESSERACT_TESSDATA_DIR: str = "" # 智能体对话落盘:在工作区根下 agent_workspaces//dialogue.md 追加 Markdown(与 LOCAL_FILE_TOOLS_ROOT 一致) AGENT_WORKSPACE_CHAT_LOG_ENABLED: bool = True AGENT_WORKSPACE_CHAT_SUBDIR: str = "agent_workspaces" # 日志配置 LOG_DIR: str = "logs" LOG_LEVEL: str = "INFO" LOG_MAX_BYTES: int = 10 * 1024 * 1024 # 10MB 单文件上限 LOG_BACKUP_COUNT: int = 5 # 保留最近5个轮转文件 LOG_RETENTION_DAYS: int = 30 # 数据库日志保留天数 # CORS配置(支持字符串或列表) CORS_ORIGINS: str = "http://localhost:3000,http://127.0.0.1:3000,http://localhost:8038,http://101.43.95.130:8038" # OpenAI配置 OPENAI_API_KEY: str = "" OPENAI_BASE_URL: str = "https://api.openai.com/v1" # DeepSeek配置 DEEPSEEK_API_KEY: str = "" DEEPSEEK_BASE_URL: str = "https://api.deepseek.com" # 全局 LLM 降级配置(当 Agent/工作流未配置 fallback_llm 时自动启用) FALLBACK_LLM_MODEL: str = "" FALLBACK_LLM_API_KEY: str = "" FALLBACK_LLM_BASE_URL: str = "" # SiliconFlow配置(Embedding 推荐使用 SiliconFlow) SILICONFLOW_API_KEY: str = "" SILICONFLOW_BASE_URL: str = "https://api.siliconflow.cn/v1" SILICONFLOW_EMBEDDING_MODEL: str = "netease-youdao/bce-embedding-base_v1" # Anthropic配置 ANTHROPIC_API_KEY: str = "" # JWT配置 JWT_SECRET_KEY: str = "dev-jwt-secret-key-change-in-production" JWT_ALGORITHM: str = "HS256" JWT_ACCESS_TOKEN_EXPIRE_MINUTES: int = 30 JWT_MOBILE_TOKEN_EXPIRE_MINUTES: int = 10080 # 移动端 7 天,Android EncryptedSharedPreferences 安全存储 # Celery 工作流任务:对**非业务节点失败**(非 WorkflowExecutionError)的退避重试次数,0 表示不重试 WORKFLOW_TASK_MAX_RETRIES: int = 0 # 单执行预算:主循环每执行一个节点计 1 步,超过则熔断(防止死循环/失控) WORKFLOW_MAX_STEPS_PER_RUN: int = 2000 # 单执行 LLM 节点调用上限(llm / template 节点每执行一次计 1) WORKFLOW_MAX_LLM_INVOCATIONS_PER_RUN: int = 200 # 单执行工具实际执行次数上限(LLM function calling 每执行一个工具计 1) WORKFLOW_MAX_TOOL_CALLS_PER_RUN: int = 500 # 外部访问地址(用于飞书通知中的详情链接等) EXTERNAL_URL: str = "" # 飞书应用配置(用于发送消息通知到用户飞书) FEISHU_APP_ID: str = "" FEISHU_APP_SECRET: str = "" FEISHU_VERIFICATION_TOKEN: str = "" # 安全加固 — HSTS(生产环境建议启用,开发环境保持关闭) HSTS_ENABLED: bool = False HSTS_MAX_AGE: int = 31536000 # 默认 1 年 HSTS_INCLUDE_SUBDOMAINS: bool = True # Webhook 全局认证 Token — 所有 webhook 触发请求需要携带此 Token WEBHOOK_AUTH_TOKEN: str = "" # 橙子飞书应用配置(独立 WS 连接,直接路由到橙子助手 Agent) ORANGE_APP_ID: str = "" ORANGE_APP_SECRET: str = "" ORANGE_AGENT_ID: str = "" # 创建橙子助手后写入 # 苏瑶飞书应用配置(独立 WS 连接,直接路由到苏瑶 Agent) SUYAO_APP_ID: str = "" SUYAO_APP_SECRET: str = "" SUYAO_AGENT_ID: str = "" # 创建苏瑶后写入 # 甜甜飞书应用配置(独立 WS 连接,路由到苏瑶3号知识图谱 Agent) TIANTIAN_APP_ID: str = "" TIANTIAN_APP_SECRET: str = "" TIANTIAN_AGENT_ID: str = "" # 创建苏瑶3号后写入 # 灵犀飞书应用配置(独立 WS 连接,路由到灵犀学习助手 Agent) LINGXI_APP_ID: str = "" LINGXI_APP_SECRET: str = "" LINGXI_AGENT_ID: str = "" # 创建灵犀后写入 # 人参果飞书应用配置(独立 WS 连接,路由到 AI学习助手 Agent — KG+RAG理想版) RENSHENGUO_APP_ID: str = "" RENSHENGUO_APP_SECRET: str = "" RENSHENGUO_AGENT_ID: str = "" # 创建 AI学习助手 后写入 # 人参果1号飞书应用配置(独立 WS 连接,路由到 AI学习助手 Agent — 行为约束版,禁止主动消息) RENSHENGUO2_APP_ID: str = "" RENSHENGUO2_APP_SECRET: str = "" RENSHENGUO2_AGENT_ID: str = "" # 创建 AI学习助手(人参果1号)后写入 class Config: env_file = str(_ENV_PATH) case_sensitive = True extra = "ignore" settings = Settings()