From eb64dd3854c96ad3cf80c149898eeb39039522c4 Mon Sep 17 00:00:00 2001 From: Peter Hauge Date: Mon, 9 Feb 2026 16:29:24 -0800 Subject: [PATCH] Updating samples - more recent model and rebundling for main branch --- .../1ClickDeploy/BundleAssets.ps1 | 110 --------- .../1ClickDeploy/workflows.zip | Bin 12154 -> 0 bytes .../Deployment/cleanup.ps1 | 48 ---- .../Deployment/deploy.ps1 | 204 ----------------- .../infrastructure/bicepconfig.json | 13 -- .../modules/deployment-script.bicep | 89 -------- .../infrastructure/modules/logicapp.bicep | 122 ---------- .../infrastructure/modules/openai-rbac.bicep | 26 --- .../infrastructure/modules/openai.bicep | 40 ---- .../infrastructure/modules/storage-rbac.bicep | 45 ---- .../infrastructure/modules/storage.bicep | 28 --- .../{infrastructure => }/main.bicep | 48 ++-- .../sample-arm.json | 103 ++++----- .../Deployment/test-agent.ps1 | 214 ------------------ .../Deployment/workflows.zip | Bin 0 -> 11460 bytes .../LogicApps/LoanApprovalAgent/workflow.json | 6 +- .../ai-loan-agent-sample/LogicApps/README.md | 2 +- samples/ai-loan-agent-sample/README.md | 7 +- .../Deployment/main.bicep | 10 +- .../Deployment/sample-arm.json | 66 +++--- .../Deployment/workflows.zip | Bin 6401 -> 6401 bytes .../JsonRemediationAgent/workflow.json | 6 +- samples/json-remediation-agent/README.md | 6 +- .../Deployment/main.bicep | 10 +- .../Deployment/sample-arm.json | 66 +++--- .../Deployment/workflows.zip | Bin 7660 -> 7659 bytes .../ProductReturnAgent/workflow.json | 6 +- .../LogicApps/README.md | 4 +- samples/product-return-agent-sample/README.md | 6 +- samples/shared/README.md | 12 +- samples/shared/modules/openai.bicep | 6 +- samples/shared/scripts/BundleAssets.ps1 | 28 ++- samples/shared/templates/main.bicep.template | 2 +- .../Deployment/main.bicep | 10 +- .../Deployment/sample-arm.json | 66 +++--- .../Deployment/workflows.zip | Bin 7660 -> 7659 bytes .../TransactionRepairAgent/workflow.json | 6 +- samples/transaction-repair-agent/README.md | 6 +- 38 files changed, 253 insertions(+), 1168 deletions(-) delete mode 100644 samples/ai-loan-agent-sample/1ClickDeploy/BundleAssets.ps1 delete mode 100644 samples/ai-loan-agent-sample/1ClickDeploy/workflows.zip delete mode 100644 samples/ai-loan-agent-sample/Deployment/cleanup.ps1 delete mode 100644 samples/ai-loan-agent-sample/Deployment/deploy.ps1 delete mode 100644 samples/ai-loan-agent-sample/Deployment/infrastructure/bicepconfig.json delete mode 100644 samples/ai-loan-agent-sample/Deployment/infrastructure/modules/deployment-script.bicep delete mode 100644 samples/ai-loan-agent-sample/Deployment/infrastructure/modules/logicapp.bicep delete mode 100644 samples/ai-loan-agent-sample/Deployment/infrastructure/modules/openai-rbac.bicep delete mode 100644 samples/ai-loan-agent-sample/Deployment/infrastructure/modules/openai.bicep delete mode 100644 samples/ai-loan-agent-sample/Deployment/infrastructure/modules/storage-rbac.bicep delete mode 100644 samples/ai-loan-agent-sample/Deployment/infrastructure/modules/storage.bicep rename samples/ai-loan-agent-sample/Deployment/{infrastructure => }/main.bicep (64%) rename samples/ai-loan-agent-sample/{1ClickDeploy => Deployment}/sample-arm.json (86%) delete mode 100644 samples/ai-loan-agent-sample/Deployment/test-agent.ps1 create mode 100644 samples/ai-loan-agent-sample/Deployment/workflows.zip diff --git a/samples/ai-loan-agent-sample/1ClickDeploy/BundleAssets.ps1 b/samples/ai-loan-agent-sample/1ClickDeploy/BundleAssets.ps1 deleted file mode 100644 index e7f647d..0000000 --- a/samples/ai-loan-agent-sample/1ClickDeploy/BundleAssets.ps1 +++ /dev/null @@ -1,110 +0,0 @@ -#!/usr/bin/env powershell -<# -.SYNOPSIS - Create ARM template for 1-click deploy and bundle LogicApps folder into workflows.zip for deployment. - -.DESCRIPTION - This script prepares all necessary assets for 1-click deployment by performing two key tasks: - - 1. Build ARM Template: Compiles the Bicep infrastructure file (../Deployment/infrastructure/main.bicep) - into an ARM template (sample-arm.json) using the Bicep CLI. This template defines all Azure - resources including Logic App Standard, Azure OpenAI, Storage Account, and Application Insights. - - 2. Bundle Workflows: Creates a deployment-ready workflows.zip containing all Logic App workflows - and configuration from the ../LogicApps folder. Automatically excludes development artifacts: - - Version control (.git) - - Editor settings (.vscode) - - Dependencies (node_modules) - - Local storage (__azurite*, __blobstorage__*, __queuestorage__*) - - Existing zip files - - Both outputs (sample-arm.json and workflows.zip) are created in the current directory for use - in Azure Portal 1-click deployment scenarios. - -.EXAMPLE - .\BundleAssets.ps1 - - Builds the ARM template and creates workflows.zip in the current directory. - -.NOTES - Requirements: - - Bicep CLI must be installed (https://learn.microsoft.com/azure/azure-resource-manager/bicep/install) - - PowerShell 5.1 or later -#> - -$ErrorActionPreference = "Stop" - -Write-Host "`n=== Bundling Logic App Assets ===" -ForegroundColor Cyan - -# Paths relative to this script location -$logicAppsPath = Resolve-Path "$PSScriptRoot\..\LogicApps" -$zipPath = "$PSScriptRoot\workflows.zip" -$bicepPath = "$PSScriptRoot\..\Deployment\infrastructure\main.bicep" -$armTemplatePath = "$PSScriptRoot\sample-arm.json" - -# Build Bicep to ARM template -Write-Host "`nBuilding ARM template from Bicep..." - -if (-not (Test-Path $bicepPath)) { - Write-Host "✗ Bicep file not found: $bicepPath" -ForegroundColor Red - exit 1 -} - -# Check for Bicep CLI -$bicepAvailable = $null -ne (Get-Command bicep -ErrorAction SilentlyContinue) - -if (-not $bicepAvailable) { - Write-Host "✗ Bicep CLI not found. Please install it first." -ForegroundColor Red - Write-Host "Install: https://learn.microsoft.com/azure/azure-resource-manager/bicep/install" -ForegroundColor Yellow - exit 1 -} - -try { - bicep build $bicepPath --outfile $armTemplatePath - - if (Test-Path $armTemplatePath) { - $armSize = (Get-Item $armTemplatePath).Length / 1KB - Write-Host "✓ Successfully created sample-arm.json ($("{0:N2}" -f $armSize) KB)" -ForegroundColor Green - } else { - throw "ARM template file was not created" - } -} catch { - Write-Host "✗ Failed to build ARM template: $($_.Exception.Message)" -ForegroundColor Red - exit 1 -} - -# Remove existing zip if present -if (Test-Path $zipPath) { - Remove-Item $zipPath -Force - Write-Host "✓ Removed existing workflows.zip" -ForegroundColor Green -} - -# Get all items except those we want to exclude -$itemsToZip = Get-ChildItem -Path $logicAppsPath | Where-Object { - $_.Name -notin @('.git', '.vscode', 'node_modules') -and - $_.Name -notlike '__azurite*' -and - $_.Name -notlike '__blobstorage__*' -and - $_.Name -notlike '__queuestorage__*' -and - $_.Extension -ne '.zip' -} - -Write-Host "`nIncluding files:" -$itemsToZip | ForEach-Object { Write-Host " - $($_.Name)" -ForegroundColor Gray } - -# Create zip -Push-Location $logicAppsPath -Compress-Archive -Path $itemsToZip.Name -DestinationPath $zipPath -Force -Pop-Location - -if (Test-Path $zipPath) { - $zipSize = (Get-Item $zipPath).Length / 1MB - Write-Host "`n✓ Successfully created workflows.zip ($("{0:N2}" -f $zipSize) MB)" -ForegroundColor Green - Write-Host "Location: $zipPath" -ForegroundColor Cyan -} else { - Write-Host "`n✗ Failed to create workflows.zip" -ForegroundColor Red - exit 1 -} - -Write-Host "`n=== Bundling Complete ===" -ForegroundColor Cyan -Write-Host "ARM Template: $armTemplatePath" -ForegroundColor Gray -Write-Host "Workflows Zip: $zipPath" -ForegroundColor Gray diff --git a/samples/ai-loan-agent-sample/1ClickDeploy/workflows.zip b/samples/ai-loan-agent-sample/1ClickDeploy/workflows.zip deleted file mode 100644 index d25a6e71b38d2cef04611b6cb134853f149084d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12154 zcmaia1yEhvvhBuYZzKeF5AN=+8`mJg-Q9yraCdiicMVQ(f&~xm1Oh=G=iUEba?d~S z-(59pRjsNXdv(vzy=ITqin379=l}o!9)M{VrrkjW;_ie50I)y+0P*WxNfT#L7bj;s z8xuzQ^l%$tS~@(1f7D?4v%UxrbM!7(jtMLiptedEGvWJGJW|xcSLW z;|imeJ36l~^{Z9944*%aoMZZDaK<;dxxWL->(D1gIHUIa*hq_bqG)spG6az@xzMyK zh*GVP1TC;F<_8SN!pl^Prou^0QboK~3y%wbmsYi?gU()Ror=qfR+N{_LIYiHJXB-X zt40f=BnQ(djJl{0i)5>?^N?Fdc9^@3>T1|P20+_OiS+CEsCX?kpQ4paO5LDoV9|G1z=`FK-g$}ae}*U-9eHVnEz@LgQA=PEcIq{5Pgj$LMKDY55i zd{^$kOyOy2D_qTmO@W<&^5=O;Q`qyrBvs|vR+^yD$r6S?W8KJ^aAkM75cq+|U>2@O zi6=8n3~(6fvKV;uHi+dyE|a~{s6EF?;T_@P;&=H7@=CU8L2`oI)3L%{sGd2RJahFF zg!3u68>&B*-@6h);Ox0GzOdSSY|i{vyTRLH{Yxck0(c~2g(F=j& zM7boKQxS0(O@00Smui*=DTdM~zU>c-@kJa1OKY;c_BrolIyfVf*4V(E7I0NNKLyck zZ_Nk^&E}~Y-QO4>AS_|ta6pu)FJ8CW^6%r>m?#Rc8aU9ogG6SWYZ(=;(9V}4w>+TB zpiTNDpla~l53Xv*tZMs0DE=Gs zh2W-BWnP(24F>?=|BLy`7EV@*j&`ON)+YbX`YJUWtG`(P;lLMlr5Cw1Iw6YX%H*_N z7>*uq6gv_v#4tyNy?H809?4?Vm&oy3Wv9?0l5gFa^B4a1eP>T@euGG}SXm0`{B8c* zZE)me3uRZR@&)0}omkRg(<)F_2a)2lVnDtopEi<1xJk$CPjc4jVjo(SC|IX(JA1l0 zlSB)*gsJ=YjvteqS5)Q`I(rW(9Uk=+yS8Rn+N82(tPhwz*VI-{_nv2uCc{gEdaJ-|dn5&pVp(WnOWSC`3Yq+W%q^yn( zr3B9p454QXY(8RnHyu6iZIUC&+xcr2+-)^s0#UQI0dF54cLI#pBm&X5$r(&jDQ(6% zvlXR*l;>TFfoY*eNC85jzY55b2hTT}NHKNBFMUw!3P{_DbOz~-XOo2o1Mo6ot86G0 z)nTS|UO-Zj#v~TaLx&m9SLWgdu7xW>&yaaha~0nY{17iRpOGX=Orvnjg^?**U(}jYPtezI9e40tb)bTV^zMjM|Z^HMe&Rvn7%U zFX|Y4C+?8mmgVTT&YOw8iK<5aphx#&`zShtDOj=VUDhQiC9}nF-DfDE#njl6yfnP% z$j;60M1~MeNc_Wb{!GRQCY}65Xz^?^b7kMQmsUGk$ZKdN*%)Ug)9M8Y{SkO8qqDI| zj~5X*R#FO&{se7Z@XJVq{@pt!`p&VPtLM^zS_E(%AT``hJw$_6_TlwxN(xDXc4Fq=m{us*6$@ z1d1eO=qS$(BAbO)6F=WkpVe?VtdN%X0r@x9_rKk(XL&4dIN_rSjc}=e?Ppy+I411G z#>^54i%2h#kQFH}+q9Tra^_`9!~!%Je5O!!^vF-qhu#7KCcoZYD@nbfxlK&FPvDoHQr#sI`M~DV=5+G z=4U~r8tCug>(%vouKw<1#r?%uG`ag9n*qskcg1~NjF}jWGE6(~@&fR8O>kcNAYP1jfHuGE&Q(&( zlzx*se3Oey9THQ{JKZjubn@u+RFIF!B@A4RBiiE@Hw*GI?lkVX8b<*+PH~sHwsIj7 z)LVAp#6_2=sYFUyMmx%ps0SxrT9~+pL%n3|mQz&JvFqkZQfW`_9oRO>EkVtCfnb;v zrdsq7s@eWJ7M;)F;ln#6mn%(^vY5hrnuHS4kvSrd4=%U6Ftgzx92t|EC5Dcbla7|- zX;dXTTBEw?AW|eV)LA-pt56pL47?Fd*m}F}U83q;B$)+@VGtMY;HgleN7_2YhHUCK0 z?XpnmX^FgUnWEqHu8xmB-s>6nbrmbdESm0Xm^Rsa2&aK>NIg04Iy--Y`d#8tox-&1 zbL7D0uLqmA`~U#aYl#Qj8Q2Qj+dJC18dwXPnbDKppUIBARqzpd`lpPi3P^ef6<4K*)T6b*D92f}e*{|8 zxLo%6E%3yXZ|xIwPl*6xo0Bkq9|cjx8J?iJl!)LC zLD{M275n(1PbEZSFx-GB&dl1aQRuWW0a)|W_d)64UsI!zsOVRl0a{hmOFvK6 zuMIsCLF;{qGDAb4?&dGhNp7eJ0>u#hAMxZ%4%UTHeZz)8XAUx50RL!zl81uBy}u_>vi@`czFH%AH*uJbr=D_brqD(l{d{9GD2A_lCHh2}xO_w5pi=gES&c| z-_E)aOn2Yh>An0~@b}smVg%EFzti(w%|L)-XmfZ=8lA}b>r+>E7gt-*$MaK<^HB7| zgQDYpwGCndEBtG+bLQ%Y3tdD}rRPDA^wT#%uM$qDOe{<@;lY_R@WDGQhg@^?%>Z

