feat: 部署初版测试
Some checks failed
Extension Build & Release / build (push) Failing after 1m5s
Backend Deploy (Go + Docker) / deploy (push) Failing after 1m40s
Web Console Deploy (Vue 3 + Vite) / deploy (push) Has been cancelled

This commit is contained in:
zs
2026-03-02 21:25:21 +08:00
parent db3abb3174
commit 8cf6cb944b
97 changed files with 10250 additions and 209 deletions

506
docs/API.md Normal file
View File

@@ -0,0 +1,506 @@
# InsightReply API 接口文档
> **Base URL**`https://<YOUR_SERVER>/api/v1`
> **认证方式**Bearer Token (JWT)
> **内容类型**`application/json`
---
## 通用响应格式
### 成功响应
```json
{
"code": 200,
"message": "success",
"data": { ... }
}
```
### 错误响应
```json
{
"code": 4001,
"message": "具体的错误描述",
"data": null
}
```
### HTTP Status Code 规范
| HTTP Status | 使用场景 |
|-------------|---------|
| `200 OK` | 正常响应 |
| `201 Created` | 资源创建成功 |
| `400 Bad Request` | 请求参数错误 (对应 code 4xxx) |
| `401 Unauthorized` | 未认证或 Token 过期 |
| `403 Forbidden` | 权限不足(如 Free 用户访问 Pro 功能) |
| `429 Too Many Requests` | 触发 Rate Limit |
| `500 Internal Server Error` | 服务端异常 (对应 code 5xxx) |
| `502 Bad Gateway` | 上游服务(如 LLM不可用 |
### 业务错误码速查表
| Code | 含义 |
|------|------|
| `4001` | 请求体解析失败 / 参数缺失 |
| `4002` | 必填字段为空 |
| `4003` | 权限不足Tier 限制) |
| `4004` | 资源不存在 |
| `4005` | Rate Limit 超限 |
| `4010` | 未认证 / Token 无效 |
| `4011` | Token 已过期 |
| `5001` | 数据库读写错误 |
| `5002` | LLM 调用失败 |
| `5003` | 外部服务超时 |
---
## 认证相关
### POST `/auth/register` — 用户注册
**请求体**
```json
{
"email": "user@example.com",
"password": "securePassword123"
}
```
**成功响应**
```json
{
"code": 201,
"message": "success",
"data": {
"user_id": "uuid-xxxx",
"access_token": "eyJhbG...",
"refresh_token": "eyJhbG..."
}
}
```
---
### POST `/auth/login` — 用户登录
**请求体**
```json
{
"email": "user@example.com",
"password": "securePassword123"
}
```
**成功响应**
```json
{
"code": 200,
"message": "success",
"data": {
"access_token": "eyJhbG...",
"refresh_token": "eyJhbG...",
"user": {
"id": "uuid-xxxx",
"email": "user@example.com",
"subscription_tier": "Free",
"identity_label": "独立开发者"
}
}
}
```
---
### POST `/auth/refresh` — 刷新 Token
**请求体**
```json
{
"refresh_token": "eyJhbG..."
}
```
---
## AI 评论生成 (需认证)
### POST `/ai/generate` — 生成评论
**请求头**
```
Authorization: Bearer <access_token>
```
**请求体**
```json
{
"tweet_content": "AI agents are going to replace 80% of SaaS tools in the next 2 years.",
"strategy": "all",
"identity": "AI 创始人",
"language": "en",
"max_length": 280
}
```
| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| `tweet_content` | string | ✅ | 目标推文原文 |
| `strategy` | string | ❌ | `cognitive_upgrade` / `contrarian` / `data_supplement` / `empathy` / `founder_exp` / `all`(默认 `all` |
| `identity` | string | ❌ | 用户身份标签,默认使用用户 Profile 中的设置 |
| `language` | string | ❌ | 输出语言,`en` / `zh` / `auto`(默认 `auto`,跟随原推文语言) |
| `max_length` | int | ❌ | 最大字符数,默认 280 |
**成功响应**
```json
{
"code": 200,
"message": "success",
"data": {
"tweet_id": "optional-if-known",
"replies": [
{
"strategy": "cognitive_upgrade",
"label": "认知升级型",
"candidates": [
"Most people are thinking about this wrong. The real shift isn't agents replacing SaaS — it's agents making SaaS invisible. The UI layer vanishes, but the data layer matters more than ever.",
"Hot take: agents won't replace SaaS. They'll rebuild it. Every workflow tool becomes an agent orchestrator. The winners know this already."
]
},
{
"strategy": "contrarian",
"label": "反向观点型",
"candidates": ["..."]
}
],
"usage": {
"prompt_tokens": 320,
"completion_tokens": 580,
"total_tokens": 900
}
}
}
```
---
## 用户配置 (需认证)
### GET `/users/me` — 获取当前用户信息
**成功响应**
```json
{
"code": 200,
"message": "success",
"data": {
"id": "uuid-xxxx",
"email": "user@example.com",
"subscription_tier": "Pro",
"identity_label": "AI 创始人",
"daily_usage": { "generate": 5, "limit": -1 },
"created_at": "2026-02-01T00:00:00Z"
}
}
```
### PUT `/users/me/preferences` — 更新用户偏好
**请求体 (可增量更新)**
```json
{
"identity_label": "SaaS Builder",
"language_preference": "zh"
}
```
---
## 监控配置 (需认证)
### POST `/monitors/keywords` — 添加关键词监控
**请求体**
```json
{
"keyword": "AI agent"
}
```
### GET `/monitors/keywords` — 获取关键词列表
### DELETE `/monitors/keywords/{id}` — 删除关键词
### POST `/monitors/accounts` — 添加账号监控
**请求体**
```json
{
"x_handle": "sama"
}
```
### GET `/monitors/accounts` — 获取监控账号列表
### DELETE `/monitors/accounts/{id}` — 删除监控账号
---
## 用户可配置系统 API (需认证)
### GET `/users/me/product_profiles` — 获取用户产品档案
**成功响应**
```json
{
"code": 200,
"message": "success",
"data": {
"product_name": "InsightReply",
"tagline": "AI-powered audience engagement",
"domain": "SaaS",
"key_features": "[\"Multi-LLM\", \"Custom Strategies\"]",
"target_users": "Founders, Indie Hackers",
"product_url": "https://insightreply.example.com",
"competitors": "[\"ReplyGuy\", \"TweetHunter\"]",
"relevance_keywords": "[\"marketing\", \"twitter growth\"]",
"custom_context": "We focus on high-quality, non-spammy replies",
"default_llm_provider": "anthropic",
"default_llm_model": "claude-3-5-haiku-latest"
}
}
```
### PUT `/users/me/product_profiles` — 更新用户产品档案
**请求体**
接受与 GET 响应相同的 JSON 字段结构。
---
### GET `/users/me/strategies` — 获取自定义策略列表
**成功响应**
```json
{
"code": 200,
"message": "success",
"data": [
{
"id": "uuid-xxx",
"strategy_key": "funny",
"label": "幽默调侃型",
"icon": "🤣",
"description": "Make the reader laugh.",
"prompt_template": "Reply to this with a witty joke: {tweet_content}",
"few_shot_examples": "[]",
"sort_order": 1
}
]
}
```
### POST `/users/me/strategies` — 创建自定义策略
**请求体** 接受与 GET 列表中单项内容相同的结构(无需提供 id
### DELETE `/users/me/strategies/{id}` — 删除自定义策略
---
### GET `/monitors/competitors` — 获取竞品监控列表
**成功响应**
```json
{
"code": 200,
"message": "success",
"data": [
{
"id": "uuid-xxx",
"brand_name": "CompetitorA",
"x_handle": "@compa"
}
]
}
```
### POST `/monitors/competitors` — 添加竞品监控
**请求体**
```json
{
"brand_name": "CompetitorA",
"x_handle": "@compa"
}
```
### DELETE `/monitors/competitors/{id}` — 删除竞品监控
> 用户可定义自己正在推广的产品信息,系统会将其注入 Prompt生成与产品领域高度关联的评论。
### GET `/users/me/product` — 获取产品档案
**成功响应**
```json
{
"code": 200,
"message": "success",
"data": {
"product_name": "SwiftBiu",
"tagline": "AI-powered short video creation tool",
"domain": "AI Video Creation",
"key_features": ["视频生成", "多语言配音", "AI 脚本"],
"target_users": "内容创作者, 独立开发者, 出海团队",
"product_url": "https://apps.apple.com/app/swiftbiu",
"competitors": ["CapCut", "Descript", "Opus Clip"],
"relevance_keywords": ["short video", "content creation", "AI dubbing", "video editing"],
"custom_context": "We focus on multi-language video creation for global creators.",
"default_llm_provider": "anthropic",
"default_llm_model": "claude-3-5-haiku-latest"
}
}
```
### PUT `/users/me/product` — 更新产品档案
**请求体**:(所有字段可选,只传需要更新的字段)
```json
{
"product_name": "SwiftBiu",
"tagline": "AI-powered short video creation tool",
"domain": "AI Video Creation",
"key_features": ["视频生成", "多语言配音", "AI 脚本"],
"competitors": ["CapCut", "Descript"],
"relevance_keywords": ["short video", "content creation"],
"custom_context": "任意自定义的上下文信息,会被注入到生成 Prompt 中",
"default_llm_provider": "anthropic",
"default_llm_model": "claude-3-5-haiku-latest" // 支持前端列表选择,或用户手动输入自定义模型(如接入代理时的自有模型)
}
```
---
## 自定义策略 (需认证)
> 除系统内置的 5 种策略外,用户可创建自己的评论策略模板。
### GET `/users/me/strategies` — 获取策略列表(含系统内置 + 用户自定义)
**成功响应**
```json
{
"code": 200,
"message": "success",
"data": {
"builtin": [
{ "strategy_key": "cognitive_upgrade", "label": "认知升级型", "icon": "🧠" },
{ "strategy_key": "contrarian", "label": "反向观点型", "icon": "🔥" }
],
"custom": [
{
"id": "uuid-xxx",
"strategy_key": "builder_story",
"label": "创始人实战型",
"icon": "🚀",
"description": "以自身产品经验为论据,自然关联到我的产品",
"prompt_template": "用 {identity} 的身份,基于 {product_name} 的开发经验,对这条推文写一条有洞察力的评论...",
"few_shot_examples": ["We faced this exact problem building SwiftBiu..."]
}
]
}
}
```
### POST `/users/me/strategies` — 创建自定义策略
**请求体**
```json
{
"strategy_key": "builder_story",
"label": "创始人实战型",
"icon": "🚀",
"description": "以自身产品经验为论据,自然关联到产品",
"prompt_template": "用 {identity} 的身份,基于 {product_name} 的开发经验...",
"few_shot_examples": [
"We faced this exact problem building SwiftBiu. What worked for us was..."
]
}
```
### PUT `/users/me/strategies/{id}` — 更新自定义策略
### DELETE `/users/me/strategies/{id}` — 删除自定义策略
---
## 竞品监控 (需认证)
### POST `/monitors/competitors` — 添加竞品监控
**请求体**
```json
{
"brand_name": "CapCut",
"x_handle": "CapCut"
}
```
### GET `/monitors/competitors` — 获取竞品监控列表
### DELETE `/monitors/competitors/{id}` — 删除竞品监控
---
## 系统 (无需认证)
### GET `/sys/config/llms` — 获取支持的 LLM 模型列表
> 用于前端渲染「重写 AI 引擎」的下拉菜单,由后端统一从环境变量 (`OPENAI_AVAILABLE_MODELS` 等) 下发。
**成功响应**
```json
{
"code": 200,
"message": "success",
"data": {
"providers": [
{
"id": "openai",
"name": "OpenAI (或兼容接口)",
"models": ["gpt-4o", "gpt-4o-mini", "o1-mini"]
},
{
"id": "anthropic",
"name": "Anthropic Claude",
"models": ["claude-3-5-sonnet-latest", "claude-3-5-haiku-latest"]
},
{
"id": "deepseek",
"name": "DeepSeek",
"models": ["deepseek-chat", "deepseek-reasoner"]
},
{
"id": "gemini",
"name": "Google Gemini",
"models": ["gemini-2.5-flash", "gemini-2.5-pro"]
}
]
}
}
```
### GET `/health` — 健康检查
**成功响应**
```json
{
"code": 200,
"message": "ok",
"data": {
"status": "healthy",
"db": "connected",
"version": "1.0.0",
"uptime": "2h30m"
}
}
```

189
docs/ARCHITECTURE.md Normal file
View File

@@ -0,0 +1,189 @@
# InsightReply 系统架构 (Architecture Overview)
> 本文档描述 InsightReply 的整体技术架构、各组件职责与数据流。
---
## 一、架构全景图
```
┌─────────────────────────────────────────────────────────────────┐
│ 用户浏览器 (Chrome / Edge) │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ X (Twitter) 页面 │ │
│ │ ┌──────────────┐ ┌──────────────────────────────┐ │ │
│ │ │ Content │ │ InsightReply Sidebar │ │ │
│ │ │ Script │───▶│ (Shadow DOM 隔离) │ │ │
│ │ │ - DOM 感知 │ │ - 策略选择 │ │ │
│ │ │ - 按钮注入 │ │ - 评论展示 │ │ │
│ │ │ - 数据提取 │ │ - 一键复制 │ │ │
│ │ └──────────────┘ └──────────┬───────────────────┘ │ │
│ └───────────────────────────────────┼─────────────────────┘ │
│ │ chrome.runtime │
│ ┌───────────────────────────────────┼─────────────────────┐ │
│ │ Background Service Worker │ │
│ │ - 消息中转 │ │
│ │ - JWT Token 管理 │ │
│ │ - API 请求代理 │ │
│ └───────────────────────────────────┼─────────────────────┘ │
└──────────────────────────────────────┼──────────────────────────┘
│ HTTPS
┌──────────────────────────────────────────────────────────────────┐
│ Nginx / Caddy (TLS 终结) │
└──────────────────────────────────────┬───────────────────────────┘
┌──────────────────────────────────────────────────────────────────┐
│ Go 后端服务 (Docker Container) │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────────┐ │
│ │ Handler │─▶│ Service │─▶│Repository│─▶│ PostgreSQL │ │
│ │ (HTTP) │ │ (BizLogic│ │ (GORM) │ │ (Tailscale) │ │
│ └──────────┘ └────┬─────┘ └──────────┘ └──────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────┐ │
│ │ LLM Gateway │──▶ OpenAI / Claude / DeepSeek │
│ │ (Timeout + │ │
│ │ Breaker + │ │
│ │ Retry) │ │
│ └──────────────┘ │
│ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ Radar Scheduler (定时任务) │ │
│ │ - Asynq (Redis Queue) │ │
│ │ - Nitter Scraper │ │
│ │ - 热度计算引擎 │ │
│ └──────────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────────┘
```
---
## 二、分层架构 (Clean Architecture)
```
cmd/server/main.go ← 入口:配置加载、依赖注入、路由注册
├── internal/handler/ ← 表现层HTTP 请求解析 → 调用 Service → 返回 JSON
│ ├── ai_handler.go
│ ├── user_handler.go
│ └── common.go ← 统一 Response 工具函数
├── internal/service/ ← 业务层核心逻辑LLM 调用、热度计算、权限校验)
│ ├── ai_service.go
│ └── user_service.go
├── internal/repository/ ← 数据层:封装所有 SQL / GORM 操作
│ └── user_repository.go
├── internal/model/ ← 数据模型Go struct 定义
│ └── user.go
├── config/ ← 配置读取(环境变量 → 结构体)
├── pkg/ ← 跨模块共享工具包
└── prompts/ ← Prompt 模板文件 (规划中)
```
**调用链规则**`Handler → Service → Repository`,严禁跨层调用。
---
## 三、数据流
### 3.1 核心链路:用户生成评论
```mermaid
sequenceDiagram
participant U as 用户 (X 页面)
participant CS as Content Script
participant BG as Background SW
participant API as Go 后端
participant LLM as OpenAI
U->>CS: 点击 Insight 按钮
CS->>CS: 提取推文 DOM 数据
CS->>BG: chrome.runtime.sendMessage
BG->>API: POST /ai/generate (带 JWT)
API->>API: 验证 Token + Rate Limit
API->>LLM: ChatCompletion (含 Prompt)
LLM-->>API: 生成结果
API-->>BG: JSON 响应 (10 条候选)
BG-->>CS: sendResponse
CS->>U: Sidebar 展示评论
U->>U: 选择 → 一键复制 → 粘贴发布
```
### 3.2 雷达链路:后台监控推文 *(规划中)*
```mermaid
sequenceDiagram
participant SCH as Scheduler
participant Q as Asynq (Redis)
participant SC as Scraper Worker
participant NIT as Nitter 实例
participant DB as PostgreSQL
SCH->>Q: 定时投放抓取任务
Q->>SC: 消费任务
SC->>SC: Jitter 延迟 (1-5s)
SC->>NIT: HTTP GET (指纹轮换)
alt 正常响应
NIT-->>SC: HTML
SC->>SC: goquery 解析
SC->>DB: Batch UPSERT tweets
SC->>DB: 计算 heat_score
else 429/503
SC->>SC: 触发 Circuit Breaker
SC->>Q: 指数退避后重新入队
end
```
---
## 四、部署架构
```
Internet
┌────────┴────────┐
│ Nginx / Caddy │ ← TLS + 反代 → :8080
└────────┬────────┘
┌──────────────────┼──────────────────┐
│ Oracle ARM VPS │
│ 144.24.60.0 │
│ │
│ ┌────────────────────────────┐ │
│ │ Docker │ │
│ │ ├── insight-reply-server │ │
│ │ └── (未来: redis) │ │
│ └────────────────────────────┘ │
│ │
└──────────────────┼──────────────────┘
│ Tailscale VPN
┌────────────────┐
│ PostgreSQL │
│ 100.64.0.5 │
└────────────────┘
```
---
## 五、技术栈一览
| 层级 | 技术 | 版本 |
|------|------|------|
| **前端插件** | Vue 3 + Composition API | 3.5 |
| **样式** | Tailwind CSS | v4 |
| **打包** | Vite + CRXJS | 7.x |
| **后端** | Go (chi router) | 1.24 |
| **ORM** | GORM + pgx | 1.31 |
| **数据库** | PostgreSQL | 15+ |
| **LLM** | OpenAI (go-openai) | GPT-4o Mini |
| **任务队列** *(规划)* | Asynq (Redis) | - |
| **容器** | Docker + Docker Compose | 24.x |
| **CI/CD** | Gitea Actions | - |
| **VPN** | Tailscale | - |

View File

@@ -14,15 +14,21 @@
**触发条件**:当推送代码到 `main` 分支,且 `server/**` 目录有变更时触发。
**执行流程**
1. **获取代码并安装 Go 1.22 环境**
1. **获取代码并安装 Go 1.24 环境**
2. **交叉编译**:在 Runner 上编译出适用于 Linux ARM64 的可执行文件 `server_bin`
3. **准备部署包**:将可执行文件、`Dockerfile``docker-compose.yml` 收集到部署文件夹。
4. **Rsync 同步**:将文件同步到生产服务器 (`144.24.60.0`) `/var/admin/InsightReply/server/` 目录下。
4. **Rsync 同步**:将文件同步到生产服务器的 `/var/admin/InsightReply/server/` 目录下。
5. **平滑重启服务**:通过 SSH 远程执行 `docker-compose up -d --build`,实现不宕机更新。
> [!WARNING]
> **Rsync 安全提醒**`--delete` 参数会删除目标目录中不在源端的文件。务必配合 `--exclude` 排除 `.env` 和日志文件:
> ```yaml
> ARGS: -avz --delete --exclude '.env' --exclude '*.log'
> ```
**服务器端准备工作**
* 必须在目标服务器上安装 Docker 和 Docker Compose。
* (可选)如果在服务端需要提供环境变量给容器,请`/var/admin/InsightReply/server/` 目录下创建一个 `.env` 文件。
*`/var/admin/InsightReply/server/` 目录下创建 `.env` 文件(参考 `server/.env.example`
---
@@ -34,20 +40,123 @@
1. **获取代码并安装 Node.js 20 环境**
2. **依赖与构建**:执行 `npm install``npm run build`,编译 Vite/Vue 产物。
3. **打包产物**:将生成的 `dist` 目录打包为 `insight-reply-extension.zip`
4. **Gitea Artifacts**:将生成的 zip 包上传为当前构建的 Artifacts
*(后续需要上架 Chrome Web Store 时,可在此流程增加 API 上传步骤。)*
4. **Gitea Release**:将生成的 zip 包发布到 Gitea Release
> [!TIP]
> 后续需要上架 Chrome Web Store 时,可在此流程增加 Chrome Web Store API 上传步骤。
---
### 3. 多环境与全局发布 (规划中)
随着产品演进,当需要打 Tag 发版(如发布 `v1.0.0`)时,我们可以添加一个新的工作流:
**触发条件**:当推送符合 `v*` 规则的 Tag 时触发。
**预期行为**:利用 Gitea Release 机制,自动附带当次的前后端编译产物,作为固定资产留存。
### 3. 版本管理与发布策略
| 发布类型 | 触发条件 | 行为 |
|---------|---------|------|
| **持续部署** | `push main` + 路径过滤 | 自动部署到生产/构建扩展 |
| **正式发版** *(规划中)* | 推送 `v*` Tag | 创建 Gitea Release + 编译产物附件 |
**推荐版本号规则**
- 后端:`v1.0.0``v1.1.0``v1.1.1`(语义化版本)
- 扩展:同步跟随后端大版本,`manifest.json` 中的 `version` 对齐
---
## 🔧 Docker 运维规范
### 容器配置要点
```yaml
# docker-compose.yml 推荐配置
services:
insight-reply-server:
build: .
container_name: insight-reply-server
restart: always
ports:
- "8080:8080"
env_file:
- .env
healthcheck:
test: ["CMD", "wget", "--spider", "-q", "http://localhost:8080/api/v1/health"]
interval: 30s
timeout: 5s
retries: 3
start_period: 10s
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
networks:
- insight_network
```
> [!IMPORTANT]
> **Healthcheck 说明**:当健康检查连续失败 3 次后Docker 会将容器标记为 `unhealthy`。配合 `restart: always` 可自动恢复。
### Dockerfile 优化建议
```dockerfile
FROM alpine:latest
RUN apk --no-cache add ca-certificates tzdata wget
ENV TZ=Asia/Shanghai
WORKDIR /app
COPY server_bin .
RUN chmod +x server_bin
EXPOSE 8080
HEALTHCHECK --interval=30s --timeout=5s \
CMD wget --spider -q http://localhost:8080/api/v1/health || exit 1
CMD ["./server_bin"]
```
---
## 🌐 HTTPS 配置 (反向代理)
生产环境必须使用 HTTPS。推荐使用 **Caddy** 自动签发 Let's Encrypt 证书:
```
# Caddyfile 示例
api.insightreply.com {
reverse_proxy localhost:8080
}
```
或使用 Nginx
```nginx
server {
listen 443 ssl;
server_name api.insightreply.com;
ssl_certificate /etc/ssl/certs/cert.pem;
ssl_certificate_key /etc/ssl/private/key.pem;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
```
---
## 🔑 凭证管理 (Secrets)
要使自动化部署正常运行,请在此 Gitea 仓库的 `Settings -> Actions -> Secrets` 中配置以下环境变量:
* `USAARMLOGIN_SSH_KEY`: 用于连接到部署目标服务器 (`144.24.60.0`) 的 SSH 私钥。
| Secret 名称 | 用途 |
|-------------|------|
| `USAARMLOGIN_SSH_KEY` | SSH 私钥,用于连接部署目标服务器 |
| `GITEA_TOKEN` | Gitea API Token用于发布 Release |
---
@@ -64,6 +173,26 @@ docker-compose ps
# 查看应用最新日志
docker-compose logs -f insight-reply-server
# 查看最近 100 行日志
docker-compose logs --tail 100 insight-reply-server
# 重启应用服务
docker-compose restart insight-reply-server
# 强制重新构建并启动
docker-compose up -d --build
# 进入容器内部排查
docker exec -it insight-reply-server sh
```
---
## 📊 监控与告警 *(规划中)*
| 维度 | 方案 |
|------|------|
| **应用日志** | Docker JSON 日志 + 未来接入 Loki 或 Datadog |
| **健康检查** | Docker healthcheck + Uptime Kuma |
| **APM** | 后续考虑接入 Sentry Go SDK |
| **成本监控** | `api_usage_logs` 表追踪 Token 消耗 |

View File

@@ -1,31 +1,67 @@
# InsightReply 开发任务分解版
基于 PRDv1.0),我们将开发任务划分为以下核心模块与阶段,适合在 Notion/Jira 等任务管理系统中作为 Epic/Story 录入。
基于 PRDv1.0与产品功能路线图,我们将开发任务划分为以下核心模块与阶段,适合在 Notion/Jira 等任务管理系统中作为 Epic/Story 录入。
> 📌 功能完善度的详细分析与竞品对比见 → [`PRODUCT_ROADMAP.md`](./PRODUCT_ROADMAP.md)
> **状态标签说明**:🟢 已完成 | 🟡 进行中 | ⚪ 未开始
---
## 🏁 第一阶段:核心 MVP预计耗时 2-4 周)
**核心目标**:跑通获取推文 -> 生成多策略评论 -> 一键复制的核心业务流。
**核心目标**:跑通"获取推文 -> 生成多策略评论 -> 一键复制"的核心业务流。
### Epic 1: 项目基础设施搭建
- [ ] **前端框架初始化**搭建浏览器插件Chrome Extension基础模版使用 Vue 3 + Tailwind CSS,并配置打包工具(如 Plasmo 或 Vite
- [ ] **后端架构选型与初始化**:创建 Go (Golang) 后端服务基础框架。
- [ ] **数据库初始化**设计并创建基础表结构Users, MonitoredKeywords, Tweets, GeneratedReplies
- [ ] **LLM API 接入**申请并联通 OpenAI (GPT-4) 或其他大模型 API建立接口通信链路。
- [x] 🟢 **前端框架初始化**搭建浏览器插件Chrome Extension基础模版使用 Vue 3 + Tailwind CSS v4配置 Vite + CRXJS 打包工具
- [x] 🟢 **后端架构选型与初始化**:创建 Go (Golang) 后端服务基础框架chi 路由 + GORM + Clean Architecture 分层)
- [x] 🟢 **数据库初始化**设计并创建基础表结构Users, MonitoredKeywords, Tweets, GeneratedReplies
- [x] 🟢 **LLM API 接入**:联通 OpenAI GPT-4o Mini API建立接口通信链路。
- [x] 🟢 **CI/CD 流水线**:搭建 Gitea Actions 自动部署(后端 Docker + 前端打包发布)。
### Epic 2: 浏览器插件核心开发
- [ ] **UI 侧边栏/弹窗实现**:在 XTwitter页面注入前端组件展示 InsightReply 面板。
- [ ] **推文内容提取**获取当前浏览中的相关推文文本内容及上下文
- [ ] **手动生成交互**:用户手动点击“生成”,调用后端接口返回评论建议
- [ ] **结果呈现与复制**:展示返回的备选评论,支持一键复制操作。
- [x] 🟢 **UI 侧边栏实现**:在 XTwitter页面注入前端组件Shadow DOM 隔离),展示 InsightReply 面板。
- [x] 🟢 **推文内容提取**Content Script 使用 MutationObserver 监听 DOM提取推文文本、作者、互动数据
- [x] 🟢 **手动生成交互**:用户点击"Insight"按钮 → Background → Go API → LLM → 返回结果
- [x] 🟢 **结果呈现与复制**:展示备选评论,支持一键复制操作。
### Epic 3: 评论生成引擎(基础版)
- [ ] **提示词(Prompt工程调优**编写可稳定生成 5 种不同属性(认知升级型、反向观点型、数据补充型、共鸣型、创始人经验型)的底层提示词
- [ ] **身份预设支持**:支持基础的用户预设身份(如 AI 创始人/SaaS Builder与推文内容一同传入 LLM
- [x] 🟢 **基础 Prompt 工程**实现单条评论生成(支持策略与身份参数传入)
- [ ] **多策略批量生成**:一次生成 5 种策略(认知升级型、反向观点型、数据补充型、共鸣型、创始人经验型)× 2 条备选
- [ ]**Prompt 深度优化**:引入 Hook+Position+Insight+Brevity 结构公式、Few-shot 示例、语言控制、Token 消耗追踪。
- [ ]**Prompt 模板化管理**:建立 `prompts/` 目录,每个策略独立模板文件。
### Epic 4: 基础关键词监控
- [ ] **监控规则配置**前端/后台页面支持用户录入最初的几个核心关键词
- [ ] **定时拉取脚本**:服务端定时通过 API/规则 拉取匹配关键词的相关推文缓存于数据
### Epic 4: 高可用后台监控系统 (Nitter Scraping)
- [x] **监控规则配置**提供 API 允许用户录入核心监控关键词与目标账号
- [x] **高可用采集引擎 (Scraper)**:基于 `goquery` 解析自建 Nitter (`https://x.beenglish.eu.org/`) 的 DOM 获取数据。
- [x]**防封禁反风控 (Anti-Ban)**:实现请求抖动 (Jitter)、User-Agent 轮换与隔离会话 (Session Isolation)。
- [x]**熔断降级机制 (Circuit Breaker)**:在 Nitter 被限流报 429/503 时自动暂停抓取,触发指数退避 (Exponential Backoff)。
### Epic 11: 工程基础设施加固 *(新增)*
- [x]**JWT 认证中间件**:为 `/api/v1` 路由添加 Bearer Token 认证,绑定用户身份。
- [x]**Rate Limiting**:按用户 subscription_tier 分级限流Free: 10次/天, Pro: 无限)。
- [x]**CORS 配置**:添加 `go-chi/cors` 中间件,白名单 Chrome 扩展 Origin。
- [x]**Multi-LLM 路由与韧性设计**:支持 OpenAI / Anthropic / DeepSeek / Gemini 多模型动态路由,为调用添加 Timeout30s、Circuit Breaker`sony/gobreaker`)、指数退避重试。
- [x]**Graceful Shutdown**:使用 `signal.NotifyContext` 实现平滑关停。
- [x]**健康检查**:添加 `/health` 端点 + Docker healthcheck。
- [x]**DB Migration 机制**:引入 `golang-migrate/migrate`,建立 `migrations/` 目录。
- [x]**单元测试骨架**:覆盖 Handler/Service 层核心路径 + CI 自动运行测试。
- [x]**环境变量规范化**API 地址、LLM Provider 等全部走环境变量或配置文件。
### Epic 12: 用户体验与功能完善 *(新增 — 来自产品评审)*
- [x]**多条备选评论 (P0)**:单次返回 3 种策略 × 1 条 = 3 条备选Sidebar 改为卡片列表式展示;记录用户策略偏好。
- [x]**用户 Onboarding 流程 (P0)**:首次使用 3 步引导 → 身份标签 / 偏好语言 / 风格倾向 → 存入 `chrome.storage.sync` + 后端用户表。
- [x]**前端热度标签 (P1)**Content Script 基于 DOM 互动数注入 🔥 Trending / ⚡ Rising 徽章,帮用户判断评论时机。
- [x]**评论历史 Tab (P1)**:扩展 Popup 新增 History Tab本地存储最近 50 条记录,支持搜索和策略筛选。
- [x]**Quote Tweet 生成 (P1)**:新增第 6 种策略「引用评论型」,生成可独立发帖的引用转发内容。
- [x]**错误边界与离线处理**API 失败时显示重试按钮 + 明确错误提示,后端不可达时给出离线提示。
### Epic 15: 用户可配置系统 *(新增 — 可扩展性设计)*
> 所有与用户场景相关的能力均通过用户自定义设置实现,系统不硬编码任何特定产品/领域/策略,确保可扩展性。
- [x]**产品档案 (Product Profile)**:用户可配置产品名、领域、功能、竞品、相关关键词等;系统自动注入 Prompt 上下文。
- [x]**自定义策略模板 (Custom Strategies)**:除内置 5 种策略外,用户可创建私有策略(含 Prompt 模板 + Few-shot 示例);前端 Sidebar 动态合并展示。
- [x]**竞品监控 (Competitor Monitoring)**:用户添加竞品品牌名/X 账号,雷达自动监控竞品讨论推文。
- [x]**推文相关性评分 (Relevance Scoring)**Content Script 基于产品档案中的 `relevance_keywords` 做前端轻量匹配,高相关推文旁标注 🎯 标签。
- [x]**Profile 优化提醒**:用户复制评论后弹出 Tip提醒确保 X Bio 和 Pin Tweet 包含产品信息。
---
@@ -33,18 +69,25 @@
**核心目标**:实现对账号的定点监控、推文的热度初步计算,并让评论策略更完善。
### Epic 5: 账号与组合监控
- [ ] **账号监控功能**:实现对重点账号的定点监控配置(支持实时抓取)。
- [ ] **多规则组合过滤**:支持指定账号 + 关键词、AND/OR 多条件的交叉过滤搜索。
- [x] **账号监控功能**:实现对重点账号的定点监控配置(支持实时抓取)。
- [x] **多规则组合过滤**:支持指定账号 + 关键词、AND/OR 多条件的交叉过滤搜索 API
### Epic 6: 热度评分系统
- [ ] **热度指标采集**:获取推文的点赞、转发、评论数量的变化速率
- [ ] **热度公式落地**:实现 `热度 = 点赞增长率*0.4 + 转发增长率*0.3 + 评论增长率*0.3` 算法
- [ ] **增强因子计算**接入账号蓝V标识识别、粉丝数权重计算和热搜趋势匹配
- [ ] **阈值提醒机制**:当分析出的推文热度超过设定阈值,出现在插件的“高潜爆款候选列”中
### Epic 6: 数据飞轮与快照引擎 (Data Flywheel)
- [x] **快照入库 (UPSERT 逻辑)**:抓取的推文以 `x_tweet_id` 为唯一键存入 `tweets` 表,更新转评赞数据
- [x] **动态热度算法 (Heat Score)**计算两次抓取的增量Delta Likes/Retweets/Replies运用公式计算当前热度分 `heat_score`
- [x] **动态智能抓取频率 (Smart Crawling)**:热度飙升的推文升至 `high` 队列,长时间沉默推文降级至 `low` 队列
- [x] **高潜商机面板 (Hot Opportunities)**:提供 `GET /tweets/hot` 并在插件内实现商机大赏面板
### Epic 7: Web 管理后台
- [ ] **Web 界面开发**Nuxt.js / Vue 3 等前端框架搭建完整数据看板
- [ ] **策略调整与历史记录**:用户可查看所有生成过的历史评论,调整个人细分风格标签库
### Epic 7: 独立 Web 管理控制台 (SaaS 面板)
- [x] **基础设施 (P2)**:使用 Vue 3 (或 React) + Vite 搭建独立的管理页面,支持账号密码与 JWT 独立登录体系
- [x] **Web 界面开发**Vite / Vue 3 前端框架搭建完整数据看板,暗黑玻璃态美学 UI (Dashboard / Radar / History)
- [x]**策略与历史接入**:实现了 /api/v1/replies 分析回溯接口,与监控拦截热点推文分发墙 (Pinterest Layout)。
### Epic 13: 性能数据追踪与个人风格学习 (AI Style Engine)
- [x]**动作埋点与入库**前端点击“Copy”时POST `/api/v1/replies/record` 存入 `generated_replies`。若为野生帖子,则静默补全伪造的关联 `Tweet` 防止外键错误。
- [x]**性能回查 Worker**:新增 `PerformanceWorker`,独立线程每 30 分钟轮询 24 小时前已拷贝但未检验成效的回复。通过 Nitter `/i/status/id` 结构爬取目标原帖楼层并使用字符串相似度算法寻找目标回复并采集点赞量。
- [x]**自动 AI 风格反推**:点赞突增 > 10 的神级评论,将会独立喂入 OpenAI / Anthropic提取指令Tone/Structure/Jargon固化至 `user_style_profiles.tone_preference` 供给日后的推文任务强制学习。注入风格画像。
- [ ]**评论时机智能提醒 (P3)**:后端监控到高潜推文时,通过 Chrome Notification 推送 → 点击跳转 → Sidebar 预加载备选评论。
---
@@ -52,13 +95,17 @@
**核心目标**:验证效果以形成数据反馈,推出付费订阅,强化护城河。
### Epic 8: 商业化支付与权限系统
- [ ] **支付系统接入**:集成 Stripe 等主流订阅支付平台。
- [ ] **多级版本控制**:根据 Free/Pro/Premium 版本,对生成次数限制”“监控关键词上限”“账号数量进行鉴权与隔离。
- [ ] **支付系统接入**:集成 Stripe 等主流订阅支付平台。
- [ ] **多级版本控制**:根据 Free/Pro/Premium 版本,对"生成次数限制""监控关键词上限""账号数量"进行鉴权与隔离。
### Epic 9: 评论效果数据反馈V2
- [ ] **社交数据回拨检测**:定期查询用户发布评论后的真实点赞、回复数据。
- [ ] **用户表现看板**:在 Web 后台提供最有效互动风格”“最佳发帖时间的数据可视化分析图表。
- [ ] **社交数据回拨检测**:定期查询用户发布评论后的真实点赞、回复数据。
- [ ] **用户表现看板**:在 Web 后台提供"最有效互动风格""最佳发帖时间"的数据可视化分析图表。
### Epic 10: AI 模型个性化学习
- [ ] **风格反馈微调**:针对高频点赞的回复风格,优化该用户的专属 Prompt。
- [ ] **长期资产构建**:落地行业趋势资料包与垂直知识库,辅以 RAG 技术提高生成内容的深度。
- [ ] **风格反馈微调**:针对高频点赞的回复风格,优化该用户的专属 Prompt。
- [ ] **长期资产构建**:落地行业趋势资料包与垂直知识库,辅以 RAG 技术提高生成内容的深度。
### Epic 14: 增长与传播引擎 *(新增)*
- [ ]**效果排行 & 成就系统**:每周评论表现报告 + 成就徽章Viral Reply、Growth Streak 等)。
- [ ]**社交裂变入口**Free 版评论卡片底部 "Generated by InsightReply" 水印Pro 可去除)+ 评论表现分享图。

