Redgent 是一款基于 Generative UI 的定时任务管理工具,通过对话界面管理定时任务,支持 Reddit 数据抓取和 AI 分析
核心功能 · 技术栈 · 系统架构 · 快速开始 · Docker 部署
- 自然语言交互: 通过对话式 AI Agent 创建和管理任务
- Generative UI: 充分使用生成式用户界面,动态生成交互组件
- UI-AI认知 同步: 通过数据同步机制确保用户界面与 AI 认知一致
- 多种调度模式: 支持 Cron 表达式和 Interval 两种调度方式
- 校准功能: 智能校准 Interval 任务执行间隔
- 数据源支持: 当前支持 Reddit 数据源
- Reddit 趋势追踪: 自动监控热门帖子和讨论内容
- AI 简洁分析: 使用大语言模型对抓取数据进行简短而高效的分析
- 自动化报告: 将分析结果整理成清晰的报告,便于快速查阅
- 响应式设计: 支持桌面端和移动端自适应布局
- 实时状态显示: 通过 SSE 推送任务实时执行进度
- NestJS - 企业级 Node.js 框架
- tRPC - 端到端类型安全的 API
- AI SDK - 统一的 AI 模型接口
- Prisma - 现代化 ORM 和数据库工具
- PostgreSQL - 可靠的关系型数据库
- cache-manager - 统一缓存管理
- React 19 - 现代化前端框架
- TanStack Router - 类型安全的路由管理
- TanStack Query - 强大的数据获取和缓存
- shadcn/ui - 高质量 React 组件库
- Tailwind CSS v4 - 原子化 CSS 框架
下面的序列图展示了典型的用户工作流:
%% Redgent 核心任务流程
sequenceDiagram
participant U as 用户
participant AI as Agent
participant DB as 数据库
participant SCH as 定时任务
participant WF as 分析工作流
%% 1. 创建任务
U->>AI: 「生成一个每天6点获取LLM相关信息的定时任务,提取出LLM相关的前沿趋势」
AI->>DB: 保存 TaskConfig
AI-->>U: ✅ 任务已创建
%% 2. 定时执行
loop 每天6点
SCH->>DB: 读取 TaskConfig
SCH->>WF: 抓取信息+分析
WF->>DB: 保存分析结果
end
%% 3. 查看结果
U->>DB: 查询任务结果
DB-->>U: 返回分析报告
%% 4. 修改任务
U->>AI: 「把执行频率改成每天一次」
AI->>DB: 更新调度配置
AI-->>U: ✅ 任务已更新
将用户的自然语言指令转化为可执行的任务配置:
sequenceDiagram
participant U as 用户
participant Agent as Agent
participant DB as 数据库
U->>Agent: 「帮我监控关于前端开发的 Reddit 帖子,每三个小时一次」
Agent->>Agent: 解析用户指令,生成任务配置 (计划添加数据源架构)
Agent->>DB: 保存 TaskConfig
Agent-->>U: ✅ 任务已创建
sequenceDiagram
participant SCH as 调度系统
participant DB as 数据库
participant DS as 数据源适配器(计划中/未实现)
participant Reddit as Reddit API
participant AI as AI分析引擎
SCH->>DB: 读取 Task 配置
DB-->>SCH: 返回 payload 数据源配置
SCH->>DS: 根据 payload.dataSource 选择适配器
DS->>Reddit: 基于 keywords/subreddits 抓取内容
Reddit-->>DS: 返回原始数据
DS->>DS: 内容过滤与去重
DS->>AI: 发送处理后的数据
AI-->>DS: 返回分析结果
DS->>DB: 保存 TaskReport
通过数据同步机制,确保用户界面与 AI 状态一致。当 AI 生成 Tool UI 组件时,用户看到的数据始终与 AI 的认知保持一致
sequenceDiagram
participant User as 用户
participant ToolUI as Tool UI组件
participant AI as AI Agent
%% AI 生成 Tool UI
AI->>ToolUI: 生成并渲染 Tool UI 组件
ToolUI->>ToolUI: 获取并显示数据
%% 关键:实时同步机制,维护 part 的 output
Note over ToolUI,AI: 🔄 核心同步机制
ToolUI->>AI: addToolResult 同步最新数据到 part.output
%% 用户交互触发更新
User->>ToolUI: 用户操作(点击、翻页、更新等)
ToolUI->>ToolUI: 数据状态更新
ToolUI->>AI: addToolResult 再次同步新数据
Note over User,AI: ✅ 所见即 AI 所见:界面数据 = AI 认知数据
本项目是一个基于 pnpm 工作区的 Monorepo 项目,并使用 Turborepo 进行任务编排。项目采用模块化架构,将不同功能分离到独立的包中,便于维护和扩展。
/
├── apps/
│ ├── core/ # NestJS 后端服务
│ └── web/ # React 前端应用
├── packages/
│ ├── database/ # Prisma 数据库客户端和模型
│ ├── shared/ # 共享的类型定义和工具函数
│ └── ui/ # 共享 UI 组件库
├── tooling/ # 工程化配置
│ ├── eslint-config/ # ESLint 共享配置
│ ├── prettier-config/ # Prettier 共享配置
│ ├── typescript-config/ # TypeScript 共享配置
│ └── tsup-config/ # tsup 构建配置
└── package.json
详细文档: apps/core/README.md
详细文档: apps/web/README.md
- Node.js >= 18
- pnpm >= 9.0.0
- PostgreSQL 数据库
- DeepSeek API Key (用于 AI 功能)
- Reddit API 凭证
-
数据库准备
方式一:使用本地 Docker 数据库
使用脚本快速启动本地 PostgreSQL 数据库:
# 启动本地 PostgreSQL 容器 ./start-database.sh该脚本会:
- 自动从
.env文件读取数据库配置 - 检查 Docker/Podman 是否安装和运行
- 创建并启动 PostgreSQL 容器
- 如果使用默认密码,会提示生成随机密码
Windows 用户请注意:
- 需要先安装 WSL (Windows Subsystem for Linux)
- 安装 Docker Desktop
- 在 WSL 环境中运行脚本
方式二:使用云数据库或自建数据库
直接在
.env文件中配置你的 PostgreSQL 连接字符串。 - 自动从
-
克隆项目
git clone https://github.com/JinJieBeWater/redgent.git cd redgent -
安装依赖
pnpm install
-
环境配置
# 复制环境变量模板 cp .env.example .env # 编辑 .env 文件,填入必要的配置: # - REDDIT_CLIENT_ID: Reddit API 客户端 ID # - REDDIT_SECRET: Reddit API 密钥 # - DEEPSEEK_API_KEY: DeepSeek AI API 密钥 # - DATABASE_URL: PostgreSQL 连接字符串 # - DIRECT_URL: PostgreSQL 连接字符串 # - PROXY_URL: (可选) 代理配置
-
完成数据库设置
# 运行数据库迁移 pnpm turbo run db:migrate # 生成 Prisma 客户端 pnpm turbo run db:generate
-
启动开发服务
# 同时启动前后端开发服务器 pnpm dev访问地址:
- 前端:http://localhost:3000
- 后端 API:http://localhost:3001
# 运行所有测试
pnpm test
# 运行集成测试
pnpm test:integration
# 运行 E2E 测试
pnpm test:e2e
# 测试覆盖率
pnpm test:cov# 代码检查和格式化
pnpm lint # ESLint 检查
pnpm format # Prettier 格式化
# 由于 web 依赖 core 的类型构建,所以必须确保 core 的 dist 存在
pnpm typecheck # TypeScript 类型检查
# 构建项目
pnpm build # 构建所有包-
准备环境文件
# 复制并配置环境变量 cp .env.example .env.production.local # 编辑 .env.production.local 填入生产环境配置
-
时区设置
默认时区为
Asia/Shanghai,如果需要更改,请修改docker-compose.yml中的TZ变量services: core: # ... environment: TZ: 'Asia/Shanghai' # ...
-
启动服务
# 构建并启动所有服务 docker-compose up -d --build服务访问地址:
- 前端:http://localhost:3000
- 后端 API:http://localhost:3001
-
查看服务状态
# 查看运行状态 docker-compose ps
- 数据库: 确保 PostgreSQL 服务可访问且已创建对应数据库
- 任务频率限制: Reddit API 有频率限制,且任务会对数据做缓存防止重复分析,过滤频繁的任务会导致数据全部命中缓存取消任务,请合理设置任务间隔
- 代理配置: 如果在网络受限环境,需要正确配置
PROXY_URL - 端口冲突: 确保 3000 和 3001 端口未被占用
- 时区问题: 在 Docker 环境下,确保正确设置时区
TZ环境变量