akcJYD1P}@?o)B4aF#Vktw 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 aUr`q3FU{apFhBu3z0P- - -param( - [Parameter(Mandatory=$true)] - [string]$ResourceGroupName -) - -$ErrorActionPreference = "Stop" - -Write-Host "`n=== Cleaning Up AI Loan Agent ===" -ForegroundColor Cyan -Write-Host "Resource Group: $ResourceGroupName" - -# Check auth -$context = Get-AzContext -ErrorAction SilentlyContinue -if (-not $context) { - Write-Host "Not logged in. Run: Connect-AzAccount" -ForegroundColor Red - exit 1 -} - -# Verify resource group exists -$rg = Get-AzResourceGroup -Name $ResourceGroupName -ErrorAction SilentlyContinue -if (-not $rg) { - Write-Host "Resource group '$ResourceGroupName' not found" -ForegroundColor Red - exit 1 -} - -# Confirm deletion -$confirm = Read-Host "`nThis will delete all resources in '$ResourceGroupName'. Continue? (y/n)" -if ($confirm -ne 'y') { - Write-Host "Cleanup cancelled" -ForegroundColor Yellow - exit -} - -Write-Host "`nDeleting resource group..." -ForegroundColor Yellow -Remove-AzResourceGroup -Name $ResourceGroupName -Force -AsJob | Out-Null - -Write-Host "✓ Cleanup initiated" -ForegroundColor Green -Write-Host "Resource group deletion is running in the background." -ForegroundColor Gray diff --git a/samples/ai-loan-agent-sample/Deployment/deploy.ps1 b/samples/ai-loan-agent-sample/Deployment/deploy.ps1 deleted file mode 100644 index a32d028..0000000 --- a/samples/ai-loan-agent-sample/Deployment/deploy.ps1 +++ /dev/null @@ -1,204 +0,0 @@ -#!/usr/bin/env powershell -<# -.SYNOPSIS - Deploy AI Loan Agent using Bicep. - -.PARAMETER ProjectName - Project name (3-15 chars). Resources named: -- - -.PARAMETER Location - Azure region. Default: eastus2 - -.PARAMETER Tags - Optional tags as hashtable. Example: @{Environment='dev'; Owner='TeamA'} - -.EXAMPLE - .\deploy.ps1 -ProjectName "ailoan" - -.EXAMPLE - .\deploy.ps1 -ProjectName "ailoan" -Tags @{Environment='prod'; CostCenter='IT'} -#> - -param( - [Parameter(Mandatory=$true)] - [ValidatePattern('^[a-z0-9-]{3,15}$')] - [string]$ProjectName, - - [Parameter(Mandatory=$false)] - [string]$Location = 'eastus2', - - [Parameter(Mandatory=$false)] - [hashtable]$Tags = @{} -) - -$ErrorActionPreference = "Stop" - -# Normalize location to lowercase -$Location = $Location.ToLower() - -# Validate location - must support both gpt-4.1-mini and Logic Apps Standard -$validLocations = @('australiaeast', 'westeurope', 'germanywestcentral', 'italynorth', - 'swedencentral', 'uksouth', 'eastus', 'eastus2', 'southcentralus', 'westus3') - -if ($Location -notin $validLocations) { - Write-Host "Error: Invalid location '$Location'" -ForegroundColor Red - Write-Host "Valid locations (support both gpt-4.1-mini and Logic Apps Standard):" -ForegroundColor Yellow - Write-Host "$($validLocations -join ', ')" -ForegroundColor Yellow - exit 1 -} - -Write-Host "`n=== AI Loan Agent Deployment ===" -ForegroundColor Cyan -Write-Host "Project: $ProjectName | Location: $Location`n" - -# Check auth -$context = Get-AzContext -ErrorAction SilentlyContinue -if (-not $context) { - Write-Host "Not logged in. Run: Connect-AzAccount" -ForegroundColor Red - exit 1 -} - -# Create resource group -$resourceGroupName = "rg-$ProjectName" -$defaultTags = @{ 'Project' = $ProjectName } -$tags = $defaultTags + $Tags - -$rg = Get-AzResourceGroup -Name $resourceGroupName -ErrorAction SilentlyContinue -if (-not $rg) { - New-AzResourceGroup -Name $resourceGroupName -Location $Location -Tag $tags | Out-Null - Write-Host "✓ Resource group created: $resourceGroupName" -ForegroundColor Green -} else { - Write-Host "✓ Resource group exists: $resourceGroupName" -ForegroundColor Green -} - -# Deploy Bicep -Write-Host "`nDeploying infrastructure (5-10 minutes)..." - -$bicepPath = "$PSScriptRoot/infrastructure/main.bicep" -$deploymentName = "ailoan-$(Get-Date -Format 'yyyyMMddHHmmss')" - -try { - $deployment = New-AzResourceGroupDeployment ` - -Name $deploymentName ` - -ResourceGroupName $resourceGroupName ` - -TemplateFile $bicepPath ` - -baseName $ProjectName ` - -location $Location ` - -Mode Incremental ` - -ErrorAction Stop - - Write-Host "✓ Infrastructure deployment complete" -ForegroundColor Green -} -catch { - # Check if the only errors are RBAC conflicts (expected on redeployment) - if ($_.Exception.Message -match 'RoleAssignmentExists|role assignment already exists') { - Write-Host "✓ Infrastructure deployment complete (RBAC roles already configured)" -ForegroundColor Green - # Get deployment outputs even if RBAC warnings occurred - $deployment = Get-AzResourceGroupDeployment -ResourceGroupName $resourceGroupName -Name $deploymentName - } - else { - Write-Host "`nDeployment failed:" -ForegroundColor Red - Write-Host $_.Exception.Message -ForegroundColor Red - if ($_.Exception.InnerException) { - Write-Host $_.Exception.InnerException.Message -ForegroundColor Red - } - exit 1 - } -} - -# Wait for RBAC propagation (critical for managed identity to work) -Write-Host "`nWaiting 60 seconds for RBAC role assignments to propagate..." -ForegroundColor Yellow -Start-Sleep -Seconds 60 -Write-Host "✓ RBAC propagation complete" -ForegroundColor Green - -# Get outputs -$logicAppName = $deployment.Outputs.logicAppName.Value -$openAIEndpoint = $deployment.Outputs.openAIEndpoint.Value - -# Generate local.settings.json (for local development with Azurite emulator) -$openAI = Get-AzResource -ResourceGroupName $resourceGroupName -ResourceType "Microsoft.CognitiveServices/accounts" | Select-Object -First 1 - -# Use Azurite emulator connection string for local development -# In Azure, the deployed Logic App uses managed identity (no connection string needed) -$localSettings = @{ - IsEncrypted = $false - Values = @{ - "AzureWebJobsStorage" = "UseDevelopmentStorage=true" - "FUNCTIONS_WORKER_RUNTIME" = "dotnet" - "WORKFLOWS_SUBSCRIPTION_ID" = $context.Subscription.Id - "WORKFLOWS_RESOURCE_GROUP_NAME" = $resourceGroupName - "WORKFLOWS_LOCATION_NAME" = $Location - "agent_openAIEndpoint" = $openAIEndpoint - "agent_ResourceID" = $openAI.ResourceId - } -} - -$localSettingsPath = "$PSScriptRoot/../LogicApps/local.settings.json" -$localSettings | ConvertTo-Json -Depth 10 | Set-Content -Path $localSettingsPath -Encoding UTF8 - -# Deploy workflows using Azure PowerShell Zip Deploy -Write-Host "`nDeploying workflows to Logic App..." - -$logicAppsPath = Resolve-Path "$PSScriptRoot/../LogicApps" -$zipPath = "$PSScriptRoot/workflows.zip" - -# Create zip -if (Test-Path $zipPath) { Remove-Item $zipPath -Force } - -# Get all items except those we want to exclude -$itemsToZip = Get-ChildItem -Path $logicAppsPath | Where-Object { - $_.Name -notin @('.git', '.vscode', 'node_modules') -and - $_.Name -notlike '__azurite*' -and - $_.Name -notlike '__blobstorage__*' -and - $_.Name -notlike '__queuestorage__*' -and - $_.Extension -ne '.zip' -} - -Push-Location $logicAppsPath -Compress-Archive -Path $itemsToZip.Name -DestinationPath $zipPath -Force -Pop-Location - -# Check for Azure CLI -$azCliAvailable = $null -ne (Get-Command az -ErrorAction SilentlyContinue) - -if (-not $azCliAvailable) { - Write-Host "`n✗ Azure CLI not found. Workflows not deployed." -ForegroundColor Yellow - Write-Host "Install: https://learn.microsoft.com/cli/azure/install-azure-cli" -ForegroundColor Yellow - Write-Host "Alternative: Open workspace in VS Code, right-click LogicApps folder → Deploy to Logic App`n" -ForegroundColor Cyan -} else { - try { - az functionapp deployment source config-zip ` - --resource-group $resourceGroupName ` - --name $logicAppName ` - --src $zipPath ` - --output none ` - 2>&1 | Out-Null - - if ($LASTEXITCODE -eq 0) { - Write-Host "✓ Workflows deployed successfully" -ForegroundColor Green - } else { - throw "Deployment returned exit code $LASTEXITCODE" - } - } catch { - Write-Host "✗ Workflow deployment failed: $($_.Exception.Message)" -ForegroundColor Red - Write-Host "Alternative: Open workspace in VS Code, right-click LogicApps folder → Deploy to Logic App" -ForegroundColor Cyan - } -} - -Remove-Item $zipPath -Force -ErrorAction SilentlyContinue - -# Restart Logic App to load workflows -Write-Host "`nRestarting Logic App..." -Restart-AzWebApp -ResourceGroupName $resourceGroupName -Name $logicAppName | Out-Null -Start-Sleep -Seconds 10 -Write-Host "✓ Logic App restarted" -ForegroundColor Green - -# Summary -Write-Host "`n=== Deployment Complete ===" -ForegroundColor Cyan -Write-Host "Resource Group: $resourceGroupName" -Write-Host "Logic App: $logicAppName" -Write-Host "OpenAI Endpoint: $openAIEndpoint" -Write-Host "Logic App URL: https://$logicAppName.azurewebsites.net" - -Write-Host "`n--- Next: Quick Start Step 4 - Test & Validate ---" -ForegroundColor Yellow -Write-Host "Run test script, then verify agent workflows following README 'Testing & Validation' section" -Write-Host " .\test-agent.ps1 -ResourceGroupName '$resourceGroupName' -LogicAppName '$logicAppName'" -ForegroundColor Cyan diff --git a/samples/ai-loan-agent-sample/Deployment/infrastructure/bicepconfig.json b/samples/ai-loan-agent-sample/Deployment/infrastructure/bicepconfig.json deleted file mode 100644 index 729f659..0000000 --- a/samples/ai-loan-agent-sample/Deployment/infrastructure/bicepconfig.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "analyzers": { - "core": { - "verbose": false, - "enabled": true, - "rules": { - "no-unnecessary-dependson": { - "level": "off" - } - } - } - } -} diff --git a/samples/ai-loan-agent-sample/Deployment/infrastructure/modules/deployment-script.bicep b/samples/ai-loan-agent-sample/Deployment/infrastructure/modules/deployment-script.bicep deleted file mode 100644 index d809a08..0000000 --- a/samples/ai-loan-agent-sample/Deployment/infrastructure/modules/deployment-script.bicep +++ /dev/null @@ -1,89 +0,0 @@ -// Deployment Script Module - Deploys workflows.zip to Logic App -// Includes RBAC assignment for deployment identity - -@description('Location for the deployment script resource') -param location string - -@description('Name for the deployment script resource') -param deploymentScriptName string - -@description('User-assigned managed identity ID for deployment') -param userAssignedIdentityId string - -@description('Principal ID of the user-assigned managed identity used for deployment') -param deploymentIdentityPrincipalId string - -@description('Name of the Logic App to deploy to') -param logicAppName string - -@description('Resource group name') -param resourceGroupName string - -@description('URL to the workflows.zip file') -param workflowsZipUrl string - -// Grant Website Contributor role at resource group level to deployment identity -// This allows the deployment script to deploy code to the Logic App and read the App Service Plan -resource websiteContributorRoleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = { - name: guid(resourceGroup().id, deploymentIdentityPrincipalId, 'de139f84-1756-47ae-9be6-808fbbe84772') - scope: resourceGroup() - properties: { - roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'de139f84-1756-47ae-9be6-808fbbe84772') // Website Contributor - principalId: deploymentIdentityPrincipalId - principalType: 'ServicePrincipal' - } -} - -// Deploy workflows.zip to Logic App using Azure CLI -resource workflowDeploymentScript 'Microsoft.Resources/deploymentScripts@2023-08-01' = { - name: deploymentScriptName - location: location - kind: 'AzureCLI' - identity: { - type: 'UserAssigned' - userAssignedIdentities: { - '${userAssignedIdentityId}': {} - } - } - properties: { - azCliVersion: '2.59.0' - retentionInterval: 'PT1H' - timeout: 'PT30M' - cleanupPreference: 'OnSuccess' - environmentVariables: [ - { - name: 'LOGIC_APP_NAME' - value: logicAppName - } - { - name: 'RESOURCE_GROUP' - value: resourceGroupName - } - { - name: 'WORKFLOWS_ZIP_URL' - value: workflowsZipUrl - } - ] - scriptContent: ''' - #!/bin/bash - set -e - - echo "Downloading workflows.zip..." - wget -O workflows.zip "$WORKFLOWS_ZIP_URL" - - echo "Deploying workflows to Logic App: $LOGIC_APP_NAME" - az functionapp deployment source config-zip \ - --resource-group "$RESOURCE_GROUP" \ - --name "$LOGIC_APP_NAME" \ - --src workflows.zip - - echo "Waiting 60 seconds for workflow registration and RBAC propagation..." - sleep 60 - - echo "Deployment completed successfully" - ''' - } - dependsOn: [ - websiteContributorRoleAssignment - ] -} diff --git a/samples/ai-loan-agent-sample/Deployment/infrastructure/modules/logicapp.bicep b/samples/ai-loan-agent-sample/Deployment/infrastructure/modules/logicapp.bicep deleted file mode 100644 index e86a865..0000000 --- a/samples/ai-loan-agent-sample/Deployment/infrastructure/modules/logicapp.bicep +++ /dev/null @@ -1,122 +0,0 @@ -// Logic App Standard Module - -@description('Logic App name') -param logicAppName string - -@description('Location for Logic App') -param location string - -@description('Storage account name') -param storageAccountName string - -@description('OpenAI endpoint') -param openAIEndpoint string - -@description('OpenAI resource ID') -param openAIResourceId string - -@description('User-assigned managed identity resource ID for storage authentication') -param managedIdentityId string - -resource appServicePlan 'Microsoft.Web/serverfarms@2023-12-01' = { - name: '${logicAppName}-plan' - location: location - sku: { - name: 'WS1' - tier: 'WorkflowStandard' - } - kind: 'elastic' - properties: { - maximumElasticWorkerCount: 20 - } -} - -resource logicApp 'Microsoft.Web/sites@2023-12-01' = { - name: '${logicAppName}-logicapp' - location: location - kind: 'functionapp,workflowapp' - identity: { - type: 'SystemAssigned, UserAssigned' - userAssignedIdentities: { - '${managedIdentityId}': {} - } - } - properties: { - serverFarmId: appServicePlan.id - siteConfig: { - netFrameworkVersion: 'v8.0' - functionsRuntimeScaleMonitoringEnabled: true - appSettings: [ - { - name: 'FUNCTIONS_EXTENSION_VERSION' - value: '~4' - } - { - name: 'FUNCTIONS_WORKER_RUNTIME' - value: 'dotnet' - } - { - name: 'AzureWebJobsStorage__managedIdentityResourceId' - value: managedIdentityId - } - { - name: 'AzureWebJobsStorage__credential' - value: 'managedIdentity' - } - { - name: 'AzureWebJobsStorage__blobServiceUri' - value: 'https://${storageAccountName}.blob.${environment().suffixes.storage}' - } - { - name: 'AzureWebJobsStorage__queueServiceUri' - value: 'https://${storageAccountName}.queue.${environment().suffixes.storage}' - } - { - name: 'AzureWebJobsStorage__tableServiceUri' - value: 'https://${storageAccountName}.table.${environment().suffixes.storage}' - } - { - name: 'WEBSITES_ENABLE_APP_SERVICE_STORAGE' - value: 'false' - } - { - name: 'AzureFunctionsJobHost__extensionBundle__id' - value: 'Microsoft.Azure.Functions.ExtensionBundle.Workflows' - } - { - name: 'AzureFunctionsJobHost__extensionBundle__version' - value: '[1.*, 2.0.0)' - } - { - name: 'APP_KIND' - value: 'workflowApp' - } - { - name: 'WORKFLOWS_SUBSCRIPTION_ID' - value: subscription().subscriptionId - } - { - name: 'WORKFLOWS_LOCATION_NAME' - value: location - } - { - name: 'WORKFLOWS_RESOURCE_GROUP_NAME' - value: resourceGroup().name - } - { - name: 'agent_openAIEndpoint' - value: openAIEndpoint - } - { - name: 'agent_ResourceID' - value: openAIResourceId - } - ] - } - httpsOnly: true - } -} - -output name string = logicApp.name -output systemAssignedPrincipalId string = logicApp.identity.principalId -output quickTestUrl string = 'https://${logicApp.properties.defaultHostName}/api/QuickTest/triggers/When_a_HTTP_request_is_received/invoke?api-version=2022-05-01&sp=%2Ftriggers%2FWhen_a_HTTP_request_is_received%2Frun&sv=1.0&sig=' diff --git a/samples/ai-loan-agent-sample/Deployment/infrastructure/modules/openai-rbac.bicep b/samples/ai-loan-agent-sample/Deployment/infrastructure/modules/openai-rbac.bicep deleted file mode 100644 index fb9a60b..0000000 --- a/samples/ai-loan-agent-sample/Deployment/infrastructure/modules/openai-rbac.bicep +++ /dev/null @@ -1,26 +0,0 @@ -// OpenAI RBAC Module - Grants Logic App access to OpenAI - -@description('OpenAI account name') -param openAIName string - -@description('Logic App managed identity principal ID') -param logicAppPrincipalId string - -resource openAI 'Microsoft.CognitiveServices/accounts@2023-05-01' existing = { - name: openAIName -} - -// Cognitive Services OpenAI User role -var cognitiveServicesOpenAIUserRoleId = '5e0bd9bd-7b93-4f28-af87-19fc36ad61bd' - -resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = { - name: guid(openAI.id, logicAppPrincipalId, cognitiveServicesOpenAIUserRoleId) - scope: openAI - properties: { - roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', cognitiveServicesOpenAIUserRoleId) - principalId: logicAppPrincipalId - principalType: 'ServicePrincipal' - } -} - -output roleAssignmentId string = roleAssignment.id diff --git a/samples/ai-loan-agent-sample/Deployment/infrastructure/modules/openai.bicep b/samples/ai-loan-agent-sample/Deployment/infrastructure/modules/openai.bicep deleted file mode 100644 index 6e59f3e..0000000 --- a/samples/ai-loan-agent-sample/Deployment/infrastructure/modules/openai.bicep +++ /dev/null @@ -1,40 +0,0 @@ -// Azure OpenAI Module - -@description('Azure OpenAI account name') -param openAIName string - -@description('Location for Azure OpenAI') -param location string - -resource openAI 'Microsoft.CognitiveServices/accounts@2024-10-01' = { - name: openAIName - location: location - kind: 'OpenAI' - sku: { - name: 'S0' - } - properties: { - customSubDomainName: openAIName - publicNetworkAccess: 'Enabled' - } -} - -resource deployment 'Microsoft.CognitiveServices/accounts/deployments@2024-10-01' = { - parent: openAI - name: 'gpt-4.1-mini' - sku: { - name: 'GlobalStandard' - capacity: 50 - } - properties: { - model: { - format: 'OpenAI' - name: 'gpt-4.1-mini' - version: '2025-04-14' - } - } -} - -output name string = openAI.name -output endpoint string = openAI.properties.endpoint -output resourceId string = openAI.id diff --git a/samples/ai-loan-agent-sample/Deployment/infrastructure/modules/storage-rbac.bicep b/samples/ai-loan-agent-sample/Deployment/infrastructure/modules/storage-rbac.bicep deleted file mode 100644 index 1ed0ed8..0000000 --- a/samples/ai-loan-agent-sample/Deployment/infrastructure/modules/storage-rbac.bicep +++ /dev/null @@ -1,45 +0,0 @@ -// Storage RBAC Module - Assigns required roles to Logic App managed identity - -@description('Storage account name') -param storageAccountName string - -@description('Principal ID of the Logic App managed identity') -param logicAppPrincipalId string - -// Storage account reference -resource storageAccount 'Microsoft.Storage/storageAccounts@2023-01-01' existing = { - name: storageAccountName -} - -// Role assignment: Storage Blob Data Owner -resource storageBlobDataOwnerAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = { - name: guid(storageAccount.id, logicAppPrincipalId, 'b7e6dc6d-f1e8-4753-8033-0f276bb0955b') - scope: storageAccount - properties: { - roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'b7e6dc6d-f1e8-4753-8033-0f276bb0955b') - principalId: logicAppPrincipalId - principalType: 'ServicePrincipal' - } -} - -// Role assignment: Storage Queue Data Contributor -resource storageQueueDataContributorAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = { - name: guid(storageAccount.id, logicAppPrincipalId, '974c5e8b-45b9-4653-ba55-5f855dd0fb88') - scope: storageAccount - properties: { - roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '974c5e8b-45b9-4653-ba55-5f855dd0fb88') - principalId: logicAppPrincipalId - principalType: 'ServicePrincipal' - } -} - -// Role assignment: Storage Table Data Contributor -resource storageTableDataContributorAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = { - name: guid(storageAccount.id, logicAppPrincipalId, '0a9a7e1f-b9d0-4cc4-a60d-0319b160aaa3') - scope: storageAccount - properties: { - roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '0a9a7e1f-b9d0-4cc4-a60d-0319b160aaa3') - principalId: logicAppPrincipalId - principalType: 'ServicePrincipal' - } -} diff --git a/samples/ai-loan-agent-sample/Deployment/infrastructure/modules/storage.bicep b/samples/ai-loan-agent-sample/Deployment/infrastructure/modules/storage.bicep deleted file mode 100644 index 449f211..0000000 --- a/samples/ai-loan-agent-sample/Deployment/infrastructure/modules/storage.bicep +++ /dev/null @@ -1,28 +0,0 @@ -// Storage Account Module - For Logic App runtime only - -@description('Storage account name') -param storageAccountName string - -@description('Location for the storage account') -param location string - -resource storageAccount 'Microsoft.Storage/storageAccounts@2023-05-01' = { - name: storageAccountName - location: location - sku: { - name: 'Standard_LRS' - } - kind: 'StorageV2' - properties: { - supportsHttpsTrafficOnly: true - minimumTlsVersion: 'TLS1_2' - allowBlobPublicAccess: false - allowSharedKeyAccess: false // Enforce managed identity only - no connection strings or keys - } -} - -output storageAccountName string = storageAccount.name -output storageAccountId string = storageAccount.id -output blobServiceUri string = storageAccount.properties.primaryEndpoints.blob -output queueServiceUri string = storageAccount.properties.primaryEndpoints.queue -output tableServiceUri string = storageAccount.properties.primaryEndpoints.table diff --git a/samples/ai-loan-agent-sample/Deployment/infrastructure/main.bicep b/samples/ai-loan-agent-sample/Deployment/main.bicep similarity index 64% rename from samples/ai-loan-agent-sample/Deployment/infrastructure/main.bicep rename to samples/ai-loan-agent-sample/Deployment/main.bicep index a563061..186b4ba 100644 --- a/samples/ai-loan-agent-sample/Deployment/infrastructure/main.bicep +++ b/samples/ai-loan-agent-sample/Deployment/main.bicep @@ -1,5 +1,8 @@ -// AI Loan Agent - Azure Infrastructure as Code -// Deploys Logic Apps Standard with Azure OpenAI for autonomous loan decisions +// Auto-generated from shared/templates/main.bicep.template +// To customize: edit this file directly or delete to regenerate from template +// +// Logic Apps Agent Sample - Azure Infrastructure as Code +// Deploys Logic Apps Standard with Azure OpenAI for autonomous agent workflows // Uses managed identity exclusively (no secrets/connection strings) targetScope = 'resourceGroup' @@ -12,6 +15,9 @@ param BaseName string // uniqueSuffix for when we need unique values var uniqueSuffix = uniqueString(resourceGroup().id) +// URL to workflows.zip (replaced by BundleAssets.ps1 with https://raw.githubusercontent.com/Azure/logicapps-labs/main/samples/ai-loan-agent-sample/Deployment/workflows.zip) +var workflowsZipUrl = 'https://raw.githubusercontent.com/Azure/logicapps-labs/main/samples/ai-loan-agent-sample/Deployment/workflows.zip' + // User-Assigned Managed Identity for Logic App → Storage authentication resource userAssignedIdentity 'Microsoft.ManagedIdentity/userAssignedIdentities@2023-01-31' = { name: '${take(BaseName, 60)}-managedidentity' @@ -19,17 +25,17 @@ resource userAssignedIdentity 'Microsoft.ManagedIdentity/userAssignedIdentities@ } // Storage Account for workflow runtime -module storage 'modules/storage.bicep' = { - name: '${BaseName}-storage-deployment' +module storage '../../shared/modules/storage.bicep' = { + name: '${take(BaseName, 43)}-storage-deployment' params: { storageAccountName: toLower(take(replace('${take(BaseName, 16)}${uniqueSuffix}', '-', ''), 24)) location: resourceGroup().location } } -// Azure OpenAI with gpt-4.1-mini model -module openai 'modules/openai.bicep' = { - name: '${BaseName}-openai-deployment' +// Azure OpenAI with gpt-5-mini model +module openai '../../shared/modules/openai.bicep' = { + name: '${take(BaseName, 44)}-openai-deployment' params: { openAIName: '${take(BaseName, 54)}-openai' location: resourceGroup().location @@ -37,8 +43,8 @@ module openai 'modules/openai.bicep' = { } // Logic Apps Standard with dual managed identities -module logicApp 'modules/logicapp.bicep' = { - name: '${BaseName}-logicapp-deployment' +module logicApp '../../shared/modules/logicapp.bicep' = { + name: '${take(BaseName, 42)}-logicapp-deployment' params: { logicAppName: '${take(BaseName, 22)}${uniqueSuffix}' location: resourceGroup().location @@ -50,37 +56,29 @@ module logicApp 'modules/logicapp.bicep' = { } // RBAC: Logic App → Storage (Blob, Queue, Table Contributor roles) -// dependsOn ensures RBAC is assigned after all resources exist (important for incremental deployments) -module storageRbac 'modules/storage-rbac.bicep' = { - name: '${BaseName}-storage-rbac-deployment' +module storageRbac '../../shared/modules/storage-rbac.bicep' = { + name: '${take(BaseName, 38)}-storage-rbac-deployment' params: { storageAccountName: storage.outputs.storageAccountName logicAppPrincipalId: userAssignedIdentity.properties.principalId } dependsOn: [ - storage - userAssignedIdentity logicApp ] } // RBAC: Logic App → Azure OpenAI (Cognitive Services User role) -// dependsOn ensures RBAC is assigned after all resources exist (important for incremental deployments) -module openaiRbac 'modules/openai-rbac.bicep' = { - name: '${BaseName}-openai-rbac-deployment' +module openaiRbac '../../shared/modules/openai-rbac.bicep' = { + name: '${take(BaseName, 39)}-openai-rbac-deployment' params: { openAIName: openai.outputs.name logicAppPrincipalId: logicApp.outputs.systemAssignedPrincipalId } - dependsOn: [ - openai - logicApp - ] } // Deploy workflows using deployment script with RBAC -module workflowDeployment 'modules/deployment-script.bicep' = { - name: '${BaseName}-workflow-deployment' +module workflowDeployment '../../shared/modules/deployment-script.bicep' = { + name: '${take(BaseName, 42)}-workflow-deployment' params: { deploymentScriptName: '${BaseName}-deploy-workflows' location: resourceGroup().location @@ -88,13 +86,11 @@ module workflowDeployment 'modules/deployment-script.bicep' = { deploymentIdentityPrincipalId: userAssignedIdentity.properties.principalId logicAppName: logicApp.outputs.name resourceGroupName: resourceGroup().name - workflowsZipUrl: 'https://raw.githubusercontent.com/modularity/logicapps-labs/loan-agent-deployment/samples/ai-loan-agent-sample/1ClickDeploy/workflows.zip' + workflowsZipUrl: workflowsZipUrl } dependsOn: [ storageRbac openaiRbac - logicApp - userAssignedIdentity ] } diff --git a/samples/ai-loan-agent-sample/1ClickDeploy/sample-arm.json b/samples/ai-loan-agent-sample/Deployment/sample-arm.json similarity index 86% rename from samples/ai-loan-agent-sample/1ClickDeploy/sample-arm.json rename to samples/ai-loan-agent-sample/Deployment/sample-arm.json index 0ca1c6f..3fd0c91 100644 --- a/samples/ai-loan-agent-sample/1ClickDeploy/sample-arm.json +++ b/samples/ai-loan-agent-sample/Deployment/sample-arm.json @@ -4,8 +4,8 @@ "metadata": { "_generator": { "name": "bicep", - "version": "0.34.44.8038", - "templateHash": "14295569004504621407" + "version": "0.39.26.7824", + "templateHash": "4411128690320887628" } }, "parameters": { @@ -19,7 +19,8 @@ } }, "variables": { - "uniqueSuffix": "[uniqueString(resourceGroup().id)]" + "uniqueSuffix": "[uniqueString(resourceGroup().id)]", + "workflowsZipUrl": "https://raw.githubusercontent.com/Azure/logicapps-labs/main/samples/ai-loan-agent-sample/Deployment/workflows.zip" }, "resources": [ { @@ -30,8 +31,8 @@ }, { "type": "Microsoft.Resources/deployments", - "apiVersion": "2022-09-01", - "name": "[format('{0}-storage-deployment', parameters('BaseName'))]", + "apiVersion": "2025-04-01", + "name": "[format('{0}-storage-deployment', take(parameters('BaseName'), 43))]", "properties": { "expressionEvaluationOptions": { "scope": "inner" @@ -51,8 +52,8 @@ "metadata": { "_generator": { "name": "bicep", - "version": "0.34.44.8038", - "templateHash": "6666359930464991611" + "version": "0.39.26.7824", + "templateHash": "11906848055003519521" } }, "parameters": { @@ -114,8 +115,8 @@ }, { "type": "Microsoft.Resources/deployments", - "apiVersion": "2022-09-01", - "name": "[format('{0}-openai-deployment', parameters('BaseName'))]", + "apiVersion": "2025-04-01", + "name": "[format('{0}-openai-deployment', take(parameters('BaseName'), 44))]", "properties": { "expressionEvaluationOptions": { "scope": "inner" @@ -135,8 +136,8 @@ "metadata": { "_generator": { "name": "bicep", - "version": "0.34.44.8038", - "templateHash": "10689067746502759371" + "version": "0.39.26.7824", + "templateHash": "6448475993981052673" } }, "parameters": { @@ -171,7 +172,7 @@ { "type": "Microsoft.CognitiveServices/accounts/deployments", "apiVersion": "2024-10-01", - "name": "[format('{0}/{1}', parameters('openAIName'), 'gpt-4.1-mini')]", + "name": "[format('{0}/{1}', parameters('openAIName'), 'gpt-5-mini')]", "sku": { "name": "GlobalStandard", "capacity": 50 @@ -179,8 +180,8 @@ "properties": { "model": { "format": "OpenAI", - "name": "gpt-4.1-mini", - "version": "2025-04-14" + "name": "gpt-5-mini", + "version": "2025-08-07" } }, "dependsOn": [ @@ -207,8 +208,8 @@ }, { "type": "Microsoft.Resources/deployments", - "apiVersion": "2022-09-01", - "name": "[format('{0}-logicapp-deployment', parameters('BaseName'))]", + "apiVersion": "2025-04-01", + "name": "[format('{0}-logicapp-deployment', take(parameters('BaseName'), 42))]", "properties": { "expressionEvaluationOptions": { "scope": "inner" @@ -222,13 +223,13 @@ "value": "[resourceGroup().location]" }, "storageAccountName": { - "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-storage-deployment', parameters('BaseName'))), '2022-09-01').outputs.storageAccountName.value]" + "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-storage-deployment', take(parameters('BaseName'), 43))), '2025-04-01').outputs.storageAccountName.value]" }, "openAIEndpoint": { - "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-openai-deployment', parameters('BaseName'))), '2022-09-01').outputs.endpoint.value]" + "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-openai-deployment', take(parameters('BaseName'), 44))), '2025-04-01').outputs.endpoint.value]" }, "openAIResourceId": { - "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-openai-deployment', parameters('BaseName'))), '2022-09-01').outputs.resourceId.value]" + "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-openai-deployment', take(parameters('BaseName'), 44))), '2025-04-01').outputs.resourceId.value]" }, "managedIdentityId": { "value": "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', format('{0}-managedidentity', take(parameters('BaseName'), 60)))]" @@ -240,8 +241,8 @@ "metadata": { "_generator": { "name": "bicep", - "version": "0.34.44.8038", - "templateHash": "17288948455817957334" + "version": "0.39.26.7824", + "templateHash": "3032492753694364828" } }, "parameters": { @@ -399,21 +400,21 @@ }, "quickTestUrl": { "type": "string", - "value": "[format('https://{0}/api/QuickTest/triggers/When_a_HTTP_request_is_received/invoke?api-version=2022-05-01&sp=%2Ftriggers%2FWhen_a_HTTP_request_is_received%2Frun&sv=1.0&sig=', reference(resourceId('Microsoft.Web/sites', format('{0}-logicapp', parameters('logicAppName'))), '2023-12-01').defaultHostName)]" + "value": "[format('https://{0}/api/ProductReturnAgent/triggers/When_a_HTTP_request_is_received/invoke?api-version=2022-05-01&sp=%2Ftriggers%2FWhen_a_HTTP_request_is_received%2Frun&sv=1.0&sig=', reference(resourceId('Microsoft.Web/sites', format('{0}-logicapp', parameters('logicAppName'))), '2023-12-01').defaultHostName)]" } } } }, "dependsOn": [ - "[resourceId('Microsoft.Resources/deployments', format('{0}-openai-deployment', parameters('BaseName')))]", - "[resourceId('Microsoft.Resources/deployments', format('{0}-storage-deployment', parameters('BaseName')))]", + "[resourceId('Microsoft.Resources/deployments', format('{0}-openai-deployment', take(parameters('BaseName'), 44)))]", + "[resourceId('Microsoft.Resources/deployments', format('{0}-storage-deployment', take(parameters('BaseName'), 43)))]", "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', format('{0}-managedidentity', take(parameters('BaseName'), 60)))]" ] }, { "type": "Microsoft.Resources/deployments", - "apiVersion": "2022-09-01", - "name": "[format('{0}-storage-rbac-deployment', parameters('BaseName'))]", + "apiVersion": "2025-04-01", + "name": "[format('{0}-storage-rbac-deployment', take(parameters('BaseName'), 38))]", "properties": { "expressionEvaluationOptions": { "scope": "inner" @@ -421,7 +422,7 @@ "mode": "Incremental", "parameters": { "storageAccountName": { - "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-storage-deployment', parameters('BaseName'))), '2022-09-01').outputs.storageAccountName.value]" + "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-storage-deployment', take(parameters('BaseName'), 43))), '2025-04-01').outputs.storageAccountName.value]" }, "logicAppPrincipalId": { "value": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', format('{0}-managedidentity', take(parameters('BaseName'), 60))), '2023-01-31').principalId]" @@ -433,8 +434,8 @@ "metadata": { "_generator": { "name": "bicep", - "version": "0.34.44.8038", - "templateHash": "13372547588259048703" + "version": "0.39.26.7824", + "templateHash": "8000893445802246432" } }, "parameters": { @@ -489,15 +490,15 @@ } }, "dependsOn": [ - "[resourceId('Microsoft.Resources/deployments', format('{0}-logicapp-deployment', parameters('BaseName')))]", - "[resourceId('Microsoft.Resources/deployments', format('{0}-storage-deployment', parameters('BaseName')))]", + "[resourceId('Microsoft.Resources/deployments', format('{0}-logicapp-deployment', take(parameters('BaseName'), 42)))]", + "[resourceId('Microsoft.Resources/deployments', format('{0}-storage-deployment', take(parameters('BaseName'), 43)))]", "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', format('{0}-managedidentity', take(parameters('BaseName'), 60)))]" ] }, { "type": "Microsoft.Resources/deployments", - "apiVersion": "2022-09-01", - "name": "[format('{0}-openai-rbac-deployment', parameters('BaseName'))]", + "apiVersion": "2025-04-01", + "name": "[format('{0}-openai-rbac-deployment', take(parameters('BaseName'), 39))]", "properties": { "expressionEvaluationOptions": { "scope": "inner" @@ -505,10 +506,10 @@ "mode": "Incremental", "parameters": { "openAIName": { - "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-openai-deployment', parameters('BaseName'))), '2022-09-01').outputs.name.value]" + "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-openai-deployment', take(parameters('BaseName'), 44))), '2025-04-01').outputs.name.value]" }, "logicAppPrincipalId": { - "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-logicapp-deployment', parameters('BaseName'))), '2022-09-01').outputs.systemAssignedPrincipalId.value]" + "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-logicapp-deployment', take(parameters('BaseName'), 42))), '2025-04-01').outputs.systemAssignedPrincipalId.value]" } }, "template": { @@ -517,8 +518,8 @@ "metadata": { "_generator": { "name": "bicep", - "version": "0.34.44.8038", - "templateHash": "3822718305786172483" + "version": "0.39.26.7824", + "templateHash": "6926659019016520420" } }, "parameters": { @@ -560,14 +561,14 @@ } }, "dependsOn": [ - "[resourceId('Microsoft.Resources/deployments', format('{0}-logicapp-deployment', parameters('BaseName')))]", - "[resourceId('Microsoft.Resources/deployments', format('{0}-openai-deployment', parameters('BaseName')))]" + "[resourceId('Microsoft.Resources/deployments', format('{0}-logicapp-deployment', take(parameters('BaseName'), 42)))]", + "[resourceId('Microsoft.Resources/deployments', format('{0}-openai-deployment', take(parameters('BaseName'), 44)))]" ] }, { "type": "Microsoft.Resources/deployments", - "apiVersion": "2022-09-01", - "name": "[format('{0}-workflow-deployment', parameters('BaseName'))]", + "apiVersion": "2025-04-01", + "name": "[format('{0}-workflow-deployment', take(parameters('BaseName'), 42))]", "properties": { "expressionEvaluationOptions": { "scope": "inner" @@ -587,13 +588,13 @@ "value": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', format('{0}-managedidentity', take(parameters('BaseName'), 60))), '2023-01-31').principalId]" }, "logicAppName": { - "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-logicapp-deployment', parameters('BaseName'))), '2022-09-01').outputs.name.value]" + "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-logicapp-deployment', take(parameters('BaseName'), 42))), '2025-04-01').outputs.name.value]" }, "resourceGroupName": { "value": "[resourceGroup().name]" }, "workflowsZipUrl": { - "value": "https://raw.githubusercontent.com/modularity/logicapps-labs/loan-agent-deployment/samples/ai-loan-agent-sample/1ClickDeploy/workflows.zip" + "value": "[variables('workflowsZipUrl')]" } }, "template": { @@ -602,8 +603,8 @@ "metadata": { "_generator": { "name": "bicep", - "version": "0.34.44.8038", - "templateHash": "712288766568288725" + "version": "0.39.26.7824", + "templateHash": "2786599112922814163" } }, "parameters": { @@ -692,7 +693,7 @@ "value": "[parameters('workflowsZipUrl')]" } ], - "scriptContent": " #!/bin/bash\r\n set -e\r\n \r\n echo \"Downloading workflows.zip...\"\r\n wget -O workflows.zip \"$WORKFLOWS_ZIP_URL\"\r\n \r\n echo \"Deploying workflows to Logic App: $LOGIC_APP_NAME\"\r\n az functionapp deployment source config-zip \\\r\n --resource-group \"$RESOURCE_GROUP\" \\\r\n --name \"$LOGIC_APP_NAME\" \\\r\n --src workflows.zip\r\n \r\n echo \"Waiting 60 seconds for workflow registration and RBAC propagation...\"\r\n sleep 60\r\n \r\n echo \"Deployment completed successfully\"\r\n " + "scriptContent": " #!/bin/bash\r\n set -e\r\n\r\n echo \"Downloading workflows.zip...\"\r\n wget -O workflows.zip \"$WORKFLOWS_ZIP_URL\"\r\n\r\n echo \"Deploying workflows to Logic App: $LOGIC_APP_NAME\"\r\n az functionapp deployment source config-zip \\\r\n --resource-group \"$RESOURCE_GROUP\" \\\r\n --name \"$LOGIC_APP_NAME\" \\\r\n --src workflows.zip\r\n\r\n echo \"Waiting 60 seconds for workflow registration and RBAC propagation...\"\r\n sleep 60\r\n\r\n echo \"Deployment completed successfully\"\r\n " }, "dependsOn": [ "[resourceId('Microsoft.Authorization/roleAssignments', guid(resourceGroup().id, parameters('deploymentIdentityPrincipalId'), 'de139f84-1756-47ae-9be6-808fbbe84772'))]" @@ -702,9 +703,9 @@ } }, "dependsOn": [ - "[resourceId('Microsoft.Resources/deployments', format('{0}-logicapp-deployment', parameters('BaseName')))]", - "[resourceId('Microsoft.Resources/deployments', format('{0}-openai-rbac-deployment', parameters('BaseName')))]", - "[resourceId('Microsoft.Resources/deployments', format('{0}-storage-rbac-deployment', parameters('BaseName')))]", + "[resourceId('Microsoft.Resources/deployments', format('{0}-logicapp-deployment', take(parameters('BaseName'), 42)))]", + "[resourceId('Microsoft.Resources/deployments', format('{0}-openai-rbac-deployment', take(parameters('BaseName'), 39)))]", + "[resourceId('Microsoft.Resources/deployments', format('{0}-storage-rbac-deployment', take(parameters('BaseName'), 38)))]", "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', format('{0}-managedidentity', take(parameters('BaseName'), 60)))]" ] } @@ -712,11 +713,11 @@ "outputs": { "logicAppName": { "type": "string", - "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-logicapp-deployment', parameters('BaseName'))), '2022-09-01').outputs.name.value]" + "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-logicapp-deployment', take(parameters('BaseName'), 42))), '2025-04-01').outputs.name.value]" }, "openAIEndpoint": { "type": "string", - "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-openai-deployment', parameters('BaseName'))), '2022-09-01').outputs.endpoint.value]" + "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-openai-deployment', take(parameters('BaseName'), 44))), '2025-04-01').outputs.endpoint.value]" } } } \ No newline at end of file diff --git a/samples/ai-loan-agent-sample/Deployment/test-agent.ps1 b/samples/ai-loan-agent-sample/Deployment/test-agent.ps1 deleted file mode 100644 index d5cd02f..0000000 --- a/samples/ai-loan-agent-sample/Deployment/test-agent.ps1 +++ /dev/null @@ -1,214 +0,0 @@ -<# -.SYNOPSIS - Test AI Loan Agent with 4 loan application scenarios - -.PARAMETER ResourceGroupName - Azure resource group containing the Logic App - -.PARAMETER LogicAppName - Name of the Logic App Standard resource - -.PARAMETER WorkflowName - Name of the workflow to test (default: LoanApprovalAgent) - -.EXAMPLE - .\test-agent.ps1 -ResourceGroupName "rg-ailoan" -LogicAppName "ailoan-logicapp" -#> - -param( - [Parameter(Mandatory=$true)] - [string]$ResourceGroupName, - - [Parameter(Mandatory=$true)] - [string]$LogicAppName, - - [Parameter(Mandatory=$false)] - [string]$WorkflowName = "LoanApprovalAgent" -) - -function Show-AgentResponse { - param( - [string]$CaseName, - $Response - ) - - Write-Host " Agent decision output ($CaseName):" -ForegroundColor DarkYellow - - if ($null -eq $Response) { - Write-Host " (No response body returned)" -ForegroundColor Gray - return - } - - if ($Response -is [string]) { - Write-Host " $Response" -ForegroundColor Green - return - } - - try { - $json = $Response | ConvertTo-Json -Depth 10 - $indented = " " + ($json -replace "`n", "`n ") - Write-Host $indented -ForegroundColor Green - - if ($Response.PSObject.Properties.Name -contains 'decision') { - Write-Host " Decision: $($Response.decision)" -ForegroundColor Green - } - } catch { - Write-Host " $Response" -ForegroundColor Green - } -} - -Write-Host "`n=== Testing AI Loan Agent ===" -ForegroundColor Cyan -Write-Host "Resource Group: $ResourceGroupName" -Write-Host "Logic App: $LogicAppName" -Write-Host "Workflow: $WorkflowName`n" - -# Get workflow callback URL -Write-Host "Getting workflow callback URL..." -ForegroundColor Yellow -$subscriptionId = (Get-AzContext).Subscription.Id - -try { - $tokenObj = Get-AzAccessToken -ResourceUrl "https://management.azure.com" - - # Handle both SecureString (Az 14.x) and plain text (Az 13.x) - if ($tokenObj.Token -is [System.Security.SecureString]) { - $ssPtr = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($tokenObj.Token) - try { - $token = [System.Runtime.InteropServices.Marshal]::PtrToStringBSTR($ssPtr) - } finally { - [System.Runtime.InteropServices.Marshal]::ZeroFreeBSTR($ssPtr) - } - } else { - $token = $tokenObj.Token - } - - $uri = "https://management.azure.com/subscriptions/$subscriptionId/resourceGroups/$ResourceGroupName/providers/Microsoft.Web/sites/$LogicAppName/hostruntime/runtime/webhooks/workflow/api/management/workflows/$WorkflowName/triggers/manual/listCallbackUrl?api-version=2023-12-01" - - $headers = @{ - "Authorization" = "Bearer $token" - "Content-Type" = "application/json" - } - - $response = Invoke-RestMethod -Method Post -Uri $uri -Headers $headers - $callbackUrl = $response.value - - if ([string]::IsNullOrEmpty($callbackUrl)) { - throw "Callback URL is empty" - } - - Write-Host "✓ Callback URL retrieved" -ForegroundColor Green -} catch { - Write-Host "✗ Failed to get callback URL: $_" -ForegroundColor Red - Write-Host "`nTroubleshooting:" -ForegroundColor Yellow - Write-Host "1. Verify workflows are deployed to Logic App" - Write-Host "2. Check workflow name is correct: $WorkflowName" - Write-Host "3. Ensure you're logged into Azure: Connect-AzAccount" - exit 1 -} - -# Test Case 1: Auto-Approval (High credit, standard vehicle, within limits) -Write-Host "\n--- Test Case 1: Auto-Approval Scenario ---" -ForegroundColor Cyan -$payload1 = @{ - applicationId = "APP-AUTO-APPROVE-001" - name = "Applicant A" - email = "applicant.a@example.com" - loanAmount = 25000 - vehicleMake = "Toyota" - vehicleModel = "Camry" - salary = 75000 - employmentYears = 5 - creditScore = 780 - bankruptcies = 0 -} | ConvertTo-Json - -try { - $result1 = Invoke-RestMethod -Method Post -Uri $callbackUrl -Body $payload1 -ContentType "application/json" - Write-Host "✓ Test Case 1 Submitted" -ForegroundColor Green - Show-AgentResponse -CaseName "Test Case 1" -Response $result1 -} catch { - Write-Host "✗ Test Case 1 Failed: $_" -ForegroundColor Red -} -Start-Sleep -Seconds 15 - -# Test Case 2: Human Review Required (Exceeds loan limit, good credit) -Write-Host "\n--- Test Case 2: Human Review Scenario ---" -ForegroundColor Cyan -$payload2 = @{ - applicationId = "APP-REVIEW-REQUIRED-002" - name = "Applicant B" - email = "applicant.b@example.com" - loanAmount = 55000 - vehicleMake = "BMW" - vehicleModel = "X5" - salary = 95000 - employmentYears = 3 - creditScore = 720 - bankruptcies = 0 -} | ConvertTo-Json - -try { - $result2 = Invoke-RestMethod -Method Post -Uri $callbackUrl -Body $payload2 -ContentType "application/json" - Write-Host "✓ Test Case 2 Submitted" -ForegroundColor Green - Show-AgentResponse -CaseName "Test Case 2" -Response $result2 -} catch { - Write-Host "✗ Test Case 2 Failed: $_" -ForegroundColor Red -} -Start-Sleep -Seconds 15 - -# Test Case 3: Auto-Rejection (Poor credit + bankruptcy) -Write-Host "\n--- Test Case 3: Auto-Rejection Scenario ---" -ForegroundColor Cyan -$payload3 = @{ - applicationId = "APP-AUTO-REJECT-003" - name = "Applicant C" - email = "applicant.c@example.com" - loanAmount = 30000 - vehicleMake = "Honda" - vehicleModel = "Accord" - salary = 45000 - employmentYears = 0.5 - creditScore = 580 - bankruptcies = 1 -} | ConvertTo-Json - -try { - $result3 = Invoke-RestMethod -Method Post -Uri $callbackUrl -Body $payload3 -ContentType "application/json" - Write-Host "✓ Test Case 3 Submitted" -ForegroundColor Green - Show-AgentResponse -CaseName "Test Case 3" -Response $result3 -} catch { - Write-Host "✗ Test Case 3 Failed: $_" -ForegroundColor Red -} -Start-Sleep -Seconds 15 - -# Test Case 4: Luxury Vehicle Review (Excellent credit but exotic vehicle) -Write-Host "\n--- Test Case 4: Luxury Vehicle Review Scenario ---" -ForegroundColor Cyan -$payload4 = @{ - applicationId = "APP-LUXURY-REVIEW-004" - name = "Applicant D" - email = "applicant.d@example.com" - loanAmount = 80000 - vehicleMake = "Ferrari" - vehicleModel = "F8 Tributo" - salary = 120000 - employmentYears = 4 - creditScore = 750 - bankruptcies = 0 -} | ConvertTo-Json - -try { - $result4 = Invoke-RestMethod -Method Post -Uri $callbackUrl -Body $payload4 -ContentType "application/json" - Write-Host "✓ Test Case 4 Submitted" -ForegroundColor Green - Show-AgentResponse -CaseName "Test Case 4" -Response $result4 -} catch { - Write-Host "✗ Test Case 4 Failed: $_" -ForegroundColor Red -} - -# Summary -Write-Host "`n=== Testing Complete ===" -ForegroundColor Cyan -Write-Host "`nTest Results Summary:" -ForegroundColor Yellow -Write-Host " Test Case 1 (Auto-Approval): Excellent applicant → Expected: APPROVED" -Write-Host " Test Case 2 (Human Review): Borderline case → Expected: Simulated decision" -Write-Host " Test Case 3 (Auto-Rejection): Poor credit + bankruptcy → Expected: REJECTED" -Write-Host " Test Case 4 (Luxury Vehicle): Special vehicle → Expected: Human review" - -Write-Host "`n📊 View in Azure Portal:" -ForegroundColor Cyan -Write-Host "https://portal.azure.com/#@/resource/subscriptions/$subscriptionId/resourceGroups/$ResourceGroupName/providers/Microsoft.Web/sites/$LogicAppName/logicApp" - -Write-Host "`n💡 Note: Human approval is currently simulated. See README for Teams integration." -ForegroundColor Gray diff --git a/samples/ai-loan-agent-sample/Deployment/workflows.zip b/samples/ai-loan-agent-sample/Deployment/workflows.zip new file mode 100644 index 0000000000000000000000000000000000000000..ec7a338f50d5a6ea4d482bfada6d74d439523670 GIT binary patch literal 11460 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 literal 0 HcmV?d00001 diff --git a/samples/ai-loan-agent-sample/LogicApps/LoanApprovalAgent/workflow.json b/samples/ai-loan-agent-sample/LogicApps/LoanApprovalAgent/workflow.json index db189c5..5f3039c 100644 --- a/samples/ai-loan-agent-sample/LogicApps/LoanApprovalAgent/workflow.json +++ b/samples/ai-loan-agent-sample/LogicApps/LoanApprovalAgent/workflow.json @@ -6,7 +6,7 @@ "type": "Agent", "inputs": { "parameters": { - "deploymentId": "gpt-4.1-mini", + "deploymentId": "gpt-5-mini", "messages": [ { "role": "system", @@ -20,9 +20,9 @@ "agentModelType": "AzureOpenAI", "agentModelSettings": { "deploymentModelProperties": { - "name": "gpt-4.1-mini", + "name": "gpt-5-mini", "format": "OpenAI", - "version": "2025-04-14" + "version": "2025-08-07" } } }, diff --git a/samples/ai-loan-agent-sample/LogicApps/README.md b/samples/ai-loan-agent-sample/LogicApps/README.md index 2dd3290..ea45209 100644 --- a/samples/ai-loan-agent-sample/LogicApps/README.md +++ b/samples/ai-loan-agent-sample/LogicApps/README.md @@ -172,7 +172,7 @@ Your completed `local.settings.json` should look similar to this: - Verify the endpoint URL is correct and includes `https://` - Ensure the endpoint URL ends with a trailing slash (`/`) - Check that the resource ID matches your Azure OpenAI resource exactly -- Verify your Azure OpenAI deployment has the `gpt-4.1-mini` model deployed +- Verify your Azure OpenAI deployment has the `gpt-5-mini` model deployed **Runtime Issues:** - Verify .NET 8 SDK is installed diff --git a/samples/ai-loan-agent-sample/README.md b/samples/ai-loan-agent-sample/README.md index ed16491..bf82a8d 100644 --- a/samples/ai-loan-agent-sample/README.md +++ b/samples/ai-loan-agent-sample/README.md @@ -10,12 +10,11 @@ An AI-powered loan approval system that automates the evaluation of vehicle loan **Prerequisites:** - Azure subscription with contributor access -- Region supporting Azure OpenAI (GPT-4.1-mini) and Logic Apps Standard - see [region selection](#region-selection) +- Region supporting Azure OpenAI (GPT-5-mini) and Logic Apps Standard - see [region selection](#region-selection) **Deploy to your Azure subscription:** -[![Deploy to Azure](https://aka.ms/deploytoazurebutton)](https://portal.azure.com/#create/Microsoft.Template/uri/https%3A%2F%2Fraw.githubusercontent.com%2Fmodularity%2Flogicapps-labs%2Frefs%2Fheads%2Floan-agent-deployment%2Fsamples%2Fai-loan-agent-sample%2F1ClickDeploy%2Fsample-arm.json) - +[![Deploy to Azure](https://aka.ms/deploytoazurebutton)](https://portal.azure.com/#create/Microsoft.Template/uri/https%3A%2F%2Fraw.githubusercontent.com%2FAzure%2Flogicapps-labs%2Fmain%2Fsamples%2Fai-loan-agent-sample%2FDeployment%2Fsample-arm.json)

