一个基于 Next.js 16 + React 19 + TypeScript 的 Twitter/X 对话分析与 AI 聊天项目。
项目核心能力:
- 从 Twitter/X 拉取指定账号资料与最近推文
- 基于推文上下文发起 AI 对话
- 支持引用某条推文进行提问
- 支持 OpenAI / Claude / Gemini / Qwen 等模型配置
- 会话数据本地文件持久化
- 所有页面与接口默认需要登录后访问
| 模块 | 能力说明 |
|---|---|
| 登录鉴权 | 所有页面与接口默认登录可见,未登录自动跳转 /login |
| 会话管理 | 支持搜索、新增、删除会话,并可分页加载更多历史会话 |
| AI 对话 | 基于 Twitter/X 推文上下文提问,支持引用推文与流式回复 |
| 配置管理 | 支持前端填写并保存 Twitter/X 与 AI 参数 |
| 本地存储 | 会话写入本地 JSON,运行配置写入项目根目录 .env |
- 所有系统页面默认需要登录
- 所有
/api/* 接口默认需要登录 - 未登录访问页面时自动跳转
/login - 未登录访问接口时返回
401,前端自动跳转登录页 - 登录账号和密码从
.env读取 - 密码在服务端按 MD5 配置值校验
- 左侧展示会话列表
- 支持搜索会话
- 支持新增会话(输入 Twitter/X 用户名)
- 支持删除会话
- 支持分页加载更多历史会话
- 会话上下文来自目标账号的推文内容
- 支持引用某条推文提问
- AI 回复使用 SSE 流式输出
- 支持分页加载更早消息
- 聊天消息支持 Markdown 渲染
- 支持在前端配置并保存:
- Twitter/X Bearer Token
- Twitter/X API Key / API Secret
- AI Provider
- Base URL
- Model
- Temperature
- Max Tokens
- Thinking 参数
- 配置最终写入服务端
.env - 会话数据保存在:
data/conversations/<conversationId>/conversation.json - 配置保存在项目根目录
.env
- 前端:Next.js 16、React 19、TypeScript、Tailwind CSS 4
- 状态管理:Zustand
- Markdown 渲染:react-markdown、remark-gfm
- AI SDK:Vercel AI SDK(
ai) - AI Provider:OpenAI / Anthropic / Google / Qwen compatible
- 服务端运行模式:Next.js App Router + Route Handlers
- 鉴权:服务端签名 Session Cookie
- 持久化:本地 JSON 文件
xchatai/
├─ app/ # 页面与 API 路由
│ ├─ api/
│ ├─ login/
│ ├─ layout.tsx
│ └─ page.tsx
├─ components/ # 页面组件
│ ├─ auth/
│ └─ xchatai/
├─ data/ # 本地会话数据
├─ lib/
│ ├─ hooks/ # 前端核心业务 Hook
│ ├─ server/
│ │ ├─ auth/ # Session / 鉴权逻辑
│ │ ├─ providers/ # AI / Twitter 提供商封装
│ │ ├─ services/ # 服务层
│ │ ├─ storage/ # 本地文件存储
│ │ └─ validators/ # 请求校验
│ ├─ services/ # 前端请求封装
│ ├─ store/ # Zustand 状态
│ └─ types/ # 类型定义
├─ public/ # 静态资源
├─ docs/ # 文档与截图资源
├─ proxy.ts # 登录访问拦截
├─ .env # 服务端配置
├─ README.md
└─ README.en.md
pnpm install在项目根目录创建 .env,可参考:
# 登录配置
XCHATAI_AUTH_USERNAME="demo"
XCHATAI_AUTH_PASSWORD_MD5="c710ac795e1cd0c8648cb83cbdcf6152"
# 可选:自定义 session 签名密钥
XCHATAI_AUTH_SESSION_SECRET="replace-with-your-own-secret"
# AI 配置
XCHATAI_AI_PROVIDER="openai"
XCHATAI_AI_BASE_URL="https://api.openai.com/v1"
XCHATAI_AI_API_KEY="your-api-key"
XCHATAI_AI_MODEL="gpt-4.1-mini"
XCHATAI_AI_TEMPERATURE="0.7"
XCHATAI_AI_MAX_TOKENS="2048"
XCHATAI_AI_ENABLE_THINKING="false"
XCHATAI_AI_THINKING_BUDGET="1024"
XCHATAI_AI_THINKING_LEVEL="medium"
# Twitter / X 配置
XCHATAI_TWITTER_BEARER_TOKEN="your-bearer-token"
XCHATAI_TWITTER_API_KEY="your-api-key"
XCHATAI_TWITTER_API_SECRET="your-api-secret"
XCHATAI_TWITTER_ACCESS_TOKEN="your-access-token"
XCHATAI_TWITTER_ACCESS_SECRET="your-access-secret"pnpm dev默认访问:
http://localhost:3000
pnpm build
pnpm start系统登录依赖以下两个配置:
XCHATAI_AUTH_USERNAME="demo"
XCHATAI_AUTH_PASSWORD_MD5="<md5后的密码>"echo -n '你的明文密码' | md5echo -n '你的明文密码' | md5sumnode -e "console.log(require('crypto').createHash('md5').update('你的明文密码').digest('hex'))"注意:用户在登录页输入的是明文密码,服务端会将其计算为 MD5 后,与
.env中的哈希值进行比对。
- 打开系统后,如果未登录会自动跳转到
/login - 输入
.env中配置的用户名与对应明文密码
- 首次进入系统,如果缺少必要配置,会自动弹出配置窗口
- 填写 Twitter/X 与 AI 参数后保存
- 在左侧输入目标 Twitter/X 用户名
- 系统会拉取该账号资料与最近推文并创建本地会话
- 可以直接发问
- 也可以先引用某条推文,再基于该推文提问
- 回复内容会流式输出
会话文件示例:
{
"id": "test-user-001",
"name": "Annie Case",
"handle": "anniecase",
"bio": "Music creator, performer, and storyteller.",
"messageCount": 8,
"messages": [
{
"id": "tweet-1",
"role": "tweet",
"content": "A short reminder...",
"createdAt": "2026-04-13T02:08:14.757Z"
},
{
"id": "msg-1",
"role": "user",
"content": "你这句话是想表达什么?",
"createdAt": "2026-04-13T06:08:14.757Z"
},
{
"id": "msg-2",
"role": "assistant",
"content": "可以理解为...",
"createdAt": "2026-04-13T06:09:14.757Z"
}
]
}本项目基于 Apache License 2.0 开源发布。
- License 文件:
[LICENSE](./LICENSE) - 你可以自由使用、修改、分发和商用本项目,但需遵守 Apache-2.0 条款



