中期成果提交:PPT自动生成 Agent(感知-规划-行动-记忆闭环 + aura-ppt 渲染引擎 + Web 交互界面 + 测试用例 + AI 使用日志)

This commit is contained in:
T1-AISUYISIN
2026-08-31 09:53:11 +08:00
commit 883a89682b
50 changed files with 10355 additions and 0 deletions
+93
View File
@@ -0,0 +1,93 @@
# ===== 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.pyopenverse/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