OpenInterview 是一个面向 Java 后端和 AI 应用开发校招/实习准备的本地 AI 模拟面试工具。
项目定位很明确:每个人把项目拉到自己的电脑上,启动本地 API 和静态前端,填写自己的模型 URL、模型名和 API Key,然后开始练习。它默认不是公网 SaaS,不要求上传简历、语音或 API Key 到第三方服务端。
新用户可以先看 Quickstart。
当前公开入口先开放 Java 后端和 AI 应用开发。前端、测开、数据、算法、SRE、嵌入式等方向没有在目录里开放,避免题库深度不足时给用户错误预期;后续等题库质量跟上再恢复多方向入口。
Windows PowerShell:
cd OpenInterview
.\scripts\start-local.ps1脚本会自动做这些事:
- 找可用的本地端口,避免
8000或5173被占用。 - 检查 Python 版本、pip、端口和启动健康状态。
- 创建/复用
apps/api/.venv。 - 安装 API 依赖。
- 启动 FastAPI 后端和静态前端。
- 打印最终访问地址,例如:
http://127.0.0.1:5173/?api=http://127.0.0.1:8000
如果项目根目录存在 voice_venv,脚本会自动用它启动 API,以便本地 SenseVoice/CosyVoice 可用。如果你只想使用轻量文本环境,可以加:
.\scripts\start-local.ps1 -NoVoicePython启动失败时脚本会打印常见修复建议和日志路径。大多数问题集中在 Python 未安装、版本低于 3.10、PowerShell 执行策略、依赖安装失败或端口被占用。
- 打开脚本打印的前端地址。
- 在左侧“模型配置(本机保存)”里填写 LLM:
- Provider 模板:可选 OpenAI、DeepSeek、阿里云百炼 DashScope、SiliconFlow、Moonshot/Kimi、Ollama
- Provider:
openai_compatible - API Base:例如
https://api.openai.com/v1,或其他兼容/v1/chat/completions的地址 - Model:你的模型名
- API Key:你的 key
- 点击“测试 LLM”,确认模型能返回。
- 选择方向、难度、模式和面试官风格,开始面试。
LLM 测试失败时会显示错误类型和修复建议,例如 Key 错、模型不存在、Base URL 不匹配、额度不足、超时或返回格式不兼容。真实 LLM 调用失败或返回空内容时,默认不会静默回退到 Mock;只有手动开启“LLM 失败时允许 Mock 回退(仅开发调试)”才会降级。
ASR/TTS 默认走浏览器能力,文本面试不依赖本地语音。建议第一次先只跑文本。需要语音时,可在配置区点击“测试 ASR”“测试 TTS”或“语音自检”确认浏览器/本地语音环境。完整模型配置教程见 Voice Setup。
综合评估:自我介绍、项目、八股基础、场景/系统设计、反问。单纯八股:集中刷计算机基础和方向知识点,适合配合 JavaGuide 查漏补缺。简历拷打:自动拆项目卡片,围绕个人贡献、虚假/模糊表述、指标来源、技术选型、故障风险和复盘连续追问。系统设计专项:训练需求澄清、模块拆分、容量估算、架构取舍和验证方案。
中小厂基础型:按真实一面节奏平衡基础、项目和工程常识。八股连环追问型:围绕当前方向高频知识点连续追问原理、边界和误区。项目真实性拷打型:验证简历项目是否真做过,重点追个人贡献、指标来源、选型依据和故障复盘。系统设计型:把场景题推向需求澄清、容量估算、模块拆分、可用性和风险兜底。
模式决定面试流程,风格决定追问口径。比如可以用 单纯八股 + 八股连环追问型 查漏补缺,也可以用 简历拷打 + 项目真实性拷打型 专门压测项目真实性。
报告会生成复练题、推荐回答结构、示例答案和题目学习卡。学习卡包含参考答案、常见错误、面试官追问点、低分回答 vs 高分回答、关联知识点。逐题复盘还会展示命中评分点、缺失评分点、评分证据和重答建议,方便把一次模拟沉淀成后续复习清单。
题库主要从 D:\JavaGuide 的 Java 后端、数据库、缓存、分布式、高可用、高性能、系统设计和 AI 目录改写为面试题。当前 Java 后端方向 700+ 题,AI 应用开发方向 250+ 题;覆盖页会对 Java 后端核心 topic 使用更高阈值,对补充 topic 使用轻量阈值,避免非核心小类目干扰复习优先级。
如本机更新了 JavaGuide,可重新生成批量题库:
python .\scripts\generate_javaguide_questions.py --javaguide-root D:\JavaGuide支持直接粘贴文本,也支持本地导入:
.txt.md.docx.pdf
文件只会发送到本机 API 做文本提取,不会上传公网服务。扫描版图片 PDF 可能无法提取文字,建议先复制成文本。
面试历史保存在本机 SQLite:
data/openinterview.sqlite
前端“历史”入口支持:
- 打开历史报告。
- 只看复练题。
- 导出单次 Markdown 报告。
- 将低分题和缺口加入错题本。
- 导出历史为 JSON。
- 从 JSON 导入历史。
- 清空全部面试历史。
导出 JSON 会包含报告缓存、回答记录、转写、trace 和错题本,适合换电脑或升级前备份。导入历史只写入本机 SQLite;同 ID 的旧记录会被导入文件覆盖。清空历史只删除面试记录、报告、转写和 trace,不会清空浏览器里的模型配置。
前端顶部提供:
错题本:集中查看待复习题、重答建议和缺失评分点,可标记待复习、复练中、已掌握。题库覆盖:按当前方向主题统计题量、追问覆盖和评分点覆盖,用来判断下一步该补哪些题。
历史记录里的“入错题本”会从报告中提取低分题、缺失评分点和重答建议,适合做长期复练。
- 模型配置保存在当前浏览器
localStorage。 - 后端历史保存在本机 SQLite。
- API 默认绑定
127.0.0.1。 - 不建议把前端或 API 暴露到公网。
- 历史记录里的 API Key 会脱敏保存,重启后打开旧报告会优先使用缓存报告。
后端:
cd OpenInterview\apps\api
python -m venv .venv
.\.venv\Scripts\Activate.ps1
pip install -e .
python -m uvicorn openinterview_api.main:app --host 127.0.0.1 --port 8000前端:
cd OpenInterview\apps\web
python -m http.server 5173 --bind 127.0.0.1访问:
http://127.0.0.1:5173/?api=http://127.0.0.1:8000
| 能力 | Provider | 默认 | 说明 |
|---|---|---|---|
| LLM | openai_compatible |
是 | 调用 /v1/chat/completions |
| LLM | ollama |
否 | 调用本地 Ollama /api/chat |
| LLM | mock |
否 | 离线开发和测试用 |
| ASR | browser |
是 | 浏览器内置语音识别 |
| ASR | openai_compatible |
否 | 调用 /v1/audio/transcriptions |
| ASR | sensevoice |
否 | 本地 SenseVoice,可选重型 runtime |
| TTS | browser |
是 | 浏览器内置语音合成 |
| TTS | openai_compatible |
否 | 调用 /v1/audio/speech |
| TTS | cosyvoice |
否 | 本地 CosyVoice,可选重型 runtime |
本地语音不是核心路径。只有当你希望离线 ASR/TTS 时,才需要下载和配置模型。普通用户优先使用页面里的“语音配置向导”:浏览器语音不需要填写任何模型;云端语音只填 URL、Model、Key;本地模型只填 VAD、SenseVoice、CosyVoice 模型目录和 CosyVoice runtime 路径。
当前适配的本地模型路径:
models/vad/silero-vad/silero_vad.onnxmodels/asr/SenseVoiceSmallmodels/tts/Fun-CosyVoice3-0.5B
使用 /v1/readiness 检查 ffmpeg、模型文件、FunASR、CosyVoice 和 CUDA 状态。使用 /v1/readiness/smoke?include_voice=true 可以做语音冒烟测试。
一键准备语音环境:
.\scripts\setup-voice.ps1如需同时下载推荐 ASR/TTS 模型:
.\scripts\setup-voice.ps1 -DownloadModels页面向导保存的本地模型路径会写入 configs/voice-models.local.yaml,也可以通过环境变量覆盖;音色可以通过 configs/voice-profiles.local.yaml 自定义。详细步骤见 Voice Setup。
GET /healthGET /v1/catalogGET /v1/readinessGET /v1/voice/configPOST /v1/voice/configPOST /v1/providers/llm/testGET /v1/questionsPOST /v1/resume/analyzePOST /v1/resume/extractGET /v1/questions/coverageGET /v1/interviews/{session_id}/report.mdPOST /v1/interviews/{session_id}/review-itemsGET /v1/review-itemsPATCH /v1/review-items/{item_id}POST /v1/interviewsPOST /v1/interviews/{session_id}/turnGET /v1/interviews/{session_id}/reportGET /v1/interviewsGET /v1/interviews/exportPOST /v1/interviews/importDELETE /v1/interviewsDELETE /v1/interviews/{session_id}GET /v1/metricsPOST /v1/realtime/sessionsPOST /v1/realtime/sessions/{session_id}/eventsPOST /v1/vad/detectPOST /v1/asr/transcribePOST /v1/tts/speech
SQLite 会在 API 启动时自动做轻量迁移。当前迁移策略只做向后兼容字段补齐,例如给旧 turns 表补 question_meta_json。
升级前可以在前端导出历史 JSON。遇到无法恢复的本地测试数据,也可以在前端清空历史后重新开始。
cd OpenInterview
$env:PYTHONPATH="D:\OpenInterview\apps\api"
python -m unittest apps.api.tests.test_engine apps.api.tests.test_api
node --check apps/web/app.js
.\voice_venv\Scripts\python.exe -m ruff check apps\api\openinterview_api apps\api\testsOpenInterview/
apps/
api/ FastAPI 后端、面试编排器、模型适配器
web/ 零构建静态前端
configs/ provider 和语音配置样例
data/ 本地 SQLite 数据
docs/ 架构、路线图、模型接入说明
scripts/ 本地启动和工具脚本
MIT