面试辅助平台

Intervista++ 是一个基于人工智能的模拟面试平台,通过整合候选人背景信息、动态生成技术及行为问题、语音交互和反馈评分等功能,帮助用户进行高效的面试准备。

  • by PNair05
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 PNair05/interview_prep_mcp

使用说明

Intervista++(MCP面试助理)

自适应、情境感知的模拟面试平台,利用Gemini(谷歌)、LangGraph ReAct Agent、ElevenLabs语音和MongoDB。

特性

  • 聚合候选人背景:GitHub、简历(PDF或Notion)、招聘信息抓取、精心策划的面试信息。
  • 动态LangGraph ReAct代理(Gemini)生成和调整技术+行为问题。
  • 语音交互:ElevenLabs TTS(人物角色)+Scribe STT。
  • 反馈引擎评分技术正确,STAR结构清晰。
  • 通过MongoDB Atlas实现持久化;可选的雪花摄入存根。
  • FastAPI服务器为外部工具公开MCP风格的端点。
  • 准备好进行Vultr部署(下一步添加容器化+infraIaC)。

架构概述

client ⇄ FastAPI (server.py)
          ├─ context_aggregator.py (GitHub, resume, job, intel)
          ├─ ai_engine.py (LangGraph ReAct + Gemini)
          ├─ voice_interface.py (ElevenLabs)
          ├─ feedback.py (scoring)
          └─ database.py (MongoDB / Snowflake stub)

端点

方法 路径 描述
POST /start_session 构建上下文并返回初始问题
POST /subit_audio 转录、分析答案、反馈、下一个问题
GET /GET_feedback/{session_id} 检索所有反馈块
GET /GET_analytics/{candidate_id} 候选人的基本分析
POST /start_coding_challenge (Stub)提供编码挑战沙盒
GET /health 健康探测

环境变量

GOOGLE_API_KEY=your_google_genai_key
XI_API_KEY=your_elevenlabs_key
XI_VOICE_ID=Rachel # or voice ID slug
MONGODB_URI=mongodb+srv://...
MONGODB_DB=intervista
SNOWFLAKE_ACCOUNT=... (optional)
SNOWFLAKE_USER=...
SNOWFLAKE_PASSWORD=...

安装并运行

python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
uvicorn server:app --host 0.0.0.0 --port 8000 --reload

示例流程

  1. 带有候选人+角色元数据的POST/start_session。
  2. 接收会话id+初始问题。
  3. 用户记录答案→ 客户端将base64音频发送到/submit_audio。
  4. 服务器返回成绩单、结构化代理分析、反馈、跟进问题。
  5. 重复直到会话结束;获取分析和反馈。

LangGraph重新动作注释

  • 工具:get_context,estimate_thazard。
  • 代理提示强制JSON输出;回退启发式解析列表/对象。
  • 使用其他工具(例如“search_code”、“system_design_reference”)进行扩展,以获得更丰富的面试内容。

缩放/下一步

  • 添加Redis或Postgres进行会话状态缓存。
  • 实现生产级简历解析器(例如,文本分类、通过嵌入进行技能提取)。
  • 引入沙盒容器编排(Vultr上的Docker+Firecracker微虚拟机)。
  • 添加结构化日志记录(OpenTetry)和跟踪。
  • 执行Snowflake批处理ETL作业(APScheduler每晚运行)。
  • 添加身份验证和速率限制。
  • 扩展分析(每个答案的延迟、技能差距热图)。

MCP集成

此FastAPI应用程序现在在以下位置公开JSON-RPC WebSocket端点 /mcp 实现最小MCP适配器。

WebSocket端点

ws://<host>:8000/mcp

支持的方法

  • tools/list → 返回工具目录
  • tools/call → 按名称和参数调用工具

工具

名称 目的
start_session 构建上下文并返回会话_id+初始问题
submit_audio 转录音频、分析答案、返回反馈
get_feedback 列出会话的反馈块
get_analytics 候选人分析摘要
speak 文本转语音(base64音频)

JSON-RPC请求示例

列出工具:

{ "jsonrpc": "2.0", "id": 1, "method": "tools/list" }

开始会话:

{
  "jsonrpc": "2.0",
  "id": 2,
  "method": "tools/call",
  "params": {
    "name": "start_session",
    "arguments": {
      "candidate_id": "cand_123",
      "role": "Backend Engineer",
      "company": "Acme",
      "github_user": "octocat",
      "years_experience": 4
    }
  }
}

提交音频:

{
    "jsonrpc": "2.0",
    "id": 3,
    "method": "tools/call",
    "params": {
        "name": "submit_audio",
        "arguments": {
            "session_id": "<returned_id>
            ", "audio_base64": "<wav_base64>"
        }
    }
}

客户端草图(Python)

import asyncio, websockets, json, base64

async def main():
        async with websockets.connect("ws://localhost:8000/mcp") as ws:
                await ws.send(json.dumps({"jsonrpc":"2.0","id":1,"method":"tools/list"}))
                print(await ws.recv())
                start = {"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"start_session","arguments":{"candidate_id":"c1","role":"ML Engineer","company":"Acme","years_experience":3}}}
                await ws.send(json.dumps(start))
                print(await ws.recv())

asyncio.run(main())

此适配器可以扩展以支持流令牌、取消和更丰富的MCP规范功能。

免责声明

该框架包括启发式解析和简化评分以供演示;生产使用应加强安全性、验证和错误处理。

许可证

MIT(根据需要调整)