# Interviewer
A multi-agent AI powered coding interviewer built using AutoGen.
The system:
- generates coding problems
- writes them into files
- lets candidates solve them locally
- evaluates the solution
- asks follow-up questions
- scores the candidate
- stores results in Excel
Basically your own AI technical interviewer.
---
# Features
- Multi-agent interview orchestration
- Real coding interview flow
- Topic-based DSA question generation
- MCP filesystem integration
- Code evaluation + scoring
- Excel result storage
- Prompt injection resistance
- Cross-platform support (Windows/Mac/Linux)
---
# Tech Stack
- Python 3.13+
- AutoGen
- MCP Filesystem Server
- OpenRouter / OpenAI / Groq compatible
- Rich CLI
- Questionary
- OpenPyXL
---
# Installation
## 1. Clone the repo
```bash
git clone <your-repo-url>
cd interviewerIf you don't have uv installed...
Well, I got you covered, my friend
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"curl -LsSf https://astral.sh/uv/install.sh | shDocs: https://docs.astral.sh/uv/
uv syncCopy everything from:
.env.exampleinto:
.envGo here:
Create your own API key.
It's free up to a reasonable limit.
And secondly...
why would I give you mine? hehehe
uv run python -m mainYou can swap models easily inside interviewer.py.
client = OpenAIChatCompletionClient(
model="deepseek/deepseek-chat:free",
base_url="https://openrouter.ai/api/v1",
api_key=os.getenv("OPENROUTER_API_KEY"),
model_info={
"vision": False,
"function_calling": True,
"json_output": True,
"structured_output": True,
"family": "unknown",
},
)Very fast.
client = OpenAIChatCompletionClient(
model="llama-3.3-70b-versatile",
base_url="https://api.groq.com/openai/v1",
api_key=os.getenv("GROQ_API_KEY"),
model_info={
"vision": False,
"function_calling": True,
"json_output": True,
"structured_output": True,
"family": "llama",
},
)Cheap and good.
client = OpenAIChatCompletionClient(
model="google/gemini-2.0-flash-001",
base_url="https://openrouter.ai/api/v1",
api_key=os.getenv("OPENROUTER_API_KEY"),
model_info={
"vision": False,
"function_calling": True,
"json_output": True,
"structured_output": True,
"family": "gemini",
},
)Best overall quality.
client = OpenAIChatCompletionClient(
model="gpt-4o",
api_key=os.getenv("OPENAI_API_KEY"),
)Cheap + strong reasoning.
client = OpenAIChatCompletionClient(
model="gpt-4.1-mini",
api_key=os.getenv("OPENAI_API_KEY"),
)Excellent interviewer behavior.
client = OpenAIChatCompletionClient(
model="anthropic/claude-3.7-sonnet",
base_url="https://openrouter.ai/api/v1",
api_key=os.getenv("OPENROUTER_API_KEY"),
model_info={
"vision": False,
"function_calling": True,
"json_output": True,
"structured_output": True,
"family": "claude",
},
)interviewer/
│
├── main.py
├── interviewer.py
├── problems/
├── interview_results.xlsx
├── .env.example
├── pyproject.toml
└── README.md-
Candidate selects:
- difficulty
- DSA topics
-
AI interviewer:
- generates a coding problem
- writes it into
/problems
-
Candidate solves problem locally
-
Evaluator agent reviews the code
-
Scorer agent:
- assigns score
- stores results in Excel
- Prompt injection resistance
- Topic-constrained generation
- Filesystem sandboxing
- Agent role enforcement
- Controlled evaluation flow
- Web UI
- Voice interviews
- Live collaborative coding
- Resume-based question generation
- Multi-round interviews
- System design rounds
- Docker support
If the AI rejects your solution brutally...
that's just realistic interview prep :)
- I have noticed that using a paid model gives me a better result than free ones, as hallucinations are less
- I recommend using OpenAI or Google Gemini for this
- Avoid using laptops that you are not an admin of, as they may block calls to open-source LLM models