# battle **Repository Path**: yangjiayi/battle ## Basic Information - **Project Name**: battle - **Description**: AI Agent辩论平台 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-02-04 - **Last Updated**: 2026-02-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # AI Agent辩论平台 MVP 基于 [PRD](docs/PRD-辩论平台-MVP.md) 的网页端 AI AI Agent辩论平台:用户发起辩题后,3 个 AI 智能体在群聊式界面中轮流发言,用户可观看、终止辩论并生成总结。 ## 技术栈 - **前端**:React 18 + TypeScript + Vite;轮询拉取辩论状态与消息 - **后端**:Node.js + Express + TypeScript;内存存储当前一场辩论,串行编排 A→B→C 调用 AI - **AI**:OpenAI 兼容接口(`https://new-api.acg.team/v1/chat/completions`),模型 `deepseek-v3.1` ## 环境变量 **后端**(`backend/` 目录下或根目录通过 `npm run dev:backend` 时的环境): | 变量 | 说明 | |------|------| | `PORT` | 后端端口,默认 `3001` | | `ACG_API_KEY` 或 `OPENAI_API_KEY` | AI API 密钥,**勿写入代码或提交仓库** | 复制 `backend/.env.example` 为 `backend/.env` 并填写密钥后再启动后端。 **前端**(可选): | 变量 | 说明 | |------|------| | `VITE_API_BASE_URL` | 后端 API 根地址。开发时未设置则通过 Vite 代理将 `/api` 转发到 `http://localhost:3001` | ## 本地运行 1. **安装依赖** ```bash cd backend && npm install && cd .. cd frontend && npm install && cd .. ``` 2. **配置后端环境变量** ```bash cp backend/.env.example backend/.env # 编辑 backend/.env,填入 ACG_API_KEY 或 OPENAI_API_KEY ``` 3. **启动后端**(终端一) ```bash npm run dev:backend # 或:cd backend && npm run dev ``` 4. **启动前端**(终端二) ```bash npm run dev:frontend # 或:cd frontend && npm run dev ``` 5. 浏览器访问前端给出的地址(通常 `http://localhost:5173`)。辩题与轮数在首页输入,点击「开始辩论」后进入对话区,可终止辩论、生成总结、再开一局。 ## 项目结构 ``` battle/ ├── docs/ │ └── PRD-辩论平台-MVP.md ├── backend/ # Node + Express │ ├── src/ │ │ ├── index.ts # 入口与路由挂载 │ │ ├── types.ts # 类型定义 │ │ ├── store.ts # 内存当前场次 │ │ ├── ai.ts # AI 调用与 PRD 提示词 │ │ ├── orchestrator.ts # 辩论编排循环 │ │ └── routes/ │ │ └── debate.ts # /api/debate 接口 │ ├── .env.example │ └── package.json ├── frontend/ # React + Vite │ ├── src/ │ │ ├── App.tsx │ │ ├── api.ts # 请求封装 │ │ ├── types.ts │ │ └── components/ │ │ ├── DebatePage.tsx │ │ ├── TopicForm.tsx │ │ ├── ConversationPanel.tsx │ │ ├── MessageList.tsx │ │ ├── MessageItem.tsx │ │ ├── StatusBar.tsx │ │ └── ControlButtons.tsx │ └── package.json ├── package.json └── README.md ``` ## API 概览 | 方法 | 路径 | 说明 | |------|------|------| | POST | `/api/debate/start` | 请求体 `{ topic, totalRounds? }`,校验后创建/覆盖当前场次并异步开始辩论 | | GET | `/api/debate` | 返回当前场次(id、topic、totalRounds、status、messages、errorMessage),前端轮询用 | | POST | `/api/debate/terminate` | 将当前场次状态置为已结束,停止后续 AI 调用 | | POST | `/api/debate/summary` | 仅当辩论已结束时,根据本场消息生成并返回总结 | ## 部署说明 - **一键打包**:在项目根目录执行 `npm run build:deploy`,会构建前端、将产物复制到 `backend/public`、再构建后端。生产环境由后端同一进程托管前端静态资源。 - **运行**:在目标环境设置 `NODE_ENV=production`、`PORT`、`ACG_API_KEY` 或 `OPENAI_API_KEY`,执行 `node backend/dist/index.js` 或使用 PM2 等进程管理器。 - **阿里云 ECS**:详见 [docs/部署-阿里云ECS.md](docs/部署-阿里云ECS.md),包含打包、上传、PM2、Nginx 反代与 HTTPS 配置。 MVP 仅保留当前一场辩论,新开即覆盖;无用户登录与多房间。