Просмотр исходного кода

feat: 更新配置和代码结构,添加 CORS 支持,优化环境变量和模块导入

JJSun 3 месяцев назад
Родитель
Сommit
93642177dc

+ 57 - 26
Co-creation-projects/JJason-DeepCastAgent/README.md

@@ -30,32 +30,63 @@ DeepCast 旨在解决现代人在海量碎片化信息中难以获取深度知
 
 ```
 .
-├─ backend/                 # 后端服务(FastAPI + 研究智能体)
-│  ├─ src/                  # 业务源码
-│  │  ├─ agent.py            # 研究流程编排器
-│  │  ├─ config.py           # 配置与环境变量加载
-│  │  ├─ main.py             # FastAPI 入口
-│  │  ├─ models.py           # 数据模型
-│  │  ├─ prompts.py          # 任务/报告/脚本提示词
-│  │  ├─ utils.py            # 工具函数
-│  │  └─ services/           # 业务服务
-│  │     ├─ search.py        # 搜索与多源检索
-│  │     ├─ summarizer.py    # 任务总结
-│  │     ├─ reporter.py      # 报告生成
-│  │     ├─ script_generator.py # 播客脚本生成
-│  │     ├─ audio_generator.py  # TTS 语音生成
-│  │     └─ audio_synthesizer.py # 音频合成
-│  ├─ output/               # 输出目录
-│  │  ├─ notes/             # 任务笔记与报告沉淀
-│  │  └─ audio/             # 生成的音频文件
-│  ├─ scripts/              # 开发与验证脚本
-│  ├─ env.example           # 环境变量示例
-│  └─ pyproject.toml         # Python 项目配置
-├─ frontend/                # 前端(Vue 3 + Vite)
-│  ├─ src/                  # 前端源码
-│  └─ index.html            # 入口页面
-├─ docs/                    # 文档与设计说明
-└─ README.md                # 项目说明
+├─ backend/                        # 后端服务(FastAPI + 研究智能体)
+│  ├─ src/                         # 核心业务源码
+│  │  ├─ main.py                   #   FastAPI 入口 & SSE 流式接口
+│  │  ├─ agent.py                  #   DeepResearchAgent 核心编排器
+│  │  ├─ config.py                 #   配置中心(环境变量 / LLM / TTS)
+│  │  ├─ models.py                 #   Pydantic 数据模型(TodoItem, SummaryState 等)
+│  │  ├─ prompts.py                #   所有 Agent 的系统提示词模板
+│  │  ├─ utils.py                  #   通用工具函数
+│  │  └─ services/                 #   解耦的业务服务层
+│  │     ├─ planner.py             #     研究规划(课题拆解为 TodoItem)
+│  │     ├─ search.py              #     混合搜索(Tavily + SerpApi)
+│  │     ├─ summarizer.py          #     单任务搜索结果摘要
+│  │     ├─ reporter.py            #     综合研究报告生成
+│  │     ├─ script_generator.py    #     报告 → 双人对谈脚本
+│  │     ├─ audio_generator.py     #     TTS 逐句语音合成
+│  │     ├─ audio_synthesizer.py   #     FFmpeg 多段音频拼接
+│  │     ├─ notes.py               #     笔记持久化 & 索引管理
+│  │     ├─ text_processing.py     #     文本清洗与预处理
+│  │     └─ tool_events.py         #     工具调用事件处理
+│  ├─ scripts/                     # 开发 & 验证脚本
+│  │  ├─ verify_ecnu_llm.py        #   验证 LLM 连通性
+│  │  ├─ verify_ecnu_tts.py        #   验证 TTS 服务
+│  │  ├─ verify_ffmpeg.py          #   检查 FFmpeg 可用性
+│  │  ├─ verify_search.py          #   测试搜索 API
+│  │  ├─ test_agent_workflow.py    #   端到端工作流测试
+│  │  └─ test_audio_generator.py   #   音频生成单元测试
+│  ├─ output/                      # 运行时输出(.gitignore)
+│  │  ├─ notes/                    #   Markdown 笔记 + notes_index.json
+│  │  └─ audio/                    #   逐句 MP3 + 最终 podcast_*.mp3
+│  ├─ env.example                  # 环境变量模板
+│  ├─ pyproject.toml               # Python 项目元数据 & 依赖
+│  └─ requirements.txt             # pip 依赖清单
+├─ frontend/                       # 前端应用(Vue 3 + Vite + TypeScript)
+│  ├─ src/
+│  │  ├─ App.vue                   #   根组件(主界面)
+│  │  ├─ main.ts                   #   Vue 应用入口
+│  │  ├─ style.css                 #   全局样式(Tailwind CSS)
+│  │  └─ services/
+│  │     └─ api.ts                 #   SSE 流式通信(fetch + ReadableStream)
+│  ├─ index.html                   # HTML 入口
+│  ├─ vite.config.ts               # Vite 构建 & 代理配置
+│  ├─ tsconfig.json                # TypeScript 配置
+│  └─ package.json                 # 前端依赖 & 脚本
+├─ .github/                        # GitHub 配置
+│  └─ copilot-instructions.md      #   Copilot 编码指引
+└─ README.md                       # 本文件
+```
+
+### 数据流转路径
+
+```
+用户输入主题
+  → PlanningService(smart_llm)→ TodoItem[] 任务列表
+  → [并行工作线程] SearchTool → SummarizationService(fast_llm)
+  → ReportingService(smart_llm)→ report.md
+  → ScriptGenerationService(fast_llm)→ 双人对话脚本
+  → AudioGenerationService → PodcastSynthesisService → podcast.mp3
 ```
 
 ## 🚀 快速开始

