From 91d11abe90b1b1af01d3a0db85ea4e03f61c1949 Mon Sep 17 00:00:00 2001 From: "shen893514322@126.com" Date: Thu, 19 Mar 2026 19:31:12 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AF=BB=E5=8F=96=E6=9C=AC=E5=9C=B0chatandrole?= =?UTF-8?q?=E5=88=9D=E6=AD=A5=E6=88=90=E5=8A=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/api/route.py | 26 ++++++------- backend/core/config.py | 9 +++-- backend/main.py | 2 +- backend/tools/get_all_role_and_chat.py | 2 +- backend/tools/save_input_to_json.py | 2 +- docker-compose.yml | 18 +++------ .../src/components/ToolBar/ToolBar.jsx | 38 ++++++++++++------- frontend-react/vite.config.js | 14 +++++++ main.py | 8 ++-- 9 files changed, 69 insertions(+), 50 deletions(-) create mode 100644 frontend-react/vite.config.js diff --git a/backend/api/route.py b/backend/api/route.py index 6a553a3..331b6c0 100644 --- a/backend/api/route.py +++ b/backend/api/route.py @@ -1,18 +1,18 @@ -from fastapi import FastAPI -# 假设这些函数已经在其他地方定义 -from backend.core.items import ChatRequest -from backend.tools.get_all_role_and_chat import get_all_role_and_chat as get_chat_file +from fastapi import APIRouter +from ..core.items import ChatRequest +from ..tools.get_all_role_and_chat import get_all_role_and_chat +from ..tools.save_input_to_json import save_input_to_json -app = FastAPI() +router = APIRouter() # 1. 将输入内容持久化存储到本地jsonl方便前端读 -@app.post("/generate_reply") -async def save_input_to_json(chat_request: ChatRequest): - return 0 +@router.post("/generate_reply") +async def save_chat_to_json(chat_request: ChatRequest): + # 调用实际的保存函数 + return await save_input_to_json(chat_request) # 2. 从本地jsonl中读取历史对话 -@app.get("/api/get_all_role_and_chat") -def get_all_role_and_chat(): - # 直接调用导入的函数 - result = get_chat_file() - return result \ No newline at end of file +@router.get("/tool_bar/get_all_role_and_chat") +def get_all_role_and_chat_endpoint(): + # 正确调用函数并返回结果 + return get_all_role_and_chat() diff --git a/backend/core/config.py b/backend/core/config.py index 53a4e1e..4ea344c 100644 --- a/backend/core/config.py +++ b/backend/core/config.py @@ -7,8 +7,7 @@ from dotenv import load_dotenv # __file__ 指向本文件的绝对路径 # .parent 指向 backend/ 目录 # .parent.parent 指向项目根目录 (即包含 backend/ 和 frontend/ 的目录) -PROJECT_ROOT = Path(__file__).resolve().parent.parent.parent.parent # 修改这里,添加一个 .parent - +PROJECT_ROOT = Path(__file__).resolve().parent.parent.parent # 2. 加载 .env 文件 # 假设 .env 文件位于项目根目录下 load_dotenv(PROJECT_ROOT / ".env") @@ -41,7 +40,9 @@ class Settings: settings = Settings() if __name__ == '__main__': - # 实例化配置对象 settings = Settings() - print(settings.BASE_PATH) + print(f"项目根目录: {settings.BASE_PATH}") + print(f"数据目录: {settings.DATA_PATH}") + print(f"聊天目录: {settings.DATA_PATH / 'chat'}") + diff --git a/backend/main.py b/backend/main.py index 61a8314..884966c 100644 --- a/backend/main.py +++ b/backend/main.py @@ -1,6 +1,6 @@ # backend/app/main.py from fastapi import FastAPI -from .api.routes import router +from .api.route import router app = FastAPI(title="LLM Workflow Engine") diff --git a/backend/tools/get_all_role_and_chat.py b/backend/tools/get_all_role_and_chat.py index 722046d..48aec80 100644 --- a/backend/tools/get_all_role_and_chat.py +++ b/backend/tools/get_all_role_and_chat.py @@ -43,4 +43,4 @@ def get_all_role_and_chat() -> Dict[str, List[str]]: print(f"处理文件夹 {entry.name} 时出错: {str(e)}") continue - return result + return result \ No newline at end of file diff --git a/backend/tools/save_input_to_json.py b/backend/tools/save_input_to_json.py index 8f01dac..f1a43ae 100644 --- a/backend/tools/save_input_to_json.py +++ b/backend/tools/save_input_to_json.py @@ -2,7 +2,7 @@ import json from datetime import datetime from backend.core import config as cfg from pathlib import Path - +from ..core.items import ChatRequest # 假设 ChatRequest 定义在这里或者从其他地方导入 # from backend.app.core.items import ChatRequest diff --git a/docker-compose.yml b/docker-compose.yml index 9c51667..8106adf 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -3,14 +3,12 @@ version: '3.8' services: backend: build: ./backend - # 启动命令:明确指定 backend.api.route,并开启热重载 - command: uvicorn backend.api.route:app --host 0.0.0.0 --port 8000 --reload + command: uvicorn backend.main:app --host 0.0.0.0 --port 8000 --reload ports: - "3001:8000" volumes: - # 挂载后端源码,实现代码热更新 - ./backend:/app/backend - - ./data:/data + - ./data:/app/data - ./outputs:/outputs environment: - PYTHONUNBUFFERED=1 @@ -23,17 +21,13 @@ services: ports: - "3000:5173" volumes: - # 挂载前端源码,实现代码热更新 - ./frontend-react:/app - # 匿名卷:防止宿主机的 node_modules 覆盖容器内的模块 - # (这是前端 Docker 开发的最佳实践,防止因系统差异导致依赖不兼容) - /app/node_modules environment: - # 告诉前端后端地址 - # 注意:这里使用 localhost 是因为它们都映射到了宿主机 - # 在容器内部通信时,前端通过 Vite 代理转发到 http://backend:8000 - - VITE_BACKEND_URL=http://localhost:3001 - # 修改 command:先安装依赖(确保vite存在),再启动开发服务器(保留热更新) + # 如果不需要特定环境变量,可以完全移除 environment 部分 + # 或者添加有效的环境变量,例如: + - NODE_ENV=development + - VITE_BACKEND_URL=http://backend:8000 command: sh -c "npm install && npm run dev -- --host 0.0.0.0" depends_on: - backend diff --git a/frontend-react/src/components/ToolBar/ToolBar.jsx b/frontend-react/src/components/ToolBar/ToolBar.jsx index 558a6b0..0479b15 100644 --- a/frontend-react/src/components/ToolBar/ToolBar.jsx +++ b/frontend-react/src/components/ToolBar/ToolBar.jsx @@ -13,19 +13,31 @@ const Toolbar = ({ const [roleData, setRoleData] = useState({}); // 获取角色和聊天数据 - React.useEffect(() => { - const fetchRoleData = async () => { - try { - const response = await fetch('/api/get_all_role_and_chat'); - const data = await response.json(); - setRoleData(data); - } catch (error) { - console.error('获取角色数据失败:', error); +const fetchRoleData = async () => { + console.log('开始获取角色数据...'); + try { + const response = await fetch('/api/tool_bar/get_all_role_and_chat', { + method: 'GET', + headers: { + 'Cache-Control': 'no-cache', + 'Pragma': 'no-cache', + 'Expires': '0' } - }; + }); + console.log('响应状态:', response.status); + const data = await response.json(); + console.log('获取到的数据:', data); + setRoleData(data); + } catch (error) { + console.error('获取角色数据失败:', error); + } +}; - fetchRoleData(); - }, []); + // 处理下拉框展开/收起 + const handleDropdownToggle = async () => { + await fetchRoleData(); + setIsDropdownOpen(!isDropdownOpen); + }; // 处理角色选择 const handleRoleSelect = (role) => { @@ -61,7 +73,7 @@ const Toolbar = ({
setIsDropdownOpen(!isDropdownOpen)} + onClick={handleDropdownToggle} > {selectedRole || '选择角色'} @@ -104,4 +116,4 @@ const Toolbar = ({ ); }; -export default Toolbar; \ No newline at end of file +export default Toolbar; diff --git a/frontend-react/vite.config.js b/frontend-react/vite.config.js new file mode 100644 index 0000000..e591715 --- /dev/null +++ b/frontend-react/vite.config.js @@ -0,0 +1,14 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +export default defineConfig({ + plugins: [react()], + server: { + proxy: { + '/api': { + target: 'http://backend:8000', + changeOrigin: true, + } + } + } +}) diff --git a/main.py b/main.py index 6d7c6d9..6d2d3bd 100644 --- a/main.py +++ b/main.py @@ -1,13 +1,11 @@ from fastapi import FastAPI +from backend.api.route import router app = FastAPI() +# 注册API路由 +app.include_router(router, prefix="/api") @app.get("/") async def root(): return {"message": "Hello World"} - - -@app.get("/hello/{name}") -async def say_hello(name: str): - return {"message": f"Hello {name}"}