api.py 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. """FastAPI 静态服务:托管单页前端 + 媒体/抽帧落盘目录。
  2. 启动:
  3. CK_ENV_FILE=/path/.env uvicorn creation_knowledge.api:app --host 0.0.0.0 --port 8123
  4. 前端单页在 /,媒体在 /data,视频帧在 /frames。
  5. """
  6. from __future__ import annotations
  7. import os
  8. from functools import lru_cache
  9. from pathlib import Path
  10. from fastapi import FastAPI
  11. from fastapi.middleware.cors import CORSMiddleware
  12. from fastapi.staticfiles import StaticFiles
  13. from creation_knowledge.config import Settings
  14. _ROOT = Path(__file__).resolve().parent.parent
  15. WEB_DIR = _ROOT / "web"
  16. SKILL_EX_DIR = _ROOT / "创作知识提取-skill" / "extraction" # ②③ 提示词真源
  17. READ_PROMPT_DIR = _ROOT / "prompts" # ① 读懂提示词真源
  18. def _env_file() -> str:
  19. return os.getenv("CK_ENV_FILE", ".env")
  20. @lru_cache(maxsize=1)
  21. def _settings() -> Settings:
  22. return Settings.from_env(_env_file())
  23. app = FastAPI(title="创作知识")
  24. app.add_middleware(
  25. CORSMiddleware, allow_origins=["*"], allow_methods=["*"], allow_headers=["*"]
  26. )
  27. # 视频帧静态服务(card.url = /frames/<post_id>/<file>)
  28. _frames_dir = Path(_settings().frames_dir)
  29. _frames_dir.mkdir(parents=True, exist_ok=True)
  30. app.mount("/frames", StaticFiles(directory=str(_frames_dir)), name="frames")
  31. # 媒体静态服务(card.url = /data/<run_id>/<platform>/<post_id>/<file>)
  32. _data_dir = Path(_settings().data_dir or "data")
  33. _data_dir.mkdir(parents=True, exist_ok=True)
  34. app.mount("/data", StaticFiles(directory=str(_data_dir)), name="data")
  35. # 提示词真源(前端「看提示词」直接 fetch,不再写死副本,避免漂移)
  36. if SKILL_EX_DIR.exists():
  37. app.mount("/prompt-skill", StaticFiles(directory=str(SKILL_EX_DIR)), name="prompt-skill")
  38. if READ_PROMPT_DIR.exists():
  39. app.mount("/prompt-read", StaticFiles(directory=str(READ_PROMPT_DIR)), name="prompt-read")
  40. # 单页前端挂在最后(catch-all),不影响 /frames、/data、/prompt-*
  41. if WEB_DIR.exists():
  42. app.mount("/", StaticFiles(directory=str(WEB_DIR), html=True), name="web")