+ 6 - 2
Co-creation-projects/JJason-DeepCastAgent/backend/env.example

@@ -10,16 +10,20 @@ LLM_MODEL_ID=ecnu-max
 SMART_LLM_MODEL=ecnu-reasoner
 FAST_LLM_MODEL=ecnu-max
 LLM_API_KEY=your_ecnu_api_key_here
-LLM_BASE_URL=your_openai_api_key_here
+LLM_BASE_URL=your_llm_base_url_here
 LLM_TIMEOUT=60
 
 # TTS 配置 (复用 ECNU API Key)
 TTS_API_KEY=your_ecnu_api_key_here
-TTS_BASE_URL=your_openai_api_key_here
+TTS_BASE_URL=your_tts_base_url_here
 TTS_MODEL=ecnu-tts
 AUDIO_OUTPUT_DIR=output/audio
 NOTES_WORKSPACE=output/notes
 
+# 搜索 API 配置 (至少配置一项,使用 hybrid 模式需两项都配置)
+TAVILY_API_KEY=your_tavily_api_key_here
+SERPAPI_API_KEY=your_serpapi_api_key_here
+
 # FFmpeg 配置 (Windows 环境通常需要指定路径)
 FFMPEG_PATH=C:\ffmpeg\bin\ffmpeg.exe
 

+ 1 - 2
Co-creation-projects/JJason-DeepCastAgent/backend/src/__init__.py

@@ -4,14 +4,13 @@
 
     from .agent import DeepResearchAgent
     from .config import Configuration, SearchAPI
-    from .models import SummaryState, SummaryStateInput, SummaryStateOutput, TodoItem
+    from .models import SummaryState, SummaryStateOutput, TodoItem
 
     __all__ = [
         "DeepResearchAgent",
         "Configuration",
         "SearchAPI",
         "SummaryState",
-        "SummaryStateInput",
         "SummaryStateOutput",
         "TodoItem",
     ]

+ 5 - 0
Co-creation-projects/JJason-DeepCastAgent/backend/src/config.py

@@ -126,6 +126,11 @@ class Configuration(BaseModel):
         title="SerpApi 密钥",
         description="SerpApi 的 API 密钥",
     )
+    cors_origins: str = Field(
+        default="http://localhost:5173,http://localhost:3000",
+        title="CORS 允许的源",
+        description="逗号分隔的允许跨域请求的源列表",
+    )
 
     @field_validator("notes_workspace", "audio_output_dir")
     @classmethod

+ 8 - 1
Co-creation-projects/JJason-DeepCastAgent/backend/src/main.py

@@ -78,9 +78,16 @@ def create_app() -> FastAPI:
     # 当前活跃的研究 agent 引用,用于支持取消操作
     _active_agent: dict[str, DeepResearchAgent | None] = {"current": None}
 
+    # 从配置读取 CORS 允许的源,避免生产环境使用通配符
+    _startup_config = Configuration.from_env()
+    _allowed_origins = [
+        origin.strip()
+        for origin in _startup_config.cors_origins.split(",")
+        if origin.strip()
+    ]
     app.add_middleware(
         CORSMiddleware,
-        allow_origins=["*"],
+        allow_origins=_allowed_origins,
         allow_credentials=True,
         allow_methods=["*"],
         allow_headers=["*"],