What happens when you deploy @@ -32,7 +31,7 @@ An AI-powered loan approval system that automates the evaluation of vehicle loan | Resource | Purpose | |----------|----------| | Logic App Standard | Hosts AI agent workflows | -| Azure OpenAI | GPT-4.1-mini model for agent reasoning | +| Azure OpenAI | GPT-5-mini model for agent reasoning | | Storage Account | Workflow state and run history | | App Service Plan | Compute resources | | Managed Identity | Passwordless authentication | diff --git a/samples/json-remediation-agent/Deployment/main.bicep b/samples/json-remediation-agent/Deployment/main.bicep index 9ea587d..639e569 100644 --- a/samples/json-remediation-agent/Deployment/main.bicep +++ b/samples/json-remediation-agent/Deployment/main.bicep @@ -1,8 +1,8 @@ // Auto-generated from shared/templates/main.bicep.template // To customize: edit this file directly or delete to regenerate from template // -// JSON Remediation Agent - Azure Infrastructure as Code -// Deploys Logic Apps Standard with Azure OpenAI for autonomous JSON repair and validation +// Logic Apps Agent Sample - Azure Infrastructure as Code +// Deploys Logic Apps Standard with Azure OpenAI for autonomous agent workflows // Uses managed identity exclusively (no secrets/connection strings) targetScope = 'resourceGroup' @@ -15,8 +15,8 @@ param BaseName string // uniqueSuffix for when we need unique values var uniqueSuffix = uniqueString(resourceGroup().id) -// URL to workflows.zip (replaced by BundleAssets.ps1 with https://raw.githubusercontent.com/modularity/logicapps-labs/json-remediation-agent/samples/json-remediation-agent/Deployment/workflows.zip) -var workflowsZipUrl = 'https://raw.githubusercontent.com/modularity/logicapps-labs/json-remediation-agent/samples/json-remediation-agent/Deployment/workflows.zip' +// URL to workflows.zip (replaced by BundleAssets.ps1 with https://raw.githubusercontent.com/Azure/logicapps-labs/main/samples/json-remediation-agent/Deployment/workflows.zip) +var workflowsZipUrl = 'https://raw.githubusercontent.com/Azure/logicapps-labs/main/samples/json-remediation-agent/Deployment/workflows.zip' // User-Assigned Managed Identity for Logic App → Storage authentication resource userAssignedIdentity 'Microsoft.ManagedIdentity/userAssignedIdentities@2023-01-31' = { @@ -33,7 +33,7 @@ module storage '../../shared/modules/storage.bicep' = { } } -// Azure OpenAI with gpt-4o-mini model +// Azure OpenAI with gpt-5-mini model module openai '../../shared/modules/openai.bicep' = { name: '${take(BaseName, 44)}-openai-deployment' params: { diff --git a/samples/json-remediation-agent/Deployment/sample-arm.json b/samples/json-remediation-agent/Deployment/sample-arm.json index e72327d..82c0726 100644 --- a/samples/json-remediation-agent/Deployment/sample-arm.json +++ b/samples/json-remediation-agent/Deployment/sample-arm.json @@ -4,8 +4,8 @@ "metadata": { "_generator": { "name": "bicep", - "version": "0.34.44.8038", - "templateHash": "5488634814907059008" + "version": "0.39.26.7824", + "templateHash": "13273151993006358318" } }, "parameters": { @@ -20,7 +20,7 @@ }, "variables": { "uniqueSuffix": "[uniqueString(resourceGroup().id)]", - "workflowsZipUrl": "https://raw.githubusercontent.com/modularity/logicapps-labs/json-remediation-agent/samples/json-remediation-agent/Deployment/workflows.zip" + "workflowsZipUrl": "https://raw.githubusercontent.com/Azure/logicapps-labs/main/samples/json-remediation-agent/Deployment/workflows.zip" }, "resources": [ { @@ -31,7 +31,7 @@ }, { "type": "Microsoft.Resources/deployments", - "apiVersion": "2022-09-01", + "apiVersion": "2025-04-01", "name": "[format('{0}-storage-deployment', take(parameters('BaseName'), 43))]", "properties": { "expressionEvaluationOptions": { @@ -52,8 +52,8 @@ "metadata": { "_generator": { "name": "bicep", - "version": "0.34.44.8038", - "templateHash": "6666359930464991611" + "version": "0.39.26.7824", + "templateHash": "11906848055003519521" } }, "parameters": { @@ -115,7 +115,7 @@ }, { "type": "Microsoft.Resources/deployments", - "apiVersion": "2022-09-01", + "apiVersion": "2025-04-01", "name": "[format('{0}-openai-deployment', take(parameters('BaseName'), 44))]", "properties": { "expressionEvaluationOptions": { @@ -136,8 +136,8 @@ "metadata": { "_generator": { "name": "bicep", - "version": "0.34.44.8038", - "templateHash": "5370603553016721570" + "version": "0.39.26.7824", + "templateHash": "6448475993981052673" } }, "parameters": { @@ -172,7 +172,7 @@ { "type": "Microsoft.CognitiveServices/accounts/deployments", "apiVersion": "2024-10-01", - "name": "[format('{0}/{1}', parameters('openAIName'), 'gpt-4o-mini')]", + "name": "[format('{0}/{1}', parameters('openAIName'), 'gpt-5-mini')]", "sku": { "name": "GlobalStandard", "capacity": 50 @@ -180,8 +180,8 @@ "properties": { "model": { "format": "OpenAI", - "name": "gpt-4o-mini", - "version": "2024-07-18" + "name": "gpt-5-mini", + "version": "2025-08-07" } }, "dependsOn": [ @@ -208,7 +208,7 @@ }, { "type": "Microsoft.Resources/deployments", - "apiVersion": "2022-09-01", + "apiVersion": "2025-04-01", "name": "[format('{0}-logicapp-deployment', take(parameters('BaseName'), 42))]", "properties": { "expressionEvaluationOptions": { @@ -223,13 +223,13 @@ "value": "[resourceGroup().location]" }, "storageAccountName": { - "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-storage-deployment', take(parameters('BaseName'), 43))), '2022-09-01').outputs.storageAccountName.value]" + "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-storage-deployment', take(parameters('BaseName'), 43))), '2025-04-01').outputs.storageAccountName.value]" }, "openAIEndpoint": { - "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-openai-deployment', take(parameters('BaseName'), 44))), '2022-09-01').outputs.endpoint.value]" + "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-openai-deployment', take(parameters('BaseName'), 44))), '2025-04-01').outputs.endpoint.value]" }, "openAIResourceId": { - "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-openai-deployment', take(parameters('BaseName'), 44))), '2022-09-01').outputs.resourceId.value]" + "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-openai-deployment', take(parameters('BaseName'), 44))), '2025-04-01').outputs.resourceId.value]" }, "managedIdentityId": { "value": "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', format('{0}-managedidentity', take(parameters('BaseName'), 60)))]" @@ -241,8 +241,8 @@ "metadata": { "_generator": { "name": "bicep", - "version": "0.34.44.8038", - "templateHash": "2259432651138452624" + "version": "0.39.26.7824", + "templateHash": "3032492753694364828" } }, "parameters": { @@ -413,7 +413,7 @@ }, { "type": "Microsoft.Resources/deployments", - "apiVersion": "2022-09-01", + "apiVersion": "2025-04-01", "name": "[format('{0}-storage-rbac-deployment', take(parameters('BaseName'), 38))]", "properties": { "expressionEvaluationOptions": { @@ -422,7 +422,7 @@ "mode": "Incremental", "parameters": { "storageAccountName": { - "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-storage-deployment', take(parameters('BaseName'), 43))), '2022-09-01').outputs.storageAccountName.value]" + "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-storage-deployment', take(parameters('BaseName'), 43))), '2025-04-01').outputs.storageAccountName.value]" }, "logicAppPrincipalId": { "value": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', format('{0}-managedidentity', take(parameters('BaseName'), 60))), '2023-01-31').principalId]" @@ -434,8 +434,8 @@ "metadata": { "_generator": { "name": "bicep", - "version": "0.34.44.8038", - "templateHash": "13372547588259048703" + "version": "0.39.26.7824", + "templateHash": "8000893445802246432" } }, "parameters": { @@ -497,7 +497,7 @@ }, { "type": "Microsoft.Resources/deployments", - "apiVersion": "2022-09-01", + "apiVersion": "2025-04-01", "name": "[format('{0}-openai-rbac-deployment', take(parameters('BaseName'), 39))]", "properties": { "expressionEvaluationOptions": { @@ -506,10 +506,10 @@ "mode": "Incremental", "parameters": { "openAIName": { - "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-openai-deployment', take(parameters('BaseName'), 44))), '2022-09-01').outputs.name.value]" + "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-openai-deployment', take(parameters('BaseName'), 44))), '2025-04-01').outputs.name.value]" }, "logicAppPrincipalId": { - "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-logicapp-deployment', take(parameters('BaseName'), 42))), '2022-09-01').outputs.systemAssignedPrincipalId.value]" + "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-logicapp-deployment', take(parameters('BaseName'), 42))), '2025-04-01').outputs.systemAssignedPrincipalId.value]" } }, "template": { @@ -518,8 +518,8 @@ "metadata": { "_generator": { "name": "bicep", - "version": "0.34.44.8038", - "templateHash": "3822718305786172483" + "version": "0.39.26.7824", + "templateHash": "6926659019016520420" } }, "parameters": { @@ -567,7 +567,7 @@ }, { "type": "Microsoft.Resources/deployments", - "apiVersion": "2022-09-01", + "apiVersion": "2025-04-01", "name": "[format('{0}-workflow-deployment', take(parameters('BaseName'), 42))]", "properties": { "expressionEvaluationOptions": { @@ -588,7 +588,7 @@ "value": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', format('{0}-managedidentity', take(parameters('BaseName'), 60))), '2023-01-31').principalId]" }, "logicAppName": { - "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-logicapp-deployment', take(parameters('BaseName'), 42))), '2022-09-01').outputs.name.value]" + "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-logicapp-deployment', take(parameters('BaseName'), 42))), '2025-04-01').outputs.name.value]" }, "resourceGroupName": { "value": "[resourceGroup().name]" @@ -603,8 +603,8 @@ "metadata": { "_generator": { "name": "bicep", - "version": "0.34.44.8038", - "templateHash": "6479226689635161201" + "version": "0.39.26.7824", + "templateHash": "2786599112922814163" } }, "parameters": { @@ -713,11 +713,11 @@ "outputs": { "logicAppName": { "type": "string", - "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-logicapp-deployment', take(parameters('BaseName'), 42))), '2022-09-01').outputs.name.value]" + "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-logicapp-deployment', take(parameters('BaseName'), 42))), '2025-04-01').outputs.name.value]" }, "openAIEndpoint": { "type": "string", - "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-openai-deployment', take(parameters('BaseName'), 44))), '2022-09-01').outputs.endpoint.value]" + "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-openai-deployment', take(parameters('BaseName'), 44))), '2025-04-01').outputs.endpoint.value]" } } } \ No newline at end of file diff --git a/samples/json-remediation-agent/Deployment/workflows.zip b/samples/json-remediation-agent/Deployment/workflows.zip index aa40c56077ea10fdc8a474ba41e3bb8313b34aa0..2520ba2832570f27082a59292c7fc5d0faabf4dd 100644 GIT binary patch delta 2232 zcmZA3XE+;-76)*9?@FYtT_dHnYsM(?8bL)vtdttprnbJkjgSgr)UFyeYcy7^G)lEq zMFmx(s9CjxwziUcpXRwA?)`Lr&;NWlAO8oVf>GhIhA}b;($Uee(WTrobI#y-#`I?r z3;xV3Bt4dfdHOOM9x^=rgJv+J96k3Q#?0A}7)`2WrK2m#a$!YYcK{+&}+Z9cr$lVeOJd2qi@ z2Dy%ZpNqtPU(8gg1$)_v74OT^ZKjW+?wS(x?By#Zr}TATU15fA6VoMB#wA?bF(P?5 zuZ)FTV@49g^)>Qn;xcUf<&s|bXVg!^q%L)A`+;xd@bH9li~~zdr#|r)etC=6PF}Z= zcvAiq&*++(57YJV4aUFj1&_M{aT5Fm5dPRob$;Jc93+L`gMVh`o`$VnXN)=0REeX2(TQicOBlXF^x~!cu+AdHY4HLQY{|~ zD9i3KA%E{8GI_QowLz5P22v5A+$m|9RSW4$j?@KZK8ykAk$rHlktl38QF7PMf}vL3 zpruy?jnnd17qj&G2Uis7Y8ppZulWP0hUXH2mS`STi%Y%9#PjJM`9!D&+bhlnTGr>)fTi~@2Mg`vTSb>$YcX}0L`XC-ojLMQl z*)yJ`BL;?~_D@UmU&&RGq23EYJ+_a8zijEC{WTw_y2ec5PNfz^Tb{)q&k}eKn>!Zo zsTCBRDS=#46~u(qe+Mfa&v>)MukZOnNLxAt?n6;?#?}KsYhVbgL)nsQMH&%e6TsxW&5UBFO7B+Q?{a|)^C#wMc zRJP3>kk6$RZCE-IZ)&a3vYH!*6VDlOrWDs*H_SH_W8NE>3CiH7G<;p>+{o9x53ijm zizTknbYPm&n?6~ zp-Swv9Rt4cZ*F zui40t$#H2p+2{k=KZlnV0+y#WeVf5TSHG%nGk}Q`CBRg0R z)(skfjdG;PHQUeff)}^qexNhKA>FS{ND001Dr1xcq4ExL|Ky zcV3AdQ3Jcg=Y9D`=Fqb12~rpyY>fJ(u8Irf4HGJ^IoSOvnXwt|!d^ydMXj+*-&JV!@8GXh&*)nGr5jv=JuOty1mhTeui)wNkH zGOA-S;+sA%0yQ?@)oG@PLbDuo+Z5TKPgef!<}xYPL$yO};O!8(_3B%fCP#aixtDTe zIHuyH&$z=<`haYow|DFw|LfvN!{Z@YGF5pQ^sKsRnIYoLPDF6bb5Jj2PMEy63-1Y$ z#CWLA40Qyd*&OTQ^crFtN0rX6E9F8h2NLmA4ng^kzjfm6wJVGNdeH;BU1s+rE0BG( zqr3Uqoc4NZ*;R9@gvH0WYPG-%PpxIf^#G%sPZK%}5AmWySq5{9w#jbT``So1IW z(n+BHgR*hibh0}HWUfzPkG$DZvfq_tgi}k<7s|Z($gx-UT^!>DqLf{1wu7c| z*=RushmvB{^i_kAjKkV!zg*{Ox5YtHUg?Y@(@cI$d!f)er>D#;8X@<0zfJ}M`aYyj zm;7Rq0xVSv021)Cl)y8;oVxjs43gsp8wgnolx+1~{a4ElgnKJ*4jZ#_Vds5T{egA* zI}OgmI;gYeXkUv~6~)l0_B}x3(K$%K5SX=4B9@X)y`dqz;X4j@)uNX-xmj6AYIwMq z6)A8`xO!?zHP_s>@ce3l+C1x^oJLZa{`U!JHsJDNq;>prUJy-L9|XSB`oHl)9&HB` zWT2--aDX!nO#lQ9>_A%@-2RIWAe@%)37P-j*We{&L|fGhnbL3~WI}^6NSlUukSYx% HkjcLR|AZ!r delta 2232 zcmZA3S2!CC7YA@5_EsbKtfEp{B=jfq$|t z>rbZI0HUav0pw8;O`G!vBru&UfZh8g&R!{b9{Z7zh9)P~5h#yV=Q(frd>)J0q#1j* zq3PSuyqEDMXtE^Yg-gdb{#dXg$P+@6OOZ9D955Vj(O>Nz&f0KQ7|EkZh~eYf=bCg? z40W5)jL5LMf&|%~H$$;9XUv~Z8Xwz$cuF{j&5B`%@LPC=>}17xmpF@{u3xsu&ZRk1 zsUyjQ+g+)0zgf`o$A}>Ldid1i44u^=xL#GG*!a{ys+vGfI>2#@WAh)#_0y~&GftVZ zb8yH!jjhWvg7b~tV-pfkF)N-j1!lT6;o z7ePwbOFe`l4c@ysxP(cu@-1kq=#{U$?k;Qj2>v*Xmx@(Iy;l(&Q^W3fm z%#~xa1+Ur$xhCD$3?iaQ1?|H0%X(?nAdI{!qho}`YjD`8GrSVF@CtBwx>`|=_>Gf#FKSr_YqQ-7HPX)z_74Nmzfu$s2~J0#{WKxKo;Z~k znOaiwmzbocjpNag+BwtTaxtwuHu?cb(iXa64ylgafr@S7;~GaYIhJclx|4mrvF$&+ zgLlu6Pp&uAg^X^;k{2EG1=$J*zV58#ZB?jGhJo+vi*dO|$=^o^O!7JDwq<_g)0xGy z>PToY&7}a9dLl^d+E0t4;P`uzVWp4 zd5jPa+U?uiLS07FMIEv!!CqqP%ro*up-W@mW2QREOGnO%Vvg_=e+`jdRDOJRv!C$* z`3UvciMDvFLc4zcp)JCgmg`C;`loo~h`gxd&2qox=iN=5GfPeSqM<}&^JUqfgb_fZ zrPeO}z4m;_t{J3AbHu$%^Y$k?218l>D=s6@eOFf0-kPUOtiH9B);m(A(IbdU5w;O5 z?Hb0Y<#FnN-r+(>`QWrg_ptHUA+7vqt|dYD%5iyJELq3!#{J+jN!RC<=<1yC7&FV| zk!Oy8bG8kuZKmivhK1j~`I37~7D5eD1U0wjCowDB(H0*|ht>|ijZgWF7hPzgGTK_9 zId-|jPF-X8lS-I4kztp8$g}i1P~K8J@DcvEXRn6{9tkgI^?;eDeFeh34SrQkOp)Lw z;nh*rbIr!(nZCJQNZ~}ZfKkd{9J>7)R%^tdTN&(wL#FBpgu)5LL|1qWign#$H<*R! zL+689?XLVZRQby`vQr2ivw;q7EJ_**AhO*MDY>xzT8S79AfBh5yR&+s7J6UZo2|U8 zt2Mkwn!?)j)bhVQ_VIb%-gc1SudS&5uzg~zDe~|j_S0-qTCy0L_d(+##sf6KF5yU0 zxbqoQbB)hQlw0)78;>k8*N-KYaB%)now)nYV`32NHE%&C`O z!eRfMh~c&Dvwd%ktiC59cB%bC1}T51afD}^*VlN(pBFm(Z!q_iZYsw8<5X)CY*A>&2K!;tM#*Bor3g|T-_-hY=9C#oi*nG>WfQv)8MZwAuB1Z9@gH3)I0k^~l06u~}-o^mhaEczEbZ??`*lsZg21y_~|p7i9h9#`F@`yAGOqvsY)j*ixFzTs)}|_aoClKx@1FPP%LaF3`Tf3 z{q|WVap%IPlgxA?Ch?Nt2b(71f}jS*2<%BOofk&J z(5B?)G<(?2Y+9g5Xk`Nl)m?gx{~IwvxS<$YQQBSmH7rHf67}wZV=NBuvJ@t%8^BF+ALb8N`lM?gc3Hj)#HL$&Pz2X^>k~*(~C`w|1ANe8*J`$)E{5M38E^slV=I&7L#C~T5&1k z4@l;`v;b-)u;g=~qLR;w3TA$5DxCj|Mt)1`giFBe|5}5)fFX5NCIF-2M8Jd!C`gNX M^*Km|iUyF$znhaSEC2ui diff --git a/samples/json-remediation-agent/LogicApps/JsonRemediationAgent/workflow.json b/samples/json-remediation-agent/LogicApps/JsonRemediationAgent/workflow.json index b8c41f0..25a6552 100644 --- a/samples/json-remediation-agent/LogicApps/JsonRemediationAgent/workflow.json +++ b/samples/json-remediation-agent/LogicApps/JsonRemediationAgent/workflow.json @@ -14,7 +14,7 @@ "type": "Agent", "inputs": { "parameters": { - "deploymentId": "gpt-4o-mini", + "deploymentId": "gpt-5-mini", "messages": [ { "role": "system", @@ -28,9 +28,9 @@ "agentModelType": "AzureOpenAI", "agentModelSettings": { "deploymentModelProperties": { - "name": "gpt-4o-mini", + "name": "gpt-5-mini", "format": "OpenAI", - "version": "2024-07-18" + "version": "2025-08-07" } } }, diff --git a/samples/json-remediation-agent/README.md b/samples/json-remediation-agent/README.md index 07f24d0..92ec168 100644 --- a/samples/json-remediation-agent/README.md +++ b/samples/json-remediation-agent/README.md @@ -10,11 +10,11 @@ An autonomous operations agent that repairs malformed JSON records, applies dete **Prerequisites:** - Azure subscription with contributor access -- Region supporting Azure OpenAI (gpt-4o-mini) and Logic Apps Standard - see [region selection](#region-selection) +- Region supporting Azure OpenAI (gpt-5-mini) and Logic Apps Standard - see [region selection](#region-selection) **Deploy to your Azure subscription:** -[![Deploy to Azure](https://aka.ms/deploytoazurebutton)](https://portal.azure.com/#create/Microsoft.Template/uri/https%3A%2F%2Fraw.githubusercontent.com%2Fmodularity%2Flogicapps-labs%2Fjson-remediation-agent%2Fsamples%2Fjson-remediation-agent%2FDeployment%2Fsample-arm.json) +[![Deploy to Azure](https://aka.ms/deploytoazurebutton)](https://portal.azure.com/#create/Microsoft.Template/uri/https%3A%2F%2Fraw.githubusercontent.com%2FAzure%2Flogicapps-labs%2Fmain%2Fsamples%2Fjson-remediation-agent%2FDeployment%2Fsample-arm.json)
What happens when you deploy @@ -32,7 +32,7 @@ An autonomous operations agent that repairs malformed JSON records, applies dete | Resource | Purpose | |----------|---------| | Logic App Standard | Hosts autonomous agent workflows | -| Azure OpenAI | gpt-4o-mini model for agent reasoning | +| Azure OpenAI | gpt-5-mini model for agent reasoning | | Storage Account | Workflow state and run history | | App Service Plan | Compute resources | | Managed Identity | Passwordless authentication | diff --git a/samples/product-return-agent-sample/Deployment/main.bicep b/samples/product-return-agent-sample/Deployment/main.bicep index d489101..eb56f0b 100644 --- a/samples/product-return-agent-sample/Deployment/main.bicep +++ b/samples/product-return-agent-sample/Deployment/main.bicep @@ -1,8 +1,8 @@ // Auto-generated from shared/templates/main.bicep.template // To customize: edit this file directly or delete to regenerate from template // -// AI Product Return Agent - Azure Infrastructure as Code -// Deploys Logic Apps Standard with Azure OpenAI for autonomous product return decisions +// Logic Apps Agent Sample - Azure Infrastructure as Code +// Deploys Logic Apps Standard with Azure OpenAI for autonomous agent workflows // Uses managed identity exclusively (no secrets/connection strings) targetScope = 'resourceGroup' @@ -15,8 +15,8 @@ param BaseName string // uniqueSuffix for when we need unique values var uniqueSuffix = uniqueString(resourceGroup().id) -// URL to workflows.zip (replaced by BundleAssets.ps1 with https://raw.githubusercontent.com/modularity/logicapps-labs/product-return-sample/samples/product-return-agent-sample/Deployment/workflows.zip) -var workflowsZipUrl = 'https://raw.githubusercontent.com/modularity/logicapps-labs/product-return-sample/samples/product-return-agent-sample/Deployment/workflows.zip' +// URL to workflows.zip (replaced by BundleAssets.ps1 with https://raw.githubusercontent.com/Azure/logicapps-labs/main/samples/product-return-agent-sample/Deployment/workflows.zip) +var workflowsZipUrl = 'https://raw.githubusercontent.com/Azure/logicapps-labs/main/samples/product-return-agent-sample/Deployment/workflows.zip' // User-Assigned Managed Identity for Logic App → Storage authentication resource userAssignedIdentity 'Microsoft.ManagedIdentity/userAssignedIdentities@2023-01-31' = { @@ -33,7 +33,7 @@ module storage '../../shared/modules/storage.bicep' = { } } -// Azure OpenAI with gpt-4o-mini model +// Azure OpenAI with gpt-5-mini model module openai '../../shared/modules/openai.bicep' = { name: '${take(BaseName, 44)}-openai-deployment' params: { diff --git a/samples/product-return-agent-sample/Deployment/sample-arm.json b/samples/product-return-agent-sample/Deployment/sample-arm.json index 66e9756..8e46af9 100644 --- a/samples/product-return-agent-sample/Deployment/sample-arm.json +++ b/samples/product-return-agent-sample/Deployment/sample-arm.json @@ -4,8 +4,8 @@ "metadata": { "_generator": { "name": "bicep", - "version": "0.34.44.8038", - "templateHash": "7356318468140071735" + "version": "0.39.26.7824", + "templateHash": "201964466856650430" } }, "parameters": { @@ -20,7 +20,7 @@ }, "variables": { "uniqueSuffix": "[uniqueString(resourceGroup().id)]", - "workflowsZipUrl": "https://raw.githubusercontent.com/modularity/logicapps-labs/product-return-sample/samples/product-return-agent-sample/Deployment/workflows.zip" + "workflowsZipUrl": "https://raw.githubusercontent.com/Azure/logicapps-labs/main/samples/product-return-agent-sample/Deployment/workflows.zip" }, "resources": [ { @@ -31,7 +31,7 @@ }, { "type": "Microsoft.Resources/deployments", - "apiVersion": "2022-09-01", + "apiVersion": "2025-04-01", "name": "[format('{0}-storage-deployment', take(parameters('BaseName'), 43))]", "properties": { "expressionEvaluationOptions": { @@ -52,8 +52,8 @@ "metadata": { "_generator": { "name": "bicep", - "version": "0.34.44.8038", - "templateHash": "6666359930464991611" + "version": "0.39.26.7824", + "templateHash": "11906848055003519521" } }, "parameters": { @@ -115,7 +115,7 @@ }, { "type": "Microsoft.Resources/deployments", - "apiVersion": "2022-09-01", + "apiVersion": "2025-04-01", "name": "[format('{0}-openai-deployment', take(parameters('BaseName'), 44))]", "properties": { "expressionEvaluationOptions": { @@ -136,8 +136,8 @@ "metadata": { "_generator": { "name": "bicep", - "version": "0.34.44.8038", - "templateHash": "5370603553016721570" + "version": "0.39.26.7824", + "templateHash": "6448475993981052673" } }, "parameters": { @@ -172,7 +172,7 @@ { "type": "Microsoft.CognitiveServices/accounts/deployments", "apiVersion": "2024-10-01", - "name": "[format('{0}/{1}', parameters('openAIName'), 'gpt-4o-mini')]", + "name": "[format('{0}/{1}', parameters('openAIName'), 'gpt-5-mini')]", "sku": { "name": "GlobalStandard", "capacity": 50 @@ -180,8 +180,8 @@ "properties": { "model": { "format": "OpenAI", - "name": "gpt-4o-mini", - "version": "2024-07-18" + "name": "gpt-5-mini", + "version": "2025-08-07" } }, "dependsOn": [ @@ -208,7 +208,7 @@ }, { "type": "Microsoft.Resources/deployments", - "apiVersion": "2022-09-01", + "apiVersion": "2025-04-01", "name": "[format('{0}-logicapp-deployment', take(parameters('BaseName'), 42))]", "properties": { "expressionEvaluationOptions": { @@ -223,13 +223,13 @@ "value": "[resourceGroup().location]" }, "storageAccountName": { - "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-storage-deployment', take(parameters('BaseName'), 43))), '2022-09-01').outputs.storageAccountName.value]" + "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-storage-deployment', take(parameters('BaseName'), 43))), '2025-04-01').outputs.storageAccountName.value]" }, "openAIEndpoint": { - "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-openai-deployment', take(parameters('BaseName'), 44))), '2022-09-01').outputs.endpoint.value]" + "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-openai-deployment', take(parameters('BaseName'), 44))), '2025-04-01').outputs.endpoint.value]" }, "openAIResourceId": { - "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-openai-deployment', take(parameters('BaseName'), 44))), '2022-09-01').outputs.resourceId.value]" + "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-openai-deployment', take(parameters('BaseName'), 44))), '2025-04-01').outputs.resourceId.value]" }, "managedIdentityId": { "value": "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', format('{0}-managedidentity', take(parameters('BaseName'), 60)))]" @@ -241,8 +241,8 @@ "metadata": { "_generator": { "name": "bicep", - "version": "0.34.44.8038", - "templateHash": "2259432651138452624" + "version": "0.39.26.7824", + "templateHash": "3032492753694364828" } }, "parameters": { @@ -413,7 +413,7 @@ }, { "type": "Microsoft.Resources/deployments", - "apiVersion": "2022-09-01", + "apiVersion": "2025-04-01", "name": "[format('{0}-storage-rbac-deployment', take(parameters('BaseName'), 38))]", "properties": { "expressionEvaluationOptions": { @@ -422,7 +422,7 @@ "mode": "Incremental", "parameters": { "storageAccountName": { - "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-storage-deployment', take(parameters('BaseName'), 43))), '2022-09-01').outputs.storageAccountName.value]" + "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-storage-deployment', take(parameters('BaseName'), 43))), '2025-04-01').outputs.storageAccountName.value]" }, "logicAppPrincipalId": { "value": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', format('{0}-managedidentity', take(parameters('BaseName'), 60))), '2023-01-31').principalId]" @@ -434,8 +434,8 @@ "metadata": { "_generator": { "name": "bicep", - "version": "0.34.44.8038", - "templateHash": "13372547588259048703" + "version": "0.39.26.7824", + "templateHash": "8000893445802246432" } }, "parameters": { @@ -497,7 +497,7 @@ }, { "type": "Microsoft.Resources/deployments", - "apiVersion": "2022-09-01", + "apiVersion": "2025-04-01", "name": "[format('{0}-openai-rbac-deployment', take(parameters('BaseName'), 39))]", "properties": { "expressionEvaluationOptions": { @@ -506,10 +506,10 @@ "mode": "Incremental", "parameters": { "openAIName": { - "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-openai-deployment', take(parameters('BaseName'), 44))), '2022-09-01').outputs.name.value]" + "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-openai-deployment', take(parameters('BaseName'), 44))), '2025-04-01').outputs.name.value]" }, "logicAppPrincipalId": { - "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-logicapp-deployment', take(parameters('BaseName'), 42))), '2022-09-01').outputs.systemAssignedPrincipalId.value]" + "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-logicapp-deployment', take(parameters('BaseName'), 42))), '2025-04-01').outputs.systemAssignedPrincipalId.value]" } }, "template": { @@ -518,8 +518,8 @@ "metadata": { "_generator": { "name": "bicep", - "version": "0.34.44.8038", - "templateHash": "3822718305786172483" + "version": "0.39.26.7824", + "templateHash": "6926659019016520420" } }, "parameters": { @@ -567,7 +567,7 @@ }, { "type": "Microsoft.Resources/deployments", - "apiVersion": "2022-09-01", + "apiVersion": "2025-04-01", "name": "[format('{0}-workflow-deployment', take(parameters('BaseName'), 42))]", "properties": { "expressionEvaluationOptions": { @@ -588,7 +588,7 @@ "value": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', format('{0}-managedidentity', take(parameters('BaseName'), 60))), '2023-01-31').principalId]" }, "logicAppName": { - "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-logicapp-deployment', take(parameters('BaseName'), 42))), '2022-09-01').outputs.name.value]" + "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-logicapp-deployment', take(parameters('BaseName'), 42))), '2025-04-01').outputs.name.value]" }, "resourceGroupName": { "value": "[resourceGroup().name]" @@ -603,8 +603,8 @@ "metadata": { "_generator": { "name": "bicep", - "version": "0.34.44.8038", - "templateHash": "6479226689635161201" + "version": "0.39.26.7824", + "templateHash": "2786599112922814163" } }, "parameters": { @@ -713,11 +713,11 @@ "outputs": { "logicAppName": { "type": "string", - "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-logicapp-deployment', take(parameters('BaseName'), 42))), '2022-09-01').outputs.name.value]" + "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-logicapp-deployment', take(parameters('BaseName'), 42))), '2025-04-01').outputs.name.value]" }, "openAIEndpoint": { "type": "string", - "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-openai-deployment', take(parameters('BaseName'), 44))), '2022-09-01').outputs.endpoint.value]" + "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-openai-deployment', take(parameters('BaseName'), 44))), '2025-04-01').outputs.endpoint.value]" } } } \ No newline at end of file diff --git a/samples/product-return-agent-sample/Deployment/workflows.zip b/samples/product-return-agent-sample/Deployment/workflows.zip index 86b4fa14ccc412768c5402a67cb2b6c0b46236ee..bafffcd40d18cd5c11eb3bf9be062ff21687f1ac 100644 GIT binary patch delta 4318 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 What happens when you deploy @@ -32,7 +32,7 @@ An AI-powered product return system that automates the evaluation of return requ | Resource | Purpose | |----------|----------| | Logic App Standard | Hosts AI agent workflows | -| Azure OpenAI | GPT-4o-mini model for agent reasoning | +| Azure OpenAI | GPT-5-mini model for agent reasoning | | Storage Account | Workflow state and run history | | App Service Plan | Compute resources | | Managed Identity | Passwordless authentication | diff --git a/samples/shared/README.md b/samples/shared/README.md index 45d1576..e9001e6 100644 --- a/samples/shared/README.md +++ b/samples/shared/README.md @@ -54,7 +54,7 @@ Six reusable modules provide complete Logic Apps infrastructure: | Module | Purpose | |--------|---------| | **storage.bicep** | Storage Account for Logic App runtime (managed identity only, HTTPS/TLS 1.2, no shared keys) | -| **openai.bicep** | Azure OpenAI S0 with gpt-4o-mini model (GlobalStandard, 150K tokens) | +| **openai.bicep** | Azure OpenAI S0 with gpt-5-mini model (GlobalStandard, 150K tokens) | | **logicapp.bicep** | Logic App Standard with App Service Plan (WS1 SKU, system + user-assigned identities) | | **storage-rbac.bicep** | Storage Blob/Queue/Table Data Contributor roles for Logic App | | **openai-rbac.bicep** | Cognitive Services OpenAI User role for Logic App | @@ -65,7 +65,11 @@ Six reusable modules provide complete Logic Apps infrastructure: Generates all deployment artifacts for a sample: ```powershell +# Basic usage .\samples\shared\scripts\BundleAssets.ps1 -Sample "your-sample-name" + +# Force regeneration of main.bicep (overwrites existing file) +.\samples\shared\scripts\BundleAssets.ps1 -Sample "your-sample-name" -Force ``` **Generates:** @@ -73,9 +77,13 @@ Generates all deployment artifacts for a sample: 2. `sample-arm.json` - Compiled ARM template 3. `workflows.zip` - Bundled LogicApps folder +**Parameters:** +- `-Sample` (required) - Name of the sample folder +- `-Force` (optional) - Regenerates main.bicep even if it exists (useful for updating URLs) + **How it works:** - Uses hardcoded `Azure/logicapps-labs` main branch for upstream URLs -- Never overwrites existing `main.bicep` (delete to regenerate) +- Preserves existing `main.bicep` unless `-Force` is specified - Replaces `{{WORKFLOWS_ZIP_URL}}` template placeholder with upstream URL - Requires Bicep CLI and PowerShell 5.1+ diff --git a/samples/shared/modules/openai.bicep b/samples/shared/modules/openai.bicep index e501a93..196a030 100644 --- a/samples/shared/modules/openai.bicep +++ b/samples/shared/modules/openai.bicep @@ -21,7 +21,7 @@ resource openAI 'Microsoft.CognitiveServices/accounts@2024-10-01' = { resource deployment 'Microsoft.CognitiveServices/accounts/deployments@2024-10-01' = { parent: openAI - name: 'gpt-4o-mini' + name: 'gpt-5-mini' sku: { name: 'GlobalStandard' capacity: 50 @@ -29,8 +29,8 @@ resource deployment 'Microsoft.CognitiveServices/accounts/deployments@2024-10-01 properties: { model: { format: 'OpenAI' - name: 'gpt-4o-mini' - version: '2024-07-18' + name: 'gpt-5-mini' + version: '2025-08-07' } } } diff --git a/samples/shared/scripts/BundleAssets.ps1 b/samples/shared/scripts/BundleAssets.ps1 index b39c290..be159cf 100644 --- a/samples/shared/scripts/BundleAssets.ps1 +++ b/samples/shared/scripts/BundleAssets.ps1 @@ -20,6 +20,10 @@ Required. Name of the sample folder (e.g., "product-return-agent-sample"). All paths are built from this parameter. +.PARAMETER Force + Optional. Forces regeneration of main.bicep even if it already exists. + Use this to update the workflowsZipUrl or reset to template defaults. + .EXAMPLE # From anywhere in the repository: .\samples\shared\scripts\BundleAssets.ps1 -Sample "product-return-agent-sample" @@ -28,6 +32,10 @@ # From samples folder: .\shared\scripts\BundleAssets.ps1 -Sample "ai-loan-agent-sample" +.EXAMPLE + # Force regeneration of main.bicep: + .\samples\shared\scripts\BundleAssets.ps1 -Sample "product-return-agent-sample" -Force + .NOTES Requirements: - Bicep CLI must be installed @@ -45,7 +53,10 @@ [CmdletBinding()] param( [Parameter(Mandatory = $true)] - [string]$Sample + [string]$Sample, + + [Parameter(Mandatory = $false)] + [switch]$Force ) $ErrorActionPreference = "Stop" @@ -147,8 +158,12 @@ if (-not (Test-Path $deploymentFolder)) { # TEMPLATE GENERATION: Create main.bicep if it doesn't exist # ============================================================================ -if (-not (Test-Path $bicepPath)) { - Write-Host "`nGenerating main.bicep from template..." -ForegroundColor Cyan +if (-not (Test-Path $bicepPath) -or $Force) { + if ($Force -and (Test-Path $bicepPath)) { + Write-Host "`nRegenerating main.bicep (forced overwrite)..." -ForegroundColor Cyan + } else { + Write-Host "`nGenerating main.bicep from template..." -ForegroundColor Cyan + } # Use hardcoded upstream repo for URL generation $workflowsUrl = "https://raw.githubusercontent.com/$upstreamRepo/$upstreamBranch/samples/$Sample/Deployment/workflows.zip" @@ -165,7 +180,11 @@ if (-not (Test-Path $bicepPath)) { try { New-MainBicepFromTemplate -TemplatePath $templatePath -OutputPath $bicepPath -WorkflowsZipUrl $workflowsUrl - Write-Host " ✓ Created: main.bicep" -ForegroundColor Green + if ($Force) { + Write-Host " ✓ Regenerated: main.bicep" -ForegroundColor Green + } else { + Write-Host " ✓ Created: main.bicep" -ForegroundColor Green + } Write-Host " Location: $bicepPath" -ForegroundColor Gray } catch { Write-Host "✗ Failed to generate main.bicep: $($_.Exception.Message)" -ForegroundColor Red @@ -173,6 +192,7 @@ if (-not (Test-Path $bicepPath)) { } } else { Write-Host "`nUsing existing main.bicep (not overwriting)" -ForegroundColor Cyan + Write-Host " Tip: Use -Force to regenerate" -ForegroundColor Gray Write-Host " Location: $bicepPath" -ForegroundColor Gray } diff --git a/samples/shared/templates/main.bicep.template b/samples/shared/templates/main.bicep.template index 73ef27a..2cd7e77 100644 --- a/samples/shared/templates/main.bicep.template +++ b/samples/shared/templates/main.bicep.template @@ -33,7 +33,7 @@ module storage '../../shared/modules/storage.bicep' = { } } -// Azure OpenAI with gpt-4o-mini model +// Azure OpenAI with gpt-5-mini model module openai '../../shared/modules/openai.bicep' = { name: '${take(BaseName, 44)}-openai-deployment' params: { diff --git a/samples/transaction-repair-agent/Deployment/main.bicep b/samples/transaction-repair-agent/Deployment/main.bicep index cab0011..65b91dd 100644 --- a/samples/transaction-repair-agent/Deployment/main.bicep +++ b/samples/transaction-repair-agent/Deployment/main.bicep @@ -1,8 +1,8 @@ // Auto-generated from shared/templates/main.bicep.template // To customize: edit this file directly or delete to regenerate from template // -// Transaction Repair Agent - Azure Infrastructure as Code -// Deploys Logic Apps Standard with Azure OpenAI for conversational operations agent +// Logic Apps Agent Sample - Azure Infrastructure as Code +// Deploys Logic Apps Standard with Azure OpenAI for autonomous agent workflows // Uses managed identity exclusively (no secrets/connection strings) targetScope = 'resourceGroup' @@ -15,8 +15,8 @@ param BaseName string // uniqueSuffix for when we need unique values var uniqueSuffix = uniqueString(resourceGroup().id) -// URL to workflows.zip (replaced by BundleAssets.ps1 with actual GitHub URL) -var workflowsZipUrl = 'https://raw.githubusercontent.com/modularity/logicapps-labs/transaction-repair-agent/samples/transaction-repair-agent/Deployment/workflows.zip' +// URL to workflows.zip (replaced by BundleAssets.ps1 with https://raw.githubusercontent.com/Azure/logicapps-labs/main/samples/transaction-repair-agent/Deployment/workflows.zip) +var workflowsZipUrl = 'https://raw.githubusercontent.com/Azure/logicapps-labs/main/samples/transaction-repair-agent/Deployment/workflows.zip' // User-Assigned Managed Identity for Logic App → Storage authentication resource userAssignedIdentity 'Microsoft.ManagedIdentity/userAssignedIdentities@2023-01-31' = { @@ -33,7 +33,7 @@ module storage '../../shared/modules/storage.bicep' = { } } -// Azure OpenAI with gpt-4o-mini model +// Azure OpenAI with gpt-5-mini model module openai '../../shared/modules/openai.bicep' = { name: '${take(BaseName, 44)}-openai-deployment' params: { diff --git a/samples/transaction-repair-agent/Deployment/sample-arm.json b/samples/transaction-repair-agent/Deployment/sample-arm.json index c17d9e2..3aa4522 100644 --- a/samples/transaction-repair-agent/Deployment/sample-arm.json +++ b/samples/transaction-repair-agent/Deployment/sample-arm.json @@ -4,8 +4,8 @@ "metadata": { "_generator": { "name": "bicep", - "version": "0.34.44.8038", - "templateHash": "5815924213456264593" + "version": "0.39.26.7824", + "templateHash": "14173145213104767533" } }, "parameters": { @@ -20,7 +20,7 @@ }, "variables": { "uniqueSuffix": "[uniqueString(resourceGroup().id)]", - "workflowsZipUrl": "https://raw.githubusercontent.com/modularity/logicapps-labs/transaction-repair-agent/samples/transaction-repair-agent/Deployment/workflows.zip" + "workflowsZipUrl": "https://raw.githubusercontent.com/Azure/logicapps-labs/main/samples/transaction-repair-agent/Deployment/workflows.zip" }, "resources": [ { @@ -31,7 +31,7 @@ }, { "type": "Microsoft.Resources/deployments", - "apiVersion": "2022-09-01", + "apiVersion": "2025-04-01", "name": "[format('{0}-storage-deployment', take(parameters('BaseName'), 43))]", "properties": { "expressionEvaluationOptions": { @@ -52,8 +52,8 @@ "metadata": { "_generator": { "name": "bicep", - "version": "0.34.44.8038", - "templateHash": "6666359930464991611" + "version": "0.39.26.7824", + "templateHash": "11906848055003519521" } }, "parameters": { @@ -115,7 +115,7 @@ }, { "type": "Microsoft.Resources/deployments", - "apiVersion": "2022-09-01", + "apiVersion": "2025-04-01", "name": "[format('{0}-openai-deployment', take(parameters('BaseName'), 44))]", "properties": { "expressionEvaluationOptions": { @@ -136,8 +136,8 @@ "metadata": { "_generator": { "name": "bicep", - "version": "0.34.44.8038", - "templateHash": "5370603553016721570" + "version": "0.39.26.7824", + "templateHash": "6448475993981052673" } }, "parameters": { @@ -172,7 +172,7 @@ { "type": "Microsoft.CognitiveServices/accounts/deployments", "apiVersion": "2024-10-01", - "name": "[format('{0}/{1}', parameters('openAIName'), 'gpt-4o-mini')]", + "name": "[format('{0}/{1}', parameters('openAIName'), 'gpt-5-mini')]", "sku": { "name": "GlobalStandard", "capacity": 50 @@ -180,8 +180,8 @@ "properties": { "model": { "format": "OpenAI", - "name": "gpt-4o-mini", - "version": "2024-07-18" + "name": "gpt-5-mini", + "version": "2025-08-07" } }, "dependsOn": [ @@ -208,7 +208,7 @@ }, { "type": "Microsoft.Resources/deployments", - "apiVersion": "2022-09-01", + "apiVersion": "2025-04-01", "name": "[format('{0}-logicapp-deployment', take(parameters('BaseName'), 42))]", "properties": { "expressionEvaluationOptions": { @@ -223,13 +223,13 @@ "value": "[resourceGroup().location]" }, "storageAccountName": { - "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-storage-deployment', take(parameters('BaseName'), 43))), '2022-09-01').outputs.storageAccountName.value]" + "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-storage-deployment', take(parameters('BaseName'), 43))), '2025-04-01').outputs.storageAccountName.value]" }, "openAIEndpoint": { - "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-openai-deployment', take(parameters('BaseName'), 44))), '2022-09-01').outputs.endpoint.value]" + "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-openai-deployment', take(parameters('BaseName'), 44))), '2025-04-01').outputs.endpoint.value]" }, "openAIResourceId": { - "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-openai-deployment', take(parameters('BaseName'), 44))), '2022-09-01').outputs.resourceId.value]" + "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-openai-deployment', take(parameters('BaseName'), 44))), '2025-04-01').outputs.resourceId.value]" }, "managedIdentityId": { "value": "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', format('{0}-managedidentity', take(parameters('BaseName'), 60)))]" @@ -241,8 +241,8 @@ "metadata": { "_generator": { "name": "bicep", - "version": "0.34.44.8038", - "templateHash": "2259432651138452624" + "version": "0.39.26.7824", + "templateHash": "3032492753694364828" } }, "parameters": { @@ -413,7 +413,7 @@ }, { "type": "Microsoft.Resources/deployments", - "apiVersion": "2022-09-01", + "apiVersion": "2025-04-01", "name": "[format('{0}-storage-rbac-deployment', take(parameters('BaseName'), 38))]", "properties": { "expressionEvaluationOptions": { @@ -422,7 +422,7 @@ "mode": "Incremental", "parameters": { "storageAccountName": { - "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-storage-deployment', take(parameters('BaseName'), 43))), '2022-09-01').outputs.storageAccountName.value]" + "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-storage-deployment', take(parameters('BaseName'), 43))), '2025-04-01').outputs.storageAccountName.value]" }, "logicAppPrincipalId": { "value": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', format('{0}-managedidentity', take(parameters('BaseName'), 60))), '2023-01-31').principalId]" @@ -434,8 +434,8 @@ "metadata": { "_generator": { "name": "bicep", - "version": "0.34.44.8038", - "templateHash": "13372547588259048703" + "version": "0.39.26.7824", + "templateHash": "8000893445802246432" } }, "parameters": { @@ -497,7 +497,7 @@ }, { "type": "Microsoft.Resources/deployments", - "apiVersion": "2022-09-01", + "apiVersion": "2025-04-01", "name": "[format('{0}-openai-rbac-deployment', take(parameters('BaseName'), 39))]", "properties": { "expressionEvaluationOptions": { @@ -506,10 +506,10 @@ "mode": "Incremental", "parameters": { "openAIName": { - "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-openai-deployment', take(parameters('BaseName'), 44))), '2022-09-01').outputs.name.value]" + "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-openai-deployment', take(parameters('BaseName'), 44))), '2025-04-01').outputs.name.value]" }, "logicAppPrincipalId": { - "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-logicapp-deployment', take(parameters('BaseName'), 42))), '2022-09-01').outputs.systemAssignedPrincipalId.value]" + "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-logicapp-deployment', take(parameters('BaseName'), 42))), '2025-04-01').outputs.systemAssignedPrincipalId.value]" } }, "template": { @@ -518,8 +518,8 @@ "metadata": { "_generator": { "name": "bicep", - "version": "0.34.44.8038", - "templateHash": "3822718305786172483" + "version": "0.39.26.7824", + "templateHash": "6926659019016520420" } }, "parameters": { @@ -567,7 +567,7 @@ }, { "type": "Microsoft.Resources/deployments", - "apiVersion": "2022-09-01", + "apiVersion": "2025-04-01", "name": "[format('{0}-workflow-deployment', take(parameters('BaseName'), 42))]", "properties": { "expressionEvaluationOptions": { @@ -588,7 +588,7 @@ "value": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', format('{0}-managedidentity', take(parameters('BaseName'), 60))), '2023-01-31').principalId]" }, "logicAppName": { - "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-logicapp-deployment', take(parameters('BaseName'), 42))), '2022-09-01').outputs.name.value]" + "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-logicapp-deployment', take(parameters('BaseName'), 42))), '2025-04-01').outputs.name.value]" }, "resourceGroupName": { "value": "[resourceGroup().name]" @@ -603,8 +603,8 @@ "metadata": { "_generator": { "name": "bicep", - "version": "0.34.44.8038", - "templateHash": "6479226689635161201" + "version": "0.39.26.7824", + "templateHash": "2786599112922814163" } }, "parameters": { @@ -713,11 +713,11 @@ "outputs": { "logicAppName": { "type": "string", - "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-logicapp-deployment', take(parameters('BaseName'), 42))), '2022-09-01').outputs.name.value]" + "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-logicapp-deployment', take(parameters('BaseName'), 42))), '2025-04-01').outputs.name.value]" }, "openAIEndpoint": { "type": "string", - "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-openai-deployment', take(parameters('BaseName'), 44))), '2022-09-01').outputs.endpoint.value]" + "value": "[reference(resourceId('Microsoft.Resources/deployments', format('{0}-openai-deployment', take(parameters('BaseName'), 44))), '2025-04-01').outputs.endpoint.value]" } } } \ No newline at end of file diff --git a/samples/transaction-repair-agent/Deployment/workflows.zip b/samples/transaction-repair-agent/Deployment/workflows.zip index 4379654baa0945f6fd32c8304cbaf193b49e1776..9e3c3809e31ee23d8e7941e2f25e2b379ec4d7f8 100644 GIT binary patch delta 1780 zcmZA2c|6-`9tZFrl5tct!W0p0ojK}AQ)3iG93_>aj@qhYTBUInrPaD3R$QU938ih& z6jO2ERkV(-qpo!ygLb76t<*7Uk?A%wv+;V(Yxnu*c|V`$`}g<5H(fK8b9RsbDFOf> z1!RU3yz1my#Xx_eVNlHeKuQvl2hsp797y~-xVUKUxK!VP)@1Z0M46gg$HCmv;d(L1 z7Yf0v=yNHM4F-T%I#XVs?6hDE{dR9sh<(d!tZb}l{DLuGJi5^Iq}VM{&b>5)h$AeV z=TF{F44o1t)N`)UvnY8Sl+=!dcP#&IK<{Ygsc(W1NavxGtW3dbJsBWS?+=_*lW<^$T7bUE6(BltdSF(F5cV#NYf9i&UtpY4DnJ9z6OfJR~2S8=x_7#=gk zokpAbPnaWEFvZaeqqly*r)B)pt*}1Jd`Ov~we@#kwOn_E3G|Aqpj^3m&)+Rhb&U>9`$~ z&R{gSHqWKbEe-JhBVS@>)b_W&8jo|m+)w5xxwbyL-=GmG4j36HwFezCwu6k1hlx=0x%T`F-VdDZ#& zO&xA5OUsZIFXW=(wVtZ?bA?Abq1KTu?~~XdDGmld7Da1`LA`F0G_QV;NSgk<4V~a* zq?*_wKJ*8)ElrKvJy-Ov`+Jfe3_cf4wkis;g-m%3UDfJY8wh%%p^v-T&rP|W9M$;t z&1xvo$S9TW(K8U{-4d0T*WB^cC8EywO)ZwkH91w|>3SNc`Oxr0y`Q;V^YEdvAZg_0 zy%#Oui7XHLz=xFl=7eU*Htw@9G`@bhd*yq(aYGl^>nQM9R1SD=y0<@{@16P+dH&gHYcO3eUb1eHo32_y-ZQttBOtZxBMjTEXoWY?x755h^mwuHNVsHP*pJM? zDZV^Q7Bu|1!#1|_0_lCoSfv+vUD3_jg1v6G=y!qoxG286_*Px5`2P98a<1X--RBH@ zZ4}KL$qwF4Z?Nexxwkw9ILf6=Wbq7)ysxarv@p??`YTl zUdVd5;WGY$X&$0+FTs89WMbF*Ru*JOC374+19pV)c5=vCo;bY`cCCb)8cyu8aW`v@Azm3v8T zTAJ%U_eHSV%kO#oQq76{Xt3JvRp#=d`h2yTaCfZhaxEs&zP4>4v`|I2YLCKb==1Z9 zD8dvh>df%B_VU+mPdw{C>Cl+1*}_48pyYCjgl^=I8-ZA<&!NAW9lRMFp zqyROimHtoJG|b!y+1O6-m)pc+f*Y^2=lB2dC@M6jm30Xz6EHtXW+pHbZf~ZKZgwAr zvEtIpIO`6!$v4eP@7UQwkEbX%^Mik4tIrDEjM;q*avo&yBZ(!Ps&Q<0cE_+i(0I-r zZs=;jWVK|u^;fUr5DUUE`jpCY+p!ASD)v$!$F?#Kx)$PEHGAnaf!jliY6lhAiR&kU zN?|rnD@nfQ^4habIt|?=i@}H*AtS-7ZhLON<$ADC{C~TE9-zei?>?tHDX)uwSNVDX zxRnU0a7Pj5;O9g@suD$rR<#!4mFmGT2w@{ihzPt0_Ys8us|Oy!R`i8cgNu349n_AA zo;TFs#+J$eKnjbD(hrIZyW#90CawtlRbAi$+`{l5MMe+<0EIv9zYdPxsiyNC7XD}Q EJ68BFr~m)} delta 1781 zcmZA2dpy(o9|!R7X1R>Tq^!A>bIwGa?XYAWN<_@$o=dK|$HLDdKTg(Ms)g*>M$?f~ z49zW?ad&_UuftB*>6cxPGL*>knt^n<&j|7+#bcAEzLpEaMoJMi)x5ico-Q=%X5s7=63XW?GA!b^7L@bZFrp~;Ne#Z{iuu7Oyve?{YT{*wI!NE4+A;Tg z&9%$|#_7^1Hu+%q%`u-JX&LB~Dgmy)(-l>M`K~sz(3R1>d#aCLGJMPow|)eE_EQ#Q zpB=vnYxPyHM%N}ZxZ6FuBLie#SdlY%o&rW_K)>My83n<1mtgz~kE|EN_LLoD6P_x2 zC_04HBo1`3ZmfwFxv!Ea;Wd>?`a{{}uN{f&XHecP$>jF@1KAXPlMRwvw|9isEtCJD zbXU*BQpD;>!~!0kx(G$XM#q7OS=R9EqtyA-kb?k~gB##A^;+kt9~Y&Wnk>ViF{Oe$ zsX(2LqhgnMstxJSMk+(>4eMHQJ+Y@8x+SlVMy7qFPf6A25Ko&EcS9{qUwr7>r>VJ* z2~#2ys<}zb@@!?E-*>P|lPB=qc39Z2otdkPifi75o#Lzss~v3G&8r%2*+ILa8S-Ai zLfoociQ%+KI<4NqR#_Ms!daexLV`n`p?>jg0LmWYa!903)cq}Yfns*^>!8bt1BRU| zrTTaH@GFO}jiko4tr$o3*}fD9Wo3G7 zp)1}0MvP^VBkDecyV`Kho5lj>StU#jbY0S58M81s#L)NzRliFUZ7+N^iGs|L^-g|A zxou@u^qHC*5MI=LxMvNKqLysrcqHQLq0c*34f&GWRFCk04CUDcyI_jUm&{LptbU|ykfuMX%SFmBp>FpDUe?Z^T*#$p8F6mk=30pnK~zp z$6mClu;!C4kc@TTdLVIuri22rrGnsTZl$mDy0?e8?A?7tQ_U`?J?-COxIax>sxsBt z-)K@7Z4wrat_mZEJ6%nX9kb%NmXDFrI*f{c?uF`jiQrhOsByBd+yF+uhZkE+dj;A* zwtO$>WthGxpD=^(=Y2MZiK_2%)ckc1K^~&vT4rV`JELAK5g$CF%`UxA8lXWJV(e&vZHZDyJ8#svJY)>#`9F*O3TrEry-weg2O+bjK?UbS1WWP2Hv zD;Vj@6v8V>7~5p zvcu1f{>bwq9pfvpQlF{*7$S@$XOFwJOtf1aUSEw-R$vVIPuH*dn1289<6KIy+v`b@ z&d)58h3}mTOEf36*7!9DKXarZXQuT-exy`0VlZb`QW#!zAY;Lud|@MDT6Cs=8jO*O z(`K8k$Ks3k_m!?aU_*Lr5&9<(-1+Dr&R*VU4;<$?gDixJW+Q_?2^O6^W{h?UDjQ$n z>zBSiZyq&4AA&#J@50q%=lcz-Eb#|U<$Io5Y+OQl9;GHU-SxB>!{H^pS<4pNM!djz zVlXq`v4j&D_z(r>Iip%T%S2k*v7Z>JD8C6-EaM@}@iJ z=*f=fbdWeJ1OP What happens when you deploy @@ -32,7 +32,7 @@ A conversational AI agent that helps operations teams diagnose and repair failed | Resource | Purpose | |----------|----------| | Logic App Standard | Hosts conversational agent workflows | -| Azure OpenAI | gpt-4o-mini model for agent reasoning | +| Azure OpenAI | gpt-5-mini model for agent reasoning | | Storage Account | Workflow state and run history | | App Service Plan | Compute resources | | Managed Identity | Passwordless authentication |