[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-84204":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":16,"stars7d":17,"stars30d":17,"stars90d":15,"forks30d":15,"starsTrendScore":18,"compositeScore":19,"rankGlobal":10,"rankLanguage":10,"license":10,"archived":20,"fork":20,"defaultBranch":21,"hasWiki":20,"hasPages":20,"topics":22,"createdAt":10,"pushedAt":10,"updatedAt":30,"readmeContent":31,"aiSummary":10,"trendingCount":15,"starSnapshotCount":15,"syncStatus":14,"lastSyncTime":32,"discoverSource":33},84204,"kaobuddy-pwa","jin-zi-xuan\u002Fkaobuddy-pwa","jin-zi-xuan","一个帮你科学临时抱佛脚的项目...","https:\u002F\u002Fkaobuddy-preview-production.up.railway.app\u002F",null,"TypeScript",120,13,2,0,6,38,50,75.24,false,"main",[23,24,25,26,27,28,29],"ai","byok","education","exam-prep","study-tool","vibe-coding","vibecoding","2026-06-12 04:01:43","# 考搭子 KaoBuddy\n\n> 一个给临时抱佛脚的人用的备考工作台。离考试还有两周？够用了。\u003Cimg width=\"2640\" height=\"1416\" alt=\"image\" src=\"https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002Fed685b20-3300-4ad0-8a90-a69c10616e53\" \u002F>\n\n\n你把课件、教材、往年题、笔记、PDF、手写照片、视频字幕扔进来，剩下的交给 AI——拆知识点、讲重点、出题、批改、生成模拟考、临考速背卡片。自己带 API Key，数据全在浏览器里，目前不搞账号，以后再弄。\n\n> 🚀 **在线预览**：[kaobuddy-preview-production.up.railway.app](https:\u002F\u002Fkaobuddy-preview-production.up.railway.app\u002F)\n> \n> 打开即用，不用装任何东西。手机电脑都能访问。\n\n---\n\n## 它解决什么问题\n\n大多数学习工具的假设是你有三个月时间、能每天打开电脑、愿意先花一天整理知识库。考搭子的假设刚好相反：**你离考试没几天了，只想把手上乱七八糟的资料快速变成能学的东西。**\n\n具体点说：\n\n- 课件 PDF、教材扫描件、课堂笔记（txt\u002Fmd\u002Fdocx）、手写拍照、B 站视频字幕——全都能吃进去。\n- AI 从资料里抽\"进程\"\"线程\"\"死锁\"\"银行家算法\"这种**知识点**，你可以选择自己安排学习计划或者切换日计划模式让ai带你无脑学习。\n- 按知识点模块推进，学完就点完成，圆环形进度条帮助你可视化进度。\n- 针对单个知识点讲解、生成学习卡片、出模拟题——不是泛泛的\"本章复习\"。\n- 考前生成模拟考，可自定义题型和时长，导出 PDF 打印，也可ai答题。但考虑到ai阅卷不太成熟，所以还有个答案速览模式，可以自行选择。\n- 最后的时间切到临考速背模式，背一个斩一个，帮你快速回顾知识点。\n\n---\n\n## 功能\n\n### 连接 AI\n\n内置四个预设，填 API Key 就能开始：\n\n| 预设 | 模型 |\n|---|---|\n| DeepSeek（默认） | deepseek-v4 pro\u002Fflash |\n| Kimi 国内 | kimi-k2.6 |\n| Kimi 国际 | kimi-k2.6 |\n| OpenAI | gpt-5.5\u002Fmini |\n| 自定义 | 任意 OpenAI-compatible |\n\n支持两种模式：\n- **BYOK（自带 Key）**：填自己的 API Key，请求直接从浏览器发到你的 AI 服务商。Key 存 localStorage，服务端不落盘。\n- **邀请码（beta）**：如果你有邀请码，可以先不填 Key，用服务端配置的 API 额度体验。用完再切换回你自己的API。\n\n### 创建考试项目\n\n填科目、考试日期、每天能学多久、目标分数、已知薄弱点。考搭子会根据这些信息来排优先级和估时——离考试越近、目标越高，知识点拆分得越细。\n\n### 资料库\n\n支持的格式：\n\n| 格式 | 方式 |\n|---|---|\n| PDF | 读取文字层（扫描版也能提取，图表和公式效果取决于模型） |\n| DOCX | 提取正文，mammoth 引擎 |\n| RTF | 提取文本 |\n| TXT \u002F Markdown | 直接读取 |\n| 旧 .doc | best-effort 解析（建议另存为 docx 或 PDF） |\n| 手写笔记 | 上传图片或手写 PDF → AI 视觉识别 → 转文字入库 |\n| B 站视频 | 粘贴链接 → 自动抓取公开信息和字幕 |\n\n文件在浏览器端解析，不上传到服务器。超大 PDF 用分片策略，每次只取一层文字，秒级读完。\n\n### 知识模块计划\n\n这是考搭子的核心。AI 根据你导入的资料，拆出\"进程同步\"\"银行家算法\"\"极限定义\"这种**可考的知识点**，每个模块带：\n\n- 知识点名称\n- 难度（低\u002F中\u002F高）\n- 重要程度排名\n- 考察内容（\"会考什么\"）\n- 资料来源和证据（\"资料里哪句话证明这个知识点存在\"）\n\n目标分数 ≥ 90 分时，AI 会按高覆盖率拆分：章节标题、二级标题、定义、机制、算法、典型题型、易错点，一个不落。\n\n### 每日计划\n\n拆分完知识点后，一键生成每日安排。AI 会根据剩余天数、每天可学时间、模块重要程度和难度，把模块均匀分配到每一天。逾期没学的模块自动滚到今天。\n\n两种视图：\n- **知识模块**：待学习 \u002F 学习中 \u002F 已学习，看板拖拽排序\n- **每日计划**：日历视图，每天学什么一目了然\n\n### 模块学习\n\n点进一个知识点，你可以：\n\n- **看讲解**：AI 用零基础语言讲这个知识点——先从生活直觉开始，再讲定义、原理、解题步骤，最后用资料里的例题演示\n- **出模拟题**：围绕这个知识点生成 3 道题，做完后可换一批\n- **学习卡片**：互动方式学习知识点。\n\n学完标记完成，进度条自动更新。\n\n### 模拟考\n\n自定义考试时长（5-180 分钟）和题型要求（\"选择题 + 简答题，偏计算\"），AI 严格按你导入的资料出题，不编造资料里没有的内容。\n\n两种模式：\n- **考题模式**：直接出卷子，考完 AI 逐题批改——选择题对答案字母，简答题按得分要点给分，措辞不要求完全一致\n- **AI 答题模式**：AI 先自己答一遍（展示它的解题思路），再对照你提交的答案批改\n\n每道题批改结果带标记：✓（正确）、✗（错误）、△（部分得分）。错题自动收入错题本。整份试卷导出成 A4 PDF。\n\n### 临考速背\n\n把知识点压成速背卡片，结构是：核心概念 → 必背要点 → 记忆口诀 → 常见考法 → 易错提醒。适合考前最后一天翻。\n\n### 学习卡片\n\n围绕指定知识点生成 4-6 张卡片，四种类型：\n\n| 类型 | 正面 | 背面 |\n|---|---|---|\n| concept（概念卡） | \"什么是死锁？\" | 一句话定义 + 考试要点 |\n| mistake（易错卡） | \"关于死锁，常见的错误是？\" | 易错点解释 |\n| exam（考试卡） | 一道简答题 | 参考答案 + 考试答法 |\n| quick_memory（速背卡） | \"记住死锁四条件\" | 精简口诀 |\n\n卡片流式生成——AI 出一张，你立刻就能翻一张。支持手势滑动，左滑不会、右滑会。第一轮筛下来的弱卡自动进入第二轮。\n\n### 错题本\n\n模拟考批改的错题自动入库，手动也能添加。薄弱点独立管理，带严重程度标记，可定期复习。也可以手动添加错题\n\n### 数据管理\n\n所有数据（项目、资料、计划、模块、错题、模拟考记录）存在浏览器 IndexedDB 里，不经过服务器。支持一键导出 JSON 备份，导入时自动合并。\n\n---\n\n## 怎么用\n\n### 已经部署好了（推荐）\n\n打开即用，啥都不用装：\n\n> **[kaobuddy-preview-production.up.railway.app](https:\u002F\u002Fkaobuddy-preview-production.up.railway.app\u002F)**\n\n考搭子跑在 Railway 上，手机电脑都能访问。\n\n### 自己电脑上跑\n\n**Mac**：双击 `open-kaobuddy.command`\n\n**Windows**：双击 `open-kaobuddy.bat`\n\n脚本会自动装依赖、启动服务、打开 `http:\u002F\u002F127.0.0.1:8000`。\n\n### 手动启动\n\n```bash\n# 后端\npython3 -m venv .venv\nsource .venv\u002Fbin\u002Factivate\npip install -e \".[test]\"\nuvicorn backend.app.main:app --port 8000\n\n# 前端开发\nnpm install\nnpm run dev          # 打开 http:\u002F\u002Flocalhost:5173，API 自动代理到 8000\n```\n\n### 自己部署\n\n```bash\n# Docker\ndocker build -t kaobuddy .\ndocker run -p 8080:8080 kaobuddy\n\n# Railway \n# 项目里已经有 Dockerfile + fly.toml + Procfile\n# 详细步骤见 DEPLOY.md\n```\n\n---\n\n## 技术栈\n\n| 层 | 技术 | 说明 |\n|---|---|---|\n| 前端框架 | React 19 + TypeScript | 严格模式，全类型覆盖 |\n| 构建 | Vite 6 | 输出到 `backend\u002Fstatic\u002F` |\n| UI | Motion (framer-motion) + Phosphor Icons | 手势动画 + 图标 |\n| PDF | pdfjs-dist（懒加载）+ jspdf + html2canvas | 读取 PDF 文字层，导出 A4 |\n| 文档解析 | mammoth + 自研旧 .doc 解析 | DOCX \u002F RTF \u002F .doc |\n| 后端框架 | FastAPI + uvicorn | 异步，流式 SSE |\n| AI 调用 | httpx + OpenAI-compatible 协议 | 支持所有兼容服务商 |\n| 存储 | IndexedDB + localStorage | 浏览器端，零服务端存储 |\n| 日志 | 结构化 JSON → stdout | 每行一条，含 request_id + 耗时 + 脱敏 |\n| 安全 | CSP 头 + SW 版本控制 + 邀请码验证 | 防 XSS，缓存自动刷新 |\n| PWA | Service Worker + Web Manifest | 可添加到主屏幕，离线兜底 |\n| 部署 | Docker 多阶段构建 | node:22 构建 → python:3.11 运行 |\n| CI\u002FCD | GitHub Actions | push\u002FPR 自动跑全量检查 |\n\n---\n\n## 项目结构\n\n```\n.\n├── backend\u002F\n│   ├── app\u002F\n│   │   ├── main.py          # FastAPI 应用 + 所有路由\n│   │   ├── ai_client.py     # AI 调用（chat + stream）\n│   │   ├── prompts.py       # System prompt 模板\n│   │   ├── schemas.py       # Pydantic 数据模型\n│   │   ├── invites.py       # 邀请码系统\n│   │   ├── video.py         # B 站视频信息抓取\n│   │   └── logging.py       # 结构化 JSON 日志\n│   └── static\u002F              # 前端构建产物（Vite 输出）\n├── src\u002F\n│   ├── App.tsx              # 主应用\n│   ├── api.ts               # 前端 API 层\n│   ├── storage.ts           # IndexedDB 封装 + 迁移\n│   ├── utils.ts             # 工具函数（解析、格式化、计划）\n│   ├── fileReaders.ts       # 文件读取（PDF\u002FDOCX\u002FRTF\u002F图片）\n│   ├── aiAuth.ts            # AI 认证模式解析\n│   ├── inviteState.ts       # 邀请码状态管理\n│   ├── generationGuards.ts  # 生成前置守卫\n│   ├── pdfExport.ts         # PDF 导出\n│   ├── useCardLearning.ts   # 卡片学习 Hook\n│   └── components\u002F\n│       ├── Common.tsx        # 通用组件（BrandMark \u002F StatusToast \u002F RenderText）\n│       └── ErrorBoundary.tsx # 错误边界\n├── tests\u002F\n│   ├── test_api.py          # 后端测试（21 个）\n│   └── frontend\u002F            # 前端测试（36 个）\n├── public\u002F                  # PWA 资源（sw.js \u002F manifest \u002F 图标）\n├── Dockerfile               # 多阶段 Docker 构建\n├── fly.toml                 # Fly.io 配置\n├── Procfile                 # Railway 配置\n├── pyproject.toml           # Python 项目定义\n├── requirements.txt         # Python 依赖\n├── vite.config.ts           # Vite 配置\n├── .github\u002Fworkflows\u002Fci.yml # CI\u002FCD\n└── index.html               # Vite 入口\n```\n\n---\n\n## 测试\n\n```bash\n# Python\n.venv\u002Fbin\u002Fpytest -q                      # 21 个测试\npython3 -m py_compile backend\u002Fapp\u002F*.py   # 语法检查\n\n# TypeScript\nnpx tsc --noEmit                         # 类型检查\n\n# 前端单元测试\nnode --import tsx --test tests\u002Ffrontend\u002F # 36 个测试\n\n# 构建检查\nnpx vite build                           # 确保能正常打包\n```\n\nGitHub Actions 在每次 push 和 PR 时自动跑上面全部。CI 文件见 `.github\u002Fworkflows\u002Fci.yml`。\n\n---\n\n## 配置\n\n### 环境变量（全部可选）\n\n| 变量 | 用途 | 默认值 |\n|---|---|---|\n| `PORT` | 服务端口 | 8080（Docker）\u002F 8000（本地） |\n| `ALLOWED_ORIGINS` | CORS 跨域来源（逗号分隔） | `localhost:5173`（本地开发） |\n| `KAOBUDDY_AI_BASE_URL` | 邀请码模式 AI 地址 | 无 |\n| `KAOBUDDY_AI_API_KEY` | 邀请码模式 AI Key | 无 |\n| `KAOBUDDY_AI_MODEL` | 邀请码模式模型名 | 无 |\n| `KAOBUDDY_AI_INPUT_CNY_PER_MILLION` | 邀请码计费：输入单价 | 无 |\n| `KAOBUDDY_AI_OUTPUT_CNY_PER_MILLION` | 邀请码计费：输出单价 | 无 |\n| `KAOBUDDY_INVITE_CODES` | 初始化新邀请码数据文件时使用的码列表（逗号分隔） | 无 |\n| `KAOBUDDY_INVITE_STORE_PATH` | 邀请码数据文件路径 | `work\u002Finvites.json` |\n| `KAOBUDDY_INVITE_MAX_INPUT_CHARS` | 邀请码请求上限（字符数） | 80000 |\n| `KAOBUDDY_INVITE_MAX_TOKENS` | 邀请码请求上限（token） | 6000 |\n\n同源部署 + 用户自带 Key 模式下，以上全部留空即可。\n\n如果 `KAOBUDDY_INVITE_STORE_PATH` 指向的文件已经存在，系统会继续读取里面原有的邀请码；`KAOBUDDY_INVITE_CODES` 只在第一次初始化新文件时使用，真实邀请码不要写进仓库。\n\n---\n\n## 一些边界\n\n- 不做账号系统、不做云同步、不搞付费。你的资料是你自己的，全在浏览器里。\n- API Key 存 localStorage，请求时从浏览器直接发到 AI 服务商。服务端代码开源，你可以自己审查 `backend\u002Fapp\u002Fai_client.py`——它就是个转发。\n- B 站视频只抓公开页面信息和字幕（best-effort），不下载视频、不需要登录。\n- 扫描版 PDF 的文字识别效果取决于文字层质量和你接的模型（多模态模型可以直接读图）。\n- 旧版 `.doc` 没有可靠的浏览器端解析器。建议用 Word\u002FWPS 另存为 `.docx` 或 PDF，省心很多。\n- 这是一个**备考工具**，不是通用笔记软件。不要期望它做思维导图、间隔重复（Anki 那种）或者协同编辑——这些事情有其他更好的工具做。\n\n---\n\n## 许可\n\nMIT\n","2026-06-11 04:12:34","CREATED_QUERY"]