面向 X(Twitter)的 Chat-first AI 内容运营助手,中文优先,支持 Web 平台 + Tauri 本地客户端壳 + 自托管部署。
当前版本已引入 V2 一次性替换骨架:主入口 /chat 与 /v2/* API。
- 主入口:
/chat(一句话意图 + 选项化简报 + 步骤推理 + 结果包 + 人工确认发布) - 主 API:
/v2/*(生成、知识接入、X 账号绑定、发布/回复路由、运营概览、计费) - 兼容能力:保留核心后端模块(publish/reply/billing/usage)作为 V2 编排底座
- 部署形态:Web + API + Worker + PostgreSQL + Redis + Tauri 客户端壳
- 旧版工作台路由(
/dashboard、/drafts、/usage等)已统一重定向到/chat
- Web: Next.js 16 + TypeScript + Tailwind
- API: NestJS + Prisma
- Worker: BullMQ + Redis
- DB: PostgreSQL 16
- Queue: Redis
- Monorepo: pnpm workspace + turbo
需要 Node.js 20+ 与 Docker。
cp .env.example .env
npx pnpm@10.23.0 installdocker compose up -d postgres redis
npx pnpm@10.23.0 db:generate
npx pnpm@10.23.0 db:migrate
npx pnpm@10.23.0 db:seed
# 分别启动
npx pnpm@10.23.0 dev:api
npx pnpm@10.23.0 dev:web
npx pnpm@10.23.0 dev:workerdocker compose up -d --build访问:
# Legacy smoke(V1 历史脚本,已不再作为主验收)
npx pnpm@10.23.0 smoke:p0
# Legacy smoke(V1 历史脚本,已不再作为主验收)
npx pnpm@10.23.0 smoke:v1
# V2 全流程 UAT(生产测试租户,真实链路)
UAT_TOKEN=<测试租户token> \
API_URL=https://api.draftorbit.ai \
APP_URL=https://draftorbit.ai \
npx pnpm@10.23.0 uat:fullsmoke:p0会走真实审批链路,审批前会触发质量闸门(包含“重复内容”检查)。- 如果脚本每次都提交完全相同的草稿文案,连续运行时会被判定为重复,导致审批返回
QUALITY_GATE_BLOCKED(HTTP 400)。 - 因此脚本内默认注入
RUN_ID(当前时间戳)到 topic/draft 标题与正文,确保每次 smoke 数据唯一,避免误报失败。 - CI 如需复现某次执行,可显式传入固定
RUN_ID:
RUN_ID=20260403-001 npx pnpm@10.23.0 smoke:p0请参考 .env.example,重点包括:
JWT_SECRETBYOK_ENCRYPTION_KEYDATABASE_URLREDIS_URLAUTH_MODE(required/self_host_no_login)X_CLIENT_ID/X_CLIENT_SECRET/X_CALLBACK_URLGOOGLE_CLIENT_ID/GOOGLE_CLIENT_SECRET/GOOGLE_CALLBACK_URLOPENAI_API_KEY(可选:官方 OpenAI 文本 live smoke)OPENROUTER_API_KEY(平台托管调用通道)TAVILY_API_KEY(可选:最新事实检索 live smoke)LIVE_OPENAI_MODEL/LIVE_OPENROUTER_MODEL/LIVE_TAVILY_QUERY(只影响pnpm provider:live,不影响默认本地验收)OPENROUTER_ROUTING_PROFILE(local/test_high/prod_balanced)OPENROUTER_FREE_MODELS/OPENROUTER_FLOOR_MODELS/OPENROUTER_HIGH_MODELSSTRIPE_SECRET_KEY/STRIPE_WEBHOOK_SECRETSTRIPE_STARTER_MONTHLY_PRICE_ID/STRIPE_STARTER_YEARLY_PRICE_IDSTRIPE_PRO_MONTHLY_PRICE_ID/STRIPE_PRO_YEARLY_PRICE_IDSTRIPE_PREMIUM_MONTHLY_PRICE_ID/STRIPE_PREMIUM_YEARLY_PRICE_IDBILLING_TRIAL_DAYS(默认 3)BILLING_PAYPAL_FALLBACK_ENABLED(生产默认false)PAYPAL_API_BASE/PAYPAL_CLIENT_ID/PAYPAL_CLIENT_SECRET/PAYPAL_WEBHOOK_ID
local:本地开发 / 低成本 smoke,允许free -> floor -> hightest_high:测试 / QA / UAT / 回归,所有文本步骤默认high -> floorprod_balanced:线上默认,hook / draft / humanize / package走高质量优先,research / outline / media走平衡层优先
建议模型池:
OPENROUTER_FREE_MODELS=openrouter/freeOPENROUTER_FLOOR_MODELS=google/gemini-3-flash-preview,openai/gpt-5.4-mini,deepseek/deepseek-v3.2OPENROUTER_HIGH_MODELS=anthropic/claude-sonnet-4.6,openai/gpt-5.4,google/gemini-3.1-pro-preview
这样测试阶段的 real-model regression 才能稳定证明“真的走了高质量层”,而不是名义分层、实际全走 openrouter/free。
默认本地验收不依赖真实 provider key。若本机配置了 OPENAI_API_KEY、OPENROUTER_API_KEY 或 TAVILY_API_KEY,可单独运行:
npm_config_cache=/tmp/draftorbit-npm-cache npx pnpm@10.23.0 provider:live该脚本会把缺失 key 记录为 skipped_missing_key,不会把 mock/free/Ollama/Codex-local fallback 算作 provider live quality evidence;已配置 key 若不可用则 fail_closed 并生成脱敏报告到 output/reports/provider-live/。
至少确保以下变量已在 apps/web 对应项目的 production 环境中配置:
NEXT_PUBLIC_API_URL(应指向https://api.draftorbit.ai)NEXT_PUBLIC_ENABLE_LOCAL_LOGIN(线上建议false)X_CLIENT_IDX_CLIENT_SECRETX_CALLBACK_URL(应为https://draftorbit.ai/auth/callback)STRIPE_SECRET_KEYSTRIPE_WEBHOOK_SECRETSTRIPE_STARTER_MONTHLY_PRICE_IDSTRIPE_STARTER_YEARLY_PRICE_IDSTRIPE_PRO_MONTHLY_PRICE_IDSTRIPE_PRO_YEARLY_PRICE_IDSTRIPE_PREMIUM_MONTHLY_PRICE_IDSTRIPE_PREMIUM_YEARLY_PRICE_ID
在 Stripe Dashboard 确认:
Payment Method Domains中已添加并启用draftorbit.ai- Checkout 使用 HTTPS(由 Vercel + Cloudflare 证书保证)
- Apple Pay / Google Pay 是否显示受设备与浏览器影响(Safari/Chrome + 可用钱包)
至少满足:
draftorbit.ai已解析到 Vercelapi.draftorbit.ai已解析到你的 API 公网服务- 两个域名都能通过 HTTPS 访问
可直接执行预检脚本(自动检查以上三类):
npx pnpm@10.23.0 preflight:prod
# 如需联动全量 UAT
RUN_UAT_FULL=1 \
UAT_FULL_REQUIRED=1 \
UAT_TOKEN=<测试租户token> \
npx pnpm@10.23.0 preflight:prodnpx pnpm@10.23.0 release:prod该命令会按顺序执行:
typecheckpreflight:prodvercel deploy --prod --yes(在apps/web)- 发布后基础健康检查(站点首页 + API
/health)
npx pnpm@10.23.0 typecheck
npx pnpm@10.23.0 preflight:prod
cd apps/web && vercel deploy --prod --yes
curl -fsS https://api.draftorbit.ai/health
curl -fsSI https://draftorbit.ai
# 发布后再执行一轮全量 UAT(可选)
POST_RELEASE_UAT_FULL=1 \
UAT_TOKEN=<测试租户token> \
npx pnpm@10.23.0 release:prodauth/x-accountsworkspaces/topicslearning-sources/voice-profiles/playbooksdrafts/naturalization/mediapublish/reply-jobsworkflowusage/audit
POST /v2/chat/sessionsPOST /v2/chat/messagesPOST /v2/generate/runGET /v2/generate/:idGET /v2/generate/:id/stream(SSE)POST /v2/knowledge/connectors/obsidianPOST /v2/knowledge/connectors/local-filesPOST /v2/knowledge/urls/importPOST /v2/x-accounts/oauth/startGET /v2/x-accountsPOST /v2/x-accounts/bind-manualPATCH /v2/x-accounts/:id/defaultPATCH /v2/x-accounts/:id/statusDELETE /v2/x-accounts/:idGET /v2/x-accounts/oauth/callbackPOST /v2/style/profile/rebuildPOST /v2/publish/queueGET /v2/publish/jobsPOST /v2/publish/jobs/:id/retryGET /v2/reply/jobsPOST /v2/reply/sync-mentionsPOST /v2/reply/:replyJobId/candidatesPOST /v2/reply/:replyJobId/candidates/:candidateId/approvePOST /v2/reply/:replyJobId/sendGET /v2/ops/dashboardGET /v2/usage/overviewGET /v2/billing/plansGET /v2/billing/subscriptionGET /v2/billing/usagePOST /v2/billing/checkoutPOST /v2/billing/subscription/cancelPOST /v2/billing/refund
AUTH_MODE=self_host_no_login仅限开发/自托管测试环境,生产禁用。- 当
AUTH_MODE=required(生产默认)时,/auth/local/session会返回404,避免线上误用本地登录。 - 敏感凭据采用加密存储(依赖
BYOK_ENCRYPTION_KEY或JWT_SECRET)。 - 外部平台(X/Google/支付/图像)仍保留 stub 路径,便于后续真实接入。
- 定价统一 USD,线上策略为 Starter $19 / Growth $49 / Max $99,支持 3 天试用(可通过
BILLING_TRIAL_DAYS临时调为 0 做真实扣款验收)。 - 登录页默认仅展示「X 登录」。当访问域名为
localhost / 127.0.0.1 / *.local时,会自动显示「本地登录」入口;如需在自托管域名显示,可设置NEXT_PUBLIC_ENABLE_LOCAL_LOGIN=true。
如果点击「OAuth 绑定 X」后在 X 授权页看到该报错,优先检查:
.env里不是占位值(stub-/your-)X_CLIENT_IDX_CLIENT_SECRET
- 回调地址一致且已在 X 开发者后台登记
- 本地推荐:
X_CALLBACK_URL=http://localhost:3000/auth/callback
- 本地推荐:
- 修改
.env后,已重启 API / Web 服务
- 在 PayPal Developer 的 webhook 中将 URL 配置为:
https://api.draftorbit.ai/billing/paypal/webhook
- 事件建议至少勾选:
BILLING.SUBSCRIPTION.CREATEDBILLING.SUBSCRIPTION.ACTIVATEDBILLING.SUBSCRIPTION.UPDATEDBILLING.SUBSCRIPTION.CANCELLEDBILLING.SUBSCRIPTION.SUSPENDEDBILLING.SUBSCRIPTION.EXPIREDBILLING.SUBSCRIPTION.PAYMENT.FAILEDPAYMENT.SALE.COMPLETEDPAYMENT.SALE.REFUNDEDPAYMENT.SALE.REVERSED
- API 环境变量设置(仅当
BILLING_PAYPAL_FALLBACK_ENABLED=true时需要):PAYPAL_API_BASE=https://api-m.sandbox.paypal.comPAYPAL_CLIENT_ID=...PAYPAL_CLIENT_SECRET=...PAYPAL_WEBHOOK_ID=...
- 本地快速触发一次模拟回调:
PAYPAL_CLIENT_ID=... \
PAYPAL_CLIENT_SECRET=... \
PAYPAL_WEBHOOK_ID=... \
bash ./scripts/test-paypal-webhook.sh默认模拟事件为 BILLING.SUBSCRIPTION.ACTIVATED,可通过 PAYPAL_EVENT_TYPE 覆盖。