Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 41 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
name: CI

on:
push:
branches: [main]
pull_request:
branches: [main]

jobs:
lint-and-typecheck:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- uses: actions/setup-node@v4
with:
node-version: 20
cache: npm

- run: npm ci

- name: ESLint
run: npm run lint

- name: TypeScript
run: npx tsc --noEmit

test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- uses: actions/setup-node@v4
with:
node-version: 20
cache: npm

- run: npm ci

- name: Unit Tests
run: npm test
13 changes: 8 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ Interviewers schedule interviews once — the bot handles everything else: resea
- **Fully automated interview** — the candidate chats with the bot on Telegram; the bot asks questions, follows up dynamically, and adapts in real time
- **Smart evaluation report** — after the interview, a structured report with per-dimension scores and a hire/no-hire recommendation is sent to the interviewer
- **Reminders & notifications** — candidate is reminded 15 minutes before, and notified automatically when it's time to start
- **Smart self-introduction analysis** — before the interview begins, the bot collects a self-introduction from the candidate, extracts tech stack and experience via AI, and dynamically adjusts question focus and depth

## Interview Dimensions

Expand Down Expand Up @@ -94,7 +95,8 @@ The system will automatically collect research and generate questions 2 hours be
1. Send `/start` to the bot first — required so the bot can reach you proactively
2. The bot will notify you when it's time for your interview
3. You can also send `/begin` after the scheduled time to start immediately
4. Just reply in the chat to answer questions
4. The bot will ask for a self-introduction first — your background helps tailor the questions
5. Just reply in the chat to answer questions

## Architecture

Expand All @@ -107,7 +109,7 @@ src/
├── parser.ts # Natural language parsing (extract scheduling info)
├── db.ts # SQLite persistence (sql.js)
├── config.ts # Environment variable config
└── types.ts # TypeScript type definitions
└── types.ts # TypeScript type definitions (InterviewPhase, CandidateProfile, etc.)
```

**Stack:**
Expand All @@ -121,8 +123,8 @@ src/
## Interview Status Flow

```
pending → researching → ready → notified → in_progress → completed
↘ cancelled
pending → researching → ready → notified → intro → in_progress → completed
↘ cancelled
```

| Status | Description |
Expand All @@ -131,7 +133,8 @@ pending → researching → ready → notified → in_progress → completed
| `researching` | Collecting research and generating questions |
| `ready` | Questions ready, waiting for interview time |
| `notified` | Candidate notified, waiting for them to start |
| `in_progress` | Interview in progress |
| `intro` | Collecting candidate self-introduction and analyzing background |
| `in_progress` | Interview in progress (questions tailored to candidate's profile) |
| `completed` | Interview finished, report sent |
| `cancelled` | Cancelled |

Expand Down
13 changes: 8 additions & 5 deletions README.zh.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
- **全程自动面试**:候选人通过 Telegram 与机器人对话完成面试,支持追问和动态调整
- **智能评估报告**:面试结束后自动生成结构化评估报告,包含各维度评分和录用建议,发送给面试官
- **候选人提醒**:面试前 15 分钟自动提醒候选人,到时间自动发起面试通知
- **智能自我介绍分析**:面试开始前收集候选人自我介绍,AI 自动提取技术栈和经验背景,动态调整后续提问方向与深度

## 面试维度

Expand Down Expand Up @@ -96,7 +97,8 @@ npm run build && npm start
1. 向机器人发送 `/start` 完成注册(必须,否则机器人无法主动联系)
2. 到预约时间后,机器人会主动发送面试通知
3. 也可在预约时间后主动发送 `/begin` 开始面试
4. 直接在对话框回复问题即可完成面试
4. 机器人会先请你做自我介绍——你的背景信息将帮助 AI 定制后续问题
5. 直接在对话框回复问题即可完成面试

## 技术架构

Expand All @@ -109,7 +111,7 @@ src/
├── parser.ts # 自然语言解析(提取面试信息)
├── db.ts # SQLite 数据持久化(sql.js)
├── config.ts # 环境变量配置
└── types.ts # TypeScript 类型定义
└── types.ts # TypeScript 类型定义(InterviewPhase、CandidateProfile 等)
```

