# ===== PPT 自动生成 Agent 配置 ===== import os from pathlib import Path # 项目根目录 BASE_DIR = Path(__file__).resolve().parent # 引擎路径(2026-08-24 选型:渲染=aura-ppt 主引擎;解析/搜图=ppt-master 辅助) # 所有引擎优化只在项目内副本做,技能原版路径只读 AURA_ENGINE_PATH = Path(os.environ.get("AURA_ENGINE_PATH", BASE_DIR / "engine" / "aura-ppt")) AURA_ENGINE_SCRIPT = AURA_ENGINE_PATH / "scripts" / "engine.py" PPT_MASTER_PATH = Path(os.environ.get("PPT_MASTER_PATH", BASE_DIR / "engine" / "ppt-master")) # 公司模板(--template 模式继承母版/Logo/页脚) COMPANY_TEMPLATE = Path(os.environ.get("COMPANY_TEMPLATE", AURA_ENGINE_PATH / "assets" / "company-template.pptx")) # 模板模式策略:always=始终用模板 / ja=仅日语生成用 / off=不用 COMPANY_TEMPLATE_MODE = os.environ.get("COMPANY_TEMPLATE_MODE", "ja") # ===== 大模型接入(2026-08-25)===== # backend: opencode=复用 opencode serve(零 Key) / openai=OpenAI 兼容接口(DeepSeek等) / off=关闭 LLM_BACKEND = os.environ.get("LLM_BACKEND", "opencode") # opencode 模式(模型经基准测试选定:mimo-v2.5-free 结构化输出最快最稳,44s/大纲) OPENCODE_SERVE = os.environ.get("OPENCODE_SERVE", "http://127.0.0.1:4096") OPENCODE_SERVE_PORT = int(os.environ.get("OPENCODE_SERVE_PORT", "4096")) OPENCODE_MODEL = os.environ.get("OPENCODE_MODEL", "opencode/mimo-v2.5-free") # openai 兼容模式(DeepSeek: https://api.deepseek.com, model=deepseek-chat) OPENAI_API_BASE = os.environ.get("OPENAI_API_BASE", "") OPENAI_API_KEY = os.environ.get("OPENAI_API_KEY", "") OPENAI_MODEL = os.environ.get("OPENAI_MODEL", "deepseek-chat") # LLM 调用超时(秒) LLM_TIMEOUT = int(os.environ.get("LLM_TIMEOUT", "180")) # 长文档两级规划(2026-08-26):分段通读 → 汇总大纲 PLAN_CHUNK_CHARS = int(os.environ.get("PLAN_CHUNK_CHARS", "6000")) PLAN_MAX_CHUNKS = int(os.environ.get("PLAN_MAX_CHUNKS", "8")) # 生成任务输出根目录 PROJECTS_PATH = Path(os.environ.get("PROJECTS_PATH", BASE_DIR / "src" / "web" / "data" / "projects")) # SQLite 数据库路径 DB_PATH = Path(os.environ.get("DB_PATH", BASE_DIR / "src" / "web" / "data" / "ppt.db")) # Flask Session 密钥(环境变量注入,不进仓库) SECRET_KEY = os.environ.get("SECRET_KEY", "ppt-agent-dev-secret-key-do-not-use-in-prod") # 服务绑定 HOST = os.environ.get("HOST", "127.0.0.1") PORT = int(os.environ.get("PORT", "5000")) DEBUG = os.environ.get("FLASK_DEBUG", "0") == "1" # 上传限制 MAX_UPLOAD_MB = 20 UPLOAD_DIR = BASE_DIR / "src" / "web" / "data" / "uploads" # 文件类型白名单 ALLOWED_EXTENSIONS = { ".pdf": "pdf", ".docx": "doc", ".doc": "doc", ".xlsx": "excel", ".xlsm": "excel", ".pptx": "ppt", ".md": "markdown", ".txt": "text", ".html": "html", ".htm": "html", } # 枚举白名单 ALLOWED_SCENES = ("report", "training") ALLOWED_COLORS = ("blue", "green", "purple", "orange", "gray") ALLOWED_LANGS = ("zh", "ja") ALLOWED_CANVAS = ("ppt169", "ppt43") ALLOWED_IMAGE_STRATEGIES = ("web", "ai", "off") # 配图策略(web 默认) DEFAULT_IMAGE_STRATEGY = "web" # 生成任务并发上限 MAX_CONCURRENT_GENERATION = 1 # ===== 网络搜图(2026-08-25)===== # web=调用 ppt-master image_search.py(openverse/wikimedia 零配置) # test=本地样例图通道(e2e 用,读 IMAGE_SEARCH_TEST_DIR) # off=禁用配图 IMAGE_SEARCH_MODE = os.environ.get("IMAGE_SEARCH_MODE", "web") IMAGE_SEARCH_TEST_DIR = os.environ.get("IMAGE_SEARCH_TEST_DIR", "") IMAGE_SEARCH_TIMEOUT = int(os.environ.get("IMAGE_SEARCH_TIMEOUT", "90")) MAX_IMAGE_SLIDES = int(os.environ.get("MAX_IMAGE_SLIDES", "4")) # 引擎剧本目录(会话用) GENERATION_SCRIPT = None