tech_architecture.md
43.9 KB
LemonV 技术架构体系
文档版本: v1.0 创建日期: 2026-03-26 维护者: CTO (lemonv:cto) 状态: 初版设计
1. 概述
1.1 业务背景
LemonV 是一家专注于 AI 互动剧的内容生产公司,核心业务模式:
- 热点追踪: 实时监控全网热点(抖音/微博/小红书/快手等)
- 剧本创作: AI 自动生成互动短剧剧本
- 内容生产: 多模态内容生成(文本/音频/视频)
1.2 架构设计原则
| 原则 | 说明 |
|---|---|
| 数据驱动 | 所有内容生产决策基于数据 |
| AI Native | 架构为 AI 工作流设计,非传统系统叠加 AI |
| 水平扩展 | 热点爆发时可快速扩容爬虫和内容生成 |
| 成本敏感 | 优先使用托管服务,降低运维成本 |
| 快速迭代 | 支持 A/B 测试和灰度发布 |
2. 系统架构设计
2.1 整体架构图
┌─────────────────────────────────────────────────────────────────────────────────┐
│ 前端层 │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ 数据大屏 │ │ 剧本管理 │ │ 热点监控 │ │ 系统管理 │ │
│ │ (Dashboard) │ │ (Scripts) │ │ (Trends) │ │ (Admin) │ │
│ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ │
│ │ │ │ │ │
└─────────┼──────────────────┼──────────────────┼──────────────────┼──────────────┘
│ │ │ │
└──────────────────┼──────────────────┼──────────────────┘
│ │
┌────────▼────────┐ ┌─────▼──────┐
│ API Gateway │ │ WebSocket │
│ (Nginx) │ │ Gateway │
└────────┬────────┘ └──────┬─────┘
│ │
┌────────────────────────────┼──────────────────┼──────────────────────────────────┐
│ │ 服务层 (Node.js) │
│ ┌─────────────────────────▼──────────────────▼─────────────────────────────┐ │
│ │ Express 主服务 │ │
│ │ ┌────────────┐ ┌────────────┐ ┌────────────┐ ┌────────────┐ │ │
│ │ │ Agent API │ │ Skill API │ │ Job API │ │ Auth API │ │ │
│ │ └────────────┘ └────────────┘ └────────────┘ └────────────┘ │ │
│ └──────────────────────────────────────────────────────────────────────────┘ │
│ │
│ ┌──────────────────────────────────────────────────────────────────────────┐ │
│ │ 核心引擎 (Core Engine) │ │
│ │ ┌────────────┐ ┌────────────┐ ┌────────────┐ ┌────────────┐ │ │
│ │ │Orchestrator│ │Master Sess │ │Agent Mgr │ │Plugin Mgr │ │ │
│ │ └────────────┘ └────────────┘ └────────────┘ └────────────┘ │ │
│ └──────────────────────────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────────────────────────┘
│
┌─────────────────────────────────────┼────────────────────────────────────────────┐
│ │ AI 流水线层 (AI Pipeline) │
│ ┌──────────────────────────────────▼────────────────────────────────────────┐ │
│ │ 任务调度器 (Job Manager) │ │
│ │ (优先级队列 + 重试机制 + 进度追踪) │ │
│ └──────────────────────────────────┬────────────────────────────────────────┘ │
│ │ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ 爬虫引擎 │ │ 剧本生成 │ │ 内容渲染 │ │ 质量评估 │ │
│ │ (Crawler) │ │ (Script AI) │ │ (Renderer) │ │ (QA Judge) │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ └──────────────┘ │
│ │
│ ┌──────────────────────────────────────────────────────────────────────────┐ │
│ │ Agent 集群 (Multi-Agent) │ │
│ │ ┌────────────┐ ┌────────────┐ ┌────────────┐ ┌────────────┐ │ │
│ │ │Trend Hunter│ │Scriptwriter│ │ Director │ │ Publisher │ │ │
│ │ └────────────┘ └────────────┘ └────────────┘ └────────────┘ │ │
│ └──────────────────────────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────────────────────────┘
│
┌─────────────────────────────────────┼────────────────────────────────────────────┐
│ │ 数据层 (Data Layer) │
│ ┌──────────────────────────────────▼────────────────────────────────────────┐ │
│ │ 消息队列 (Redis) │ │
│ │ (任务队列 / 实时通知 / 热点缓存 / Session 状态) │ │
│ └───────────────────────────────────────────────────────────────────────────┘ │
│ │
│ ┌──────────────────────────────────────────────────────────────────────────┐ │
│ │ 主数据库 (SQLite) │ │
│ │ ┌────────────┐ ┌────────────┐ ┌────────────┐ ┌────────────┐ │ │
│ │ │ Skills │ │ Agents │ │ Jobs │ │ Users │ │ │
│ │ └────────────┘ └────────────┘ └────────────┘ └────────────┘ │ │
│ └──────────────────────────────────────────────────────────────────────────┘ │
│ │
│ ┌──────────────────────────────────────────────────────────────────────────┐ │
│ │ 文档存储 (文件系统) │ │
│ │ ┌────────────┐ ┌────────────┐ ┌────────────┐ ┌────────────┐ │ │
│ │ │ Scripts │ │ Hotspots │ │ Assets │ │ Logs │ │ │
│ │ └────────────┘ └────────────┘ └────────────┘ └────────────┘ │ │
│ └──────────────────────────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────────────────────────┘
2.2 模块职责说明
| 层级 | 模块 | 职责 |
|---|---|---|
| 前端层 | Dashboard | 实时数据可视化、系统状态监控 |
| Scripts | 剧本管理、编辑、版本控制 | |
| Trends | 热点监控面板、趋势分析 | |
| Admin | 用户/Agent/系统配置管理 | |
| 服务层 | API Gateway | 统一入口、限流、认证、路由 |
| Core Engine | Agent 调度、任务编排、状态管理 | |
| AI 流水线 | Job Manager | 任务队列管理、优先级调度、失败重试 |
| Crawler | 多平台热点爬取、数据清洗 | |
| Script AI | 剧本生成、情节设计、对话优化 | |
| Renderer | 内容渲染(文本/音频/视频) | |
| QA Judge | 内容质量评估、多维度打分 | |
| 数据层 | Redis | 高速缓存、消息队列、状态同步 |
| SQLite | 结构化数据持久化(已支持 FTS5 全文搜索) | |
| 文件系统 | 大文本存储(剧本/热点原始数据) |
3. 技术选型报告
3.1 后端技术栈
| 技术 | 选型 | 理由 |
|---|---|---|
| 运行时 | Node.js 20+ | 团队熟悉、非阻塞 I/O 适合高并发爬虫 |
| 框架 | Express.js | 成熟稳定、生态丰富、易于扩展 |
| 数据库 | SQLite + better-sqlite3 | 无需运维、支持 FTS5 全文搜索、适合中小规模 |
| 缓存 | Redis | 热点缓存、任务队列、实时状态同步 |
| 消息队列 | Bull (Redis-based) | 可靠的作业队列、支持延迟任务、进度追踪 |
| WebSocket | ws | 轻量级、与 Express 集成简单 |
| 认证 | JWT + bcrypt | 无状态、适合微服务架构 |
3.2 前端技术栈
| 技术 | 选型 | 理由 |
|---|---|---|
| 框架 | Vue 3 + Composition API | 响应式、TypeScript 支持好、团队熟悉 |
| 构建 | Vite | 快速冷启动、HMR 极速、配置简单 |
| 路由 | vue-router 4 | 官方支持、导航守卫完善 |
| 状态 | Pinia | Vue 官方推荐、TypeScript 友好 |
| 国际化 | vue-i18n | 支持 6 语言(中/英/日/韩/西/俄) |
| UI 库 | Element Plus | 组件丰富、主题可定制 |
| 图表 | ECharts | 数据可视化丰富、交互性好 |
3.3 AI/ML 技术栈
| 技术 | 选型 | 理由 |
|---|---|---|
| LLM | Claude API | 创作能力强、长上下文支持、稳定性高 |
| CLI 工具 | Claude Code | Agent 自动化开发、代码生成 |
| 数据解析 | cheerio + puppeteer | 静态/动态页面爬取 |
| 文本处理 | natural.js | 中文分词、情感分析 |
3.4 运维/DevOps
| 技术 | 选型 | 理由 |
|---|---|---|
| 容器 | Docker | 环境一致性、快速部署 |
| 编排 | Docker Compose | 适合单机/小规模部署 |
| 监控 | 自建 + 日志 | 轻量级、成本可控 |
| CI/CD | GitHub Actions | 免费额度足够、与仓库集成 |
3.5 技术选型对比
数据库选型(为什么选择 SQLite)
| 方案 | 优点 | 缺点 | 结论 |
|---|---|---|---|
| SQLite | 零运维、FTS5全文搜索、单文件迁移 | 并发写入有限 | ✅ 选用 |
| PostgreSQL | 功能强大、高并发 | 需运维、资源占用高 | 过度设计 |
| MongoDB | 文档灵活、水平扩展 | 运维复杂、一致性弱 | 非必要 |
决策理由:
- 预期数据量:Skill 目录 2.7万条,热点数据日增
- SQLite FTS5 已支持全文搜索,满足需求
- 单机部署,无需分片
- 降低运维成本,专注业务开发
爬虫架构选型
| 方案 | 优点 | 缺点 | 结论 |
|---|---|---|---|
| 集中式调度 | 统一管理、易于监控 | 单点风险 | ✅ 选用(初期) |
| 分布式爬虫 | 高可用、高性能 | 复杂度高、成本高 | 后期演进 |
4. 数据库 Schema 设计
4.1 实体关系图
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ users │ │ agents │ │ skills │
├─────────────┤ ├─────────────┤ ├─────────────┤
│ id (PK) │ │ id (PK) │ │ id (PK) │
│ username │ │ agent_id │◄──────│ owner_id │
│ email │ │ company_id │─┐ │ name │
│ role │ │ type │ │ │ type │
│ created_at │ │ status │ │ │ config │
└─────────────┘ │ created_at │ │ │ created_at │
└─────────────┘ │ └─────────────┘
▲ │ ▲
│ │ │
┌──────┴────────┴──┐ ┌─────┴─────────┐
│ companies │ │ skill_versions│
├──────────────────┤ ├───────────────┤
│ id (PK) │ │ id (PK) │
│ name │ │ skill_id (FK) │
│ config │ │ version │
│ created_at │ │ content │
└──────────────────┘ │ created_at │
└───────────────┘
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ jobs │ │ hotspots │ │ scripts │
├─────────────┤ ├─────────────┤ ├─────────────┤
│ id (PK) │ │ id (PK) │ │ id (PK) │
│ agent_id │◄──────│ job_id (FK) │ │ hotspot_id │◄─┐
│ type │ │ platform │ │ title │ │
│ status │ │ title │ │ content │ │
│ priority │ │ url │ │ status │ │
│ data │ │ content │ │ created_at │ │
│ result │ │ score │ └─────────────┘ │
│ created_at │ │ crawled_at │ ▲ │
└─────────────┘ └─────────────┘ │ │
└─────────┘
4.2 表结构设计
4.2.1 用户表 (users)
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT UNIQUE NOT NULL,
email TEXT UNIQUE,
password_hash TEXT,
role TEXT DEFAULT 'user', -- admin, user, viewer
avatar_url TEXT,
github_id TEXT UNIQUE,
config JSON,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
CREATE INDEX idx_users_email ON users(email);
CREATE INDEX idx_users_github ON users(github_id);
4.2.2 公司表 (companies)
CREATE TABLE companies (
id INTEGER PRIMARY KEY AUTOINCREMENT,
company_id TEXT UNIQUE NOT NULL, -- 如: lemonv, wechatai
name TEXT NOT NULL,
description TEXT,
config JSON, -- 公司级别配置
status TEXT DEFAULT 'active', -- active, paused, archived
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
CREATE INDEX idx_companies_id ON companies(company_id);
4.2.3 Agent 表 (agents)
CREATE TABLE agents (
id INTEGER PRIMARY KEY AUTOINCREMENT,
agent_id TEXT UNIQUE NOT NULL, -- 如: lemonv:trend-hunter
company_id TEXT NOT NULL,
name TEXT NOT NULL,
emoji TEXT DEFAULT '🤖',
type TEXT NOT NULL, -- cxo, specialist, executor, meta
status TEXT DEFAULT 'training', -- training, ready, active, error
greeting TEXT,
config_path TEXT, -- agent.md 文件路径
skills TEXT, -- 逗号分隔的技能列表
metadata JSON, -- 动态配置
last_active_at DATETIME,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (company_id) REFERENCES companies(company_id)
);
CREATE INDEX idx_agents_company ON agents(company_id);
CREATE INDEX idx_agents_type ON agents(type);
CREATE INDEX idx_agents_status ON agents(status);
4.2.4 Skill 表 (skills)
CREATE TABLE skills (
id INTEGER PRIMARY KEY AUTOINCREMENT,
skill_id TEXT UNIQUE NOT NULL,
owner_id TEXT, -- 所属 agent_id
name TEXT NOT NULL,
description TEXT,
type TEXT, -- builtin, custom, marketplace
category TEXT,
tags TEXT, -- JSON 数组
config JSON, -- 技能配置
code_path TEXT, -- 代码文件路径
version INTEGER DEFAULT 1,
is_public BOOLEAN DEFAULT 0,
usage_count INTEGER DEFAULT 0,
rating REAL DEFAULT 0,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
-- FTS5 全文搜索虚拟表
CREATE VIRTUAL TABLE skills_fts USING fts5(
skill_id,
name,
description,
content=skills,
content_rowid=id
);
-- 触发器保持 FTS 索引同步
CREATE TRIGGER skills_ai AFTER INSERT ON skills BEGIN
INSERT INTO skills_fts(rowid, skill_id, name, description)
VALUES (new.id, new.skill_id, new.name, new.description);
END;
CREATE TRIGGER skills_ad AFTER DELETE ON skills BEGIN
INSERT INTO skills_fts(skills_fts, rowid, skill_id, name, description)
VALUES ('delete', old.id, old.skill_id, old.name, old.description);
END;
CREATE TRIGGER skills_au AFTER UPDATE ON skills BEGIN
INSERT INTO skills_fts(skills_fts, rowid, skill_id, name, description)
VALUES ('delete', old.id, old.skill_id, old.name, old.description);
INSERT INTO skills_fts(rowid, skill_id, name, description)
VALUES (new.id, new.skill_id, new.name, new.description);
END;
CREATE INDEX idx_skills_owner ON skills(owner_id);
CREATE INDEX idx_skills_category ON skills(category);
CREATE INDEX idx_skills_type ON skills(type);
4.2.5 任务表 (jobs)
CREATE TABLE jobs (
id INTEGER PRIMARY KEY AUTOINCREMENT,
task_id TEXT UNIQUE NOT NULL, -- 如: T-mn77t6b8
from_agent TEXT, -- 分配者
to_agent TEXT NOT NULL, -- 执行者
goal_id TEXT, -- 关联目标
node_id TEXT, -- 关联 OKR 节点
type TEXT DEFAULT 'task', -- task, cron, event
priority TEXT DEFAULT 'P1', -- P0, P1, P2
title TEXT NOT NULL,
description TEXT,
status TEXT DEFAULT 'pending', -- pending, in_progress, done, failed, blocked
data JSON, -- 任务参数
result JSON, -- 执行结果
summary TEXT, -- 完成摘要
started_at DATETIME,
completed_at DATETIME,
deadline_at DATETIME,
retry_count INTEGER DEFAULT 0,
max_retries INTEGER DEFAULT 3,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
CREATE INDEX idx_jobs_agent ON jobs(to_agent);
CREATE INDEX idx_jobs_status ON jobs(status);
CREATE INDEX idx_jobs_goal ON jobs(goal_id);
CREATE INDEX idx_jobs_priority ON jobs(priority, created_at);
CREATE INDEX idx_jobs_deadline ON jobs(deadline_at);
4.2.6 热点数据表 (hotspots)
CREATE TABLE hotspots (
id INTEGER PRIMARY KEY AUTOINCREMENT,
hotspot_id TEXT UNIQUE NOT NULL,
platform TEXT NOT NULL, -- douyin, weibo, xiaohongshu, kuaishou
category TEXT, -- 分类
title TEXT NOT NULL,
url TEXT,
content TEXT, -- 原始内容
author TEXT,
author_id TEXT,
engagement_score INTEGER, -- 互动分(点赞+评论+转发)
heat_score REAL, -- 热度分数 0-100
drama_score REAL, -- 戏剧性评分
keywords TEXT, -- JSON 关键词
related_topics TEXT, -- JSON 相关话题
crawled_at DATETIME,
processed_at DATETIME,
status TEXT DEFAULT 'new', -- new, processing, processed, ignored
raw_data JSON, -- 原始抓取数据
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
-- FTS5 全文搜索
CREATE VIRTUAL TABLE hotspots_fts USING fts5(
title,
content,
content=hotspots,
content_rowid=id
);
CREATE INDEX idx_hotspots_platform ON hotspots(platform);
CREATE INDEX idx_hotspots_heat ON hotspots(heat_score DESC);
CREATE INDEX idx_hotspots_time ON hotspots(crawled_at DESC);
CREATE INDEX idx_hotspots_status ON hotspots(status);
4.2.7 剧本表 (scripts)
CREATE TABLE scripts (
id INTEGER PRIMARY KEY AUTOINCREMENT,
script_id TEXT UNIQUE NOT NULL,
hotspot_id TEXT, -- 关联热点
title TEXT NOT NULL,
genre TEXT, -- 题材: 悬疑/甜宠/都市/玄幻
style TEXT, -- 风格标签
synopsis TEXT, -- 剧情简介
content JSON, -- 剧本内容(分幕/场景/对话)
characters JSON, -- 角色设定
choices JSON, -- 互动选项设计
estimated_duration INTEGER, -- 预计时长(分钟)
target_audience TEXT, -- 目标受众
quality_score REAL, -- 质量评分
ai_model TEXT, -- 生成模型
version INTEGER DEFAULT 1,
status TEXT DEFAULT 'draft', -- draft, reviewing, approved, published, archived
created_by TEXT, -- 创建者 agent_id
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
published_at DATETIME,
FOREIGN KEY (hotspot_id) REFERENCES hotspots(hotspot_id)
);
-- FTS5 全文搜索
CREATE VIRTUAL TABLE scripts_fts USING fts5(
title,
synopsis,
content=scripts,
content_rowid=id
);
CREATE INDEX idx_scripts_hotspot ON scripts(hotspot_id);
CREATE INDEX idx_scripts_status ON scripts(status);
CREATE INDEX idx_scripts_genre ON scripts(genre);
CREATE INDEX idx_scripts_score ON scripts(quality_score DESC);
4.2.8 内容发布表 (publishes)
CREATE TABLE publishes (
id INTEGER PRIMARY KEY AUTOINCREMENT,
publish_id TEXT UNIQUE NOT NULL,
script_id TEXT NOT NULL,
platform TEXT NOT NULL, -- 发布平台
platform_content_id TEXT, -- 平台返回的内容ID
status TEXT DEFAULT 'pending', -- pending, publishing, published, failed
schedule_at DATETIME, -- 定时发布时间
published_at DATETIME,
stats JSON, -- 发布后的统计数据
error_message TEXT,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (script_id) REFERENCES scripts(script_id)
);
CREATE INDEX idx_publishes_script ON publishes(script_id);
CREATE INDEX idx_publishes_status ON publishes(status);
CREATE INDEX idx_publishes_schedule ON publishes(schedule_at);
4.2.9 系统日志表 (system_logs)
CREATE TABLE system_logs (
id INTEGER PRIMARY KEY AUTOINCREMENT,
level TEXT NOT NULL, -- debug, info, warn, error
source TEXT, -- 来源模块
agent_id TEXT, -- 关联 agent
message TEXT NOT NULL,
metadata JSON,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
CREATE INDEX idx_logs_level ON system_logs(level);
CREATE INDEX idx_logs_source ON system_logs(source);
CREATE INDEX idx_logs_time ON system_logs(created_at DESC);
CREATE INDEX idx_logs_agent ON system_logs(agent_id);
4.3 数据库连接配置
// config/database.js
const Database = require('better-sqlite3');
const db = new Database('data/lemonv.sqlite', {
verbose: process.env.NODE_ENV === 'development' ? console.log : null
});
// 性能优化
db.pragma('journal_mode = WAL');
db.pragma('synchronous = NORMAL');
db.pragma('cache_size = 10000');
db.pragma('foreign_keys = ON');
module.exports = db;
5. API 接口规范
5.1 接口设计原则
- RESTful 风格: 资源命名,HTTP 动词表达操作
- 统一响应格式: 标准 envelope 结构
- 版本控制: URL 路径中包含版本号
/api/v1/... - 认证方式: JWT Bearer Token
- 限流: 基于 IP 和用户双重限流
5.2 统一响应格式
// 成功响应
{
"success": true,
"data": {},
"meta": {
"timestamp": "2026-03-26T08:30:00Z",
"requestId": "req_xxx"
}
}
// 错误响应
{
"success": false,
"error": {
"code": "VALIDATION_ERROR",
"message": "请求参数错误",
"details": [
{ "field": "title", "message": "标题不能为空" }
]
},
"meta": { ... }
}
// 分页响应
{
"success": true,
"data": [...],
"pagination": {
"page": 1,
"perPage": 20,
"total": 100,
"totalPages": 5
},
"meta": { ... }
}
5.3 认证接口
POST /api/auth/login
用户登录
// Request
{
"username": string,
"password": string
}
// Response
{
"success": true,
"data": {
"token": "jwt_token_string",
"refreshToken": "refresh_token_string",
"expiresIn": 86400,
"user": {
"id": "user_xxx",
"username": "john",
"role": "admin"
}
}
}
POST /api/auth/github
GitHub OAuth 登录
// Request
{
"code": "github_oauth_code"
}
// Response: 同上
5.4 Agent 管理接口
GET /api/agents
获取 Agent 列表
// Query Params
{
companyId?: string, // 按公司筛选
type?: string, // 按类型筛选
status?: string, // 按状态筛选
page?: number, // 默认 1
perPage?: number // 默认 20
}
// Response
{
"success": true,
"data": [
{
"id": "lemonv:trend-hunter",
"name": "热点分析师",
"emoji": "🔥",
"type": "executor",
"status": "ready",
"companyId": "lemonv",
"lastActiveAt": "2026-03-26T08:33:05Z"
}
],
"pagination": { ... }
}
GET /api/agents/:id
获取 Agent 详情
// Response
{
"success": true,
"data": {
"id": "lemonv:trend-hunter",
"name": "热点分析师",
"emoji": "🔥",
"type": "executor",
"status": "ready",
"companyId": "lemonv",
"greeting": "🔥 热点雷达已启动...",
"skills": ["trend_analysis", "hotspot_monitoring"],
"metadata": { ... },
"createdAt": "2026-03-24T03:49:31Z",
"lastActiveAt": "2026-03-26T08:33:05Z"
}
}
POST /api/agents/:id/tasks
向 Agent 分发任务
// Request
{
"from": "lemonv:ceo",
"task": "爬取今日抖音热点TOP50",
"priority": "P1", // P0 | P1 | P2
"goalId": "G-001",
"nodeId": "G-001.1.1",
"autoExecute": true, // 是否立即执行
"deadlineAt": "2026-03-26T18:00:00Z"
}
// Response
{
"success": true,
"data": {
"taskId": "T-mn77t6b8",
"status": "dispatched",
"dispatchedAt": "2026-03-26T08:30:00Z"
}
}
5.5 任务管理接口
GET /api/tasks
获取任务列表
// Query Params
{
agentId?: string, // 按执行者筛选
status?: string, // pending | in_progress | done | failed | blocked
priority?: string, // P0 | P1 | P2
goalId?: string, // 按目标筛选
page?: number,
perPage?: number
}
GET /api/tasks/:id
获取任务详情
// Response
{
"success": true,
"data": {
"taskId": "T-mn77t6b8",
"from": "lemonv:ceo",
"to": "lemonv:cto",
"title": "设计 LemonV 技术架构体系",
"description": "...",
"priority": "P0",
"status": "in_progress",
"goalId": "G-001",
"nodeId": "G-001.2",
"data": { ... },
"result": null,
"createdAt": "2026-03-26T08:00:00Z",
"startedAt": "2026-03-26T08:05:00Z",
"deadlineAt": "2026-03-26T18:00:00Z"
}
}
POST /api/tasks/:id/report
汇报任务完成
// Request
{
"from": "lemonv:cto",
"status": "done", // done | failed | blocked
"summary": "技术架构设计已完成,包含系统架构、技术选型、数据库Schema、API规范",
"result": {
"documentUrl": "/workspace/tech_architecture.md"
}
}
5.6 热点数据接口
GET /api/hotspots
获取热点列表
// Query Params
{
platform?: string, // douyin | weibo | xiaohongshu | kuaishou
category?: string,
minHeat?: number, // 最小热度
maxHeat?: number,
status?: string, // new | processing | processed
startDate?: string, // ISO 8601
endDate?: string,
search?: string, // 全文搜索关键词
page?: number,
perPage?: number
}
// Response
{
"success": true,
"data": [
{
"hotspotId": "hs_xxx",
"platform": "douyin",
"title": "某明星官宣",
"url": "https://...",
"heatScore": 95.5,
"dramaScore": 88.0,
"engagementScore": 1500000,
"keywords": ["明星", "官宣", "恋爱"],
"crawledAt": "2026-03-26T08:00:00Z",
"status": "processed"
}
],
"pagination": { ... }
}
GET /api/hotspots/:id
获取热点详情
// Response
{
"success": true,
"data": {
"hotspotId": "hs_xxx",
"platform": "douyin",
"category": "娱乐",
"title": "某明星官宣",
"content": "...",
"author": "娱乐账号",
"heatScore": 95.5,
"dramaScore": 88.0,
"keywords": ["明星", "官宣", "恋爱"],
"relatedTopics": ["#明星官宣", "#娱乐圈"],
"rawData": { ... },
"scripts": [
{ "scriptId": "sc_xxx", "title": "...", "status": "published" }
]
}
}
POST /api/hotspots/crawl
触发热点爬取
// Request
{
"platforms": ["douyin", "weibo"],
"limit": 50,
"priority": "P1"
}
// Response
{
"success": true,
"data": {
"jobId": "job_xxx",
"status": "queued",
"estimatedTime": "5 minutes"
}
}
5.7 剧本管理接口
GET /api/scripts
获取剧本列表
// Query Params
{
hotspotId?: string,
genre?: string, // 悬疑 | 甜宠 | 都市 | 玄幻
status?: string, // draft | reviewing | approved | published
minScore?: number,
search?: string,
page?: number,
perPage?: number
}
POST /api/scripts
创建剧本
// Request
{
"hotspotId": "hs_xxx", // 可选:关联热点
"title": "重生之我在娱乐圈",
"genre": "都市",
"synopsis": "...",
"targetAudience": "18-35岁女性",
"template": "rebirth_entertainment" // 使用模板
}
// Response
{
"success": true,
"data": {
"scriptId": "sc_xxx",
"status": "generating",
"estimatedTime": "3 minutes",
"jobId": "job_xxx"
}
}
GET /api/scripts/:id
获取剧本详情
// Response
{
"success": true,
"data": {
"scriptId": "sc_xxx",
"title": "重生之我在娱乐圈",
"genre": "都市",
"style": ["爽文", "逆袭", "甜宠"],
"synopsis": "...",
"content": {
"acts": [
{
"actNumber": 1,
"title": "重生归来",
"scenes": [
{
"sceneNumber": "1-1",
"setting": "片场",
"characters": ["女主", "反派女二"],
"dialogue": [
{ "character": "反派女二", "line": "你永远都是配角!" },
{ "character": "女主", "line": "这次不一样了..." }
],
"choices": [
{ "text": "直接反击", "nextScene": "1-2A" },
{ "text": "隐忍不发", "nextScene": "1-2B" }
]
}
]
}
]
},
"characters": [
{ "name": "女主", "traits": ["坚韧", "聪明", "复仇心切"] }
],
"estimatedDuration": 15,
"qualityScore": 87.5,
"status": "approved",
"createdAt": "2026-03-26T08:00:00Z"
}
}
PUT /api/scripts/:id
更新剧本
// Request
{
"title": "新标题",
"content": { ... },
"status": "reviewing"
}
POST /api/scripts/:id/publish
发布剧本
// Request
{
"platforms": ["douyin", "kuaishou"],
"scheduleAt": "2026-03-27T12:00:00Z" // 可选:定时发布
}
// Response
{
"success": true,
"data": {
"publishId": "pub_xxx",
"status": "scheduled",
"scheduledAt": "2026-03-27T12:00:00Z"
}
}
5.8 数据统计接口
GET /api/stats/overview
获取系统概览数据
// Response
{
"success": true,
"data": {
"agents": {
"total": 10,
"active": 8,
"training": 2
},
"tasks": {
"pending": 5,
"inProgress": 3,
"completedToday": 15
},
"hotspots": {
"today": 120,
"unprocessed": 20
},
"scripts": {
"total": 500,
"thisWeek": 50,
"published": 300,
"avgScore": 82.5
}
}
}
GET /api/stats/trends
获取趋势数据
// Query Params
{
metric: string, // hotspots | scripts | tasks
period: string, // day | week | month
startDate?: string,
endDate?: string
}
// Response
{
"success": true,
"data": {
"labels": ["03-20", "03-21", "03-22", "03-23", "03-24", "03-25", "03-26"],
"datasets": [
{
"label": "热点数量",
"data": [100, 120, 95, 140, 130, 150, 120]
}
]
}
}
5.9 WebSocket 实时接口
连接: ws://localhost:3000/ws/claude
认证
// 连接时携带 token
const ws = new WebSocket('ws://localhost:3000/ws/claude?token=jwt_token');
消息格式
// 客户端 → 服务端
{
"type": "chat",
"agentId": "lemonv:trend-hunter",
"message": "查看今日热点"
}
// 服务端 → 客户端 (流式响应)
{
"type": "chunk",
"agentId": "lemonv:trend-hunter",
"content": "正在为您查询..."
}
// 服务端 → 客户端 (完成)
{
"type": "complete",
"agentId": "lemonv:trend-hunter",
"result": { ... }
}
// 服务端 → 客户端 (任务通知)
{
"type": "task_update",
"taskId": "T-mn77t6b8",
"status": "done",
"summary": "任务完成摘要"
}
5.10 错误码定义
| 错误码 | HTTP状态 | 说明 |
|---|---|---|
OK |
200 | 成功 |
CREATED |
201 | 创建成功 |
BAD_REQUEST |
400 | 请求参数错误 |
UNAUTHORIZED |
401 | 未认证 |
FORBIDDEN |
403 | 无权限 |
NOT_FOUND |
404 | 资源不存在 |
CONFLICT |
409 | 资源冲突 |
VALIDATION_ERROR |
422 | 数据验证失败 |
RATE_LIMITED |
429 | 请求过于频繁 |
INTERNAL_ERROR |
500 | 服务器内部错误 |
6. 部署架构
6.1 开发环境
# docker-compose.dev.yml
version: '3.8'
services:
app:
build: .
ports:
- "3000:3000"
- "5173:5173"
volumes:
- ./data:/app/data
- ./workspace:/app/workspace
environment:
- NODE_ENV=development
- DB_PATH=/app/data/lemonv.sqlite
- REDIS_URL=redis://redis:6379
redis:
image: redis:7-alpine
ports:
- "6379:6379"
6.2 生产环境
# docker-compose.prod.yml
version: '3.8'
services:
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./ssl:/etc/nginx/ssl
app:
build: .
deploy:
replicas: 2
environment:
- NODE_ENV=production
volumes:
- /mnt/data:/app/data
redis:
image: redis:7-alpine
volumes:
- redis_data:/data
volumes:
redis_data:
6.3 目录结构
/data/
├── lemonv.sqlite # 主数据库
├── skills/ # Skill 目录(代码仓库外)
│ ├── skill_a/
│ └── skill_b/
├── workspace/ # 各 Agent 工作区
│ ├── lemonv/
│ │ ├── ceo/
│ │ ├── cto/
│ │ └── trend-hunter/
│ └── assets/ # 共享资源
├── hotspots/ # 热点原始数据
├── scripts/ # 剧本存档
└── logs/ # 日志文件
7. 安全规范
7.1 认证与授权
- 所有 API 需携带有效 JWT Token(除登录/注册)
- Token 有效期 24 小时,支持 Refresh Token
- 角色权限控制:admin > user > viewer
7.2 数据安全
- 密码使用 bcrypt 加密存储
- 敏感操作需二次验证
- API Key 不存储在代码中,使用环境变量
7.3 接口安全
- 全站 HTTPS
- 请求限流:IP 级别 100/分钟,用户级别 1000/分钟
- SQL 注入防护:使用参数化查询
- XSS 防护:输入过滤、输出转义
7.4 爬虫安全
- 遵守各平台 robots.txt
- 请求间隔随机 1-3 秒
- 使用代理池轮换 IP
- 异常监控,自动降速/暂停
8. 监控与运维
8.1 日志规范
- 结构化日志(JSON 格式)
- 分级:DEBUG
- 关键字段:timestamp, level, source, agent_id, message, metadata
8.2 关键指标
| 指标 | 说明 | 告警阈值 |
|---|---|---|
api_latency |
API 响应时间 | > 500ms |
error_rate |
错误率 | > 1% |
queue_depth |
任务队列深度 | > 100 |
agent_heartbeat |
Agent 心跳超时 | > 5 分钟 |
db_size |
数据库大小 | > 1GB |
8.3 健康检查
GET /health
{
"status": "healthy",
"checks": {
"database": "ok",
"redis": "ok",
"disk": "ok"
},
"timestamp": "2026-03-26T08:30:00Z"
}
9. 扩展规划
9.1 短期(1-3个月)
- [ ] 完善爬虫平台支持(抖音/微博/小红书/快手)
- [ ] 剧本生成模板库建设
- [ ] 质量评估模型优化
- [ ] 前端 Dashboard 可视化
9.2 中期(3-6个月)
- [ ] 多模态内容生成(音频/视频)
- [ ] A/B 测试框架
- [ ] 内容推荐算法
- [ ] 多租户 SaaS 化
9.3 长期(6-12个月)
- [ ] 分布式爬虫架构
- [ ] 实时流处理(Kafka/Flink)
- [ ] 私有化部署方案
- [ ] 开放 API 平台
10. 附录
10.1 术语表
| 术语 | 说明 |
|---|---|
| Agent | 智能体,具有特定能力的 AI 角色 |
| Skill | 技能,可复用的功能模块 |
| Hotspot | 热点,全网热门话题数据 |
| Script | 剧本,互动短剧内容 |
| Pipeline | 流水线,内容生产的自动化流程 |
10.2 参考文档
文档变更记录
| 版本 | 日期 | 变更内容 | 作者 |
|---|---|---|---|
| v1.0 | 2026-03-26 | 初始版本 | lemonv:cto |