Files
aiagent/backend/app/core/config.py
renjianbo c3af128b81 fix: moonshot temperature=1, 20MB upload limit, file input FileList fix, rate limiter off
- workflow_integration: force temperature=1.0 for moonshot provider (Kimi K3 reasoning models reject other values), both agent node and orchestrator node
- config: LOCAL_FILE_WRITE_MAX_BYTES 2MB -> 20MB (image uploads)
- main: temporarily disable RateLimiterMiddleware
- useFileUpload: copy FileList before resetting input (Chromium clears reference)
- AgentChat/AgentChatPreview: attach button via ChatInputArea ref
2026-07-27 00:43:17 +08:00

189 lines
8.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
应用配置
"""
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 = 20_971_520 # 单次写入内容上限 20MB(含图片上传)
# 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/<agent_id>/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
# ── 虚拟公司:事件批量落库(三档-a)──
# 每积攒 N 条事件即刷库(bulk commit);N=1 等价旧的逐条 commit(回退开关)
COMPANY_EVENT_FLUSH_MAX_EVENTS: int = 25
# 或每 T 秒强制刷库一次(保证 WS 可见延迟 ≤ ~1.5s;WS 轮询 0.8s)
COMPANY_EVENT_FLUSH_INTERVAL_SEC: float = 0.7
# ── 虚拟公司:并发上限(三档-b)──
# 同时运行的公司项目数上限;超出的排队(真实队列),空出名额再启动。调高≈无限
MAX_CONCURRENT_COMPANY_PROJECTS: int = 3
# 排队期间刷新 updated_at 的间隔(防长队被僵尸监管误杀,ZOMBIE_TIMEOUT=900s)
COMPANY_QUEUE_HEARTBEAT_SEC: float = 60.0
# 单次编排每一波并行运行的部门数上限(防超大 CEO 计划一次拉起过多部门)。调高≈无限
MAX_CONCURRENT_DEPARTMENTS: int = 4
# ── 虚拟公司:CEO 规划回喂历史知识(四档-② 学习闭环)──
# 规划前检索本公司历史知识(CompanyKnowledge)按相关性注入 CEO prompt,越跑越懂本公司。关闭即回归旧行为
COMPANY_CEO_MEMORY_ENABLED: bool = True
# 最多注入的历史知识条数(按相关性+category 权重排序取 TopN)
COMPANY_CEO_MEMORY_MAX_ENTRIES: int = 5
# 注入历史知识的总字数上限(防 CEO prompt 膨胀/超 context)
COMPANY_CEO_MEMORY_MAX_CHARS: int = 4000
# 项目终态时自动沉淀知识到 CompanyKnowledge(闭合学习闭环;否则需手动调 generate 接口)
COMPANY_AUTO_EXTRACT_KNOWLEDGE: bool = True
# 外部访问地址(用于飞书通知中的详情链接等)
EXTERNAL_URL: str = ""
# SMS 短信服务配置(mock / tencent / aliyun)
SMS_PROVIDER: str = "mock"
# 飞书应用配置(用于发送消息通知到用户飞书)
FEISHU_APP_ID: str = ""
FEISHU_APP_SECRET: str = ""
FEISHU_VERIFICATION_TOKEN: str = ""
# 平台管理员凭据(所有 bootstrap 脚本从环境变量读取,不再硬编码默认值)
PLATFORM_USERNAME: str = ""
PLATFORM_PASSWORD: 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()