Skip to content

jin-zi-xuan/kaobuddy-pwa

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

82 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

考搭子 KaoBuddy

一个给临时抱佛脚的人用的备考工作台。离考试还有两周?够用了。image

你把课件、教材、往年题、笔记、PDF、手写照片、视频字幕扔进来,剩下的交给 AI——拆知识点、讲重点、出题、批改、生成模拟考、临考速背卡片。自己带 API Key,数据全在浏览器里,目前不搞账号,以后再弄。

🚀 在线预览kaobuddy-preview-production.up.railway.app

打开即用,不用装任何东西。手机电脑都能访问。


它解决什么问题

大多数学习工具的假设是你有三个月时间、能每天打开电脑、愿意先花一天整理知识库。考搭子的假设刚好相反:你离考试没几天了,只想把手上乱七八糟的资料快速变成能学的东西。

具体点说:

  • 课件 PDF、教材扫描件、课堂笔记(txt/md/docx)、手写拍照、B 站视频字幕——全都能吃进去。
  • AI 从资料里抽"进程""线程""死锁""银行家算法"这种知识点,你可以选择自己安排学习计划或者切换日计划模式让ai带你无脑学习。
  • 按知识点模块推进,学完就点完成,圆环形进度条帮助你可视化进度。
  • 针对单个知识点讲解、生成学习卡片、出模拟题——不是泛泛的"本章复习"。
  • 考前生成模拟考,可自定义题型和时长,导出 PDF 打印,也可ai答题。但考虑到ai阅卷不太成熟,所以还有个答案速览模式,可以自行选择。
  • 最后的时间切到临考速背模式,背一个斩一个,帮你快速回顾知识点。

功能

连接 AI

内置四个预设,填 API Key 就能开始:

预设 模型
DeepSeek(默认) deepseek-v4 pro/flash
Kimi 国内 kimi-k2.6
Kimi 国际 kimi-k2.6
OpenAI gpt-5.5/mini
自定义 任意 OpenAI-compatible

支持两种模式:

  • BYOK(自带 Key):填自己的 API Key,请求直接从浏览器发到你的 AI 服务商。Key 存 localStorage,服务端不落盘。
  • 邀请码(beta):如果你有邀请码,可以先不填 Key,用服务端配置的 API 额度体验。用完再切换回你自己的API。

创建考试项目

填科目、考试日期、每天能学多久、目标分数、已知薄弱点。考搭子会根据这些信息来排优先级和估时——离考试越近、目标越高,知识点拆分得越细。

资料库

支持的格式:

格式 方式
PDF 读取文字层(扫描版也能提取,图表和公式效果取决于模型)
DOCX 提取正文,mammoth 引擎
RTF 提取文本
TXT / Markdown 直接读取
旧 .doc best-effort 解析(建议另存为 docx 或 PDF)
手写笔记 上传图片或手写 PDF → AI 视觉识别 → 转文字入库
B 站视频 粘贴链接 → 自动抓取公开信息和字幕

文件在浏览器端解析,不上传到服务器。超大 PDF 用分片策略,每次只取一层文字,秒级读完。

知识模块计划

这是考搭子的核心。AI 根据你导入的资料,拆出"进程同步""银行家算法""极限定义"这种可考的知识点,每个模块带:

  • 知识点名称
  • 难度(低/中/高)
  • 重要程度排名
  • 考察内容("会考什么")
  • 资料来源和证据("资料里哪句话证明这个知识点存在")

目标分数 ≥ 90 分时,AI 会按高覆盖率拆分:章节标题、二级标题、定义、机制、算法、典型题型、易错点,一个不落。

每日计划

拆分完知识点后,一键生成每日安排。AI 会根据剩余天数、每天可学时间、模块重要程度和难度,把模块均匀分配到每一天。逾期没学的模块自动滚到今天。

两种视图:

  • 知识模块:待学习 / 学习中 / 已学习,看板拖拽排序
  • 每日计划:日历视图,每天学什么一目了然

模块学习

点进一个知识点,你可以:

  • 看讲解:AI 用零基础语言讲这个知识点——先从生活直觉开始,再讲定义、原理、解题步骤,最后用资料里的例题演示
  • 出模拟题:围绕这个知识点生成 3 道题,做完后可换一批
  • 学习卡片:互动方式学习知识点。

