Get ready and try the interview coach
Before writing an agent, let’s see the interview we want to build. We’ll run the finished example once to check the tools and model access. Then we’ll keep it for comparison and start our own project.
The agents run locally in a .NET service. Foundry supplies their model in Azure. Docker runs the local record store and document parser. We need both the local tools and permission to call the cloud model.
Check your tools
Section titled “Check your tools”You’ll need an editor with C# support, .NET 10, Git, the Aspire CLI, a running container engine, and the Azure CLI. Check them in a terminal:
dotnet --versiongit --versionaspire --versiondocker infoaz versiondotnet --versiongit --versionaspire --versiondocker infoaz versionInstall missing tools using the official instructions for .NET, Git, Aspire, Docker, and Azure CLI. Keep the repository’s pinned package versions. The completed example uses a local Cosmos emulator and a MarkItDown container.
Sign in to an Azure environment
Section titled “Sign in to an Azure environment”The completed example can create a Foundry resource and model deployment. Confirm that your Azure identity can provision them in an approved subscription and region.
Before starting the example, agree on these details with the resource owner:
- The subscription, region, and resource group you may use.
- Permission to provision the resources and separate permission to call the model.
- Available quota for the selected model, version, and capacity.
- Who will remove the resources when both workshop projects are finished.
If any item is unresolved, complete the local tool checks first. Wait for approval before the model-backed run.
Signing in authenticates you. Resource permissions need their own approval. Follow the steps below to sign in:
az loginsubscriptionId=$(az account show --query id --output tsv)az account show --subscription "$subscriptionId" --query "{subscription:name, subscriptionId:id, tenant:tenantId}" --output tableaz login$subscriptionId = az account show --query id --output tsvaz account show --subscription "$subscriptionId" --query "{subscription:name, subscriptionId:id, tenant:tenantId}" --output tableCheck the displayed tenant and subscription before continuing. Keep account details private.
The subscriptionId variable lasts for this terminal session. If the selected subscription isn’t the approved one, list your subscriptions and select it below. Replace YOUR_SUBSCRIPTION_ID with its ID, then rerun the variable assignment and account-details command above.
az account list --output tableaz account set --subscription "YOUR_SUBSCRIPTION_ID"az account list --output tableaz account set --subscription "YOUR_SUBSCRIPTION_ID"Clone the finished app
Section titled “Clone the finished app”The website contains the lessons. The application runs from your machine. A separate example folder lets you inspect finished code without overwriting your own work later.
Clone this finished example once. Keep interview-coach-example for trying the app and reading completed code. In Chapter 1, we’ll download the starter once into a separate interview-coach-lab folder beside it. That will be our working project for the rest of the course.
-
Choose a parent directory for your workshop folders. Clone the repository into a new
interview-coach-examplefolder:Terminal window git clone https://github.com/codemillmatt/interview-coach-agent-framework.git interview-coach-examplecd interview-coach-exampleTerminal window git clone https://github.com/codemillmatt/interview-coach-agent-framework.git interview-coach-examplecd interview-coach-example -
Check out the workshop’s pinned tag. This selects the example version used to generate our checkpoints (that makes it easy to troubleshoot later if we need to):
Terminal window git checkout --detach workshop-v3-reference.1Terminal window git checkout --detach workshop-v3-reference.1 -
Set your Azure location and resource group once as environment variables. Replace
YOUR_APPROVED_AZURE_REGIONwith a region that supports the configured model. Use your assigned resource group if you have one. Otherwise, replaceYOUR_NAMEwith a label that identifies your new group.Terminal window export location="YOUR_APPROVED_AZURE_REGION"export resourceGroup="rg-interview-coach-YOUR_NAME"Terminal window $env:location = "YOUR_APPROVED_AZURE_REGION"$env:resourceGroup = "rg-interview-coach-YOUR_NAME"Keep this terminal open through Chapter 2. The commands reuse these values, so you can copy them unchanged. A new terminal needs this variable setup again.
-
Save the Azure context for Aspire. Azure CLI supplies your sign-in. These commands tell Aspire where it should provision resources.
Terminal window subscriptionId=$(az account show --query id --output tsv)tenantId=$(az account show --query tenantId --output tsv)aspire secret set "Azure:SubscriptionId" "$subscriptionId" --apphost ./apphost.csaspire secret set "Azure:TenantId" "$tenantId" --apphost ./apphost.csaspire secret set "Azure:Location" "$location" --apphost ./apphost.csaspire secret set "Azure:ResourceGroup" "$resourceGroup" --apphost ./apphost.csaspire secret set "Azure:CredentialSource" "AzureCli" --apphost ./apphost.csTerminal window $subscriptionId = az account show --query id --output tsv$tenantId = az account show --query tenantId --output tsvaspire secret set "Azure:SubscriptionId" "$subscriptionId" --apphost ./apphost.csaspire secret set "Azure:TenantId" "$tenantId" --apphost ./apphost.csaspire secret set "Azure:Location" "$env:location" --apphost ./apphost.csaspire secret set "Azure:ResourceGroup" "$env:resourceGroup" --apphost ./apphost.csaspire secret set "Azure:CredentialSource" "AzureCli" --apphost ./apphost.csThese values are stored in the example’s local AppHost user secrets, outside the repository. The learner project will have its own configuration and reuse this model. The next step enables Aspire to create the named resource group if it does not exist and your account has permission. If your organization does not allow resource-group creation, use an existing group supplied by your administrator.
-
Open this folder in your editor.
In the example’s root apphost.settings.json, add the Azure section below (or update it if it already exists) and review the model settings. Keep the file’s other settings:
{ "AgentMode": "HandOff", "LlmProvider": "MicrosoftFoundry", "Azure": { "AllowResourceGroupCreation": true }, "MicrosoftFoundry": { "DeploymentName": "gpt-5-mini", "ModelVersion": "2025-08-07", "ModelFormat": "OpenAI", "SkuName": "GlobalStandard", "SkuCapacity": 100 }}Set Azure:AllowResourceGroupCreation to true for this initial example when creating a new resource group. With it set to false, provisioning fails if the named group does not exist. If you must use an existing approved group, keep it false and confirm that group exists. The later interview-coach-lab starter deliberately keeps this setting false because it reuses the example’s resources.
In these provisioning settings, DeploymentName selects the model, gpt-5-mini. The sample’s Aspire helper names the resulting Azure deployment chat. That deployment name is what the learner project will use when calling the model.
The SKU specifies a deployment option, and capacity determines the requested allocation. Keep the pinned model version. Confirm availability and approval with your resource owner before starting. The Foundry configuration reference links to the model and quota documentation.
We’ll build and run the application. From the interview-coach-example root:
dotnet build InterviewCoach.slnxaspire start --apphost ./apphost.csdotnet build InterviewCoach.slnxaspire start --apphost ./apphost.csOpen Aspire’s printed dashboard URL. Once the services are ready, open the webui endpoint.
Try a short interview
Section titled “Try a short interview”Help me prepare for a cloud solution architect interview. Ask one questionat a time. I'll provide a fictional resume and job description.When asked, download Peter Parker resume and cloud solution architect job description locally and then upload them to the conversation. The parser container needs reachable URLs, the localhost workshop preview may be inaccessible to it, so we’ll provide the files.
Give one short, fictional behavioural answer, for example:
Our practice deployment failed after a configuration change. I comparedthe settings, reverted the change, and added a startup check.Ask Move on to technical questions., answer one question, then send Finish the interview now and save a short summary.
Look for feedback tied to your answers and a final summary. Exact wording will vary. We’ll inspect tool calls and saved records in the chapters where we build them.
Keep the model for your learner project
Section titled “Keep the model for your learner project”The learner app will reuse this Foundry account and deployment. Run the following lookup in your setup terminal. It saves matching account names from your approved resource group and location in foundryName.
foundryName=$(az cognitiveservices account list --subscription "$subscriptionId" --resource-group "$resourceGroup" --query "[?kind=='AIServices' && location=='$location'].name" --output tsv) &&export foundryName$env:foundryName = az cognitiveservices account list --subscription "$subscriptionId" --resource-group "$env:resourceGroup" --query "[?kind=='AIServices' && location=='$env:location'].name" --output tsvThe example uses a deployment named chat. Save that name for Chapter 2:
export deploymentName="chat"$env:deploymentName = "chat"This sets a variable. It does not create or change a deployment.
Inspect the deployment you will reuse
Section titled “Inspect the deployment you will reuse”The next commands read resource details. They do not create resources or send a model request.
First, display the selected account name. It must identify one account from the example run. If it is empty or contains several names, stop. Use the example’s provisioning output to identify its account before proceeding.
printf '%s\n' "$foundryName"Write-Output $env:foundryNameIf you need to select a specific account, replace YOUR_EXAMPLE_FOUNDRY_ACCOUNT with that account’s name:
export foundryName="YOUR_EXAMPLE_FOUNDRY_ACCOUNT"$env:foundryName = "YOUR_EXAMPLE_FOUNDRY_ACCOUNT"Now inspect chat and the account endpoint:
az cognitiveservices account deployment show --subscription "$subscriptionId" --resource-group "$resourceGroup" --name "$foundryName" --deployment-name "$deploymentName" --query "{deployment:name,model:properties.model.name,version:properties.model.version,sku:sku.name,capacity:sku.capacity}" --output tableaz cognitiveservices account show --subscription "$subscriptionId" --resource-group "$resourceGroup" --name "$foundryName" --query properties.endpoint --output tsvaz cognitiveservices account deployment show --subscription "$subscriptionId" --resource-group "$env:resourceGroup" --name "$env:foundryName" --deployment-name "$env:deploymentName" --query "{deployment:name,model:properties.model.name,version:properties.model.version,sku:sku.name,capacity:sku.capacity}" --output tableaz cognitiveservices account show --subscription "$subscriptionId" --resource-group "$env:resourceGroup" --name "$env:foundryName" --query properties.endpoint --output tsvFind the deployment name and model name in the output. They answer different questions: which deployment will we call, and which model runs behind it?
The endpoint locates the account. An access token identifies the caller. Neither the endpoint nor the deployment name grants permission. Chapter 2 follows these settings into the model client.
Chapter 2 uses location, resourceGroup, foundryName, and deploymentName from this terminal. You will not need to type these values again. If you open a new terminal, repeat the Azure sign-in check and the commands that set these four variables.
Stop the example
Section titled “Stop the example”From the same example root:
aspire stop --apphost ./apphost.csaspire stop --apphost ./apphost.csKeep the folder and the Foundry resources. Our learner app will use its own local configuration to connect to this same deployment. Stop local processes now. Wait until both projects are finished before removing shared cloud resources.