Skip to content

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.

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:

Terminal window
dotnet --version
git --version
aspire --version
docker info
az version

Install 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.

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:

  1. The subscription, region, and resource group you may use.
  2. Permission to provision the resources and separate permission to call the model.
  3. Available quota for the selected model, version, and capacity.
  4. 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:

Terminal window
az login
subscriptionId=$(az account show --query id --output tsv)
az account show --subscription "$subscriptionId" --query "{subscription:name, subscriptionId:id, tenant:tenantId}" --output table

Check 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.

Terminal window
az account list --output table
az account set --subscription "YOUR_SUBSCRIPTION_ID"

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.

  1. Choose a parent directory for your workshop folders. Clone the repository into a new interview-coach-example folder:

    Terminal window
    git clone https://github.com/codemillmatt/interview-coach-agent-framework.git interview-coach-example
    cd interview-coach-example
  2. 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.1

  3. Set your Azure location and resource group once as environment variables. Replace YOUR_APPROVED_AZURE_REGION with a region that supports the configured model. Use your assigned resource group if you have one. Otherwise, replace YOUR_NAME with a label that identifies your new group.

    Terminal window
    export location="YOUR_APPROVED_AZURE_REGION"
    export 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.

  4. 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.cs
    aspire secret set "Azure:TenantId" "$tenantId" --apphost ./apphost.cs
    aspire secret set "Azure:Location" "$location" --apphost ./apphost.cs
    aspire secret set "Azure:ResourceGroup" "$resourceGroup" --apphost ./apphost.cs
    aspire secret set "Azure:CredentialSource" "AzureCli" --apphost ./apphost.cs

    These 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.

  5. 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:

Terminal window
dotnet build InterviewCoach.slnx
aspire start --apphost ./apphost.cs

Open Aspire’s printed dashboard URL. Once the services are ready, open the webui endpoint.

Help me prepare for a cloud solution architect interview. Ask one question
at 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 compared
the 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.

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.

Terminal window
foundryName=$(az cognitiveservices account list --subscription "$subscriptionId" --resource-group "$resourceGroup" --query "[?kind=='AIServices' && location=='$location'].name" --output tsv) &&
export foundryName

The example uses a deployment named chat. Save that name for Chapter 2:

Terminal window
export deploymentName="chat"

This sets a variable. It does not create or change a deployment.

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.

Terminal window
printf '%s\n' "$foundryName"

If you need to select a specific account, replace YOUR_EXAMPLE_FOUNDRY_ACCOUNT with that account’s name:

Terminal window
export foundryName="YOUR_EXAMPLE_FOUNDRY_ACCOUNT"

Now inspect chat and the account endpoint:

Terminal window
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 table
az cognitiveservices account show --subscription "$subscriptionId" --resource-group "$resourceGroup" --name "$foundryName" --query properties.endpoint --output tsv

Find 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.

From the same example root:

Terminal window
aspire stop --apphost ./apphost.cs

Keep 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.

Chapter 0 · Getting started

Next: 1. Start your workshop app