学完标记完成,进度条自动更新。

模拟考

自定义考试时长(5-180 分钟)和题型要求("选择题 + 简答题,偏计算"),AI 严格按你导入的资料出题,不编造资料里没有的内容。

两种模式:

  • 考题模式:直接出卷子,考完 AI 逐题批改——选择题对答案字母,简答题按得分要点给分,措辞不要求完全一致
  • AI 答题模式:AI 先自己答一遍(展示它的解题思路),再对照你提交的答案批改

每道题批改结果带标记:✓(正确)、✗(错误)、△(部分得分)。错题自动收入错题本。整份试卷导出成 A4 PDF。

临考速背

把知识点压成速背卡片,结构是:核心概念 → 必背要点 → 记忆口诀 → 常见考法 → 易错提醒。适合考前最后一天翻。

学习卡片

围绕指定知识点生成 4-6 张卡片,四种类型:

类型 正面 背面
concept(概念卡) "什么是死锁?" 一句话定义 + 考试要点
mistake(易错卡) "关于死锁,常见的错误是?" 易错点解释
exam(考试卡) 一道简答题 参考答案 + 考试答法
quick_memory(速背卡) "记住死锁四条件" 精简口诀

卡片流式生成——AI 出一张,你立刻就能翻一张。支持手势滑动,左滑不会、右滑会。第一轮筛下来的弱卡自动进入第二轮。

错题本

模拟考批改的错题自动入库,手动也能添加。薄弱点独立管理,带严重程度标记,可定期复习。也可以手动添加错题

数据管理

所有数据(项目、资料、计划、模块、错题、模拟考记录)存在浏览器 IndexedDB 里,不经过服务器。支持一键导出 JSON 备份,导入时自动合并。


怎么用

已经部署好了(推荐)

打开即用,啥都不用装:

kaobuddy-preview-production.up.railway.app

考搭子跑在 Railway 上,手机电脑都能访问。

自己电脑上跑

Mac:双击 open-kaobuddy.command

Windows:双击 open-kaobuddy.bat

脚本会自动装依赖、启动服务、打开 http://127.0.0.1:8000

手动启动

# 后端
python3 -m venv .venv
source .venv/bin/activate
pip install -e ".[test]"
uvicorn backend.app.main:app --port 8000

# 前端开发
npm install
npm run dev          # 打开 http://localhost:5173,API 自动代理到 8000

自己部署

# Docker
docker build -t kaobuddy .
docker run -p 8080:8080 kaobuddy

# Railway 
# 项目里已经有 Dockerfile + fly.toml + Procfile
# 详细步骤见 DEPLOY.md

技术栈

技术 说明
前端框架 React 19 + TypeScript 严格模式,全类型覆盖
构建 Vite 6 输出到 backend/static/
UI Motion (framer-motion) + Phosphor Icons 手势动画 + 图标
PDF pdfjs-dist(懒加载)+ jspdf + html2canvas 读取 PDF 文字层,导出 A4
文档解析 mammoth + 自研旧 .doc 解析 DOCX / RTF / .doc
后端框架 FastAPI + uvicorn 异步,流式 SSE
AI 调用 httpx + OpenAI-compatible 协议 支持所有兼容服务商
存储 IndexedDB + localStorage 浏览器端,零服务端存储
日志 结构化 JSON → stdout 每行一条,含 request_id + 耗时 + 脱敏
安全 CSP 头 + SW 版本控制 + 邀请码验证 防 XSS,缓存自动刷新
PWA Service Worker + Web Manifest 可添加到主屏幕,离线兜底
部署 Docker 多阶段构建 node:22 构建 → python:3.11 运行
CI/CD GitHub Actions push/PR 自动跑全量检查

项目结构