554
docs/IMPLEMENTATION_PLAN.md Normal file
View File

@@ -0,0 +1,554 @@
# InsightReply 实施计划 (Implementation Plan)
> 本文档记录了 InsightReply 各模块的具体技术实现方案,是 `DEVELOPMENT_PLAN.md`(做什么)的落地补充(怎么做)。
> 功能完善度的产品策略分析见 → [`PRODUCT_ROADMAP.md`](./PRODUCT_ROADMAP.md)
---
## 一、数据抓取策略 (Data Acquisition Strategy)
InsightReply 采用 **"前端主动感知 + 后端规则引擎"** 的双模式来实现数据抓取:
### 1. 插件端交互式抓取 (User-Driven)
* **触发场景**:用户在 X (Twitter) 上浏览推文时,想针对某条推文生成评论。
* **实现逻辑**Content Script 直接从浏览器 DOM 中提取当前选定推文的作者、正文、互动数 (Like/Reply)。
* **优点**:零延迟,无需后端预先抓取该推文,即看即得。
### 2. 后端雷达监控抓取 (System-Driven / Radar)
* **方案选型对比**
| 方案 | 代表 | 优点 | 缺点 | 月费 |
|------|------|------|------|------|
| 付费 SaaS | Apify / RapidAPI | 即插即用,免维护 | 按次计费 | $30-$100+ |
| 自建开源 | **Nitter + Camoufox** | 几乎免费 | 技术门槛高 | 仅服务器费 |
* **最终选型**:自建 Nitter 开源方案。
* **Nitter 实例地址**`https://x.beenglish.eu.org/`
---
## 二、浏览器插件技术实现 (Extension Architecture)
### 1. Content Script 与 UI 注入
* **Content Script (`src/content/index.ts`)**:监听页面 URL 变化,使用 `MutationObserver` 实时检测新加载的推文 DOM 节点。
* **Shadow DOM 注入**:在推文操作栏注入"Insight"入口按钮。点击后展示主面板,面板挂载在 Shadow DOM 内,确保与 Twitter 原生样式完全隔离。
* **Background Service Worker**:作为中转站,处理与后端 Go API 的通信和认证。
### 2. UI 设计规范 (ui-ux-pro-max)
* **暗黑毛玻璃风格**:主色调 `#0A0A0A` ~ `#171717`,浮动面板使用 `backdrop-filter: blur()`
* **品牌渐变色**:紫蓝渐变 `#8B5CF6``#3B82F6`,用于 CTA 按钮和高亮标签。
* **字体**:优先使用 `Inter` / `Geist` / `SF Pro` 等现代无衬线字体。
* **微动画**:所有状态切换配 `ease-in-out` 过渡(`200ms-300ms`)。
### 3. 技术栈规范
* **Tailwind CSS v4**:所有间距、颜色从 Design Tokens 读取,禁止硬编码内联样式。
* **Vue 3 Composition API**:高频 UI 元素(`Button`, `Card`, `Badge`)封装为基础组件。
* **`cn()` 工具函数**:基于 `clsx` + `tailwind-merge` 统一处理动态 Class 冲突。
* **轻量化打包**:禁止引入完整组件库,采用按需加载。
### 4. Content Script 性能优化策略 *(新增)*
> 在 Twitter 重型 SPA 中,粗暴监听全文档 DOM 变更会产生严重性能问题。
* **收缩监听范围**:将 `MutationObserver``observe` 目标从 `document.body` 收缩到 `main[role="main"]` 或 Timeline 容器。
* **防抖扫描**`scanTweets()` 加入 `requestIdleCallback``debounce(200ms)`,避免高频回调。
* **已处理标记**:通过 `WeakSet<HTMLElement>` 记录已注入按钮的推文节点,避免重复扫描。
* **多选择器 Fallback**Twitter 的 `data-testid` 属性随时可能变更,已处理推文选择器应支持多层 Fallback
```typescript
const TWEET_SELECTORS = [
'article[data-testid="tweet"]',
'article[role="article"]',
'div[data-testid="cellInnerDiv"] article'
];
```
---
## 三、高可用后台抓取系统 (Industry Radar - Enterprise Architecture)
考虑到系统的**稳定性、安全性和反风控 (Anti-Ban)**,自建 Nitter 之上的抓取系统设计为一套健壮的企业级爬虫架构。
### 1. 终极反风控与防封禁策略 (Anti-Ban Mechanisms)
| 机制 | 说明 |
|------|------|
| **请求抖动 (Jitter)** | 每次请求间加入 `1s-5s` 强随机延迟,严禁整点并发 |
| **熔断降级 (Circuit Breaker)** | Nitter 连续返回 429/503 时自动暂停 30 分钟 |
| **Fallback 节点池** | 主节点熔断时自动切换到备用 Nitter 实例 |
| **指纹轮换 (Fingerprint Rotation)** | 同步轮换 UA + `Sec-Ch-Ua` + `Accept-Language` 等全套 Header |
| **会话隔离 (Session Isolation)** | 每个采集任务独立 Cookie Jar避免跨任务身份串联 |
### 2. 高可用采集架构 (Scraper & Queue)
* **异步任务队列**:基于 Redis 的 `Asynq`,解耦"触发"与"执行",控制最大并发数。
* **指数退避重试 (Exponential Backoff)**:失败后按 1min → 3min → 10min 递增重试间隔。
* **采集器健壮性**
* `goquery` 解析找不到元素时记录 Warn返回部分数据**绝不 Panic**。
* 关键报错时 **Dump HTML 快照**到日志表,方便排查 Nitter DOM 结构变更。
### 3. 数据计算与存储层
* **批量 Upsert**:使用 `ON CONFLICT DO UPDATE` 策略,降低 IO 压力,防止死锁。
* **热度公式**
```
heat_score = (Like增量 × 0.4) + (RT增量 × 0.3) + (Reply增量 × 0.3)
```
* **动态智能抓取频率 (Smart Crawling)**
* 🔥 热度飙升的推文 → **高频队列**(每 15 分钟抓一次)
* 🧊 24 小时无新动态 → **低频队列**(每 4 小时抓一次)
* 极大节省抓取资源,显著降低被封概率。
---
## 四、后端安全与认证体系 *(新增)*
### 1. JWT 认证方案
所有 `/api/v1` 路由(除 `/auth/*` 外)必须经过 JWT 认证中间件。
* **技术选型**`go-chi/jwtauth` + HMAC-SHA256 签名。
* **Token 结构**
```json
{
"sub": "user-uuid",
"tier": "Pro",
"exp": 1709164800
}
```
* **刷新策略**Access Token 有效期 24hRefresh Token 有效期 30d存于 `chrome.storage.local`。
### 2. Rate Limiting分级限流
| Tier | 评论生成 | 监控关键词 | 监控账号 |
|------|---------|-----------|---------|
| Free | 10 次/天 | 3 个 | 3 个 |
| Pro | 无限 | 20 个 | 20 个 |
| Premium | 无限 | 50 个 | 50 个 |
* **实现方案**:基于 Redis 的滑动窗口计数器Key 格式:`ratelimit:{user_id}:{action}:{window}`。
* **中间件挂载**:在 chi Router 中通过 `r.Use(RateLimitMiddleware)` 全局或分路由挂载。
### 3. CORS 配置
```go
r.Use(cors.Handler(cors.Options{
AllowedOrigins: []string{"chrome-extension://*", "https://x.com", "https://twitter.com"},
AllowedMethods: []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"},
AllowedHeaders: []string{"Authorization", "Content-Type"},
AllowCredentials: true,
MaxAge: 300,
}))
```
---
## 五、LLM 服务韧性设计 *(新增)*
### 1. 调用链路防护
```
请求 → Timeout Guard (30s) → Circuit Breaker → Retry (max 2) → OpenAI API
```
* **Timeout**`context.WithTimeout(ctx, 30*time.Second)` 包裹每次 LLM 调用。
* **Circuit Breaker**:使用 `sony/gobreaker`,连续 5 次失败后半开,每 60s 试探一次恢复。
* **指数退避重试**:仅对 5xx / Timeout 重试4xx如 quota exceeded立即失败。
### 2. 多模型动态路由与 Fallback
系统重构为 **多 Provider 支持 (OpenAI / Anthropic / DeepSeek / Gemini)**,以应对不同用户的专属模型偏好和单一 Provider 宕机时的容灾。同时支持**代理接口与自定义模型**。
**路由与配置设计**
1. **环境变量驱动 (ENV)**:管理员可通过配置 `OPENAI_BASE_URL` 改写接口地址(完美兼容 Groq、vLLM、Ollama 等任意 OpenAI 兼容代理)。
2. **可用模型下发**:通过 `OPENAI_AVAILABLE_MODELS="gpt-4o,gpt-4o-mini"` 配置白名单,后端通过 `GET /sys/config/llms` 统一向前端下发。
3. **前端交互 (`default_llm_model`)**:前端展示为**「可输入的下拉列表 (Combobox)」**,用户既可从系统下发的列表中点选,也支持手动输入任意字符串,实现完全自定义。
4. **故障转移 (Fallback)**:当前尝试的 Provider 返回 5xx 时,按兜底顺序切换:`Anthropic → OpenAI → Gemini → DeepSeek`。
**统一适配器抽象**
建立统一的 `LLMProvider` 接口,抹平各平台 API 结构差异,内部集成对应 SDK
- OpenAI (含兼容代理): `sashabaranov/go-openai` (支持通过 Builder 传入 BaseURL)
- Anthropic: 直接构造 REST API 请求
- DeepSeek: 兼容 OpenAI SDK基于 `DEEPSEEK_BASE_URL` 重连
- Gemini: `google.golang.org/api/generativelanguage/v1beta`
### 3. Token 成本审计
每次 LLM 调用记录 `prompt_tokens + completion_tokens`,写入 `api_usage_logs` 表:
```sql
INSERT INTO api_usage_logs (user_id, provider, model, prompt_tokens, completion_tokens, cost_usd)
VALUES ($1, $2, $3, $4, $5, $6);
```
---
## 六、Prompt 工程规范 *(新增)*
### 1. 策略模板结构
每个评论策略维护独立的 Prompt 模板文件,存放于 `server/prompts/` 目录:
```
server/prompts/
├── system.txt # 全局 System Prompt
├── cognitive_upgrade.txt # 认知升级型
├── contrarian.txt # 反向观点型
├── data_supplement.txt # 数据补充型
├── empathy.txt # 共鸣型
└── founder_exp.txt # 创始人经验型
```
### 2. Prompt 结构公式 (必须遵守)
```
[System Prompt]
- 角色定义:专业社交媒体表达顾问
- 输出约束:字数、语言、格式
[User Prompt]
- 用户身份标签:{identity}
- 目标推文:{tweet_content}
- 策略指令:{strategy_specific_instruction}
- 结构公式Hook + Position + Insight + Brevity
- Few-shot 示例2-3 条高质量参考
[Constraints]
- 不超过 280 字符 (或用户指定长度)
- 语言:与原推文一致,或用户指定
- 语气与身份匹配
- 禁止引号包裹
```
### 3. 批量生成规范
API 单次返回 5 种策略 × 2 条备选 = **10 条候选评论**
* 方案 A单次 LLM 调用Prompt 中要求 JSON 数组输出
* 方案 B5 组并发调用,每组 n=2
* **推荐方案 A**,减少 API 调用次数
---
## 七、后端 Go 接口规范
* 采用 RESTful 标准。
* 所有接口返回统一 JSON 结构:
```json
{
"code": 200,
"message": "success",
"data": {}
}
```
* 错误码体系:`4xxx` 为客户端错误,`5xxx` 为服务端错误。
* 详细接口文档见 → [`docs/API.md`](./API.md)
---
## 八、环境变量与配置管理 *(新增)*
所有运行时配置统一通过环境变量注入,**禁止硬编码**。
| 变量名 | 说明 | 示例 |
|-------|------|------|
| `DATABASE_URL` | PostgreSQL 连接串 | `postgres://user:pass@host:5432/db` |
| `OPENAI_API_KEY` | OpenAI API Key | `sk-...` |
| `JWT_SECRET` | JWT 签名密钥 | 随机 32+ 字符串 |
| `SERVER_PORT` | 服务端口 | `8080` |
| `CORS_ORIGINS` | 允许的跨域来源 | `chrome-extension://*` |
| `LOG_LEVEL` | 日志级别 | `info` / `debug` / `warn` |
| `LLM_TIMEOUT_SEC` | LLM 调用超时秒数 | `30` |
模板文件 → [`server/.env.example`](../server/.env.example)
---
## 九、验证计划 (Verification Plan)
| # | 验证项 | 方法 |
|---|--------|------|
| 1 | 防封控链路 | 模拟 100 并发请求,验证熔断 + Jitter 能正确拦截 |
| 2 | HTML 解析容错 | 模拟账号冻结/推文被删等异常页面,确认不会 Panic |
| 3 | Shadow DOM 隔离 | 在 X 深色/浅色模式下验证插件样式不被污染 |
| 4 | 端到端生成链路 | 插件点击 → Background → Go API → LLM → 返回结果 |
| 5 | JWT 认证 *(新增)* | 无 Token / 过期 Token / 非法 Token 拒绝访问 |
| 6 | Rate Limiting *(新增)* | Free 用户超 10 次/天后返回 429 |
| 7 | LLM 韧性 *(新增)* | 模拟 OpenAI 超时 / 5xx验证熔断降级 + 重试 |
| 8 | Graceful Shutdown *(新增)* | 发送 SIGTERM验证在途请求完成后才退出 |
| 9 | Onboarding 流程 *(新增)* | 首次打开插件触发引导,设置存入 chrome.storage + 后端 |
| 10 | 多条备选评论 *(新增)* | 验证返回 3 条备选Sidebar 卡片式展示正确 |
| 11 | 热度标签 *(新增)* | 在高互动推文旁正确显示 🔥/⚡ 标签 |
| 12 | 效果追踪闭环 *(新增)* | 复制评论 → 24h 后回查 → 互动数据写入 DB |
---
## 十、用户 Onboarding 实现方案 *(新增)*
### 1. 流程设计
首次安装/首次打开插件时,检测 `chrome.storage.sync` 中是否存在 `onboarding_completed` 标志。若无,显示 3 步引导:
```typescript
// background/index.ts
chrome.runtime.onInstalled.addListener(({ reason }) => {
if (reason === 'install') {
chrome.storage.sync.set({ onboarding_completed: false });
}
});
```
### 2. 数据存储
| 字段 | 存储位置 | 说明 |
|------|---------|------|
| `identity_label` | `chrome.storage.sync` + `users` 表 | 身份标签 |
| `language_preference` | `chrome.storage.sync` + `users` 表 | 偏好语言 |
| `tone_preference` | `chrome.storage.sync` + `user_style_profiles` 表 | 风格倾向 |
| `onboarding_completed` | `chrome.storage.sync` | 是否已完成引导 |
### 3. 与生成链路的集成
用户设置完成后,每次生成评论时自动读取 `chrome.storage.sync` 中的偏好,附加到 `GENERATE_REPLY` 消息中:
```typescript
// 改造 Sidebar.vue 的 generate()
const prefs = await chrome.storage.sync.get(['identity_label', 'language_preference', 'tone_preference']);
chrome.runtime.sendMessage({
type: 'GENERATE_REPLY',
payload: {
tweetContent: props.tweetData.content,
strategy: 'all',
identity: prefs.identity_label,
language: prefs.language_preference,
tone: prefs.tone_preference
}
});
```
---
## 十一、前端热度标签实现方案 *(新增)*
### 1. 判断逻辑
```typescript
interface HeatLevel {
label: string;
emoji: string;
className: string;
}
const getHeatLevel = (likes: number, minutesAgo: number): HeatLevel | null => {
if (likes > 1000 && minutesAgo < 120) {
return { label: 'Trending', emoji: '🔥', className: 'heat-trending' };
}
if (likes > 100 && minutesAgo < 60) {
return { label: 'Rising', emoji: '⚡', className: 'heat-rising' };
}
return null;
};
```
### 2. 注入位置
在 `injectInsightButton()` 函数中,紧挨 Insight 按钮旁边注入热度标签:
* 🔥 Trending红色渐变 Badge (`background: linear-gradient(135deg, #ef4444, #f97316)`)
* ⚡ Rising黄色渐变 Badge (`background: linear-gradient(135deg, #f59e0b, #eab308)`)
### 3. 时间计算
从推文 DOM 中的 `<time datetime="...">` 元素提取发帖时间,计算与当前时间的差值:
```typescript
const timeEl = tweetElement.querySelector('time');
const postedAt = new Date(timeEl?.getAttribute('datetime') || '');
const minutesAgo = (Date.now() - postedAt.getTime()) / 60000;
```
---
## 十二、数据飞轮 — 效果追踪与风格学习 *(新增)*
### 1. 效果追踪数据流
```
用户复制评论
│ copyToClipboard() → 同时记录 hash(reply_text) 到 chrome.storage.local
chrome.storage.local:
tracked_replies: [{
hash: "a1b2c3",
text: "Most people miss...",
strategy: "contrarian",
copied_at: 1709164800,
tweet_url: "https://x.com/.../status/..."
}]
Content Script 延迟触发 (当用户访问自己 Profile 页时)
│ 条件: URL 匹配 x.com/{current_user}
扫描用户近期 Tweets/Replies
│ 对比 tracked_replies 中的 text hash
匹配成功 → 提取当前 Likes / Replies 数
chrome.runtime.sendMessage → Background → POST /api/v1/replies/{id}/performance
写入 reply_performance 表
```
### 2. 风格学习 Prompt 注入
当 `user_style_profiles` 表有足够数据(≥ 10 条追踪记录)后,生成评论时自动注入风格画像:
```
[附加上下文 - 个人风格画像]
基于你过去 30 天的高互动评论分析:
- 最有效策略: {top_strategies} (平均互动率 {avg_rate}%)
- 风格特征: {style_description}
- 高频高互动关键词: {keywords}
- 偏好评论长度: {avg_length} 字符
请参考以上风格特征生成评论。
```
### 3. 风格特征提取 (后端定时任务)
每周对每个用户的 `reply_performance` 数据运行一次 LLM 分析:
```
System: 你是社交媒体互动分析专家。
User: 以下是该用户最近 30 天互动率最高的 10 条评论:
{replies_list}
请总结其写作风格特征, 包括:
1. 最常用的句式结构
2. 高频关键词或短语
3. 语气倾向 (专业/幽默/犀利)
4. 平均有效长度
输出为 JSON 格式。
```
---
## 十三、用户可配置系统设计 *(新增)*
> **设计原则**:系统不硬编码任何特定产品/领域/策略。所有与用户场景相关的能力均通过用户自定义设置实现,确保对任意行业、任意产品类型的可扩展性。
### 1. 架构思想:零硬编码 (Zero Hardcoding)
```
传统做法 (❌):
Prompt 里写死 "你是一个 AI 创始人,正在推广 SwiftBiu..."
可扩展做法 (✅):
Prompt 运行时从 user_product_profiles 表 + user_custom_strategies 表
动态拼装上下文,适用于任何用户、任何产品
```
### 2. 产品档案 (Product Profile) 注入机制
当用户配置了产品档案后,生成评论时自动注入以下上下文块:
```
[产品上下文 — 自动注入,仅当用户已配置产品档案时]
你正在帮助一位 {identity} 撰写社交评论。
该用户正在推广的产品: {product_name} — {tagline}
产品所属领域: {domain}
核心功能: {key_features}
目标用户群: {target_users}
{custom_context}
注意:
- 不要直接提及产品名称或链接 (除非用户使用了"创始人实战型"策略)
- 评论应从 {domain} 领域专家的角度出发,让读者产生"这个人很懂行"的印象
- 引发好奇心 → 点击 Profile → 发现产品,而非硬推
```
### 3. 自定义策略运行时
用户自定义的策略模板支持以下**模板变量**,运行时自动替换:
| 变量 | 来源 | 说明 |
|------|------|------|
| `{tweet_content}` | 当次请求 | 目标推文原文 |
| `{identity}` | 用户设置 | 身份标签 |
| `{product_name}` | 产品档案 | 产品名称 |
| `{domain}` | 产品档案 | 所属领域 |
| `{key_features}` | 产品档案 | 核心功能 |
| `{competitors}` | 产品档案 | 竞品列表 |
| `{language}` | 用户设置 | 输出语言 |
| `{max_length}` | 当次请求 | 最大字符数 |
| `{custom_context}` | 产品档案 | 自定义上下文 |
**后端处理流程**
```go
// service/ai_service.go
func (s *AIService) buildPrompt(req GenerateRequest, profile *ProductProfile, strategies []Strategy) string {
// 1. 加载 System Prompt
// 2. 如果有产品档案 → 注入产品上下文块
// 3. 合并内置策略 + 用户自定义策略
// 4. 替换所有模板变量
// 5. 如果有风格画像 (user_style_profiles) → 注入风格上下文
// 6. 返回最终 Prompt
}
```
### 4. 前端推文相关性评分
Content Script 基于产品档案中的 `relevance_keywords` 对当前浏览的推文做实时相关性判断:
```typescript
// content/relevance.ts
const scoreRelevance = (tweetText: string, keywords: string[]): number => {
const text = tweetText.toLowerCase();
let score = 0;
for (const kw of keywords) {
if (text.includes(kw.toLowerCase())) score++;
}
return score;
};
// 注入标签
const relevance = scoreRelevance(tweetData.content, userProfile.relevance_keywords);
if (relevance >= 2) {
// 注入 🎯 "High Relevance" 标签
}
```
**关键词来源**`chrome.storage.sync` 缓存用户的 `relevance_keywords`(来自产品档案 API定期同步。
### 5. 前端策略合并展示
Sidebar 策略选择器同时展示系统内置策略和用户自定义策略:
```typescript
// Sidebar.vue
const allStrategies = computed(() => [
...builtinStrategies, // 系统内置 5 种
...userCustomStrategies.value // 用户自定义 N 种 (从 API 拉取)
]);
```
自定义策略用不同背景色或 `⚙️ Custom` 标签区分,方便用户识别。
### 6. Prompt 组装顺序
```
┌─────────────────────────────────────────────┐
│ System Prompt (角色定义 + 输出约束) │
├─────────────────────────────────────────────┤
│ [可选] 产品上下文 (如果用户配置了产品档案) │
├─────────────────────────────────────────────┤
│ [可选] 个人风格画像 (如果有 ≥10 条追踪数据) │
├─────────────────────────────────────────────┤
│ User Prompt: │
│ - 身份标签 │
│ - 目标推文 │
│ - 策略指令 (内置 or 用户模板,变量已替换) │
│ - 结构公式: Hook + Position + Insight │
│ - Few-shot 示例 (系统默认 or 用户自定义) │
├─────────────────────────────────────────────┤
│ Constraints (字数/语言/格式) │
└─────────────────────────────────────────────┘
```

348
docs/PRODUCT_ROADMAP.md Normal file
View File

@@ -0,0 +1,348 @@
# InsightReply 产品功能路线图 (Product Roadmap)
> 本文档从**用户为什么会用 → 为什么会留 → 为什么会付费 → 为什么会推荐**四个维度,规划功能完善方向。
> 与 `DEVELOPMENT_PLAN.md`(任务分解)配合使用,本文档侧重**产品策略与竞争力分析**。
---
## 一、核心链路断裂点修复 — 🔴 P0直接影响用户留存
### 1.1 多条备选评论(选择感)
**现状问题**:当前 API 一次只返回 1 条评论。用户看到一条不满意的结果,大概率会觉得"AI 不靠谱"然后关掉。
**目标体验**:每次生成至少 **3 种策略 × 1 条 = 3 条备选**,用户可以对比、选择、微调。
**实现方案**
* 后端单次 LLM 调用要求 JSON 数组输出(方案 A节省 API 开销)
* 前端 Sidebar 改为**卡片列表式展示**,每张卡显示策略标签 + 评论文本 + 复制按钮
* 用户选中某条后记录 `strategy_type` 偏好,为后续个性化打基础
**产品指标影响**预期将评论复制率Copy Rate提升 **2-3 倍**
---
### 1.2 用户 Onboarding 流程(个性化基石)
**现状问题**:身份标签硬编码为 `Independent Developer / Founder`,所有人生成的评论语气完全一样,"个人定位系统"形同虚设。
**目标体验**安装后首次打开时3 步引导完成个性化设置。
**Onboarding 流程设计**
```
Step 1: 你的身份是?
┌────────────────────────────────────┐
│ 🧑‍💻 AI 创始人 │
│ 🚀 SaaS Builder │
│ 💰 投资人 │
│ 🔧 独立开发者 │
│ 📊 技术分析者 │
└────────────────────────────────────┘
Step 2: 偏好语言?
┌────────────────────────────────────┐
│ 🇺🇸 English │
│ 🇨🇳 中文 │
│ 🌐 跟随原推文语言 (Auto) │
└────────────────────────────────────┘
Step 3: 默认风格倾向?
┌────────────────────────────────────┐
│ ⚖️ 专业严谨 │
│ 😄 轻松幽默 │
│ 🔥 犀利锐评 │
└────────────────────────────────────┘
```
**数据存储**`chrome.storage.sync`(跨设备同步) + 后端 `users` 表的 `identity_label` / `language_preference`
---
### 1.3 Prompt 工程深度优化
**现状问题**:当前 System Prompt + User Prompt 总共不到 100 个 token, 缺乏策略差异化指令、结构公式、Few-shot 示例、语言控制。
**目标 Prompt 结构**
```
[System Prompt]
角色:你是 X (Twitter) 高影响力评论撰写专家。
结构公式:每条评论必须遵循 Hook(抓注意力) + Position(表明立场) + Insight(独特洞察) + Brevity(简洁有力)。
约束:不超过 {max_length} 字符,使用 {language} 语言,语气匹配 {identity} 身份。
[User Prompt]
身份: {identity} (例: 连续创业者, AI SaaS 方向)
原推文: "{tweet_content}"
策略: {strategy_name}
策略详细定义: {strategy_instruction}
参考高互动评论 (Few-shot):
1. "Most people miss this — the real moat isn't the model, it's the data flywheel..."
2. "We faced this exact problem building [product]. Here's what actually worked..."
输出 3 种策略各 1 条, JSON 格式:
[{"strategy": "...", "content": "...", "hook_type": "..."}]
```
**关键改进对照表**
| 维度 | 改进前 | 改进后 |
|------|-------|-------|
| 策略区分 | 只传名称 | 每种策略含 5-10 行详细定义 |
| 结构公式 | 无 | Hook+Position+Insight+Brevity |
| Few-shot | 无 | 每种策略附 2-3 条真实高赞示例 |
| 语言控制 | 未指定 | 支持 en / zh / auto |
| 输出格式 | 纯文本 | JSON 结构化,可解析 |
| 字数约束 | "under 280" | 精确 `max_length` 参数 |
---
## 二、体验增强功能 — 🟠 P1提升产品吸引力
### 2.1 前端热度标签
**场景**:用户在 Timeline 浏览时,不知道哪条推文适合去评论。
**方案**Content Script 基于 DOM 中可读取的互动数据,在 Insight 按钮旁注入热度标签:
| 标签 | 条件 | 视觉 |
|------|------|------|
| 🔥 `Trending` | Likes > 1000 且发帖 < 2h | 红色渐变 Badge |
| ⚡ `Rising` | Likes > 100 且发帖 < 1h | 黄色渐变 Badge |
| 无标签 | 不符合上述条件 | 仅显示 Insight 按钮 |
**核心价值**:帮用户**快速判断评论时机**,降低决策成本。纯前端实现,不需要后端支持。
---
### 2.2 评论历史 Tab
**场景**:用户想回看之前生成/使用过的评论,总结什么风格效果好。
**方案**:在扩展 Popup 中新增 `History` Tab
* 本地存储最近 50 条生成记录(`chrome.storage.local`
* 每条显示:原推文摘要(截断 60 字)、策略标签、生成时间、已复制 / 已跳过状态
* 如果有效果数据V2还可标注 ❤️ 互动数
* 支持搜索和策略筛选
---
### 2.3 Quote Tweet引用评论生成
**场景**:很多创始人的高互动内容来自 Quote Tweet ——对别人的推文加上自己的分析后转发发出。
**方案**:策略列表新增第 6 种策略类型:
| 策略 | 说明 | 典型格式 |
|------|------|---------|
| `quote_thread` | 引用评论型 | [引用原推文] + 2-3 句独立观点 + 可选 takeaway |
* Prompt 中明确要求生成"可独立发帖"的长度(≤ 280 字)
* 前端复制按钮改为"Copy as Quote",提示用户在 X 中使用引用转发
---
## 三、核心护城河功能 — 🟡 P2从"可用"到"不可替代"
> [!IMPORTANT]
> P2 阶段的两个功能(效果追踪 + 风格学习)是 InsightReply 与所有竞品拉开差距的**核心壁垒**。
> 竞品只做"生成"InsightReply 做"生成 → 追踪 → 学习 → 越来越像你"的数据飞轮。
### 3.1 评论效果追踪闭环
**用户故事**:作为用户,我想知道我用 InsightReply 生成的评论发出后效果如何,这样我能知道哪种策略最有效。
**实现路径**
```
用户复制评论
Toast 提示:"评论发出后, InsightReply 将在 24h 后追踪互动数据"
Content Script 延迟检测 (24h 后)
│ 通过用户 Timeline DOM 回查
匹配到已发评论 → 提取 Likes / Replies 数
写入 reply_performance 表
"我的评论表现" 数据面板
```
**技术关键点**
* 用户复制评论时,将评论文本哈希存入 `chrome.storage.local` 作为追踪 Key
* Content Script 在用户访问自己 Profile 页时,扫描近期评论,匹配已存 Key
* 匹配成功后提取互动数据,通过 Background → API 写入数据库
* 无需爬虫,**完全基于用户自身浏览行为**触发
### 3.2 个人风格学习飞轮(核心差异化)
**数据飞轮模型**
```
用得越多 → 评论数据越多
高互动评论 → LLM 总结风格特征
│ "这条评论之所以表现好,是因为:
│ 1. 用了反问句开头
│ 2. 引用了数据
│ 3. 语气简洁有力"
更新 user_style_profiles
│ top_strategies: ["contrarian", "data_supplement"]
│ tone_preference: "provocative"
│ high_engagement_keywords: ["moat", "flywheel", "most people miss"]
下次生成 → Prompt 注入个人风格
│ "你的高互动风格倾向: 善用反问句, 喜欢引用数据..."
生成质量提升 → 互动率提升 → 更多数据 → 更懂你 (🔄 Flywheel)
```
**Prompt 注入示例**
```
[附加上下文 - 个人风格画像]
基于你过去 30 天的高互动评论分析:
- 最有效的策略: 反向观点型 (平均互动率 4.2%)
- 你的特征: 善用反问句开头, 喜欢引用具体数据, 语气简洁有力
- 高频出现的高互动关键词: "most people miss", "here's the counterpoint", "data shows"
- 平均最佳评论长度: 180 字符
请参考以上风格特征生成评论。
```
**为什么这是护城河**
* 用户用得越久AI 越懂自己 → **迁移成本极高**
* 竞品无法复制**你的用户的数据**
* 这不是技术壁垒,是**数据网络效应**
---
## 四、增长与传播功能 — 🔵 P3让产品"被看到"
### 4.1 评论时机智能提醒
**场景**:一条推文在发出后 30 分钟内评论的曝光量是 2 小时后的 5-10 倍。但用户不可能 24 小时盯着 Twitter。
**方案**(需要后端雷达+Push
* 后端监控到高潜推文时heat_score 突破阈值)
* 通过 Chrome Notification 推送:"@sama 刚发了一条关于 AI Agents 的推文,热度飙升中⚡"
* 用户点击通知 → 直接跳转到该推文 → Sidebar **已预加载好备选评论**
* 极速评论窗口:监控 → 通知 → 跳转 → 评论 < 60 秒
### 4.2 评论效果排行 & 成就系统
**场景**:给用户正反馈循环,激励持续使用。
**方案**
* 每周邮件/插件内报告:"本周你的评论共获得 XX Likes最佳评论是___"
* 成就徽章:
* 🌟 "First Insight" — 首次生成评论
* 🔥 "Viral Reply" — 单条评论 > 100 Likes
* 📈 "Growth Streak" — 连续 7 天使用
* 🧠 "Style Master" — 风格画像达到 30 条数据
### 4.3 社交裂变入口
* 评论卡片底部低调加入 "Generated by InsightReply" 小字水印Free 版)
* Pro 用户可去除水印
* 分享功能:"查看我本月的评论表现报告" → 生成分享图 → 发推
---
## 五、用户可配置系统 — 可扩展性设计 *(新增)*
> [!IMPORTANT]
> **设计原则:零硬编码 (Zero Hardcoding)**。系统不预设任何特定产品/领域/策略。
> 所有与用户使用场景相关的能力,均通过用户自定义设置实现,确保产品适用于**任何行业、任何创始人**。
### 5.1 用户可配置的产品档案 (Product Profile)
用户在设置中自由配置自己正在推广的产品信息,系统自动将其注入 Prompt 上下文:
| 配置项 | 说明 | 示例 |
|-------|------|------|
| 产品名称 | 用户自填 | "SwiftBiu" |
| 一句话介绍 | 用户自填 | "AI-powered short video creation tool" |
| 所属领域 | 用户自填 | "AI Video Creation" |
| 核心功能 | 列表,用户增删 | ["视频生成", "多语言配音"] |
| 竞品列表 | 列表,用户增删 | ["CapCut", "Descript"] |
| 相关关键词 | 用于推文相关性评分 | ["short video", "content creation"] |
| 自定义上下文 | 任意文本,原样注入 Prompt | "We focus on multi-language..." |
**效果**有了产品档案LLM 生成的评论会自然地从用户产品领域出发,既专业又有关联性。
### 5.2 用户自定义评论策略
系统内置 5 种通用策略(认知升级/反向观点/数据补充/共鸣/创始人经验),但用户可以创建**无限私有策略**
* **策略名称 + 描述**:告诉 LLM 这种策略的写法
* **Prompt 模板**:支持 `{product_name}` `{domain}` `{tweet_content}` 等变量
* **Few-shot 示例**:用户提供自己写过的高质量评论作为参考
* **排序权重**:控制显示顺序
**示例用户策略**
| 策略 | Prompt 核心指令 | 适用场景 |
|------|---------------|---------|
| 🚀 Builder Story | "以 {product_name} 的开发经验为论据..." | 竞品/痛点讨论 |
| 🎓 Domain Expert | "从 {domain} 领域专家角度分析..." | 行业趋势讨论 |
| 🤝 Community Helper | "以用户角度推荐解决方案..." | 用户求助推文 |
### 5.3 推文相关性评分 (Relevance Scoring)
Content Script 基于用户配置的 `relevance_keywords` 对 Timeline 推文做实时相关性判断,在高相关推文旁显示 **🎯 High Relevance** 标签。
纯前端实现,用户只需维护关键词列表即可自动生效。
### 5.4 竞品讨论捕捉
用户添加竞品品牌名(如 "CapCut"、"Descript"),系统两种途径识别竞品推文:
* **前端**Content Script 在 Timeline 中实时检测包含竞品关键词的推文 → 🎯 标签
* **后端**(雷达系统就绪后):定时抓取竞品讨论 → 推送通知
---
## 六、竞品差异化定位
### 当前赛道竞品分析2026
| 竞品 | 核心功能 | 定价 | InsightReply 差异化 |
|------|---------|------|-------------------|
| Reply Guy | 自动生成回复 | $39/mo | ❌ 偏自动化灰产,我们定位"写作增强" |
| TweetPik AI | AI 回复 + 截图 | $19/mo | ❌ 无个性化学习,不可配置 |
| XReply | 批量回复 | $29/mo | ❌ 无效果追踪,无产品档案 |
| Postwise | AI 写推文 | $49/mo | ❌ 不专注评论场景 |
| Hypefury | 排程 + AI | $29/mo | ❌ 重排程轻评论 |
| **InsightReply** | **可配置评论引擎 + 风格学习 + 效果闭环** | **$9-29/mo** | ✅ **唯一:产品档案 + 自定义策略 + 数据飞轮** |
### InsightReply 的核心叙事
> **不只是帮你写评论的 AI而是一个理解你的产品、学习你的风格、越用越懂你的社交表达引擎。**
---
## 七、功能优先级总览
| 优先级 | 功能 | 预估工时 | 留存影响 | 所在阶段 |
|-------|------|---------|---------|---------|
| 🔴 P0 | 多条备选评论3策略×1条 | 3h | ⭐⭐⭐⭐⭐ | Phase 1 |
| 🔴 P0 | Onboarding 设置流程 | 4h | ⭐⭐⭐⭐⭐ | Phase 1 |
| 🔴 P0 | Prompt 深度优化 | 4h | ⭐⭐⭐⭐⭐ | Phase 1 |
| 🟠 P1 | 前端热度标签(🔥/⚡) | 2h | ⭐⭐⭐⭐ | Phase 1 |
| 🟠 P1 | 评论历史 Tab | 4h | ⭐⭐⭐⭐ | Phase 1 |
| 🟠 P1 | Quote Tweet 生成 | 3h | ⭐⭐⭐ | Phase 1 |
| 🟠 P1 | 产品档案 (Product Profile) | 3h | ⭐⭐⭐⭐⭐ | Phase 1 |
| 🟠 P1 | 自定义策略模板 | 4h | ⭐⭐⭐⭐ | Phase 1 |
| 🟠 P1 | 推文相关性评分 (🎯) | 4h | ⭐⭐⭐⭐ | Phase 1 |
| 🟡 P2 | 评论效果追踪闭环 | 1-2w | ⭐⭐⭐⭐⭐ | Phase 2 |
| 🟡 P2 | 个人风格学习飞轮 | 1-2w | ⭐⭐⭐⭐⭐ | Phase 2 |
| 🟡 P2 | 竞品监控 + 推送 | 依赖雷达 | ⭐⭐⭐⭐ | Phase 2 |
| 🔵 P3 | 评论时机智能提醒 | 1w | ⭐⭐⭐⭐ | Phase 2 |
| 🔵 P3 | 效果排行 & 成就系统 | 1w | ⭐⭐⭐ | Phase 3 |
| 🔵 P3 | 社交裂变入口 | 3h | ⭐⭐⭐ | Phase 3 |

237
docs/USER_GUIDE.md Normal file
View File

@@ -0,0 +1,237 @@
# InsightReply 用户使用指南
> InsightReply 是一个帮助创始人和独立开发者在 X (Twitter) 行业热点中输出更有洞察力评论的 AI 助手。
> 它是**社交表达增强系统**,不是自动化机器人 —— 所有评论由你决定是否发布。
---
## 一、快速开始
### 1.1 安装扩展
1. 从 [Gitea Release](https://git.buildapp.eu.org/) 下载最新的 `insight-reply-extension.zip`
2. 打开 Chrome → 地址栏输入 `chrome://extensions/`
3. 开启右上角**开发者模式**
4. 点击「加载已解压的扩展程序」→ 选择解压后的文件夹
5. 扩展图标出现在工具栏中 ✅
> [!TIP]
> Edge 浏览器同样支持,操作路径为 `edge://extensions/`
### 1.2 首次设置 (Onboarding)
安装后首次点击扩展图标,会进入 **3 步引导**
| 步骤 | 设置内容 | 说明 |
|------|---------|------|
| Step 1 | 🧑‍💻 **你的身份** | AI 创始人 / SaaS Builder / 投资人 / 独立开发者 / 技术分析者 |
| Step 2 | 🌐 **偏好语言** | English / 中文 / 跟随原推文 (Auto) |
| Step 3 | 🎨 **风格倾向** | 专业严谨 / 轻松幽默 / 犀利锐评 |
这些设置会影响 AI 生成评论的语气和风格,后续可随时在设置中修改。
---
## 二、核心功能使用
### 2.1 生成评论(主流程)
```
打开 X (Twitter) → 浏览 Timeline → 找到想评论的推文
点击推文操作栏旁的紫色 ✦ Insight 按钮
右侧弹出 InsightReply 面板
选择评论策略 → 点击「Generate High-Quality Reply」
AI 返回多条备选评论 → 选择最满意的一条
点击「Copy」→ 粘贴到推文评论框 → 发布
```
### 2.2 评论策略一览
系统内置 5 种策略,适用于不同场景:
| 策略 | 图标 | 适用场景 | 典型开头 |
|------|------|---------|---------|
| **认知升级型** | 🧠 | 对话题提出更深层的洞察 | "Most people miss this part..." |
| **反向观点型** | 🔥 | 提出不同角度,引发讨论 | "Unpopular opinion:" |
| **数据补充型** | 📊 | 用数据/案例补充论点 | "Data shows that..." |
| **共鸣支持型** | ❤️ | 表达认同并延伸讨论 | "This resonates deeply..." |
| **创始人经验型** | 🚀 | 以自身实战经验为论据 | "We faced this building our product..." |
> [!TIP]
> **选择策略的技巧**
> - 大 V 发的行业观点 → 用「认知升级型」或「反向观点型」更容易获得关注
> - 有人吐槽痛点 → 用「创始人经验型」分享你的解决方案
> - 行业数据/报告 → 用「数据补充型」让你的评论更有说服力
### 2.3 识别高价值推文
InsightReply 会在推文旁显示提示标签,帮你快速判断:
| 标签 | 含义 | 建议 |
|------|------|------|
| 🔥 **Trending** | 高热度推文Likes > 1000发帖 < 2h | 快速评论,争取高曝光 |
| ⚡ **Rising** | 增长中的推文Likes > 100发帖 < 1h | 黄金窗口期,强烈建议评论 |
| 🎯 **High Relevance** | 与你的产品领域高度相关 | 最适合你评论的推文! |
---
## 三、产品推广进阶
> 如果你是创始人/独立开发者,正在用 InsightReply 提升产品曝光,以下功能专为你设计。
### 3.1 配置你的产品档案
在扩展设置中填写你的产品信息AI 会自动从你的产品领域出发生成评论:
| 配置项 | 填什么 | 作用 |
|-------|-------|------|
| 产品名称 | 例SwiftBiu | 创始人策略中可能自然提及 |
| 所属领域 | 例AI Video Creation | AI 以此领域专家角度撰写 |
| 核心功能 | 例:视频生成, 多语言配音 | 让评论与产品技术相关 |
| 竞品列表 | 例CapCut, Descript | 竞品被讨论时收到 🎯 提醒 |
| 相关关键词 | 例short video, AI dubbing | Timeline 推文自动标注 🎯 |
| 自定义上下文 | 任意补充说明 | 原样注入 AI 的 Prompt |
> [!IMPORTANT]
> **InsightReply 不会自动发布评论或硬推你的产品。**
> 产品档案的作用是让 AI 从你的领域视角出发写评论,引发读者好奇心 → 点击你的 Profile → 发现你的产品。
### 3.2 切换与自定义 AI 引擎 (多模型支持)
为了满足成本、速度、质量等不同维度的需求InsightReply 支持四大主流平台,并允许**完全自定义模型**。
在产品档案的「重写 AI 引擎」设置中:
1. **下拉选择**:你可以从系统管理员预设的模型列表中快速选择(如 `gpt-4o-mini`, `claude-3-5-haiku-latest`)。
2. **手动输入 (支持本地/代理)**:如果你使用的平台兼容 OpenAI如 Groq、vLLM、Ollama或者你想使用列表中没有的最新模型如刚刚发布的 `gpt-4.5-turbo`),可以直接在框内**手动打字输入任意模型名称**。
| 引擎 | 推荐模型 | 适用场景特点 |
|------|---------|-------------|
| **Anthropic** | `claude-3-5-haiku-latest` | **默认推荐**。响应速度极快,文本语气最自然、最像真人社交媒体发言,不易产生"AI味"。 |
| **OpenAI (或兼容接口)** | `gpt-4o-mini` | 表现稳定,成本极低,适合大批量生成。 |
| **DeepSeek** | `deepseek-chat` | 逻辑分析能力强,中文语感极佳,价格优势明显,适合技术长文讨论。 |
| **Google** | `gemini-2.5-flash` | 速度快,多语言处理能力强。 |
*注:切换平台需要系统后台配置了相应的 API Key 或 Base URL。管理员可将 OpenAI Base URL 指向任意兼容代理,实现模型的无限扩展。*
### 3.3 创建自定义策略
除了内置的 5 种策略,你可以创建专属策略:
**示例创建「Builder Story」策略**
```
策略名: 🚀 Builder Story
描述: 以自身产品经验为论据,自然关联到产品
Prompt 模板:
"以 {identity} 的身份,结合你在 {domain} 领域开发 {product_name} 的经验,
对这条推文写一条有价值的评论。
评论应让读者感受到你是该领域的实践者,而非理论派。"
Few-shot 示例:
- "We faced this exact problem building SwiftBiu. What worked..."
```
自定义策略的 Prompt 模板支持以下变量,运行时自动替换:
| 变量 | 说明 |
|------|------|
| `{tweet_content}` | 目标推文原文 |
| `{identity}` | 你的身份标签 |
| `{product_name}` | 你的产品名 |
| `{domain}` | 你的产品领域 |
| `{key_features}` | 产品核心功能 |
| `{competitors}` | 竞品列表 |
| `{language}` | 输出语言 |
| `{max_length}` | 最大字符数 |
### 3.3 推广效果最大化小贴士
1. **优化你的 X Profile**
- Bio 中明确写 "Building @YourProduct"
- Pin 一条产品介绍/演示推文
- InsightReply 让读者好奇 → 点击 Profile 后**必须能看到你的产品**
2. **评论时机很重要**
- 推文发出后 **30 分钟内**评论,曝光是 2 小时后的 5-10 倍
- 关注 🔥 Trending 和 ⚡ Rising 标签
3. **评论质量 > 数量**
- 一条有深度的评论 > 十条"Great post!"
- 用「反向观点型」或「数据补充型」更容易引发讨论 → 更多曝光
4. **不要硬推产品**
- ❌ "Check out my product SwiftBiu!"
- ✅ "We solved this by building a multi-language pipeline. The key insight was..."
---
## 四、评论历史与效果追踪
### 4.1 查看评论历史
点击扩展图标 → `History` Tab
- 查看所有生成过的评论
- 按策略类型筛选
- 搜索关键词
- 查看复制/跳过状态
### 4.2 效果追踪
InsightReply 会自动追踪你发布的评论效果:
1. 你复制并发布了一条评论
2. 24 小时后,当你再次浏览 X 时,系统自动回查该评论的互动数据
3. 互动数据Likes、Replies会记录到你的个人面板
> 效果数据积累越多 → AI 越懂你的风格 → 生成质量越高 → 形成正向飞轮 🔄
---
## 五、版本与定价
| 版本 | 价格 | 包含功能 |
|------|------|---------|
| **Free** | $0 | 每日 10 次生成 · 3 个监控关键词 · 3 个监控账号 · 内置策略 |
| **Pro** | $29/月 | 无限生成 · 20 个关键词 · 20 个账号 · 自定义策略 · 热度雷达 |
| **Premium** | $59/月 | Pro 全部功能 + 50 个关键词 · 效果分析看板 · 风格优化建议 · 个人品牌报告 |
---
## 六、常见问题 (FAQ)
### Q: InsightReply 会自动发布评论吗?
**不会**。InsightReply 只生成评论建议,你决定是否复制和发布。我们是 AI 写作增强工具,不是自动化机器人。
### Q: 支持哪些浏览器?
Chrome 和 Edge基于 Manifest V3。Firefox 支持规划中。
### Q: AI 生成的评论会不会都一样?
不会。评论基于推文内容、你的身份标签、风格偏好和产品档案动态生成 —— 每次都是独特的。随着效果数据积累AI 会越来越像你自己的写作风格。
### Q: 我的数据安全吗?
- 产品档案和策略模板存储在我们的加密数据库中
- 我们不会读取或存储你的 X 密码
- 我们不会代替你操作你的 X 账号
### Q: 如何修改已保存的设置?
点击扩展图标 → 齿轮图标 ⚙️ → 可修改身份标签、语言偏好、产品档案、自定义策略。
### Q: 竞品关键词如何工作?
在产品档案中添加竞品名称后,当 Timeline 中出现包含竞品关键词的推文InsightReply 会在推文旁显示 🎯 标签,提示你这是一条高价值评论机会。
---
## 七、快捷键
| 快捷键 | 功能 |
|-------|------|
| `Alt + I` | 打开/关闭 InsightReply 面板 |
| `Alt + G` | 快速生成评论 |
| `Alt + C` | 复制选中的评论 |
---
> **反馈与建议**:如果你有功能建议或遇到问题,欢迎在我们的 Gitea 仓库提交 Issue。

View File

@@ -1,3 +1,9 @@
-- ====================================================
-- InsightReply 数据库 Schema (PostgreSQL)
-- 版本: v1.1
-- 更新: 新增 api_usage_logs, subscriptions, user_style_profiles 表
-- ====================================================
-- users 表:存储业务用户
CREATE TABLE IF NOT EXISTS users (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
@@ -5,6 +11,7 @@ CREATE TABLE IF NOT EXISTS users (
password_hash VARCHAR(255),
subscription_tier VARCHAR(50) DEFAULT 'Free', -- Free, Pro, Premium
identity_label VARCHAR(100), -- AI 创始人, SaaS Builder 等
language_preference VARCHAR(10) DEFAULT 'auto', -- en, zh, auto
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
@@ -42,21 +49,25 @@ CREATE TABLE IF NOT EXISTS tweets (
retweet_count INTEGER DEFAULT 0,
reply_count INTEGER DEFAULT 0,
heat_score FLOAT DEFAULT 0.0,
crawl_queue VARCHAR(20) DEFAULT 'normal', -- high, normal, low (智能抓取频率)
is_processed BOOLEAN DEFAULT FALSE,
last_crawled_at TIMESTAMP WITH TIME ZONE, -- 上次抓取时间
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
CREATE INDEX idx_tweets_x_tweet_id ON tweets(x_tweet_id);
CREATE INDEX idx_tweets_heat_score ON tweets(heat_score DESC);
CREATE INDEX idx_tweets_crawl_queue ON tweets(crawl_queue, last_crawled_at);
-- generated_replies 表:生成的 AI 评论记录
CREATE TABLE IF NOT EXISTS generated_replies (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
tweet_id UUID NOT NULL REFERENCES tweets(id) ON DELETE CASCADE,
strategy_type VARCHAR(100) NOT NULL, -- 认知升级型, 反向观点型, 数据补充型, 共鸣型, 创始人经验型
strategy_type VARCHAR(100) NOT NULL, -- cognitive_upgrade, contrarian, data_supplement, empathy, founder_exp
content TEXT NOT NULL,
status VARCHAR(50) DEFAULT 'draft', -- draft, copied, posted
language VARCHAR(10) DEFAULT 'en', -- 生成语言
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
@@ -67,6 +78,7 @@ CREATE INDEX idx_generated_replies_tweet_id ON generated_replies(tweet_id);
CREATE TABLE IF NOT EXISTS reply_performance (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
reply_id UUID NOT NULL REFERENCES generated_replies(id) ON DELETE CASCADE,
user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE, -- 冗余字段,便于按用户维度查询
like_count_increase INTEGER DEFAULT 0,
reply_count_increase INTEGER DEFAULT 0,
interaction_rate FLOAT DEFAULT 0.0,
@@ -74,8 +86,130 @@ CREATE TABLE IF NOT EXISTS reply_performance (
);
CREATE INDEX idx_reply_performance_reply_id ON reply_performance(reply_id);
CREATE INDEX idx_reply_performance_user_id ON reply_performance(user_id);
-- ====================================================
-- 新增表 (v1.1)
-- ====================================================
-- api_usage_logs 表:记录 LLM API 调用量和成本
CREATE TABLE IF NOT EXISTS api_usage_logs (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
provider VARCHAR(50) NOT NULL, -- openai, anthropic, deepseek
model VARCHAR(100) NOT NULL, -- gpt-4o-mini, claude-3.5-haiku 等
prompt_tokens INTEGER DEFAULT 0,
completion_tokens INTEGER DEFAULT 0,
total_tokens INTEGER GENERATED ALWAYS AS (prompt_tokens + completion_tokens) STORED,
cost_usd NUMERIC(10, 6) DEFAULT 0.0, -- 精确到 $0.000001
endpoint VARCHAR(100), -- /ai/generate
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
CREATE INDEX idx_api_usage_logs_user_id ON api_usage_logs(user_id);
CREATE INDEX idx_api_usage_logs_created_at ON api_usage_logs(created_at DESC);
-- subscriptions 表:用户订阅记录(支付历史)
CREATE TABLE IF NOT EXISTS subscriptions (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
tier VARCHAR(50) NOT NULL, -- Pro, Premium
stripe_subscription_id VARCHAR(255), -- Stripe 订阅 ID
status VARCHAR(50) DEFAULT 'active', -- active, cancelled, past_due, expired
started_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
expires_at TIMESTAMP WITH TIME ZONE,
cancelled_at TIMESTAMP WITH TIME ZONE,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
CREATE INDEX idx_subscriptions_user_id ON subscriptions(user_id);
CREATE INDEX idx_subscriptions_status ON subscriptions(status);
-- user_style_profiles 表:用户风格画像(用于个性化 Prompt
CREATE TABLE IF NOT EXISTS user_style_profiles (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID UNIQUE NOT NULL REFERENCES users(id) ON DELETE CASCADE,
top_strategies JSONB DEFAULT '[]', -- 最常选择的策略排序
avg_reply_length INTEGER DEFAULT 200, -- 平均偏好回复长度
high_engagement_keywords JSONB DEFAULT '[]', -- 高互动关键词
tone_preference VARCHAR(100) DEFAULT 'professional', -- casual, professional, witty, provocative
custom_prompt_suffix TEXT, -- 用户自定义的额外 Prompt 指令
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
-- crawl_snapshots 表:异常抓取时的 HTML 快照(排错用)
CREATE TABLE IF NOT EXISTS crawl_snapshots (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
url TEXT NOT NULL,
http_status INTEGER,
html_content TEXT,
error_message TEXT,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
CREATE INDEX idx_crawl_snapshots_created_at ON crawl_snapshots(created_at DESC);
-- ====================================================
-- 新增表 (v1.2) — 用户可配置系统
-- ====================================================
-- user_product_profiles 表:用户的产品档案(用于生成与产品相关联的评论)
-- 设计原则:所有字段用户自定义,系统不做任何硬编码
CREATE TABLE IF NOT EXISTS user_product_profiles (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID UNIQUE NOT NULL REFERENCES users(id) ON DELETE CASCADE,
product_name VARCHAR(255), -- 产品名称 (如 "SwiftBiu")
tagline TEXT, -- 一句话介绍
domain VARCHAR(255), -- 所属领域 (如 "AI Video Creation")
key_features JSONB DEFAULT '[]', -- 核心功能列表 ["视频生成", "多语言配音"]
target_users TEXT, -- 目标用户描述
product_url VARCHAR(500), -- 官网或商店链接
competitors JSONB DEFAULT '[]', -- 竞品名称列表 ["CapCut", "Descript"]
relevance_keywords JSONB DEFAULT '[]', -- 相关领域关键词 ["short video", "content creation", "AI dubbing"]
custom_context TEXT, -- 用户自定义的额外上下文(自由文本,注入 Prompt
default_llm_provider VARCHAR(50), -- 用户专属模型偏好: openai, anthropic, deepseek, gemini (覆盖系统默认)
default_llm_model VARCHAR(100), -- 例如: claude-3-5-haiku-latest
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
-- user_custom_strategies 表:用户自定义评论策略
-- 除系统内置的 5 种策略外,用户可以创建自己的策略模板
CREATE TABLE IF NOT EXISTS user_custom_strategies (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
strategy_key VARCHAR(100) NOT NULL, -- 策略标识 (如 "builder_story")
label VARCHAR(255) NOT NULL, -- 显示名称 (如 "创始人实战型")
icon VARCHAR(10), -- Emoji 图标
description TEXT, -- 策略描述(告诉 LLM 这种策略的写法)
prompt_template TEXT, -- 自定义 Prompt 模板(可包含 {tweet_content} {product_name} 等变量)
few_shot_examples JSONB DEFAULT '[]', -- 自定义 Few-shot 示例
is_active BOOLEAN DEFAULT TRUE,
sort_order INTEGER DEFAULT 0, -- 排序权重
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
UNIQUE (user_id, strategy_key)
);
CREATE INDEX idx_user_custom_strategies_user_id ON user_custom_strategies(user_id);
-- competitor_monitors 表:竞品品牌监控(复用后端雷达,按品牌词自动抓取)
CREATE TABLE IF NOT EXISTS competitor_monitors (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
brand_name VARCHAR(255) NOT NULL, -- 竞品品牌名
x_handle VARCHAR(255), -- 竞品官方 X 账号 (可选)
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
UNIQUE (user_id, brand_name)
);
CREATE INDEX idx_competitor_monitors_user_id ON competitor_monitors(user_id);
-- ====================================================
-- 触发器:自动更新 updated_at
-- ====================================================
-- 更新 updated_at 的触发器函数
CREATE OR REPLACE FUNCTION update_modified_column()
RETURNS TRIGGER AS $$
BEGIN
@@ -84,8 +218,13 @@ BEGIN
END;
$$ language 'plpgsql';
-- 为 users 表添加触发器
-- 为所有需要追踪更新时间的表添加触发器
CREATE TRIGGER update_users_modtime
BEFORE UPDATE ON users
FOR EACH ROW
EXECUTE FUNCTION update_modified_column();
CREATE TRIGGER update_user_style_profiles_modtime
BEFORE UPDATE ON user_style_profiles
FOR EACH ROW
EXECUTE FUNCTION update_modified_column();