diff --git a/.github/workflows/deploy-waf.yml b/.github/workflows/deploy-waf.yml index 108cb6888..187fa8e93 100644 --- a/.github/workflows/deploy-waf.yml +++ b/.github/workflows/deploy-waf.yml @@ -10,6 +10,10 @@ on: jobs: deploy: runs-on: ubuntu-latest + env: + GPT_MIN_CAPACITY: 1 + O4_MINI_MIN_CAPACITY: 1 + GPT41_MINI_MIN_CAPACITY: 1 steps: - name: Checkout Code uses: actions/checkout@v3 @@ -21,7 +25,9 @@ jobs: export AZURE_TENANT_ID=${{ secrets.AZURE_TENANT_ID }} export AZURE_CLIENT_SECRET=${{ secrets.AZURE_CLIENT_SECRET }} export AZURE_SUBSCRIPTION_ID="${{ secrets.AZURE_SUBSCRIPTION_ID }}" - export GPT_MIN_CAPACITY="150" + export GPT_MIN_CAPACITY="1" + export O4_MINI_MIN_CAPACITY="1" + export GPT41_MINI_MIN_CAPACITY="1" export AZURE_REGIONS="${{ vars.AZURE_REGIONS }}" chmod +x infra/scripts/checkquota.sh @@ -116,7 +122,9 @@ jobs: solutionName=${{ env.SOLUTION_PREFIX }} \ location="${{ env.AZURE_LOCATION }}" \ azureAiServiceLocation='${{ env.AZURE_LOCATION }}' \ - gptModelCapacity=5 \ + gptModelCapacity=${{ env.GPT_MIN_CAPACITY }} \ + gpt4_1ModelCapacity=${{ env.GPT41_MINI_MIN_CAPACITY }} \ + gptReasoningModelCapacity=${{ env.O4_MINI_MIN_CAPACITY }} \ enableTelemetry=true \ enableMonitoring=true \ enablePrivateNetworking=true \ diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 2ccc3a90e..479bc4a23 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -13,7 +13,9 @@ on: - cron: "0 11,23 * * *" # Runs at 11:00 AM and 11:00 PM GMT workflow_dispatch: #Allow manual triggering env: - GPT_MIN_CAPACITY: 1 + GPT_MIN_CAPACITY: 150 + O4_MINI_MIN_CAPACITY: 50 + GPT41_MINI_MIN_CAPACITY: 50 BRANCH_NAME: ${{ github.head_ref || github.ref_name }} jobs: @@ -36,7 +38,9 @@ jobs: export AZURE_TENANT_ID=${{ secrets.AZURE_TENANT_ID }} export AZURE_CLIENT_SECRET=${{ secrets.AZURE_CLIENT_SECRET }} export AZURE_SUBSCRIPTION_ID="${{ secrets.AZURE_SUBSCRIPTION_ID }}" - export GPT_MIN_CAPACITY="1" + export GPT_MIN_CAPACITY="150" + export O4_MINI_MIN_CAPACITY="50" + export GPT41_MINI_MIN_CAPACITY="50" export AZURE_REGIONS="${{ vars.AZURE_REGIONS }}" chmod +x infra/scripts/checkquota.sh @@ -122,7 +126,7 @@ jobs: elif [[ "${{ env.BRANCH_NAME }}" == "hotfix" ]]; then IMAGE_TAG="hotfix" else - IMAGE_TAG="latest" + IMAGE_TAG="latest_v3" fi # Generate current timestamp in desired format: YYYY-MM-DDTHH:MM:SS.SSSSSSSZ @@ -135,12 +139,12 @@ jobs: solutionName=${{ env.SOLUTION_PREFIX }} \ location="${{ env.AZURE_LOCATION }}" \ gptModelDeploymentType="GlobalStandard" \ - gptModelName="gpt-4o" \ - gptModelVersion="2024-08-06" \ + gptModelName="gpt-4.1-mini" \ + gptModelVersion="2025-04-14" \ backendContainerImageTag="${IMAGE_TAG}" \ frontendContainerImageTag="${IMAGE_TAG}" \ azureAiServiceLocation='${{ env.AZURE_LOCATION }}' \ - gptModelCapacity=1 \ + gptModelCapacity=50 \ createdBy="Pipeline" \ tags="{'SecurityControl':'Ignore','Purpose':'Deploying and Cleaning Up Resources for Validation','CreatedDate':'$current_date'}" \ --output json @@ -159,9 +163,10 @@ jobs: - name: Get Container App Backend URL id: get_backend_url run: | + # Get specifically the backend container app (not the MCP container app) CONTAINER_APP_NAME=$(az containerapp list \ --resource-group ${{ env.RESOURCE_GROUP_NAME }} \ - --query "[0].name" -o tsv) + --query "[?starts_with(name, 'ca-') && !contains(name, 'mcp')].name" -o tsv) MACAE_URL_API=$(az containerapp show \ --name "$CONTAINER_APP_NAME" \ @@ -171,6 +176,38 @@ jobs: echo "MACAE_URL_API=https://${MACAE_URL_API}" >> $GITHUB_OUTPUT echo "CONTAINER_APP=${CONTAINER_APP_NAME}" >> $GITHUB_OUTPUT + - name: Run Post deployment scripts + run: | + set -e + az account set --subscription "${{ secrets.AZURE_SUBSCRIPTION_ID }}" + + echo "Running post-deployment script..." + + # Extract required resource names from the deployment + STORAGE_ACCOUNT=$(az resource list --resource-group ${{ env.RESOURCE_GROUP_NAME }} --resource-type "Microsoft.Storage/storageAccounts" --query "[0].name" -o tsv) + AI_SEARCH=$(az resource list --resource-group ${{ env.RESOURCE_GROUP_NAME }} --resource-type "Microsoft.Search/searchServices" --query "[0].name" -o tsv) + + echo "Found Storage Account: $STORAGE_ACCOUNT" + echo "Found AI Search Service: $AI_SEARCH" + echo "Backend URL: ${{ steps.get_backend_url.outputs.MACAE_URL_API }}" + + # Run upload team config script with parameters + bash infra/scripts/upload_team_config.sh \ + "${{ steps.get_backend_url.outputs.MACAE_URL_API }}" \ + "data/agent_teams" \ + "${{ secrets.AZURE_SUBSCRIPTION_ID }}" + + # Run process sample data script with parameters + bash infra/scripts/process_sample_data.sh \ + "$STORAGE_ACCOUNT" \ + "sample-dataset" \ + "$AI_SEARCH" \ + "sample-dataset-index" \ + "${{ env.RESOURCE_GROUP_NAME }}" \ + "${{ secrets.AZURE_SUBSCRIPTION_ID }}" + + echo "=== Post-Deployment Script Completed Successfully ===" + - name: Set Deployment Status id: deployment_status if: always() @@ -181,9 +218,20 @@ jobs: echo "SUCCESS=false" >> $GITHUB_OUTPUT fi + e2e-test: + needs: deploy + if: needs.deploy.outputs.DEPLOYMENT_SUCCESS == 'true' + uses: ./.github/workflows/test-automation.yml + with: + MACAE_WEB_URL: ${{ needs.deploy.outputs.WEBAPP_URL }} + MACAE_URL_API: ${{ needs.deploy.outputs.MACAE_URL_API }} + MACAE_RG: ${{ needs.deploy.outputs.RESOURCE_GROUP_NAME }} + MACAE_CONTAINER_APP: ${{ needs.deploy.outputs.CONTAINER_APP }} + secrets: inherit + cleanup-deployment: if: always() && needs.deploy.outputs.RESOURCE_GROUP_NAME != '' - needs: [deploy] + needs: [deploy, e2e-test] runs-on: ubuntu-latest env: RESOURCE_GROUP_NAME: ${{ needs.deploy.outputs.RESOURCE_GROUP_NAME }} @@ -317,7 +365,7 @@ jobs: echo "Resource purging completed successfully" - name: Send Notification on Failure - if: failure() + run: | RUN_URL="https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" diff --git a/.github/workflows/test-automation.yml b/.github/workflows/test-automation.yml index edc99527e..6c4344739 100644 --- a/.github/workflows/test-automation.yml +++ b/.github/workflows/test-automation.yml @@ -31,7 +31,7 @@ jobs: MACAE_URL_API: ${{ inputs.MACAE_URL_API }} MACAE_RG: ${{ inputs.MACAE_RG }} MACAE_CONTAINER_APP: ${{ inputs.MACAE_CONTAINER_APP }} - accelerator_name: "MACAE" + accelerator_name: "MACAE v3" steps: - name: Checkout repository diff --git a/docs/DeploymentGuide.md b/docs/DeploymentGuide.md index 168d84922..66f81675a 100644 --- a/docs/DeploymentGuide.md +++ b/docs/DeploymentGuide.md @@ -286,7 +286,6 @@ Once you've opened the project in [Codespaces](#github-codespaces), [Dev Contain 10. If you are done trying out the application, you can delete the resources by running `azd down`. - ### ๐Ÿ› ๏ธ Troubleshooting If you encounter any issues during the deployment process, please refer [troubleshooting](../docs/TroubleShootingSteps.md) document for detailed steps and solutions. @@ -497,3 +496,7 @@ To debug the python server in the frontend directory (frontend_server.py) and re "jinja": true } ``` +## Next Steps +Now that you've completed your deployment, you can start using the solution. + +To help you get started, here are some [Sample Questions](./SampleQuestions.md) you can follow to try it out. diff --git a/docs/SampleQuestions.md b/docs/SampleQuestions.md new file mode 100644 index 000000000..89f0ed0c1 --- /dev/null +++ b/docs/SampleQuestions.md @@ -0,0 +1,77 @@ + +# Sample Workflow + +To help you get started, here are some **Sample Prompts** you can ask in the app: + +## **Teams** +Select the Team option from the top-left section, then click Continue after choosing the desired team. + +By default, three teams are available after running the post-deployment scripts: +- Retail +- HR +- Marketing + +![Application](images/samplequestion_1.png) + +### **Retail Scenario** +If you select the Retail team, follow the prompts below. + +>**Agents Used:** Customer, Order, Analysis Recommendation + +The Retail scenario enables users to explore and access information related to the Retail team and its associated data. Key activities include: + +_Sample operation:_ +- Task: From the Quick Tasks, select **"Satisfaction Plan"** and submit it. + > _Note: Average response time is 15โ€“20 seconds._
+ > _Observe: An analysis of Emily Thompsonโ€™s satisfaction with Contoso has been generated. It provides a proposed plan consisting of four or more steps._ + +- Task: Click **"Approve Task Plan"** Button + > _Note: Average response time is 01 minute 15 seconds._
+ > _Observe: It goes into "Thinking Process", "Processing your plan" and "coordinating with AI Agents"._
+ > _Review the output._ + +### **Product Marketing Scenario** +If you select the Marketing team, follow the prompts below. + +>**Agents Used:** Product, Marketing , Proxy + +The Product Marketing Scenario allows users to explore and retrieve information related to Marketing and specific product. Key tasks include: + +_Sample operation:_ +- Task: Switch to **"Product Marketing Team"** from the top left section and click **"Continue"** button. +- Task: From the Quick Tasks, select **"Draft a press release"** and submit it. + > _Note: Average response time is 15โ€“20 seconds._
+ > _Observe: It will trigger the "Generating Plan Action" and give the Proposed Plan with 4 or more Steps_ +- Task: Click on **"Approve Task Plan"** Button + > _Note: Average response time is around 01 minute._
+ > _Observe: It goes into "Thinking Process" and observe a spinner "Processing your plan and coordinating with AI Agents"._
+ > _Review the output._ + +### **HR Onboarding Scenario** +If you select the HR team, follow the prompts below. + +>**Agents Used:** HR Helper, Technical support , Proxy + +The HR Onboarding Scenario allows users to explore and retrieve information related to OnBoarding the Employee. Key tasks include: + +_Sample operation:_ + +- Task: Switch to the **"Human Resources Team"** from the top left section and click **"Continue"** +- Task: From the Quick Tasks, select **"Onboard New Employee"** and submit it. + + > _Note: Average response time is 15โ€“20 seconds._
+ > _Observe: If it asks for additional clarification (Human in the loop) Please provide this information irrespective of what specific information is asked. This will prevent agent for asking for multiple clarifications_ + + ```sh + department: hr, role: manager, start date: 11/23/2025, orientation date: 11/25/2025, location: onsite, email: js@contoso.com, mentor: Jim Shorts, benefits package: standard, ID Card: yes, salary: 70000, Laptop : Dell 14 Plus + ``` + > _Observe: It will trigger "Generating Plan Action" and "Proposed Plan" with 4 or more Steps_ +
+ +- Task: Click on **"Approve Task Plan"** Button. + > _Note: Average response time is around 01 minute 15 seconds._
+ > _Observe: It goes into "Thinking Process", "Processing your plan" and "coordinating with AI Agents"_
+ > _Review the output._ + + +This structured approach ensures that users receive automated, AI-coordinated task execution and intelligent responses from specialized agents. diff --git a/docs/images/samplequestion_1.png b/docs/images/samplequestion_1.png new file mode 100644 index 000000000..caf68d483 Binary files /dev/null and b/docs/images/samplequestion_1.png differ diff --git a/infra/scripts/checkquota.sh b/infra/scripts/checkquota.sh index 3a10f543c..6fcb64614 100644 --- a/infra/scripts/checkquota.sh +++ b/infra/scripts/checkquota.sh @@ -5,6 +5,8 @@ IFS=', ' read -ra REGIONS <<< "$AZURE_REGIONS" SUBSCRIPTION_ID="${AZURE_SUBSCRIPTION_ID}" GPT_MIN_CAPACITY="${GPT_MIN_CAPACITY}" +O4_MINI_MIN_CAPACITY="${O4_MINI_MIN_CAPACITY}" +GPT41_MINI_MIN_CAPACITY="${GPT41_MINI_MIN_CAPACITY}" AZURE_CLIENT_ID="${AZURE_CLIENT_ID}" AZURE_TENANT_ID="${AZURE_TENANT_ID}" AZURE_CLIENT_SECRET="${AZURE_CLIENT_SECRET}" @@ -17,8 +19,10 @@ if ! az login --service-principal -u "$AZURE_CLIENT_ID" -p "$AZURE_CLIENT_SECRET fi echo "๐Ÿ”„ Validating required environment variables..." -if [[ -z "$SUBSCRIPTION_ID" || -z "$GPT_MIN_CAPACITY" || -z "$REGIONS" ]]; then +if [[ -z "$SUBSCRIPTION_ID" || -z "$REGIONS" ]]; then echo "โŒ ERROR: Missing required environment variables." + echo "Required: AZURE_SUBSCRIPTION_ID, AZURE_REGIONS" + echo "Optional: O4_MINI_MIN_CAPACITY (default: 50), GPT41_MINI_MIN_CAPACITY (default: 50)" exit 1 fi @@ -31,7 +35,9 @@ echo "โœ… Azure subscription set successfully." # Define models and their minimum required capacities declare -A MIN_CAPACITY=( - ["OpenAI.GlobalStandard.gpt-4o"]=$GPT_MIN_CAPACITY + ["OpenAI.GlobalStandard.o4-mini"]="${O4_MINI_MIN_CAPACITY}" + ["OpenAI.GlobalStandard.gpt4.1"]="${GPT_MIN_CAPACITY}" + ["OpenAI.GlobalStandard.gpt4.1-mini"]="${GPT41_MINI_MIN_CAPACITY}" ) VALID_REGION="" diff --git a/infra/scripts/upload_team_config.py b/infra/scripts/upload_team_config.py index 3a7e2ccb7..d3c2b45e2 100644 --- a/infra/scripts/upload_team_config.py +++ b/infra/scripts/upload_team_config.py @@ -39,7 +39,7 @@ def check_team_exists(backend_url, team_id, user_principal_id): backend_url = sys.argv[1] directory_path = sys.argv[2] -user_principal_id = sys.argv[3] if len(sys.argv) > 3 else "00000000-0000-0000-0000-000000000000" +user_principal_id = sys.argv[3] if len(sys.argv) > 3 and sys.argv[3].strip() != "" else "00000000-0000-0000-0000-000000000000" # Convert to absolute path if provided as relative directory_path = os.path.abspath(directory_path) @@ -80,6 +80,7 @@ def check_team_exists(backend_url, team_id, user_principal_id): headers = { 'x-ms-client-principal-id': user_principal_id } + params = { 'team_id': team_id } diff --git a/src/tests/agents/interactive_test_harness/reasoning_agent_interactive.py b/src/tests/agents/interactive_test_harness/reasoning_agent_interactive.py index 7b0a71db8..9d87c7d46 100644 --- a/src/tests/agents/interactive_test_harness/reasoning_agent_interactive.py +++ b/src/tests/agents/interactive_test_harness/reasoning_agent_interactive.py @@ -6,7 +6,8 @@ from pathlib import Path # Add the backend path to sys.path so we can import v3 modules -backend_path = Path(__file__).parent.parent.parent / "backend" + +backend_path = Path(__file__).parent.parent.parent.parent / "backend" sys.path.insert(0, str(backend_path)) from v3.magentic_agents.models.agent_models import MCPConfig, SearchConfig