**技术栈:**
Expand All @@ -123,8 +125,8 @@ src/
## 面试状态流转

```
pending → researching → ready → notified → in_progress → completed
↘ cancelled
pending → researching → ready → notified → intro → in_progress → completed
↘ cancelled
```

| 状态 | 说明 |
Expand All @@ -133,7 +135,8 @@ pending → researching → ready → notified → in_progress → completed
| `researching` | 正在收集资料、生成题目 |
| `ready` | 题目已就绪,等待面试时间 |
| `notified` | 已通知候选人,等待候选人确认开始 |
| `in_progress` | 面试进行中 |
| `intro` | 收集候选人自我介绍,分析背景信息 |
| `in_progress` | 面试进行中(根据候选人背景定制提问) |
| `completed` | 面试结束,报告已发送 |
| `cancelled` | 已取消 |

Expand Down
68 changes: 42 additions & 26 deletions docs/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -294,17 +294,17 @@ <h1 data-i18n="hero_title">AI Agent 管理员<br/>自动面试助手</h1>
<div class="demo-body">
<div class="bubble bot">
<div class="label" data-i18n="demo_name">面试助手</div>
<span data-i18n="demo_msg1">您好,张三!您的面试时间到了。<br/>本次面试时长约 45 分钟,请回复任意内容开始。</span>
<span data-i18n="demo_msg1">您好,张三!我是本次面试的面试官。<br/>本次面试针对「AI Agent 管理员」岗位,时长约 45 分钟。<br/>首先,请您做一段自我介绍吧。</span>
</div>
<div class="bubble user" data-i18n="demo_reply1">好的,我准备好了</div>
<div class="bubble user" data-i18n="demo_reply1">我有 3 年 AI 相关经验,熟悉 LangChain 和 RAG 架构,之前负责过一个多 Agent 协作平台...</div>
<div class="bubble bot">
<div class="label" data-i18n="demo_name">面试助手</div>
<span data-i18n="demo_msg2">很好!第一题:请解释 RAG 的工作原理,以及在什么场景下会选择使用它?</span>
<span data-i18n="demo_msg2">感谢您的介绍!看到您有 LangChain 和多 Agent 平台的经验,非常好。<br/>接下来我们开始正式面试。第一题:请结合您的实践,谈谈 Agent 的 ReAct 模式是如何工作的?</span>
</div>
<div class="bubble user" data-i18n="demo_reply2">RAG 是检索增强生成,通过向量数据库...</div>
<div class="bubble user" data-i18n="demo_reply2">ReAct 模式是将推理和行动交替进行...</div>
<div class="bubble bot">
<div class="label" data-i18n="demo_name">面试助手</div>
<span data-i18n="demo_msg3">回答不错!追问:如何评估 RAG 系统的检索质量?</span>
<span data-i18n="demo_msg3">回答不错!追问:在您的多 Agent 平台中,是如何处理 Agent 之间的协作和冲突的?</span>
</div>
</div>
</div>
Expand Down Expand Up @@ -347,6 +347,11 @@ <h3 data-i18n="feat5_h">自动提醒通知</h3>
<h3 data-i18n="feat6_h">身份验证</h3>
<p data-i18n="feat6_p">通过 Telegram 用户名绑定候选人,确保只有指定候选人可参与面试。</p>
</div>
<div class="feature-card">
<div class="feature-icon">🙋</div>
<h3 data-i18n="feat7_h">智能自我介绍分析</h3>
<p data-i18n="feat7_p">面试开始前收集候选人自我介绍,AI 自动提取技术栈和经验,动态调整后续提问方向与深度。</p>
</div>
</div>
</div>
</section>
Expand All @@ -355,7 +360,7 @@ <h3 data-i18n="feat6_h">身份验证</h3>
<section id="flow">
<div class="container">
<div class="section-label" data-i18n="flow_label">工作流程</div>
<h2 class="section-title" data-i18n="flow_title">六步完成一场面试</h2>
<h2 class="section-title" data-i18n="flow_title">七步完成一场面试</h2>
<p class="section-sub" data-i18n="flow_sub">面试官只需完成第一步,其余由系统自动推进。</p>
<div class="flow-steps">
<div class="flow-step">
Expand Down Expand Up @@ -389,15 +394,22 @@ <h3 data-i18n="flow4_h">候选人开始面试</h3>
<div class="flow-step">
<div class="step-num">5</div>
<div class="step-content">
<h3 data-i18n="flow5_h">AI 主持面试</h3>
<p data-i18n="flow5_p">Claude 按题目顺序提问,根据回答动态追问,全程对话式进行。</p>
<h3 data-i18n="flow5_h">自我介绍与背景分析</h3>
<p data-i18n="flow5_p">AI 自动请候选人做自我介绍,分析技术栈、经验年限和项目亮点,动态调整后续提问策略。</p>
</div>
</div>
<div class="flow-step">
<div class="step-num">6</div>
<div class="step-content">
<h3 data-i18n="flow6_h">生成评估报告</h3>
<p data-i18n="flow6_p">面试结束后自动生成报告,含综合评分、各维度分析和录用建议,发送给面试官。</p>
<h3 data-i18n="flow6_h">AI 主持面试</h3>
<p data-i18n="flow6_p">根据候选人背景定制提问,动态追问,全程对话式进行。</p>
</div>
</div>
<div class="flow-step">
<div class="step-num">7</div>
<div class="step-content">
<h3 data-i18n="flow7_h">生成评估报告</h3>
<p data-i18n="flow7_p">面试结束后自动生成报告,含综合评分、各维度分析和录用建议,发送给面试官。</p>
</div>
</div>
</div>
Expand Down Expand Up @@ -560,25 +572,27 @@ <h3 data-i18n="setup3_h">启动机器人</h3>
hero_sub: '专为招聘「AI Agent 管理员」岗位设计。从预约到评估报告,全程 AI 驱动,无需人工介入。',
hero_cta_deploy: '快速部署', hero_cta_source: '查看源码',
demo_name: '面试助手', demo_status: '● 在线',
demo_msg1: '您好,张三!您的面试时间到了。<br/>本次面试时长约 45 分钟,请回复任意内容开始。',
demo_reply1: '好的,我准备好了',
demo_msg2: '很好!第一题:请解释 RAG 的工作原理,以及在什么场景下会选择使用它?',
demo_reply2: 'RAG 是检索增强生成,通过向量数据库...',
demo_msg3: '回答不错!追问:如何评估 RAG 系统的检索质量?',
demo_msg1: '您好,张三!我是本次面试的面试官。<br/>本次面试针对「AI Agent 管理员」岗位,时长约 45 分钟。<br/>首先,请您做一段自我介绍吧。',
demo_reply1: '我有 3 年 AI 相关经验,熟悉 LangChain 和 RAG 架构,之前负责过一个多 Agent 协作平台...',
demo_msg2: '感谢您的介绍!看到您有 LangChain 和多 Agent 平台的经验,非常好。<br/>接下来我们开始正式面试。第一题:请结合您的实践,谈谈 Agent 的 ReAct 模式是如何工作的?',
demo_reply2: 'ReAct 模式是将推理和行动交替进行...',
demo_msg3: '回答不错!追问:在您的多 Agent 平台中,是如何处理 Agent 之间的协作和冲突的?',
feat_label: '核心功能', feat_title: '从预约到报告,全自动', feat_sub: '面试官只需预约一次,其余全部交给 AI。',
feat1_h: '自然语言预约', feat1_p: '直接描述面试信息,Claude 自动提取候选人、时间、时长,无需填表单。',
feat2_h: '自动资料收集', feat2_p: '面试前 2 小时,机器人搜索 AI Agent 领域最新动态,生成定制化题目。',
feat3_h: '全程自动面试', feat3_p: '候选人通过 Telegram 对话完成面试,支持追问和动态调整难度。',
feat4_h: '智能评估报告', feat4_p: '面试结束后自动生成结构化报告,含各维度评分和录用建议。',
feat5_h: '自动提醒通知', feat5_p: '面试前 15 分钟提醒候选人,到时间自动发起面试,无需手动操作。',
feat6_h: '身份验证', feat6_p: '通过 Telegram 用户名绑定候选人,确保只有指定候选人可参与面试。',
flow_label: '工作流程', flow_title: '六步完成一场面试', flow_sub: '面试官只需完成第一步,其余由系统自动推进。',
feat7_h: '智能自我介绍分析', feat7_p: '面试开始前收集候选人自我介绍,AI 自动提取技术栈和经验,动态调整后续提问方向与深度。',
flow_label: '工作流程', flow_title: '七步完成一场面试', flow_sub: '面试官只需完成第一步,其余由系统自动推进。',
flow1_h: '面试官预约', flow1_p: '发送 <code>/schedule 张三 @zhangsan,明天下午3点,45分钟</code>,Claude 解析并确认。',
flow2_h: '自动资料收集', flow2_p: '面试前 2 小时,系统搜索 AI Agent 领域最新资料,生成针对性面试题目。',
flow3_h: '提醒候选人', flow3_p: '面试前 15 分钟自动发送提醒,到时间发送开始通知。',
flow4_h: '候选人开始面试', flow4_p: '候选人回复任意内容或发送 <code>/begin</code>,面试正式开始。',
flow5_h: 'AI 主持面试', flow5_p: 'Claude 按题目顺序提问,根据回答动态追问,全程对话式进行。',
flow6_h: '生成评估报告', flow6_p: '面试结束后自动生成报告,含综合评分、各维度分析和录用建议,发送给面试官。',
flow5_h: '自我介绍与背景分析', flow5_p: 'AI 自动请候选人做自我介绍,分析技术栈、经验年限和项目亮点,动态调整后续提问策略。',
flow6_h: 'AI 主持面试', flow6_p: '根据候选人背景定制提问,动态追问,全程对话式进行。',
flow7_h: '生成评估报告', flow7_p: '面试结束后自动生成报告,含综合评分、各维度分析和录用建议,发送给面试官。',
dim_label: '面试维度', dim_title: '四个维度,全面评估', dim_sub: '针对 AI Agent 管理员岗位设计,覆盖技术与业务能力。',
dim1_tag: 'AI 基础知识', dim1_h: 'LLM 与 AI 原理', dim1_p: '模型原理、Prompt 工程、RAG、幻觉处理、微调方法(LoRA、RLHF)',
dim2_tag: 'Agent 框架', dim2_h: '框架实践经验', dim2_p: 'LangChain、AutoGen、CrewAI、Claude SDK、LlamaIndex 等框架的实际使用经验',
Expand All @@ -602,25 +616,27 @@ <h3 data-i18n="setup3_h">启动机器人</h3>
hero_sub: 'Built for hiring AI Agent Administrators. From scheduling to evaluation report — fully automated, no human intervention needed.',
hero_cta_deploy: 'Quick Setup', hero_cta_source: 'View Source',
demo_name: 'Interview Bot', demo_status: '● Online',
demo_msg1: 'Hi John! Your interview is starting now.<br/>This session is ~45 minutes. Reply anything to begin.',
demo_reply1: "I'm ready, let's go!",
demo_msg2: 'Great! Q1: Explain how RAG works and when you would choose to use it.',
demo_reply2: 'RAG is Retrieval-Augmented Generation, using a vector database...',
demo_msg3: 'Good answer! Follow-up: How do you evaluate retrieval quality in a RAG system?',
demo_msg1: 'Hi John! I\'m your interviewer today.<br/>This interview is for the AI Agent Administrator role, ~45 minutes.<br/>Let\'s start with a self-introduction — tell me about your background and experience.',
demo_reply1: "I have 3 years of AI experience, familiar with LangChain and RAG architecture, previously led a multi-Agent collaboration platform...",
demo_msg2: 'Thanks for the introduction! Great to see your LangChain and multi-Agent experience.<br/>Let\'s begin the formal interview. Q1: Based on your practice, how does the ReAct pattern work in Agents?',
demo_reply2: 'The ReAct pattern alternates between reasoning and action...',
demo_msg3: 'Good answer! Follow-up: In your multi-Agent platform, how did you handle collaboration and conflicts between Agents?',
feat_label: 'Features', feat_title: 'Fully automated, end to end', feat_sub: 'Schedule once — the bot handles everything else.',
feat1_h: 'Natural Language Scheduling', feat1_p: 'Describe the interview in plain text. Claude extracts candidate, time, and duration automatically.',
feat2_h: 'Automated Research', feat2_p: '2 hours before the interview, the bot searches for the latest AI Agent trends and generates tailored questions.',
feat3_h: 'Fully Automated Interview', feat3_p: 'Candidates chat with the bot on Telegram. It asks questions, follows up dynamically, and adapts in real time.',
feat4_h: 'Smart Evaluation Report', feat4_p: 'A structured report with per-dimension scores and a hire/no-hire recommendation is sent to the interviewer.',
feat5_h: 'Reminders & Notifications', feat5_p: 'Candidate is reminded 15 minutes before, and notified automatically when it\'s time to start.',
feat6_h: 'Identity Verification', feat6_p: 'Candidates are bound by Telegram username — only the designated candidate can participate.',
flow_label: 'How It Works', flow_title: '6 Steps to Complete an Interview', flow_sub: 'The interviewer only handles step 1. The rest is automatic.',
feat7_h: 'Smart Self-Introduction Analysis', feat7_p: 'Collects candidate self-introduction before the interview. AI extracts tech stack and experience to dynamically adjust question focus and depth.',
flow_label: 'How It Works', flow_title: '7 Steps to Complete an Interview', flow_sub: 'The interviewer only handles step 1. The rest is automatic.',
flow1_h: 'Interviewer Schedules', flow1_p: 'Send <code>/schedule John @john, tomorrow 3pm, 45 minutes</code> — Claude parses and confirms.',
flow2_h: 'Automated Research', flow2_p: '2 hours before, the system searches for the latest AI Agent resources and generates targeted questions.',
flow3_h: 'Candidate Reminder', flow3_p: 'A reminder is sent 15 minutes before. A start notification is sent when it\'s time.',
flow4_h: 'Candidate Starts', flow4_p: 'The candidate replies to any message or sends <code>/begin</code> to start the interview.',
flow5_h: 'AI Conducts Interview', flow5_p: 'Claude asks questions in order, follows up based on answers, and adapts dynamically.',
flow6_h: 'Evaluation Report Generated', flow6_p: 'After the interview, a report with overall score, per-dimension analysis, and hire recommendation is sent to the interviewer.',
flow5_h: 'Self-Introduction & Background Analysis', flow5_p: 'AI asks the candidate for a self-introduction, analyzes tech stack, experience, and project highlights to tailor the questioning strategy.',
flow6_h: 'AI Conducts Interview', flow6_p: 'Questions are tailored to the candidate\'s background, with dynamic follow-ups throughout.',
flow7_h: 'Evaluation Report Generated', flow7_p: 'After the interview, a report with overall score, per-dimension analysis, and hire recommendation is sent to the interviewer.',
dim_label: 'Interview Dimensions', dim_title: '4 Dimensions, Comprehensive Evaluation', dim_sub: 'Designed for the AI Agent Administrator role — covering both technical and business skills.',
dim1_tag: 'AI Fundamentals', dim1_h: 'LLM & AI Principles', dim1_p: 'Model principles, prompt engineering, RAG, hallucination mitigation, fine-tuning (LoRA, RLHF)',
dim2_tag: 'Agent Frameworks', dim2_h: 'Framework Experience', dim2_p: 'Hands-on experience with LangChain, AutoGen, CrewAI, Claude SDK, LlamaIndex, and more',
Expand Down
Loading