121 lines
3.9 KiB
Python
121 lines
3.9 KiB
Python
import os
|
||
from pathlib import Path
|
||
from dotenv import load_dotenv
|
||
|
||
# 1. 动态计算项目根目录
|
||
# 在 Docker 环境中:config.py 位于 /app/core/,需要向上2级到 /app/
|
||
# 在本地开发中:config.py 位于 backend/core/,需要向上3级到项目根目录
|
||
_config_path = Path(__file__).resolve()
|
||
if _config_path.parent.parent.name == 'app':
|
||
# Docker 环境:/app/core/config.py -> /app/
|
||
PROJECT_ROOT = _config_path.parent.parent
|
||
else:
|
||
# 本地开发:backend/core/config.py -> 项目根目录
|
||
PROJECT_ROOT = _config_path.parent.parent.parent
|
||
|
||
# 2. 加载 .env 文件
|
||
# 假设 .env 文件位于项目根目录下
|
||
load_dotenv(PROJECT_ROOT / ".env")
|
||
|
||
|
||
class Settings:
|
||
# --- 路径配置 (核心修改) ---
|
||
|
||
# 强制使用计算出的项目根目录,不再依赖 .env 中的 BASE_PATH
|
||
BASE_PATH = PROJECT_ROOT
|
||
|
||
# 数据目录:固定为根目录下的 data 文件夹
|
||
DATA_PATH = BASE_PATH / "data"
|
||
|
||
# --- 核心数据文件路径 ---
|
||
STATE_FILE = DATA_PATH / "state.json"
|
||
SCHEMA_FILE = DATA_PATH / "schema.json"
|
||
PRESETS_FILE = DATA_PATH / "presets.json"
|
||
REGEX_FILE = DATA_PATH / "regex_rules.json" # 正则规则文件
|
||
SYSTEM_SETTINGS_FILE = DATA_PATH / "system_settings.json" # 系统设置文件
|
||
VECTORSTORE_PATH = DATA_PATH / "vectorstore"
|
||
|
||
# --- 业务数据目录 ---
|
||
|
||
# 世界书目录
|
||
WORLDBOOKS_PATH = DATA_PATH / "worldbooks"
|
||
|
||
# 预设目录
|
||
PRESET_PATH = DATA_PATH / "preset"
|
||
|
||
# 聊天记录目录(同时存放角色卡和聊天)
|
||
CHAT_PATH = DATA_PATH / "chat"
|
||
|
||
# 兼容别名:用于代码中引用
|
||
CHATS_PATH = CHAT_PATH
|
||
|
||
# 临时文件目录
|
||
TEMP_PATH = DATA_PATH / "temp"
|
||
|
||
# ComfyUI 工作流目录
|
||
COMFYUI_WORKFLOWS_PATH = DATA_PATH / "comfyui_workflows"
|
||
|
||
# 角色卡目录(已合并到 CHAT_PATH)
|
||
CHARACTERS_PATH = CHAT_PATH
|
||
|
||
# 图片资源目录
|
||
IMAGES_PATH = DATA_PATH / "images"
|
||
|
||
# Agent 工作流模板与运行记录
|
||
AGENT_TEMPLATES_PATH = DATA_PATH / "agent" / "templates"
|
||
AGENT_RUNS_PATH = DATA_PATH / "agent" / "runs"
|
||
AGENT_STUDIO_PROJECTS_PATH = DATA_PATH / "agent" / "studio_projects"
|
||
AGENT_STUDIO_RUNS_PATH = DATA_PATH / "agent" / "studio_runs"
|
||
AGENT_SKILL_TEMPLATES_FILE = DATA_PATH / "agent" / "skill_templates.json"
|
||
AGENT_NICHES_FILE = DATA_PATH / "agent" / "niches.json"
|
||
AGENT_WORKFLOW_VARIABLES_FILE = DATA_PATH / "agent" / "workflow_variables.json"
|
||
|
||
# 爽文(Fiction / Novel)数据目录
|
||
FICTION_PATH = DATA_PATH / "agent" / "fiction"
|
||
FICTION_EMOTION_FLOWS_PATH = FICTION_PATH / "emotion_flows"
|
||
FICTION_GUIDE_GLOBAL_PATH = FICTION_PATH / "guide_global"
|
||
FICTION_BOOKS_PATH = FICTION_PATH / "books"
|
||
FICTION_EMOTION_CATALOG_FILE = FICTION_EMOTION_FLOWS_PATH / "catalog.json"
|
||
FICTION_GUIDE_GLOBAL_ENTRIES_FILE = FICTION_GUIDE_GLOBAL_PATH / "entries.json"
|
||
|
||
def ensure_directories(self):
|
||
"""确保所有配置的目录存在,如果不存在则创建"""
|
||
directories = [
|
||
self.DATA_PATH,
|
||
self.WORLDBOOKS_PATH,
|
||
self.PRESET_PATH,
|
||
self.CHAT_PATH,
|
||
self.TEMP_PATH,
|
||
self.COMFYUI_WORKFLOWS_PATH,
|
||
self.CHARACTERS_PATH,
|
||
self.IMAGES_PATH,
|
||
self.AGENT_TEMPLATES_PATH,
|
||
self.AGENT_RUNS_PATH,
|
||
self.AGENT_STUDIO_PROJECTS_PATH,
|
||
self.AGENT_STUDIO_RUNS_PATH,
|
||
self.FICTION_PATH,
|
||
self.FICTION_EMOTION_FLOWS_PATH,
|
||
self.FICTION_GUIDE_GLOBAL_PATH,
|
||
self.FICTION_BOOKS_PATH,
|
||
]
|
||
for directory in directories:
|
||
directory.mkdir(parents=True, exist_ok=True)
|
||
|
||
# 确保核心数据文件的父目录存在
|
||
for file_path in [self.STATE_FILE, self.SCHEMA_FILE, self.PRESETS_FILE, self.REGEX_FILE, self.SYSTEM_SETTINGS_FILE]:
|
||
file_path.parent.mkdir(parents=True, exist_ok=True)
|
||
|
||
|
||
settings = Settings()
|
||
|
||
# 初始化时自动创建必要的目录
|
||
settings.ensure_directories()
|
||
|
||
if __name__ == '__main__':
|
||
settings = Settings()
|
||
print(f"项目根目录: {settings.BASE_PATH}")
|
||
print(f"数据目录: {settings.DATA_PATH}")
|
||
print(f"世界书目录: {settings.WORLDBOOKS_PATH}")
|
||
print(f"预设目录: {settings.PRESETS_PATH}")
|
||
print(f"聊天目录: {settings.CHAT_PATH}")
|