# azure-samples/interview-coach-agent-framework architecture

> Architecture diagram of the GitHub repository azure-samples/interview-coach-agent-framework, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-24). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/azure-samples/interview-coach-agent-framework
- Repository: https://github.com/azure-samples/interview-coach-agent-framework

## Overview

Interview Coach is a browser-based interview-practice app: users provide a resume and job description, converse with an AI coach through behavioural and technical questions, receive feedback and a summary, and can retain session records. The WebUI sends chat through AG-UI to the agent service. The agent supports single-agent and specialist handoff modes, and uses MCP tools for document extraction and session operations. InterviewData persists records in Cosmos DB. The README documents these capabilities; sampled source confirms UI-to-agent and repository persistence details, while some agent workflow wiring is documented but not sampled.

Main entry points: [`src/InterviewCoach.Agent/Program.cs`](https://github.com/azure-samples/interview-coach-agent-framework/blob/main/src/InterviewCoach.Agent/Program.cs) (Agent service), [`apphost.cs`](https://github.com/azure-samples/interview-coach-agent-framework/blob/main/apphost.cs) (Aspire resource graph), [`src/InterviewCoach.Agent/AgentDelegateFactory.cs`](https://github.com/azure-samples/interview-coach-agent-framework/blob/main/src/InterviewCoach.Agent/AgentDelegateFactory.cs) (Coach workflow), [`src/InterviewCoach.WebUI/Components/Pages/Chat`](https://github.com/azure-samples/interview-coach-agent-framework/tree/main/src/InterviewCoach.WebUI/Components/Pages/Chat) (Chat interface)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_experience["Interview experience"]
  node_webui["Blazor WebUI<br/>[Program.cs]"]
  node_chat["Chat interface<br/>[Chat]"]
  node_upload["File upload"]
end

subgraph group_coaching["Agent coaching"]
  node_agent["Agent service<br/>[Program.cs]"]
  node_workflow["Coach workflow"]
  node_triage["Triage and receptionist"]
  node_interviewers["Behavioural and technical"]
  node_summary["Interview summary"]
  node_markitdown["MarkItDown MCP"]
end

subgraph group_records["Interview records"]
  node_interviewtools["Session MCP tools"]
  node_repository["Session repository"]
  node_dbcontext["Cosmos data context"]
  node_cosmos[("Cosmos DB")]
end

subgraph group_runtime["Models and runtime"]
  node_foundry["Microsoft Foundry"]
  node_copilot["GitHub Copilot"]
  node_apphost["Aspire resource graph<br/>[apphost.cs]"]
end

node_candidate(("Candidate"))

node_candidate -->|"sends inputs"| node_chat
node_chat -->|"submits chat"| node_webui
node_webui -->|"AG-UI requests"| node_agent
node_agent -->|"runs"| node_workflow
node_workflow -->|"dispatches"| node_triage
node_workflow -->|"hands off"| node_interviewers
node_workflow -->|"produces"| node_summary
node_interviewers -->|"asks and responds"| node_candidate
node_summary -->|"returns summary"| node_candidate
node_chat -->|"uploads documents"| node_upload
node_upload -->|"posts files"| node_agent
node_agent -->|"requests extraction"| node_markitdown
node_agent -->|"calls MCP tools"| node_interviewtools
node_interviewtools -->|"invokes"| node_repository
node_repository -->|"reads and writes"| node_dbcontext
node_dbcontext -->|"persists records"| node_cosmos
node_agent -->|"uses configured model"| node_foundry
node_agent -.->|"uses optional provider"| node_copilot
node_apphost -->|"starts"| node_webui
node_apphost -->|"starts"| node_agent
node_apphost -->|"starts"| node_markitdown
node_apphost -->|"provisions"| node_cosmos

click node_webui "https://github.com/azure-samples/interview-coach-agent-framework/blob/main/src/InterviewCoach.WebUI/Program.cs"
click node_chat "https://github.com/azure-samples/interview-coach-agent-framework/tree/main/src/InterviewCoach.WebUI/Components/Pages/Chat"
click node_upload "https://github.com/azure-samples/interview-coach-agent-framework/blob/main/src/InterviewCoach.WebUI/Services/FileUploadService.cs"
click node_agent "https://github.com/azure-samples/interview-coach-agent-framework/blob/main/src/InterviewCoach.Agent/Program.cs"
click node_workflow "https://github.com/azure-samples/interview-coach-agent-framework/blob/main/src/InterviewCoach.Agent/AgentDelegateFactory.cs"
click node_triage "https://github.com/azure-samples/interview-coach-agent-framework/blob/main/src/InterviewCoach.Agent/AgentDelegateFactory.cs"
click node_interviewers "https://github.com/azure-samples/interview-coach-agent-framework/blob/main/src/InterviewCoach.Agent/AgentDelegateFactory.cs"
click node_summary "https://github.com/azure-samples/interview-coach-agent-framework/blob/main/src/InterviewCoach.Agent/AgentDelegateFactory.cs"
click node_interviewtools "https://github.com/azure-samples/interview-coach-agent-framework/blob/main/src/InterviewCoach.Mcp.InterviewData/InterviewSessionTool.cs"
click node_repository "https://github.com/azure-samples/interview-coach-agent-framework/blob/main/src/InterviewCoach.Mcp.InterviewData/InterviewSessionRepository.cs"
click node_dbcontext "https://github.com/azure-samples/interview-coach-agent-framework/blob/main/src/InterviewCoach.Mcp.InterviewData/InterviewDataDbContext.cs"
click node_apphost "https://github.com/azure-samples/interview-coach-agent-framework/blob/main/apphost.cs"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_webui,node_chat,node_upload toneBlue
class node_agent,node_workflow,node_triage,node_interviewers,node_summary,node_markitdown toneAmber
class node_interviewtools,node_repository,node_dbcontext,node_cosmos toneMint
class node_foundry,node_copilot,node_apphost toneRose
class node_candidate toneIndigo
```

## Components

### Interview experience

- [Blazor WebUI](https://github.com/azure-samples/interview-coach-agent-framework/blob/main/src/InterviewCoach.WebUI/Program.cs): `src/InterviewCoach.WebUI/Program.cs`
- [Chat interface](https://github.com/azure-samples/interview-coach-agent-framework/tree/main/src/InterviewCoach.WebUI/Components/Pages/Chat): `src/InterviewCoach.WebUI/Components/Pages/Chat`
- [File upload](https://github.com/azure-samples/interview-coach-agent-framework/blob/main/src/InterviewCoach.WebUI/Services/FileUploadService.cs): `src/InterviewCoach.WebUI/Services/FileUploadService.cs`

### Agent coaching

- [Agent service](https://github.com/azure-samples/interview-coach-agent-framework/blob/main/src/InterviewCoach.Agent/Program.cs): `src/InterviewCoach.Agent/Program.cs`
- [Coach workflow](https://github.com/azure-samples/interview-coach-agent-framework/blob/main/src/InterviewCoach.Agent/AgentDelegateFactory.cs): `src/InterviewCoach.Agent/AgentDelegateFactory.cs`
- [Triage and receptionist](https://github.com/azure-samples/interview-coach-agent-framework/blob/main/src/InterviewCoach.Agent/AgentDelegateFactory.cs): `src/InterviewCoach.Agent/AgentDelegateFactory.cs`
- [Behavioural and technical](https://github.com/azure-samples/interview-coach-agent-framework/blob/main/src/InterviewCoach.Agent/AgentDelegateFactory.cs): `src/InterviewCoach.Agent/AgentDelegateFactory.cs`
- [Interview summary](https://github.com/azure-samples/interview-coach-agent-framework/blob/main/src/InterviewCoach.Agent/AgentDelegateFactory.cs): `src/InterviewCoach.Agent/AgentDelegateFactory.cs`
- **MarkItDown MCP**

### Interview records

- [Session MCP tools](https://github.com/azure-samples/interview-coach-agent-framework/blob/main/src/InterviewCoach.Mcp.InterviewData/InterviewSessionTool.cs): `src/InterviewCoach.Mcp.InterviewData/InterviewSessionTool.cs`
- [Session repository](https://github.com/azure-samples/interview-coach-agent-framework/blob/main/src/InterviewCoach.Mcp.InterviewData/InterviewSessionRepository.cs): `src/InterviewCoach.Mcp.InterviewData/InterviewSessionRepository.cs`
- [Cosmos data context](https://github.com/azure-samples/interview-coach-agent-framework/blob/main/src/InterviewCoach.Mcp.InterviewData/InterviewDataDbContext.cs): `src/InterviewCoach.Mcp.InterviewData/InterviewDataDbContext.cs`
- **Cosmos DB**

### Models and runtime

- **Microsoft Foundry**
- **GitHub Copilot**
- [Aspire resource graph](https://github.com/azure-samples/interview-coach-agent-framework/blob/main/apphost.cs): `apphost.cs`

### Other components

- **Candidate**

## Connections

- Candidate → Chat interface: sends inputs
- Chat interface → Blazor WebUI: submits chat
- Blazor WebUI → Agent service: AG-UI requests
- Agent service → Coach workflow: runs
- Coach workflow → Triage and receptionist: dispatches
- Coach workflow → Behavioural and technical: hands off
- Coach workflow → Interview summary: produces
- Behavioural and technical → Candidate: asks and responds
- Interview summary → Candidate: returns summary
- Chat interface → File upload: uploads documents
- File upload → Agent service: posts files
- Agent service → MarkItDown MCP: requests extraction
- Agent service → Session MCP tools: calls MCP tools
- Session MCP tools → Session repository: invokes
- Session repository → Cosmos data context: reads and writes
- Cosmos data context → Cosmos DB: persists records
- Agent service → Microsoft Foundry: uses configured model
- Agent service → GitHub Copilot: uses optional provider
- Aspire resource graph → Blazor WebUI: starts
- Aspire resource graph → Agent service: starts
- Aspire resource graph → MarkItDown MCP: starts
- Aspire resource graph → Cosmos DB: provisions
