From 4d30f3a4c4e9d2bb80c7b4a39914d7b2880b16e9 Mon Sep 17 00:00:00 2001 From: Copilot Date: Mon, 7 Sep 2026 21:41:08 +0200 Subject: [PATCH 1/3] Refine AI Gateway documentation and update model access instructions --- .../challenges/challenge-05.md | 139 +----------------- ...ting-tool-from-evidenceenrichmentagent.png | Bin 73186 -> 72043 bytes .../walkthrough/challenge-05/solution-05.md | 139 +----------------- 3 files changed, 14 insertions(+), 264 deletions(-) diff --git a/03-Azure/01-04-AI/07_Fraud_Intelligence/challenges/challenge-05.md b/03-Azure/01-04-AI/07_Fraud_Intelligence/challenges/challenge-05.md index f14f45d90..d7b56550e 100644 --- a/03-Azure/01-04-AI/07_Fraud_Intelligence/challenges/challenge-05.md +++ b/03-Azure/01-04-AI/07_Fraud_Intelligence/challenges/challenge-05.md @@ -4,7 +4,7 @@ ## 🎯 Objective -Introduce the **AI Gateway tier (preview)** for governed model and MCP access, generate an MCP interface from the Fraud Alert Manager API, build an **Alert Manager Agent**, and run alert creation in parallel with report generation. +Introduce the **AI Gateway tier (preview)** for MCP access, generate an MCP interface from the Fraud Alert Manager API, build an **Alert Manager Agent**, and run alert creation in parallel with report generation. ## 🧭 Context and Background @@ -19,7 +19,6 @@ flowchart LR AMCP --> API[Fraud Alert Manager API] ORCH[Hosted orchestration] --> GATEWAY[AI Gateway tier] - GATEWAY --> MODEL[Model deployment] GATEWAY --> FMCP[Financial Evidence MCP] GATEWAY --> AMCP ``` @@ -38,7 +37,7 @@ source hackenv An **AI Gateway** is a centralized control point for securing and managing interactions among AI agents, models, and external services. It routes requests and responses through a governance layer that can enforce authentication, authorization, rate limiting, and other policies. This helps protect sensitive information, support compliance, and provide observability into AI-driven workflows. -In Azure, API Management provides the AI Gateway. In this lab, you will deploy a dedicated API Management instance using the preview `AIGateway` SKU, then route model requests and MCP calls through this centralized governance layer. +In Azure, API Management provides the AI Gateway. In this lab, you will deploy a dedicated API Management instance using the preview `AIGateway` SKU, then route MCP calls through this centralized governance layer. #### Create the Gateway @@ -54,131 +53,7 @@ Open the [AI Gateway portal](https://ai.gateway.azure.com/) and sign in with the ![AI Gateway deployment screenshot](images/ai-gateway-deployment.png) -### 2. Configure Governed Model Access - -#### Import Models - -In the AI Gateway left navigation pane, select **Models**, then select **Add Models**. - -Models can be imported from several sources and providers. For this lab, select models deployed in **Microsoft Foundry**: - -![Import models from Microsoft Foundry](images/import-models-from-microsoft-foundry.png) - -Choose the lab subscription and Foundry resource, then select **Next**: - -![Select subscription and Foundry resource](images/select-subscription-and-foundry-resource.png) - -Keep the default settings, or adjust the names if needed, then select **Create** to import the models into the AI Gateway: - -![Import models into the AI Gateway](images/import-models-into-ai-gateway.png) - -After a successful import, the newly added models appear under **Models**: - -![Models listed under the AI Gateway](images/models-listed-under-ai-gateway.png) - -#### Configure Agents to Access Models Through the AI Gateway - -After importing the models, configure the agents to access them through the AI Gateway. In **Microsoft Foundry**, open **Manage**, select **Resource details**, and then select **Admin-connected models**: - -![Admin-connected models in Microsoft Foundry](images/admin-connected-models-in-microsoft-foundry.png) - -Select **Add** to open the connection dialog. - -Because the **AI Gateway** SKU is still in preview, select **Other source** instead of **Azure API Management**. Enter the following details: - -- **Connection name**: unique identifier, for instance, `aigateway` -- **Base URL** - 1) Get the Gateway models endpoint from the **AI Gateway** portal: - - ![Get the Gateway models endpoint from the AI Gateway portal](images/get-gateway-models-endpoint.png) - - 2) Get the access key. Create new ones: - - ![Create new access key in the AI Gateway portal](images/create-new-access-key.png) - - Copy the access key and keep it for next steps. Click **Next**. - -- **Authentication**: Select **API Key** and enter the access key you obtained in the previous step. As header name, use `api-key`. Then, **Next** - -Finally, select **Add Model** and configure the following values: - -- **Name**: gpt-5.6-luna -- **Display name**: gpt-5.6-luna -- **Version**: leave it empty -- **Format**: OpenAI - -Select **Save** to finish adding the model, then select **Add** to complete the connection. - -The newly added models should now appear under **Admin-connected models** in Microsoft Foundry: - -![Admin-connected models in Microsoft Foundry](images/admin-connected-models-in-microsoft-foundry-after-adding.png) - -Next, add the new admin-connected model to your agents so they can use it through the AI Gateway. - -Open the **Agents** section in Microsoft Foundry, select the agent you want to configure, such as `EvidenceEnrichmentAgent`, and change its **Model** to the newly added admin-connected model: - -![Select the newly added admin-connected model for the agent](images/select-admin-connected-model-for-agent.png) - -Select **Save** to apply the configuration changes. This creates a new agent version. - -Then test the agent. If you configured `EvidenceEnrichmentAgent`, use this JSON payload: - -```json -{ - "transaction_id": "TX-TEST-0001", - "originator_name": "James Carter", - "origin_account": "83D4B1F30", - "bank_origin": "0121", - "beneficiary_name": "Emily Foster", - "destination_account": "818CCA030", - "bank_destination": "29196", - "amount": 15000, - "currency": "EUR" -} -``` - -The agent should use the newly added admin-connected model to return a response based on the transaction details. - -Return to the **AI Gateway** portal to monitor requests and responses for the newly added admin-connected model. Open **Monitoring** and select **Configure telemetry**. - -![Configure telemetry in the AI Gateway portal](images/configure-telemetry-in-ai-gateway-portal.png) - -Use the existing **Application Insights** instance to monitor telemetry. Select the appropriate instance, then select **Next**: - -![Select Application Insights instance for telemetry in the AI Gateway portal](images/select-application-insights-instance-for-telemetry-in-ai-gateway-portal.png) - -Keep **System-assigned managed identity** as the authentication method, review the configuration, and select **Apply**. - -Allow a minute for the configuration to take effect before looking for telemetry. - -Test the agent again, then review the **Monitoring** section in the AI Gateway portal. Telemetry may take a few moments to appear. You should see a metrics view similar to the following: - -![Telemetry graphs in the AI Gateway portal](images/telemetry-graphs-in-ai-gateway-portal.png) - -If time permits, apply the same model changes to all prompt agents. - -#### Apply a Rate-Limiting Policy - -When multiple agents call the same admin-connected model simultaneously, unrestricted usage can degrade the service. Apply a rate-limiting policy to control usage for each caller identity. - -Open **Models**, select `gpt-5.6-luna`, switch to the **Policies** tab, and select **Add policy**: - -![Add rate limiting policy for the admin-connected model](images/add-rate-limiting-policy-for-admin-connected-model.png) - -Select the **Token rate limit** policy: - -![Select Token rate limit policy in the AI Gateway portal](images/select-token-rate-limit-policy-in-ai-gateway-portal.png) - -Set the desired rate-limit parameters. Keep **Caller identity** as the target; in this case, the identity is the key used to connect Microsoft Foundry to the AI Gateway model: - -![Set rate limit parameters in the AI Gateway portal](images/set-rate-limit-parameters-in-ai-gateway-portal.png) - -Select **Create** to apply the rate-limiting policy. - -Requests that exceed the configured limit will now be throttled, helping to maintain fair usage and service availability. - - -### 3. Proxy the Financial Evidence MCP +### 2. Proxy the Financial Evidence MCP The **AI Gateway** can proxy existing Model Context Protocol (MCP) servers. This applies access, authentication, and rate-limiting policies at the gateway without requiring changes to the MCP implementation. @@ -250,7 +125,7 @@ Test the agent and inspect its traces to verify that it uses `financial-evidence To explore additional gateway policies, open the **Policies** section for `financial-evidence-mcp`. Because the **AI Gateway** is in preview, some MCP features, including the **Monitoring** tab, may still be unavailable. -### 4. Generate an MCP from the Fraud Alert Manager API +### 3. Generate an MCP from the Fraud Alert Manager API The **AI Gateway** can also expose an existing API as an MCP, bringing agent integration and policy management to APIs that were not originally designed as MCP servers. @@ -284,14 +159,14 @@ Explore the new MCP server in the **AI Gateway** playground. For example, list t Next, create `AlertManagerAgent` to interact with `alert-manager-mcp` through the **AI Gateway**, then add the agent to the full orchestration. -### 5. Create the AlertManagerAgent +### 4. Create the AlertManagerAgent This is the fourth agent in the workflow. `AlertManagerAgent` uses `alert-manager-mcp` to manage financial alerts through the **AI Gateway**. Use the following configuration: - Use the agent instructions in `walkthrough/challenge-05/alert-manager-agent/instructions.md`. -- Select the model routed through the **AI Gateway**. +- Select the model: `gpt-5.6-luna` - Onboard the MCP in **Microsoft Foundry** following the usual steps for MCP integration. Remember to add authentication with **API Key**, using header name `api-key` and value a valid API key provided by the **AI Gateway**. - Configure the MCP for the agent and enable auto-approval for all tools. - Save the agent configuration. @@ -886,7 +761,7 @@ Confirm that the new alert appears on the Alert Management dashboard: You can view the alert details or remove the alert to avoid duplicates in later tests. -### 6. Add the Alert Manager Agent to the Orchestration +### 5. Add the Alert Manager Agent to the Orchestration The final task is to add `AlertManagerAgent` to the orchestration so it can process transactions that require operational alerting. diff --git a/03-Azure/01-04-AI/07_Fraud_Intelligence/challenges/images/remove-existing-tool-from-evidenceenrichmentagent.png b/03-Azure/01-04-AI/07_Fraud_Intelligence/challenges/images/remove-existing-tool-from-evidenceenrichmentagent.png index e597de991e4e9635e00d43404b0c1d2473988398..0ea8b8ed369df8fa54607b7fd8f3e22e6a12f8aa 100644 GIT binary patch literal 72043 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'bNdfHM&;!B!aT0m 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 literal 73186 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 diff --git a/03-Azure/01-04-AI/07_Fraud_Intelligence/walkthrough/challenge-05/solution-05.md b/03-Azure/01-04-AI/07_Fraud_Intelligence/walkthrough/challenge-05/solution-05.md index b236e7816..2311bc85b 100644 --- a/03-Azure/01-04-AI/07_Fraud_Intelligence/walkthrough/challenge-05/solution-05.md +++ b/03-Azure/01-04-AI/07_Fraud_Intelligence/walkthrough/challenge-05/solution-05.md @@ -4,7 +4,7 @@ ## 🎯 Objective -Introduce the **AI Gateway tier (preview)** for governed model and MCP access, generate an MCP interface from the Fraud Alert Manager API, build an **Alert Manager Agent**, and run alert creation in parallel with report generation. +Introduce the **AI Gateway tier (preview)** for MCP access, generate an MCP interface from the Fraud Alert Manager API, build an **Alert Manager Agent**, and run alert creation in parallel with report generation. ## 🧭 Context and Background @@ -19,7 +19,6 @@ flowchart LR AMCP --> API[Fraud Alert Manager API] ORCH[Hosted orchestration] --> GATEWAY[AI Gateway tier] - GATEWAY --> MODEL[Model deployment] GATEWAY --> FMCP[Financial Evidence MCP] GATEWAY --> AMCP ``` @@ -38,7 +37,7 @@ source hackenv An **AI Gateway** is a centralized control point for securing and managing interactions among AI agents, models, and external services. It routes requests and responses through a governance layer that can enforce authentication, authorization, rate limiting, and other policies. This helps protect sensitive information, support compliance, and provide observability into AI-driven workflows. -In Azure, API Management provides the AI Gateway. In this lab, you will deploy a dedicated API Management instance using the preview `AIGateway` SKU, then route model requests and MCP calls through this centralized governance layer. +In Azure, API Management provides the AI Gateway. In this lab, you will deploy a dedicated API Management instance using the preview `AIGateway` SKU, then route MCP calls through this centralized governance layer. #### Create the Gateway @@ -54,131 +53,7 @@ Open the [AI Gateway portal](https://ai.gateway.azure.com/) and sign in with the ![AI Gateway deployment screenshot](images/ai-gateway-deployment.png) -### 2. Configure Governed Model Access - -#### Import Models - -In the AI Gateway left navigation pane, select **Models**, then select **Add Models**. - -Models can be imported from several sources and providers. For this lab, select models deployed in **Microsoft Foundry**: - -![Import models from Microsoft Foundry](images/import-models-from-microsoft-foundry.png) - -Choose the lab subscription and Foundry resource, then select **Next**: - -![Select subscription and Foundry resource](images/select-subscription-and-foundry-resource.png) - -Keep the default settings, or adjust the names if needed, then select **Create** to import the models into the AI Gateway: - -![Import models into the AI Gateway](images/import-models-into-ai-gateway.png) - -After a successful import, the newly added models appear under **Models**: - -![Models listed under the AI Gateway](images/models-listed-under-ai-gateway.png) - -#### Configure Agents to Access Models Through the AI Gateway - -After importing the models, configure the agents to access them through the AI Gateway. In **Microsoft Foundry**, open **Manage**, select **Resource details**, and then select **Admin-connected models**: - -![Admin-connected models in Microsoft Foundry](images/admin-connected-models-in-microsoft-foundry.png) - -Select **Add** to open the connection dialog. - -Because the **AI Gateway** SKU is still in preview, select **Other source** instead of **Azure API Management**. Enter the following details: - -- **Connection name**: unique identifier, for instance, `aigateway` -- **Base URL** - 1) Get the Gateway models endpoint from the **AI Gateway** portal: - - ![Get the Gateway models endpoint from the AI Gateway portal](images/get-gateway-models-endpoint.png) - - 2) Get the access key. Create new ones: - - ![Create new access key in the AI Gateway portal](images/create-new-access-key.png) - - Copy the access key and keep it for next steps. Click **Next**. - -- **Authentication**: Select **API Key** and enter the access key you obtained in the previous step. As header name, use `api-key`. Then, **Next** - -Finally, select **Add Model** and configure the following values: - -- **Name**: gpt-5.6-luna -- **Display name**: gpt-5.6-luna -- **Version**: leave it empty -- **Format**: OpenAI - -Select **Save** to finish adding the model, then select **Add** to complete the connection. - -The newly added models should now appear under **Admin-connected models** in Microsoft Foundry: - -![Admin-connected models in Microsoft Foundry](images/admin-connected-models-in-microsoft-foundry-after-adding.png) - -Next, add the new admin-connected model to your agents so they can use it through the AI Gateway. - -Open the **Agents** section in Microsoft Foundry, select the agent you want to configure, such as `EvidenceEnrichmentAgent`, and change its **Model** to the newly added admin-connected model: - -![Select the newly added admin-connected model for the agent](images/select-admin-connected-model-for-agent.png) - -Select **Save** to apply the configuration changes. This creates a new agent version. - -Then test the agent. If you configured `EvidenceEnrichmentAgent`, use this JSON payload: - -```json -{ - "transaction_id": "TX-TEST-0001", - "originator_name": "James Carter", - "origin_account": "83D4B1F30", - "bank_origin": "0121", - "beneficiary_name": "Emily Foster", - "destination_account": "818CCA030", - "bank_destination": "29196", - "amount": 15000, - "currency": "EUR" -} -``` - -The agent should use the newly added admin-connected model to return a response based on the transaction details. - -Return to the **AI Gateway** portal to monitor requests and responses for the newly added admin-connected model. Open **Monitoring** and select **Configure telemetry**. - -![Configure telemetry in the AI Gateway portal](images/configure-telemetry-in-ai-gateway-portal.png) - -Use the existing **Application Insights** instance to monitor telemetry. Select the appropriate instance, then select **Next**: - -![Select Application Insights instance for telemetry in the AI Gateway portal](images/select-application-insights-instance-for-telemetry-in-ai-gateway-portal.png) - -Keep **System-assigned managed identity** as the authentication method, review the configuration, and select **Apply**. - -Allow a minute for the configuration to take effect before looking for telemetry. - -Test the agent again, then review the **Monitoring** section in the AI Gateway portal. Telemetry may take a few moments to appear. You should see a metrics view similar to the following: - -![Telemetry graphs in the AI Gateway portal](images/telemetry-graphs-in-ai-gateway-portal.png) - -If time permits, apply the same model changes to all prompt agents. - -#### Apply a Rate-Limiting Policy - -When multiple agents call the same admin-connected model simultaneously, unrestricted usage can degrade the service. Apply a rate-limiting policy to control usage for each caller identity. - -Open **Models**, select `gpt-5.6-luna`, switch to the **Policies** tab, and select **Add policy**: - -![Add rate limiting policy for the admin-connected model](images/add-rate-limiting-policy-for-admin-connected-model.png) - -Select the **Token rate limit** policy: - -![Select Token rate limit policy in the AI Gateway portal](images/select-token-rate-limit-policy-in-ai-gateway-portal.png) - -Set the desired rate-limit parameters. Keep **Caller identity** as the target; in this case, the identity is the key used to connect Microsoft Foundry to the AI Gateway model: - -![Set rate limit parameters in the AI Gateway portal](images/set-rate-limit-parameters-in-ai-gateway-portal.png) - -Select **Create** to apply the rate-limiting policy. - -Requests that exceed the configured limit will now be throttled, helping to maintain fair usage and service availability. - - -### 3. Proxy the Financial Evidence MCP +### 2. Proxy the Financial Evidence MCP The **AI Gateway** can proxy existing Model Context Protocol (MCP) servers. This applies access, authentication, and rate-limiting policies at the gateway without requiring changes to the MCP implementation. @@ -250,7 +125,7 @@ Test the agent and inspect its traces to verify that it uses `financial-evidence To explore additional gateway policies, open the **Policies** section for `financial-evidence-mcp`. Because the **AI Gateway** is in preview, some MCP features, including the **Monitoring** tab, may still be unavailable. -### 4. Generate an MCP from the Fraud Alert Manager API +### 3. Generate an MCP from the Fraud Alert Manager API The **AI Gateway** can also expose an existing API as an MCP, bringing agent integration and policy management to APIs that were not originally designed as MCP servers. @@ -284,14 +159,14 @@ Explore the new MCP server in the **AI Gateway** playground. For example, list t Next, create `AlertManagerAgent` to interact with `alert-manager-mcp` through the **AI Gateway**, then add the agent to the full orchestration. -### 5. Create the AlertManagerAgent +### 4. Create the AlertManagerAgent This is the fourth agent in the workflow. `AlertManagerAgent` uses `alert-manager-mcp` to manage financial alerts through the **AI Gateway**. Use the following configuration: - Use the agent instructions in `walkthrough/challenge-05/alert-manager-agent/instructions.md`. -- Select the model routed through the **AI Gateway**. +- Select the model: `gpt-5.6-luna` - Onboard the MCP in **Microsoft Foundry** following the usual steps for MCP integration. Remember to add authentication with **API Key**, using header name `api-key` and value a valid API key provided by the **AI Gateway**. - Configure the MCP for the agent and enable auto-approval for all tools. - Save the agent configuration. @@ -886,7 +761,7 @@ Confirm that the new alert appears on the Alert Management dashboard: You can view the alert details or remove the alert to avoid duplicates in later tests. -### 6. Add the Alert Manager Agent to the Orchestration +### 5. Add the Alert Manager Agent to the Orchestration The final task is to add `AlertManagerAgent` to the orchestration so it can process transactions that require operational alerting. From f60be78d5a02f1e385dde47841a8c4f6ec5b1e0e Mon Sep 17 00:00:00 2001 From: Copilot Date: Mon, 7 Sep 2026 21:58:21 +0200 Subject: [PATCH 2/3] update path to relative folders for images --- .../challenges/challenge-01.md | 22 +++++++------- .../challenges/challenge-02.md | 20 ++++++------- .../challenges/challenge-03.md | 24 +++++++-------- .../challenges/challenge-04.md | 30 +++++++++---------- .../challenges/challenge-05.md | 28 ++++++++--------- .../challenges/challenge-06.md | 26 ++++++++-------- .../walkthrough/challenge-01/solution-01.md | 22 +++++++------- .../walkthrough/challenge-02/solution-02.md | 20 ++++++------- .../walkthrough/challenge-03/solution-03.md | 24 +++++++-------- .../walkthrough/challenge-04/solution-04.md | 30 +++++++++---------- .../walkthrough/challenge-05/solution-05.md | 28 ++++++++--------- .../walkthrough/challenge-06/solution-06.md | 26 ++++++++-------- 12 files changed, 150 insertions(+), 150 deletions(-) diff --git a/03-Azure/01-04-AI/07_Fraud_Intelligence/challenges/challenge-01.md b/03-Azure/01-04-AI/07_Fraud_Intelligence/challenges/challenge-01.md index 1e3f6133b..b75150af1 100644 --- a/03-Azure/01-04-AI/07_Fraud_Intelligence/challenges/challenge-01.md +++ b/03-Azure/01-04-AI/07_Fraud_Intelligence/challenges/challenge-01.md @@ -20,15 +20,15 @@ Open the [Azure portal](https://portal.azure.com) and sign in with the credentia When prompted to choose an account, select **Use another account** and enter the credentials provided. Do not use your personal or work account. -![Sign in to the Azure portal with another account](/challenges/images/azureportal.png) +![Sign in to the Azure portal with another account](./images/azureportal.png) In the Azure portal, select **Resource groups** from the navigation menu. -![Resource groups in the Azure portal navigation menu](/challenges/images/resource-groups.png) +![Resource groups in the Azure portal navigation menu](./images/resource-groups.png) Open the resource group assigned to you and confirm that its resources have been deployed successfully. -![Resources deployed in the assigned resource group](/challenges/images/resource-group-resources.png) +![Resources deployed in the assigned resource group](./images/resource-group-resources.png) Verify that you can access the resources used in the later challenges, including the Microsoft Foundry project, model deployments, Azure Cosmos DB account, and Application Insights resource. @@ -38,41 +38,41 @@ Open [GitHub](https://github.com) and sign in with the credentials provided in y When prompted to choose an account, select **Use another account**. Do not use your personal or work account. -![Sign in to GitHub with another account](/challenges/images/github-login.png) +![Sign in to GitHub with another account](./images/github-login.png) Select **Sign in with your identity provider**, then use the assigned lab account to authenticate. Open the GitHub organization assigned to your lab account. -![GitHub organization selector](/challenges/images/github-organization.png) +![GitHub organization selector](./images/github-organization.png) Select the assigned organization, then open the `microhack` repository. You need to fork the repository before you can create a Codespace. To fork the repository, click the **Fork** button in the top-right corner of the repository page and follow the prompts: -![Create fork](/challenges/images/create-fork-1.png) +![Create fork](./images/create-fork-1.png) Use a unique name for the repository name to avoid conflicts with other forks. For example, you can append your lab username to the repository name (e.g., `microhack-labuser-0001`): -![Fork repository with unique name](/challenges/images/create-fork-2.png) +![Fork repository with unique name](./images/create-fork-2.png) Finally, you should see your forked repository with the unique name you provided and all files and folders from the original repository: -![Files and folders in the GitHub repository](/challenges/images/github-repository.png) +![Files and folders in the GitHub repository](./images/github-repository.png) ### 3. Create the development environment From the repository page, select **Code**, then open the **Codespaces** tab. Select the `...` menu and choose **New with options**. -![Create a GitHub Codespace with options](/challenges/images/github-codespaces.png) +![Create a GitHub Codespace with options](./images/github-codespaces.png) For **Dev container configuration**, select **Azure / AI / Fraud Intelligence**, then select **Create codespace**: -![Select Azure / AI / Fraud Intelligence dev container configuration](/challenges/images/select-dev-container.png) +![Select Azure / AI / Fraud Intelligence dev container configuration](./images/select-dev-container.png) GitHub opens the Codespace in a new browser tab. Wait for the container setup to finish, then confirm that the repository files are visible in the Explorer and that the integrated terminal opens without errors. > Important: When the Codespace finishes setting up, you are asked to open the full repository, select **Never**. -![Never open full repository prompt in GitHub Codespace](/challenges/images/never-open-full-repository.png) +![Never open full repository prompt in GitHub Codespace](./images/never-open-full-repository.png) You should have a terminal ready to use, otherwise open a terminal in the Codespace (Terminal > New Terminal). Then run the following command to verify that Azure CLI is installed: diff --git a/03-Azure/01-04-AI/07_Fraud_Intelligence/challenges/challenge-02.md b/03-Azure/01-04-AI/07_Fraud_Intelligence/challenges/challenge-02.md index a8a22952a..b387abacf 100644 --- a/03-Azure/01-04-AI/07_Fraud_Intelligence/challenges/challenge-02.md +++ b/03-Azure/01-04-AI/07_Fraud_Intelligence/challenges/challenge-02.md @@ -103,7 +103,7 @@ echo "financialEvidenceMcpEndpoint=https://$functionAppName.azurewebsites.net/ru In the Azure portal, open the Function App and select **Functions** > **App keys** > **System keys**. -![MCP extension system key](/challenges/images/fin-evidence-mcp-key.png) +![MCP extension system key](./images/fin-evidence-mcp-key.png) Copy the value of the `mcp_extension` key and add it to `hackenv`: @@ -123,7 +123,7 @@ The agent will use the Financial Evidence MCP to retrieve evidence from Cosmos D In the Azure portal, open your **Microsoft Foundry** resource and select **Go to Foundry Portal**. Sign in using your Hackbox credentials. -![Microsoft Foundry login](/challenges/images/foundry-login.png) +![Microsoft Foundry login](./images/foundry-login.png) #### Explore the Foundry project @@ -133,7 +133,7 @@ Next, connect the Application Insights resource deployed in your environment to Open **Manage** and select **Project details** from the left menu. Select **Connected resources**, then **Add connection**. -![Connected resources in Microsoft Foundry](/challenges/images/foundry-connected-resources.png) +![Connected resources in Microsoft Foundry](./images/foundry-connected-resources.png) Select **Application Insights**, then select **Continue**. Choose the Application Insights resource deployed for your lab, leave **API key** as the authentication method, and select **Connect**. @@ -141,13 +141,13 @@ Select **Application Insights**, then select **Continue**. Choose the Applicatio Under **Build**, open **Agents**, select **New agent**, then select **Build an agent**. -![Create a new agent in Microsoft Foundry](/challenges/images/foundry-new-agent.png) +![Create a new agent in Microsoft Foundry](./images/foundry-new-agent.png) Name the agent `EvidenceEnrichmentAgent`. The new agent opens with a blank configuration: -![Blank agent in Microsoft Foundry](/challenges/images/foundry-blank-agent.png) +![Blank agent in Microsoft Foundry](./images/foundry-blank-agent.png) The chat model is selected automatically because it is the only deployed model that can power this agent. The embedding deployment is not a chat model. @@ -161,7 +161,7 @@ Select **Add** > **Add tools**, open the **Custom** tab, select **Model Context The MCP configuration form opens: -![Configure MCP tool in Microsoft Foundry](/challenges/images/foundry-configure-mcp-tool.png) +![Configure MCP tool in Microsoft Foundry](./images/foundry-configure-mcp-tool.png) Configure these values: @@ -175,11 +175,11 @@ Select **Connect**. Foundry returns to the agent page and displays the new MCP t Open the MCP tool's `...` menu and select **Configure**: -![Configure MCP tool menu in Microsoft Foundry](/challenges/images/foundry-configure-mcp-tool-menu.png) +![Configure MCP tool menu in Microsoft Foundry](./images/foundry-configure-mcp-tool-menu.png) Then enable **Always auto-approve all tools**. -![Configure auto approve for all tools in Microsoft Foundry](/challenges/images/foundry-auto-approve-tools.png) +![Configure auto approve for all tools in Microsoft Foundry](./images/foundry-auto-approve-tools.png) This setting allows the agent to use the MCP tools without requesting approval for every call. @@ -189,7 +189,7 @@ Select **Save**. Foundry creates a new version of the agent. Open the **Playground** to test the agent. -![Test the agent in Microsoft Foundry Playground](/challenges/images/foundry-test-agent.png) +![Test the agent in Microsoft Foundry Playground](./images/foundry-test-agent.png) Submit this transaction: @@ -211,7 +211,7 @@ The response should be a JSON object that contains the original transaction enri For this example, the agent should find three pieces of evidence. To inspect the trace, scroll to the bottom and select **Traces**. It shows the agent calling the MCP tools according to its instructions and using the returned evidence to enrich the transaction. -![Traces showing evidence data returned by the MCP tool](/challenges/images/foundry-traces-evidence.png) +![Traces showing evidence data returned by the MCP tool](./images/foundry-traces-evidence.png) Select any **Execute tool** span to inspect the data returned by the MCP. diff --git a/03-Azure/01-04-AI/07_Fraud_Intelligence/challenges/challenge-03.md b/03-Azure/01-04-AI/07_Fraud_Intelligence/challenges/challenge-03.md index 5a003fdef..7a05bf089 100644 --- a/03-Azure/01-04-AI/07_Fraud_Intelligence/challenges/challenge-03.md +++ b/03-Azure/01-04-AI/07_Fraud_Intelligence/challenges/challenge-03.md @@ -36,7 +36,7 @@ Build the Foundry IQ knowledge base that will support the Regulatory Assessment In **Foundry**, open the **Build** section. Then select **Knowledge** in the left navigation pane to open the main interface for managing your knowledge base: -![Foundry IQ Knowledge](images/foundry-iq-knowledge.png) +![Foundry IQ Knowledge](./images/foundry-iq-knowledge.png) To learn more about how Foundry IQ works, watch the video available on this page. @@ -44,7 +44,7 @@ At the bottom of the page, select **Create new resource** to start building your Use the defaults, accept the acknowledgment, and proceed to create the new knowledge base resource: -![Foundry IQ Create New Resource](images/foundry-iq-create-new-resource.png) +![Foundry IQ Create New Resource](./images/foundry-iq-create-new-resource.png) Under the hood, a new **Azure AI Search** resource is being created to support the knowledge base. This resource will handle the indexing and retrieval of policy documents, ensuring that the Regulatory Assessment Agent can access the necessary information efficiently. @@ -57,11 +57,11 @@ After the resource is created, select **Create a knowledge base** and set the fo - **Output mode**: Extractive data - **Retrieval instructions**: You have to always retrieve first the global policies and rules. -![Foundry IQ Knowledge Base Creation](images/foundry-iq-knowledge-base-creation.png) +![Foundry IQ Knowledge Base Creation](./images/foundry-iq-knowledge-base-creation.png) Then select **Add sources** and review the available source types for your knowledge base. -![Foundry IQ Add Sources](images/foundry-iq-add-sources.png) +![Foundry IQ Add Sources](./images/foundry-iq-add-sources.png) Stop here for now. The next section creates the storage account and containers for the policy documents. @@ -111,13 +111,13 @@ az storage blob upload-batch --account-name "$foundryAccountName" --destination To verify that the policy documents were uploaded successfully, open the **Storage Account** in the Azure portal and check the contents of each container: -![Storage Account Contents](images/storage-account-contents.png) +![Storage Account Contents](./images/storage-account-contents.png) Return to the **Foundry IQ** interface to continue adding and managing your policy sources. You can now add the policy sources from the Azure Blob storage containers you created. Select **Add Sources**, then choose **Azure Blob Storage** as the source type. -![Add Azure Blob Storage Source](images/add-azure-blob-storage-source.png) +![Add Azure Blob Storage Source](./images/add-azure-blob-storage-source.png) For each container, fill in the required details and click **Create** to link it as a policy source. @@ -131,7 +131,7 @@ The following example shows how to link the `global` container as a policy sourc - **Embedding model**: text-embedding-3-large - **Chat completion model**: Not needed -![Link Global Container](images/link-global-container.png) +![Link Global Container](./images/link-global-container.png) The **Status** of the policy source displays **Creating** while it is being linked. During this process, **AI Search** begins indexing the policy documents in the container. To monitor indexing, open the **Search Service** resource and review the following areas: - **Search management**: go into **Indexes** and **Indexers** to monitor the indexing process. @@ -156,11 +156,11 @@ Relevant steps you should not miss include: Next, add **Knowledge** by selecting **Add**, then **Connect to Foundry IQ**: -![Connect to Foundry IQ](images/connect-to-foundry-iq.png) +![Connect to Foundry IQ](./images/connect-to-foundry-iq.png) Select the **Knowledge Base** you created (`kb-aml`), then select **Connect**: -![Connect to Knowledge Base](images/connect-to-knowledge-base.png) +![Connect to Knowledge Base](./images/connect-to-knowledge-base.png) Finally, select **Save** to create the new agent and make it ready for use. @@ -356,7 +356,7 @@ This is an example JSON output from the `EvidenceEnrichmentAgent`: The output contains the enrichment details from the previous agent and additional context provided by the `global` policy source. Expand all evaluated files by selecting **+NN** at the bottom of the response: -![Expand all files](images/foundry-iq-global.png) +![Expand all files](./images/foundry-iq-global.png) Confirm that all files come from the `global` policy source by checking for `global` in each path. @@ -402,11 +402,11 @@ You do not need to modify the agent. The **Knowledge Base** provides a centraliz Finally, test the agent again and verify that its response and sources reflect the addition of the internal and regional policy sources. For example, if you use the JSON provided earlier, you should now see files for the transaction's origin and destination countries: -![alt text showing the updated agent response with internal and regional policy sources](images/foundry-iq-regional.png) +![alt text showing the updated agent response with internal and regional policy sources](./images/foundry-iq-regional.png) You can also select **Traces** to review the agent's queries and how it retrieved the sources: -![alt text showing the agent's trace of queries and source retrieval process](images/foundry-iq-traces.png) +![alt text showing the agent's trace of queries and source retrieval process](./images/foundry-iq-traces.png) ## 🚀 Go Further diff --git a/03-Azure/01-04-AI/07_Fraud_Intelligence/challenges/challenge-04.md b/03-Azure/01-04-AI/07_Fraud_Intelligence/challenges/challenge-04.md index 3c6305c95..0dc8cf0e6 100644 --- a/03-Azure/01-04-AI/07_Fraud_Intelligence/challenges/challenge-04.md +++ b/03-Azure/01-04-AI/07_Fraud_Intelligence/challenges/challenge-04.md @@ -807,7 +807,7 @@ Ensure that the agents are defined correctly in the `main.py` file and that thei Those names and versions should be set correctly in the `main.py` file: -![Agents versions](images/agents-versions.png) +![Agents versions](./images/agents-versions.png) ### 4. Configure and Run the Orchestration Locally @@ -833,16 +833,16 @@ The script will set up a virtual environment, install the required dependencies, In the logs, you should see the initialization of each agent: -![Agents initialization](images/agents-initialization.png) +![Agents initialization](./images/agents-initialization.png) The final trace shows the port on which the agent is listening: -![Final trace showing the port the agent is listening on](images/orchestration-started.png) +![Final trace showing the port the agent is listening on](./images/orchestration-started.png) To test the orchestration locally, select the **Foundry Toolkit** icon in Visual Studio Code and use the **Agent inspector** tool to interact with the running agents: -![Agent inspector tool in Foundry Toolkit](images/agent-inspector.png) +![Agent inspector tool in Foundry Toolkit](./images/agent-inspector.png) Then use the initial JSON request from Challenge 2 to interact with the agents: ```json @@ -868,17 +868,17 @@ The result should be a Markdown report containing the transaction details and th Before deploying, ensure that you are signed in to your Azure account. Use the Azure extension in Visual Studio Code for this process. Select the **Azure** icon in the left sidebar to open the extension panel: -![Azure Extension new account](images/azure-extension-new-account.png) +![Azure Extension new account](./images/azure-extension-new-account.png) Select **Sign in with new account** and enter the credentials for the Azure account provided for the lab. Before proceeding, confirm that the correct Azure subscription is selected. Open **View** > **Command Palette**, then search for `Azure: Select Subscriptions` and choose the appropriate subscription: -![Command Palette](images/command-palette.png) +![Command Palette](./images/command-palette.png) Then: -![Select Subscription in Azure](images/select-azure-subscription.png) +![Select Subscription in Azure](./images/select-azure-subscription.png) Return to the **Foundry Toolkit** extension and set your **Foundry project** as the default. Under **My resources**, select **Set Foundry project**, then choose the project used for this lab. @@ -902,27 +902,27 @@ Follow these steps to deploy your orchestration. Ensure you use: - **Package mode**: Remote - **Deploy to**: New agent, as it is the first deployment of this orchestration -![Deploy to Microsoft Foundry](images/deploy-to-microsoft-foundry.png) +![Deploy to Microsoft Foundry](./images/deploy-to-microsoft-foundry.png) Finally, review the deployment options before confirming the deployment: -![Review deployment options](images/review-deployment-options.png) +![Review deployment options](./images/review-deployment-options.png) Track the deployment progress in the **Output** panel in Visual Studio Code by selecting **Foundry Toolkit** as the output source: -![Deployment progress in Output panel](images/deployment-progress-in-output-panel.png) +![Deployment progress in Output panel](./images/deployment-progress-in-output-panel.png) Once the deployment is complete, you can run a test using the **Hosted Agent Playground**: -![Hosted Agent Playground](images/hosted-agent-playground.png) +![Hosted Agent Playground](./images/hosted-agent-playground.png) The new hosted agent also appears under **Agents** in the **Microsoft Foundry** portal, where you can interact with it and test its functionality: -![Microsoft Foundry Agents](images/microsoft-foundry-hosted-agents.png) +![Microsoft Foundry Agents](./images/microsoft-foundry-hosted-agents.png) Test it from the playground as well: -![Try from the playground](images/try-from-the-playground.png) +![Try from the playground](./images/try-from-the-playground.png) ### 6. Review Traces @@ -930,11 +930,11 @@ Challenge 6 explores this topic in depth. For now, take a preliminary look at th In the agent playground, select **Traces**: -![Traces in the agent's playground](images/traces-in-agents-playground.png) +![Traces in the agent's playground](./images/traces-in-agents-playground.png) Open the last trace to inspect the detailed execution flow of your orchestration: -![Detailed execution flow of the last trace](images/detailed-execution-flow-of-last-trace.png) +![Detailed execution flow of the last trace](./images/detailed-execution-flow-of-last-trace.png) We will explore tracing and metrics in more depth in Challenge 6. For now, this preliminary view is enough to confirm that the three agents ran in the expected sequence. diff --git a/03-Azure/01-04-AI/07_Fraud_Intelligence/challenges/challenge-05.md b/03-Azure/01-04-AI/07_Fraud_Intelligence/challenges/challenge-05.md index d7b56550e..f154e5f06 100644 --- a/03-Azure/01-04-AI/07_Fraud_Intelligence/challenges/challenge-05.md +++ b/03-Azure/01-04-AI/07_Fraud_Intelligence/challenges/challenge-05.md @@ -51,7 +51,7 @@ Open the [AI Gateway portal](https://ai.gateway.azure.com/) and sign in with the - **Resource group**: the existing lab resource group - **Enable managed identity** -![AI Gateway deployment screenshot](images/ai-gateway-deployment.png) +![AI Gateway deployment screenshot](./images/ai-gateway-deployment.png) ### 2. Proxy the Financial Evidence MCP @@ -59,11 +59,11 @@ The **AI Gateway** can proxy existing Model Context Protocol (MCP) servers. This Next, onboard the existing `financial evidence` MCP to the AI Gateway. In the **AI Gateway** portal, open the **MCP servers** section and select **Add MCP server**: -![Add MCP server in the AI Gateway portal](images/add-mcp-server-in-ai-gateway-portal.png) +![Add MCP server in the AI Gateway portal](./images/add-mcp-server-in-ai-gateway-portal.png) The portal supports three backend types: -![Supported backend types in the AI Gateway portal](images/supported-backend-types-in-ai-gateway-portal.png) +![Supported backend types in the AI Gateway portal](./images/supported-backend-types-in-ai-gateway-portal.png) Select **MCP server**, then provide the details required to connect to the existing Financial Evidence MCP: @@ -77,19 +77,19 @@ Select **Next**, validate the configuration, and select **Create** to add the MC You can now test the MCP from the **AI Gateway**. Select **Use**: -![Test the MCP from the AI Gateway](images/test-mcp-from-ai-gateway.png) +![Test the MCP from the AI Gateway](./images/test-mcp-from-ai-gateway.png) Select the **Try it** tab, then select **List tools**. You should see all tools exposed by the Financial Evidence MCP: -![List tools in the financial evidence MCP](images/list-tools-in-financial-evidence-mcp.png) +![List tools in the financial evidence MCP](./images/list-tools-in-financial-evidence-mcp.png) Select the **Get Bank Information** operation, enter `0121` as the bank ID, and select **Run tool**: -![Run Get Bank Information tool in the financial evidence MCP](images/run-get-bank-information-tool-in-financial-evidence-mcp.png) +![Run Get Bank Information tool in the financial evidence MCP](./images/run-get-bank-information-tool-in-financial-evidence-mcp.png) The result should display information for bank ID `0121`. Expand the `data` element to view the details: -![View detailed bank information in the financial evidence MCP](images/view-detailed-bank-information-in-financial-evidence-mcp.png) +![View detailed bank information in the financial evidence MCP](./images/view-detailed-bank-information-in-financial-evidence-mcp.png) You can now interact with the Financial Evidence MCP through the **AI Gateway**. Next, configure `EvidenceEnrichmentAgent` to use it. @@ -97,7 +97,7 @@ You can now interact with the Financial Evidence MCP through the **AI Gateway**. Return to the **Microsoft Foundry** portal. Under **Build**, select **Agents**, then select `EvidenceEnrichmentAgent`. Remove the existing tool to ensure that the agent uses the latest MCP configuration: -![Remove existing tool from the EvidenceEnrichmentAgent](images/remove-existing-tool-from-evidenceenrichmentagent.png) +![Remove existing tool from the EvidenceEnrichmentAgent](./images/remove-existing-tool-from-evidenceenrichmentagent.png) Select **Save**, then open the **Tools** menu on the left side of the page. @@ -110,13 +110,13 @@ Then select **Update**. On the same MCP configuration page, select **Use in an agent**: -![Use the MCP in an agent](images/use-mcp-in-agent.png) +![Use the MCP in an agent](./images/use-mcp-in-agent.png) Select `EvidenceEnrichmentAgent` as the agent that will use this MCP. Under the `EvidenceEnrichmentAgent` **Tools** section, verify that the `financial-evidence-mcp` endpoint shows the new **AI Gateway** configuration. Enable **Always auto-approve all tools**: -![Configure Always auto-approve all tools](images/configure-always-auto-approve-all-tools.png) +![Configure Always auto-approve all tools](./images/configure-always-auto-approve-all-tools.png) **Save** the agent again to apply the new configuration. @@ -148,13 +148,13 @@ Select **Add MCP server**, choose **OpenAPI Specification**, and complete the fo - **Spec URL**: Paste the URL you obtained from the previous step. - **Authentication**: Select **None** because the lab API does not require authentication. -![Add MCP server](images/add-mcp-server-from-api.png) +![Add MCP server](./images/add-mcp-server-from-api.png) Select **Next**, validate the configuration, and select **Create** to add the MCP server. Explore the new MCP server in the **AI Gateway** playground. For example, list the existing alerts: -![List existing alerts](images/list-existing-alerts.png) +![List existing alerts](./images/list-existing-alerts.png) Next, create `AlertManagerAgent` to interact with `alert-manager-mcp` through the **AI Gateway**, then add the agent to the full orchestration. @@ -186,7 +186,7 @@ echo "https://$endpoint" Open the URL. Before testing, the dashboard contains five alerts: -![List of current alerts](images/list-of-current-alerts.png) +![List of current alerts](./images/list-of-current-alerts.png) Test `AlertManagerAgent` by sending it the following JSON payload: @@ -756,7 +756,7 @@ Test `AlertManagerAgent` by sending it the following JSON payload: Confirm that the new alert appears on the Alert Management dashboard: -![Alert Management dashboard showing the new alert](images/alert-management-dashboard.png) +![Alert Management dashboard showing the new alert](./images/alert-management-dashboard.png) You can view the alert details or remove the alert to avoid duplicates in later tests. diff --git a/03-Azure/01-04-AI/07_Fraud_Intelligence/challenges/challenge-06.md b/03-Azure/01-04-AI/07_Fraud_Intelligence/challenges/challenge-06.md index b9c284cb8..e454ef74c 100644 --- a/03-Azure/01-04-AI/07_Fraud_Intelligence/challenges/challenge-06.md +++ b/03-Azure/01-04-AI/07_Fraud_Intelligence/challenges/challenge-06.md @@ -34,11 +34,11 @@ In Challenge 2, you connected **App Insights** to **Microsoft Foundry**, but you Open the **Monitor** tab for any agent to review its captured metrics. To access the underlying traces, logs, and custom telemetry, select **Open in Azure Monitor**: -![Open in Azure Monitor](/challenges/images/open-in-azure-monitor.png) +![Open in Azure Monitor](./images/open-in-azure-monitor.png) You should see a dashboard similar to the one below, showing the default telemetry captured by Application Insights: -![Application Insights Dashboard](/challenges/images/agents-appins-dashboard.png) +![Application Insights Dashboard](./images/agents-appins-dashboard.png) Explore the sections and panels to understand the default telemetry and how it reflects agent behavior. @@ -46,17 +46,17 @@ Next, inspect a complete orchestration trace to see how the components interact Select **View Traces with Agent Runs**, then choose a **Dependency**: -![View Traces with Agent Runs](/challenges/images/view-traces-with-agent-runs.png) +![View Traces with Agent Runs](./images/view-traces-with-agent-runs.png) The detailed trace shows the selected dependency within its orchestration run, including its interactions with other components and the telemetry correlation across the workflow. To explore and filter all traces, open **Search** in the **Investigate** section of the left sidebar: -![Search in Investigate section](/challenges/images/search-in-investigate-section.png) +![Search in Investigate section](./images/search-in-investigate-section.png) Select a trace to review its execution details, including spans, attributes, and related telemetry: -![Trace Details](/challenges/images/trace-details.png) +![Trace Details](./images/trace-details.png) These insights are provided by Application Insights through the agents' default auto-instrumentation. @@ -69,7 +69,7 @@ The updated orchestration adds executors after specific agent executions. These The new code is under `/walkthrough/challenge-06/orchestration`. Review the main orchestration code to see where the custom telemetry executors run after specific agent executions. The following image highlights the main changes: -![Main Orchestration Code with Custom Telemetry Executors](/challenges/images/main-orchestration-code-with-custom-telemetry-executors.png) +![Main Orchestration Code with Custom Telemetry Executors](./images/main-orchestration-code-with-custom-telemetry-executors.png) The metric definitions and configuration are in `walkthrough/challenge-06/orchestration/src/business_metrics.py`. @@ -112,15 +112,15 @@ The script sends the number of requests specified by the `--count` argument. In **Application Insights**, verify that the custom telemetry is being captured. Open **Logs** under **Monitoring**, select the `customMetrics` table, and run a query to view the recorded metrics. -![Custom Telemetry in Application Insights](/challenges/images/custom-telemetry-in-application-insights.png) +![Custom Telemetry in Application Insights](./images/custom-telemetry-in-application-insights.png) You should see metrics similar to those shown below: -![Custom Metrics in Application Insights](/challenges/images/custom-metrics-in-application-insights.png) +![Custom Metrics in Application Insights](./images/custom-metrics-in-application-insights.png) You can also query specific custom metrics directly from **Logs**. Open the selector on the right, choose **KQL mode**, enter a query in the editor, and select **Run**: -![Custom Metrics Query in Application Insights](/challenges/images/custom-metrics-query-in-application-insights.png) +![Custom Metrics Query in Application Insights](./images/custom-metrics-query-in-application-insights.png) The following example queries provide several views of the custom metrics: @@ -177,7 +177,7 @@ customMetrics The following image shows the result of the last query: -![Result of AML Typology Detected by Pattern Type Query](/challenges/images/result-of-aml-typology-detected-by-pattern-type-query.png) +![Result of AML Typology Detected by Pattern Type Query](./images/result-of-aml-typology-detected-by-pattern-type-query.png) Explore additional queries and visualizations as needed. @@ -189,11 +189,11 @@ Use Grafana to create interactive dashboards for the custom metrics queried in A Return to the **Agents (Preview)** section introduced at the beginning of the lab, then select **Explore in Grafana** to open the Grafana integration: -![Explore in Grafana](/challenges/images/explore-in-grafana.png) +![Explore in Grafana](./images/explore-in-grafana.png) Grafana provides prebuilt dashboards and panels for visualizing the default telemetry: -![Pre-built Dashboards in Grafana](/challenges/images/pre-built-dashboards-in-grafana.png) +![Pre-built Dashboards in Grafana](./images/pre-built-dashboards-in-grafana.png) Explore these dashboards to become familiar with the interface. @@ -212,7 +212,7 @@ Then, use the following settings: Select the correct **Application Insights** resource, whose name starts with `appi-fraud`. The imported dashboard should display panels similar to those below: -![Custom metrics Grafana Dashboards](/challenges/images/custom-metrics-grafana-dashboards.png) +![Custom metrics Grafana Dashboards](./images/custom-metrics-grafana-dashboards.png) You have now imported the dashboard and visualized the custom metrics in Grafana. diff --git a/03-Azure/01-04-AI/07_Fraud_Intelligence/walkthrough/challenge-01/solution-01.md b/03-Azure/01-04-AI/07_Fraud_Intelligence/walkthrough/challenge-01/solution-01.md index 3d9655b49..c72e88b16 100644 --- a/03-Azure/01-04-AI/07_Fraud_Intelligence/walkthrough/challenge-01/solution-01.md +++ b/03-Azure/01-04-AI/07_Fraud_Intelligence/walkthrough/challenge-01/solution-01.md @@ -20,15 +20,15 @@ Open the [Azure portal](https://portal.azure.com) and sign in with the credentia When prompted to choose an account, select **Use another account** and enter the credentials provided. Do not use your personal or work account. -![Sign in to the Azure portal with another account](/challenges/images/azureportal.png) +![Sign in to the Azure portal with another account](../../challenges/images/azureportal.png) In the Azure portal, select **Resource groups** from the navigation menu. -![Resource groups in the Azure portal navigation menu](/challenges/images/resource-groups.png) +![Resource groups in the Azure portal navigation menu](../../challenges/images/resource-groups.png) Open the resource group assigned to you and confirm that its resources have been deployed successfully. -![Resources deployed in the assigned resource group](/challenges/images/resource-group-resources.png) +![Resources deployed in the assigned resource group](../../challenges/images/resource-group-resources.png) Verify that you can access the resources used in the later challenges, including the Microsoft Foundry project, model deployments, Azure Cosmos DB account, and Application Insights resource. @@ -38,41 +38,41 @@ Open [GitHub](https://github.com) and sign in with the credentials provided in y When prompted to choose an account, select **Use another account**. Do not use your personal or work account. -![Sign in to GitHub with another account](/challenges/images/github-login.png) +![Sign in to GitHub with another account](../../challenges/images/github-login.png) Select **Sign in with your identity provider**, then use the assigned lab account to authenticate. Open the GitHub organization assigned to your lab account. -![GitHub organization selector](/challenges/images/github-organization.png) +![GitHub organization selector](../../challenges/images/github-organization.png) Select the assigned organization, then open the `microhack` repository. You need to fork the repository before you can create a Codespace. To fork the repository, click the **Fork** button in the top-right corner of the repository page and follow the prompts: -![Create fork](/challenges/images/create-fork-1.png) +![Create fork](../../challenges/images/create-fork-1.png) Use a unique name for the repository name to avoid conflicts with other forks. For example, you can append your lab username to the repository name (e.g., `microhack-labuser-0001`): -![Fork repository with unique name](/challenges/images/create-fork-2.png) +![Fork repository with unique name](../../challenges/images/create-fork-2.png) Finally, you should see your forked repository with the unique name you provided and all files and folders from the original repository: -![Files and folders in the GitHub repository](/challenges/images/github-repository.png) +![Files and folders in the GitHub repository](../../challenges/images/github-repository.png) ### 3. Create the development environment From the repository page, select **Code**, then open the **Codespaces** tab. Select the `...` menu and choose **New with options**. -![Create a GitHub Codespace with options](/challenges/images/github-codespaces.png) +![Create a GitHub Codespace with options](../../challenges/images/github-codespaces.png) For **Dev container configuration**, select **Azure / AI / Fraud Intelligence**, then select **Create codespace**: -![Select Azure / AI / Fraud Intelligence dev container configuration](/challenges/images/select-dev-container.png) +![Select Azure / AI / Fraud Intelligence dev container configuration](../../challenges/images/select-dev-container.png) GitHub opens the Codespace in a new browser tab. Wait for the container setup to finish, then confirm that the repository files are visible in the Explorer and that the integrated terminal opens without errors. > Important: When the Codespace finishes setting up, you are asked to open the full repository, select **Never**. -![Never open full repository prompt in GitHub Codespace](/challenges/images/never-open-full-repository.png) +![Never open full repository prompt in GitHub Codespace](../../challenges/images/never-open-full-repository.png) You should have a terminal ready to use, otherwise open a terminal in the Codespace (Terminal > New Terminal). Then run the following command to verify that Azure CLI is installed: diff --git a/03-Azure/01-04-AI/07_Fraud_Intelligence/walkthrough/challenge-02/solution-02.md b/03-Azure/01-04-AI/07_Fraud_Intelligence/walkthrough/challenge-02/solution-02.md index fae7e4c5c..e2a9ba099 100644 --- a/03-Azure/01-04-AI/07_Fraud_Intelligence/walkthrough/challenge-02/solution-02.md +++ b/03-Azure/01-04-AI/07_Fraud_Intelligence/walkthrough/challenge-02/solution-02.md @@ -103,7 +103,7 @@ echo "financialEvidenceMcpEndpoint=https://$functionAppName.azurewebsites.net/ru In the Azure portal, open the Function App and select **Functions** > **App keys** > **System keys**. -![MCP extension system key](/challenges/images/fin-evidence-mcp-key.png) +![MCP extension system key](../../challenges/images/fin-evidence-mcp-key.png) Copy the value of the `mcp_extension` key and add it to `hackenv`: @@ -123,7 +123,7 @@ The agent will use the Financial Evidence MCP to retrieve evidence from Cosmos D In the Azure portal, open your **Microsoft Foundry** resource and select **Go to Foundry Portal**. Sign in using your Hackbox credentials. -![Microsoft Foundry login](/challenges/images/foundry-login.png) +![Microsoft Foundry login](../../challenges/images/foundry-login.png) #### Explore the Foundry project @@ -133,7 +133,7 @@ Next, connect the Application Insights resource deployed in your environment to Open **Manage** and select **Project details** from the left menu. Select **Connected resources**, then **Add connection**. -![Connected resources in Microsoft Foundry](/challenges/images/foundry-connected-resources.png) +![Connected resources in Microsoft Foundry](../../challenges/images/foundry-connected-resources.png) Select **Application Insights**, then select **Continue**. Choose the Application Insights resource deployed for your lab, leave **API key** as the authentication method, and select **Connect**. @@ -141,13 +141,13 @@ Select **Application Insights**, then select **Continue**. Choose the Applicatio Under **Build**, open **Agents**, select **New agent**, then select **Build an agent**. -![Create a new agent in Microsoft Foundry](/challenges/images/foundry-new-agent.png) +![Create a new agent in Microsoft Foundry](../../challenges/images/foundry-new-agent.png) Name the agent `EvidenceEnrichmentAgent`. The new agent opens with a blank configuration: -![Blank agent in Microsoft Foundry](/challenges/images/foundry-blank-agent.png) +![Blank agent in Microsoft Foundry](../../challenges/images/foundry-blank-agent.png) The chat model is selected automatically because it is the only deployed model that can power this agent. The embedding deployment is not a chat model. @@ -161,7 +161,7 @@ Select **Add** > **Add tools**, open the **Custom** tab, select **Model Context The MCP configuration form opens: -![Configure MCP tool in Microsoft Foundry](/challenges/images/foundry-configure-mcp-tool.png) +![Configure MCP tool in Microsoft Foundry](../../challenges/images/foundry-configure-mcp-tool.png) Configure these values: @@ -175,11 +175,11 @@ Select **Connect**. Foundry returns to the agent page and displays the new MCP t Open the MCP tool's `...` menu and select **Configure**: -![Configure MCP tool menu in Microsoft Foundry](/challenges/images/foundry-configure-mcp-tool-menu.png) +![Configure MCP tool menu in Microsoft Foundry](../../challenges/images/foundry-configure-mcp-tool-menu.png) Then enable **Always auto-approve all tools**. -![Configure auto approve for all tools in Microsoft Foundry](/challenges/images/foundry-auto-approve-tools.png) +![Configure auto approve for all tools in Microsoft Foundry](../../challenges/images/foundry-auto-approve-tools.png) This setting allows the agent to use the MCP tools without requesting approval for every call. @@ -189,7 +189,7 @@ Select **Save**. Foundry creates a new version of the agent. Open the **Playground** to test the agent. -![Test the agent in Microsoft Foundry Playground](/challenges/images/foundry-test-agent.png) +![Test the agent in Microsoft Foundry Playground](../../challenges/images/foundry-test-agent.png) Submit this transaction: @@ -211,7 +211,7 @@ The response should be a JSON object that contains the original transaction enri For this example, the agent should find three pieces of evidence. To inspect the trace, scroll to the bottom and select **Traces**. It shows the agent calling the MCP tools according to its instructions and using the returned evidence to enrich the transaction. -![Traces showing evidence data returned by the MCP tool](/challenges/images/foundry-traces-evidence.png) +![Traces showing evidence data returned by the MCP tool](../../challenges/images/foundry-traces-evidence.png) Select any **Execute tool** span to inspect the data returned by the MCP. diff --git a/03-Azure/01-04-AI/07_Fraud_Intelligence/walkthrough/challenge-03/solution-03.md b/03-Azure/01-04-AI/07_Fraud_Intelligence/walkthrough/challenge-03/solution-03.md index bfaa60577..7a4819e29 100644 --- a/03-Azure/01-04-AI/07_Fraud_Intelligence/walkthrough/challenge-03/solution-03.md +++ b/03-Azure/01-04-AI/07_Fraud_Intelligence/walkthrough/challenge-03/solution-03.md @@ -36,7 +36,7 @@ Build the Foundry IQ knowledge base that will support the Regulatory Assessment In **Foundry**, open the **Build** section. Then select **Knowledge** in the left navigation pane to open the main interface for managing your knowledge base: -![Foundry IQ Knowledge](/challenges/images/foundry-iq-knowledge.png) +![Foundry IQ Knowledge](../../challenges/images/foundry-iq-knowledge.png) To learn more about how Foundry IQ works, watch the video available on this page. @@ -44,7 +44,7 @@ At the bottom of the page, select **Create new resource** to start building your Use the defaults, accept the acknowledgment, and proceed to create the new knowledge base resource: -![Foundry IQ Create New Resource](/challenges/images/foundry-iq-create-new-resource.png) +![Foundry IQ Create New Resource](../../challenges/images/foundry-iq-create-new-resource.png) Under the hood, a new **Azure AI Search** resource is being created to support the knowledge base. This resource will handle the indexing and retrieval of policy documents, ensuring that the Regulatory Assessment Agent can access the necessary information efficiently. @@ -57,11 +57,11 @@ After the resource is created, select **Create a knowledge base** and set the fo - **Output mode**: Extractive data - **Retrieval instructions**: You have to always retrieve first the global policies and rules. -![Foundry IQ Knowledge Base Creation](/challenges/images/foundry-iq-knowledge-base-creation.png) +![Foundry IQ Knowledge Base Creation](../../challenges/images/foundry-iq-knowledge-base-creation.png) Then select **Add sources** and review the available source types for your knowledge base. -![Foundry IQ Add Sources](/challenges/images/foundry-iq-add-sources.png) +![Foundry IQ Add Sources](../../challenges/images/foundry-iq-add-sources.png) Stop here for now. The next section creates the storage account and containers for the policy documents. @@ -111,13 +111,13 @@ az storage blob upload-batch --account-name "$foundryAccountName" --destination To verify that the policy documents were uploaded successfully, open the **Storage Account** in the Azure portal and check the contents of each container: -![Storage Account Contents](/challenges/images/storage-account-contents.png) +![Storage Account Contents](../../challenges/images/storage-account-contents.png) Return to the **Foundry IQ** interface to continue adding and managing your policy sources. You can now add the policy sources from the Azure Blob storage containers you created. Select **Add Sources**, then choose **Azure Blob Storage** as the source type. -![Add Azure Blob Storage Source](/challenges/images/add-azure-blob-storage-source.png) +![Add Azure Blob Storage Source](../../challenges/images/add-azure-blob-storage-source.png) For each container, fill in the required details and click **Create** to link it as a policy source. @@ -131,7 +131,7 @@ The following example shows how to link the `global` container as a policy sourc - **Embedding model**: text-embedding-3-large - **Chat completion model**: Not needed -![Link Global Container](/challenges/images/link-global-container.png) +![Link Global Container](../../challenges/images/link-global-container.png) The **Status** of the policy source displays **Creating** while it is being linked. During this process, **AI Search** begins indexing the policy documents in the container. To monitor indexing, open the **Search Service** resource and review the following areas: - **Search management**: go into **Indexes** and **Indexers** to monitor the indexing process. @@ -156,11 +156,11 @@ Relevant steps you should not miss include: Next, add **Knowledge** by selecting **Add**, then **Connect to Foundry IQ**: -![Connect to Foundry IQ](/challenges/images/connect-to-foundry-iq.png) +![Connect to Foundry IQ](../../challenges/images/connect-to-foundry-iq.png) Select the **Knowledge Base** you created (`kb-aml`), then select **Connect**: -![Connect to Knowledge Base](/challenges/images/connect-to-knowledge-base.png) +![Connect to Knowledge Base](../../challenges/images/connect-to-knowledge-base.png) Finally, select **Save** to create the new agent and make it ready for use. @@ -356,7 +356,7 @@ This is an example JSON output from the `EvidenceEnrichmentAgent`: The output contains the enrichment details from the previous agent and additional context provided by the `global` policy source. Expand all evaluated files by selecting **+NN** at the bottom of the response: -![Expand all files](/challenges/images/foundry-iq-global.png) +![Expand all files](../../challenges/images/foundry-iq-global.png) Confirm that all files come from the `global` policy source by checking for `global` in each path. @@ -402,11 +402,11 @@ You do not need to modify the agent. The **Knowledge Base** provides a centraliz Finally, test the agent again and verify that its response and sources reflect the addition of the internal and regional policy sources. For example, if you use the JSON provided earlier, you should now see files for the transaction's origin and destination countries: -![alt text showing the updated agent response with internal and regional policy sources](/challenges/images/foundry-iq-regional.png) +![alt text showing the updated agent response with internal and regional policy sources](../../challenges/images/foundry-iq-regional.png) You can also select **Traces** to review the agent's queries and how it retrieved the sources: -![alt text showing the agent's trace of queries and source retrieval process](/challenges/images/foundry-iq-traces.png) +![alt text showing the agent's trace of queries and source retrieval process](../../challenges/images/foundry-iq-traces.png) ## 🚀 Go Further diff --git a/03-Azure/01-04-AI/07_Fraud_Intelligence/walkthrough/challenge-04/solution-04.md b/03-Azure/01-04-AI/07_Fraud_Intelligence/walkthrough/challenge-04/solution-04.md index dbc3c05eb..8edde2e33 100644 --- a/03-Azure/01-04-AI/07_Fraud_Intelligence/walkthrough/challenge-04/solution-04.md +++ b/03-Azure/01-04-AI/07_Fraud_Intelligence/walkthrough/challenge-04/solution-04.md @@ -807,7 +807,7 @@ Ensure that the agents are defined correctly in the `main.py` file and that thei Those names and versions should be set correctly in the `main.py` file: -![Agents versions](/challenges/images/agents-versions.png) +![Agents versions](../../challenges/images/agents-versions.png) ### 4. Configure and Run the Orchestration Locally @@ -833,16 +833,16 @@ The script will set up a virtual environment, install the required dependencies, In the logs, you should see the initialization of each agent: -![Agents initialization](/challenges/images/agents-initialization.png) +![Agents initialization](../../challenges/images/agents-initialization.png) The final trace shows the port on which the agent is listening: -![Final trace showing the port the agent is listening on](/challenges/images/orchestration-started.png) +![Final trace showing the port the agent is listening on](../../challenges/images/orchestration-started.png) To test the orchestration locally, select the **Foundry Toolkit** icon in Visual Studio Code and use the **Agent inspector** tool to interact with the running agents: -![Agent inspector tool in Foundry Toolkit](/challenges/images/agent-inspector.png) +![Agent inspector tool in Foundry Toolkit](../../challenges/images/agent-inspector.png) Then use the initial JSON request from Challenge 2 to interact with the agents: ```json @@ -868,17 +868,17 @@ The result should be a Markdown report containing the transaction details and th Before deploying, ensure that you are signed in to your Azure account. Use the Azure extension in Visual Studio Code for this process. Select the **Azure** icon in the left sidebar to open the extension panel: -![Azure Extension new account](/challenges/images/azure-extension-new-account.png) +![Azure Extension new account](../../challenges/images/azure-extension-new-account.png) Select **Sign in with new account** and enter the credentials for the Azure account provided for the lab. Before proceeding, confirm that the correct Azure subscription is selected. Open **View** > **Command Palette**, then search for `Azure: Select Subscriptions` and choose the appropriate subscription: -![Command Palette](/challenges/images/command-palette.png) +![Command Palette](../../challenges/images/command-palette.png) Then: -![Select Subscription in Azure](/challenges/images/select-azure-subscription.png) +![Select Subscription in Azure](../../challenges/images/select-azure-subscription.png) Return to the **Foundry Toolkit** extension and set your **Foundry project** as the default. Under **My resources**, select **Set Foundry project**, then choose the project used for this lab. @@ -902,27 +902,27 @@ Follow these steps to deploy your orchestration. Ensure you use: - **Package mode**: Remote - **Deploy to**: New agent, as it is the first deployment of this orchestration -![Deploy to Microsoft Foundry](/challenges/images/deploy-to-microsoft-foundry.png) +![Deploy to Microsoft Foundry](../../challenges/images/deploy-to-microsoft-foundry.png) Finally, review the deployment options before confirming the deployment: -![Review deployment options](/challenges/images/review-deployment-options.png) +![Review deployment options](../../challenges/images/review-deployment-options.png) Track the deployment progress in the **Output** panel in Visual Studio Code by selecting **Foundry Toolkit** as the output source: -![Deployment progress in Output panel](/challenges/images/deployment-progress-in-output-panel.png) +![Deployment progress in Output panel](../../challenges/images/deployment-progress-in-output-panel.png) Once the deployment is complete, you can run a test using the **Hosted Agent Playground**: -![Hosted Agent Playground](/challenges/images/hosted-agent-playground.png) +![Hosted Agent Playground](../../challenges/images/hosted-agent-playground.png) The new hosted agent also appears under **Agents** in the **Microsoft Foundry** portal, where you can interact with it and test its functionality: -![Microsoft Foundry Agents](/challenges/images/microsoft-foundry-hosted-agents.png) +![Microsoft Foundry Agents](../../challenges/images/microsoft-foundry-hosted-agents.png) Test it from the playground as well: -![Try from the playground](/challenges/images/try-from-the-playground.png) +![Try from the playground](../../challenges/images/try-from-the-playground.png) ### 6. Review Traces @@ -930,11 +930,11 @@ Challenge 6 explores this topic in depth. For now, take a preliminary look at th In the agent playground, select **Traces**: -![Traces in the agent's playground](/challenges/images/traces-in-agents-playground.png) +![Traces in the agent's playground](../../challenges/images/traces-in-agents-playground.png) Open the last trace to inspect the detailed execution flow of your orchestration: -![Detailed execution flow of the last trace](/challenges/images/detailed-execution-flow-of-last-trace.png) +![Detailed execution flow of the last trace](../../challenges/images/detailed-execution-flow-of-last-trace.png) We will explore tracing and metrics in more depth in Challenge 6. For now, this preliminary view is enough to confirm that the three agents ran in the expected sequence. diff --git a/03-Azure/01-04-AI/07_Fraud_Intelligence/walkthrough/challenge-05/solution-05.md b/03-Azure/01-04-AI/07_Fraud_Intelligence/walkthrough/challenge-05/solution-05.md index 2311bc85b..394d3514d 100644 --- a/03-Azure/01-04-AI/07_Fraud_Intelligence/walkthrough/challenge-05/solution-05.md +++ b/03-Azure/01-04-AI/07_Fraud_Intelligence/walkthrough/challenge-05/solution-05.md @@ -51,7 +51,7 @@ Open the [AI Gateway portal](https://ai.gateway.azure.com/) and sign in with the - **Resource group**: the existing lab resource group - **Enable managed identity** -![AI Gateway deployment screenshot](images/ai-gateway-deployment.png) +![AI Gateway deployment screenshot](../../challenges/images/ai-gateway-deployment.png) ### 2. Proxy the Financial Evidence MCP @@ -59,11 +59,11 @@ The **AI Gateway** can proxy existing Model Context Protocol (MCP) servers. This Next, onboard the existing `financial evidence` MCP to the AI Gateway. In the **AI Gateway** portal, open the **MCP servers** section and select **Add MCP server**: -![Add MCP server in the AI Gateway portal](images/add-mcp-server-in-ai-gateway-portal.png) +![Add MCP server in the AI Gateway portal](../../challenges/images/add-mcp-server-in-ai-gateway-portal.png) The portal supports three backend types: -![Supported backend types in the AI Gateway portal](images/supported-backend-types-in-ai-gateway-portal.png) +![Supported backend types in the AI Gateway portal](../../challenges/images/supported-backend-types-in-ai-gateway-portal.png) Select **MCP server**, then provide the details required to connect to the existing Financial Evidence MCP: @@ -77,19 +77,19 @@ Select **Next**, validate the configuration, and select **Create** to add the MC You can now test the MCP from the **AI Gateway**. Select **Use**: -![Test the MCP from the AI Gateway](images/test-mcp-from-ai-gateway.png) +![Test the MCP from the AI Gateway](../../challenges/images/test-mcp-from-ai-gateway.png) Select the **Try it** tab, then select **List tools**. You should see all tools exposed by the Financial Evidence MCP: -![List tools in the financial evidence MCP](images/list-tools-in-financial-evidence-mcp.png) +![List tools in the financial evidence MCP](../../challenges/images/list-tools-in-financial-evidence-mcp.png) Select the **Get Bank Information** operation, enter `0121` as the bank ID, and select **Run tool**: -![Run Get Bank Information tool in the financial evidence MCP](images/run-get-bank-information-tool-in-financial-evidence-mcp.png) +![Run Get Bank Information tool in the financial evidence MCP](../../challenges/images/run-get-bank-information-tool-in-financial-evidence-mcp.png) The result should display information for bank ID `0121`. Expand the `data` element to view the details: -![View detailed bank information in the financial evidence MCP](images/view-detailed-bank-information-in-financial-evidence-mcp.png) +![View detailed bank information in the financial evidence MCP](../../challenges/images/view-detailed-bank-information-in-financial-evidence-mcp.png) You can now interact with the Financial Evidence MCP through the **AI Gateway**. Next, configure `EvidenceEnrichmentAgent` to use it. @@ -97,7 +97,7 @@ You can now interact with the Financial Evidence MCP through the **AI Gateway**. Return to the **Microsoft Foundry** portal. Under **Build**, select **Agents**, then select `EvidenceEnrichmentAgent`. Remove the existing tool to ensure that the agent uses the latest MCP configuration: -![Remove existing tool from the EvidenceEnrichmentAgent](images/remove-existing-tool-from-evidenceenrichmentagent.png) +![Remove existing tool from the EvidenceEnrichmentAgent](../../challenges/images/remove-existing-tool-from-evidenceenrichmentagent.png) Select **Save**, then open the **Tools** menu on the left side of the page. @@ -110,13 +110,13 @@ Then select **Update**. On the same MCP configuration page, select **Use in an agent**: -![Use the MCP in an agent](images/use-mcp-in-agent.png) +![Use the MCP in an agent](../../challenges/images/use-mcp-in-agent.png) Select `EvidenceEnrichmentAgent` as the agent that will use this MCP. Under the `EvidenceEnrichmentAgent` **Tools** section, verify that the `financial-evidence-mcp` endpoint shows the new **AI Gateway** configuration. Enable **Always auto-approve all tools**: -![Configure Always auto-approve all tools](images/configure-always-auto-approve-all-tools.png) +![Configure Always auto-approve all tools](../../challenges/images/configure-always-auto-approve-all-tools.png) **Save** the agent again to apply the new configuration. @@ -148,13 +148,13 @@ Select **Add MCP server**, choose **OpenAPI Specification**, and complete the fo - **Spec URL**: Paste the URL you obtained from the previous step. - **Authentication**: Select **None** because the lab API does not require authentication. -![Add MCP server](images/add-mcp-server-from-api.png) +![Add MCP server](../../challenges/images/add-mcp-server-from-api.png) Select **Next**, validate the configuration, and select **Create** to add the MCP server. Explore the new MCP server in the **AI Gateway** playground. For example, list the existing alerts: -![List existing alerts](images/list-existing-alerts.png) +![List existing alerts](../../challenges/images/list-existing-alerts.png) Next, create `AlertManagerAgent` to interact with `alert-manager-mcp` through the **AI Gateway**, then add the agent to the full orchestration. @@ -186,7 +186,7 @@ echo "https://$endpoint" Open the URL. Before testing, the dashboard contains five alerts: -![List of current alerts](images/list-of-current-alerts.png) +![List of current alerts](../../challenges/images/list-of-current-alerts.png) Test `AlertManagerAgent` by sending it the following JSON payload: @@ -756,7 +756,7 @@ Test `AlertManagerAgent` by sending it the following JSON payload: Confirm that the new alert appears on the Alert Management dashboard: -![Alert Management dashboard showing the new alert](images/alert-management-dashboard.png) +![Alert Management dashboard showing the new alert](../../challenges/images/alert-management-dashboard.png) You can view the alert details or remove the alert to avoid duplicates in later tests. diff --git a/03-Azure/01-04-AI/07_Fraud_Intelligence/walkthrough/challenge-06/solution-06.md b/03-Azure/01-04-AI/07_Fraud_Intelligence/walkthrough/challenge-06/solution-06.md index 6d9e7135a..35a425edb 100644 --- a/03-Azure/01-04-AI/07_Fraud_Intelligence/walkthrough/challenge-06/solution-06.md +++ b/03-Azure/01-04-AI/07_Fraud_Intelligence/walkthrough/challenge-06/solution-06.md @@ -34,11 +34,11 @@ In Challenge 2, you connected **App Insights** to **Microsoft Foundry**, but you Open the **Monitor** tab for any agent to review its captured metrics. To access the underlying traces, logs, and custom telemetry, select **Open in Azure Monitor**: -![Open in Azure Monitor](/challenges/images/open-in-azure-monitor.png) +![Open in Azure Monitor](../../challenges/images/open-in-azure-monitor.png) You should see a dashboard similar to the one below, showing the default telemetry captured by Application Insights: -![Application Insights Dashboard](/challenges/images/agents-appins-dashboard.png) +![Application Insights Dashboard](../../challenges/images/agents-appins-dashboard.png) Explore the sections and panels to understand the default telemetry and how it reflects agent behavior. @@ -46,17 +46,17 @@ Next, inspect a complete orchestration trace to see how the components interact Select **View Traces with Agent Runs**, then choose a **Dependency**: -![View Traces with Agent Runs](/challenges/images/view-traces-with-agent-runs.png) +![View Traces with Agent Runs](../../challenges/images/view-traces-with-agent-runs.png) The detailed trace shows the selected dependency within its orchestration run, including its interactions with other components and the telemetry correlation across the workflow. To explore and filter all traces, open **Search** in the **Investigate** section of the left sidebar: -![Search in Investigate section](/challenges/images/search-in-investigate-section.png) +![Search in Investigate section](../../challenges/images/search-in-investigate-section.png) Select a trace to review its execution details, including spans, attributes, and related telemetry: -![Trace Details](/challenges/images/trace-details.png) +![Trace Details](../../challenges/images/trace-details.png) These insights are provided by Application Insights through the agents' default auto-instrumentation. @@ -69,7 +69,7 @@ The updated orchestration adds executors after specific agent executions. These The new code is under `/walkthrough/challenge-06/orchestration`. Review the main orchestration code to see where the custom telemetry executors run after specific agent executions. The following image highlights the main changes: -![Main Orchestration Code with Custom Telemetry Executors](/challenges/images/main-orchestration-code-with-custom-telemetry-executors.png) +![Main Orchestration Code with Custom Telemetry Executors](../../challenges/images/main-orchestration-code-with-custom-telemetry-executors.png) The metric definitions and configuration are in `walkthrough/challenge-06/orchestration/src/business_metrics.py`. @@ -112,15 +112,15 @@ The script sends the number of requests specified by the `--count` argument. In **Application Insights**, verify that the custom telemetry is being captured. Open **Logs** under **Monitoring**, select the `customMetrics` table, and run a query to view the recorded metrics. -![Custom Telemetry in Application Insights](/challenges/images/custom-telemetry-in-application-insights.png) +![Custom Telemetry in Application Insights](../../challenges/images/custom-telemetry-in-application-insights.png) You should see metrics similar to those shown below: -![Custom Metrics in Application Insights](/challenges/images/custom-metrics-in-application-insights.png) +![Custom Metrics in Application Insights](../../challenges/images/custom-metrics-in-application-insights.png) You can also query specific custom metrics directly from **Logs**. Open the selector on the right, choose **KQL mode**, enter a query in the editor, and select **Run**: -![Custom Metrics Query in Application Insights](/challenges/images/custom-metrics-query-in-application-insights.png) +![Custom Metrics Query in Application Insights](../../challenges/images/custom-metrics-query-in-application-insights.png) The following example queries provide several views of the custom metrics: @@ -177,7 +177,7 @@ customMetrics The following image shows the result of the last query: -![Result of AML Typology Detected by Pattern Type Query](/challenges/images/result-of-aml-typology-detected-by-pattern-type-query.png) +![Result of AML Typology Detected by Pattern Type Query](../../challenges/images/result-of-aml-typology-detected-by-pattern-type-query.png) Explore additional queries and visualizations as needed. @@ -189,11 +189,11 @@ Use Grafana to create interactive dashboards for the custom metrics queried in A Return to the **Agents (Preview)** section introduced at the beginning of the lab, then select **Explore in Grafana** to open the Grafana integration: -![Explore in Grafana](/challenges/images/explore-in-grafana.png) +![Explore in Grafana](../../challenges/images/explore-in-grafana.png) Grafana provides prebuilt dashboards and panels for visualizing the default telemetry: -![Pre-built Dashboards in Grafana](/challenges/images/pre-built-dashboards-in-grafana.png) +![Pre-built Dashboards in Grafana](../../challenges/images/pre-built-dashboards-in-grafana.png) Explore these dashboards to become familiar with the interface. @@ -211,7 +211,7 @@ Then, use the following settings: Select the correct **Application Insights** resource, whose name starts with `appi-fraud`. The imported dashboard should display panels similar to those below: -![Custom metrics Grafana Dashboards](/challenges/images/custom-metrics-grafana-dashboards.png) +![Custom metrics Grafana Dashboards](../../challenges/images/custom-metrics-grafana-dashboards.png) You have now imported the dashboard and visualized the custom metrics in Grafana. From 950369b1acd3a2ed2fe7e4d2deca98cf62b95bdb Mon Sep 17 00:00:00 2001 From: Copilot Date: Mon, 7 Sep 2026 22:15:18 +0200 Subject: [PATCH 3/3] Remove any mention to model routing --- 03-Azure/01-04-AI/07_Fraud_Intelligence/README.md | 12 +++++------- .../07_Fraud_Intelligence/challenges/challenge-04.md | 2 +- .../07_Fraud_Intelligence/challenges/challenge-05.md | 10 +++++----- .../walkthrough/challenge-04/solution-04.md | 2 +- .../walkthrough/challenge-05/solution-05.md | 10 +++++----- 5 files changed, 17 insertions(+), 19 deletions(-) diff --git a/03-Azure/01-04-AI/07_Fraud_Intelligence/README.md b/03-Azure/01-04-AI/07_Fraud_Intelligence/README.md index 7d85e0d55..6d9e8e709 100644 --- a/03-Azure/01-04-AI/07_Fraud_Intelligence/README.md +++ b/03-Azure/01-04-AI/07_Fraud_Intelligence/README.md @@ -10,7 +10,7 @@ Fraud moves faster than manual review. Analysts piecing together transactions, c An **agentic fraud intelligence system** continuously investigates operations and turns raw activity into evidence-backed decisions. It retrieves historical transaction evidence from **Azure Cosmos DB through an MCP server**, reasons over global, internal, and country-specific AML policies with **Foundry IQ agentic retrieval**, evaluates the rules that apply to both the origin and destination bank account countries, and produces audit-ready investigation reports and operational alerts. -Unlike earlier rule-based systems limited to rudimentary patterns, agentic systems reason through the *why* behind a flag. The complete workflow runs as a **hosted agent in Microsoft Foundry**, uses the **Microsoft Agent Framework** for orchestration, routes models and MCP servers through the new **AI Gateway tier (preview)**, and emits end-to-end telemetry to **Application Insights and Azure Managed Grafana**. +Unlike earlier rule-based systems limited to rudimentary patterns, agentic systems reason through the *why* behind a flag. The complete workflow runs as a **hosted agent in Microsoft Foundry**, uses the **Microsoft Agent Framework** for orchestration, routes MCP servers through the new **AI Gateway tier (preview)**, and emits end-to-end telemetry to **Application Insights and Azure Managed Grafana**. While Fraud Intelligence is highly relevant for FSI — where fraud, money laundering, and insider trading draw constant regulatory scrutiny — the hack extends cleanly to any regulated industry. With a diverse audience, the goal is to broaden attendees' thinking: they leave with a **modern, reusable, Python-based component set** they can apply to their own domains. @@ -22,7 +22,7 @@ A transaction enters the system. The fraud intelligence workflow must: 2. **Regulatory Assessment Agent** — use **Foundry IQ agentic retrieval** to apply global AML guidance, internal policies, and the regional regulations relevant to the origin and destination bank account countries. 3. **AML Report Agent** — transform the enriched evidence and regulatory assessment into a professional, audit-ready AML investigation report. 4. **Alert Manager Agent** — run in parallel with the AML Report Agent and use the Fraud Alert Manager MCP to create an operational alert when the regulatory status requires one. -5. **Fraud Intelligence Orchestration** — coordinate the agents with the **Microsoft Agent Framework**, deploy the workflow as a hosted agent in Microsoft Foundry, govern model and MCP traffic through **AI Gateway (preview)**, and emit traces and business metrics through OTLP. +5. **Fraud Intelligence Orchestration** — coordinate the agents with the **Microsoft Agent Framework**, deploy the workflow as a hosted agent in Microsoft Foundry, govern MCP traffic through **AI Gateway (preview)**, and emit traces and business metrics through OTLP. The image below illustrates the conceptual scenario and agent roles: @@ -47,7 +47,7 @@ flowchart LR ## Architecture -The hackathon builds a **Python-based, multi-agent Fraud Intelligence system**. Individual Microsoft Foundry agents are composed into a hosted workflow with the Microsoft Agent Framework. Foundry IQ supplies agentic retrieval over AML knowledge, while MCP servers provide access to financial evidence and alert-management actions. The AI Gateway tier (preview) provides a common control plane for model and MCP traffic. +The hackathon builds a **Python-based, multi-agent Fraud Intelligence system**. Individual Microsoft Foundry agents are composed into a hosted workflow with the Microsoft Agent Framework. Foundry IQ supplies agentic retrieval over AML knowledge, while MCP servers provide access to financial evidence and alert-management actions. The AI Gateway tier (preview) provides a common control plane for MCP traffic. ```mermaid flowchart TB @@ -65,7 +65,6 @@ flowchart TB end subgraph Gateway["AI Gateway tier (preview)"] - MODELS["Model gateway
Routing + policies"] MCPPROXY["Proxied MCP
Financial Evidence MCP"] MCPAPI["MCP generated from API
Fraud Alert Manager"] end @@ -74,7 +73,6 @@ flowchart TB FINMCP --> MCPPROXY ALERTAPI["Fraud Alert Manager API"] --> MCPAPI IQ --> AGENTS - ORCH --> MODELS AGENTS --> MCPPROXY AGENTS --> MCPAPI @@ -100,7 +98,7 @@ By participating in this hackathon, you will learn how to: - Build and integrate an **MCP server backed by Azure Cosmos DB** with a Microsoft Foundry agent - Configure **Foundry IQ** with global, internal, and regional AML sources and use agentic retrieval for country-aware regulatory assessment - Compose remote agents with the **Microsoft Agent Framework** and deploy the orchestration as a **hosted agent in Microsoft Foundry** -- Configure the **AI Gateway tier (preview)** for model and MCP traffic, including proxying an existing MCP and creating an MCP from an existing API +- Configure the **AI Gateway tier (preview)** for MCP traffic, including proxying an existing MCP and creating an MCP from an existing API - Add end-to-end **OTLP tracing** and business metrics with **Application Insights**, then visualize operational and business outcomes in **Azure Managed Grafana** --- @@ -166,7 +164,7 @@ Each challenge follows a consistent structure: | **2** | [Build the Evidence Enrichment Agent](./challenges/challenge-02.md) | Build a **Financial Evidence MCP** over Azure Cosmos DB, integrate it with the **Evidence Enrichment Agent**, and validate evidence-backed transaction enrichment | 30 min | | **3** | [Build the Regulatory Assessment Agent](./challenges/challenge-03.md) | Configure **Foundry IQ** with global, internal, and regional AML sources, then use agentic retrieval to assess rules for both bank account countries | 45 min | | **4** | [Build and Orchestrate the Investigation](./challenges/challenge-04.md) | Build the **AML Report Agent**, compose the first three agents with the **Microsoft Agent Framework**, and deploy the orchestration as a Foundry hosted agent | 45 min | -| **5** | [Govern Models and MCP Servers](./challenges/challenge-05.md) | Introduce the **AI Gateway tier (preview)**, configure model access, proxy the Financial Evidence MCP, create a new MCP from the Fraud Alert Manager API, and add the parallel **Alert Manager Agent** | 45 min | +| **5** | [Govern MCP Servers](./challenges/challenge-05.md) | Introduce the **AI Gateway tier (preview)**, proxy the Financial Evidence MCP, create a new MCP from the Fraud Alert Manager API, and add the parallel **Alert Manager Agent** | 45 min | | **6** | [Observe Fraud Intelligence](./challenges/challenge-06.md) | Add end-to-end **OTLP tracing**, publish technical and business metrics to **Application Insights**, and build a **Grafana** dashboard for business decision makers | 30 min | > **Tip:** While it is possible to rush through the challenges, we encourage you to pause and reflect. Consider how each pattern relates to your own context: what business processes in your environment could benefit from coordinated AI agents? How might agents help orchestrate decisions across teams and systems? diff --git a/03-Azure/01-04-AI/07_Fraud_Intelligence/challenges/challenge-04.md b/03-Azure/01-04-AI/07_Fraud_Intelligence/challenges/challenge-04.md index 0dc8cf0e6..be2dd8160 100644 --- a/03-Azure/01-04-AI/07_Fraud_Intelligence/challenges/challenge-04.md +++ b/03-Azure/01-04-AI/07_Fraud_Intelligence/challenges/challenge-04.md @@ -952,4 +952,4 @@ Add idempotent case identifiers and checkpointing so a transient failure can res ## 🧠 Conclusion -You have composed evidence enrichment, regulatory assessment, and reporting into a deployable investigation workflow. Continue to [Challenge 5](challenge-05.md) to govern model and MCP traffic and add operational alerting. \ No newline at end of file +You have composed evidence enrichment, regulatory assessment, and reporting into a deployable investigation workflow. Continue to [Challenge 5](challenge-05.md) to govern MCP traffic and add operational alerting. \ No newline at end of file diff --git a/03-Azure/01-04-AI/07_Fraud_Intelligence/challenges/challenge-05.md b/03-Azure/01-04-AI/07_Fraud_Intelligence/challenges/challenge-05.md index f154e5f06..8666cee97 100644 --- a/03-Azure/01-04-AI/07_Fraud_Intelligence/challenges/challenge-05.md +++ b/03-Azure/01-04-AI/07_Fraud_Intelligence/challenges/challenge-05.md @@ -1,4 +1,4 @@ -# Challenge 5 - Govern Models and MCP Servers +# Challenge 5 - Govern MCP Servers [Previous challenge](challenge-04.md) | **[Home](../README.md)** | [Next challenge](challenge-06.md) @@ -8,7 +8,7 @@ Introduce the **AI Gateway tier (preview)** for MCP access, generate an MCP inte ## 🧭 Context and Background -The investigation workflow now produces a decision, but a decision that requires action must also reach the operational alert system. AI Gateway provides a shared policy and observability boundary for model and tool traffic. +The investigation workflow now produces a decision, but a decision that requires action must also reach the operational alert system. AI Gateway provides a shared policy and observability boundary for MCP traffic. ```mermaid flowchart LR @@ -35,7 +35,7 @@ source hackenv ### 1. Deploy the AI Gateway -An **AI Gateway** is a centralized control point for securing and managing interactions among AI agents, models, and external services. It routes requests and responses through a governance layer that can enforce authentication, authorization, rate limiting, and other policies. This helps protect sensitive information, support compliance, and provide observability into AI-driven workflows. +An **AI Gateway** is a centralized control point for securing and managing MCP traffic between AI agents and external services. It routes requests and responses through a governance layer that can enforce authentication, authorization, rate limiting, and other policies. This helps protect sensitive information, support compliance, and provide observability into AI-driven workflows. In Azure, API Management provides the AI Gateway. In this lab, you will deploy a dedicated API Management instance using the preview `AIGateway` SKU, then route MCP calls through this centralized governance layer. @@ -857,7 +857,7 @@ Use these additional JSON payloads to test the orchestration: } ``` -Finally, inspect the AI Gateway telemetry and agent traces to verify that model calls and both MCP integrations traverse the gateway. Confirm that logs do not expose credentials or unnecessary financial payloads. Where possible, send an unauthorized request and verify that the gateway rejects it. +Finally, inspect the AI Gateway telemetry and agent traces to verify that both MCP integrations traverse the gateway. Confirm that logs do not expose credentials or unnecessary financial payloads. Where possible, send an unauthorized request and verify that the gateway rejects it. ## 🚀 Go Further @@ -874,4 +874,4 @@ Add per-agent quotas and compare their effects under a short concurrent workload ## 🧠 Conclusion -You have placed model and MCP traffic behind a governance boundary and added operational alerting in parallel with report generation. Continue to [Challenge 6](challenge-06.md) to add operational and business observability to the complete workflow. +You have placed MCP traffic behind a governance boundary and added operational alerting in parallel with report generation. Continue to [Challenge 6](challenge-06.md) to add operational and business observability to the complete workflow. diff --git a/03-Azure/01-04-AI/07_Fraud_Intelligence/walkthrough/challenge-04/solution-04.md b/03-Azure/01-04-AI/07_Fraud_Intelligence/walkthrough/challenge-04/solution-04.md index 8edde2e33..9c835bc28 100644 --- a/03-Azure/01-04-AI/07_Fraud_Intelligence/walkthrough/challenge-04/solution-04.md +++ b/03-Azure/01-04-AI/07_Fraud_Intelligence/walkthrough/challenge-04/solution-04.md @@ -952,4 +952,4 @@ Add idempotent case identifiers and checkpointing so a transient failure can res ## 🧠 Conclusion -You have composed evidence enrichment, regulatory assessment, and reporting into a deployable investigation workflow. Continue to [Challenge 5](solution-05.md) to govern model and MCP traffic and add operational alerting. \ No newline at end of file +You have composed evidence enrichment, regulatory assessment, and reporting into a deployable investigation workflow. Continue to [Challenge 5](solution-05.md) to govern MCP traffic and add operational alerting. \ No newline at end of file diff --git a/03-Azure/01-04-AI/07_Fraud_Intelligence/walkthrough/challenge-05/solution-05.md b/03-Azure/01-04-AI/07_Fraud_Intelligence/walkthrough/challenge-05/solution-05.md index 394d3514d..b7ea2c7b0 100644 --- a/03-Azure/01-04-AI/07_Fraud_Intelligence/walkthrough/challenge-05/solution-05.md +++ b/03-Azure/01-04-AI/07_Fraud_Intelligence/walkthrough/challenge-05/solution-05.md @@ -1,4 +1,4 @@ -# Challenge 5 - Govern Models and MCP Servers +# Challenge 5 - Govern MCP Servers [Previous challenge](solution-04.md) | **[Home](../README.md)** | [Next challenge](solution-06.md) @@ -8,7 +8,7 @@ Introduce the **AI Gateway tier (preview)** for MCP access, generate an MCP inte ## 🧭 Context and Background -The investigation workflow now produces a decision, but a decision that requires action must also reach the operational alert system. AI Gateway provides a shared policy and observability boundary for model and tool traffic. +The investigation workflow now produces a decision, but a decision that requires action must also reach the operational alert system. AI Gateway provides a shared policy and observability boundary for MCP traffic. ```mermaid flowchart LR @@ -35,7 +35,7 @@ source hackenv ### 1. Deploy the AI Gateway -An **AI Gateway** is a centralized control point for securing and managing interactions among AI agents, models, and external services. It routes requests and responses through a governance layer that can enforce authentication, authorization, rate limiting, and other policies. This helps protect sensitive information, support compliance, and provide observability into AI-driven workflows. +An **AI Gateway** is a centralized control point for securing and managing MCP traffic between AI agents and external services. It routes requests and responses through a governance layer that can enforce authentication, authorization, rate limiting, and other policies. This helps protect sensitive information, support compliance, and provide observability into AI-driven workflows. In Azure, API Management provides the AI Gateway. In this lab, you will deploy a dedicated API Management instance using the preview `AIGateway` SKU, then route MCP calls through this centralized governance layer. @@ -857,7 +857,7 @@ Use these additional JSON payloads to test the orchestration: } ``` -Finally, inspect the AI Gateway telemetry and agent traces to verify that model calls and both MCP integrations traverse the gateway. Confirm that logs do not expose credentials or unnecessary financial payloads. Where possible, send an unauthorized request and verify that the gateway rejects it. +Finally, inspect the AI Gateway telemetry and agent traces to verify that both MCP integrations traverse the gateway. Confirm that logs do not expose credentials or unnecessary financial payloads. Where possible, send an unauthorized request and verify that the gateway rejects it. ## 🚀 Go Further @@ -874,4 +874,4 @@ Add per-agent quotas and compare their effects under a short concurrent workload ## 🧠 Conclusion -You have placed model and MCP traffic behind a governance boundary and added operational alerting in parallel with report generation. Continue to [Challenge 6](solution-06.md) to add operational and business observability to the complete workflow. +You have placed MCP traffic behind a governance boundary and added operational alerting in parallel with report generation. Continue to [Challenge 6](solution-06.md) to add operational and business observability to the complete workflow.