一个根据你的身份、兴趣爱好和关注内容不断成长的个人知识仓库。
收集文章、学习资料、项目文档或网页链接 → Kimi 自动生成摘要、标签、核心观点和学习建议 → 通过阅读、收藏与反馈,推荐内容会持续进化,形成「收集内容 — 理解内容 — 建立关联 — 持续更新」的自增长闭环。
- 🪪 个人画像:设置身份、专业、兴趣标签和关注主题
- 📥 多种内容来源:直接粘贴文本 / Markdown,或输入网页链接自动抓取正文
- 🤖 AI 分析(Kimi API):生成摘要、关键词标签、核心观点、内容分类、相关主题、下一步学习建议
- 🃏 知识卡片:结构化展示分析结果,支持展开、收藏、修改标签、删除
- 🧭 推荐主题:基于透明的本地评分算法(标签权重),随你的行为自动调整
- 👍 反馈闭环:点击「有帮助 / 不相关」直接影响推荐结果
- 💾 本地优先:所有数据存在浏览器 localStorage,无需数据库、无需登录
- 🧪 Demo 模式:未配置 API Key 时使用本地示例数据,项目照常运行
- Next.js(App Router)+ TypeScript
- Tailwind CSS v4
- Vitest(推荐算法单元测试)
- 无数据库、无登录系统、无向量数据库
# 1. 安装依赖
npm install
# 2.(可选)配置 Kimi API Key
cp .env.example .env.local
# 编辑 .env.local,填入你的 KIMI_API_KEY
# 3. 启动开发服务器
npm run dev打开 http://localhost:3000 即可使用。
npm run test测试验证推荐权重会根据用户反馈(有帮助 / 不相关)发生变化,见 __tests__/recommend.test.ts。
如果没有配置 KIMI_API_KEY,项目会自动进入 Demo 模式:
/api/analyze返回本地启发式分析结果(lib/demo-analysis.ts),不调用任何外部服务- 界面顶部会显示 Demo 模式提示
- 添加内容、知识卡片、推荐主题、反馈闭环等所有功能均可正常体验
配置真实 Key 后刷新页面即可切换到 AI 分析。
Kimi API 由 Moonshot AI 提供,采用 OpenAI 兼容格式。本项目在服务端直接 fetch 调用(不依赖 SDK):
- 接口:
POST https://api.moonshot.ai/v1/chat/completions - 鉴权:请求头
Authorization: Bearer <KIMI_API_KEY> - 默认模型:
kimi-k2.6(可通过KIMI_MODEL覆盖) - 文档:https://platform.kimi.ai/docs/api-reference
调用流程(lib/kimi.ts):
- 服务端将用户提交的标题和内容(截断到 2 万字符)连同 system prompt 发给 Kimi
- 要求模型只返回 JSON(摘要 / 标签 / 核心观点 / 分类 / 相关主题 / 下一步建议)
- 对返回内容做容错解析(剥离 markdown 代码块、提取最外层花括号)
- 60 秒超时保护,失败时返回明确错误信息
API Key 只在服务端读取(process.env.KIMI_API_KEY),不会打包进前端代码。
| 变量 | 必填 | 说明 |
|---|---|---|
KIMI_API_KEY |
否 | Kimi API 密钥,不填则进入 Demo 模式 |
KIMI_MODEL |
否 | 模型名称,默认 kimi-k2.6 |
KIMI_BASE_URL |
否 | API 基础地址,默认 https://api.moonshot.ai/v1 |
├── app/
│ ├── layout.tsx # 根布局(中文 lang、页面元信息)
│ ├── page.tsx # 知识工作台主页面(客户端状态管理)
│ ├── globals.css
│ └── api/
│ ├── analyze/route.ts # 内容分析:有 Key 走 Kimi,无 Key 走 Demo
│ └── fetch-url/route.ts # 网页链接正文抓取(服务端,避免 CORS)
├── components/
│ ├── Sidebar.tsx # 左侧导航
│ ├── ProfilePanel.tsx # 右侧个人画像 / 学习进度 / 推荐主题
│ ├── KnowledgeCard.tsx # 知识卡片
│ ├── AddContentDialog.tsx # 添加内容对话框
│ ├── TagEditor.tsx # 标签编辑器
│ ├── SimpleChart.tsx # 学习进度条(无图表库)
│ └── EmptyState.tsx # 空状态
├── lib/
│ ├── types.ts # 数据类型定义
│ ├── storage.ts # localStorage 读写(含错误处理)
│ ├── recommend.ts # 标签权重评分与推荐算法
│ ├── kimi.ts # Kimi API 服务端封装
│ ├── demo-analysis.ts # Demo 模式本地分析
│ └── demo-data.ts # 示例数据
├── __tests__/recommend.test.ts # 推荐算法测试
├── .env.example
├── LICENSE # MIT
└── README.md
第一版使用简单、透明、可解释的本地评分(lib/recommend.ts):
| 行为 | 对标签权重的影响 |
|---|---|
| 阅读条目 | +2 |
| 收藏条目 | +2 |
| 点击「有帮助」 | +1 |
| 点击「不相关」 | −3 |
- 权重限制在 [-10, 20],负权重标签不会再出现在推荐中
- 与用户兴趣 / 关注主题匹配的标签额外 +1.5
- 推荐主题来自知识卡片的标签与关联主题,按总分排序
// ponytail: simple local scoring; replace with embeddings/vector search only when scale requires it- 所有用户数据(内容、分析结果、个人信息、标签权重)仅保存在你自己的浏览器 localStorage 中,不会上传到任何服务器,项目也没有任何数据收集
- 点击「添加并分析」时,你粘贴的标题和内容会通过本项目自己的 API 路由转发给 Kimi API 用于生成分析,除此之外不发送到任何第三方
- 网页抓取功能由服务端代为请求你提供的 URL
- 清除浏览器数据(或使用页内删除按钮)即可彻底删除所有本地数据
- 请勿在公开部署实例中粘贴敏感个人信息
任意支持 Next.js 的平台均可部署(如 Vercel):
- 将代码推送到 GitHub
- 在平台中导入仓库
- 在环境变量设置中添加
KIMI_API_KEY(如需要) - 部署完成
注意:部署到公网后,用户数据仍只存在各自浏览器本地,但
/api/analyze会消耗你账号的 Kimi API 额度,建议只部署给个人或小范围使用。
npm run test包含的最小测试验证:正向反馈提高标签权重、负向反馈降低权重并将其移出推荐、反馈变化会改变推荐排序。