.
├── backend/
│   ├── app/
│   │   ├── main.py          # FastAPI 应用 + 所有路由
│   │   ├── ai_client.py     # AI 调用(chat + stream)
│   │   ├── prompts.py       # System prompt 模板
│   │   ├── schemas.py       # Pydantic 数据模型
│   │   ├── invites.py       # 邀请码系统
│   │   ├── video.py         # B 站视频信息抓取
│   │   └── logging.py       # 结构化 JSON 日志
│   └── static/              # 前端构建产物(Vite 输出)
├── src/
│   ├── App.tsx              # 主应用
│   ├── api.ts               # 前端 API 层
│   ├── storage.ts           # IndexedDB 封装 + 迁移
│   ├── utils.ts             # 工具函数(解析、格式化、计划)
│   ├── fileReaders.ts       # 文件读取(PDF/DOCX/RTF/图片)
│   ├── aiAuth.ts            # AI 认证模式解析
│   ├── inviteState.ts       # 邀请码状态管理
│   ├── generationGuards.ts  # 生成前置守卫
│   ├── pdfExport.ts         # PDF 导出
│   ├── useCardLearning.ts   # 卡片学习 Hook
│   └── components/
│       ├── Common.tsx        # 通用组件(BrandMark / StatusToast / RenderText)
│       └── ErrorBoundary.tsx # 错误边界
├── tests/
│   ├── test_api.py          # 后端测试(21 个)
│   └── frontend/            # 前端测试(36 个)
├── public/                  # PWA 资源(sw.js / manifest / 图标)
├── Dockerfile               # 多阶段 Docker 构建
├── fly.toml                 # Fly.io 配置
├── Procfile                 # Railway 配置
├── pyproject.toml           # Python 项目定义
├── requirements.txt         # Python 依赖
├── vite.config.ts           # Vite 配置
├── .github/workflows/ci.yml # CI/CD
└── index.html               # Vite 入口

测试

# Python
.venv/bin/pytest -q                      # 21 个测试
python3 -m py_compile backend/app/*.py   # 语法检查

# TypeScript
npx tsc --noEmit                         # 类型检查

# 前端单元测试
node --import tsx --test tests/frontend/ # 36 个测试

# 构建检查
npx vite build                           # 确保能正常打包

GitHub Actions 在每次 push 和 PR 时自动跑上面全部。CI 文件见 .github/workflows/ci.yml


配置

环境变量(全部可选)

变量 用途 默认值
PORT 服务端口 8080(Docker)/ 8000(本地)
ALLOWED_ORIGINS CORS 跨域来源(逗号分隔) localhost:5173(本地开发)
KAOBUDDY_AI_BASE_URL 邀请码模式 AI 地址
KAOBUDDY_AI_API_KEY 邀请码模式 AI Key
KAOBUDDY_AI_MODEL 邀请码模式模型名
KAOBUDDY_AI_INPUT_CNY_PER_MILLION 邀请码计费:输入单价
KAOBUDDY_AI_OUTPUT_CNY_PER_MILLION 邀请码计费:输出单价
KAOBUDDY_INVITE_CODES 初始化新邀请码数据文件时使用的码列表(逗号分隔)
KAOBUDDY_INVITE_STORE_PATH 邀请码数据文件路径 work/invites.json
KAOBUDDY_INVITE_MAX_INPUT_CHARS 邀请码请求上限(字符数) 80000
KAOBUDDY_INVITE_MAX_TOKENS 邀请码请求上限(token) 6000

同源部署 + 用户自带 Key 模式下,以上全部留空即可。

如果 KAOBUDDY_INVITE_STORE_PATH 指向的文件已经存在,系统会继续读取里面原有的邀请码;KAOBUDDY_INVITE_CODES 只在第一次初始化新文件时使用,真实邀请码不要写进仓库。


一些边界

  • 不做账号系统、不做云同步、不搞付费。你的资料是你自己的,全在浏览器里。
  • API Key 存 localStorage,请求时从浏览器直接发到 AI 服务商。服务端代码开源,你可以自己审查 backend/app/ai_client.py——它就是个转发。
  • B 站视频只抓公开页面信息和字幕(best-effort),不下载视频、不需要登录。
  • 扫描版 PDF 的文字识别效果取决于文字层质量和你接的模型(多模态模型可以直接读图)。
  • 旧版 .doc 没有可靠的浏览器端解析器。建议用 Word/WPS 另存为 .docx 或 PDF,省心很多。
  • 这是一个备考工具,不是通用笔记软件。不要期望它做思维导图、间隔重复(Anki 那种)或者协同编辑——这些事情有其他更好的工具做。

许可

MIT