Repository: MicrosoftDocs/azure-dev-docs Branch: main Commit: 632195444ca1 Files: 1434 Total size: 15.1 MB Directory structure: gitextract_6qu1u8is/ ├── .acrolinx-config.edn ├── .gitattributes ├── .github/ │ ├── copilot-instructions.md │ ├── instructions/ │ │ ├── azd-schema-instructions.md │ │ ├── java-instructions.md │ │ ├── java-sample-guidelines.md │ │ ├── mcp-instructions-managed-lustre.md │ │ ├── mcp-instructions.md │ │ └── rust-instructions.md │ ├── policies/ │ │ └── resourceManagement.yml │ └── rust-instructions.md ├── .gitignore ├── .openpublishing.publish.config.json ├── .openpublishing.redirection.json ├── .whatsnew.json ├── CODEOWNERS ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE ├── LICENSE-CODE ├── README.md ├── SECURITY.md ├── ThirdPartyNotices └── articles/ ├── ai/ │ ├── TOC.yml │ ├── advanced-retrieval-augmented-generation.md │ ├── augment-llm-rag-fine-tuning.md │ ├── azure-ai-for-developers.md │ ├── breadcrumb/ │ │ └── toc.yml │ ├── build-mcp-server-ts.md │ ├── build-openai-mcp-server-dotnet.md │ ├── gen-ai-concepts-considerations-developers.md │ ├── get-started-app-chat-vision.md │ ├── get-started-securing-your-ai-app.md │ ├── how-to/ │ │ ├── extract-entities-using-structured-outputs.md │ │ ├── switching-endpoints.md │ │ └── use-reasoning-model-inference.md │ ├── includes/ │ │ ├── authenication-guidance-note.md │ │ ├── azure-ai-for-developers-dotnet.md │ │ ├── azure-ai-for-developers-go.md │ │ ├── azure-ai-for-developers-java.md │ │ ├── azure-ai-for-developers-javascript.md │ │ ├── azure-ai-for-developers-python.md │ │ ├── evaluations-introduction.md │ │ ├── evaluations-procedure.md │ │ ├── intelligent-app-building-blocks-dotnet.md │ │ ├── intelligent-app-building-blocks-java.md │ │ ├── intelligent-app-building-blocks-javascript.md │ │ ├── intelligent-app-building-blocks-python.md │ │ ├── intelligent-app-templates-dotnet.md │ │ ├── intelligent-app-templates-java.md │ │ ├── intelligent-app-templates-javascript.md │ │ ├── intelligent-app-templates-python.md │ │ ├── redeploy-procedure-chat-azure-api-management.md │ │ ├── redeploy-procedure-chat.md │ │ ├── scaling-load-balancer-capacity.md │ │ ├── scaling-load-balancer-cleanup-azure-api-management.md │ │ ├── scaling-load-balancer-cleanup-azure-container-apps.md │ │ ├── scaling-load-balancer-introduction-azure-api-management.md │ │ ├── scaling-load-balancer-introduction-azure-container-apps.md │ │ ├── scaling-load-balancer-logs-azure-container-apps.md │ │ ├── scaling-load-balancer-procedure-azure-api-management.md │ │ └── scaling-load-balancer-procedure-azure-container-apps.md │ ├── index.yml │ ├── intelligent-app-templates.md │ ├── intro-agents-mcp.md │ ├── introduction-build-generative-ai-solutions.md │ ├── keyless-connections.md │ └── resources-overview.md ├── ai-developer-tools/ │ ├── TOC.yml │ ├── breadcrumb/ │ │ └── toc.yml │ ├── context/ │ │ └── context.yml │ ├── index.yml │ └── overview.md ├── ansible/ │ ├── aks-configure-clusters.md │ ├── aks-configure-cni-networking.md │ ├── aks-configure-rbac.md │ ├── application-gateway-configure.md │ ├── azure-web-apps-configure.md │ ├── azure-web-apps-scale.md │ ├── breadcrumb/ │ │ └── toc.yml │ ├── cache-for-redis-configure.md │ ├── cosmos-configure.md │ ├── create-ansible-service-principal.md │ ├── devtest-labs-configure.md │ ├── dynamic-inventory-configure.md │ ├── getting-started-cloud-shell.md │ ├── hdinsight-configure.md │ ├── includes/ │ │ ├── ansible-210-note.md │ │ ├── ansible-27-note.md │ │ ├── ansible-28-note.md │ │ ├── ansible-29-note.md │ │ ├── ansible-configure-azure-collection.md │ │ ├── ansible-delete-resource-group.md │ │ ├── ansible-intro.md │ │ ├── ansible-playbook.md │ │ ├── ansible-prereqs-cloudshell-use-or-vm-creation1.md │ │ ├── ansible-prereqs-cloudshell-use-or-vm-creation2.md │ │ ├── ansible-prereqs-vm-scale-set.md │ │ ├── ansible-service-principal.md │ │ └── ansible-test-configuration.md │ ├── index.yml │ ├── install-on-linux-vm.md │ ├── key-vault-configure-secrets.md │ ├── module-version-matrix.md │ ├── mysql-configure.md │ ├── overview.md │ ├── route-table-configure.md │ ├── service-bus-queue-configure.md │ ├── service-bus-topic-configure.md │ ├── toc.yml │ ├── virtual-network-peering-configure.md │ ├── vm-configure-from-azure-shared-image-gallery.md │ ├── vm-configure-windows.md │ ├── vm-configure.md │ ├── vm-manage.md │ ├── vm-scale-set-auto-scale.md │ ├── vm-scale-set-configure.md │ ├── vm-scale-set-deploy-app.md │ └── vm-scale-set-update-image.md ├── azure-developer-cli/ │ ├── TOC.yml │ ├── ade-integration.md │ ├── app-service-slots.md │ ├── azd-commands.md │ ├── azd-compose.md │ ├── azd-config.md │ ├── azd-copilot-integration.md │ ├── azd-extensibility.md │ ├── azd-init-workflow.md │ ├── azd-schema.md │ ├── azd-template-galleries.md │ ├── azd-templates.md │ ├── azd-up-workflow.md │ ├── azd-zone-pivot-groups.yml │ ├── azure-ai-ml-endpoints.md │ ├── azure-deployment-stacks-integration.md │ ├── azure-developer-cli-vs-azure-cli.md │ ├── breadcrumb/ │ │ └── toc.yml │ ├── compose-generate.md │ ├── compose-quickstart.md │ ├── configure-devops-pipeline.md │ ├── configure-proxy.md │ ├── configure-template-sources.md │ ├── container-apps-workflows.md │ ├── content-delivery-network-changes.md │ ├── custom-prompts.md │ ├── demo-mode.md │ ├── docker-language-support.md │ ├── environment-secrets.md │ ├── environment-variables-faq.md │ ├── environments-overview.md │ ├── extensions/ │ │ ├── azure-ai-foundry-extension.md │ │ ├── copilot-coding-agent-extension.md │ │ ├── overview.md │ │ └── quickstart-ai-extension.md │ ├── feature-versioning.md │ ├── full-stack-deployment.md │ ├── full-stack-templates.md │ ├── get-started.md │ ├── helm-kustomize-support.md │ ├── hooks-multi-language.md │ ├── includes/ │ │ ├── add-cicd-support.md │ │ ├── add-dev-container-support.md │ │ ├── azd-install-dev-container.md │ │ ├── azd-install-local.md │ │ ├── azd-preview.md │ │ ├── azd-template-structure-minimal.md │ │ ├── azd-template-structure.md │ │ ├── configure-pipeline.md │ │ ├── convert-azd-use-code.md │ │ ├── convert-azd-use-template.md │ │ ├── debug-visual-studio.md │ │ ├── extensions-dev-container.md │ │ ├── request-help.md │ │ ├── run-azd-bare-metal.md │ │ └── run-azd-dev-container.md │ ├── index.yml │ ├── install-azd.md │ ├── layered-provisioning.md │ ├── make-azd-compatible.md │ ├── manage-environment-variables.md │ ├── media/ │ │ └── full-stack-deployment/ │ │ ├── full-stack-circular-dependency.mmd │ │ ├── full-stack-dependency-resolution.mmd │ │ └── full-stack-deployment-lifecycle.mmd │ ├── metadata.md │ ├── monitor-your-app.md │ ├── overview.md │ ├── pipeline-advanced-features.md │ ├── pipeline-azure-pipelines.md │ ├── pipeline-create-definition.md │ ├── pipeline-github-actions.md │ ├── powershell-guidance.md │ ├── provisioning-deployment-faq.md │ ├── publishing-workflows.md │ ├── quickstart-explore-templates.md │ ├── reference.md │ ├── remote-builds.md │ ├── remote-environments-support.md │ ├── resource-group-scoped-deployments.md │ ├── service-packaging-ignore-files.md │ ├── source-schema.json │ ├── sovereign-clouds.md │ ├── start-with-app-code.md │ ├── start-with-existing-template.md │ ├── supported-languages-environments.md │ ├── tooling-environment-faq.md │ ├── troubleshoot.md │ ├── use-external-registry.md │ ├── use-terraform-for-azd.md │ └── work-with-environments.md ├── azure-mcp-server/ │ ├── TOC.yml │ ├── azure-mcp-zone-pivot-groups.yml │ ├── breadcrumb/ │ │ └── toc.yml │ ├── concepts.md │ ├── get-started/ │ │ ├── languages/ │ │ │ ├── dotnet.md │ │ │ └── python.md │ │ └── tools/ │ │ ├── cline.md │ │ ├── cursor.md │ │ ├── eclipse.md │ │ ├── jet-brains.md │ │ ├── visual-studio-code.md │ │ ├── visual-studio.md │ │ └── windsurf.md │ ├── get-started.md │ ├── how-to/ │ │ ├── connect-sovereign-clouds.md │ │ ├── deploy-remote-mcp-server-copilot-studio.md │ │ ├── deploy-remote-mcp-server-microsoft-foundry.md │ │ ├── deploy-remote-mcp-server-on-behalf-of.md │ │ ├── github-copilot-cli.md │ │ ├── github-copilot-coding-agent.md │ │ └── github-copilot-sdk.md │ ├── includes/ │ │ ├── authentication-guidance.md │ │ ├── get-started-intro.md │ │ ├── mcp-introduction.md │ │ ├── mcp-prerequisites.md │ │ ├── mcp-usage-contexts.md │ │ ├── permissions-note.md │ │ ├── security-local-development.md │ │ ├── sign-in-local-development.md │ │ └── tools/ │ │ ├── global-parameters-list.md │ │ ├── parameter-consideration.md │ │ ├── server-start-options.md │ │ ├── supported-azure-services.md │ │ ├── tool-annotation-hints.md │ │ └── user-consent.md │ ├── index.yml │ ├── overview.md │ ├── services/ │ │ ├── azure-mcp-server-for-app-service.md │ │ ├── azure-mcp-server-for-functions.md │ │ ├── azure-mcp-server-for-key-vault.md │ │ ├── azure-mcp-server-for-redis.md │ │ ├── azure-mcp-server-for-search.md │ │ └── azure-mcp-speech-foundry-tools.md │ └── tools/ │ ├── ai-services-speech.md │ ├── app-configuration.md │ ├── application-insights.md │ ├── azure-advisor.md │ ├── azure-ai-search.md │ ├── azure-app-lens.md │ ├── azure-app-service.md │ ├── azure-best-practices.md │ ├── azure-bicep-schema.md │ ├── azure-cli.md │ ├── azure-cloud-architect.md │ ├── azure-communication.md │ ├── azure-compliance-quick-review.md │ ├── azure-compute.md │ ├── azure-confidential-ledger.md │ ├── azure-container-apps.md │ ├── azure-container-registry.md │ ├── azure-cosmos-db.md │ ├── azure-data-explorer.md │ ├── azure-database-postgresql.md │ ├── azure-deploy.md │ ├── azure-event-grid.md │ ├── azure-event-hubs.md │ ├── azure-file-shares.md │ ├── azure-file-sync.md │ ├── azure-foundry.md │ ├── azure-functions.md │ ├── azure-grafana.md │ ├── azure-key-vault.md │ ├── azure-kubernetes.md │ ├── azure-load-testing.md │ ├── azure-managed-lustre.md │ ├── azure-marketplace.md │ ├── azure-mcp-tool.md │ ├── azure-migrate.md │ ├── azure-monitor.md │ ├── azure-mysql.md │ ├── azure-native-isv.md │ ├── azure-policy.md │ ├── azure-pricing.md │ ├── azure-quotas.md │ ├── azure-rbac.md │ ├── azure-redis.md │ ├── azure-resource-health.md │ ├── azure-service-bus.md │ ├── azure-service-fabric.md │ ├── azure-signalr.md │ ├── azure-sql.md │ ├── azure-storage.md │ ├── azure-terraform-best-practices.md │ ├── azure-virtual-desktop.md │ ├── azure-well-architected-framework.md │ ├── index.md │ ├── resource-group.md │ └── subscription.md ├── azure-skills/ │ ├── TOC.yml │ ├── index.yml │ ├── install.md │ ├── overview.md │ ├── quickstart.md │ └── skills/ │ ├── ai-runway-aks-setup.md │ ├── app-insights-instrumentation.md │ ├── azure-ai-gateway.md │ ├── azure-ai.md │ ├── azure-cloud-migrate.md │ ├── azure-compliance.md │ ├── azure-compute.md │ ├── azure-cost.md │ ├── azure-deploy.md │ ├── azure-diagnostics.md │ ├── azure-enterprise-infra-planner.md │ ├── azure-hosted-copilot-sdk.md │ ├── azure-kubernetes.md │ ├── azure-kusto.md │ ├── azure-messaging.md │ ├── azure-prepare.md │ ├── azure-quotas.md │ ├── azure-rbac.md │ ├── azure-resource-lookup.md │ ├── azure-resource-visualizer.md │ ├── azure-storage.md │ ├── azure-upgrade.md │ ├── azure-validate.md │ ├── entra-agent-id.md │ ├── entra-app-registration.md │ └── microsoft-foundry.md ├── breadcrumb/ │ └── toc.yml ├── cpp/ │ ├── TOC.yml │ ├── index.yml │ └── sdk/ │ ├── authentication/ │ │ ├── credential-chains.md │ │ ├── local-development-dev-accounts.md │ │ ├── local-development-service-principal.md │ │ ├── overview.md │ │ ├── system-assigned-managed-identity.md │ │ └── user-assigned-managed-identity.md │ ├── fundamentals/ │ │ ├── common-types.md │ │ ├── errors.md │ │ ├── http-pipelines-and-retries.md │ │ └── overview.md │ ├── includes/ │ │ ├── implement-managed-identity-concepts.md │ │ ├── sdk-auth-overview-dev-accounts.md │ │ ├── sdk-auth-overview-dev-service-principals.md │ │ ├── sdk-auth-overview-managed-identity.md │ │ └── sdk-auth-overview-service-principal.md │ ├── install-and-integrate-the-sdk.md │ ├── media/ │ │ └── mermaidjs/ │ │ └── local-service-principal-authentication.md │ ├── mermaidjs/ │ │ ├── chain-sequence.md │ │ ├── chained-token-credential-authentication-flow.md │ │ ├── default-azure-credential-authentication-flow.md │ │ └── default-azure-credential-environment-variable-production.md │ └── overview.md ├── dev-tunnels/ │ ├── breadcrumb/ │ │ └── toc.yml │ ├── cli-commands.md │ ├── faq.md │ ├── get-started.md │ ├── index.yml │ ├── overview.md │ ├── policies.md │ ├── security.md │ ├── support.md │ └── toc.yml ├── docfx.json ├── github/ │ ├── breadcrumb/ │ │ └── toc.yml │ ├── build-vm-image.md │ ├── connect-from-azure-identity.md │ ├── connect-from-azure-openid-connect.md │ ├── connect-from-azure-secret.md │ ├── connect-from-azure.md │ ├── database-actions-deploy.md │ ├── deploy-to-azure.md │ ├── deploy-with-visual-studio.md │ ├── github-actions-key-vault.md │ ├── github-actions.md │ ├── index.yml │ ├── integrate-azure-devops.md │ ├── manage-azure-policy.md │ └── toc.yml ├── github-copilot-app-modernization/ │ ├── breadcrumb/ │ │ └── toc.yml │ ├── configure-settings-intellij.md │ ├── context/ │ │ └── context.yml │ ├── customize-upgrade-plan.md │ ├── framework-upgrade.md │ ├── index.yml │ ├── languages.md │ ├── modernization-agent/ │ │ ├── batch-assess.md │ │ ├── batch-upgrade.md │ │ ├── cicd-integration.md │ │ ├── cli-commands.md │ │ ├── customization.md │ │ ├── infra-deployment.md │ │ ├── overview.md │ │ └── quickstart.md │ ├── overview.md │ ├── quickstart-unit-tests.md │ ├── quickstart-upgrade.md │ ├── toc.yml │ └── tools.md ├── github-copilot-azure/ │ ├── TOC.yml │ ├── bicep-generate-edit.md │ ├── breadcrumb/ │ │ └── toc.yml │ ├── deploy-examples.md │ ├── design-develop-examples.md │ ├── generate-deploy-django-postgresql.md │ ├── get-started.md │ ├── github-copilot-azure-zone-pivot-groups.yml │ ├── includes/ │ │ ├── get-started-visual-studio-2022.md │ │ ├── get-started-visual-studio-2026.md │ │ ├── get-started-vscode.md │ │ ├── prerequisites-2022.md │ │ ├── prerequisites-2026.md │ │ └── prerequisites.md │ ├── index.yml │ ├── introduction.md │ ├── learn-examples.md │ ├── quickstart-create-redis.md │ ├── quickstart-deploy-app-agent-mode.md │ ├── support.md │ └── troubleshoot-examples.md ├── go/ │ ├── TOC.yml │ ├── azure-ai-for-go-developers.md │ ├── azure-sdk-core-concepts.md │ ├── azure-sdk-library-package-index.md │ ├── breadcrumb/ │ │ └── toc.yml │ ├── configure-visual-studio-code.md │ ├── control-plane.md │ ├── data-plane.md │ ├── deploy-azure-resource-manager-template.md │ ├── deploy-container-apps.md │ ├── includes/ │ │ ├── azure-sdk-get.md │ │ ├── azure-subscription.md │ │ ├── configure-environment.md │ │ ├── set-authentication-environment-variables.md │ │ └── troubleshooting.md │ ├── index.yml │ ├── key-azure-services-for-go.md │ ├── management-libraries.md │ ├── migration-guides.md │ ├── overview.md │ └── sdk/ │ ├── authentication/ │ │ ├── authentication-additional-methods.md │ │ ├── authentication-on-premises-apps.md │ │ ├── authentication-overview.md │ │ ├── credential-chains.md │ │ ├── local-development-dev-accounts.md │ │ ├── local-development-service-principal.md │ │ ├── system-assigned-managed-identity.md │ │ └── user-assigned-managed-identity.md │ ├── includes/ │ │ ├── implement-managed-identity-concepts.md │ │ ├── sdk-auth-overview-dev-accounts.md │ │ ├── sdk-auth-overview-dev-service-principals.md │ │ ├── sdk-auth-overview-managed-identity.md │ │ └── sdk-auth-overview-service-principal.md │ ├── media/ │ │ └── mermaidjs/ │ │ └── local-service-principal-authentication.md │ └── mermaidjs/ │ ├── chain-sequence.md │ ├── chained-token-credential-auth-flow.md │ ├── default-azure-credential-auth-flow.md │ ├── default-azure-credential-environment-variable-development.md │ └── default-azure-credential-environment-variable-production.md ├── iac/ │ └── index.yml ├── includes/ │ ├── authentication/ │ │ ├── advantages-token-based-authentication.md │ │ ├── assign-group-roles.md │ │ ├── assign-service-principal-roles.md │ │ ├── broker-assign-roles.md │ │ ├── broker-configure-application.md │ │ ├── broker-introduction.md │ │ ├── broker-linux.md │ │ ├── broker-mac.md │ │ ├── broker-windows.md │ │ ├── create-app-registration.md │ │ ├── create-entra-group.md │ │ ├── managed-identity-concepts.md │ │ ├── media/ │ │ │ └── mermaidjs/ │ │ │ ├── authentication-environments.md │ │ │ ├── chain-sequence.md │ │ │ ├── chained-token-credential-authentication-flow.md │ │ │ ├── default-azure-credential-authentication-flow.md │ │ │ ├── default-azure-credential-environment-variable-development.md │ │ │ ├── default-azure-credential-environment-variable-production.md │ │ │ ├── default-azure-credential-excludes.md │ │ │ └── local-service-principal-authentication.md │ │ ├── overview-advantages.md │ │ ├── overview-credential-sequence.md │ │ ├── overview-defaultazurecredential-after.md │ │ ├── overview-local-environments.md │ │ ├── overview-para-1.md │ │ ├── overview-recommend-authentication-rust.md │ │ ├── overview-server-environments.md │ │ ├── sign-in-azure-cli.md │ │ ├── sign-in-azure-developer-cli.md │ │ ├── sign-in-azure-powershell.md │ │ ├── sign-in-visual-studio-code.md │ │ ├── system-assigned-managed-identity.md │ │ └── user-assigned-managed-identity.md │ ├── azure-cli-login.md │ ├── choose-the-right-azure-command-line-tool.md │ ├── cloud-shell-try-it.md │ ├── create-resource-group.md │ ├── delete-resource-group.md │ ├── dotnet-all.md │ ├── dotnet-new.md │ ├── github-copilot-modernization-azure-note.md │ ├── github-copilot-modernization-gradle-kotlin-note.md │ ├── github-copilot-modernization-intellij-note.md │ ├── go-all.md │ ├── go-new.md │ ├── java-all.md │ ├── java-new.md │ ├── javascript-all.md │ ├── javascript-new.md │ ├── open-cloud-shell.md │ ├── open-source-devops-intro-aks.md │ ├── open-source-devops-intro-app-service.md │ ├── open-source-devops-intro-servicebus.md │ ├── open-source-devops-intro-vm-scale-set.md │ ├── open-source-devops-prereqs-azure-subscription.md │ ├── open-source-devops-prereqs-create-service-principal.md │ ├── python-all.md │ ├── python-new.md │ ├── quickstarts-free-trial-note.md │ ├── rust-all.md │ ├── rust-new.md │ └── sdk-auth-passwordless/ │ ├── assign-local-dev-group-to-role-azure-portal-1.md │ ├── assign-local-dev-group-to-role-azure-portal-2.md │ ├── assign-local-dev-group-to-role-azure-portal-3.md │ ├── assign-local-dev-group-to-role-azure-portal-4.md │ ├── assign-local-dev-group-to-role-azure-portal-5.md │ ├── assign-local-dev-group-to-role-azure-portal-6.md │ ├── assign-local-dev-group-to-role-azure-portal-7.md │ ├── assign-managed-identity-to-role-azure-portal-1.md │ ├── assign-managed-identity-to-role-azure-portal-2.md │ ├── assign-managed-identity-to-role-azure-portal-3.md │ ├── assign-managed-identity-to-role-azure-portal-4.md │ ├── assign-managed-identity-to-role-azure-portal-5.md │ ├── assign-managed-identity-to-role-azure-portal-6.md │ ├── assign-managed-identity-to-role-azure-portal-7.md │ ├── assign-service-principal-to-role-azure-portal-1.md │ ├── assign-service-principal-to-role-azure-portal-2.md │ ├── assign-service-principal-to-role-azure-portal-3.md │ ├── assign-service-principal-to-role-azure-portal-4.md │ ├── assign-service-principal-to-role-azure-portal-5.md │ ├── assign-service-principal-to-role-azure-portal-6.md │ ├── assign-service-principal-to-role-azure-portal-7.md │ ├── enable-managed-identity-azure-cli-2.md │ ├── enable-managed-identity-azure-cli.md │ ├── enable-managed-identity-azure-portal-1.md │ ├── enable-managed-identity-azure-portal-2.md │ ├── enable-managed-identity-azure-portal-3.md │ ├── local-dev-accounts-app-ad-group-azure-portal-1.md │ ├── local-dev-accounts-app-ad-group-azure-portal-2.md │ ├── local-dev-accounts-app-ad-group-azure-portal-3.md │ ├── local-dev-accounts-app-ad-group-azure-portal-4.md │ ├── local-dev-accounts-app-ad-group-azure-portal-5.md │ ├── local-dev-accounts-app-ad-group-azure-portal-6.md │ ├── local-dev-app-ad-group-azure-portal-1.md │ ├── local-dev-app-ad-group-azure-portal-2.md │ ├── local-dev-app-ad-group-azure-portal-3.md │ ├── local-dev-app-ad-group-azure-portal-4.md │ ├── local-dev-app-ad-group-azure-portal-5.md │ ├── local-dev-app-ad-group-azure-portal-6.md │ ├── local-dev-app-registration-azure-portal-1.md │ ├── local-dev-app-registration-azure-portal-2.md │ ├── local-dev-app-registration-azure-portal-3.md │ ├── local-dev-app-registration-azure-portal-4.md │ ├── local-dev-app-registration-azure-portal-5.md │ ├── local-dev-app-registration-azure-portal-6.md │ ├── local-dev-app-registration-azure-portal-7.md │ ├── on-premises-app-registration-azure-portal-1.md │ ├── on-premises-app-registration-azure-portal-2.md │ ├── on-premises-app-registration-azure-portal-3.md │ ├── on-premises-app-registration-azure-portal-4.md │ ├── on-premises-app-registration-azure-portal-5.md │ ├── on-premises-app-registration-azure-portal-6.md │ └── on-premises-app-registration-azure-portal-7.md ├── index.yml ├── intro/ │ ├── TOC.yml │ ├── azure-developer-billing.md │ ├── azure-developer-create-resources.md │ ├── azure-developer-key-concepts.md │ ├── azure-developer-key-services.md │ ├── azure-developer-overview.md │ ├── azure-service-sdk-tool-versioning.md │ ├── connect-to-azure-services.md │ ├── hosting-apps-on-azure.md │ ├── index.yml │ ├── intro-zone-pivot-groups.yml │ ├── passwordless-overview.md │ ├── quickstart-developer-tools.md │ └── whats-new.md ├── java/ │ ├── .openpublishing.redirection.java.json │ ├── ai/ │ │ ├── azure-ai-for-java-developers.md │ │ ├── get-started-app-chat-scaling-with-azure-container-apps.md │ │ ├── get-started-app-chat-template.md │ │ ├── index.yml │ │ └── toc.yml │ ├── breadcrumb/ │ │ └── toc.yml │ ├── containers/ │ │ ├── baseline.md │ │ ├── index.yml │ │ ├── kubernetes.md │ │ ├── overview.md │ │ └── toc.yml │ ├── ee/ │ │ ├── deploy-java-liberty-app-aca.md │ │ ├── deploy-java-quarkus-app.md │ │ ├── how-to-configure-passwordless-datasource-eap.md │ │ ├── how-to-configure-passwordless-datasource-websphere.md │ │ ├── how-to-configure-passwordless-datasource-wls.md │ │ ├── how-to-deploy-java-liberty-jcache.md │ │ ├── howto-deploy-java-liberty-app-manual.md │ │ ├── includes/ │ │ │ ├── aro-quota.md │ │ │ ├── aro-support.md │ │ │ ├── how-to-configure-passwordless-datasource-non-appserver.md │ │ │ ├── secure-with-entra-id-add-app-roles.md │ │ │ ├── secure-with-entra-id-add-redirect-uri.md │ │ │ ├── secure-with-entra-id-clean-up-resources.md │ │ │ ├── secure-with-entra-id-create-users.md │ │ │ ├── secure-with-entra-id-gather-user-credentials.md │ │ │ ├── secure-with-entra-id-prerequisites.md │ │ │ └── secure-with-entra-id-register-app.md │ │ ├── index.yml │ │ ├── jboss-eap-on-aro.md │ │ ├── jboss-on-azure.md │ │ ├── liberty-on-aro.md │ │ ├── liberty-with-microsoft-entra-id.md │ │ ├── media/ │ │ │ └── websphere-family/ │ │ │ └── websphere-family.ai │ │ ├── quarkus-with-app-configuration.md │ │ ├── quarkus-with-microsoft-entra-id.md │ │ ├── toc.yml │ │ ├── traditional-websphere-application-server-virtual-machines.md │ │ └── websphere-family.md │ ├── fundamentals/ │ │ ├── index.yml │ │ ├── java-azure-keyvault-ssl-integration-jvm.md │ │ ├── java-azure-keyvault-tomcat-integration.md │ │ ├── java-azure-tools.md │ │ ├── java-diagnostic-tools-java-diagnostic-agent-quickstart.md │ │ ├── java-diagnostic-tools-on-aks-overview.md │ │ ├── java-diagnostic-tools-spring-boot-admin-quickstart.md │ │ ├── java-get-started-with-logzio.md │ │ ├── java-jdk-install.md │ │ ├── java-support-on-azure.md │ │ └── toc.yml │ ├── get-started/ │ │ ├── choose.md │ │ ├── code.md │ │ ├── deploy.md │ │ ├── index.yml │ │ ├── overview.md │ │ ├── scale.md │ │ └── toc.yml │ ├── identity/ │ │ ├── deploy-jboss-to-app-service.md │ │ ├── deploy-spring-boot-to-azure-container-apps.md │ │ ├── deploy-tomcat-to-app-service.md │ │ ├── deploy-weblogic-to-vm.md │ │ ├── deploy-websphere-to-vm.md │ │ ├── enable-java-jboss-eap-webapp-authentication-azure-ad-b2c.md │ │ ├── enable-java-jboss-eap-webapp-authentication-entra-id.md │ │ ├── enable-java-jboss-eap-webapp-authorization-entra-id.md │ │ ├── enable-java-jboss-eap-webapp-authorization-group-entra-id.md │ │ ├── enable-java-jboss-eap-webapp-authorization-role-entra-id.md │ │ ├── enable-java-tomcat-webapp-authentication-azure-ad-b2c.md │ │ ├── enable-java-tomcat-webapp-authentication-entra-id.md │ │ ├── enable-java-tomcat-webapp-authorization-entra-id.md │ │ ├── enable-java-tomcat-webapp-authorization-group-entra-id.md │ │ ├── enable-java-tomcat-webapp-authorization-role-entra-id.md │ │ ├── enable-java-weblogic-webapp-authentication-azure-ad-b2c.md │ │ ├── enable-java-weblogic-webapp-authentication-entra-id.md │ │ ├── enable-java-weblogic-webapp-authorization-entra-id.md │ │ ├── enable-java-weblogic-webapp-authorization-group-entra-id.md │ │ ├── enable-java-weblogic-webapp-authorization-role-entra-id.md │ │ ├── enable-java-websphere-webapp-authentication-azure-ad-b2c.md │ │ ├── enable-java-websphere-webapp-authentication-entra-id.md │ │ ├── enable-java-websphere-webapp-authorization-entra-id.md │ │ ├── enable-java-websphere-webapp-authorization-group-entra-id.md │ │ ├── enable-java-websphere-webapp-authorization-role-entra-id.md │ │ ├── enable-spring-boot-webapp-authentication-azure-ad-b2c.md │ │ ├── enable-spring-boot-webapp-authentication-entra-id.md │ │ ├── enable-spring-boot-webapp-authorization-entra-id.md │ │ ├── enable-spring-boot-webapp-authorization-group-entra-id.md │ │ ├── enable-spring-boot-webapp-authorization-role-entra-id.md │ │ ├── includes/ │ │ │ ├── deploy-app-service-deploy.md │ │ │ ├── deploy-app-service-intro.md │ │ │ ├── deploy-app-service-prepare-deploy.md │ │ │ ├── deploy-app-service-remove-secret.md │ │ │ ├── deploy-app-service-update-registration.md │ │ │ ├── deploy-container-apps-cli-setup.md │ │ │ ├── deploy-container-apps-create-env-variables.md │ │ │ ├── deploy-container-apps-deploy.md │ │ │ ├── deploy-container-apps-intro.md │ │ │ ├── deploy-container-apps-prepare-deploy.md │ │ │ ├── deploy-container-apps-prepare.md │ │ │ ├── deploy-container-apps-secret-note.md │ │ │ ├── deploy-container-apps-update-registration.md │ │ │ ├── deploy-container-apps-validate.md │ │ │ ├── deploy-jboss-app-service-configure-maven.md │ │ │ ├── deploy-jboss-app-service-secret-note.md │ │ │ ├── deploy-jboss-app-service.md │ │ │ ├── deploy-tomcat-app-service-configure-maven.md │ │ │ ├── deploy-tomcat-app-service-secret-note.md │ │ │ ├── deploy-tomcat-app-service.md │ │ │ ├── deploy-websphere.md │ │ │ ├── enable-java-servlet-webapp-authentication-azure-ad-b2c-explore.md │ │ │ ├── enable-java-servlet-webapp-authentication-azure-ad-b2c.md │ │ │ ├── enable-java-servlet-webapp-authentication-entra-id-explore.md │ │ │ ├── enable-java-servlet-webapp-authentication-entra-id.md │ │ │ ├── enable-java-servlet-webapp-authorization-entra-id-explore.md │ │ │ ├── enable-java-servlet-webapp-authorization-entra-id.md │ │ │ ├── enable-java-servlet-webapp-authorization-group-entra-id-explore.md │ │ │ ├── enable-java-servlet-webapp-authorization-group-entra-id.md │ │ │ ├── enable-java-servlet-webapp-authorization-role-entra-id-explore.md │ │ │ ├── enable-java-servlet-webapp-authorization-role-entra-id.md │ │ │ ├── java-servlet-overview-recommendation.md │ │ │ ├── prerequisites-authorization-graph.md │ │ │ ├── prerequisites-authorization-groups.md │ │ │ ├── prerequisites-authorization-roles.md │ │ │ ├── prerequisites-jboss.md │ │ │ ├── prerequisites-sign-in-azure-ad-b2c.md │ │ │ ├── prerequisites-sign-in-entra.md │ │ │ ├── prerequisites-spring-boot-updated-version.md │ │ │ ├── prerequisites-spring-boot.md │ │ │ ├── prerequisites-tomcat.md │ │ │ ├── prerequisites-weblogic.md │ │ │ ├── prerequisites-websphere.md │ │ │ ├── scenario-authorization-graph.md │ │ │ ├── scenario-authorization-groups.md │ │ │ ├── scenario-authorization-roles.md │ │ │ ├── scenario-sign-in-azure-ad-b2c.md │ │ │ ├── scenario-sign-in-entra.md │ │ │ └── spring-boot-overview-recommendations.md │ │ ├── index.yml │ │ ├── secure-java-apps-with-identity-platform-overview.md │ │ └── toc.yml │ ├── includes/ │ │ └── security-note.md │ ├── index.yml │ ├── java-zone-pivot-groups.yml │ ├── migration/ │ │ ├── github-copilot-app-modernization-for-java-coding-agent.md │ │ ├── github-copilot-app-modernization-for-java-copilot-cli.md │ │ ├── github-copilot-app-modernization-for-java-portfolio-assessment-integration.md │ │ ├── github-copilot-app-modernization-for-java-rearchitecture.md │ │ ├── includes/ │ │ │ ├── account-for-authentication-and-authorization-was.md │ │ │ ├── account-for-authentication-and-authorization.md │ │ │ ├── account-for-the-use-of-custom-security-providers-and-jaas.md │ │ │ ├── account-for-the-use-of-jca-adapters-and-resource-adapters-liberty.md │ │ │ ├── account-for-the-use-of-jca-adapters-and-resource-adapters-was.md │ │ │ ├── account-for-the-use-of-jca-adapters-and-resource-adapters.md │ │ │ ├── build-and-deploy-war-to-app-service.md │ │ │ ├── build-and-push-the-docker-image-to-azure-container-registry.md │ │ │ ├── clean-up-windows-xserver-machine.md │ │ │ ├── configure-custom-domain-and-ssl.md │ │ │ ├── configure-persistent-storage-azure-container-apps.md │ │ │ ├── create-an-availability-set.md │ │ │ ├── create-windows-vm-and-set-up-xserver.md │ │ │ ├── deploy-to-aks.md │ │ │ ├── determine-the-network-topology-liberty.md │ │ │ ├── determine-the-network-topology-was.md │ │ │ ├── determine-the-network-topology.md │ │ │ ├── determine-whether-a-connection-to-on-premises-is-needed.md │ │ │ ├── determine-whether-and-how-the-file-system-is-used-azure-container-apps.md │ │ │ ├── determine-whether-and-how-the-file-system-is-used.md │ │ │ ├── determine-whether-ejb-timers-are-in-use.md │ │ │ ├── determine-whether-ibm-integration-bus-is-in-use.md │ │ │ ├── determine-whether-jaas-is-in-use-jboss.md │ │ │ ├── determine-whether-jaas-is-in-use.md │ │ │ ├── determine-whether-jms-queues-or-topics-are-in-use-virtual-machines-was.md │ │ │ ├── determine-whether-jms-queues-or-topics-are-in-use-virtual-machines.md │ │ │ ├── determine-whether-jms-queues-or-topics-are-in-use.md │ │ │ ├── determine-whether-liberty-license-is-needed.md │ │ │ ├── determine-whether-management-over-rest-is-used.md │ │ │ ├── determine-whether-oracle-service-bus-is-in-use.md │ │ │ ├── determine-whether-osgi-bundles-are-used-was.md │ │ │ ├── determine-whether-osgi-bundles-are-used.md │ │ │ ├── determine-whether-session-replication-is-used-jboss-eap.md │ │ │ ├── determine-whether-session-replication-is-used-liberty.md │ │ │ ├── determine-whether-session-replication-is-used-was.md │ │ │ ├── determine-whether-session-replication-is-used.md │ │ │ ├── determine-whether-the-java-ee-application-client-feature-is-in-use-aks.md │ │ │ ├── determine-whether-the-java-ee-application-client-feature-is-used.md │ │ │ ├── determine-whether-the-liberty-version-is-compatible.md │ │ │ ├── determine-whether-was-clustering-is-used.md │ │ │ ├── determine-whether-was-has-been-customized.md │ │ │ ├── determine-whether-weblogic-clustering-is-used.md │ │ │ ├── determine-whether-weblogic-has-been-customized.md │ │ │ ├── determine-whether-wlst-is-used.md │ │ │ ├── determine-whether-you-are-using-your-own-custom-created-shared-java-ee-libraries.md │ │ │ ├── determine-whether-your-application-contains-os-specific-code-no-title.md │ │ │ ├── determine-whether-your-application-contains-os-specific-code.md │ │ │ ├── determine-whether-your-application-is-composed-of-multiple-wars.md │ │ │ ├── determine-whether-your-application-is-packaged-as-an-ear-was.md │ │ │ ├── determine-whether-your-application-is-packaged-as-an-ear.md │ │ │ ├── determine-whether-your-application-relies-on-scheduled-jobs-app-service.md │ │ │ ├── determine-whether-your-application-relies-on-scheduled-jobs-azure-container-apps.md │ │ │ ├── determine-whether-your-application-relies-on-scheduled-jobs.md │ │ │ ├── determine-whether-your-application-uses-a-resource-adapter-jboss.md │ │ │ ├── determine-whether-your-application-uses-a-resource-adapter.md │ │ │ ├── determine-whether-your-application-uses-entity-beans.md │ │ │ ├── document-datasources-was.md │ │ │ ├── document-datasources.md │ │ │ ├── dynamic-or-internal-content-aks.md │ │ │ ├── dynamic-or-internal-content-app-service.md │ │ │ ├── ensure-console-logging-and-configure-diagnostic-settings-azure-container-apps.md │ │ │ ├── ha-dr-for-jboss-azure-sql-database.md │ │ │ ├── ha-dr-for-jboss-build-javaee-cafe.md │ │ │ ├── ha-dr-for-jboss-create-azure-traffic.md │ │ │ ├── ha-dr-for-jboss-fail-over-to-secondary-site.md │ │ │ ├── ha-dr-for-jboss-next-step-head.md │ │ │ ├── ha-dr-for-jboss-prerequistes.md │ │ │ ├── ha-dr-for-jboss-setup-disaster-recovery.md │ │ │ ├── ha-dr-for-jboss-steps-cleanup-resources.md │ │ │ ├── ha-dr-for-jboss-steps-cleanup-unused-resource.md │ │ │ ├── ha-dr-for-jboss-steps-commit-failover.md │ │ │ ├── ha-dr-for-jboss-steps-disable-replication.md │ │ │ ├── ha-dr-for-jboss-steps-fail-back.md │ │ │ ├── ha-dr-for-jboss-vms-intro-end.md │ │ │ ├── ha-dr-for-jboss-vms-intro-head.md │ │ │ ├── ha-dr-for-wls-aks-azure-traffic-manager.md │ │ │ ├── ha-dr-for-wls-azure-prepare-sample-app.md │ │ │ ├── ha-dr-for-wls-azure-sql-database-creation.md │ │ │ ├── ha-dr-for-wls-azure-sql-database-failover-group.md │ │ │ ├── ha-dr-for-wls-azure-sql-database-schema-aks.md │ │ │ ├── ha-dr-for-wls-azure-sql-database-schema-vms.md │ │ │ ├── ha-dr-for-wls-azure-verify-sample-app-test-failover.md │ │ │ ├── ha-dr-for-wls-azure-verify-sample-app.md │ │ │ ├── ha-dr-for-wls-backup-extension.md │ │ │ ├── ha-dr-for-wls-overview.md │ │ │ ├── ha-dr-for-wls-vm-azure-traffic-manager.md │ │ │ ├── identify-all-outside-processes-and-daemons-running-on-the-production-servers.md │ │ │ ├── identify-external-caches-azure-container-apps.md │ │ │ ├── identify-external-caches-azure-spring-apps.md │ │ │ ├── identify-jms-brokers-in-spring.md │ │ │ ├── identify-local-state-azure-container-apps.md │ │ │ ├── identify-logs-metrics-apm-azure-container-apps.md │ │ │ ├── identify-spring-boot-versions.md │ │ │ ├── import-backend-certificates.md │ │ │ ├── inspect-the-deployment-architecture-spring-boot.md │ │ │ ├── inspect-the-deployment-architecture-spring-cloud.md │ │ │ ├── inspect-your-domain-configuration.md │ │ │ ├── inspect-your-profile-configuration-liberty.md │ │ │ ├── inspect-your-profile-configuration.md │ │ │ ├── inventory-all-certificates.md │ │ │ ├── inventory-all-secrets.md │ │ │ ├── inventory-certificates-h4.md │ │ │ ├── inventory-certificates.md │ │ │ ├── inventory-configuration-sources-and-secrets-spring-boot.md │ │ │ ├── inventory-configuration-sources-and-secrets-spring-cloud.md │ │ │ ├── inventory-databases-spring-boot.md │ │ │ ├── inventory-difference-between-your-env-and-liberty.md │ │ │ ├── inventory-external-resources-jboss.md │ │ │ ├── inventory-external-resources.md │ │ │ ├── inventory-identity-providers-spring-boot.md │ │ │ ├── inventory-jndi-resources.md │ │ │ ├── inventory-secrets.md │ │ │ ├── inventory-server-capacity-aks.md │ │ │ ├── inventory-server-capacity-aro-liberty.md │ │ │ ├── inventory-server-capacity-jboss-eap.md │ │ │ ├── inventory-server-capacity-virtual-machines.md │ │ │ ├── inventory-was-jndi-resources.md │ │ │ ├── inventory-was-secrets.md │ │ │ ├── jms-broker-settings-examples-in-spring.md │ │ │ ├── migrate-all-certificates-to-keyvault-azure-container-apps.md │ │ │ ├── migrate-github-copilot-app-modernization-for-java-quickstart-prerequisites.md │ │ │ ├── migrate-identity-provider-app-service.md │ │ │ ├── migrate-scheduled-jobs-aks.md │ │ │ ├── migrate-scheduled-jobs.md │ │ │ ├── migrate-steps-spring-boot-azure-container-apps.md │ │ │ ├── note-obtain-your-current-java-version-app-service.md │ │ │ ├── note-obtain-your-current-java-version.md │ │ │ ├── perform-in-place-testing-jboss.md │ │ │ ├── perform-in-place-testing.md │ │ │ ├── post-migration-recommendations-app-service.md │ │ │ ├── post-migration-spring-boot-azure-container-apps.md │ │ │ ├── provision-a-public-ip-address.md │ │ │ ├── provision-azure-app-service-for-jboss-eap-runtime.md │ │ │ ├── provision-azure-container-registry-and-azure-kubernetes-service.md │ │ │ ├── quickstart-assess-migrate-intellij-idea.md │ │ │ ├── quickstart-assess-migrate-visual-studio-code.md │ │ │ ├── recommendations-jboss-eap.md │ │ │ ├── redhat-migration-toolkit.md │ │ │ ├── setup-data-sources-and-deploy-app-service-jboss.md │ │ │ ├── sign-in-to-azure.md │ │ │ ├── static-content.md │ │ │ ├── switch-to-a-supported-platform-azure-container-apps.md │ │ │ ├── tomcat-datasource-additional-instructions.md │ │ │ ├── validate-that-the-supported-java-version-works-correctly-jboss-eap.md │ │ │ ├── validate-that-the-supported-java-version-works-correctly-liberty.md │ │ │ ├── validate-that-the-supported-java-version-works-correctly-was.md │ │ │ ├── validate-that-the-supported-java-version-works-correctly-weblogic.md │ │ │ ├── vm-aks-aro-tradeoffs-was-liberty.md │ │ │ ├── vm-aks-tradeoffs-wls.md │ │ │ ├── vm-aro-tradeoffs-eap.md │ │ │ ├── wls-manual-guidance-configure-domain.md │ │ │ ├── wls-manual-guidance-start-admin-and-get-ip.md │ │ │ ├── wls-manual-guidance-start-managed-server.md │ │ │ ├── working-with-assessment-intellij-idea.md │ │ │ └── working-with-assessment-visual-studio-code.md │ │ ├── index.yml │ │ ├── media/ │ │ │ └── migrate-weblogic-with-app-gateway/ │ │ │ └── weblogic-app-gateway-key-vault.ai │ │ ├── migrate-github-copilot-app-modernization-for-java-assess-rules.md │ │ ├── migrate-github-copilot-app-modernization-for-java-custom-agent.md │ │ ├── migrate-github-copilot-app-modernization-for-java-faq.yml │ │ ├── migrate-github-copilot-app-modernization-for-java-oracle-to-postgresql.md │ │ ├── migrate-github-copilot-app-modernization-for-java-predefined-tasks.md │ │ ├── migrate-github-copilot-app-modernization-for-java-quickstart-assess-migrate.md │ │ ├── migrate-github-copilot-app-modernization-for-java-quickstart-chat-window.md │ │ ├── migrate-github-copilot-app-modernization-for-java-quickstart-containerization.md │ │ ├── migrate-github-copilot-app-modernization-for-java-quickstart-create-and-apply-your-own-task.md │ │ ├── migrate-github-copilot-app-modernization-for-java-quickstart-deploy-to-azure.md │ │ ├── migrate-github-copilot-app-modernization-for-java-quickstart-infrastructure.md │ │ ├── migrate-github-copilot-app-modernization-for-java-sample.md │ │ ├── migrate-github-copilot-app-modernization-for-java-working-with-assessment.md │ │ ├── migrate-github-copilot-app-modernization-for-java.md │ │ ├── migrate-jboss-eap-to-azure-redhat-openshift.md │ │ ├── migrate-jboss-eap-to-azure-vm-manually.md │ │ ├── migrate-jboss-eap-to-jboss-eap-on-azure-app-service.md │ │ ├── migrate-jboss-eap-to-jboss-eap-on-azure-vms.md │ │ ├── migrate-jboss-eap-to-vms-with-ha-dr.md │ │ ├── migrate-liberty-to-aks-with-ha-dr.md │ │ ├── migrate-spring-boot-to-app-service.md │ │ ├── migrate-spring-boot-to-azure-container-apps.md │ │ ├── migrate-spring-cloud-to-azure-container-apps.md │ │ ├── migrate-tomcat-to-azure-container-apps.md │ │ ├── migrate-tomcat-to-containers-on-azure-kubernetes-service.md │ │ ├── migrate-tomcat-to-tomcat-app-service.md │ │ ├── migrate-weblogic-to-aks-with-ha-geo-redundancy.md │ │ ├── migrate-weblogic-to-aks-with-keda-scaler-based-on-prometheus-metrics.md │ │ ├── migrate-weblogic-to-aks-within-an-existing-vnet.md │ │ ├── migrate-weblogic-to-azure-kubernetes-service.md │ │ ├── migrate-weblogic-to-azure-vm-manually.md │ │ ├── migrate-weblogic-to-jboss-eap-on-azure-app-service.md │ │ ├── migrate-weblogic-to-virtual-machines.md │ │ ├── migrate-weblogic-to-vms-with-ha-dr.md │ │ ├── migrate-weblogic-with-app-gateway.md │ │ ├── migrate-weblogic-with-elk.md │ │ ├── migrate-weblogic-with-entra-id-via-ldap.md │ │ ├── migrate-websphere-to-azure-kubernetes-service.md │ │ ├── migrate-websphere-to-azure-redhat-openshift.md │ │ ├── migrate-websphere-to-azure-vm-manually.md │ │ ├── migrate-websphere-to-jboss-eap-on-azure-app-service.md │ │ ├── migrate-websphere-to-virtual-machines.md │ │ ├── migrate-websphere-to-vms-with-ha-dr.md │ │ ├── migration-overview.md │ │ └── toc.yml │ ├── sdk/ │ │ ├── async-programming.md │ │ ├── authentication/ │ │ │ ├── credential-chains.md │ │ │ ├── includes/ │ │ │ │ ├── authenticate-azure-services-from-app.md │ │ │ │ └── implement-managed-identity-concepts.md │ │ │ ├── local-development-broker.md │ │ │ ├── local-development-dev-accounts.md │ │ │ ├── local-development-service-principal.md │ │ │ ├── on-premises-apps.md │ │ │ ├── overview.md │ │ │ ├── system-assigned-managed-identity.md │ │ │ └── user-assigned-managed-identity.md │ │ ├── azure-sdk-library-package-index.md │ │ ├── containers-samples.md │ │ ├── get-started-gradle.md │ │ ├── get-started-ide.md │ │ ├── get-started-maven.md │ │ ├── http-client-pipeline.md │ │ ├── includes/ │ │ │ ├── java-aad-samples.md │ │ │ ├── java-container-samples.md │ │ │ ├── java-sql-samples.md │ │ │ └── java-vm-samples.md │ │ ├── index.yml │ │ ├── libraries-drivers-modules.md │ │ ├── logging-jul.md │ │ ├── logging-log4j.md │ │ ├── logging-logback.md │ │ ├── logging-overview.md │ │ ├── lro.md │ │ ├── mermaidjs/ │ │ │ ├── chain-sequence.md │ │ │ ├── chained-token-credential-auth-flow.md │ │ │ ├── default-azure-credential-auth-flow.md │ │ │ ├── default-azure-credential-environment-variable-development.md │ │ │ └── default-azure-credential-environment-variable-production.md │ │ ├── overview.md │ │ ├── pagination.md │ │ ├── proxying.md │ │ ├── security-samples.md │ │ ├── sql-database-samples.md │ │ ├── toc.yml │ │ ├── tracing.md │ │ ├── troubleshooting-authentication-azure-hosted.md │ │ ├── troubleshooting-authentication-dev-env.md │ │ ├── troubleshooting-authentication-multi-tenant.md │ │ ├── troubleshooting-authentication-overview.md │ │ ├── troubleshooting-authentication-service-principal.md │ │ ├── troubleshooting-dependency-version-conflict.md │ │ ├── troubleshooting-messaging-event-hubs-overview.md │ │ ├── troubleshooting-messaging-event-hubs-performance.md │ │ ├── troubleshooting-messaging-event-hubs-processor.md │ │ ├── troubleshooting-messaging-event-hubs-producer.md │ │ ├── troubleshooting-messaging-service-bus-overview.md │ │ ├── troubleshooting-network.md │ │ ├── troubleshooting-overview.md │ │ ├── virtual-machine-samples.md │ │ └── web-apps-samples.md │ ├── spring-framework/ │ │ ├── app-configuration-support.md │ │ ├── authentication.md │ │ ├── auto-configure-azure-sdk-clients.md │ │ ├── configuration-properties-all.md │ │ ├── configuration-properties-azure-active-directory-b2c.md │ │ ├── configuration-properties-azure-app-configuration.md │ │ ├── configuration-properties-azure-cosmos-db.md │ │ ├── configuration-properties-azure-event-hubs.md │ │ ├── configuration-properties-azure-key-vault-certificates.md │ │ ├── configuration-properties-azure-key-vault-secrets.md │ │ ├── configuration-properties-azure-key-vault.md │ │ ├── configuration-properties-azure-service-bus-jms.md │ │ ├── configuration-properties-azure-service-bus.md │ │ ├── configuration-properties-azure-storage-blob.md │ │ ├── configuration-properties-azure-storage-file-share.md │ │ ├── configuration-properties-azure-storage-queue.md │ │ ├── configuration-properties-azure-storage.md │ │ ├── configuration-properties-entra.md │ │ ├── configuration-properties-global.md │ │ ├── configuration.md │ │ ├── configure-spring-app-with-cosmos-db-on-app-service-linux.md │ │ ├── configure-spring-boot-initializer-java-app-with-event-grid.md │ │ ├── configure-spring-boot-initializer-java-app-with-redis-cache.md │ │ ├── configure-spring-boot-starter-java-app-with-azure-active-directory-b2c-oidc.md │ │ ├── configure-spring-boot-starter-java-app-with-azure-key-vault-certificates.md │ │ ├── configure-spring-boot-starter-java-app-with-azure-key-vault.md │ │ ├── configure-spring-boot-starter-java-app-with-azure-service-bus.md │ │ ├── configure-spring-boot-starter-java-app-with-azure-storage.md │ │ ├── configure-spring-boot-starter-java-app-with-cosmos-db.md │ │ ├── configure-spring-boot-starter-java-app-with-entra.md │ │ ├── configure-spring-cloud-stream-binder-java-app-azure-event-hub.md │ │ ├── configure-spring-cloud-stream-binder-java-app-kafka-azure-event-hub.md │ │ ├── configure-spring-cloud-stream-binder-java-app-with-service-bus.md │ │ ├── configure-spring-data-apache-cassandra-with-cosmos-db.md │ │ ├── configure-spring-data-jdbc-with-azure-mysql.md │ │ ├── configure-spring-data-jdbc-with-azure-postgresql.md │ │ ├── configure-spring-data-jdbc-with-azure-sql-server.md │ │ ├── configure-spring-data-jpa-with-azure-mysql.md │ │ ├── configure-spring-data-jpa-with-azure-postgresql.md │ │ ├── configure-spring-data-jpa-with-azure-sql-server.md │ │ ├── configure-spring-data-mongodb-with-cosmos-db.md │ │ ├── configure-spring-data-r2dbc-with-azure-mysql.md │ │ ├── configure-spring-data-r2dbc-with-azure-postgresql.md │ │ ├── configure-spring-data-r2dbc-with-azure-sql-server.md │ │ ├── create-and-configure-managed-identity.md │ │ ├── deploy-applications-to-azure-hosting-environments.md │ │ ├── deploy-passwordless-spring-database-app.md │ │ ├── deploy-spring-boot-java-app-on-kubernetes.md │ │ ├── deploy-spring-boot-java-app-on-linux.md │ │ ├── developer-guide-overview.md │ │ ├── docker-compose-support.md │ │ ├── getting-started-with-spring-cloud-function-in-azure.md │ │ ├── how-to-guides-spring-data-cosmosdb.md │ │ ├── includes/ │ │ │ ├── create-mysql-flexible-server-non-admin-user.md │ │ │ ├── create-postgresql-flexible-server-non-admin-user.md │ │ │ ├── create-postgresql-single-server-non-admin-user.md │ │ │ ├── deploy-to-azure-spring-apps.md │ │ │ ├── introducing-passwordless-connections.md │ │ │ ├── passwordless-sign-in.md │ │ │ ├── prepare-your-local-environment.md │ │ │ ├── prerequisites-azure-cli.md │ │ │ ├── prerequisites-curl.md │ │ │ ├── prerequisites-java.md │ │ │ ├── prerequisites-jq.md │ │ │ ├── prerequisites-maven.md │ │ │ ├── spring-boot-20-note.md │ │ │ ├── spring-cloud-azure-version-note.md │ │ │ ├── spring-data-azure-mysql-flexible-server-setup.md │ │ │ ├── spring-data-azure-mysql-single-server-setup.md │ │ │ ├── spring-data-azure-postgresql-flexible-server-setup.md │ │ │ ├── spring-data-azure-postgresql-single-server-setup.md │ │ │ ├── spring-data-conclusion.md │ │ │ ├── spring-data-create-reactive.md │ │ │ ├── spring-data-jdbc-create-application.md │ │ │ ├── spring-data-jpa-create-application.md │ │ │ ├── spring-data-prerequisites.md │ │ │ ├── spring-data-r2dbc-create-application.md │ │ │ ├── spring-data-r2dbc-create-schema.md │ │ │ ├── spring-data-sql-server-setup.md │ │ │ ├── spring-default-azure-credential-overview.md │ │ │ ├── spring-jms-passwordless-queue.md │ │ │ └── spring-jms-passwordless-topic.md │ │ ├── index.yml │ │ ├── kafka-support.md │ │ ├── media/ │ │ │ └── configure-spring-boot-starter-java-app-with-azure-key-vault-certificates/ │ │ │ └── spring-to-azure-key-vault-certificates.ai │ │ ├── migrate-kafka-to-passwordless-connection.md │ │ ├── migrate-mysql-to-passwordless-connection.md │ │ ├── migrate-postgresql-to-passwordless-connection.md │ │ ├── migrate-sql-database-to-passwordless-connection.md │ │ ├── migration-guide-for-4.0.md │ │ ├── mysql-support.md │ │ ├── native-applications.md │ │ ├── passwordless-authentication.md │ │ ├── postgresql-support.md │ │ ├── production-ready.md │ │ ├── redis-support.md │ │ ├── resource-handling.md │ │ ├── resource-manager.md │ │ ├── secret-management.md │ │ ├── secure-your-restful-api-using-spring-cloud-azure.md │ │ ├── spring-boot-starter-for-entra-developer-guide.md │ │ ├── spring-cloud-azure-overview.md │ │ ├── spring-cloud-stream-support.md │ │ ├── spring-data-support.md │ │ ├── spring-integration-support.md │ │ ├── spring-jms-support.md │ │ ├── spring-jms-troubleshooting-guide.md │ │ ├── spring-messaging-event-hubs-support.md │ │ ├── spring-messaging-service-bus-support.md │ │ ├── spring-messaging-storage-queue-support.md │ │ ├── spring-security-support.md │ │ ├── testcontainers-support.md │ │ ├── toc.yml │ │ ├── using-event-hubs-in-spring-applications.md │ │ ├── using-service-bus-in-spring-applications.md │ │ └── using-storage-queue-in-spring-applications.md │ ├── toolkit-for-eclipse/ │ │ ├── create-hello-world-web-app.md │ │ ├── includes/ │ │ │ ├── additional-resources.md │ │ │ ├── basic-prerequisites.md │ │ │ ├── prerequisites.md │ │ │ └── show-azure-explorer.md │ │ ├── index.yml │ │ ├── installation.md │ │ ├── managing-redis-caches-using-azure-explorer.md │ │ ├── managing-storage-accounts-using-azure-explorer.md │ │ ├── managing-virtual-machines-using-azure-explorer.md │ │ ├── sign-in-instructions.md │ │ └── toc.yml │ └── toolkit-for-intellij/ │ ├── chatgpt-intellij.md │ ├── create-container-apps-intellij.md │ ├── create-hello-world-web-app.md │ ├── hello-world-web-app-linux.md │ ├── includes/ │ │ ├── additional-resources.md │ │ ├── basic-prerequisites.md │ │ ├── prerequisites.md │ │ └── show-azure-explorer.md │ ├── index.yml │ ├── install-toolkit.md │ ├── managing-redis-caches-using-azure-explorer.md │ ├── managing-storage-accounts-using-azure-explorer.md │ ├── managing-virtual-machines-using-azure-explorer.md │ ├── overview.md │ ├── sign-in-instructions.md │ └── toc.yml ├── javascript/ │ ├── TOC.yml │ ├── ai/ │ │ ├── azure-ai-for-javascript-developers.md │ │ ├── chat-app-with-separate-front-back-end.md │ │ ├── generative-ai-for-javascript-developers.md │ │ ├── get-started-app-chat-assistants-function-calling.md │ │ ├── get-started-app-chat-evaluations.md │ │ ├── get-started-app-chat-scaling-with-azure-container-apps.md │ │ ├── get-started-app-chat-template-langchainjs.md │ │ ├── get-started-app-chat-template-llamaindex.md │ │ ├── get-started-app-chat-template.md │ │ ├── includes/ │ │ │ └── get-started-securing-your-ai-app/ │ │ │ ├── clean-up-resources.md │ │ │ ├── explore-sample-code.md │ │ │ ├── get-help.md │ │ │ ├── open-development-environment.md │ │ │ └── visual-studio-code-setup.md │ │ ├── langchain-agent-on-azure.md │ │ └── media/ │ │ └── langchain-agent-on-azure/ │ │ └── mermaid/ │ │ └── azure-architecture-ai-rag-search-vector-store.mmd │ ├── azure-sdk-library-package-index.md │ ├── breadcrumb/ │ │ └── toc.yml │ ├── choose-nodejs-version.md │ ├── core/ │ │ ├── configure-local-development-environment.md │ │ └── test-azure-sdk-integrated-code.md │ ├── graphql-developer-guide.md │ ├── how-to/ │ │ ├── deploy-web-app.md │ │ ├── develop-serverless-apps.md │ │ └── with-visual-studio-code/ │ │ └── clone-github-repository.md │ ├── includes/ │ │ ├── azure-ai-developer-tools.md │ │ ├── javascript-at-microsoft/ │ │ │ └── bullet.md │ │ ├── libraries.md │ │ └── nodejs-runtime-for-azure-services.md │ ├── index.yml │ ├── javascript-zone-pivot-groups.yml │ ├── learn-azure-javascript.md │ ├── logging.md │ ├── node-azure-tools.md │ ├── retired/ │ │ └── do-not-remove │ ├── samples.md │ ├── sdk/ │ │ ├── authentication/ │ │ │ ├── best-practices.md │ │ │ ├── credential-chains.md │ │ │ ├── includes/ │ │ │ │ ├── developer-tooling-javascript.md │ │ │ │ ├── implement-default-azure-credential.md │ │ │ │ ├── implement-local-development-credential.md │ │ │ │ ├── implement-managed-identity-concepts.md │ │ │ │ ├── set-environment-variables-javascript.md │ │ │ │ ├── user-assigned-implement-code-js.md │ │ │ │ └── user-assigned-implement-code-ts.md │ │ │ ├── local-development-broker.md │ │ │ ├── local-development-environment-developer-account.md │ │ │ ├── local-development-environment-service-principal.md │ │ │ ├── on-premises-apps.md │ │ │ ├── overview.md │ │ │ ├── system-assigned-managed-identity.md │ │ │ └── user-assigned-managed-identity.md │ │ ├── azure-sdk-install.md │ │ ├── debug-client-libraries.md │ │ ├── loop-over-data.md │ │ ├── mermaidjs/ │ │ │ ├── chain-sequence.md │ │ │ ├── chained-token-credential-authentication-developer-flow.md │ │ │ ├── chained-token-credential-authentication-flow.md │ │ │ ├── default-azure-credential-authentication-flow.md │ │ │ ├── default-azure-credential-environment-variable-development.md │ │ │ └── default-azure-credential-environment-variable-production.md │ │ ├── test-sdk-integration.md │ │ └── use-azure-sdk.md │ ├── tutorial/ │ │ └── browser-file-upload-azure-storage-blob.md │ └── what-is-azure-for-javascript-development.md ├── jenkins/ │ ├── azure-container-instances-as-jenkins-build-agent.md │ ├── azure-storage-blobs-as-build-artifact-repository.md │ ├── breadcrumb/ │ │ └── toc.yml │ ├── configure-on-linux-vm.md │ ├── deploy-from-github-to-aks.md │ ├── deploy-to-azure-app-service-using-azure-cli.md │ ├── deploy-to-azure-functions.md │ ├── deploy-to-azure-spring-apps-using-azure-cli.md │ ├── deploy-to-linux-vm-using-azure-devops-services.md │ ├── deploy-to-service-fabric-cluster.md │ ├── includes/ │ │ └── jenkins-integration-with-azure.md │ ├── index.yml │ ├── overview.md │ ├── pipeline-with-github-and-docker.md │ ├── plug-ins-for-azure.md │ ├── scale-deployments-using-vm-agents.md │ └── toc.yml ├── pivots.yml ├── python/ │ ├── TOC.yml │ ├── azure-ai-for-python-developers.md │ ├── breadcrumb/ │ │ └── toc.yml │ ├── configure-python-web-app-codespaces.md │ ├── configure-python-web-app-local-environment.md │ ├── configure-python-web-app-on-app-service.md │ ├── containers-in-azure-overview-python.md │ ├── get-started-app-chat-app-load-test-locust.md │ ├── get-started-app-chat-document-security-trim.md │ ├── get-started-app-chat-evaluations.md │ ├── get-started-app-chat-private-endpoint.md │ ├── get-started-app-chat-scaling-with-azure-api-management.md │ ├── get-started-app-chat-scaling-with-azure-container-apps.md │ ├── get-started-app-chat-template.md │ ├── get-started.md │ ├── includes/ │ │ ├── cli-auth-note.md │ │ ├── create-environment-options.md │ │ ├── proxy-note.md │ │ └── resource-group-begin-delete.md │ ├── index.yml │ ├── overview-azd-templates.md │ ├── python-web-app-github-actions-app-service.md │ ├── python-zone-pivot-groups.yml │ ├── quickstart-python-scale-bicep.md │ ├── quickstart-python-web-azd-codespaces.md │ ├── quickstart-python-web-azd-templates.md │ ├── quickstarts-ai-services.md │ ├── quickstarts-app-hosting.md │ ├── quickstarts-data-solutions.md │ ├── quickstarts-identity-security.md │ ├── quickstarts-machine-learning.md │ ├── quickstarts-messaging-iot.md │ ├── quickstarts-other-services.md │ ├── sdk/ │ │ ├── authentication/ │ │ │ ├── additional-methods.md │ │ │ ├── credential-chains.md │ │ │ ├── local-development-broker.md │ │ │ ├── local-development-dev-accounts.md │ │ │ ├── local-development-service-principal.md │ │ │ ├── on-premises-apps.md │ │ │ ├── overview.md │ │ │ ├── system-assigned-managed-identity.md │ │ │ └── user-assigned-managed-identity.md │ │ ├── authorization/ │ │ │ └── overview.md │ │ ├── azure-sdk-configure-proxy.md │ │ ├── azure-sdk-install.md │ │ ├── azure-sdk-library-package-index.md │ │ ├── azure-sdk-library-usage-patterns.md │ │ ├── azure-sdk-logging.md │ │ ├── azure-sdk-overview.md │ │ ├── azure-sdk-sovereign-domain.md │ │ ├── examples/ │ │ │ ├── azure-sdk-example-database.md │ │ │ ├── azure-sdk-example-list-resource-groups.md │ │ │ ├── azure-sdk-example-resource-group.md │ │ │ ├── azure-sdk-example-storage-use.md │ │ │ ├── azure-sdk-example-storage.md │ │ │ ├── azure-sdk-example-virtual-machines.md │ │ │ ├── azure-sdk-example-web-app.md │ │ │ └── azure-sdk-samples-managed-disks.md │ │ ├── fundamentals/ │ │ │ ├── common-types-response.md │ │ │ ├── errors.md │ │ │ ├── http-pipeline-retries.md │ │ │ ├── language-design-guidelines.md │ │ │ └── overview.md │ │ ├── includes/ │ │ │ ├── authenticate-azure-services-from-app.md │ │ │ ├── sdk-auth-overview-dev-accounts.md │ │ │ ├── sdk-auth-overview-dev-service-principals.md │ │ │ ├── sdk-auth-overview-managed-identity.md │ │ │ └── sdk-auth-overview-service-principal.md │ │ └── mermaidjs/ │ │ ├── chain-sequence.md │ │ ├── chained-token-credential-authentication-flow.md │ │ ├── default-azure-credential-authentication-flow.md │ │ ├── default-azure-credential-environment-variable-development.md │ │ ├── default-azure-credential-environment-variable-production.md │ │ └── default-azure-credential-excludes.md │ ├── tutorial-containerize-deploy-python-web-app-azure-01.md │ ├── tutorial-containerize-deploy-python-web-app-azure-02.md │ ├── tutorial-containerize-deploy-python-web-app-azure-03.md │ ├── tutorial-containerize-deploy-python-web-app-azure-04.md │ ├── tutorial-containerize-deploy-python-web-app-azure-05.md │ ├── tutorial-containerize-simple-web-app-for-app-service.md │ ├── tutorial-containerize-simple-web-app.md │ ├── tutorial-deploy-python-web-app-azure-container-apps-01.md │ ├── tutorial-deploy-python-web-app-azure-container-apps-02.md │ ├── tutorial-deploy-python-web-app-azure-container-apps-03.md │ ├── tutorial-python-managed-identity-cli.md │ ├── tutorial-python-managed-identity-user-assigned-cli.md │ ├── walkthrough-tutorial-authentication-01.md │ ├── walkthrough-tutorial-authentication-02.md │ ├── walkthrough-tutorial-authentication-03.md │ ├── walkthrough-tutorial-authentication-04.md │ ├── walkthrough-tutorial-authentication-05.md │ ├── walkthrough-tutorial-authentication-06.md │ └── walkthrough-tutorial-authentication-07.md ├── rust/ │ ├── TOC.yml │ ├── azure-sdk-library-package-index.md │ ├── developer-environment.md │ ├── includes/ │ │ ├── prerequisites.md │ │ └── resources.md │ ├── index.yml │ ├── sdk/ │ │ ├── authentication/ │ │ │ └── overview.md │ │ ├── azure-core-types.md │ │ ├── installation.md │ │ ├── logging.md │ │ ├── overview.md │ │ └── use-crates.md │ └── what-is-azure-for-rust-developers.md ├── terraform/ │ ├── authenticate-to-azure-with-managed-identity-for-azure-services.md │ ├── authenticate-to-azure-with-microsoft-account.md │ ├── authenticate-to-azure-with-service-principle.md │ ├── authenticate-to-azure.md │ ├── azure-export-for-terraform/ │ │ ├── export-advanced-scenarios.md │ │ ├── export-first-resources.md │ │ ├── export-resources-hcl.md │ │ ├── export-terraform-concepts.md │ │ ├── export-terraform-overview.md │ │ ├── get-started-export-resources-portal.md │ │ ├── resource-provider-overview.md │ │ └── select-custom-resources.md │ ├── best-practices-compliance-testing.md │ ├── best-practices-end-to-end-testing.md │ ├── best-practices-integration-testing.md │ ├── best-practices-testing-overview.md │ ├── breadcrumb/ │ │ └── toc.yml │ ├── comparing-terraform-and-bicep.md │ ├── concept-azapi-data-plane-framework.md │ ├── configure-avd-network-settings.md │ ├── configure-avd-rbac.md │ ├── configure-azure-virtual-desktop.md │ ├── configure-vs-code-extension-for-terraform.md │ ├── create-avd-azure-compute-image-gallery.md │ ├── create-avd-azure-files-storage.md │ ├── create-avd-log-analytics-workspace.md │ ├── create-avd-session-host.md │ ├── create-network-watcher-nsg-flow-logs.md │ ├── create-resource-group.md │ ├── create-vm-scaleset-network-disks-hcl.md │ ├── create-vm-scaleset-network-disks-using-packer-hcl.md │ ├── deploy-azure-cosmos-db-to-azure-container-instances.md │ ├── deploy-postgresql-flexible-server-database.md │ ├── firewall-upgrade-premium.md │ ├── get-started-azapi-data-plane-resource.md │ ├── get-started-azapi-resource-action-mutation.md │ ├── get-started-azapi-resource-action.md │ ├── get-started-azapi-resource-list.md │ ├── get-started-azapi-resource.md │ ├── get-started-azapi-update-resource.md │ ├── get-started-cloud-shell-bash.md │ ├── get-started-cloud-shell-powershell.md │ ├── get-started-windows-bash.md │ ├── get-started-windows-powershell.md │ ├── how-to-migrate-between-azurerm-and-azapi.md │ ├── how-to-use-azapi-preflight-validation.md │ ├── how-to-use-azapi-provider-functions.md │ ├── how-to-use-terraform-vscode-extension.md │ ├── hub-spoke-hub-network.md │ ├── hub-spoke-hub-nva.md │ ├── hub-spoke-introduction.md │ ├── hub-spoke-on-prem.md │ ├── hub-spoke-spoke-network.md │ ├── hub-spoke-validation.md │ ├── includes/ │ │ ├── abstract.md │ │ ├── comparing-terraform-and-bicep-integration-features.md │ │ ├── comparing-terraform-and-bicep-usability-features.md │ │ ├── configure-terraform.md │ │ ├── confirm-default-azure-subscription-or-authenticate.md │ │ ├── create-vm.md │ │ ├── environment-variables-notes.md │ │ ├── install-latest-version.md │ │ ├── install-terraform-on-windows.md │ │ ├── terraform-apply-plan.md │ │ ├── terraform-init.md │ │ ├── terraform-plan-destroy.md │ │ ├── terraform-plan-notes.md │ │ ├── terraform-plan-recreate.md │ │ └── terraform-plan.md │ ├── index.yml │ ├── media/ │ │ └── overview-azapi-provider/ │ │ └── placeholder.txt │ ├── overview-azapi-provider.md │ ├── overview.md │ ├── provider-selection-azurerm-vs-azapi.md │ ├── provider-version-history-azurerm-0-1-0-to-0-3-3.md │ ├── provider-version-history-azurerm-1-0-0-to-1-44-0.md │ ├── provider-version-history-azurerm-2-0-0-to-2-99-0.md │ ├── provider-version-history-azurerm-3-0-0-to-3-116-0.md │ ├── provider-version-history-azurerm-4-0-0-to-current.md │ ├── provision-infrastructure-using-azure-deployment-slots.md │ ├── quickstart-configure.md │ ├── services/ │ │ └── azurerm.json │ ├── store-state-in-azure-storage.md │ ├── terraform-handler-for-azure-copilot/ │ │ └── generate-terraform-configuration-using-copilot.md │ ├── toc.yml │ └── troubleshoot.md └── typespec/ ├── TOC.yml ├── includes/ │ └── quickstart/ │ ├── file-structure-csharp.md │ ├── file-structure-typescript.md │ ├── prereqs-csharp.md │ └── prereqs-typescript.md ├── index.yml ├── mermaid/ │ ├── tool-chain.mmd │ └── typespec-workflow.mmd ├── overview.md ├── quickstart-scaffold-dotnet.md ├── quickstart-scaffold-typescript.md └── resources.md ================================================ FILE CONTENTS ================================================ ================================================ FILE: .acrolinx-config.edn ================================================ {:allowed-branchname-matches ["main" "master" "release-.*"] :allowed-filename-matches ["articles" "includes" "javascript"]} ================================================ FILE: .gitattributes ================================================ # Set the default behavior, in case people don't have core.autocrlf set. * text=auto # Explicitly declare text files you want to always be normalized and converted # to native line endings on checkout. *.c text *.h text # Include Markdown in the GitHub language breakdown statistics *.md linguist-detectable # Denote all files that are truly binary and should not be modified. *.gif binary *.ico binary *.jpg binary *.png binary # Declare files that will always have CRLF line endings on checkout. *.sln text eol=crlf ================================================ FILE: .github/copilot-instructions.md ================================================ --- ms.author: johalexander ms.date: 09/05/2025 title: Copilot Instructions applyTo: "articles/**/*.md" --- # Copilot Instructions This file provides central guidance for Copilot in this repository. The Azure Developer Experiences documentation repository contains Microsoft's technical documentation for application development using Microsoft Azure that publishes to Microsoft Learn. This is a documentation-only repository using Microsoft's OpenPublishing platform with DocFX for building content. ## Referenced Instruction Files - [.github/instructions/rust-instructions.md](.github/instructions/rust-instructions.md) - [.github/instructions/azd-schema-instructions.md](.github/instructions/azd-schema-instructions.md) - [.github/instructions/java-instructions.md](.github/instructions/java-instructions.md) - [.github/instructions/java-sample-guidelines.md](.github/instructions/java-sample-guidelines.md) ## Disclosure For any Markdown files generated by AI, always disclose that they were created with the assistance of AI. Add the following frontmatter key/value pair: ```markdown ai-usage: ai-generated ``` ## Writing Style Follow [Microsoft Writing Style Guide](https://learn.microsoft.com/en-us/style-guide/welcome/) with these specifics: ### Voice and Tone - Active voice, second person addressing reader directly. - Conversational tone with contractions. - Present tense for instructions/descriptions. - Imperative mood for instructions ("Call the method" not "You should call the method"). - Use "might" instead of "may" for possibility. - Use "can" instead of "may" for permissible actions. - Avoid "we"/"our" referring to documentation authors or product teams. ### Structure and Format - Sentence case headings (no gerunds in titles). - Be concise, break up long sentences. - Oxford comma in lists. - Use bullets for unordered lists. - Number all ordered list items as "1." (not sequential numbering like "1.", "2.", "3.", etc.) - Ordered and unordered lists should use complete sentences with proper punctuation, ending with a period if it's more than three words. - Avoid "etc." or "and so on" - provide complete lists or use "for example". - Use "for example" instead of "e.g.". - Use "that is" instead of "i.e.". - No consecutive headings without content between them. ### Formatting Conventions - **Bold** for UI elements. - `Code style` for file names, folders, custom types, non-localizable text. - Raw URLs in angle brackets. - Use relative links for files in this repo. - Remove `https://learn.microsoft.com/en-us` from learn.microsoft.com links. ## File Naming New Markdown files: lowercase with hyphens, omit filler words (the, a, etc.). ## General Guidance - Always check for and follow the latest instructions in `.github/instructions/`. - Do not change the meaning of the original content unless explicitly instructed. --- _Note: Add new instruction files to `.github/instructions/` and reference them under Referenced Instruction Files as needed._ ================================================ FILE: .github/instructions/azd-schema-instructions.md ================================================ --- applyTo: "articles/azure-developer-cli/azd-schema.md" --- # azure.yaml schema documentation conventions This instruction file defines the structure and conventions for the `azd-schema.md` reference page. Follow these rules when updating the page to ensure incremental, non-destructive edits. ## Source of truth The JSON schema published at (source: `https://raw.githubusercontent.com/Azure/azure-dev/main/schemas/v1.0/azure.yaml.json`) is the single source of truth. All property names, types, descriptions, enum values, and defaults in the documentation must match the schema. A local copy is kept at `articles/azure-developer-cli/source-schema.json` to serve as a baseline for diffing against newer versions. ## Update workflow 1. Fetch the latest schema from `https://raw.githubusercontent.com/Azure/azure-dev/main/schemas/v1.0/azure.yaml.json`. 1. Diff it against the local `articles/azure-developer-cli/source-schema.json` to identify changes (added properties, removed enum values, updated descriptions, new definitions). 1. Apply only the corresponding targeted edits to `azd-schema.md`. Don't regenerate the entire file. 1. Replace `source-schema.json` with the fetched version so it stays current for future diffs. 1. Preserve all existing structure, heading hierarchy, and section ordering. ## Page structure (do not reorder) 1. Frontmatter (YAML) 1. H1: title 1. Intro paragraph with template link and schema link 1. `## Sample` — introductory YAML examples 1. `## Top-level properties` — summary table with anchor links 1. One `## {propertyName}` section per top-level property, in the order they appear in the schema's `properties` object: `name`, `resourceGroup`, `metadata`, `infra`, `services`, `resources`, `pipeline`, `hooks`, `requiredVersions`, `state`, `platform`, `workflows`, `cloud` 1. Within `## services`, include `#### docker` and `#### k8s` subsections for the shared Docker and AKS definitions (from the schema's `definitions` section). These are service-level properties nested under `### Service properties`, not top-level. 1. Include footer and `## Next steps` ## Section template Every property section follows this exact pattern: ````markdown ## `{propertyName}` _(type, required/optional)_ {Description from schema, verbatim or minimally adapted for grammar.} | Property | Required | Type | Description | | --- | --- | --- | --- | | `{childProp}` | Y/N/Conditional | {type} | {Description}. Default: `{value}`. Allowed values: `a`, `b`. | > [!NOTE] > {Conditional constraint note, if applicable.} ### {Sub-section for nested objects} {Same table pattern.} ### {propertyName} samples (if examples exist) ```yaml {YAML example} ``` ```` ## Table conventions - Column order: Property, Required, Type, Description. - Use `Y`, `N`, or `Conditional` in the Required column. - Include `Default: {value}.` at the end of the description when a default exists. - Include `Allowed values: {comma-separated list}.` at the end of the description when an enum exists. - Use `array of strings` for `{ "type": "array", "items": { "type": "string" } }`. - Use `object` for complex nested types, with a "See [link](#anchor)" reference. - Don't add a Type column entry for `$ref` — resolve the reference and document inline or link to the definition section. ## Description conventions - Use schema `description` text verbatim when possible. - Adapt only for grammar (for example, sentence fragments become complete sentences). - Replace "e.g." with "for example" and "i.e." with "that is". - Don't paraphrase or rewrite descriptions that are already clear. - Use "can't" not "cannot", contractions per Microsoft style guide. ## Conditional schema (allOf/if/then) conventions - Document constraints as `> [!NOTE]` blocks below the relevant table. - For host-type applicability, use the "Host types" matrix table. - For resource-type applicability, use the "Resource types" table with a link to sub-sections. - State constraints in plain language: "When `host` is `containerapp`, you must provide either `image` or `project`, but not both." ## YAML examples - Include one YAML code block per section, showing the property in context. - Use realistic but generic values (not placeholder `xxx`). - Keep examples minimal — show the property being documented plus necessary parent structure. - Use `yaml` as the code fence language. ## What NOT to change during updates - Frontmatter fields other than `ms.date` (update the date on each edit). - The intro paragraph and Sample section (unless the schema `title` or `description` changes). - Section ordering. - The `## Next steps` section. - Cross-reference links to other docs (for example, `azd-extensibility.md`). ================================================ FILE: .github/instructions/java-instructions.md ================================================ --- ms.author: karler ms.date: 03/31/2026 title: Copilot Instructions for Java on Azure description: "Central instructions for Copilot tasks for Java on Azure content." applyTo: "articles/java/**/*.md" --- # Copilot instructions for all Java language content Use the following instructions when creating, editing, or reviewing articles that include the Java programming language. ## Product and feature naming - **GitHub Copilot modernization** is the correct product name (lowercase "modernization"). The old name "GitHub Copilot app modernization" is deprecated. The folder `articles/github-copilot-app-modernization` retains "app" for URL stability, but all content must use the current name. - **Spring Cloud Azure** is the product name for the Spring integration libraries documented in `articles/java/spring-framework`. Don't confuse with "Spring Cloud" (a third-party product unrelated to Azure). - **Azure SDK for Java** is the full name on first reference. Subsequent references can use "the SDK" or "the Java SDK" when unambiguous. - **Microsoft Build of OpenJDK** is the full product name for Microsoft's JDK distribution. ## JDK version guidance - Target **Java 21** (current LTS) as the recommended baseline for new content. - Don't introduce Java 8 or Java 11 as prerequisites in new articles unless specifically required by the service or scenario. - When an article must reference older Java versions, note the relevant end-of-support timelines and recommend upgrading. - Java 25 is the current latest release. New content should prefer Java 21 LTS but can target Java 25 where appropriate. - For PRs that update articles targeting pre-Java 21 versions, suggest considering an update to Java 21+ but don't block the PR on it. - Every article with Java prerequisites must explicitly list the minimum Java version in the **Prerequisites** section (for example, "Java 21 or later"). Don't assume the reader will infer the version from other context. ## Authentication and identity - Prefer `DefaultAzureCredential` over other credential types unless the article specifically covers an alternative authentication flow. - Prefer Azure Identity over connection strings, keys, or other non-identity-based authentication. - Use Azure Key Vault for secrets management rather than hardcoding or environment variables where feasible. ## Spring Boot version guidance - Target **Spring Boot 3.x** (current latest) for new content. Spring Boot 3.x requires Java 17+, which aligns with the Java 21 baseline. - Don't introduce Spring Boot 2.7.x in new articles — it reached end of OSS support in November 2023. When an existing article references Spring Boot 2.7.x, note the end-of-support status and suggest upgrading. - For PRs that update Spring Boot 2.7.x articles, suggest considering an update to Spring Boot 3.x but don't block the PR on it. - When an article targets a specific Spring Boot version, document the minimum Java version in the **Prerequisites** section: | Spring Boot | Minimum Java | Recommended | | --- | --- | --- | | 3.2.x, 3.1.x, 3.0.x | Java 17 | Java 17 or 21 | | 2.7.x (end-of-life) | Java 8 | Java 11 or 17 | ## Spring Cloud Azure conventions - Spring Cloud Azure packages use the group ID `com.azure.spring`. - Starter artifact IDs follow the pattern `spring-cloud-azure-starter-`, for example `spring-cloud-azure-starter-storage-blob`. - Always reference the Spring Cloud Azure BOM (`spring-cloud-azure-dependencies`) for dependency management rather than specifying individual library versions. ## Code samples - When reviewing or creating Java code samples, also follow guidelines in [java-sample-guidelines.md](java-sample-guidelines.md). ## Metadata - The `title` metadata value in YAML front matter uses **title capitalization** (capitalize principal words). This is distinct from content headings (H1–H6), which use **sentence capitalization** per Learn style guide. - Ensure `ms.custom` includes `devx-track-java` for all Java articles. - AI-related Java articles (content *about* AI) should have `ms.update-cycle: 180-days`, except in `articles/github-copilot-app-modernization/` where this value is inherited from `articles/docfx.json`. ## AI-usage metadata - `ai-usage: ai-generated` — for articles or code entirely produced by AI. - `ai-usage: ai-assisted` — for articles or code where AI contributed but a human made key decisions (for example, an AI-generated Java version of a human-written JavaScript sample). - When reviewing PRs, if new content lacks an `ai-usage` value and appears to contain AI-generated or AI-assisted content, flag its absence so the author can choose the appropriate value. - An existing `ai-generated` value should not be downgraded to `ai-assisted` unless the article has been substantially rewritten by a human. ================================================ FILE: .github/instructions/java-sample-guidelines.md ================================================ --- ms.author: karler ms.date: 03/31/2026 title: Java Sample and Snippet Guidelines description: "Guidelines for reviewing and creating Java code samples in Azure documentation." applyTo: "articles/java/**/*.md" --- # Java sample and snippet guidelines Use these guidelines when reviewing or creating Java code samples, sample repo READMEs, and documentation articles. These guidelines are designed to be portable across contexts — the same guidance applies whether you're creating a Java sample, writing the sample's README, or authoring the Learn documentation that references it. ## Audience and context These guidelines apply differently depending on the output context: - **Sample repo README**: The audience is experienced Java developers who prefer minimal ceremony. A README should provide concise, complete setup instructions without exploratory discussion. Readers may discover the repo independently and follow the README instead of the corresponding documentation article. - **Documentation article (Learn)**: The audience is the same experienced developers, but the article provides more context, explanation, and exploration of the code. The article may walk through key code highlights, explain architectural decisions, and offer variations. - **PR review**: When reviewing others' Java contributions, provide rationales with suggestions. Distinguish between blocking issues (bugs, credential leaks) and best-practice suggestions. When generating a Java version of an existing sample in another language, these guidelines steer all three outputs: the Java code itself, the sample repo README, and the documentation article. ## Shell and command conventions - Java on Azure content assumes readers are using Bash. Use `bash` as the fenced code block language label for shell commands. This implicitly supports other Bash-compatible shells (zsh, Git Bash on Windows, etc.). - Exception: when a code block contains any Azure CLI commands (`az ...`), use `azurecli` as the language label instead. This is an org-wide guideline for proper syntax highlighting of Azure CLI, even if the same block also contains non-CLI Bash lines. - Avoid PowerShell-specific syntax in command snippets. If a command must differ across shells, provide only the Bash version. ## Project naming conventions - Use `com.example.` for `groupId` and package names in documentation samples. The `com.example` domain is [IANA-reserved](https://www.rfc-editor.org/rfc/rfc2606) specifically for examples, so it signals "sample code" unambiguously. The `` groups related samples (for example, all Azure AI Search samples could share `com.example.search`). - Align the Java package name to the `groupId`. For example, if `groupId` is `com.example.search`, source files should be under `src/main/java/com/example/search/` with `package com.example.search;`. - The `artifactId` should describe the sample concisely — for example, `vector-search-quickstart`, `rag-chatbot`, `ai-search-tutorial`. Using the article type (quickstart, tutorial, etc.) is fine when it applies, but isn't mandatory. - Don't use Azure SDK namespaces like `com.azure.*` for sample project coordinates. Reserve `com.azure` for actual SDK packages — using it in samples could mislead readers into thinking the sample is an official package. ## Dependencies and build configuration - Use the latest non-beta versions for all dependencies in `pom.xml`. Beta SDK dependencies may be rejected or removed by content owners and can break without notice. - Don't use beta Azure SDK dependencies in shipped samples. If a feature requires a beta SDK, note the beta status prominently and plan to update when GA is available. - Keep `pom.xml` dependencies minimal. Don't add libraries that aren't used in the sample. Every additional dependency increases maintenance burden and potential version conflicts. - Prefer built-in JDK functionality over third-party libraries when the built-in approach is reasonable. For example, prefer `java.net.http.HttpClient` over Apache HttpClient, and prefer `SearchDocument` (dynamic map) over typed POJOs with Jackson annotations when full type safety isn't needed. When required functionality isn't built into the JDK or available through existing Azure SDK dependencies, use the most common third-party library for the task (for example, Jackson for JSON parsing). Always use the latest stable version for security and compatibility. - Use the Azure SDK BOM (`azure-sdk-bom`) for Azure dependency version management rather than specifying individual versions. - For Spring Cloud Azure projects, use the Spring Cloud Azure BOM (`spring-cloud-azure-dependencies`). - For single-entry-point samples, configuring `mainClass` in `exec-maven-plugin` is acceptable — it simplifies run commands to just `mvn exec:java`. For multi-entry-point samples, omit the plugin configuration and specify the entry point on each command: `mvn exec:java "-Dexec.mainClass=..."`. Don't configure a "default" entry point in multi-entry-point samples — it privileges one scenario over others. - Don't use interactive menus or prompts for scenario selection within a sample. Use separate entry points or command-line arguments — interactive menus add complexity, can't be scripted, and make article instructions harder to write. - Include `slf4j-nop` as a dependency to suppress SLF4J logging noise in console output. This keeps the actual program output clean and allows article output snippets to accurately reflect what the user sees. - Use standard Maven project layout (`src/main/java` for sources, `src/main/resources` for resources). Don't override `` in the POM to use non-standard paths — it confuses IDE auto-detection and breaks developer expectations. - Add brief comments in `pom.xml` describing the purpose of each dependency, especially for dependencies whose purpose isn't obvious from the artifact name. For example, `` on `slf4j-nop` is helpful. ## Repository hygiene - Never commit Java build artifacts. Include a `.gitignore` with at least the following Java-specific entries: ```gitignore target/ *.class *.jar .idea/ *.iml ``` Non-Java content owners using AI to generate Java samples may not be familiar with Java build output conventions. - Java source files and shell scripts should use LF line endings. Include a `.gitattributes` file in the sample root with `*.java text eol=lf` and `*.sh text eol=lf` to prevent CRLF issues when contributors use Windows. ## Configuration and secrets - Use `application.properties` for non-sensitive configuration (endpoints, index names, resource names). - Use environment variables for sensitive configuration (connection strings, keys, secrets). - Use `export` for all environment variables that Java code reads via `System.getenv`. The inline Bash pattern (`VAR=x command`) is valid but fragile across platforms, unfamiliar to many readers, and may not work reliably on all shells (particularly zsh on macOS). Using `export` also ensures variables persist across multiple shell windows and subsequent commands. - Use `System.getenv` to read environment variables. Don't use `.env` files with third-party libraries like `dotenv-java` — it adds an unnecessary dependency and introduces a non-standard configuration pattern for Azure documentation. - When a multi-language sample uses `azd up` (Azure Developer CLI) to provision resources and generate a `.env` file, the Java setup instructions should direct the reader to source the `.env` file into the shell environment rather than reading it in Java code. Use `set -a && source .env && set +a` — the `set -a` ensures variables are exported to child processes (including the Maven JVM), so `System.getenv` works without any code changes or additional dependencies. This approach is more robust than `export $(grep -v '^#' .env | xargs)`, which breaks on values with spaces, special characters, or empty values. In a **README**, this is typically a single step; in a **documentation article**, briefly explain what `set -a` does for readers unfamiliar with the idiom. - Don't hardcode service endpoints or resource names in Java source code. Always externalize them to `application.properties` or environment variables so readers can substitute their own values. - In `application.properties` files committed to repos, always use placeholder notation: `azure.search.endpoint=https://.search.windows.net`. Never commit real Azure endpoints or credentials. ## Code style and formatting - Use 4-space indentation for block nesting. For continuation lines (long method chains, wrapped parameter lists), 8-space (double) indentation is acceptable and is standard Java convention — it visually distinguishes continuations from new nested blocks. - Aim to keep lines short enough that the code block doesn't show a horizontal scrollbar. Around 80 characters is a good target, but it's a soft guideline. If one or two lines slightly exceed 80 characters, that's fine — avoid awkward splits where a long line breaks just before 80 characters leaving a very short continuation. Either keep it on one slightly longer line, or split earlier so both lines are balanced. - Target Java 21+ syntax conventions for new content: prefer text blocks (triple-quote `"""` for multi-line strings), `var` for local type inference when the type is obvious, records for simple data carriers, and pattern matching. Actively use these features — targeting Java 21 but writing Java 8-style code misses the pedagogical opportunity to demonstrate modern Java. Older content targeting earlier Java versions is acceptable on a case-by-case basis — if a PR updates an article that targets a pre-21 version, flag it as a suggestion to consider updating to Java 21+, but don't block the PR on it. - Follow standard Java naming conventions: `camelCase` for variables and methods, `PascalCase` for classes and interfaces. - Use descriptive, self-documenting names for methods and variables. Avoid abbreviations or cryptic naming. - Place `main` methods at the bottom of class definitions — they are typically thin wrappers and serve infrastructural rather than pedagogical purposes. - Add `System.exit(0)` at the end of `main` to avoid thread persistence warnings. - Avoid Unicode emoji in console output. Some terminals, CI environments, and log viewers don't render them correctly. Use plain text labels or simple ASCII formatting instead. ## Code comments - Prefer self-documenting method and variable names over comments. Add code comments only for non-obvious logic, disambiguation, or security-relevant patterns. - Note security-relevant patterns in code comments so readers understand why the code exists — for example, why a field name is validated before interpolation into a query. - Javadoc comments on public methods and decorative section separators (such as `// ── Section ───`) are author's discretion. Don't flag them in reviews unless they are misleading, incorrect, or stale. - Don't add comments that merely restate the code (such as `// Create a Cosmos client` above `createCosmosClient()`). ## Error handling - Let exceptions propagate naturally in sample code. An uncaught exception with a stack trace on the command line is more informative for the reader than a caught-and-logged exception, and avoids the visual noise of production-style try/catch blocks. - Use `try-with-resources` for `Closeable` resources (SDK clients, streams, connections). This is idiomatic Java, costs no extra lines, and prevents resource leaks. - If you do catch exceptions, never swallow them silently (`catch (Exception e) {}`). But in most sample code, catching is unnecessary — the target audience is experienced Java developers who will add their own error handling in production. - For sensitive operations (credential handling, irreversible actions like data deletion), a brief code comment noting potential failure modes is appropriate. Full try/catch blocks are not. ## Security and input validation - When building queries from user input or environment variables, validate or parameterize inputs. Never interpolate raw strings into SQL or query expressions. - Note security-relevant patterns in code comments so readers understand the rationale — for example, why a field name is validated before being interpolated into a Cosmos DB SQL query. This is especially important because readers may copy code patterns without understanding the security implications. - Don't implement custom cryptographic operations or roll-your-own security measures in samples. For authentication and authorization, use established SDK patterns like `DefaultAzureCredential`. ## Azure SDK patterns - Use the builder pattern for creating Azure SDK clients: `new ClientBuilder()...buildClient()`. - Close or manage lifecycle of async clients appropriately. - Prefer synchronous clients in samples unless the article specifically covers async patterns or reactive programming. ## Output formatting - Prefer `System.out.printf()` with `%n` for line terminators when formatting output with embedded variables. `System.out.println()` with simple trailing concatenation (such as `"Connected to: " + name`) is acceptable when there's a single variable at the end — don't enforce `printf` everywhere. - When displaying document fields that might be null, use a fallback to avoid printing the literal string "null" in console output: `document.get("Field") != null ? document.get("Field") : "N/A"`. Article output snippets should show clean, reader-friendly results. - Consider printing a diagnostic echo at startup showing the configured endpoint and resource names. This helps readers verify their configuration is correct and makes article output snippets more informative. - Isolate large data (embedding vectors, bulk document arrays, test datasets) into dedicated classes or `static final` constants. This keeps `main()` methods and pedagogical code readable. ## Imports - Show required imports in the first code block of a sample. Don't force readers to guess the import statements. - For inline snippets (not full samples), imports can be omitted if the fully qualified class name is used or the context is clear. ## Project setup for copy-paste-run This pattern is primarily used in documentation articles where the reader creates project files step by step. - Provide instructions where the user creates the folder structure, adds the `pom.xml` file with full provided contents, and adds individual code files. - Don't use the `mvn archetype:generate` command, which produces a simple project that requires editing and confuses the setup narrative. - After adding the `pom.xml` and before any source files exist, direct the user to run `mvn dependency:resolve` to verify that dependencies are available. This validates the POM without attempting to compile nonexistent source. - After adding a new class file with its own `main` method, direct the user to run: `mvn compile exec:java "-Dexec.mainClass="` (for example, `com.example.search.CreateIndex`). Quote the full `-D` argument rather than just the value — `"-Dexec.mainClass=..."` is more reliable across shells (bash, zsh, PowerShell) than `-Dexec.mainClass="..."`. ## Project setup for clone-and-explore This pattern applies to both sample repo READMEs and documentation articles, with differences in detail level. - Direct the user to clone the sample repo and navigate to the project folder. - After the user configures `application.properties` (or environment variables, or sources the `.env` file), direct them to run `mvn compile` as a setup verification step. This catches configuration errors (typos in endpoints, missing properties) early, before the reader invests time in individual scenarios. - **In a README**: keep the run commands concise — `mvn exec:java "-Dexec.mainClass=..."` is sufficient after the upfront `mvn compile`, since the audience is expected to understand that recompilation is needed if they modify the code. - **In a documentation article**: use `mvn compile exec:java "-Dexec.mainClass=..."` for each run command. Including `compile` costs essentially nothing (Maven's incremental compilation skips unchanged sources) and ensures that readers who experiment by modifying the code get a fresh build when they copy-paste the run command. - For experienced Java developers, consider listing dependencies as a concise bulleted list (name + version) rather than showing the full `pom.xml` XML. The full POM is appropriate when build properties or plugin configuration need explanation. - Don't use `mvn clean dependency:copy-dependencies` for setup. The `dependency:copy-dependencies` goal copies JARs to `target/dependency/`, which isn't used by `exec:java` and is an unusual Maven idiom. Use `mvn compile` instead — it's a better smoke test that validates both dependencies and source. ## Sample structure and architecture ### Aligning to multi-language coverage - When creating Java coverage for an article that already has samples in other languages, structurally align to the existing coverage: same files, same class names, same variable names, same method decomposition — but following Java conventions and making practical exceptions for idiomatic Java and language-specific structural requirements. ### New Java samples (no existing parallel coverage) - Avoid monolithic classes and methods. Strive for a reasonable balance of DRY encapsulation and snippet readability. - Encapsulate the key features for pedagogical illustration in well-named, self-documenting methods with well-named, self-documenting variables. These methods should focus on the pedagogy and be suitable for displaying in their entirety as documentation snippets. - Encapsulate basic infrastructural parts of the sample (parts that don't need to appear in the article) in separate methods and, where appropriate, separate classes. - For samples that cover multiple parallel feature usage scenarios, use separate classes with their own `main` method entry points, each referenced via `mvn compile exec:java`. These separate classes can share a single utility class for infrastructure concerns such as reading environment variables. ### Clone-and-explore pattern - When articles instruct readers to clone a sample repo and then discuss highlights, structure the sample so that pedagogically important code is in self-contained, well-named methods that can be shown as complete snippets in the article. Infrastructure and boilerplate should be in separate methods or classes that the article doesn't need to display. ## README and documentation conventions - Every fenced code block in a README or documentation article should be copy-paste-able as-is for at least one complete scenario, or require only minimal modification such as replacing placeholders. Don't combine multiple alternative commands in a single code block — separate them into distinct blocks with explanatory text. - In READMEs, prerequisite links are optional but helpful. In documentation articles, prerequisite items should always link to the relevant setup instructions. ## PR review guidance When reviewing Java samples in pull requests, provide rationales with suggestions so the PR author can make informed decisions. These guidelines are suggestions, not blockers — the PR author or content owner has final say. - **Distinguish between blocking issues and suggestions.** Blocking: real bugs, credential leaks, broken code. Suggestion: style improvements, dependency preferences, structural patterns. - **Provide context for suggestions.** For example: "Consider using `System.getenv` instead of `dotenv-java` — it avoids a third-party dependency and follows the Azure documentation convention for Java samples." - **Respect existing sample alignment.** If the PR creates a Java version of an existing sample in another language, the structural alignment to that sample takes priority over these guidelines. Only flag divergences that would cause functional issues or significantly harm readability. - **For unfamiliar PRs** (where you don't know if the sample is generated from an existing one or is new), note that your suggestions are based on Java documentation best practices and that the author should consider them in context. ================================================ FILE: .github/instructions/mcp-instructions-managed-lustre.md ================================================ # ============================================================================= # MANAGED LUSTRE SERVICE-SPECIFIC INSTRUCTIONS # ============================================================================= # These instructions apply ONLY to Managed Lustre example prompts. # They are based on PR review feedback from the Azure Managed Lustre team. # Source: https://github.com/MicrosoftDocs/azure-dev-docs-pr/pull/8353 # ============================================================================= ## TERMINOLOGY REQUIREMENTS ### Use "job" for import, auto-import, and auto-export entities The Managed Lustre service refers to import, auto-import, and auto-export operations as "jobs". Avoid using "configuration", "settings", or "task" for these entities in example prompts or documentation. - ✅ CORRECT: "Get the auto-import jobs for filesystem 'LustreFs01' in resource group 'rg-storage-prod'" - ✅ CORRECT: "Cancel the auto-export job named 'archiveJob' on filesystem 'TrainingDataFs'" - ✅ CORRECT: "Get the import jobs for filesystem 'LustreFs01' in resource group 'rg-storage-prod'" - ❌ WRONG: "Get the auto-import settings for filesystem 'LustreFs01' in resource group 'rg-storage-prod'" - ❌ WRONG: "Show me the blob auto-import configuration for filesystem 'archiveLustre'" ### Use "auto-import", "auto-export", and "import" consistently - Use "auto-import" and "auto-export" (with dash, no space) for jobs that continuously sync data, matching official documentation and command names. - Use "import job" (no auto-) for one-time/manual jobs that sync data from blob storage to Lustre filesystem. - Do not use "autoimport", "autoexport", or "manual import"—use the official forms. - When describing manual jobs, use "manual import job" for clarity. - ✅ CORRECT: "Create an auto-import job for filesystem 'ProjectDataFS'" - ✅ CORRECT: "Create an import job for filesystem 'ProjectDataFS'" - ✅ CORRECT: "Create a manual import job for filesystem 'ProjectDataFS'" - ✅ CORRECT: "The auto-export job syncs data to blob storage" - ❌ WRONG: "Create an autoimport job for filesystem 'ProjectDataFS'" - ❌ WRONG: "Create a manual job for filesystem 'ProjectDataFS'" - ❌ WRONG: "The autoexport job syncs data" ### Use lowercase "filesystem" and "resource group" in prompts Use lowercase for "filesystem" and "resource group" when referring to these entities in example prompts. - ✅ CORRECT: "filesystem 'LustreFs01' in resource group 'rg-storage-prod'" - ❌ WRONG: "Filesystem 'LustreFs01' in Resource Group 'rg-storage-prod'" ## SERVICE-SPECIFIC DISTINCTIONS ### Manual import, auto-import, and auto-export jobs sync data between Lustre filesystem and blob storage - Manual import jobs perform a one-time sync from the linked blob storage container to the Lustre filesystem. - Auto-import jobs continuously sync data from the linked blob storage container to the Lustre filesystem. - Auto-export jobs continuously sync data from the Lustre filesystem to the linked blob storage container. ### Conflict resolution modes for auto-import jobs The conflict resolution mode parameter controls how conflicts are handled during auto-import jobs. Allowed values and behavior: - `Fail`: Stops immediately on conflict. - `Skip`: Skips the conflict (default). - `OverwriteIfDirty`: Deletes and re-imports if conflicting type, dirty, or currently released. - `OverwriteAlways`: Extends `OverwriteIfDirty` to include releasing restored but not dirty files. Both conflict resolution mode and auto-import prefixes are optional parameters with defaults. ### Auto-import prefixes and auto-export prefix usage - Auto-import jobs support multiple prefixes (up to 100) to specify blob paths or prefixes to import. - Manual import jobs also support multiple prefixes. - Auto-export jobs support only one prefix. - Default prefix is `/`. ### Administrative status and enable deletions parameters for auto-import jobs - `Admin status`: `Enable` (default) or `Disable` to activate or deactivate the job. - `Enable deletions`: Boolean, only affects overwrite-dirty mode, default is `false`. ### Maximum errors parameter for auto-import jobs - Specifies the number of tolerated non-conflict errors before the job fails. - `-1` means infinite tolerance. - `0` means exit immediately on any error. ## NAMING CONVENTIONS ### Use meaningful example names related to HPC and training workloads - Use resource group names like `rg-training`, `rg-managedlustre-prod`, `rg-hpc-environment`. - Use filesystem names like `TrainingDataFs`, `LustreFs01`, `AnalyticsLustreFS`, `ProjectDataFS`. ## ALIGNMENT WITH OFFICIAL DOCUMENTATION AND AZURE MCP COMMANDS - Always document and retain all tools and commands listed in the Azure MCP commands file and official documentation, including file system management tools (such as get, delete, create, update, etc.) and job-based tools (import job, manual import job, auto-import job, auto-export job). - Do not remove tools from the documentation unless they are officially deprecated and removed from the Azure MCP commands file and published documentation. - Example prompt structure and terminology should match the published articles: - - - - - - Command names and prompt language should match the Azure MCP commands file: - ================================================ FILE: .github/instructions/mcp-instructions.md ================================================ # Azure MCP Server Tool Example Prompt Validation Instructions ## Purpose Validate and fix example prompts in Azure MCP Server tool documentation to ensure all required parameters are explicitly present. This ensures users see complete, working examples that can be used as-is. ## Core Principles 1. **Only fix prompts missing required parameters** - Do not reformat, rephrase, or change prompts that already contain all required parameters 2. **Preserve original intent** - Keep the prompt's purpose and optional parameters intact 3. **Add minimal changes** - Only add what is strictly required according to the parameter table 4. **Use explicit values** - Add specific placeholder values, not generic phrases like "my database" or "my resource" 5. **Check conditional requirements** - Some tools require "one of" multiple parameters (e.g., Cluster URI OR Cluster name + Subscription) ## Validation Process For each tool in a documentation file: 1. **Read the parameter table** - Identify which parameters are marked as "Required" vs "Optional" 2. **Check each example prompt** - Verify that every required parameter is explicitly present 3. **Fix only missing required parameters** - Add them with appropriate placeholder values 4. **Leave compliant prompts unchanged** - Do not modify prompts that already have all required parameters 5. **Change the ms.date** field** - Update it to the current date after making changes ## Parameter Detection Rules These rules help determine whether a required parameter is already included in an example prompt. A parameter is considered **satisfied/included** when it meets the criteria below. ### Common Azure Parameters - **Resource group**: Included if the prompt mentions `resource group 'name'` or `in resource group` - **Subscription**: Included if the prompt mentions subscription ID, subscription name, or "my subscription" - **Location/Region**: Included if the prompt mentions Azure region names (eastus, westus, centralus, etc.) - **Resource name** (Server, Database, Account, etc.): Included if explicitly named with quotes or clear identifier ### Service-Specific Parameters - **Endpoint/URL**: Included if the prompt contains `https://` or `http://` URL pattern - **File/Path**: Included if the prompt mentions filename with extension (`.wav`, `.txt`, `.csv`) or path pattern (`./`, `C:\`) - **Query**: Included if the prompt contains explicit SQL/KQL query text in quotes or after "query" keyword - For SQL: `SELECT`, `INSERT`, `UPDATE`, `DELETE` statements - For KQL: Kusto syntax like `TableName | where ...` or predefined query names like `recent`, `errors` - **Text**: Included if the prompt contains quoted string content - **Namespace**: Included if the prompt mentions namespace name (e.g., Service Bus, Event Hubs) - **User**: Included if the prompt mentions username or "with user 'name'" - **Model**: Included if the prompt mentions model name (e.g., 'gpt-4', 'text-embedding-ada-002') ### Conditional Parameters Some tools have "one of" requirements: - **Azure Data Explorer**: Requires (Cluster URI) OR (Cluster name + Subscription + Resource group) - **Azure Virtual Desktop**: Requires (Host pool name) OR (Host pool resource ID) When conditional parameters are present, verify at least ONE complete option is provided. ## Placeholder Value Conventions Use specific, realistic placeholders instead of generic references: - **Endpoint**: `'https://myservice.cognitiveservices.azure.com/'` - **File paths**: `'./sample-audio.wav'`, `'./output.txt'`, `'C:/data/file.csv'` - **Resource group**: `'prod-rg'`, `'dev-rg'`, `'monitoring-rg'`, `'database-rg'` - **Server/Account names**: `'prod-mysql-server'`, `'mystorageaccount'`, `'analytics-server'` - **Database/Container**: `'salesdb'`, `'inventory'`, `'mycontainer'` - **User**: `'dbadmin'`, `'appuser'`, `'developer'` - **Query**: Full explicit query text, e.g., `'SELECT * FROM users WHERE id = 1'` or `'Logs | take 10'` - **Region**: `'eastus'`, `'westus2'`, `'centralus'` - **Subscription ID**: `'/subscriptions/abc123...'` (full ARM resource ID format) - **Namespace**: `'app-messaging'`, `'messaging-hub'`, `'retail-messaging'` - **Resource ID**: Full ARM format: `'/subscriptions/abc123/resourceGroups/rg/providers/Microsoft.Service/type/name'` ## Common Fixes by Service ### Database Services (MySQL, PostgreSQL, SQL) - Ensure Server, Database, User, Resource group are present - For queries, include explicit SQL query text ### Azure Monitor / Log Analytics - Ensure Workspace, Resource group are present for workspace operations - For queries, include explicit KQL query text, Table name - For metrics, include Resource name, Metric namespace, Metrics ### Azure Storage - Ensure Account is present for all operations - Container required for blob operations ### Messaging Services (Service Bus, Event Hubs, Event Grid) - Ensure Namespace is always present - For topics/subscriptions, ensure Topic name is present - For Event Grid, include explicit JSON Data for send operations ### Azure Data Explorer - Ensure Query includes explicit KQL query text - Check conditional parameters: Cluster URI OR (Cluster + Subscription + Resource group) ### Azure Functions - Ensure explicit query text is present when mentioning "query" ## Examples of Correct Fixes ### Before (Missing Required Parameter): ``` "Show tables in my workspace" ``` Required: Resource group, Workspace ### After (Fixed): ``` "Show tables in workspace 'centralmonitoring' in resource group 'monitoring-rg'" ``` ### Before (Missing Query Text): ``` "Query errors from last hour in workspace 'my-workspace' in resource group 'my-resource-group'" ``` Required: Resource group, Workspace, Table, Query ### After (Fixed): ``` "Query table 'AzureDiagnostics' with query 'AzureDiagnostics | where Level == \"Error\" | take 100' in workspace 'app-monitoring' in resource group 'monitoring-rg' for last 1 hour" ``` ## What NOT to Do ❌ **Don't** reformat prompts that already have required parameters ❌ **Don't** change parameter values that are already present ❌ **Don't** add optional parameters unless they were in the original prompt ❌ **Don't** change the prompt's purpose or workflow ❌ **Don't** use escape characters for single quotes in SQL queries (use plain single quotes) ❌ **Don't** use generic placeholders like "my resource" or "my database" ## Workflow 1. Open the tool documentation file 2. For each tool section: - Read the parameter table to identify required vs optional parameters - Check each example prompt - If prompt is missing required parameters, add them with explicit placeholder values - If prompt has all required parameters, leave it unchanged 3. Use `multi_replace_string_in_file` for efficient batch edits 4. Verify changes preserve the original prompt intent ================================================ FILE: .github/instructions/rust-instructions.md ================================================ --- ms.author: diberry ms.date: 09/02/2025 title: Copilot Instructions for Rust on Azure description: "Central instructions for Copilot tasks for Rust on Azure. References detailed instructions in .github/instructions." applyTo: "articles/rust/*.md" --- # Copilot instructions for all Rust language content Use the following instructions when creating, editing, or reviewing articles which include the Rust programming language. ## Governing reference material Consider the following resources for governing the use of documentation about Rust: - [Azure SDK Rust guidelines](https://azure.github.io/azure-sdk/rust_introduction.html) ## Instructions specific to Azure SDK for Rust - When referring to the Azure SDK for Rust: - For the title, description, H1 and first instance, use the full name "Azure SDK for Rust crates". - For subsequent references, you may use "Azure crates". - When generating SDK code: - Prefer Azure Identity over keys or other authentication mechanisms. - Prefer `AzureDeveloperCliCredential` over other credential types. - Prefer to use the Azure Key Vault secrets service and its associated crate `azure_security_keyvault_secrets`. This crate was created by the SDK platform team, so it is most idiomatic of the Azure SDK for Rust crates. ================================================ FILE: .github/policies/resourceManagement.yml ================================================ id: name: GitOps.PullRequestIssueManagement description: GitOps.PullRequestIssueManagement primitive owner: resource: repository disabled: false where: configuration: resourceManagementConfiguration: scheduledSearches: - description: frequencies: - hourly: hour: 6 filters: - isIssue - isOpen - hasLabel: label: 'Needs: author feedback' - hasLabel: label: 'Status: no recent activity' - noActivitySince: days: 3 actions: - closeIssue - description: frequencies: - hourly: hour: 6 filters: - isIssue - isOpen - hasLabel: label: 'Needs: author feedback' - noActivitySince: days: 4 - isNotLabeledWith: label: 'Status: no recent activity' actions: - addLabel: label: 'Status: no recent activity' - addReply: reply: This issue has been automatically marked as stale because it has been marked as requiring author feedback but has not had any activity for **4 days**. It will be closed if no further activity occurs **within 3 days of this comment**. - description: frequencies: - hourly: hour: 6 filters: - isIssue - isOpen - hasLabel: label: duplicate - noActivitySince: days: 1 actions: - addReply: reply: This issue has been marked as duplicate and has not had any activity for **1 day**. It will be closed for housekeeping purposes. - closeIssue eventResponderTasks: - if: - payloadType: Issue_Comment - isAction: action: Created - isActivitySender: issueAuthor: True - hasLabel: label: 'Needs: author feedback' - isOpen then: - addLabel: label: 'Needs: attention :wave:' - removeLabel: label: 'Needs: author feedback' description: - if: - payloadType: Issues - not: isAction: action: Closed - hasLabel: label: 'Status: no recent activity' then: - removeLabel: label: 'Status: no recent activity' description: - if: - payloadType: Issue_Comment - hasLabel: label: 'Status: no recent activity' then: - removeLabel: label: 'Status: no recent activity' description: - if: - payloadType: Pull_Request then: - inPrLabel: label: 'Status: In PR' description: - if: - payloadType: Issue_Comment - commentContains: pattern: '#please-close' isRegex: False then: - closeIssue description: - if: - payloadType: Issues - isAction: action: Opened - and: - bodyContains: pattern: javascript isRegex: False - or: - bodyContains: pattern: typescript isRegex: False then: - assignTo: users: - diberry - addLabel: label: javascript - assignTo: users: - diberry description: - if: - payloadType: Issues - isAction: action: Opened - bodyContains: pattern: /java/ isRegex: False then: - addLabel: label: java - assignTo: users: - karlerickson description: - if: - payloadType: Issues - isAction: action: Opened - bodyContains: pattern: /python/ isRegex: False then: - addLabel: label: python - assignTo: {} description: - if: - payloadType: Issues - isAction: action: Opened - bodyContains: pattern: /ansible/ isRegex: False then: - addLabel: label: ansible - assignTo: users: - 'TomArcherMsft ' description: - if: - payloadType: Issues - isAction: action: Opened - titleContains: pattern: /jenkins/ isRegex: False then: - addLabel: label: jenkins - assignTo: users: - TomArcherMsft description: - if: - payloadType: Issues - isAction: action: Opened - bodyContains: pattern: /terraform/ isRegex: False then: - addLabel: label: terraform - assignTo: users: - TomArcherMsft description: - if: - payloadType: Issues - isAction: action: Opened - bodyContains: pattern: /azure-cli/ isRegex: False then: - addLabel: label: azure-cli - assignTo: users: - 'dbradish-microsoft ' description: onFailure: onSuccess: ================================================ FILE: .github/rust-instructions.md ================================================ --- ms.author: diberry ms.date: 09/02/2025 title: Copilot Instructions for Rust on Azure description: "Central instructions for Copilot tasks for Rust on Azure. References detailed instructions in .github/instructions." applyTo: "articles/rust/**/*.md" --- # Copilot instructions for all Rust language content Use the following instructions when creating, editing, or reviewing articles which include the Rust programming language. ## Governing reference material Consider the following resources for governing the use of documentation about Rust: - [Azure SDK Rust guidelines](https://azure.github.io/azure-sdk/rust_introduction.html) ## Instructions specific to Azure SDK for Rust - When referring to the Azure SDK for Rust: - For the title, description, H1 and first instance, use the full name "Azure SDK for Rust crates". - For subsequent references, you may use "Azure crates". - When generating SDK code: - Prefer Azure Identity over keys or other authentication mechanisms. - Prefer `AzureDeveloperCliCredential` over other credential types. - Prefer to use the Azure Key Vault secrets service and its associated crate `azure_security_keyvault_secrets`. This crate was created by the SDK platform team, so it is most idiomatic of the Azure SDK for Rust crates. - When linking to reference documentation on docs.rs: - All links must include the `/latest` route after the crate name. - Format: `https://docs.rs/{crate_name}/latest/{crate_name}/` - Example: For the `azure_core` crate, use `https://docs.rs/azure_core/latest/azure_core/` ================================================ FILE: .gitignore ================================================ log/ obj/ _site/ .optemp/ _themes*/ _repo.*/ .vs/ .vscode/ .idea .ionide/ .openpublishing.buildcore.ps1.vscode/ *.DS_Store *.lnk # Squad state (belongs in squad repo, not content repo) .squad/ ================================================ FILE: .openpublishing.publish.config.json ================================================ { "docsets_to_publish": [ { "docset_name": "azure-dev-docs", "build_source_folder": "articles", "build_output_subfolder": "developer", "locale": "en-us", "monikers": [], "moniker_ranges": [], "open_to_public_contributors": true, "type_mapping": { "ZonePivotGroups": "Toc", "Conceptual": "Content", "Tutorial": "Content" }, "build_entry_point": "docs", "template_folder": "_themes" } ], "notification_subscribers": [ "brendm@microsoft.com", "karler@microsoft.com", "susanpotter@microsoft.com", "diberry@microsoft.com" ], "sync_notification_subscribers": [ "karler@microsoft.com", "susanpotter@microsoft.com" ], "branches_to_filter": [], "git_repository_url_open_to_public_contributors": "https://github.com/MicrosoftDocs/azure-dev-docs", "git_repository_branch_open_to_public_contributors": "main", "skip_source_output_uploading": false, "need_preview_pull_request": true, "contribution_branch_mappings": {}, "dependent_repositories": [ { "path_to_root": "terraform_samples", "url": "https://github.com/azure/terraform", "branch": "master", "branch_mapping": {} }, { "path_to_root": "_themes", "url": "https://github.com/Microsoft/templates.docs.msft", "branch": "main", "branch_mapping": {} }, { "path_to_root": "_themes.pdf", "url": "https://github.com/Microsoft/templates.docs.msft.pdf", "branch": "main", "branch_mapping": {} }, { "path_to_root": "azure-sdk-for-rust-docs", "url": "https://github.com/Azure-Samples/azure-sdk-for-rust-docs", "branch": "main", "branch_mapping": {} }, { "path_to_root": "azure-sdk-for-rust-permalink", "url": "https://github.com/Azure/azure-sdk-for-rust", "branch": "5c7ded236f81f87b568557312ce7bbd17dbd549c", "branch_mapping": {} }, { "path_to_root": "azure-sdk-for-js-docs", "url": "https://github.com/Azure-Samples/azure-sdk-for-js-docs", "branch": "main", "branch_mapping": {} }, { "path_to_root": "azure-typescript-e2e-apps", "url": "https://github.com/Azure-Samples/azure-typescript-e2e-apps", "branch": "main", "branch_mapping": {} }, { "path_to_root": "azure-typescript-langchainjs", "url": "https://github.com/Azure-Samples/azure-typescript-langchainjs", "branch": "main", "branch_mapping": {} }, { "path_to_root": "node-essentials", "url": "https://github.com/MicrosoftDocs/node-essentials", "branch": "main", "branch_mapping": {} }, { "path_to_root": "js-e2e-azure-function-upload-file", "url": "https://github.com/Azure-Samples/js-e2e-azure-function-upload-file", "branch": "main", "branch_mapping": {} }, { "path_to_root": "js-e2e-azure-resource-management-functions", "url": "https://github.com/Azure-Samples/js-e2e-azure-resource-management-functions", "branch": "main", "branch_mapping": {} }, { "path_to_root": "js-e2e-browser-file-upload-storage-blob", "url": "https://github.com/Azure-Samples/js-e2e-browser-file-upload-storage-blob", "branch": "main", "branch_mapping": {} }, { "path_to_root": "ts-e2e-browser-file-upload-storage-blob", "url": "https://github.com/Azure-Samples/ts-e2e-browser-file-upload-storage-blob", "branch": "main", "branch_mapping": {} }, { "path_to_root": "js-e2e-vm", "url": "https://github.com/Azure-Samples/js-e2e-vm", "branch": "main", "branch_mapping": {} }, { "path_to_root": "js-e2e-client-cognitive-services", "url": "https://github.com/Azure-Samples/js-e2e-client-cognitive-services", "branch": "main", "branch_mapping": {} }, { "path_to_root": "js-e2e-client-azure-login-button", "url": "https://github.com/Azure-Samples/js-e2e-client-azure-login-button", "branch": "main", "branch_mapping": {} }, { "path_to_root": "js-e2e-express-server-cognitive-services", "url": "https://github.com/Azure-Samples/js-e2e-express-server-cognitive-services", "branch": "main", "branch_mapping": {} }, { "path_to_root": "js-e2e-express-mongodb-main", "url": "https://github.com/Azure-Samples/js-e2e-express-mongodb", "branch": "main", "branch_mapping": {} }, { "path_to_root": "js-e2e-express-mongodb-keyvault", "url": "https://github.com/Azure-Samples/js-e2e-express-mongodb", "branch": "keyvault", "branch_mapping": {} }, { "path_to_root": "js-e2e-web-app-server-auth", "url": "https://github.com/Azure-Samples/js-e2e-web-app-server-auth", "branch": "main", "branch_mapping": {} }, { "path_to_root": "js-e2e", "url": "https://github.com/Azure-Samples/js-e2e", "branch": "main", "branch_mapping": {} }, { "path_to_root": "js-e2e-azure-function-graphql-hello", "url": "https://github.com/Azure-Samples/js-e2e-azure-function-graphql-hello", "branch": "main", "branch_mapping": {} }, { "path_to_root": "js-e2e-azure-function-graphql-crud-operations", "url": "https://github.com/Azure-Samples/js-e2e-azure-function-graphql-crud-operations", "branch": "main", "branch_mapping": {} }, { "path_to_root": "js-e2e-graphql-cosmosdb-static-web-app", "url": "https://github.com/azure-samples/js-e2e-graphql-cosmosdb-static-web-app", "branch": "main", "branch_mapping": {} }, { "path_to_root": "js-e2e-graphql-nextjs-triviagame", "url": "https://github.com/azure-samples/js-e2e-graphql-nextjs-triviagame", "branch": "main", "branch_mapping": {} }, { "path_to_root": "python-sdk-docs-examples", "url": "https://github.com/MicrosoftDocs/python-sdk-docs-examples", "branch": "main", "branch_mapping": {} }, { "path_to_root": "python-docs-flask-minimal", "url": "https://github.com/Azure-Samples/python-docs-flask-minimal", "branch": "main", "branch_mapping": {} }, { "path_to_root": "python-sample-vscode-flask-tutorial", "url": "https://github.com/microsoft/python-sample-vscode-flask-tutorial", "branch": "main", "branch_mapping": {} }, { "path_to_root": "python-integrated-authentication", "url": "https://github.com/Azure-Samples/python-integrated-authentication", "branch": "main", "branch_mapping": {} }, { "path_to_root": "msdocs-python-flask-webapp-quickstart", "url": "https://github.com/Azure-Samples/msdocs-python-flask-webapp-quickstart", "branch": "main", "branch_mapping": {} }, { "path_to_root": "msdocs-python-django-webapp-quickstart", "url": "https://github.com/Azure-Samples/msdocs-python-django-webapp-quickstart", "branch": "main", "branch_mapping": {} }, { "path_to_root": "msdocs-nodejs-mongodb-azure-sample-app", "url": "https://github.com/Azure-Samples/msdocs-nodejs-mongodb-azure-sample-app", "branch": "main", "branch_mapping": {} }, { "path_to_root": "msdocs-django-postgresql-sample-app", "url": "https://github.com/Azure-Samples/msdocs-django-postgresql-sample-app", "branch": "main", "branch_mapping": {} }, { "path_to_root": "msdocs-python-etl-serverless", "url": "https://github.com/Azure-Samples/msdocs-python-etl-serverless", "branch": "main", "branch_mapping": {} }, { "path_to_root": "articles/reusable-content", "url": "https://github.com/MicrosoftDocs/reusable-content", "branch": "main", "branch_mapping": {} }, { "path_to_root": "msdocs-python-fastapi-webapp-quickstart", "url": "https://github.com/Azure-Samples/msdocs-python-fastapi-webapp-quickstart", "branch": "main", "branch_mapping": {} }, { "path_to_root": "dotnet-docs", "url": "https://github.com/dotnet/docs", "branch": "main", "branch_mapping": {} } ], "branch_target_mapping": { "live": [ "Publish", "PDF", "Pdf" ], "main": [ "Publish", "PDF" ] }, "need_generate_pdf_url_template": true, "targets": { "pdf": { "template_folder": "_themes.pdf" } }, "docs_build_engine": { "name": "docfx_v3" }, "redirection_files": [ "articles/java/.openpublishing.redirection.java.json" ] } ================================================ FILE: .openpublishing.redirection.json ================================================ { "redirections": [ { "source_path": "articles/mobile-apps/azure-mobile-apps/overview.md", "redirect_url": "/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/overview", "redirect_document_id": false }, { "source_path": "articles/mobile-apps/azure-mobile-apps/howto/authentication.md", "redirect_url": "/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/howto/authentication", "redirect_document_id": false }, { "source_path": "articles/mobile-apps/azure-mobile-apps/howto/data-sync.md", "redirect_url": "/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/howto/data-sync", "redirect_document_id": false }, { "source_path": "articles/mobile-apps/azure-mobile-apps/howto/client/cordova.md", "redirect_url": "/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/howto/client/cordova", "redirect_document_id": false }, { "source_path": "articles/mobile-apps/azure-mobile-apps/howto/client/dotnet-v4.md", "redirect_url": "/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/howto/client/dotnet-v4", "redirect_document_id": false }, { "source_path": "articles/mobile-apps/azure-mobile-apps/howto/client/dotnet.md", "redirect_url": "/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/howto/client/dotnet", "redirect_document_id": false }, { "source_path": "articles/mobile-apps/azure-mobile-apps/howto/server/dotnet-core.md", "redirect_url": "/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/howto/server/dotnet-core", "redirect_document_id": false }, { "source_path": "articles/mobile-apps/azure-mobile-apps/howto/server/dotnet-framework.md", "redirect_url": "/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/howto/server/dotnet-framework", "redirect_document_id": false }, { "source_path": "articles/mobile-apps/azure-mobile-apps/howto/server/nodejs.md", "redirect_url": "/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/howto/server/nodejs", "redirect_document_id": false }, { "source_path": "articles/mobile-apps/azure-mobile-apps/quickstarts/avalonia/authentication.md", "redirect_url": "/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/quickstarts/avalonia/authentication", "redirect_document_id": false }, { "source_path": "articles/mobile-apps/azure-mobile-apps/quickstarts/avalonia/index.md", "redirect_url": "/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/quickstarts/avalonia/index", "redirect_document_id": false }, { "source_path": "articles/mobile-apps/azure-mobile-apps/quickstarts/avalonia/offline.md", "redirect_url": "/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/quickstarts/avalonia/offline", "redirect_document_id": false }, { "source_path": "articles/mobile-apps/azure-mobile-apps/quickstarts/cordova/authentication.md", "redirect_url": "/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/quickstarts/cordova/authentication", "redirect_document_id": false }, { "source_path": "articles/mobile-apps/azure-mobile-apps/quickstarts/cordova/index.md", "redirect_url": "/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/quickstarts/cordova/index", "redirect_document_id": false }, { "source_path": "articles/mobile-apps/azure-mobile-apps/quickstarts/cordova/offline.md", "redirect_url": "/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/quickstarts/cordova/offline", "redirect_document_id": false }, { "source_path": "articles/mobile-apps/azure-mobile-apps/quickstarts/maui/authentication.md", "redirect_url": "/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/quickstarts/maui/authentication", "redirect_document_id": false }, { "source_path": "articles/mobile-apps/azure-mobile-apps/quickstarts/maui/index.md", "redirect_url": "/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/quickstarts/maui/index", "redirect_document_id": false }, { "source_path": "articles/mobile-apps/azure-mobile-apps/quickstarts/maui/offline.md", "redirect_url": "/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/quickstarts/maui/offline", "redirect_document_id": false }, { "source_path": "articles/mobile-apps/azure-mobile-apps/quickstarts/uno/authentication.md", "redirect_url": "/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/quickstarts/uno/authentication", "redirect_document_id": false }, { "source_path": "articles/mobile-apps/azure-mobile-apps/quickstarts/uno/index.md", "redirect_url": "/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/quickstarts/uno/index", "redirect_document_id": false }, { "source_path": "articles/mobile-apps/azure-mobile-apps/quickstarts/uno/offline.md", "redirect_url": "/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/quickstarts/uno/offline", "redirect_document_id": false }, { "source_path": "articles/mobile-apps/azure-mobile-apps/quickstarts/uwp/authentication.md", "redirect_url": "/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/quickstarts/uwp/authentication", "redirect_document_id": false }, { "source_path": "articles/mobile-apps/azure-mobile-apps/quickstarts/uwp/index.md", "redirect_url": "/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/quickstarts/uwp/index", "redirect_document_id": false }, { "source_path": "articles/mobile-apps/azure-mobile-apps/quickstarts/uwp/offline.md", "redirect_url": "/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/quickstarts/uwp/offline", "redirect_document_id": false }, { "source_path": "articles/mobile-apps/azure-mobile-apps/quickstarts/winui/authentication.md", "redirect_url": "/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/quickstarts/winui/authentication", "redirect_document_id": false }, { "source_path": "articles/mobile-apps/azure-mobile-apps/quickstarts/winui/index.md", "redirect_url": "/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/quickstarts/winui/index", "redirect_document_id": false }, { "source_path": "articles/mobile-apps/azure-mobile-apps/quickstarts/winui/offline.md", "redirect_url": "/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/quickstarts/winui/offline", "redirect_document_id": false }, { "source_path": "articles/mobile-apps/azure-mobile-apps/quickstarts/wpf/authentication.md", "redirect_url": "/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/quickstarts/wpf/authentication", "redirect_document_id": false }, { "source_path": "articles/mobile-apps/azure-mobile-apps/quickstarts/wpf/index.md", "redirect_url": "/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/quickstarts/wpf/index", "redirect_document_id": false }, { "source_path": "articles/mobile-apps/azure-mobile-apps/quickstarts/wpf/offline.md", "redirect_url": "/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/quickstarts/wpf/offline", "redirect_document_id": false }, { "source_path": "articles/mobile-apps/azure-mobile-apps/quickstarts/xamarin-android/authentication.md", "redirect_url": "/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/quickstarts/xamarin-android/authentication", "redirect_document_id": false }, { "source_path": "articles/mobile-apps/azure-mobile-apps/quickstarts/xamarin-android/index.md", "redirect_url": "/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/quickstarts/xamarin-android/index", "redirect_document_id": false }, { "source_path": "articles/mobile-apps/azure-mobile-apps/quickstarts/xamarin-android/offline.md", "redirect_url": "/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/quickstarts/xamarin-android/offline", "redirect_document_id": false }, { "source_path": "articles/mobile-apps/azure-mobile-apps/quickstarts/xamarin-forms/authentication.md", "redirect_url": "/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/quickstarts/xamarin-forms/authentication", "redirect_document_id": false }, { "source_path": "articles/mobile-apps/azure-mobile-apps/quickstarts/xamarin-forms/index.md", "redirect_url": "/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/quickstarts/xamarin-forms/index", "redirect_document_id": false }, { "source_path": "articles/mobile-apps/azure-mobile-apps/quickstarts/xamarin-forms/offline.md", "redirect_url": "/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/quickstarts/xamarin-forms/offline", "redirect_document_id": false }, { "source_path": "articles/mobile-apps/azure-mobile-apps/quickstarts/xamarin-ios/authentication.md", "redirect_url": "/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/quickstarts/xamarin-ios/authentication", "redirect_document_id": false }, { "source_path": "articles/mobile-apps/azure-mobile-apps/quickstarts/xamarin-ios/index.md", "redirect_url": "/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/quickstarts/xamarin-ios/index", "redirect_document_id": false }, { "source_path": "articles/mobile-apps/azure-mobile-apps/quickstarts/xamarin-ios/offline.md", "redirect_url": "/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/quickstarts/xamarin-ios/offline", "redirect_document_id": false }, { "source_path": "articles/mobile-apps/index.yml", "redirect_url": "/previous-versions/azure/developer/mobile-apps/index", "redirect_document_id": false }, { "source_path": "articles/mobile-apps/choose-mobile-framework.md", "redirect_url": "/previous-versions/azure/developer/mobile-apps/choose-mobile-framework", "redirect_document_id": false }, { "source_path": "articles/mobile-apps/mobile-cloud-development-stages.md", "redirect_url": "/previous-versions/azure/developer/mobile-apps/mobile-cloud-development-stages", "redirect_document_id": false }, { "source_path": "articles/mobile-apps/authentication.md", "redirect_url": "/previous-versions/azure/developer/mobile-apps/authentication", "redirect_document_id": false }, { "source_path": "articles/mobile-apps/data-storage.md", "redirect_url": "/previous-versions/azure/developer/mobile-apps/data-storage", "redirect_document_id": false }, { "source_path": "articles/mobile-apps/azure-storage.md", "redirect_url": "/previous-versions/azure/developer/mobile-apps/azure-storage", "redirect_document_id": false }, { "source_path": "articles/mobile-apps/azure-content-delivery-network.md", "redirect_url": "/previous-versions/azure/developer/mobile-apps/azure-content-delivery-network", "redirect_document_id": false }, { "source_path": "articles/mobile-apps/serverless-compute.md", "redirect_url": "/previous-versions/azure/developer/mobile-apps/serverless-compute", "redirect_document_id": false }, { "source_path": "articles/mobile-apps/real-time-communication.md", "redirect_url": "/previous-versions/azure/developer/mobile-apps/real-time-communication", "redirect_document_id": false }, { "source_path": "articles/mobile-apps/code-hosting-services.md", "redirect_url": "/previous-versions/azure/developer/mobile-apps/code-hosting-services", "redirect_document_id": false }, { "source_path": "articles/mobile-apps/devops.md", "redirect_url": "/previous-versions/azure/developer/mobile-apps/devops", "redirect_document_id": false }, { "source_path": "articles/mobile-apps/continuous-integration.md", "redirect_url": "/previous-versions/azure/developer/mobile-apps/continuous-integration", "redirect_document_id": false }, { "source_path": "articles/mobile-apps/test-mobile-apps.md", "redirect_url": "/previous-versions/azure/developer/mobile-apps/test-mobile-apps", "redirect_document_id": false }, { "source_path": "articles/mobile-apps/continuous-delivery.md", "redirect_url": "/previous-versions/azure/developer/mobile-apps/continuous-delivery", "redirect_document_id": false }, { "source_path": "articles/mobile-apps/analytics.md", "redirect_url": "/previous-versions/azure/developer/mobile-apps/analytics", "redirect_document_id": false }, { "source_path": "articles/mobile-apps/diagnostics.md", "redirect_url": "/previous-versions/azure/developer/mobile-apps/diagnostics", "redirect_document_id": false }, { "source_path": "articles/mobile-apps/push-notifications.md", "redirect_url": "/previous-versions/azure/developer/mobile-apps/push-notifications", "redirect_document_id": false }, { "source_path": "articles/mobile-apps/notification-hubs-backend-service-xamarin-forms.md", "redirect_url": "/previous-versions/azure/developer/mobile-apps/notification-hubs-backend-service-xamarin-forms", "redirect_document_id": false }, { "source_path": "articles/mobile-apps/notification-hubs-backend-service-react-native.md", "redirect_url": "/previous-versions/azure/developer/mobile-apps/notification-hubs-backend-service-react-native", "redirect_document_id": false }, { "source_path": "articles/mobile-apps/notification-hubs-backend-service-flutter.md", "redirect_url": "/previous-versions/azure/developer/mobile-apps/notification-hubs-backend-service-flutter", "redirect_document_id": false }, { "source_path": "articles/mobile-apps/cognitive-services.md", "redirect_url": "/previous-versions/azure/developer/mobile-apps/cognitive-services", "redirect_document_id": false }, { "source_path": "articles/mobile-apps/azure-maps.md", "redirect_url": "/previous-versions/azure/developer/mobile-apps/azure-maps", "redirect_document_id": false }, { "source_path": "articles/mobile-apps/azure-search.md", "redirect_url": "/previous-versions/azure/developer/mobile-apps/azure-search", "redirect_document_id": false }, { "source_path": "articles/javascript/sdk/authentication/azure-hosted-apps.md", "redirect_url": "/azure/developer/javascript/sdk/authentication/system-assigned-managed-identity" }, { "source_path": "articles/javascript/core/what-is-azure-for-javascript-development.md", "redirect_url": "/azure/developer/javascript/what-is-azure-for-javascript-development", "redirect_document_id": false }, { "source_path": "articles/javascript/core/use-azure-sdk.md", "redirect_url": "/azure/developer/javascript/sdk/use-azure-sdk", "redirect_document_id": false }, { "source_path": "articles/javascript/tutorial/convert-text-to-speech-cognitive-services.md", "redirect_url": "/azure/developer/javascript/", "redirect_document_id": false }, { "source_path": "articles/javascript/tutorial/static-web-app-image-analysis.md", "redirect_url": "/azure/developer/javascript/how-to/create-static-web-app", "redirect_document_id": false }, { "source_path": "articles/javascript/how-to/create-static-web-app.md", "redirect_url": "/azure/static-web-apps/", "redirect_document_id": false }, { "source_path": "articles/javascript/how-to/with-web-app/static-web-app-with-swa-cli.md", "redirect_url": "/azure/static-web-apps/add-api", "redirect_document_id": false },{ "source_path": "articles/javascript/how-to/with-web-app/azure-function-resource-group-management.md", "redirect_url": "/azure/developer/javascript", "redirect_document_id": false }, { "source_path": "articles/javascript/how-to/with-authentication/getting-started.md", "redirect_url": "/azure/developer/javascript", "redirect_document_id": false }, { "source_path": "articles/javascript/tutorial/run-nodejs-virtual-machine.md", "redirect_url": "/azure/virtual-machines/linux/quick-create-cli", "redirect_document_id": false }, { "source_path": "articles/javascript/how-to/with-visual-studio-code/create-azure-database.md", "redirect_url": "/azure/developer/javascript", "redirect_document_id": false }, { "source_path": "articles/javascript/end-to-end/contoso-real-estate-developer-solutions.md", "redirect_url": "/azure/developer/javascript", "redirect_document_id": false }, { "source_path": "articles/javascript/end-to-end/contoso-real-estate-developer-tools.md", "redirect_url": "/azure/developer/javascript", "redirect_document_id": false }, { "source_path": "articles/javascript/end-to-end/contoso-real-estate-get-started.md", "redirect_url": "/azure/developer/javascript", "redirect_document_id": false }, { "source_path": "articles/javascript/end-to-end/contoso-real-estate-infrastructure.md", "redirect_url": "/azure/developer/javascript", "redirect_document_id": false }, { "source_path": "articles/javascript/end-to-end/contoso-real-estate-run-codespaces.md", "redirect_url": "/azure/developer/javascript", "redirect_document_id": false }, { "source_path": "articles/javascript/end-to-end/contoso-real-estate-serverless-api-migration.md", "redirect_url": "/azure/developer/javascript", "redirect_document_id": false }, { "source_path": "articles/javascript/end-to-end/contoso-real-estate-serverless-api.md", "redirect_url": "/azure/developer/javascript", "redirect_document_id": false }, { "source_path": "articles/javascript/end-to-end/contoso-real-estate-test-api-solution.md", "redirect_url": "/azure/developer/javascript", "redirect_document_id": false }, { "source_path": "articles/javascript/end-to-end/contoso-real-estate-user-authentication.md", "redirect_url": "/azure/developer/javascript", "redirect_document_id": false }, { "source_path": "articles/javascript/end-to-end/contoso-real-estate-user-scenarios.md", "redirect_url": "/azure/developer/javascript", "redirect_document_id": false }, { "source_path": "articles/javascript/how-to/configure-web-app-settings.md", "redirect_url": "/azure/developer/javascript" }, { "source_path": "articles/javascript/how-to/select-hosting-service.md", "redirect_url": "/azure/developer/intro/hosting-apps-on-azure" }, { "source_path": "articles/javascript/azure-ai-for-javascript-developers.md", "redirect_url": "/azure/javascript/ai/azure-ai-for-javascript-developers" }, { "source_path": "articles/javascript/chat-app-with-separate-front-back-end.md", "redirect_url": "/azure/javascript/ai/chat-app-with-separate-front-back-end" }, { "source_path": "articles/javascript/get-started-app-chat-assistants-function-calling.md", "redirect_url": "/azure/javascript/ai/get-started-app-chat-assistants-function-calling" }, { "source_path": "articles/javascript/get-started-app-chat-evaluations.md", "redirect_url": "/azure/javascript/ai/get-started-app-chat-evaluations" }, { "source_path": "articles/javascript/get-started-app-chat-scaling-with-azure-api-management.md", "redirect_url": "/azure/javascript/ai/get-started-app-chat-scaling-with-azure-api-management" }, { "source_path": "articles/javascript/get-started-app-chat-scaling-with-azure-container-apps.md", "redirect_url": "/azure/javascript/ai/get-started-app-chat-scaling-with-azure-container-apps" }, { "source_path": "articles/javascript/get-started-app-chat-template-langchainjs.md", "redirect_url": "/azure/javascript/ai/get-started-app-chat-template-langchainjs" }, { "source_path": "articles/javascript/get-started-app-chat-template.md", "redirect_url": "/azure/virtual-machines" }, { "source_path": "articles/javascript/openai-cli.md", "redirect_url": "/azure/ai-services/openai" }, { "source_path": "articles/javascript/how-to/with-visual-studio-code/containerize-local-project.md", "redirect_url": "https://code.visualstudio.com/docs/containers/quickstart-node" }, { "source_path": "articles/javascript/how-to/with-azure-sdk/create-manage-virtual-machine.md", "redirect_url": "/azure/developer/javascript/" }, { "source_path": "articles/javascript/tutorial/azure-function-cosmos-db-mongo-api.md", "redirect_url": "/azure/azure-functions/functions-add-output-binding-cosmos-db-vs-code?pivots=programming-language-javascript" }, { "source_path": "articles/javascript/end-to-end/contoso-real-estate-test-ui-solution.md", "redirect_url": "/azure/developer/javascript/end-to-end/contoso-real-estate-test-api-solution" }, { "source_path": "articles/javascript/core/automate-tasks-with-azure-cli.md", "redirect_url": "/cli/azure/azure-cli-learn-bash" }, { "source_path": "articles/javascript/how-to/with-azure-sdk/stop-start-virtual-machine.md", "redirect_url": "/cli/azure/vm" }, { "source_path": "articles/javascript/how-to/with-azure-sdk/list-resource-operation-history.md", "redirect_url": "/cli/azure/monitor" }, { "source_path":"articles/javascript/how-to/add-custom-domain-to-web-app.md", "redirect_url": "/azure/app-service/tutorial-secure-domain-certificate" }, { "source_path":"articles/javascript/how-to/with-azure-cli/create-container-registry-resource.md", "redirect_url": "/azure/container-registry/container-registry-get-started-azure-cli" }, { "source_path":"articles/javascript/how-to/with-authentication/static-web-app-with-api/add-mongodb-database-to-api.md", "redirect_url": "/azure/active-directory-b2c/enable-authentication-react-spa-app" }, { "source_path":"articles/javascript/how-to/with-authentication/static-web-app-with-api/configure-source-code-for-msal.md", "redirect_url": "/azure/active-directory-b2c/enable-authentication-react-spa-app" }, { "source_path":"articles/javascript/how-to/with-authentication/static-web-app-with-api/deploy-static-web-app-to-azure.md", "redirect_url": "/azure/active-directory-b2c/enable-authentication-react-spa-app" }, { "source_path":"articles/javascript/how-to/with-authentication/static-web-app-with-api/introduction.md", "redirect_url": "/azure/active-directory-b2c/enable-authentication-react-spa-app" }, { "source_path":"articles/javascript/how-to/with-authentication/static-web-app-with-api/register-application-with-identity.md", "redirect_url": "/azure/active-directory-b2c/enable-authentication-react-spa-app" }, { "source_path":"articles/javascript/how-to/with-authentication/register-application-with-identity.md", "redirect_url": "/azure/active-directory-b2c/enable-authentication-react-spa-app" }, { "source_path":"articles/javascript/how-to/with-web-app/use-secret-environment-variables.md", "redirect_url": "/azure/cosmos-db/store-credentials-key-vault" }, { "source_path":"articles/javascript/database-developer-guide.md", "redirect_url": "https://azure.microsoft.com/product-categories/databases/" }, { "source_path":"articles/javascript/composable-cloud-contoso-real-estate.md", "redirect_url": "/azure/developer/javascript/end-to-end/contoso-real-estate-get-started" }, { "source_path": "articles/javascript/tutorial/tutorial-vscode-docker-node/tutorial-vscode-docker-node-01.md", "redirect_url": "/azure/app-service/quickstart-custom-container?tabs=node&pivots=container-linux-vscode" }, { "source_path": "articles/javascript/tutorial/tutorial-vscode-docker-node/tutorial-vscode-docker-node-02.md", "redirect_url": "/azure/app-service/quickstart-custom-container?tabs=node&pivots=container-linux-vscode" }, { "source_path": "articles/javascript/tutorial/tutorial-vscode-docker-node/tutorial-vscode-docker-node-03.md", "redirect_url": "/azure/app-service/quickstart-custom-container?tabs=node&pivots=container-linux-vscode" }, { "source_path": "articles/javascript/tutorial/tutorial-vscode-docker-node/tutorial-vscode-docker-node-04.md", "redirect_url": "/azure/app-service/quickstart-custom-container?tabs=node&pivots=container-linux-vscode" }, { "source_path": "articles/javascript/tutorial/tutorial-vscode-docker-node/tutorial-vscode-docker-node-05.md", "redirect_url": "/azure/app-service/quickstart-custom-container?tabs=node&pivots=container-linux-vscode" }, { "source_path": "articles/javascript/tutorial/tutorial-vscode-docker-node/tutorial-vscode-docker-node-06.md", "redirect_url": "/azure/app-service/quickstart-custom-container?tabs=node&pivots=container-linux-vscode" }, { "source_path": "articles/javascript/tutorial/tutorial-vscode-docker-node/tutorial-vscode-docker-node-07.md", "redirect_url": "/azure/app-service/quickstart-custom-container?tabs=node&pivots=container-linux-vscode" }, { "source_path": "articles/javascript/tutorial/tutorial-vscode-docker-node/tutorial-vscode-docker-node-08.md", "redirect_url": "/azure/app-service/quickstart-custom-container?tabs=node&pivots=container-linux-vscode" }, { "source_path": "articles/javascript/how-to/with-web-app/static-web-app-with-swa-cli/introduction.md", "redirect_url": "/azure/developer/javascript/how-to/with-web-app/static-web-app-with-swa-cli" }, { "source_path": "articles/javascript/how-to/with-web-app/static-web-app-with-swa-cli/create-github-repo.md", "redirect_url": "/azure/developer/javascript/how-to/with-web-app/static-web-app-with-swa-cli" }, { "source_path": "articles/javascript/how-to/with-web-app/static-web-app-with-swa-cli/create-react-app.md", "redirect_url": "/azure/developer/javascript/how-to/with-web-app/static-web-app-with-swa-cli" }, { "source_path": "articles/javascript/how-to/with-web-app/static-web-app-with-swa-cli/create-static-web-app.md", "redirect_url": "/azure/developer/javascript/how-to/with-web-app/static-web-app-with-swa-cli" }, { "source_path": "articles/javascript/how-to/with-web-app/static-web-app-with-swa-cli/create-function-api-app.md", "redirect_url": "/azure/developer/javascript/how-to/with-web-app/static-web-app-with-swa-cli" }, { "source_path": "articles/javascript/how-to/with-web-app/static-web-app-with-swa-cli/connect-client-to-api.md", "redirect_url": "/azure/developer/javascript/how-to/with-web-app/static-web-app-with-swa-cli" }, { "source_path": "articles/javascript/how-to/with-web-app/static-web-app-with-swa-cli/add-authentication.md", "redirect_url": "/azure/developer/javascript/how-to/with-web-app/static-web-app-with-swa-cli" }, { "source_path": "articles/javascript/how-to/with-web-app/static-web-app-with-swa-cli/clean-up-swa-auth-resources.md", "redirect_url": "/azure/developer/javascript/how-to/with-web-app/static-web-app-with-swa-cli" }, { "source_path": "articles/javascript/how-to/with-web-app/azure-function-resource-group-management/add-delete-functions-redeploy.md", "redirect_url": "/azure/developer/javascript/how-to/with-web-app/azure-function-resource-group-management" }, { "source_path": "articles/javascript/how-to/with-web-app/azure-function-resource-group-management/clean-up-resources.md", "redirect_url": "/azure/developer/javascript/how-to/with-web-app/azure-function-resource-group-management" }, { "source_path": "articles/javascript/how-to/with-web-app/azure-function-resource-group-management/create-function-app.md", "redirect_url": "/azure/developer/javascript/how-to/with-web-app/azure-function-resource-group-management" }, { "source_path": "articles/javascript/how-to/with-web-app/azure-function-resource-group-management/deploy-azure-function-with-visual-studio-code.md", "redirect_url": "/azure/developer/javascript/how-to/with-web-app/azure-function-resource-group-management" }, { "source_path": "articles/javascript/how-to/with-web-app/azure-function-resource-group-management/view-query-application-logs.md", "redirect_url": "/azure/developer/javascript/how-to/with-web-app/azure-function-resource-group-management" }, { "source_path": "articles/javascript/how-to/with-web-app/azure-function-resource-group-management/introduction.md", "redirect_url": "/azure/developer/javascript/how-to/with-web-app/azure-function-resource-group-management" }, { "source_path": "articles/lab/index.yml", "redirect_url": "/azure/developer/python" }, { "source_path": "articles/lab/quickstart-python-flask.md", "redirect_url": "/azure/developer/python" }, { "source_path": "articles/lab/quickstart-python-flask-minimized.md", "redirect_url": "/azure/developer/python" }, { "source_path": "articles/lab/quickstart-python-flask-multipage.yml", "redirect_url": "/azure/developer/python" }, { "source_path": "articles/lab/tool-tip-metrics.md", "redirect_url": "/azure/developer/python" }, { "source_path": "articles/javascript/tutorial/nodejs-virtual-machine-vm/introduction.md", "redirect_url": "/azure/developer/javascript/tutorial/run-nodejs-virtual-machine" }, { "source_path": "articles/javascript/tutorial/nodejs-virtual-machine-vm/create-azure-monitoring-application-insights-web-resource.md", "redirect_url": "/azure/developer/javascript/tutorial/run-nodejs-virtual-machine" }, { "source_path": "articles/javascript/tutorial/nodejs-virtual-machine-vm/create-linux-virtual-machine-azure-cli.md", "redirect_url": "/azure/developer/javascript/tutorial/run-nodejs-virtual-machine" }, { "source_path": "articles/javascript/tutorial/nodejs-virtual-machine-vm/connect-linux-virtual-machine-ssh.md", "redirect_url": "/azure/developer/javascript/tutorial/run-nodejs-virtual-machine" }, { "source_path": "articles/javascript/tutorial/nodejs-virtual-machine-vm/azure-monitor-application-insights-nodejs-expressjs-code.md", "redirect_url": "/azure/developer/javascript/tutorial/run-nodejs-virtual-machine" }, { "source_path": "articles/javascript/tutorial/nodejs-virtual-machine-vm/azure-monitor-application-insights-logs.md", "redirect_url": "/azure/developer/javascript/tutorial/run-nodejs-virtual-machine" }, { "source_path": "articles/javascript/tutorial/nodejs-virtual-machine-vm/clean-up-resources.md", "redirect_url": "/azure/developer/javascript/tutorial/run-nodejs-virtual-machine" }, { "source_path": "articles/javascript/whats-new-developer-advocacy.md", "redirect_url": "/azure/developer/javascript" }, { "source_path": "articles/javascript/whats-new-docs.md", "redirect_url": "/azure/developer/javascript" }, { "source_path": "articles/javascript/how-to/with-database/getting-started.md", "redirect_url": "/azure/developer/javascript/database-developer-guide" }, { "source_path": "articles/javascript/how-to/with-database/use-azure-cache-for-redis-db.md", "redirect_url": "/azure/developer/javascript/database-developer-guide" }, { "source_path": "articles/javascript/how-to/with-database/use-cassandra-as-cosmos-db.md", "redirect_url": "/azure/developer/javascript/database-developer-guide" }, { "source_path": "articles/javascript/how-to/with-database/use-mongodb-as-cosmosdb.md", "redirect_url": "/azure/developer/javascript/database-developer-guide" }, { "source_path": "articles/javascript/how-to/with-database/use-mysql-mariadb.md", "redirect_url": "/azure/developer/javascript/database-developer-guide" }, { "source_path": "articles/javascript/how-to/with-database/use-postgresql-db.md", "redirect_url": "/azure/developer/javascript/database-developer-guide" }, { "source_path": "articles/javascript/how-to/with-database/use-sql-api-as-cosmos-db.md", "redirect_url": "/azure/developer/javascript/database-developer-guide" }, { "source_path": "articles/javascript/how-to/common-javascript-tasks.md", "redirect_url": "/azure/developer/javascript/core/use-azure-sdk" }, { "source_path": "articles/javascript/core/nodejs-sdk-azure-authenticate.md", "redirect_url": "/azure/developer/javascript/sdk/authentication/local-development-environment-service-principal" }, { "source_path": "articles/javascript/how-to/with-web-app/graphql/get-started.md", "redirect_url": "/azure/developer/javascript/graphql-developer-guide" }, { "source_path": "articles/javascript/how-to/with-web-app/graphql/static-web-app-graphql/introduction.md", "redirect_url": "/azure/developer/javascript/graphql-developer-guide" }, { "source_path": "articles/javascript/how-to/with-web-app/graphql/static-web-app-graphql/graphql-basics.md", "redirect_url": "/azure/developer/javascript/graphql-developer-guide" }, { "source_path": "articles/javascript/how-to/with-web-app/graphql/static-web-app-graphql/local-development.md", "redirect_url": "/azure/developer/javascript/graphql-developer-guide" }, { "source_path": "articles/javascript/how-to/with-web-app/graphql/static-web-app-graphql/create-configure-cosmos-db.md", "redirect_url": "/azure/developer/javascript/graphql-developer-guide" }, { "source_path": "articles/javascript/how-to/with-web-app/graphql/static-web-app-graphql/remote-deployment.md", "redirect_url": "/azure/developer/javascript/graphql-developer-guide" }, { "source_path": "articles/javascript/how-to/with-web-app/static-web-app-nextjs-graphql/getting-started.md", "redirect_url": "/azure/developer/javascript/graphql-developer-guide" }, { "source_path": "articles/javascript/how-to/with-web-app/static-web-app-nextjs-graphql/create-database-upload-data.md", "redirect_url": "/azure/developer/javascript/graphql-developer-guide" }, { "source_path": "articles/javascript/how-to/with-web-app/static-web-app-nextjs-graphql/create-translator-resource.md", "redirect_url": "/azure/developer/javascript/graphql-developer-guide" }, { "source_path": "articles/javascript/how-to/with-web-app/static-web-app-nextjs-graphql/deploy-trivia-game.md", "redirect_url": "/azure/developer/javascript/graphql-developer-guide" }, { "source_path": "articles/javascript/how-to/with-web-app/graphql/azure-function-hello-world.md", "redirect_url": "/azure/developer/javascript/graphql-developer-guide" }, { "source_path": "articles/javascript/how-to/with-web-app/graphql/azure-function-crud-mutation.md", "redirect_url": "/azure/developer/javascript/graphql-developer-guide" }, { "source_path": "articles/javascript/how-to/with-web-app/add-authentication-to-web-app.md", "redirect_url": "/azure/app-service/scenario-secure-app-authentication-app-service-as-user" }, { "source_path": "articles/javascript/tutorial-vscode-serverless-node-01.md", "redirect_url": "/azure/developer/javascript/tutorial/azure-function-cosmos-db-mongo-api" }, { "source_path": "articles/javascript/tutorial/tutorial-vscode-serverless-node-install.md", "redirect_url": "/azure/developer/javascript/tutorial/azure-function-cosmos-db-mongo-api" }, { "source_path": "articles/javascript/tutorial-vscode-serverless-node-02.md", "redirect_url": "/azure/developer/javascript/tutorial/azure-function-cosmos-db-mongo-api" }, { "source_path": "articles/javascript/tutorial/tutorial-vscode-serverless-node-create-local.md", "redirect_url": "/azure/developer/javascript/tutorial/azure-function-cosmos-db-mongo-api" }, { "source_path": "articles/javascript/tutorial-vscode-serverless-node-03.md", "redirect_url": "/azure/developer/javascript/tutorial/azure-function-cosmos-db-mongo-api" }, { "source_path": "articles/javascript/tutorial/tutorial-vscode-serverless-node-test-local.md", "redirect_url": "/azure/developer/javascript/tutorial/azure-function-cosmos-db-mongo-api" }, { "source_path": "articles/javascript/tutorial-vscode-serverless-node-04.md", "redirect_url": "/azure/developer/javascript/tutorial/azure-function-cosmos-db-mongo-api" }, { "source_path": "articles/javascript/tutorial/tutorial-vscode-serverless-node-deploy-hosting.md", "redirect_url": "/azure/developer/javascript/tutorial/azure-function-cosmos-db-mongo-api" }, { "source_path": "articles/javascript/tutorial-vscode-serverless-node-05.md", "redirect_url": "/azure/developer/javascript/tutorial/azure-function-cosmos-db-mongo-api" }, { "source_path": "articles/javascript/tutorial/tutorial-vscode-serverless-node-remove-resource.md", "redirect_url": "/azure/developer/javascript/tutorial/azure-function-cosmos-db-mongo-api" }, { "source_path": "articles/javascript/tutorial/vscode-function-app-http-trigger/tutorial-vscode-serverless-node-create-local.md", "redirect_url": "/azure/developer/javascript/tutorial/azure-function-cosmos-db-mongo-api" }, { "source_path": "articles/javascript/tutorial/vscode-function-app-http-trigger/tutorial-vscode-serverless-node-database-integration.md", "redirect_url": "/azure/developer/javascript/tutorial/azure-function-cosmos-db-mongo-api" }, { "source_path": "articles/javascript/tutorial/vscode-function-app-http-trigger/tutorial-vscode-serverless-node-deploy-hosting.md", "redirect_url": "/azure/developer/javascript/tutorial/azure-function-cosmos-db-mongo-api" }, { "source_path": "articles/javascript/tutorial/vscode-function-app-http-trigger/tutorial-vscode-serverless-node-install.md", "redirect_url": "/azure/developer/javascript/tutorial/azure-function-cosmos-db-mongo-api" }, { "source_path": "articles/javascript/tutorial/vscode-function-app-http-trigger/tutorial-vscode-serverless-node-remove-resource.md", "redirect_url": "/azure/developer/javascript/tutorial/azure-function-cosmos-db-mongo-api" }, { "source_path": "articles/javascript/tutorial/vscode-function-app-http-trigger/tutorial-vscode-serverless-node-test-local.md", "redirect_url": "/azure/developer/javascript/tutorial/azure-function-cosmos-db-mongo-api" }, { "source_path": "articles/javascript/how-to/with-azure-cli/create-postgresql-server-resource.md", "redirect_url": "/azure/developer/javascript/how-to/with-database/use-postgresql-db" }, { "source_path": "articles/javascript/how-to/with-azure-cli/create-mysql-db.md", "redirect_url": "/azure/developer/javascript/how-to/with-database/use-mysql-mariadb?tabs=MySQL" }, { "source_path": "articles/javascript/how-to/with-azure-cli/create-mariadb.md", "redirect_url": "/azure/developer/javascript/how-to/with-database/use-mysql-mariadb?tabs=MySQL" }, { "source_path": "articles/javascript/how-to/with-azure-cli/create-cosmos-sql-api-resource.md", "redirect_url": "/azure/developer/javascript/how-to/with-database/use-sql-api-as-cosmos-db" }, { "source_path": "articles/javascript/how-to/with-azure-cli/create-cassandra-db.md", "redirect_url": "/azure/developer/javascript/how-to/with-database/use-cassandra-as-cosmos-db" }, { "source_path": "articles/javascript/how-to/with-azure-cli/create-cache-for-redis-db.md", "redirect_url": "/azure/developer/javascript/how-to/with-database/use-azure-cache-for-redis-db" }, { "source_path": "articles/javascript/how-to/with-azure-cli/create-mongodb-cosmosdb.md", "redirect_url": "/azure/developer/javascript/how-to/with-database/use-mongodb-as-cosmosdb?tabs=azure-cli%2Cmongodb" }, { "source_path": "articles/javascript/how-to/with-azure-cli/configure-app-service-custom-domain-name.md", "redirect_url": "/azure/app-service/app-service-web-tutorial-custom-domain" }, { "source_path": "articles/javascript/tutorial/deploy-deno-app-azure-app-service-azure-cli.md", "redirect_url": "/azure/developer/javascript/tutorial/nodejs-virtual-machine-vm/introduction" }, { "source_path": "articles/javascript/tutorial/static-web-app/introduction.md", "redirect_url": "/azure/developer/javascript/how-to/create-static-web-app" }, { "source_path": "articles/javascript/tutorial/static-web-app/application-architecture.md", "redirect_url": "/azure/developer/javascript/how-to/create-static-web-app" }, { "source_path": "articles/javascript/tutorial/static-web-app/run-the-react-cognitive-services-image-analyzer-app-locally.md", "redirect_url": "/azure/developer/javascript/how-to/create-static-web-app" }, { "source_path": "articles/javascript/tutorial/static-web-app/create-computer-vision-resource-use-in-code.md", "redirect_url": "/azure/developer/javascript/how-to/create-static-web-app" }, { "source_path": "articles/javascript/tutorial/static-web-app/create-static-web-app-visual-studio-code-extension.md", "redirect_url": "/azure/developer/javascript/how-to/create-static-web-app" }, { "source_path": "articles/javascript/tutorial/static-web-app/add-computer-vision-react-app.md", "redirect_url": "/azure/developer/javascript/how-to/create-static-web-app" }, { "source_path": "articles/javascript/tutorial/static-web-app/clean-up-resources.md", "redirect_url": "/azure/developer/javascript/how-to/create-static-web-app" }, { "source_path": "articles/javascript/how-to/with-database/use-mariadb.md", "redirect_url": "/azure/developer/javascript/how-to/with-database/use-mysql-mariadb" }, { "source_path": "articles/javascript/how-to/with-database/use-mysql-db.md", "redirect_url": "/azure/developer/javascript/how-to/with-database/use-mysql-mariadb" }, { "source_path": "articles/javascript/how-to/with-web-app/azure-function-resource-group-management/view-and-query-application-logs.md", "redirect_url": "/azure/developer/javascript/how-to/with-web-app/azure-function-resource-group-management/view-query-application-logs" }, { "source_path": "articles/javascript/how-to/with-web-app/azure-function-resource-group-management/create-function-app-for-resource-groups.md", "redirect_url": "/azure/developer/javascript/how-to/with-web-app/azure-function-resource-group-management/create-function-app" }, { "source_path": "articles/javascript/tutorial/tutorial-vscode-azure-cli-node/tutorial-vscode-azure-cli-node-06.md", "redirect_url": "/azure/developer/javascript/tutorial/tutorial-vscode-azure-cli-node/tutorial-vscode-azure-cli-node-04#make-change-and-deploy-to-azure-app-service-from-local-git" }, { "source_path": "articles/javascript/how-to/deploy-containers.md", "redirect_url": "/azure/developer/javascript/how-to/deploy-web-app" }, { "source_path": "articles/javascript/how-to/integrate-database.md", "redirect_url": "/azure/developer/javascript/how-to/with-database/getting-started" }, { "source_path": "articles/javascript/core/node-sdk-azure-authenticate.md", "redirect_url": "/azure/developer/javascript/core/nodejs-sdk-azure-authenticate" }, { "source_path": "articles/javascript/tutorial/tutorial-vscode-static-website-node/tutorial-vscode-static-website-node-01.md", "redirect_url": "/azure/static-web-apps/getting-started" }, { "source_path": "articles/javascript/tutorial/tutorial-vscode-static-website-node/tutorial-vscode-static-website-node-02.md", "redirect_url": "/azure/static-web-apps/getting-started" }, { "source_path": "articles/javascript/tutorial/tutorial-vscode-static-website-node/tutorial-vscode-static-website-node-03.md", "redirect_url": "/azure/static-web-apps/getting-started" }, { "source_path": "articles/javascript/tutorial/tutorial-vscode-static-website-node/tutorial-vscode-static-website-node-04.md", "redirect_url": "/azure/static-web-apps/getting-started" }, { "source_path": "articles/javascript/tutorial/client/get-started.md", "redirect_url": "/azure/developer/javascript/how-to/create-static-web-app" }, { "source_path": "articles/javascript/tutorial/tutorial-vscode-static-website-node/tutorial-vscode-static-website-node-05.md", "redirect_url": "/azure/static-web-apps/getting-started" }, { "source_path": "articles/javascript/tutorial/tutorial-vscode-static-website-node/tutorial-vscode-static-website-node-06.md", "redirect_url": "/azure/static-web-apps/getting-started" }, { "source_path": "articles/javascript/core/node-sdk-azure-authenticate-principal.md", "redirect_url": "/azure/developer/javascript/core/nodejs-sdk-azure-authenticate" }, { "source_path": "articles/javascript/concepts/identity-authentication-users.md", "redirect_url": "/azure/developer/javascript/core/nodejs-sdk-azure-authenticate" }, { "source_path": "articles/javascript/how-to/with-sdk/set-up-development-environment.md", "redirect_url": "/azure/developer/javascript/core/nodejs-sdk-azure-authenticate" }, { "source_path": "articles/javascript/how-to/create-static-site.md", "redirect_url": "/azure/developer/javascript/how-to/create-static-web-app" }, { "source_path": "articles/javascript/how-to/develop-nodejs-on-azure.md", "redirect_url": "/azure/developer/javascript/tutorial/deploy-nodejs-mongodb-app-service-from-visual-studio-code" }, { "source_path": "articles/javascript/tutorial-vscode-azure-cli-node-01.md", "redirect_url": "/azure/developer/javascript/tutorial/tutorial-vscode-azure-cli-node/tutorial-vscode-azure-cli-node-01" }, { "source_path": "articles/javascript/tutorial-vscode-azure-cli-node-02.md", "redirect_url": "/azure/developer/javascript/tutorial/tutorial-vscode-azure-cli-node/tutorial-vscode-azure-cli-node-02" }, { "source_path": "articles/javascript/tutorial-vscode-azure-cli-node-03.md", "redirect_url": "/azure/developer/javascript/tutorial/tutorial-vscode-azure-cli-node/tutorial-vscode-azure-cli-node-03" }, { "source_path": "articles/javascript/tutorial-vscode-azure-cli-node-04.md", "redirect_url": "/azure/developer/javascript/tutorial/tutorial-vscode-azure-cli-node/tutorial-vscode-azure-cli-node-04" }, { "source_path": "articles/javascript/tutorial-vscode-azure-cli-node-06.md", "redirect_url": "/azure/developer/javascript/tutorial/tutorial-vscode-azure-cli-node/tutorial-vscode-azure-cli-node-06" }, { "source_path": "articles/javascript/tutorial-vscode-azure-cli-node-05.md", "redirect_url": "/azure/developer/javascript/tutorial/tutorial-vscode-azure-cli-node/tutorial-vscode-azure-cli-node-05" }, { "source_path": "articles/javascript/tutorial-vscode-azure-cli-node-07.md", "redirect_url": "/azure/developer/javascript/tutorial/tutorial-vscode-azure-cli-node/tutorial-vscode-azure-cli-node-07" }, { "source_path": "articles/javascript/tutorial-vscode-docker-node-01.md", "redirect_url": "/azure/developer/javascript/tutorial/tutorial-vscode-docker-node/tutorial-vscode-docker-node-01" }, { "source_path": "articles/javascript/tutorial-vscode-docker-node-02.md", "redirect_url": "/azure/developer/javascript/tutorial/tutorial-vscode-docker-node/tutorial-vscode-docker-node-02" }, { "source_path": "articles/javascript/tutorial-vscode-docker-node-03.md", "redirect_url": "/azure/developer/javascript/tutorial/tutorial-vscode-docker-node/tutorial-vscode-docker-node-03" }, { "source_path": "articles/javascript/tutorial-vscode-docker-node-04.md", "redirect_url": "/azure/developer/javascript/tutorial/tutorial-vscode-docker-node/tutorial-vscode-docker-node-04" }, { "source_path": "articles/javascript/tutorial-vscode-docker-node-05.md", "redirect_url": "/azure/developer/javascript/tutorial/tutorial-vscode-docker-node/tutorial-vscode-docker-node-05" }, { "source_path": "articles/javascript/tutorial-vscode-docker-node-06.md", "redirect_url": "/azure/developer/javascript/tutorial/tutorial-vscode-docker-node/tutorial-vscode-docker-node-06" }, { "source_path": "articles/javascript/tutorial-vscode-docker-node-07.md", "redirect_url": "/azure/developer/javascript/tutorial/tutorial-vscode-docker-node/tutorial-vscode-docker-node-07" }, { "source_path": "articles/javascript/tutorial-vscode-docker-node-08.md", "redirect_url": "/azure/developer/javascript/tutorial/tutorial-vscode-docker-node/tutorial-vscode-docker-node-08" }, { "source_path": "articles/javascript/tutorial-vscode-static-website-node-01.md", "redirect_url": "/azure/static-web-apps/getting-started" }, { "source_path": "articles/javascript/tutorial-vscode-static-website-node-02.md", "redirect_url": "/azure/static-web-apps/getting-started" }, { "source_path": "articles/javascript/tutorial-vscode-static-website-node-03.md", "redirect_url": "/azure/static-web-apps/getting-started" }, { "source_path": "articles/javascript/tutorial-vscode-static-website-node-04.md", "redirect_url": "/azure/static-web-apps/getting-started" }, { "source_path": "articles/javascript/tutorial-vscode-static-website-node-05.md", "redirect_url": "/azure/static-web-apps/getting-started" }, { "source_path": "articles/javascript/tutorial-vscode-static-website-node-06.md", "redirect_url": "/azure/static-web-apps/getting-started" }, { "source_path": "articles/javascript/tutorial-vscode-azure-app-service-node-01.md", "redirect_url": "/azure/developer/javascript/tutorial/deploy-nodejs-azure-app-service-with-visual-studio-code" }, { "source_path": "articles/javascript/tutorial-vscode-azure-app-service-node-02.md", "redirect_url": "/azure/developer/javascript/tutorial/deploy-nodejs-azure-app-service-with-visual-studio-code" }, { "source_path": "articles/javascript/tutorial-vscode-azure-app-service-node-03.md", "redirect_url": "/azure/developer/javascript/tutorial/deploy-nodejs-azure-app-service-with-visual-studio-code" }, { "source_path": "articles/javascript/tutorial-vscode-azure-app-service-node-04.md", "redirect_url": "/azure/developer/javascript/tutorial/deploy-nodejs-azure-app-service-with-visual-studio-code" }, { "source_path": "articles/javascript/tutorial-vscode-azure-app-service-node-05.md", "redirect_url": "/azure/developer/javascript/tutorial/deploy-nodejs-azure-app-service-with-visual-studio-code" }, { "source_path": "articles/javascript/tutorial/deno-visual-studio-code-azure-app-service.yml", "redirect_url": "/azure/developer/javascript/tutorial/deploy-deno-app-azure-app-service-azure-cli" }, { "source_path": "articles/javascript/tutorial/browser-file-upload.yml", "redirect_url": "/azure/developer/javascript/tutorial/browser-file-upload-azure-storage-blob" }, { "source_path": "articles/javascript/tutorial/web-app-mongodb.yml", "redirect_url": "/azure/developer/javascript/tutorial/deploy-nodejs-mongodb-app-service-from-visual-studio-code" }, { "source_path": "articles/javascript/tutorial-visual-studio-code-azure-app-service-deno-04.md", "redirect_url": "/azure/developer/javascript/tutorial/deno-visual-studio-code-azure-app-service?preview=tutorialFeedback" }, { "source_path": "articles/javascript/tutorial-visual-studio-code-azure-app-service-deno-03.md", "redirect_url": "/azure/developer/javascript/tutorial/deno-visual-studio-code-azure-app-service?preview=tutorialFeedback" }, { "source_path": "articles/javascript/tutorial-visual-studio-code-azure-app-service-deno-02.md", "redirect_url": "/azure/developer/javascript/tutorial/deno-visual-studio-code-azure-app-service?preview=tutorialFeedback" }, { "source_path": "articles/javascript/tutorial-visual-studio-code-azure-app-service-deno-01.md", "redirect_url": "/azure/developer/javascript/tutorial/deno-visual-studio-code-azure-app-service?preview=tutorialFeedback" }, { "source_path": "articles/javascript/node-sdk-logging.md", "redirect_url": "/azure/developer/javascript/logging" }, { "source_path": "articles/javascript/how-to/node-sdk-logging.md", "redirect_url": "/azure/developer/javascript/logging" }, { "source_path": "articles/javascript/node-sdk-azure-authenticate.md", "redirect_url": "/azure/developer/javascript/core/node-sdk-azure-authenticate" }, { "source_path": "articles/javascript/node-sdk-azure-authenticate-principal.md", "redirect_url": "/azure/developer/javascript/core/node-sdk-azure-authenticate-principal" }, { "source_path": "articles/javascript/configure-local-development-environment.md", "redirect_url": "/azure/developer/javascript/core/configure-local-development-environment" }, { "source_path": "articles/javascript/tutorial-visualstudiocode-browser-file-upload-feedback.yml", "redirect_url": "/azure/developer/javascript/tutorial/browser-file-upload?preview=tutorialFeedback" }, { "source_path": "articles/javascript/tutorial-visualstudiocode-azure-app-service-mongodb/tutorial-azure-web-app-mongodb-feedback.yml", "redirect_url": "/azure/developer/javascript/tutorial/web-app-mongodb?preview=tutorialFeedback" }, { "source_path": "articles/javascript/node-howto-create-static-site-jamstack.md", "redirect_url": "/azure/developer/javascript/how-to/create-static-site" }, { "source_path": "articles/javascript/node-howto-deploy-containers.md", "redirect_url": "/azure/developer/javascript/how-to/deploy-containers" }, { "source_path": "articles/javascript/node-howto-deploy-web-app.md", "redirect_url": "/azure/developer/javascript/how-to/deploy-web-app" }, { "source_path": "articles/javascript/node-howto-e2e.md", "redirect_url": "/azure/developer/javascript/how-to/develop-nodejs-on-azure" }, { "source_path": "articles/javascript/node-howto-integrate-databases.md", "redirect_url": "/azure/developer/javascript/how-to/integrate-database" }, { "source_path": "articles/javascript/node-howto-write-serverless-code.md", "redirect_url": "/azure/developer/javascript/how-to/develop-serverless-apps" }, { "source_path": "articles/javascript/node-sdk-azure-install.md", "redirect_url": "/javascript/api/?view=azure-node-latest" }, { "source_path": "articles/javascript/overview.md", "redirect_url": "/azure/developer/javascript" }, { "source_path": "articles/javascript/retired/overview.md", "redirect_url": "/azure/developer/javascript" }, { "source_path": "articles/javascript/retired/node-sdk-azure-get-started.md", "redirect_url": "/azure/developer/javascript" }, { "source_path": "articles/javascript/node-samples-services-appservice.md", "redirect_url": "/samples/browse/?languages=javascript%2Cnodejs&products=azure-functions%2Cazure-app-service%2Cazure-logic-apps" }, { "source_path": "articles/javascript/node-samples-services-web-and-mobile.md", "redirect_url": "/samples/browse/?languages=javascript%2Cnodejs&products=azure-functions%2Cazure-app-service%2Cazure-logic-apps" }, { "source_path": "articles/javascript/node-samples-billing.md", "redirect_url": "/samples/browse/?languages=javascript%2Cnodejs" }, { "source_path": "articles/javascript/node-samples-services-compute.md", "redirect_url": "/samples/browse/?languages=javascript%2Cnodejs" }, { "source_path": "articles/javascript/node-samples-services-database.md", "redirect_url": "/samples/browse/?languages=javascript%2Cnodejs&products=azure-cosmos-db%2Cazure-sql-database" }, { "source_path": "articles/javascript/node-samples-services-iot.md", "redirect_url": "/samples/browse/?languages=javascript%2Cnodejs&products=azure-iot-hub%2Cazure-iot-edge%2Cazure-iot-central" }, { "source_path": "articles/javascript/node-samples-services-security-and-identity.md", "redirect_url": "/samples/browse/?languages=javascript%2Cnodejs&products=azure-active-directory%2Cazure-key-vault" }, { "source_path": "articles/javascript/node-samples-services-storage.md", "redirect_url": "/samples/browse/?languages=javascript%2Cnodejs&products=azure-storage" }, { "source_path": "articles/javascript/node-tutorials-services-databases.md", "redirect_url": "/samples/browse/?languages=javascript%2Cnodejs&products=azure-cosmos-db%2Cazure-sql-database" }, { "source_path": "articles/javascript/node-tutorials-services-enterprise.md", "redirect_url": "/samples/browse/?languages=javascript%2Cnodejs&products=azure-iot-hub%2Cazure-iot-edge%2Cazure-iot-central" }, { "source_path": "articles/javascript/node-tutorials-services-messaging-and-iot.md", "redirect_url": "/samples/browse/?languages=javascript%2Cnodejs&products=azure-iot-hub%2Cazure-iot-edge%2Cazure-iot-central" }, { "source_path": "articles/javascript/node-tutorials-services-storage.md", "redirect_url": "/samples/browse/?languages=javascript%2Cnodejs&products=azure-storage" }, { "source_path": "articles/javascript/tutorial/tutorial-vscode-azure-cli-node/tutorial-vscode-azure-cli-node-07.md", "redirect_url": "/azure/app-service/tutorial-nodejs-mongodb-app?tabs=azure-portal%2Cterminal-bash%2Cvscode-deploy%2Cdeploy-instructions-azportal%2Cdeploy-zip-linux-mac%2Cdeploy-instructions--zip-azcli" }, { "source_path": "articles/javascript/tutorial/tutorial-vscode-azure-cli-node/tutorial-vscode-azure-cli-node-05.md", "redirect_url": "/azure/app-service/tutorial-nodejs-mongodb-app?tabs=azure-portal%2Cterminal-bash%2Cvscode-deploy%2Cdeploy-instructions-azportal%2Cdeploy-zip-linux-mac%2Cdeploy-instructions--zip-azcli" }, { "source_path": "articles/javascript/tutorial/tutorial-vscode-azure-cli-node/tutorial-vscode-azure-cli-node-04.md", "redirect_url": "/azure/app-service/tutorial-nodejs-mongodb-app?tabs=azure-portal%2Cterminal-bash%2Cvscode-deploy%2Cdeploy-instructions-azportal%2Cdeploy-zip-linux-mac%2Cdeploy-instructions--zip-azcli" }, { "source_path": "articles/javascript/tutorial/tutorial-vscode-azure-cli-node/tutorial-vscode-azure-cli-node-03.md", "redirect_url": "/azure/app-service/tutorial-nodejs-mongodb-app?tabs=azure-portal%2Cterminal-bash%2Cvscode-deploy%2Cdeploy-instructions-azportal%2Cdeploy-zip-linux-mac%2Cdeploy-instructions--zip-azcli" }, { "source_path": "articles/javascript/tutorial/tutorial-vscode-azure-cli-node/tutorial-vscode-azure-cli-node-02.md", "redirect_url": "/azure/app-service/tutorial-nodejs-mongodb-app?tabs=azure-portal%2Cterminal-bash%2Cvscode-deploy%2Cdeploy-instructions-azportal%2Cdeploy-zip-linux-mac%2Cdeploy-instructions--zip-azcli" }, { "source_path": "articles/javascript/tutorial/tutorial-vscode-azure-cli-node/tutorial-vscode-azure-cli-node-01.md", "redirect_url": "/azure/app-service/tutorial-nodejs-mongodb-app?tabs=azure-portal%2Cterminal-bash%2Cvscode-deploy%2Cdeploy-instructions-azportal%2Cdeploy-zip-linux-mac%2Cdeploy-instructions--zip-azcli" }, { "source_path": "articles/javascript/tutorial/deploy-nodejs-mongodb-app-service-from-visual-studio-code.md", "redirect_url": "/azure/app-service/tutorial-nodejs-mongodb-app?tabs=azure-portal%2Cterminal-bash%2Cvscode-deploy%2Cdeploy-instructions-azportal%2Cdeploy-zip-linux-mac%2Cdeploy-instructions--zip-azcli" }, { "source_path": "articles/javascript/tutorial/deploy-nodejs-azure-app-service-with-visual-studio-code.md", "redirect_url": "/azure/app-service/tutorial-nodejs-mongodb-app?tabs=azure-portal%2Cterminal-bash%2Cvscode-deploy%2Cdeploy-instructions-azportal%2Cdeploy-zip-linux-mac%2Cdeploy-instructions--zip-azcli" }, { "source_path": "articles/javascript/tutorial/single-page-application-azure-login-button-sdk-msal.md", "redirect_url": "/azure/active-directory/develop/tutorial-v2-react" }, { "source_path": "articles/python/sdk-library-api-reference.md", "redirect_url": "/python/api/overview/azure/" }, { "source_path": "articles/python/sdk/index.yml", "redirect_url": "/azure/developer/python/sdk/azure-sdk-overview" }, { "source_path": "articles/python/tutorial-deploy-serverless-cloud-etl-01.md", "redirect_url": "/azure/developer/python/tutorial-deploy-azure-cloud-python-etl-01-overview" }, { "source_path": "articles/python/tutorial-deploy-serverless-cloud-etl-02.md", "redirect_url": "/azure/developer/python/tutorial-deploy-azure-cloud-python-etl-01-overview" }, { "source_path": "articles/python/tutorial-deploy-serverless-cloud-etl-03.md", "redirect_url": "/azure/developer/python/tutorial-deploy-azure-cloud-python-etl-01-overview" }, { "source_path": "articles/python/tutorial-deploy-serverless-cloud-etl-04.md", "redirect_url": "/azure/developer/python/tutorial-deploy-azure-cloud-python-etl-01-overview" }, { "source_path": "articles/python/tutorial-deploy-serverless-cloud-etl-05.md", "redirect_url": "/azure/developer/python/tutorial-deploy-azure-cloud-python-etl-01-overview" }, { "source_path": "articles/python/how-to-assign-role-permissions.md", "redirect_url": "/azure/role-based-access-control/role-assignments-steps" }, { "source_path": "articles/python/sdk.md", "redirect_url": "/azure/developer/python/sdk/azure-sdk-overview" }, { "source_path": "articles/python/python-sdk-azure-sql-database-samples.md", "redirect_url": "/samples/browse/?languages=python&products=azure-cosmos-db%2Cazure-sql-database" }, { "source_path": "articles/python/python-sdk-azure-virtual-machine-samples.md", "redirect_url": "/samples/browse/?languages=python&products=azure-virtual-machines" }, { "source_path": "articles/python/python-sdk-azure-web-apps-samples.md", "redirect_url": "/samples/browse/?languages=python&products=azure-functions%2Cazure-app-service%2Cazure-logic-apps" }, { "source_path": "articles/python/python-sdk-azure-release-notes.md", "redirect_url": "/azure/developer/python/azure-sdk-overview" }, { "source_path": "articles/python/python-sdk-azure-tools.md", "redirect_url": "/azure/developer/python/azure-tools" }, { "source_path": "articles/python/python-azure-tools.md", "redirect_url": "/azure/developer/python/azure-tools" }, { "source_path": "articles/python/python-sdk-azure-authenticate.md", "redirect_url": "/azure/developer/python/azure-sdk-authenticate" }, { "source_path": "articles/python/python-sdk-azure-get-started.yml", "redirect_url": "/azure/developer/python/azure-sdk-overview" }, { "source_path": "articles/python/python-sdk-azure-multi-cloud.md", "redirect_url": "/azure/developer/python/azure-sdk-sovereign-domain" }, { "source_path": "articles/python/azure-sdk-multi-cloud.md", "redirect_url": "/azure/developer/python/azure-sdk-sovereign-domain" }, { "source_path": "articles/python/python-sdk-azure-operation-config.md", "redirect_url": "/azure/developer/python/azure-sdk-library-usage-patterns#optional-arguments-for-client-objects-and-methods" }, { "source_path": "articles/python/azure-sdk-operation-config.md", "redirect_url": "/azure/developer/python/azure-sdk-library-usage-patterns#optional-arguments-for-client-objects-and-methods" }, { "source_path": "articles/python/python-sdk-azure-overview.md", "redirect_url": "/azure/developer/python/azure-sdk-overview" }, { "source_path": "articles/python/python-sdk-azure-install.md", "redirect_url": "/azure/developer/python/azure-sdk-install" }, { "source_path": "articles/python/python-sdk-azure-samples-list-images.md", "redirect_url": "/azure/developer/python/azure-sdk-samples-list-images" }, { "source_path": "articles/python/python-sdk-azure-samples-logic-app-workflow.md", "redirect_url": "/azure/developer/python/azure-sdk-samples-logic-app-workflow" }, { "source_path": "articles/python/python-sdk-azure-samples-managed-disks.md", "redirect_url": "/azure/developer/python/azure-sdk-samples-managed-disks" }, { "source_path": "articles/python/python-sdk-azure-samples-monitor-vms.md", "redirect_url": "/azure/developer/python/azure-sdk-samples-monitor-vms" }, { "source_path": "articles/python/quickstarts-messaging.md", "redirect_url": "/azure/developer/python/quickstarts-messaging-iot" }, { "source_path": "articles/python/quickstarts-security-integration.md", "redirect_url": "/azure/developer/python/quickstarts-identity-security" }, { "source_path": "articles/python/azure-sdk-samples-monitor-vms.md", "redirect_url": "/azure/developer/python/azure-sdk-overview" }, { "source_path": "articles/python/tutorial-vs-code-serverless-python-01.md", "redirect_url": "/azure/azure-functions/create-first-function-vs-code-python" }, { "source_path": "articles/python/tutorial-vs-code-serverless-python-02.md", "redirect_url": "/azure/azure-functions/create-first-function-vs-code-python" }, { "source_path": "articles/python/tutorial-vs-code-serverless-python-03.md", "redirect_url": "/azure/azure-functions/create-first-function-vs-code-python" }, { "source_path": "articles/python/tutorial-vs-code-serverless-python-04.md", "redirect_url": "/azure/azure-functions/create-first-function-vs-code-python" }, { "source_path": "articles/python/tutorial-vs-code-serverless-python-05.md", "redirect_url": "/azure/azure-functions/create-first-function-vs-code-python" }, { "source_path": "articles/python/tutorial-vs-code-serverless-python-06.md", "redirect_url": "/azure/azure-functions/create-first-function-vs-code-python" }, { "source_path": "articles/python/tutorial-vs-code-serverless-python-07.md", "redirect_url": "/azure/azure-functions/create-first-function-vs-code-python" }, { "source_path": "articles/python/tutorial-vs-code-serverless-python-08.md", "redirect_url": "/azure/azure-functions/create-first-function-vs-code-python" }, { "source_path": "articles/python/cloud-azure-terminology.md", "redirect_url": "/azure/azure-glossary-cloud-terminology" }, { "source_path": "articles/go/azure-sdk-go-auth-aad-samples.md", "redirect_url": "/azure/developer/go/azure-sdk-auth-aad-samples" }, { "source_path": "articles/go/azure-sdk-go-authorization.md", "redirect_url": "/azure/developer/go/azure-sdk-authorization" }, { "source_path": "articles/go/azure-sdk-go-compute-networking-samples.md", "redirect_url": "/azure/developer/go/azure-sdk-compute-networking-samples" }, { "source_path": "articles/go/azure-sdk-go-containers-samples.md", "redirect_url": "/azure/developer/go/azure-sdk-containers-samples" }, { "source_path": "articles/go/azure-sdk-go-install.md", "redirect_url": "/azure/developer/go/azure-sdk-install" }, { "source_path": "articles/go/azure-sdk-go-qs-vm.md", "redirect_url": "/azure/developer/go/azure-sdk-qs-vm" }, { "source_path": "articles/go/azure-sdk-go-sql-database-samples.md", "redirect_url": "/azure/developer/go/azure-sdk-sql-database-samples" }, { "source_path": "articles/go/azure-sdk-go-tools.md", "redirect_url": "/azure/developer/go/azure-sdk-tools" }, { "source_path": "articles/go/azure-sdk-go-compute-network-samples.md", "redirect_url": "/azure/developer/go/azure-sdk-compute-network-samples" }, { "source_path": "articles/ansible/cloudshell-run-playbook.md", "redirect_url": "/azure/developer/ansible/getting-started-cloud-shell" }, { "source_path": "articles/ansible/key-vault-configure-vm-security.md", "redirect_url": "/azure/developer/ansible/key-vault-configure-secrets" }, { "source_path": "articles/terraform/install-configure.md", "redirect_url": "/azure/developer/terraform/getting-started-cloud-shell" }, { "source_path": "articles/terraform/create-a-base-template-using-yeoman.md", "redirect_url": "/azure/developer/terraform/create-base-template-using-yeoman" }, { "source_path": "articles/terraform/getting-started-cloud-shell.md", "redirect_url": "/azure/developer/terraform/get-started-cloud-shell" }, { "source_path": "articles/jenkins/azure-dev-spaces-and-aks.md", "redirect_url": "/azure/developer/jenkins" }, { "source_path": "articles/jenkins/deploy-from-github-to-azure-app-service.md", "redirect_url": "/azure/developer/jenkins/deploy-to-azure-app-service-using-azure-cli" }, { "source_path": "articles/jenkins/deploy-to-azure-app-service-using-plugin.md", "redirect_url": "/azure/developer/jenkins/deploy-to-azure-app-service-using-azure-cli" }, { "source_path": "articles/jenkins/deploy-to-aks-using-blue-green-deployment-pattern.md", "redirect_url": "/azure/developer/jenkins/deploy-from-github-to-aks" }, { "source_path": "articles/jenkins/deploy-to-azure-spring-cloud-using-azure-cli.md", "redirect_url": "/azure/developer/jenkins/deploy-to-azure-spring-apps-using-azure-cli" }, { "source_path": "articles/terraform/get-started-cloud-shell.md", "redirect_url": "/azure/developer/terraform/get-started-cloud-shell-bash" }, { "source_path": "articles/go/azure-sdk-auth-aad-samples.md", "redirect_url": "/azure/developer/go/azure-sdk-authentication" }, { "source_path": "articles/go/azure-sdk-compute-networking-samples.md", "redirect_url": "/azure/developer/go/management-libraries" }, { "source_path": "articles/go/manage-resource-groups.md", "redirect_url": "/azure/developer/go/control-plane" }, { "source_path": "articles/go/azure-sdk-qs-vm.md", "redirect_url": "/azure/developer/go/control-plane" }, { "source_path": "articles/go/azure-sdk-containers-samples.md", "redirect_url": "/azure/developer/go/data-plane" }, { "source_path": "articles/go/azure-sdk-sql-database-samples.md", "redirect_url": "/azure/developer/go/data-plane" }, { "source_path": "articles/go/azure-sdk-tools.md", "redirect_url": "/azure/developer/go/configure-visual-studio-code" }, { "source_path": "articles/terraform/application-gateway-quickstart.md", "redirect_url": "/azure/developer/terraform/deploy-application-gateway-v2" }, { "source_path": "articles/developer/python/tutorial-python-postgresql-app-portal.md", "redirect_url": "/azure/app-service/tutorial-python-postgresql-app" }, { "source_path": "articles/python/azure-sdk-authenticate.md", "redirect_url": "/azure/developer/python/sdk/authentication-overview" }, { "source_path": "articles/python/azure-sdk-authenticate-development-environments.md", "redirect_url": "/azure/developer/python/sdk/authentication-local-development-dev-accounts" }, { "source_path": "articles/python/azure-sdk-authenticate-hosted-applications.md", "redirect_url": "/azure/developer/python/sdk/authentication-azure-hosted-apps" }, { "source_path": "articles/python/azure-sdk-authenticate-service-principals.md", "redirect_url": "/azure/developer/python/sdk/authentication-on-premises-apps" }, { "source_path": "articles/python/azure-sdk-configure-proxy.md", "redirect_url": "/azure/developer/python/sdk/azure-sdk-configure-proxy" }, { "source_path": "articles/python/azure-sdk-example-database.md", "redirect_url": "/azure/developer/python/sdk/examples/azure-sdk-example-database" }, { "source_path": "articles/python/azure-sdk-example-list-resource-groups.md", "redirect_url": "/azure/developer/python/sdk/examples/azure-sdk-example-list-resource-groups" }, { "source_path": "articles/python/azure-sdk-example-resource-group.md", "redirect_url": "/azure/developer/python/sdk/examples/azure-sdk-example-resource-group" }, { "source_path": "articles/python/azure-sdk-example-storage.md", "redirect_url": "/azure/developer/python/sdk/examples/azure-sdk-example-storage" }, { "source_path": "articles/python/azure-sdk-example-storage-use.md", "redirect_url": "/azure/developer/python/sdk/examples/azure-sdk-example-storage-use" }, { "source_path": "articles/python/azure-sdk-example-virtual-machines.md", "redirect_url": "/azure/developer/python/sdk/examples/azure-sdk-example-virtual-machines" }, { "source_path": "articles/python/azure-sdk-example-web-app.md", "redirect_url": "/azure/developer/python/sdk/examples/azure-sdk-example-web-app" }, { "source_path": "articles/python/azure-sdk-install.md", "redirect_url": "/azure/developer/python/sdk/azure-sdk-install" }, { "source_path": "articles/python/azure-sdk-library-package-index.md", "redirect_url": "/azure/developer/python/sdk/azure-sdk-library-package-index" }, { "source_path": "articles/python/azure-sdk-library-usage-patterns.md", "redirect_url": "/azure/developer/python/sdk/azure-sdk-library-usage-patterns" }, { "source_path": "articles/python/azure-sdk-logging.md", "redirect_url": "/azure/developer/python/sdk/azure-sdk-logging" }, { "source_path": "articles/python/azure-sdk-overview.md", "redirect_url": "/azure/developer/python/sdk/azure-sdk-overview" }, { "source_path": "articles/python/azure-sdk-samples-managed-disks.md", "redirect_url": "/azure/developer/python/sdk/examples/azure-sdk-samples-managed-disks" }, { "source_path": "articles/python/azure-sdk-sovereign-domain.md", "redirect_url": "/azure/developer/python/sdk/azure-sdk-sovereign-domain" }, { "source_path": "articles/python/azure-tools.md", "redirect_url": "/azure/developer/python/configure-local-development-environment" }, { "source_path": "articles/python/tutorial-deploy-app-service-on-linux-01.md", "redirect_url": "/azure/developer/python/configure-python-web-app-local-environment" }, { "source_path": "articles/python/tutorial-deploy-app-service-on-linux-02.md", "redirect_url": "/azure/developer/python/configure-python-web-app-local-environment" }, { "source_path": "articles/python/tutorial-deploy-app-service-on-linux-03.md", "redirect_url": "/azure/app-service/quickstart-python" }, { "source_path": "articles/python/tutorial-deploy-app-service-on-linux-04.md", "redirect_url": "/azure/developer/python/configure-python-web-app-on-app-service" }, { "source_path": "articles/python/tutorial-deploy-app-service-on-linux-05.md", "redirect_url": "/azure/app-service/quickstart-python" }, { "source_path": "articles/python/tutorial-deploy-app-service-on-linux-06.md", "redirect_url": "/azure/app-service/quickstart-python" }, { "source_path": "articles/python/tutorial-deploy-app-service-on-linux-07.md", "redirect_url": "/azure/app-service/quickstart-python" }, { "source_path": "articles/azure-cli/choose-the-right-azure-command-line-tool.md", "redirect_url": "/cli/azure/choose-the-right-azure-command-line-tool" }, { "source_path": "articles/terraform/create-linux-virtual-machine-with-infrastructure.md", "redirect_url": "/azure/virtual-machines/linux/quick-create-terraform" }, { "source_path": "articles/python/tutorial-deploy-containers-01.md", "redirect_url": "/azure/developer/python/containers-in-azure-overview-python" }, { "source_path": "articles/python/tutorial-deploy-containers-02.md", "redirect_url": "/azure/developer/python/tutorial-containerize-deploy-python-web-app-azure-03" }, { "source_path": "articles/python/tutorial-deploy-containers-03.md", "redirect_url": "/azure/developer/python/tutorial-containerize-deploy-python-web-app-azure-04" }, { "source_path": "articles/python/tutorial-deploy-containers-04.md", "redirect_url": "/azure/developer/python/containers-in-azure-overview-python" }, { "source_path": "articles/python/tutorial-deploy-containers-05.md", "redirect_url": "/azure/developer/python/containers-in-azure-overview-python" }, { "source_path": "articles/python/how-to-create-static-sites.md", "redirect_url": "/azure/developer/python/index" }, { "source_path":"articles/python/how-to-manage-service-principals.md", "redirect_url": "/azure/developer/python/sdk/authentication-local-development-service-principal" }, { "source_path":"articles/terraform/get-started-powershell.md", "redirect_url": "/azure/developer/terraform/get-started-windows-powershell" }, { "source_path":"articles/github/github-variable-substitution.md", "redirect_url": "/azure/developer/github/" }, { "source_path":"articles/github/github-key-vault.md", "redirect_url": "/azure/developer/github/" }, { "source_path":"articles/python/tutorial-python-managed-identity-01.md", "redirect_url": "/azure/developer/python/tutorial-python-managed-identity-user-assigned-cli" }, { "source_path":"articles/python/tutorial-python-managed-identity-02.md", "redirect_url": "/azure/developer/python/tutorial-python-managed-identity-user-assigned-cli" }, { "source_path":"articles/python/tutorial-python-managed-identity-03.md", "redirect_url": "/azure/developer/python/tutorial-python-managed-identity-user-assigned-cli" }, { "source_path":"articles/python/tutorial-python-managed-identity-04.md", "redirect_url": "/azure/developer/python/tutorial-python-managed-identity-user-assigned-cli" }, { "source_path":"articles/python/tutorial-python-managed-identity-05.md", "redirect_url": "/azure/developer/python/tutorial-python-managed-identity-user-assigned-cli" }, { "source_path":"articles/python/tutorial-python-managed-identity-06.md", "redirect_url": "/azure/developer/python/tutorial-python-managed-identity-user-assigned-cli" }, { "source_path":"articles/python/tutorial-python-managed-identity-07.md", "redirect_url": "/azure/developer/python/tutorial-python-managed-identity-user-assigned-cli" }, { "source_path":"articles/terraform/create-k8s-cluster-with-tf-and-aks.md", "redirect_url": "/azure/aks/learn/quick-kubernetes-deploy-terraform" }, { "source_path":"articles/terraform/quick-kubernetes-deploy-terraform.md", "redirect_url": "/azure/aks/learn/quick-kubernetes-deploy-terraform" }, { "source_path": "articles/javascript/how-to/with-web-app/azure-function-file-upload.md", "redirect_url": "/azure/storage/blobs/blob-upload-function-trigger-javascript" }, { "source_path": "articles/javascript/how-to/with-web-app/azure-function-file-upload-v3.md", "redirect_url": "/azure/storage/blobs/blob-upload-function-trigger-javascript" }, { "source_path":"articles/terraform/create-vm-cluster-with-infrastructure.md", "redirect_url": "/azure/virtual-machines/linux/quick-cluster-create-terraform" }, { "source_path":"articles/terraform/create-vm-cluster-module.md", "redirect_url": "/azure/virtual-machines/windows/quick-cluster-create-terraform" }, { "source_path": "articles/python/tutorial-deploy-azure-cloud-python-etl-01-overview.md", "redirect_url": "/azure/developer/python" }, { "source_path": "articles/python/tutorial-deploy-azure-cloud-python-etl-02-get-data.md", "redirect_url": "/azure/developer/python" }, { "source_path": "articles/python/tutorial-deploy-azure-cloud-python-etl-03-process-data.md", "redirect_url": "/azure/developer/python" }, { "source_path": "articles/python/tutorial-deploy-azure-cloud-python-etl-04-deploy-solution.md", "redirect_url": "/azure/developer/python" }, { "source_path": "articles/python/cloud-development-overview.md", "redirect_url": "/azure/developer/python" }, { "source_path": "articles/python/cloud-development-provisioning.md", "redirect_url": "/azure/developer/python" }, { "source_path": "articles/python/cloud-development-flow.md", "redirect_url": "/azure/developer/python" }, { "source_path": "articles/python/configure-local-development-environment.md", "redirect_url": "/azure/developer/python" }, { "source_path":"articles/terraform/create-attestation-provider.md", "redirect_url": "/azure/attestation/quickstart-terraform" }, { "source_path":"articles/terraform/create-k8s-cluster-with-aks-applicationgateway-ingress.md", "redirect_url": "/azure/aks/create-k8s-cluster-with-aks-application-gateway-ingress" }, { "source_path":"articles/terraform/deploy-application-gateway-v2.md", "redirect_url": "/azure/application-gateway/quick-create-terraform" }, { "source_path":"articles/terraform/create-base-template-using-yeoman.md", "redirect_url": "/azure/developer/terraform" }, { "source_path":"articles/python/quickstarts-cognitive-services.md", "redirect_url": "/azure/python/quickstarts-ai-services" }, { "source_path":"articles/javascript/how-to/with-web-app/deploy-msal-sdk-authentication-expressjs.md", "redirect_url": "/entra/identity-platform/quickstart-web-app-nodejs-msal-sign-in" }, { "source_path":"articles/javascript/core/install-nodejs-develop-azure-sdk-project.md", "redirect_url": "/azure/developer/javascript/core/configure-local-development-environment" }, { "source_path": "articles/ansible/configure-in-docker-container.md", "redirect_url": "/azure/developer/ansible" }, { "source_path": "articles/intro/azure-ai-for-developers.md", "redirect_url": "/azure/developer/ai/azure-ai-for-developers" }, { "source_path": "articles/javascript/how-to/with-visual-studio-code/install-run-debug-nodejs.md", "redirect_url": "/azure/app-service/tutorial-nodejs-mongodb-app" }, { "source_path": "articles/go/azure-sdk-install.md", "redirect_url": "/azure/developer/go/" }, { "source_path": "articles/python/sdk/authentication-additional-methods.md", "redirect_url": "/azure/python/sdk/authentication/additional-methods" }, { "source_path": "articles/python/sdk/authentication-azure-hosted-apps.md", "redirect_url": "/azure/python/sdk/authentication/azure-hosted-apps" }, { "source_path": "articles/python/sdk/authentication-local-development-dev-accounts.md", "redirect_url": "/azure/python/sdk/authentication/local-development-dev-accounts" }, { "source_path": "articles/python/sdk/authentication-local-development-service-principal.md", "redirect_url": "/azure/python/sdk/authentication/local-development-service-principal" }, { "source_path": "articles/python/sdk/authentication-on-premises-apps.md", "redirect_url": "/azure/python/sdk/authentication/on-premises-apps" }, { "source_path": "articles/python/sdk/authentication-overview.md", "redirect_url": "/azure/python/sdk/authentication/overview" }, { "source_path": "articles/ai/passwordless-connections.md", "redirect_url": "/azure/developer/ai/keyless-connections" }, { "source_path": "articles/terraform/provider-version-history-azurerm.md", "redirect_url": "/azure/developer/terraform/provider-version-history-azurerm-4-0-0-to-current" }, { "source_path": "articles/ansible/solution-template-deploy.md", "redirect_url": "/azure/developer/ansible/" }, { "source_path": "articles/terraform/test-modules-using-terratest.md", "redirect_url": "/azure/developer/terraform" }, { "source_path": "articles/go/sdk/authentication-overview.md", "redirect_url": "/azure/developer/go/sdk/authentication/authentication-overview" }, { "source_path": "articles/go/azure-sdk-authentication.md", "redirect_url": "/azure/developer/go/sdk/authentication/authentication-overview" }, { "source_path": "articles/go/azure-sdk-authorization.md", "redirect_url": "/azure/developer/go/sdk/authentication/authentication-overview" }, { "source_path": "articles/go/azure-sdk-authentication-managed-identity.md", "redirect_url": "/azure/developer/go/sdk/authentication/system-assigned-managed-identity" }, { "source_path": "articles/go/sdk/authentication/authentication-azure-hosted-apps.md", "redirect_url": "/azure/developer/go/sdk/authentication/system-assigned-managed-identity" }, { "source_path": "articles/go/azure-sdk-authentication-service-principal.md", "redirect_url": "/azure/developer/go/sdk/authentication/local-development-service-principal" }, { "source_path": "articles/javascript/sdk/credential-chains.md", "redirect_url": "/azure/developer/javascript/sdk/authentication/credential-chains" }, { "source_path": "articles/azure-developer-cli/debug.md", "redirect_url": "/azure/developer/azure-developer-cli/get-started" }, { "source_path": "articles/azure-developer-cli/faq.yml", "redirect_url": "/azure/developer/azure-developer-cli/provisioning-deployment-faq" }, { "source_path": "articles/ansible/aks-configure-kubenet-networking.md", "redirect_url": "/azure/developer/ansible/aks-configure-cni-networking" }, { "source_path": "articles/ai/get-started-multi-agents.md", "redirect_url": "/azure/developer/ai/azure-ai-for-developers" }, { "source_path": "articles/javascript/ai/get-started-app-chat-scaling-with-azure-api-management.md", "redirect_url": "/azure/developer/javascript/ai/azure-ai-for-javascript-developers" }, { "source_path": "articles/terraform/azure-terraform-resource-provider/resource-provider-overview.md", "redirect_url": "/azure/developer/terraform/azure-export-for-terraform/resource-provider-overview" }, { "source_path": "articles/terraform/azure-terraform-resource-provider/get-started-export-resources-portal.md", "redirect_url": "/azure/developer/terraform/azure-export-for-terraform/get-started-export-resources-portal" }, { "source_path": "articles/azure-mcp-server/tools/azure-cli-extension.md", "redirect_url": "/azure/developer/azure-mcp-server/tools/index" }, { "source_path": "articles/azure-mcp-server/tools/key-vault-key.md", "redirect_url": "/azure/developer/azure-mcp-server/tools/azure-key-vault" }, { "source_path": "articles/azure-mcp-server/tools/kusto.md", "redirect_url": "/azure/developer/azure-mcp-server/tools/azure-data-explorer" }, { "source_path": "articles/azure-mcp-server/tools/ai-search.md", "redirect_url": "/azure/developer/azure-mcp-server/tools/azure-ai-search" }, { "source_path": "articles/azure-mcp-server/tools/azure-aks.md", "redirect_url": "/azure/developer/azure-mcp-server/tools/azure-kubernetes" }, { "source_path": "articles/azure-mcp-server/tools/storage.md", "redirect_url": "/azure/developer/azure-mcp-server/tools/azure-storage" }, { "source_path": "articles/azure-mcp-server/tools/postgresql.md", "redirect_url": "/azure/developer/azure-mcp-server/tools/azure-database-postgresql" }, { "source_path": "articles/azure-mcp-server/tools/service-bus.md", "redirect_url": "/azure/developer/azure-mcp-server/tools/azure-service-bus" }, { "source_path": "articles/azure-mcp-server/tools/azure-cache-for-redis.md", "redirect_url": "/azure/developer/azure-mcp-server/tools/azure-redis" }, { "source_path": "articles/azure-mcp-server/tools/azure-communications.md", "redirect_url": "/azure/developer/azure-mcp-server/tools/azure-communication" }, { "source_path": "articles/github-copilot-azure/quickstart-deploy-existing-app.md", "redirect_url": "/azure/developer/github-copilot-azure/quickstart-deploy-app-agent-mode" }, { "source_path": "articles/azure-mcp-server/tools/monitor.md", "redirect_url": "/azure/developer/azure-mcp-server/tools/azure-monitor" }, { "source_path": "articles/azure-mcp-server/tools/cosmos-db.md", "redirect_url": "/azure/developer/azure-mcp-server/tools/azure-cosmos-db" }, { "source_path": "articles/azure-mcp-server/tools/azure-developer-cli.md", "redirect_url": "/azure/developer/azure-mcp-server/tools/azure-cli" }, { "source_path": "articles/azure-mcp-server/tools/azure-storage-sync.md", "redirect_url": "/azure/developer/azure-mcp-server/tools/azure-file-sync" }, { "source_path": "articles/github-copilot-azure/quickstart-build-deploy-applications.md", "redirect_url": "/azure/developer/github-copilot-azure/quickstart-deploy-app-agent-mode" }, { "source_path": "articles/github-copilot-azure/optimize-examples.md", "redirect_url": "/azure/developer/github-copilot-azure/introduction" }, { "source_path": "articles/chef/client-install-from-azure-portal.md", "redirect_url": "https://docs.chef.io/azure_chef_cli/", "redirect_document_id": false }, { "source_path": "articles/chef/habitat-overview.md", "redirect_url": "https://docs.chef.io/azure_chef_cli/", "redirect_document_id": false }, { "source_path": "articles/chef/index.yml", "redirect_url": "https://docs.chef.io/azure_chef_cli/", "redirect_document_id": false }, { "source_path": "articles/chef/inspec-overview.md", "redirect_url": "https://docs.chef.io/azure_chef_cli/", "redirect_document_id": false }, { "source_path": "articles/chef/overview.md", "redirect_url": "https://docs.chef.io/azure_chef_cli/", "redirect_document_id": false }, { "source_path": "articles/chef/windows-vm-configure.md", "redirect_url": "https://docs.chef.io/azure_chef_cli/", "redirect_document_id": false }, { "source_path": "articles/python/sdk/authentication/azure-hosted-apps.md", "redirect_url": "/azure/developer/python/sdk/authentication/system-assigned-managed-identity", "redirect_document_id": false }, { "source_path": "articles/azure-mcp-server/tools/azure-ai-best-practices.md", "redirect_url": "/azure/developer/azure-mcp-server/tools/azure-best-practices" }, { "source_path": "articles/azure-mcp-server/tools/azure-health-resource.md", "redirect_url": "/azure/developer/azure-mcp-server/tools/azure-resource-health", "redirect_document_id": false }, { "source_path": "articles/azure-mcp-server/tools/azure-virtual-machines.md", "redirect_url": "/azure/developer/azure-mcp-server/tools/azure-compute", "redirect_document_id": false } ] } ================================================ FILE: .whatsnew.json ================================================ { "$schema": "https://github.com/dotnet/docs-tools/blob/main/WhatsNew.Infrastructure/Configuration/reposettings.schema.json", "repositoryName": "azure-dev-docs-pr", "repositoryOwner": "MicrosoftDocs", "docSetProductName": "Azure developer documentation", "rootDirectory": "articles/", "docLinkSettings": { "linkFormat": "relative", "relativeLinkPrefix": "./" }, "repositoryUrl": "https://github.com/MicrosoftDocs/azure-dev-docs-pr", "branches": [ { "name": "main", "isDefault": true } ], "inclusionCriteria": { "minAdditionsToFile": 40 }, "areas": [ { "names": ["ai"], "heading": "AI apps using Azure services" }, { "names": ["ansible"], "heading": "Ansible on Azure" }, { "names": ["github"], "heading": "Azure and GitHub integration" }, { "names": ["azure-developer-cli"], "heading": "Azure Developer CLI (azd)" }, { "names": ["cpp"], "heading": "Azure for C++" }, { "names": ["go"], "heading": "Azure for Go" }, { "names": ["javascript"], "heading": "Azure for JavaScript" }, { "names": ["java"], "heading": "Azure for Java" }, { "names": ["python"], "heading": "Azure for Python" }, { "names": ["rust"], "heading": "Azure for Rust" }, { "names": ["azure-mcp-server"], "heading": "Azure MCP Server" }, { "names": ["dev-tunnels"], "heading": "Dev tunnels" }, { "names": ["github-copilot-app-modernization"], "heading": "GitHub Copilot Modernization" }, { "names": ["github-copilot-azure"], "heading": "GitHub Copilot for Azure" }, { "names": ["iac"], "heading": "Infrastructure as Code" }, { "names": ["intro"], "heading": "Introduction to Azure for developers" }, { "names": ["jenkins"], "heading": "Jenkins on Azure" }, { "names": ["terraform"], "heading": "Terraform on Azure" }, { "names": ["typespec"], "heading": "TypeSpec" } ] } ================================================ FILE: CODEOWNERS ================================================ # Testing the new code owners feature in GitHub. Please contact Cory Fowler if you have questions. # Global owner * @Susan-Potter # Config /articles/docfx.json @KarlErickson @Susan-Potter /.openpublishing.publish.config.json @KarlErickson @Susan-Potter /CODEOWNERS @KarlErickson @Susan-Potter # AI /articles/ai/ @ms-johnalex # Intro /articles/intro/ @Susan-Potter # DevEx /articles/python/ @PatAltimore /articles/go/ @PatAltimore /articles/cpp/ @ronniegeraghty @antkmsft @PatAltimore /articles/rust/ @ronniegeraghty @heaths @diberry /articles/javascript/ @diberry /articles/java/ @KarlErickson /articles/github-copilot-app-modernization/ @KarlErickson # Tools /articles/azure-developer-cli/ @alexwolfmsft @kristenwomack /articles/typespec/ @diberry /articles/azure-mcp-server/ @diberry @sandeep-sen /articles/azure-mcp-server/get-started @diberry @sandeep-sen @alexwolfmsft # Azure SDK authentication topics /articles/go/sdk/authentication/ @scottaddie @chlowell /articles/java/sdk/authentication/ @scottaddie @g2vinay @anannya03 /articles/javascript/sdk/authentication/ @scottaddie @KarishmaGhiya @minhanh-phan @maorleger /articles/python/sdk/authentication/ @scottaddie @pvaneck @xiangyan99 /articles/python/sdk/authorization/ @scottaddie @pvaneck @xiangyan99 /articles/cpp/sdk/authentication/ @scottaddie @antkmsft @ronniegeraghty /articles/rust/sdk/authentication/ @scottaddie @ronniegeraghty @chlowell @heaths ================================================ FILE: CODE_OF_CONDUCT.md ================================================ This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. ================================================ FILE: CONTRIBUTING.md ================================================ # Contributing to Microsoft Azure Documentation Thank you for taking the time to contribute to the Microsoft Azure documentation. This guide covers some general topics related to contribution and refers to our [contributor guide](https://learn.microsoft.com/contribute) for more detailed explanations when required. ## Code of Conduct This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information, see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. ## How can I contribute? There are many ways to contribute to the documentation. Review the following sections to find out which one is right for you. ### Reporting bugs and suggesting enhancements Please use the Feedback tool at the bottom of any article to submit bugs and suggestions. ![Feedback Tool](media/feedback-tool.png) ### Editing in GitHub Follow the guidance for [Quick edits to existing documents](https://learn.microsoft.com/contribute/#quick-edits-to-documentation) in our contributor guide. ### Pull requests Review the guidance for [pull requests](https://learn.microsoft.com/contribute/how-to-write-workflows-major#pull-request-processing) and the contribution workflow in our contributor guide. ================================================ FILE: LICENSE ================================================ Attribution 4.0 International ======================================================================= Creative Commons Corporation ("Creative Commons") is not a law firm and does not provide legal services or legal advice. Distribution of Creative Commons public licenses does not create a lawyer-client or other relationship. Creative Commons makes its licenses and related information available on an "as-is" basis. Creative Commons gives no warranties regarding its licenses, any material licensed under their terms and conditions, or any related information. Creative Commons disclaims all liability for damages resulting from their use to the fullest extent possible. Using Creative Commons Public Licenses Creative Commons public licenses provide a standard set of terms and conditions that creators and other rights holders may use to share original works of authorship and other material subject to copyright and certain other rights specified in the public license below. The following considerations are for informational purposes only, are not exhaustive, and do not form part of our licenses. Considerations for licensors: Our public licenses are intended for use by those authorized to give the public permission to use material in ways otherwise restricted by copyright and certain other rights. Our licenses are irrevocable. Licensors should read and understand the terms and conditions of the license they choose before applying it. Licensors should also secure all rights necessary before applying our licenses so that the public can reuse the material as expected. Licensors should clearly mark any material not subject to the license. This includes other CC- licensed material, or material used under an exception or limitation to copyright. More considerations for licensors: wiki.creativecommons.org/Considerations_for_licensors Considerations for the public: By using one of our public licenses, a licensor grants the public permission to use the licensed material under specified terms and conditions. If the licensor's permission is not necessary for any reason--for example, because of any applicable exception or limitation to copyright--then that use is not regulated by the license. Our licenses grant only permissions under copyright and certain other rights that a licensor has authority to grant. Use of the licensed material may still be restricted for other reasons, including because others have copyright or other rights in the material. A licensor may make special requests, such as asking that all changes be marked or described. Although not required by our licenses, you are encouraged to respect those requests where reasonable. More_considerations for the public: wiki.creativecommons.org/Considerations_for_licensees ======================================================================= Creative Commons Attribution 4.0 International Public License By exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Creative Commons Attribution 4.0 International Public License ("Public License"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions. Section 1 -- Definitions. a. Adapted Material means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image. b. Adapter's License means the license You apply to Your Copyright and Similar Rights in Your contributions to Adapted Material in accordance with the terms and conditions of this Public License. c. Copyright and Similar Rights means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights. d. Effective Technological Measures means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements. e. Exceptions and Limitations means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material. f. Licensed Material means the artistic or literary work, database, or other material to which the Licensor applied this Public License. g. Licensed Rights means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license. h. Licensor means the individual(s) or entity(ies) granting rights under this Public License. i. Share means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them. j. Sui Generis Database Rights means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world. k. You means the individual or entity exercising the Licensed Rights under this Public License. Your has a corresponding meaning. Section 2 -- Scope. a. License grant. 1. Subject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to: a. reproduce and Share the Licensed Material, in whole or in part; and b. produce, reproduce, and Share Adapted Material. 2. Exceptions and Limitations. For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions. 3. Term. The term of this Public License is specified in Section 6(a). 4. Media and formats; technical modifications allowed. The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a) (4) never produces Adapted Material. 5. Downstream recipients. a. Offer from the Licensor -- Licensed Material. Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License. b. No downstream restrictions. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material. 6. No endorsement. Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(A)(i). b. Other rights. 1. Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise. 2. Patent and trademark rights are not licensed under this Public License. 3. To the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties. Section 3 -- License Conditions. Your exercise of the Licensed Rights is expressly made subject to the following conditions. a. Attribution. 1. If You Share the Licensed Material (including in modified form), You must: a. retain the following if it is supplied by the Licensor with the Licensed Material: i. identification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated); ii. a copyright notice; iii. a notice that refers to this Public License; iv. a notice that refers to the disclaimer of warranties; v. a URI or hyperlink to the Licensed Material to the extent reasonably practicable; b. indicate if You modified the Licensed Material and retain an indication of any previous modifications; and c. indicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License. 2. You may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information. 3. If requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(A) to the extent reasonably practicable. 4. If You Share Adapted Material You produce, the Adapter's License You apply must not prevent recipients of the Adapted Material from complying with this Public License. Section 4 -- Sui Generis Database Rights. Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material: a. for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database; b. if You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material; and c. You must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database. For the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights. Section 5 -- Disclaimer of Warranties and Limitation of Liability. a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. c. The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability. Section 6 -- Term and Termination. a. This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically. b. Where Your right to use the Licensed Material has terminated under Section 6(a), it reinstates: 1. automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or 2. upon express reinstatement by the Licensor. For the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License. c. For the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License. d. Sections 1, 5, 6, 7, and 8 survive termination of this Public License. Section 7 -- Other Terms and Conditions. a. The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed. b. Any arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License. Section 8 -- Interpretation. a. For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License. b. To the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions. c. No term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor. d. Nothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority. ======================================================================= Creative Commons is not a party to its public licenses. Notwithstanding, Creative Commons may elect to apply one of its public licenses to material it publishes and in those instances will be considered the “Licensor.” The text of the Creative Commons public licenses is dedicated to the public domain under the CC0 Public Domain Dedication. Except for the limited purpose of indicating that material is shared under a Creative Commons public license or as otherwise permitted by the Creative Commons policies published at creativecommons.org/policies, Creative Commons does not authorize the use of the trademark "Creative Commons" or any other trademark or logo of Creative Commons without its prior written consent including, without limitation, in connection with any unauthorized modifications to any of its public licenses or any other arrangements, understandings, or agreements concerning use of licensed material. For the avoidance of doubt, this paragraph does not form part of the public licenses. Creative Commons may be contacted at creativecommons.org. ================================================ FILE: LICENSE-CODE ================================================ The MIT License (MIT) Copyright (c) Microsoft Corporation Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: README.md ================================================ # Microsoft Azure Documentation Welcome to the open-source [documentation](/azure) of [Microsoft Azure](https://azure.microsoft.com). Please review this README file to understand how you can assist in contributing to the Microsoft Azure documentation. ## Getting Started Contributing to open source is more than just providing updates, it's also about letting us know when there is an issue. Read our [Contributing guidance](CONTRIBUTING.md) to find out more. ### Prerequisites You've decided to contribute, that's great! To contribute to the documentation, you need a few tools. #### GitHub Contributing to the documentation requires a GitHub account. If you don't have an account, follow the instructions for [GitHub account setup](https://learn.microsoft.com/contribute/get-started-setup-github) from our contributor guide. #### Tools To install necessary tools, follow the instructions for [Install content authoring tools](https://learn.microsoft.com/contribute/get-started-setup-tools) from our contributor guide. ## License Please refer to [LICENSE](LICENSE), [LICENSE-CODE](LICENSE-CODE) and [ThirdPartyNotices](ThirdPartyNotices) for all Licensing information. ## Code of Conduct This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information, see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. ================================================ FILE: SECURITY.md ================================================ ## Security Microsoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin), and [our GitHub organizations](https://opensource.microsoft.com/). If you believe you have found a security vulnerability in any Microsoft-owned repository that meets [Microsoft's definition of a security vulnerability](https://aka.ms/opensource/security/definition), please report it to us as described below. ## Reporting Security Issues **Please do not report security vulnerabilities through public GitHub issues.** Instead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://aka.ms/opensource/security/create-report). If you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com). If possible, encrypt your message with our PGP key; please download it from the [Microsoft Security Response Center PGP Key page](https://aka.ms/opensource/security/pgpkey). You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://aka.ms/opensource/security/msrc). Please include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue: * Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.) * Full paths of source file(s) related to the manifestation of the issue * The location of the affected source code (tag/branch/commit or direct URL) * Any special configuration required to reproduce the issue * Step-by-step instructions to reproduce the issue * Proof-of-concept or exploit code (if possible) * Impact of the issue, including how an attacker might exploit the issue This information will help us triage your report more quickly. If you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://aka.ms/opensource/security/bounty) page for more details about our active programs. ## Preferred Languages We prefer all communications to be in English. ## Policy Microsoft follows the principle of [Coordinated Vulnerability Disclosure](https://aka.ms/opensource/security/cvd). ================================================ FILE: ThirdPartyNotices ================================================ ##Legal Notices Microsoft and any contributors grant you a license to the Microsoft documentation and other content in this repository under the [Creative Commons Attribution 4.0 International Public License](https://creativecommons.org/licenses/by/4.0/legalcode), see the [LICENSE](LICENSE) file, and grant you a license to any code in the repository under the [MIT License](https://opensource.org/licenses/MIT), see the [LICENSE-CODE](LICENSE-CODE) file. Microsoft, Windows, Microsoft Azure and/or other Microsoft products and services referenced in the documentation may be either trademarks or registered trademarks of Microsoft in the United States and/or other countries. The licenses for this project do not grant you rights to use any Microsoft names, logos, or trademarks. Microsoft's general trademark guidelines can be found at http://go.microsoft.com/fwlink/?LinkID=254653. Privacy information can be found at https://privacy.microsoft.com/en-us/ Microsoft and any contributors reserve all others rights, whether under their respective copyrights, patents, or trademarks, whether by implication, estoppel or otherwise. ================================================ FILE: articles/ai/TOC.yml ================================================ items: - name: Develop AI apps using Azure services href: index.yml items: - name: Overview href: azure-ai-for-developers.md - name: Concepts items: - name: Generative AI concepts and introduction items: - name: Introduction to generative AI href: introduction-build-generative-ai-solutions.md - name: Concepts and considerations href: gen-ai-concepts-considerations-developers.md - name: Augment LLMs with RAG and fine-tuning href: augment-llm-rag-fine-tuning.md - name: Advanced RAG href: advanced-retrieval-augmented-generation.md - name: Security concepts items: - name: Security planning for LLM-based applications href: /ai/playbook/technology-guidance/generative-ai/mlops-in-openai/security/security-plan-llm-application?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json - name: How-tos items: - name: Extract entities using Azure OpenAI Structured Outputs Mode href: how-to/extract-entities-using-structured-outputs.md - name: Switch between OpenAI and Azure OpenAI endpoints href: how-to/switching-endpoints.md - name: Security items: - name: Use Azure OpenAI without keys href: keyless-connections.md - name: Use Azure AI Search without keys href: /azure/search/keyless-connections?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json - name: AI app design items: - name: AI agent orchestration patterns href: /azure/architecture/ai-ml/guide/ai-agent-design-patterns?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json - name: Design your AI app to support foundation model life cycles href: /azure/architecture/ai-ml/guide/manage-foundation-models-lifecycle?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json - name: Agents with Model Context Protocol (MCP) items: - name: Build Agents using Model Context Protocol on Azure href: intro-agents-mcp.md - name: Build a TypeScript MCP server using Azure Container Apps servers href: build-mcp-server-ts.md - name: Create OpenAI-powered agents using MCP href: build-openai-mcp-server-dotnet.md - name: Build AI agent tools using remote MCP with Azure Functions href: https://techcommunity.microsoft.com/blog/appsonazureblog/build-ai-agent-tools-using-remote-mcp-with-azure-functions/4401059 - name: Host Remote MCP Servers in Azure App Service href: https://techcommunity.microsoft.com/blog/appsonazureblog/host-remote-mcp-servers-in-azure-app-service/4405082 - name: Discover and try new models items: - name: Develop reasoning apps with DeepSeek models on Microsoft Foundry using the OpenAI SDK href: how-to/use-reasoning-model-inference.md - name: Get started with DeepSeek-R1 reasoning model href: /azure/ai-foundry/model-inference/tutorials/get-started-deepseek-r1?tabs=python - name: AI app templates items: - name: Overview href: intelligent-app-templates.md - name: Secure your AI App with keyless authentication href: get-started-securing-your-ai-app.md - name: Chat with your data items: - name: Python items: - name: Get started with the chat app template href: ../python/get-started-app-chat-template.md?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json - name: Get started with multimodal vision in a chat app href: get-started-app-chat-vision.md - name: JavaScript items: - name: Get started with the chat app template href: ../javascript/ai/get-started-app-chat-template.md?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json - name: Serverless AI chat with RAG using LangChain.js href: ../javascript/ai/get-started-app-chat-template-langchainjs.md?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json - name: Serverless Azure OpenAI Assistants with function calling href: ../javascript/ai/get-started-app-chat-assistants-function-calling.md?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json - name: Java href: ../java/ai/get-started-app-chat-template.md?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json - name: .NET href: /dotnet/ai/get-started-app-chat-template?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json - name: Evaluate the chat app items: - name: Python href: ../python/get-started-app-chat-evaluations.md?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json - name: JavaScript href: ../javascript/ai/get-started-app-chat-evaluations.md?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json - name: Load balance the chat app items: - name: Load balance with Azure Container Apps items: - name: Python href: ../python/get-started-app-chat-scaling-with-azure-container-apps.md?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json - name: JavaScript href: ../javascript/ai/get-started-app-chat-scaling-with-azure-container-apps.md?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json - name: Java href: ../java/ai/get-started-app-chat-scaling-with-azure-container-apps.md?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json - name: .NET href: /dotnet/ai/get-started-app-chat-scaling-with-azure-container-apps?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json - name: Load balance with Azure API Management items: - name: Python href: ../python/get-started-app-chat-scaling-with-azure-api-management.md?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json - name: Load test the Python chat app with Locust href: ../python/get-started-app-chat-app-load-test-locust.md?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json - name: Configure document security for the Python chat app href: ../python/get-started-app-chat-document-security-trim.md?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json - name: Redeploy the Python chat app with private endpoints href: ../python/get-started-app-chat-private-endpoint.md?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json - name: Connect a JavaScript frontend and Python backend href: ../javascript/ai/chat-app-with-separate-front-back-end.md?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json - name: Resources items: - name: Resources for all languages href: resources-overview.md - name: Python items: - name: Python resources href: ../python/azure-ai-for-python-developers.md?&toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json - name: Get started generating text using Azure OpenAI Service href: /azure/ai-services/openai/quickstart?pivots=programming-language-python&toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json - name: Get started using chat completions with Azure OpenAI Service href: /azure/ai-services/openai/chatgpt-quickstart?pivots=programming-language-python&toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json - name: Chat with Azure OpenAI models using your own data href: /azure/ai-services/openai/use-your-data-quickstart?pivots=programming-language-python&toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json - name: Get started using Azure OpenAI Assistants href: /azure/ai-services/openai/assistants-quickstart?pivots=programming-language-python&toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json - name: Use images in your AI chats href: /azure/ai-services/openai/gpt-v-quickstart?pivots=programming-language-python&toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json - name: Generate images with Azure OpenAI Service href: /azure/ai-services/openai/dall-e-quickstart?pivots=programming-language-python&toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json - name: JavaScript items: - name: JavaScript resources href: ../javascript/ai/azure-ai-for-javascript-developers.md?&toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json - name: Get started using chat completions with Azure OpenAI Service href: /azure/ai-services/openai/chatgpt-quickstart?pivots=programming-language-javascript&toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json - name: Chat with Azure OpenAI models using your own data href: /azure/ai-services/openai/use-your-data-quickstart?pivots=programming-language-javascript&toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json - name: Get started using Azure OpenAI Assistants href: /azure/ai-services/openai/assistants-quickstart?pivots=programming-language-javascript&toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json - name: Use images in your AI chats href: /azure/ai-services/openai/gpt-v-quickstart?pivots=programming-language-javascript&toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json - name: Get started generating text using Azure OpenAI Service href: /azure/ai-services/openai/quickstart?pivots=programming-language-javascript&toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json - name: Generate images with Azure OpenAI Service href: /azure/ai-services/openai/dall-e-quickstart?pivots=programming-language-javascript&toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json - name: Java items: - name: Java resources href: ../java/ai/azure-ai-for-java-developers.md?&toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json - name: Get started using chat completions with Azure OpenAI Service href: /azure/ai-services/openai/chatgpt-quickstart?pivots=programming-language-java&toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json - name: Get started using GPT-35-Turbo and GPT-4 with Azure OpenAI Service in IntelliJ href: ../java/toolkit-for-intellij/chatgpt-intellij.md?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json - name: Chat with Azure OpenAI models using your own data href: /azure/ai-services/openai/use-your-data-quickstart?pivots=programming-language-spring&toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json - name: Get started using Azure OpenAI Assistants href: /azure/ai-services/openai/assistants-quickstart?pivots=programming-language-java&toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json - name: Use images in your AI chats href: /azure/ai-services/openai/gpt-v-quickstart?pivots=programming-language-java&toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json - name: Get started generating text using Azure OpenAI Service href: /azure/ai-services/openai/quickstart?pivots=programming-language-java&toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json - name: Generate images with Azure OpenAI Service href: /azure/ai-services/openai/dall-e-quickstart?pivots=programming-language-java&toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json - name: .NET items: - name: AI for .NET docs center href: /dotnet/ai - name: Overview href: /dotnet/ai/get-started/dotnet-ai-overview?&toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json - name: Learning resources and samples href: /dotnet/ai/azure-ai-for-dotnet-developers?&toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json - name: Build a chat app href: /dotnet/ai/quickstarts/get-started-azure-openai?&toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json - name: Create a chat app that uses your data href: /dotnet/ai/quickstarts/quickstart-ai-chat-with-data?&toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json - name: Summarize text href: /dotnet/ai/quickstarts/quickstart-openai-summarize-text?&toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json - name: Generate images href: /dotnet/ai/quickstarts/quickstart-openai-generate-images?&toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json - name: Implement RAG using vector search href: /dotnet/ai/tutorials/tutorial-ai-vector-search?&toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json - name: Go href: ../go/azure-ai-for-go-developers.md?&toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json ================================================ FILE: articles/ai/advanced-retrieval-augmented-generation.md ================================================ --- title: Build Advanced Retrieval-Augmented Generation Systems description: As a developer, learn about real-world considerations and patterns for retrieval-augmented generation (RAG)-based chat systems. ms.date: 01/30/2026 ms.topic: how-to ms.custom: build-2024-intelligent-apps ms.subservice: intelligent-apps content_well_notification: - AI-contribution ai-usage: ai-assisted ms.collection: ce-skilling-ai-copilot # CustomerIntent: As an AI app developer, I want to learn about real-world considerations and patterns for retrieval-augmented generation (RAG)-based chat systems. --- # Build advanced retrieval-augmented generation systems This article explains retrieval-augmented generation (RAG) and what developers need to build a production-ready RAG solution. To learn about two ways to build a "chat over your data" app—one of the top generative AI use cases for businesses—see [Augment LLMs with RAG or fine-tuning](./augment-llm-rag-fine-tuning.md). The following diagram shows the main steps of RAG: :::image type="content" source="./media/naive-rag-inference-pipeline-highres.png" border="false" alt-text="Diagram that depicts a simple RAG flow, with boxes representing steps or processes and arrows connecting each box." ::: This process is called _naive RAG_. It helps you understand the basic parts and roles in a RAG-based chat system. Real-world RAG systems need more preprocessing and post-processing to handle articles, queries, and responses. The next diagram shows a more realistic setup, called _advanced RAG_: :::image type="content" source="./media/advanced-rag-inference-pipeline-highres.png" border="false" alt-text="Diagram that depicts the advanced RAG flow of logic as a series of boxes with arrows between them." ::: This article gives you a simple framework to understand the main phases in a real-world RAG-based chat system: - Ingestion phase - Inference pipeline phase - Evaluation phase ## Ingestion Ingestion means saving your organization's documents so you can quickly find answers for users. The main challenge is to find and use the parts of documents that best match each question. Most systems use vector embeddings and cosine similarity search to match questions to content. You get better results when you understand the content type (like patterns and format) and organize your data well in the vector database. When setting up ingestion, focus on these steps: - Content preprocessing and extraction - Chunking strategy - Chunking organization - Update strategy ### Content preprocessing and extraction The first step in the ingestion phase is to preprocess and extract the content from your documents. This step is crucial because it ensures that the text is clean, structured, and ready for indexing and retrieval. Clean and accurate content makes a RAG-based chat system work better. Start by looking at the shape and style of the documents you want to index. Do they follow a set pattern, like documentation? If not, what questions could these documents answer? At a minimum, set up your ingestion pipeline to: - Standardize text formats - Handle special characters - Remove unrelated or old content - Track different versions of content - Handle content with tabs, images, or tables - Extract metadata Some of this information, like metadata, can help during retrieval and evaluation if you keep it with the document in the vector database. You can also combine it with the text chunk to improve the chunk's vector embedding. ### Chunking strategy As a developer, decide how to break up large documents into smaller chunks. Chunking helps send the most relevant content to the LLM so it can answer user questions better. Also, think about how you'll use the chunks after you get them. Try out common industry methods and test your chunking strategy in your organization. When chunking, think about: - **Chunk size optimization**: Pick the best chunk size and how to split it—by section, paragraph, or sentence. - **Overlapping and sliding window chunks**: Decide if chunks should be separate or overlap. You can also use a sliding window approach. - **Small2Big**: If you split by sentence, organize the content so you can find nearby sentences or the full paragraph. Giving this extra context to the LLM can help it answer better. For more, see the next section. ### Chunking organization In a RAG system, how you organize your data in the vector database makes it easier and faster to find the right information. Here are some ways to set up your indexes and searches: - **Hierarchical indexes**: Use layers of indexes. A top-level summary index quickly finds a small set of likely chunks. A second-level index points to the exact data. This setup speeds up searches by narrowing down the options before looking in detail. - **Specialized indexes**: Pick indexes that fit your data. For example, use graph-based indexes if your chunks connect to each other, like in citation networks or knowledge graphs. Use relational databases if your data is in tables, and filter with SQL queries. - **Hybrid indexes**: Combine different indexing methods. For example, use a summary index first, then a graph-based index to explore connections between chunks. ### Alignment optimization Make retrieved chunks more relevant and accurate by matching them to the types of questions they answer. One way is to create a sample question for each chunk that shows what question it answers best. This approach helps in several ways: - **Improved matching**: During retrieval, the system compares the user’s question to these sample questions to find the best chunk. This technique improves the relevance of the results. - **Training data for machine learning models**: These question-chunk pairs help train the machine learning models in the RAG system. The models learn which chunks answer which types of questions. - **Direct query handling**: If a user’s question matches a sample question, the system can quickly find and use the right chunk, speeding up the response. Each chunk’s sample question acts as a label that guides the retrieval algorithm. The search becomes more focused and aware of context. This method works well when chunks cover many different topics or types of information. ### Update strategies If your organization updates documents often, you need to keep your database current so the retriever can always find the latest information. The _retriever component_ is the part of the system that searches the vector database and returns results. Here are some ways to keep your vector database up to date: - **Incremental updates**: - **Regular intervals**: Set updates to run on a schedule (like daily or weekly) based on how often documents change. This action keeps the database fresh. - **Trigger-based updates**: Set up automatic updates when someone adds or changes a document. The system reindexes only the affected parts. - **Partial updates**: - **Selective reindexing**: Update only the parts of the database that changed, not the whole thing. This technique saves time and resources, especially for large datasets. - **Delta encoding**: Store just the changes between old and new documents, which reduces the amount of data to process. - **Versioning**: - **Snapshotting**: Save versions of your document set at different times. This action lets you go back or restore earlier versions if needed. - **Document version control**: Use a version control system to track changes and keep a history of your documents. - **Real-time updates**: - **Stream processing**: Use stream processing to update the vector database in real time as documents change. - **Live querying**: Use live queries to get up-to-date answers, sometimes mixing live data with cached results for speed. - **Optimization techniques**: - **Batch processing**: Group changes and apply them together to save resources and reduce overhead. - **Hybrid approaches**: Mix different strategies: - Use incremental updates for small changes. - Use full reindexing for significant updates. - Track and document major changes to your data. Pick the update strategy or mix that fits your needs. Think about: - Document corpus size - Update frequency - Real-time data needs - Available resources Review these factors for your application. Each method has trade-offs in complexity, cost, and how quickly updates show up. ## Inference pipeline Your articles are now chunked, vectorized, and stored in a vector database. Next, focus on getting the best answers from your system. To get accurate and fast results, think about these key questions: - Is the user's question clear and likely to get the right answer? - Does the question break any company rules? - Can you rewrite the question to help the system find better matches? - Do the results from the database match the question? - Should you change the results before sending them to the LLM to make sure the answer is relevant? - Does the LLM's answer fully address the user's question? - Does the answer follow your organization's rules? The whole inference pipeline works in real time. There’s no single right way to set up your preprocessing and post-processing steps. You use a mix of code and LLM calls. One of the biggest trade-offs is balancing accuracy and compliance with cost and speed. Let’s look at strategies for each stage of the inference pipeline. ### Query preprocessing steps Query preprocessing starts right after the user sends a question: :::image type="content" source="./media/advanced-rag-query-processing-steps-highres.png" border="false" alt-text="Diagram that repeats the advanced RAG steps, with emphasis on the box labeled query processing steps." ::: These steps help make sure the user’s question fits your system and is ready to find the best article chunks using cosine similarity or "nearest neighbor" search. **Policy check**: Use logic to spot and remove or flag unwanted content, like personal data, bad language, or attempts to break safety rules (called "jailbreaking"). **Query rewriting**: Change the question if needed—expand acronyms, remove slang, or rephrase it to focus on bigger ideas (step-back prompting). A special version of step-back prompting is _Hypothetical Document Embeddings (HyDE)_. HyDE has the LLM answer the question, makes an embedding from that answer, and then searches the vector database with it. ### Subqueries Subqueries break a long or complex question into smaller, easier questions. The system answers each small question, then combines the answers. For example, if someone asks, "Who made more important contributions to modern physics, Albert Einstein or Niels Bohr?" you can split it into: - **Subquery 1**: "What did Albert Einstein contribute to modern physics?" - **Subquery 2**: "What did Niels Bohr contribute to modern physics?" The answers might include: - For Einstein: the theory of relativity, the photoelectric effect, and _E=mc^2_. - For Bohr: the hydrogen atom model, work on quantum mechanics, and the principle of complementarity. You can then ask follow-up questions: - **Subquery 3**: "How did Einstein's theories change modern physics?" - **Subquery 4**: "How did Bohr's theories change modern physics?" These follow-ups look at each scientist’s effect, like: - How Einstein’s work led to new ideas in cosmology and quantum theory - How Bohr’s work helped us understand atoms and quantum mechanics The system combines the answers to give a full response to the original question. This method makes complex questions easier to answer by breaking them into clear, smaller parts. ### Query router Sometimes, your content lives in several databases or search systems. In these cases, use a query router. A _query router_ picks the best database or index to answer each question. A query router works after the user asks a question but before the system searches for answers. Here’s how a query router works: 1. **Query analysis**: The LLM or another tool looks at the question to figure out what kind of answer is needed. 1. **Index selection**: The router picks one or more indexes that fit the question. Some indexes are better for facts, others for opinions or special topics. 1. **Query dispatch**: The router sends the question to the chosen index or indexes. 1. **Results aggregation**: The system collects and combines the answers from the indexes. 1. **Answer generation**: The system creates a clear answer using the information it found. Use different indexes or search engines for: - **Data type specialization**: Some indexes focus on news, others on academic papers, or on special databases like medical or legal info. - **Query type optimization**: Some indexes are fast for simple facts (like dates), while others handle complex or expert questions. - **Algorithmic differences**: Different search engines use different methods, like vector search, keyword search, or advanced semantic search. For example, in a medical advice system, you might have: - A research paper index for technical details - A case study index for real-world examples - A general health index for basic questions If someone asks about the effects of a new drug, the router sends the question to the research paper index. If the question is about common symptoms, it uses the general health index for a simple answer. ### Post-retrieval processing steps Post-retrieval processing happens after the system finds content chunks in the vector database: :::image type="content" source="./media/advanced-rag-post-retrieval-processing-steps-highres.png" border="false" alt-text="Diagram that repeats the advanced RAG steps, with emphasis on the box labeled post-retrieval processing steps." ::: Next, check if these chunks are useful for the LLM prompt before sending them to the LLM. Keep these things in mind: - Extra information can hide the most important details. - Irrelevant information can make the answer worse. Watch out for the _needle in a haystack_ problem: LLMs often pay more attention to the start and end of a prompt than the middle. Also, remember the LLM’s maximum context window and the number of tokens needed for long prompts, especially at scale. To handle these issues, use a post-retrieval processing pipeline with steps like: - **Filtering results**: Only keep chunks that match the query. Ignore the rest when building the LLM prompt. - **Re-ranking**: Put the most relevant chunks at the beginning and end of the prompt. - **Prompt compression**: Use a small, cheap model to summarize and combine chunks into a single prompt before sending it to the LLM. ### Post-completion processing steps Post-completion processing happens after the user’s question and all content chunks go to the LLM: :::image type="content" source="./media/advanced-rag-post-completion-processing-steps-highres.png" border="false" alt-text="Diagram that repeats the advanced RAG steps, with emphasis on the box labeled post-completion processing steps." ::: After the LLM gives an answer, check its accuracy. A post-completion processing pipeline can include: - **Fact check**: Look for statements in the answer that claim to be facts, then check if they’re true. If a fact check fails, you can ask the LLM again or show an error message. - **Policy check**: Make sure the answer doesn’t include harmful content for the user or your organization. ## Evaluation Evaluating a system like this is more complex than running regular unit or integration tests. Think about these questions: - Are users happy with the answers? - Are the answers accurate? - How do you collect user feedback? - Are there rules about what data you can collect? - Can you see every step the system took when answers are wrong? - Do you keep detailed logs for root cause analysis? - How do you update the system without making things worse? ### Capturing and acting on feedback from users Work with your organization's privacy team to design feedback capture tools, system data, and logging for forensics and root cause analysis of a query session. The next step is to build an _assessment pipeline_. An assessment pipeline makes it easier and faster to review feedback and find out why the AI gave certain answers. Check every response to see how the AI produced it, if the right content chunks were used, and how the documents were split up. Also, look for extra preprocessing or post-processing steps that could improve results. This close review often finds content gaps, especially when no good documentation exists for a user's question. You need an assessment pipeline to handle these tasks at scale. A good pipeline uses custom tools to measure answer quality. It helps you see why the AI gave a specific answer, which documents it used, and how well the inference pipeline worked. ### Golden dataset One way to check how well a RAG chat system works is to use a golden dataset. A _golden dataset_ is a set of questions with approved answers, helpful metadata (like topic and question type), links to source documents, and different ways users might ask the same thing. A golden dataset shows the "best case scenario." Developers use it to see how well the system works and to run tests when they add new features or updates. ### Assessing harm Harms modeling helps you spot possible risks in a product and plan ways to reduce them. A harms assessment tool should include these key features: - **Stakeholder identification**: Helps you list and group everyone affected by the technology, including direct users, people affected indirectly, future generations, and even the environment. - **Harm categories and descriptions**: Lists possible harms, like privacy loss, emotional distress, or economic harm. Guides you through examples and helps you think about both expected and unexpected problems. - **Severity and probability assessments**: Helps you judge how serious and likely each harm is, so you can decide what to fix first. You can use data to support your choices. - **Mitigation strategies**: Suggests ways to reduce risks, like changing the system design, add safeguards, or use other technology. - **Feedback mechanisms**: Lets you collect feedback from stakeholders so you can keep improving the process as you learn more. - **Documentation and reporting**: Makes it easy to create reports that show what you found and what you did to reduce risks. These features help you find and fix risks, and they also help you build more ethical and responsible AI by thinking about all possible impacts from the start. For more information, see these articles: - [Foundations of assessing harm](/azure/architecture/guide/responsible-innovation/harms-modeling/) - [Types of harm](/azure/architecture/guide/responsible-innovation/harms-modeling/type-of-harm) ### Testing and verifying the safeguards _Red-teaming_ is key—it means to act like an attacker to find weak spots in the system. This step is especially important to stop jailbreaking. For tips on planning and managing red teaming for responsible AI, see [Planning red teaming for large language models (LLMs) and their applications](/azure/ai-foundry/openai/concepts/red-teaming?view=foundry&preserve-view=true). Developers should test RAG system safeguards in different scenarios to make sure they work. This step makes the system stronger and also helps fine-tune responses to follow ethical standards and rules. ## Final considerations for application design Here are some key things to remember from this article that can help you design your app: - Generative AI unpredictability - User prompt changes and their effect on time and cost - Parallel LLM requests for faster performance To build a generative AI app, check out [Get started with chat by using your own data sample for Python](/azure/developer/python/get-started-app-chat-template?tabs=github-codespaces). The tutorial is also available for [.NET](/dotnet/ai/get-started-app-chat-template?tabs=github-codespaces), [Java](/azure/developer/java/ai/get-started-app-chat-template?tabs=github-codespaces), and [JavaScript](/azure/developer/javascript/get-started-app-chat-template?tabs=github-codespaces). ================================================ FILE: articles/ai/augment-llm-rag-fine-tuning.md ================================================ --- title: Augment LLMs with RAGs or Fine-Tuning description: Get a conceptual introduction to creating retrieval-augmented generation (RAG)-based chat systems, with an emphasis on integration, optimization, and ethical considerations for delivering contextually relevant responses. ms.date: 01/30/2026 ms.topic: concept-article ms.custom: build-2024-intelligent-apps ms.collection: ce-skilling-ai-copilot ms.subservice: intelligent-apps --- # Augment large language models with retrieval-augmented generation or fine-tuning This article explains how large language models (LLMs) can use extra data to provide better answers. By default, an LLM only knows what it learned during training. You can add real-time or private data to make it more useful. There are two main ways to add this extra data: - **Retrieval-augmented generation (RAG)**: Uses semantic search and contextual priming to find and add helpful information before the model answers. Learn more in [Key concepts and considerations for building generative AI solutions](./gen-ai-concepts-considerations-developers.md). - **Fine-tuning**: Retrains the LLM on a smaller, specific dataset so it gets better at certain tasks or topics. The next sections break down both methods. ## Understanding RAG RAG enables the key "chat over my data" scenario. In this scenario, an organization has a potentially large corpus of textual content, like documents, documentation, and other proprietary data. It uses this corpus as the basis for answers to user prompts. RAG lets you build chatbots or agents that answer questions using your own documents. Here's how it works: 1. Store your documents (or parts of them, called *chunks*) in a database 2. Create an *embedding* for each chunk; a list of numbers that describe it 3. When someone asks a question, the system finds similar chunks 4. Send the relevant chunks along with the question to the LLM to create an answer ### Creating an index of vectorized documents Start by building a vector data store. This store holds the embeddings for each document or chunk. The following diagram shows the main steps to create a vectorized index of your documents. :::image type="content" source="./media/vector-embedding-pipeline-highres.png" border="false" alt-text="Diagram that depicts the different stages of document ingestion in a RAG-based chat system." ::: The diagram shows a *data pipeline*. This pipeline brings in data, processes it, and manages it for the system. It also prepares the data for storage in the vector database and makes sure it’s in the right format for the LLM. Embeddings drive the whole process. An embedding is a set of numbers that represents the meaning of words, sentences, or documents so a machine learning model can use them. One way to create an embedding is to send your content to the Azure OpenAI Embeddings API. The API returns a vector—a list of numbers. Each number describes something about the content, like its topic, meaning, grammar, or style. - Topic matter - Semantic meaning - Syntax and grammar - Word and phrase usage - Contextual relationships - Style or tone All these numbers together show where the content sits in a multi-dimensional space. Imagine a 3D graph, but with hundreds or thousands of dimensions. Computers can work with this kind of space, even if we can’t draw it. The [Tutorial: Explore Azure OpenAI in Microsoft Foundry Models embeddings and document search](/azure/ai-foundry/openai/tutorials/embeddings?view=foundry&tabs=command-line&pivots=programming-language-python&preserve-view=true) provides a guide on how to use the Azure OpenAI Embeddings API to create embeddings for your documents. #### Storing the vector and content The next step involves storing the vector and the content (or a pointer to the content's location) and other metadata in a vector database. A vector database is like any other type of database, but with two key differences: - Vector databases use a vector as an index to search for data - Vector databases often use nearest neighbor algorithms, which can employ *cosine similarity* as a distance metric to find vectors that most closely match the search criteria With the corpus of documents stored in a vector database, developers can build a *retriever component* to retrieve documents that match the user's query. The system uses this data to supply the LLM with what it needs to answer the user's query. ### Answering queries by using your documents A RAG system first uses semantic search to find articles that might be helpful to the LLM when it composes an answer. The next step involves sending the matching articles with the user's original prompt to the LLM to compose an answer. The following diagram depicts a simple RAG implementation (sometimes called *naive RAG*): :::image type="content" source="./media/naive-rag-inference-pipeline-highres.png" border="false" alt-text="Diagram that depicts a simple RAG flow." ::: In the diagram, a user submits a query. First, the system turns the user's prompt into an embedding. Then, it searches the vector database to find the documents or chunks that are most similar to the prompt. *Cosine similarity* measures how close two vectors are by looking at the angle between them. A value near 1 means the vectors are very similar; a value near -1 means they’re very different. This approach helps the system find documents with similar content. *Nearest neighbor algorithms* find the vectors that are closest to a given point. The *k-nearest neighbors (KNN) algorithm* looks for the top *k* closest matches. Systems like recommendation engines often use KNN and cosine similarity together to find the best matches for a user’s needs. After the search, send the best matching content and the user’s prompt to the LLM so it can generate a more relevant response. ### Challenges and considerations A RAG system comes with its own challenges: - **Data privacy**: Handle user data responsibly, especially when retrieving or processing information from outside sources. - **Computational requirements**: Expect both retrieval and generation steps to use significant computing resources. - **Accuracy and relevance**: Focus on delivering accurate, relevant responses and watch for bias in your data or models. Developers need to address these challenges to build RAG systems that are efficient, ethical, and valuable. To learn more about building production-ready RAG systems, see [Build advanced retrieval-augmented generation systems](advanced-retrieval-augmented-generation.md). Want to try building a generative AI solution? Start with [Get started with the chat using your own data sample for Python](/azure/developer/python/get-started-app-chat-template?tabs=github-codespaces). Tutorials are also available for [.NET](/dotnet/ai/get-started-app-chat-template?tabs=github-codespaces), [Java](/azure/developer/java/ai/get-started-app-chat-template?tabs=github-codespaces), and [JavaScript](/azure/developer/javascript/ai/get-started-app-chat-template?tabs=github-codespaces). ## Fine-tuning a model Fine-tuning retrains an LLM on a smaller, domain-specific dataset after its initial training on a large, general dataset. During pretraining, LLMs learn language structure, context, and general patterns from broad data. Fine-tuning teaches the model with new, focused data so it can perform better on specific tasks or topics. As it learns, the model updates its weights to handle the details of the new data. ### Key benefits of fine-tuning - **Specialization**: Fine-tuning helps the model do better on specific tasks, like analyzing legal or medical documents or handling customer service. - **Efficiency**: Fine-tuning uses less data and fewer resources than training a model from scratch. - **Adaptability**: Fine-tuning lets the model learn new tasks or domains not covered in the original training. - **Improved performance**: Fine-tuning helps the model understand the language, style, or terminology of a new domain. - **Personalization**: Fine-tuning can make the model’s responses fit the needs or preferences of a user or organization. ### Limitations and challenges Fine-tuning also has some challenges: - **Data requirement**: You need a large, high-quality dataset for your specific task or domain. - **Risk of overfitting**: With a small dataset, the model might do well on training data but poorly on new data. - **Cost and resources**: Fine-tuning still needs computing power, especially for large models or datasets. - **Maintenance and updating**: You need to update fine-tuned models as your domain changes. - **Model drift**: Fine-tuning for a specific task can make the model less effective at general language tasks. [Customize a model through fine-tuning](/azure/ai-foundry/openai/how-to/fine-tuning?view=foundry&tabs=oai-sdk%2Cazure-openai&pivots=programming-language-studio&preserve-view=true) explains how to fine-tune a model. ## Fine-tuning vs. RAG Fine-tuning and RAG both help LLMs work better, but each fits different needs. Pick the right approach based on your goals, the data and compute you have, and whether you want the model to specialize or stay general. ### When to choose fine-tuning - **Task-specific performance**: Pick fine-tuning when you need top results for a specific task and have enough domain data to avoid overfitting. - **Control over data**: Use fine-tuning if you have unique or proprietary data that’s very different from what the base model was pretrained on. - **Stable content**: Choose fine-tuning if your task doesn’t need constant updates with the latest information. ### When to choose RAG - **Dynamic or changing content**: Use RAG when you need the most current information, like for news or recent events. - **Wide topic coverage**: Pick RAG if you want strong results across many topics, not just one area. - **Limited resources**: Go with RAG if you don’t have lots of data or compute for training, and the base model already does a good job. ## Final thoughts for application design Decide between fine-tuning and RAG based on what your app needs. Fine-tuning is best for specialized tasks, while RAG gives you flexibility and up-to-date content for dynamic scenarios. ================================================ FILE: articles/ai/azure-ai-for-developers.md ================================================ --- title: Overview of AI app development description: Overview article introducing the resources available in this content area, and how to get started integrating generative AI into applications. keywords: ai, azure openai service ms.service: azure ms.topic: overview ms.date: 11/25/2025 ms.custom: overview, devx-track-dotnet, devx-track-extended-java, devx-track-js, devx-track-python, build-2024-intelligent-apps content_well_notification: - AI-contribution ai-usage: ai-assisted --- # Overview of AI app development This documentation is designed for experienced developers who are new to building generative AI apps on Azure using Azure Services and their favorite programming language. ## Introduction to generative AI for developers Generative AI opens many new possibilities for applications. As a developer, it's important that you develop a mental model that maps how the new terminology and technologies related to generative AI fit into what you already understand. The following series of articles show you how your current development experience applies to generative AI. * [Introduction to developing generative AI apps for experienced developers](./introduction-build-generative-ai-solutions.md) * [Important concepts and considerations for developers building generative AI solutions](./gen-ai-concepts-considerations-developers.md) * [Augmenting a Large Language Model with Retrieval-Augmented Generation and Fine-tuning](./augment-llm-rag-fine-tuning.md) * [Building advanced Retrieval-Augmented Generation systems](./advanced-retrieval-augmented-generation.md) ## AI app design Designing AI applications involves understanding user needs, selecting appropriate AI models, and integrating them effectively into your app architecture. The following resources provide guidance on best practices for designing AI-powered applications. * [AI agent orchestration patterns](/azure/architecture/ai-ml/guide/ai-agent-design-patterns?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json) * [Design your AI app to support foundation model life cycles](/azure/architecture/ai-ml/guide/manage-foundation-models-lifecycle?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json) ## AI app templates AI app templates provide you with well-maintained, easy to deploy reference samples that provide a high-quality starting point for your AI apps. There are two categories of AI app templates, **building blocks** and **end-to-end solutions**. Building blocks are smaller-scale samples that focus on specific scenarios and tasks. End-to-end solutions are comprehensive reference samples including documentation, source code, and deployment to allow you to take and extend for your own purposes. To review a list of key templates available for each programming language, see [AI app templates](/azure/developer/ai/intelligent-app-templates). To browse all available templates, see the AI app templates on the [AI App Template gallery](https://azure.github.io/ai-app-templates/?tags=azureopenai). One of the most popular templates is the chat with your data sample using Azure OpenAI and Azure AI Search. # [.NET](#tab/dotnet) * [Get started with the chat using your own data sample for .NET](/dotnet/ai/get-started-app-chat-template?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json) * [Source code](https://github.com/Azure-Samples/azure-search-openai-demo-csharp) # [Java](#tab/java) * [Get started with the chat using your own data sample for Java](/azure/developer/java/ai/get-started-app-chat-template?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json) * [Source code](https://github.com/Azure-Samples/azure-search-openai-demo-java) * [Video](https://aka.ms/azai/java/video) # [Python](#tab/python) * [Get started with the chat using your own data sample for Python](/azure/developer/python/get-started-app-chat-template?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json) * [Source code](https://github.com/Azure-Samples/azure-search-openai-demo) # [JavaScript](#tab/javascript) * [Get started with the chat using your own data sample for JavaScript](/azure/developer/javascript/get-started-app-chat-template?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json) * [Source code](https://github.com/Azure-Samples/azure-search-openai-javascript) * [Video (JavaScript frontend and Python backend)](https://aka.ms/azai/js.py/video) --- ## Agents and Model Context Protocol (MCP) For developers interested in building more advanced AI applications, including agents that can interact with various services and APIs, we provide comprehensive resources and templates. * [Build Agents using Model Context Protocol on Azure](./intro-agents-mcp.md) - Learn how to build intelligent agents that can perform complex tasks by using the Model Context Protocol (MCP) on Azure. * [Build a TypeScript MCP server using Azure Container Apps servers](./build-mcp-server-ts.md) - A step-by-step guide to creating a TypeScript-based MCP server hosted on Azure Container Apps * [Create OpenAI-powered agents using MCP](./build-openai-mcp-server-dotnet.md) - A tutorial on building OpenAI-powered agents using MCP with .NET. ## Authentication and security Building AI applications requires strong authentication and security to protect data and meet regulations. The following articles explain how to secure your AI apps on Azure. * [Security planning for LLM-based applications](/ai/playbook/technology-guidance/generative-ai/mlops-in-openai/security/security-plan-llm-application?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json) * [Use Azure OpenAI without keys](./keyless-connections.md) * [Use Azure AI Search without keys](/azure/search/keyless-connections?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json) ## More resources by language Each language overview page links to popular articles, samples, documentation and more specific to your preferred programming language or platform. - [Python](../python/azure-ai-for-python-developers.md?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json) - [JavaScript](../javascript/ai/azure-ai-for-javascript-developers.md?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json) - [Java](../java/ai/azure-ai-for-java-developers.md?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json) - [.NET](/dotnet/ai/azure-ai-for-dotnet-developers?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json) ================================================ FILE: articles/ai/breadcrumb/toc.yml ================================================ items: - name: Azure tocHref: /azure topicHref: /azure/index items: - name: Developer tocHref: /azure/developer topicHref: /azure/developer/index items: - name: AI tocHref: /azure topicHref: /azure/developer/ai/index ================================================ FILE: articles/ai/build-mcp-server-ts.md ================================================ --- title: "Build a TypeScript MCP server using Azure Container Apps" description: "Learn how to build a remote TypeScript Model Context Protocol (MCP) server using Azure Container Apps." ms.date: 09/12/2025 ms.topic: get-started ms.subservice: intelligent-apps content_well_notification: - AI-contribution ai-usage: ai-assisted ms.collection: ce-skilling-ai-copilot # CustomerIntent: As an AI app developer, I want to learn how to build a TypeScript Model Context Protocol (MCP) server using Azure Container Apps. --- # Build a TypeScript MCP server using Azure Container Apps This article explains how to build a Model Context Protocol (MCP) server using Node.js and TypeScript. The server runs tools and services in a serverless environment. Use this structure as a starting point to create custom MCP servers. ## Get to the code Explore the [TypeScript remote Model Context Protocol (MCP) server](https://github.com/Azure-Samples/mcp-container-ts) sample. It demonstrates how to use Node.js and TypeScript to build a remote MCP server and deploy it to Azure Container Apps. Jump to the [code walkthrough section](#exploring-the-sample-code) to understand how this sample works. ## Architectural overview The following diagram shows the simple architecture of the sample app: :::image type="content" source="./media/build-mcp-server-ts/simple-architecture-diagram.png" lightbox="./media/build-mcp-server-ts/simple-architecture-diagram.png" alt-text="Diagram showing architecture from Visual Studio Code hosting the agent and MCP client to MCP Server."::: The MCP server runs as a containerized app on Azure Container Apps (ACA). It uses a Node.js/TypeScript backend to provide tools to the MCP client through the Model Context Protocol. All tools work with a backend SQLite database. ## Cost To keep costs low, this sample uses basic or consumption pricing tiers for most resources. Adjust the tier as needed, and delete resources when you're done to avoid charges. ## Prerequisites 1. [Visual Studio Code](https://code.visualstudio.com/) - Latest version to support MCP Server development. 1. [GitHub Copilot](https://marketplace.visualstudio.com/items?itemName=GitHub.copilot) Visual Studio Code extension 1. [GitHub Copilot Chat](https://marketplace.visualstudio.com/items?itemName=GitHub.copilot-chat) Visual Studio Code extension 1. [Azure Developer CLI (azd)](/azure/developer/azure-developer-cli/install-azd?tabs=winget-windows%2Cbrew-mac%2Cscript-linux&pivots=os-windows) A [development container](https://containers.dev/) includes all the dependencies you need for this article. You can run it in GitHub Codespaces (in a browser) or locally using Visual Studio Code. To follow this article, make sure you meet these prerequisites: #### [GitHub Codespaces (recommended)](#tab/github-codespaces) - An Azure subscription – [Create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn) - Azure account permissions – Your Azure account must have `Microsoft.Authorization/roleAssignments/write` permissions, such as [Role Based Access Control Administrator](/azure/role-based-access-control/built-in-roles#role-based-access-control-administrator-preview), [User Access Administrator](/azure/role-based-access-control/built-in-roles#user-access-administrator), or [Owner](/azure/role-based-access-control/built-in-roles#owner). If you don't have subscription-level permissions, you must be granted [RBAC](/azure/role-based-access-control/built-in-roles#role-based-access-control-administrator-preview) for an existing resource group and deploy to that group. - Your Azure account also needs `Microsoft.Resources/deployments/write` permissions at the subscription level. - GitHub account #### [Visual Studio Code](#tab/visual-studio-code) - An Azure subscription – [Create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn) - Azure account permissions – Your Azure account must have `Microsoft.Authorization/roleAssignments/write` permissions, such as [User Access Administrator](/azure/role-based-access-control/built-in-roles#user-access-administrator) or [Owner](/azure/role-based-access-control/built-in-roles#owner) - [Azure Developer CLI](/azure/developer/azure-developer-cli) - [Docker Desktop](https://www.docker.com/products/docker-desktop/) – make sure Docker Desktop is running - [Visual Studio Code](https://code.visualstudio.com/) - [Dev Container Extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) --- ## Open development environment Follow these steps to set up a preconfigured development environment with all the required dependencies. #### [GitHub Codespaces (recommended)](#tab/github-codespaces) [GitHub Codespaces](https://docs.github.com/codespaces) runs a development container managed by GitHub with [Visual Studio Code for the Web](https://code.visualstudio.com/docs/editor/vscode-web) as the interface. Use GitHub Codespaces for the simplest setup, as it comes with the necessary tools and dependencies preinstalled for this article. > [!IMPORTANT] > All GitHub accounts can use Codespaces for up to 60 hours free each month with two core instances. For more information, see [GitHub Codespaces monthly included storage and core hours](https://docs.github.com/billing/managing-billing-for-github-codespaces/about-billing-for-github-codespaces#monthly-included-storage-and-core-hours-for-personal-accounts). Use the following steps to create a new GitHub Codespace on the `main` branch of the [`Azure-Samples/mcp-container-ts`](https://github.com/Azure-Samples/mcp-container-ts) GitHub repository. 1. Right-click the following button and select _Open link in new window_. This action lets you have the development environment and the documentation open side by side. [![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/Azure-Samples/mcp-container-ts) 1. On the **Create codespace** page, review and then select **Create new codespace**. 1. Wait for the codespace to start. It might take a few minutes. 1. Sign in to Azure with the Azure Developer CLI in the terminal at the bottom of the screen. ```azdeveloper azd auth login ``` 1. Copy the code from the terminal and then paste it into a browser. Follow the instructions to authenticate with your Azure account. You do the rest of the tasks in this development container. #### [Visual Studio Code](#tab/visual-studio-code) The [Dev Containers extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) for Visual Studio Code needs [Docker](https://docs.docker.com/) installed on your computer. The extension uses Docker to host the development container locally with the necessary tools and dependencies preinstalled for this article. 1. Create a new local directory on your computer for the project. ```shell mkdir my-mcp-server ``` 1. Navigate to the directory you created. ```shell cd my-mcp-server ``` 1. Open Visual Studio Code in that directory: ```shell code . ``` 1. Open a new terminal in Visual Studio Code. 1. Run the following AZD command to bring the GitHub repository to your local computer. ```azdeveloper azd init -t mcp-container-ts ``` 1. Open the Command Palette, search for and select **Dev Containers: Open Folder in Container** to open the project in a dev container. Wait until the dev container opens before continuing. 1. Sign in to Azure with the Azure Developer CLI. ```azdeveloper azd auth login ``` 1. You do the rest of the exercises in this development container. --- > [!NOTE] > To run the MCP server locally: > 1. Set up your environment as described in the [Local environment setup](https://github.com/Azure-Samples/mcp-container-ts?tab=readme-ov-file#local-environment) section in the sample repository. > 1. Configure your MCP Server to use the local environment by following the instructions in the [Configure the MCP server in Visual Studio Code](https://github.com/Azure-Samples/mcp-container-ts?tab=readme-ov-file#test-your-mcp-server-with-desktop-mcp-clients) section in the sample repository. > 1. Skip to the [Use TODO MCP server tools in agent mode](#use-todo-mcp-server-tools-in-agent-mode) section to continue. ## Deploy and run The sample repository contains all the code and configuration files for the MCP server Azure deployment. The following steps walk you through the sample MCP server Azure deployment process. ### Deploy to Azure > [!IMPORTANT] > Azure resources in this section start costing money immediately, even if you stop the command before it finishes. 1. Run the following Azure Developer CLI command for Azure resource provisioning and source code deployment: ```azdeveloper azd up ``` 1. Use the following table to answer the prompts: |Prompt|Answer| |--|--| |Environment name|Keep it short and lowercase. Add your name or alias. For example, `my-mcp-server`. It's used as part of the resource group name.| |Subscription|Select the subscription to create the resources in. | |Location (for hosting)|Select a location near you from the list.| |Location for the Azure OpenAI model|Select a location near you from the list. If the same location is available as your first location, select that.| 1. Wait until the app is deployed. Deployment usually takes between 5 and 10 minutes to complete. 1. Once the deployment is complete, you can access the MCP server using the URL provided in the output. The URL looks like this: ```bash https://...azurecontainerapps.io ``` 1. Copy the URL to your clipboard. You'll need it in the next section. ### Configure the MCP server in Visual Studio Code Configure the MCP server in your local VS Code environment by adding the URL to the `mcp.json` file in the `.vscode` folder. 1. Open the `mcp.json` file in the `.vscode` folder. 1. Locate the `mcp-server-sse-remote` section in the file. It should look like this: ```json "mcp-server-sse-remote": { "type": "sse", "url": "https://..azurecontainerapps.io/sse" } ``` 1. Replace the existing `url` value with the URL you copied in the previous step. 1. Save the `mcp.json` file in the `.vscode` folder. ### Use TODO MCP server tools in agent mode After modifying the MCP server, you can use the tools, it provides in agent mode. To use MCP tools in agent mode: 1. Open the Chat view (`Ctrl+Alt+I`), and select Agent mode from the dropdown. 1. Select the **Tools** button to view the list of available tools. Optionally, select or deselect the tools you want to use. You can search tools by typing in the search box. 1. Enter a prompt such as "I need to send an email to my manager on Wednesday" in the chat input box and notice how tools are automatically invoked as needed, as in the following screenshot: :::image type="content" source="./media/build-mcp-server-ts/mcp-server-tools-invocation.png" lightbox="./media/build-mcp-server-ts/mcp-server-tools-invocation.png"alt-text="Screenshot showing the MCP server tools invocation."::: > [!NOTE] > By default, when a tool is invoked, you need to confirm the action before the tool runs. Otherwise, tools might run locally on your machine and might perform actions that modify files or data. Use the Continue button dropdown options to automatically confirm the specific tool for the current session, workspace, or all future invocations. ## Exploring the sample code This section provides an overview of the key files and code structure in the MCP server sample. The code is organized into several main components: - **`index.ts`**: The main entry point for the MCP server, which sets up the Express.js HTTP server and routing. - **`server.ts`**: The transport layer that manages Server-Sent Events (SSE) connections and MCP protocol handling. - **`tools.ts`**: Contains business logic and utility functions for the MCP server. - **`types.ts`**: Defines TypeScript types and interfaces used throughout the MCP server. ### `index.ts` - How the server starts and accepts HTTP connections The `index.ts` file is the main entry point for the MCP server. It initializes the server, sets up the Express.js HTTP server, and defines routing for Server-Sent Events (SSE) endpoints. #### Create the MCP server instance The following code snippet initializes the MCP server using the `StreamableHTTPServer` class, which is a wrapper around the core MCP `Server` class. This class handles the transport layer for Server-Sent Events (SSE) and manages client connections. ```typescript const server = new StreamableHTTPServer( new Server( { name: 'todo-http-server', version: '1.0.0', }, { capabilities: { tools: {}, }, } ) ); ``` **Concepts**: - **Composition pattern**: `SSEPServer` wraps the low-level `Server` class - **Capabilities declaration**: Server announces it supports tools (but not resources/prompts) - **Naming convention**: Server name becomes part of MCP identification #### Set up Express routes The following code snippet sets up the Express.js server to handle incoming HTTP requests for SSE connections and message handling: ```typescript router.post('/messages', async (req: Request, res: Response) => { await server.handlePostRequest(req, res); }); router.get('/sse', async (req: Request, res: Response) => { await server.handleGetRequest(req, res); }); ``` **Concepts**: - **Two-endpoint pattern**: GET for establishing SSE connection, POST for sending messages - **Delegation pattern**: Express routes immediately delegate to `SSEPServer` #### Process lifecycle management The following code snippet handles the server's lifecycle, including starting the server and gracefully shutting it down on termination signals: ```typescript process.on('SIGINT', async () => { log.error('Shutting down server...'); await server.close(); process.exit(0); }); ``` **Concepts**: - **Graceful shutdown**: Proper cleanup on Ctrl+C - **Async cleanup**: Server close operation is asynchronous - **Resource management**: Important for SSE connections ### Transport layer: `server.ts` The `server.ts` file implements the transport layer for the MCP server, specifically handling Server-Sent Events (SSE) connections and routing MCP protocol messages. #### Set up an SSE client connection and create a transport The `SSEPServer` class is the main transport layer for handling Server-Sent Events (SSE) in the MCP server. It uses the `SSEServerTransport` class to manage individual client connections. It manages multiple transports and their lifecycle. ```typescript export class SSEPServer { server: Server; transport: SSEServerTransport | null = null; transports: Record = {}; constructor(server: Server) { this.server = server; this.setupServerRequestHandlers(); } } ``` **Concepts**: - **State management**: Tracks both current transport and all transports - **Session mapping**: `transports` object maps session IDs to transport instances - **Constructor delegation**: Immediately sets up request handlers #### SSE connection establishment (`handleGetRequest`) The `handleGetRequest` method is responsible for establishing a new SSE connection when a client makes a GET request to the `/sse` endpoint. ```typescript async handleGetRequest(req: Request, res: Response) { log.info(`GET ${req.originalUrl} (${req.ip})`); try { log.info("Connecting transport to server..."); this.transport = new SSEServerTransport("/messages", res); TransportsCache.set(this.transport.sessionId, this.transport); res.on("close", () => { if (this.transport) { TransportsCache.delete(this.transport.sessionId); } }); await this.server.connect(this.transport); log.success("Transport connected. Handling request..."); } catch (error) { // Error handling... } } ``` **Concepts**: - **Transport creation**: New `SSEServerTransport` for each GET request - **Session management**: Autogenerated session ID stored in cache - **Event handlers**: Cleanup on connection close - **MCP connection**: `server.connect()` establishes protocol connection - **Async flow**: Connection setup is asynchronous with error boundaries #### Message processing (`handlePostRequest`) The `handlePostRequest` method processes incoming POST requests to handle MCP messages sent by the client. It uses the session ID from the query parameters to find the correct transport instance. ```typescript async handlePostRequest(req: Request, res: Response) { log.info(`POST ${req.originalUrl} (${req.ip}) - payload:`, req.body); const sessionId = req.query.sessionId as string; const transport = TransportsCache.get(sessionId); if (transport) { await transport.handlePostMessage(req, res, req.body); } else { log.error("Transport not initialized. Cannot handle POST request."); res.status(400).json(/* error response */); } } ``` **Concepts**: - **Session lookup**: Uses `sessionId` query parameter to find transport - **Session validation**: Validates SSE connection first. - **Message delegation**: Transport handles actual message processing - **Error responses**: Proper HTTP error codes for missing sessions #### MCP Protocol Handler Setup (`setupServerRequestHandlers`) The `setupServerRequestHandlers` method registers the following handlers for MCP protocol requests: - A handler for `ListToolsRequestSchema` that returns the list of available TODO tools. - A handler for `CallToolRequestSchema` that locates and executes the requested tool with the provided arguments. This method uses [Zod schemas](https://zod.dev/?id=introduction) to define the expected request and response formats. ```typescript private setupServerRequestHandlers() { this.server.setRequestHandler(ListToolsRequestSchema, async (_request) => { return { tools: TodoTools, }; }); this.server.setRequestHandler(CallToolRequestSchema, async (request) => { const { name, arguments: args } = request.params; const tool = TodoTools.find((tool) => tool.name === name); if (!tool) { return this.createJSONErrorResponse(`Tool "${name}" not found.`); } const response = await tool.execute(args as any); return { content: [{ type: "text", text: response }] }; }); } ``` **Concepts**: - **Schema-Based Routing**: Uses Zod schemas for type-safe request handling - **Tool Discovery**: `ListToolsRequestSchema` returns static TodoTools array - **Tool Execution**: `CallToolRequestSchema` finds and executes tools - **Error Handling**: Graceful handling of unknown tools - **Response Format**: MCP-compliant response structure - **Type Safety**: TypeScript types ensure correct argument passing ### Business logic: `tools.ts` The `tools.ts` file defines the actual functionality available to MCP clients: - Tool metadata (name, description, schemas) - Input validation schemas - Tool execution logic - Integration with database layer This MCP Server defines four TODO management tools: - `add_todo`: Creates a new TODO item - `complete_todo`: Marks a TODO item as completed - `delete_todo`: Deletes a TODO item - `list_todos`: Lists all TODO items - `update_todo_text`: Updates the text of an existing TODO item #### Tool Definition Pattern The tools are defined as an array of objects, each representing a specific TODO operation. In the following code snippet, the `addTodo` tool is defined: ```typescript { name: "addTodo", description: "Add a new TODO item to the list...", inputSchema: { type: "object", properties: { text: { type: "string" }, }, required: ["text"], }, outputSchema: { type: "string" }, async execute({ text }: { text: string }) { const info = await addTodo(text); return `Added TODO: ${text} (id: ${info.lastInsertRowid})`; }, } ``` Each tool definition has: - `name`: Unique identifier for the tool - `description`: Brief description of the tool's purpose - `inputSchema`: Zod schema defining the expected input format - `outputSchema`: Zod schema defining the expected output format - `execute`: Function implementing the tool's logic These tool definitions are imported in `server.ts` and exposed through the `ListToolsRequestSchema` handler. **Concepts**: - **Modular Tool Design**: Each tool is a self-contained object - **JSON Schema Validation**: `inputSchema` defines expected parameters - **Type Safety**: TypeScript types match schema definitions - **Async Execution**: All tool executions are asynchronous - **Database Integration**: Calls imported database functions - **Human-Readable Responses**: Returns formatted strings, not raw data #### Tool Array Export The tools are exported as a static array, making them easy to import and use in the server. Each tool is an object with its metadata and execution logic. This structure allows the MCP server to dynamically discover and execute tools based on client requests. ```typescript export const TodoTools = [ { /* addTodo */ }, { /* listTodos */ }, { /* completeTodo */ }, { /* deleteTodo */ }, { /* updateTodoText */ }, ]; ``` **Concepts**: - **Static Registration**: Tools defined at module load time - **Array Structure**: Simple array makes tools easy to iterate - **Import/Export**: Clean separation from server logic #### Tool execution error handling Each tool's `execute` function handles errors smoothly and returns clear messages instead of throwing exceptions. This approach ensures the MCP server provides a seamless user experience. Tools handle various error scenarios: ```typescript async execute({ id }: { id: number }) { const info = await completeTodo(id); if (info.changes === 0) { return `TODO with id ${id} not found.`; } return `Marked TODO ${id} as completed.`; } ``` **Concepts**: - **Database Response Checking**: Uses `info.changes` to detect failures - **Graceful Degradation**: Returns descriptive error messages vs throwing - **User-Friendly Errors**: Messages suitable for AI interpretation ### Data layer: `db.ts` The `db.ts` file manages the SQLite database connection and handles CRUD operations for the TODO app. It uses the `better-sqlite3` library for synchronous database access. #### Database initialization The database initializes by connecting to SQLite and creating tables if they don't exist. The following code snippet shows the initialization process: ```typescript const db = new Database(":memory:", { verbose: log.info, }); try { db.pragma("journal_mode = WAL"); db.prepare( `CREATE TABLE IF NOT EXISTS ${DB_NAME} ( id INTEGER PRIMARY KEY AUTOINCREMENT, text TEXT NOT NULL, completed INTEGER NOT NULL DEFAULT 0 )` ).run(); log.success(`Database "${DB_NAME}" initialized.`); } catch (error) { log.error(`Error initializing database "${DB_NAME}":`, { error }); } ``` **Concepts**: - **In-Memory Database**: `:memory:` means data lost on restart (demo/testing only) - **WAL Mode**: Write-Ahead Logging for better performance - **Schema Definition**: Simple TODO table with autoincrement ID - **Error Handling**: Graceful handling of initialization failures - **Logging Integration**: Database operations are logged for debugging #### CRUD operation patterns The `db.ts` file provides four main CRUD operations for managing TODO items: **Create operation**: ```typescript export async function addTodo(text: string) { log.info(`Adding TODO: ${text}`); const stmt = db.prepare(`INSERT INTO todos (text, completed) VALUES (?, 0)`); return stmt.run(text); } ``` **Read operation**: ```typescript export async function listTodos() { log.info("Listing all TODOs..."); const todos = db.prepare(`SELECT id, text, completed FROM todos`).all() as Array<{ id: number; text: string; completed: number; }>; return todos.map(todo => ({ ...todo, completed: Boolean(todo.completed), })); } ``` **Update operation**: ```typescript export async function completeTodo(id: number) { log.info(`Completing TODO with ID: ${id}`); const stmt = db.prepare(`UPDATE todos SET completed = 1 WHERE id = ?`); return stmt.run(id); } ``` **Delete operation**: ```typescript export async function deleteTodo(id: number) { log.info(`Deleting TODO with ID: ${id}`); const row = db.prepare(`SELECT text FROM todos WHERE id = ?`).get(id) as | { text: string } | undefined; if (!row) { log.error(`TODO with ID ${id} not found`); return null; } db.prepare(`DELETE FROM todos WHERE id = ?`).run(id); log.success(`TODO with ID ${id} deleted`); return row; } ``` **Concepts**: - **Prepared Statements**: Protection against SQL injection - **Type Casting**: Explicit TypeScript types for query results - **Data Transformation**: Converting SQLite integers to booleans - **Atomic Operations**: Each function is a single database transaction - **Return Value Consistency**: Functions return operation metadata - **Defensive Programming**: Check-before-delete pattern #### Schema Design The database schema is defined in the `db.ts` file using a simple SQL statement. The `todos` table has three fields: ```sql CREATE TABLE todos ( id INTEGER PRIMARY KEY AUTOINCREMENT, -- Unique identifier text TEXT NOT NULL, -- TODO description completed INTEGER NOT NULL DEFAULT 0 -- Boolean as integer ); ``` ### Helper utilities: `helpers/` directory The `helpers/` directory provides utility functions and classes for the server. #### Structured logging for debugging and monitoring: `helpers/logs.ts` The `helpers/logs.ts` file provides a structured logging utility for the MCP server. It uses the `debug` library for logging and `chalk` for color-coded output in the console. ```typescript export const logger = (namespace: string) => { const dbg = debug('mcp:' + namespace); const log = (colorize: ChalkInstance, ...args: any[]) => { const timestamp = new Date().toISOString(); const formattedArgs = [timestamp, ...args].map((arg) => { if (typeof arg === 'object') { return JSON.stringify(arg, null, 2); } return arg; }); dbg(colorize(formattedArgs.join(' '))); }; return { info(...args: any[]) { log(chalk.cyan, ...args); }, success(...args: any[]) { log(chalk.green, ...args); }, warn(...args: any[]) { log(chalk.yellow, ...args); }, error(...args: any[]) { log(chalk.red, ...args); }, }; }; ``` #### Session management for SSE transports: `helpers/cache.ts` The `helpers/cache.ts` file uses a `Map` to store SSE transports by session ID. This approach allows the server to quickly find and manage active connections. ```typescript import type { SSEServerTransport } from "@modelcontextprotocol/sdk/server/sse"; export const TransportsCache = new Map(); ``` > [!NOTE] > The `TransportsCache` is a simple in-memory cache. In production, consider using a more robust solution like Redis or a database for session management. ### Execution flow summary The following diagram illustrates the complete request journey from the client to the MCP server and back, including tool execution and database operations: :::image type="content" source="./media/build-mcp-server-ts/execution-flow-diagram.png" lightbox="./media/build-mcp-server-ts/execution-flow-diagram.png" alt-text="Diagram showing the complete request journey from the client to the MCP server and back."::: ### Clean up GitHub Codespaces #### [GitHub Codespaces](#tab/github-codespaces) Delete the GitHub Codespaces environment to maximize your free per-core hours. > [!IMPORTANT] > For more information about your GitHub account's free storage and core hours, see [GitHub Codespaces monthly included storage and core hours](https://docs.github.com/billing/managing-billing-for-github-codespaces/about-billing-for-github-codespaces#monthly-included-storage-and-core-hours-for-personal-accounts). 1. Sign into the [GitHub Codespaces dashboard](https://github.com/codespaces). 1. Find your active Codespaces created from the [`Azure-Samples//mcp-container-ts`](https://github.com/Azure-Samples/mcp-container-ts) GitHub repository. 1. Open the context menu for the codespace and select **Delete**. #### [Visual Studio Code](#tab/visual-studio-code) Stop the running development container and return to Visual Studio Code in your local workspace. Open the **Command Palette**, search for **Dev Containers**, and select **Dev Containers: Reopen Folder Locally**. > [!TIP] > Visual Studio Code stops the running development container, but the container still exists in Docker in a stopped state. Free up space on your local machine by deleting the container instance, image, and volumes from Docker. --- ## Get help Log your issue to the repository's [Issues](https://github.com/Azure-Samples/mcp-container-ts/issues). ## Related resources - [Introduction to Agents and the Model Context Protocol](intro-agents-mcp.md) - [Build a .NET OpenAI Agent using an MCP server on Azure Container Apps](build-openai-mcp-server-dotnet.md) ================================================ FILE: articles/ai/build-openai-mcp-server-dotnet.md ================================================ --- title: Build a .NET OpenAI Agent using an MCP server on Azure Container Apps description: Learn how to build a .NET OpenAI Agent using an MCP server using Azure Container Apps. ms.date: 09/12/2025 ms.topic: get-started ms.subservice: intelligent-apps content_well_notification: - AI-contribution ai-usage: ai-assisted ms.collection: ce-skilling-ai-copilot # CustomerIntent: As an AI app developer, I want to learn how to build a .NET OpenAI Agent using an MCP server using Azure Container Apps. --- # Build a .NET OpenAI Agent using an MCP server on Azure Container Apps This article shows you how to build a Model Context Protocol (MCP) agent using .NET. In this sample, the MCP client (written in C#/.NET) connects to an MCP server (written in TypeScript) to manage a todo list. The client finds available tools from the server and sends them to an Azure OpenAI model. Users can then talk to the todo system using everyday language. ## Get to the code Check out the [OpenAI MCP Agent Building Block AI template](https://aka.ms/mcp/openai). This example shows how to build an OpenAI agent that uses an MCP client to consume an existing MCP server. Jump to the [code walkthrough section](#explore-the-code) to understand how this sample works. ## Architectural overview The following diagram shows the simple architecture of the sample app: :::image type="content" source="./media/build-openai-mcp-server-dotnet/simple-architecture-diagram.png" lightbox="./media/build-openai-mcp-server-dotnet/simple-architecture-diagram.png" alt-text="Diagram showing architecture from Visual Studio Code hosting the agent and MCP client to MCP Server."::: - **MCP Client**: Connects to the MCP server and finds available tools - **Chat Client**: Works with Azure OpenAI to understand natural language - **Blazor UI**: Provides a web interface where users can chat - **Transport Layer**: Uses Server-Sent Events (SSE) to send messages in real-time - **Authentication**: Uses JWT tokens to keep the connection secure The MCP server runs as a containerized app on Azure Container Apps (ACA). It uses a TypeScript backend to provide tools to the MCP client through the Model Context Protocol. All tools work with a backend SQLite database. > [!NOTE] > Visit [Build a TypeScript MCP server using Azure Container Apps](build-mcp-server-ts.md) to see the code walkthrough of the TypeScript MCP Server used in this article. ## Cost To keep costs low, this sample uses basic or consumption pricing tiers for most resources. Adjust the tier as needed, and delete resources when you're done to avoid charges. ## Prerequisites - [Visual Studio Code](https://code.visualstudio.com/) - Latest version to support MCP Server development. - [.NET 9 SDK](https://dotnet.microsoft.com/en-us/download/dotnet/9.0) - [C# Dev Kit for Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.csdevkit) Visual Studio Code extension - [GitHub Copilot](https://marketplace.visualstudio.com/items?itemName=GitHub.copilot) Visual Studio Code extension - [GitHub Copilot Chat](https://marketplace.visualstudio.com/items?itemName=GitHub.copilot-chat) Visual Studio Code extension - [Azure Developer CLI (azd)](/azure/developer/azure-developer-cli/install-azd?tabs=winget-windows%2Cbrew-mac%2Cscript-linux&pivots=os-windows) - [Microsoft Foundry for Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=TeamsDevApp.vscode-ai-foundry) extension - A deployed Foundry gpt-5-mini model A [development container](https://containers.dev/) includes all the dependencies you need for this article. You can run it in GitHub Codespaces (in a browser) or locally using Visual Studio Code. To follow this article, make sure you meet these prerequisites: ### Deploy a Foundry gpt-5-mini model using the Foundry VS Code Extension Deploy a `gpt-5-mini` model using the Foundry Extension in Visual Studio Code using the following steps: #### Create a Foundry project and deploy the model - To create a Foundry project and deploy a `gpt-5-mini` model, follow the **Get Started** instructions in the [Work with the Microsoft Foundry for Visual Studio Code extension (Preview)](/azure/ai-foundry/how-to/develop/get-started-projects-vs-code#get-started) article. #### Create the OpenAI Model connection string 1. Once the `gpt-5-mini` model is deployed, right-click the model in the Foundry extension and select **Copy API key** to copy the model's API key to your clipboard. 1. Next, right-click the deployed `gpt-5-mini` model in the Foundry extension and select **Copy endpoint** to copy the model's endpoint to your clipboard, as shown in the following screenshot: :::image type="content" source="./media/build-openai-mcp-server-dotnet/copy-api-key-endpoint.png" lightbox="./media/build-openai-mcp-server-dotnet/copy-api-key-endpoint.png" alt-text="Screenshot showing the context menu for the deployed model with the Copy endpoint and Copy API key options highlighted."::: 1. Finally, create a connection string for the deployed `gpt-5-mini` model using the copied endpoint and API key in the following format: `Endpoint=;Key=`. You need this connection string later in the article. #### [GitHub Codespaces (recommended)](#tab/github-codespaces) - An Azure subscription – [Create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn) - Azure account permissions – Your Azure account must have `Microsoft.Authorization/roleAssignments/write` permissions, such as [Role Based Access Control Administrator](/azure/role-based-access-control/built-in-roles#role-based-access-control-administrator-preview), [User Access Administrator](/azure/role-based-access-control/built-in-roles#user-access-administrator), or [Owner](/azure/role-based-access-control/built-in-roles#owner). If you don't have subscription-level permissions, you must be granted [RBAC](/azure/role-based-access-control/built-in-roles#role-based-access-control-administrator-preview) for an existing resource group and deploy to that group. - Your Azure account also needs `Microsoft.Resources/deployments/write` permissions at the subscription level. - GitHub account #### [Visual Studio Code](#tab/visual-studio-code) - An Azure subscription – [Create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn) - Azure account permissions – Your Azure account must have `Microsoft.Authorization/roleAssignments/write` permissions, such as [User Access Administrator](/azure/role-based-access-control/built-in-roles#user-access-administrator) or [Owner](/azure/role-based-access-control/built-in-roles#owner) - [Azure Developer CLI](/azure/developer/azure-developer-cli) - [Docker Desktop](https://www.docker.com/products/docker-desktop/) – make sure Docker Desktop is running - [Visual Studio Code](https://code.visualstudio.com/) - [Dev Container Extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) --- ## Open development environment Follow these steps to set up a preconfigured development environment with all the required dependencies. #### [GitHub Codespaces (recommended)](#tab/github-codespaces) [GitHub Codespaces](https://docs.github.com/codespaces) runs a development container managed by GitHub with [Visual Studio Code for the Web](https://code.visualstudio.com/docs/editor/vscode-web) as the interface. Use GitHub Codespaces for the simplest setup, as it comes with the necessary tools and dependencies preinstalled for this article. > [!IMPORTANT] > All GitHub accounts can use Codespaces for up to 60 hours free each month with two core instances. For more information, see [GitHub Codespaces monthly included storage and core hours](https://docs.github.com/billing/managing-billing-for-github-codespaces/about-billing-for-github-codespaces#monthly-included-storage-and-core-hours-for-personal-accounts). Use the following steps to create a new GitHub Codespace on the `main` branch of the [`Azure-Samples/openai-mcp-agent-dotnet`](https://github.com/Azure-Samples/openai-mcp-agent-dotnet) GitHub repository. 1. Right-click the following button and select _Open link in new window_. This action lets you have the development environment and the documentation open side by side. [![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/Azure-Samples/openai-mcp-agent-dotnet) 1. On the **Create codespace** page, review and then select **Create new codespace**. 1. Wait for the codespace to start. It might take a few minutes. 1. Make sure that your deployed model name is `gpt-5-mini`. If your deployed model is different, update `src/McpTodo.ClientApp/appsettings.json` with the correct deployment name. ```json { "OpenAI": { // Make sure this is the right deployment name. "DeploymentName": "gpt-5-mini" } } ``` 1. Sign in to Azure with the Azure Developer CLI in the terminal at the bottom of the screen. ```shell azd auth login ``` 1. Copy the code from the terminal and then paste it into a browser. Follow the instructions to authenticate with your Azure account. You do the rest of the tasks in this development container. #### [Visual Studio Code](#tab/visual-studio-code) The [Dev Containers extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) for Visual Studio Code needs [Docker](https://docs.docker.com/) installed on your computer. The extension uses Docker to host the development container locally with the necessary tools and dependencies preinstalled for this article. 1. Create a new local directory on your computer for the project. ```shell mkdir my-mcp-agent ``` 1. Navigate to the directory you created. ```shell cd my-mcp-agent ``` 1. Open Visual Studio Code in that directory: ```shell code . ``` 1. Open a new terminal in Visual Studio Code. 1. Run the following AZD command to bring the GitHub repository to your local computer. ```shell azd init -t openai-mcp-agent-dotnet ``` 1. Open the Command Palette, search for and select **Dev Containers: Open Folder in Container** to open the project in a dev container. Wait until the dev container opens before continuing. 1. Make sure that your deployed model name is `gpt-5-mini`. If your deployed model is different, update `src/McpTodo.ClientApp/appsettings.json` with the correct deployment name. ```json { "OpenAI": { // Make sure this is the right deployment name. "DeploymentName": "gpt-5-mini" } } ``` 1. Sign in to Azure with the Azure Developer CLI. ```azdeveloper azd auth login ``` 1. You do the rest of the exercises in this development container. --- > [!NOTE] > To run the MCP agent locally: > 1. Set up your environment as described in the [Getting started](https://github.com/Azure-Samples/openai-mcp-agent-dotnet?tab=readme-ov-file#getting-started) section in the sample repository. > 1. Install your MCP Server by following the instructions in the [Get MCP Server App](https://github.com/Azure-Samples/openai-mcp-agent-dotnet?tab=readme-ov-file#get-mcp-server-app) section in the sample repository. > 1. Run the MCP agent locally by following the instructions in the [Run locally](https://github.com/Azure-Samples/openai-mcp-agent-dotnet?tab=readme-ov-file#run-locally) section in the sample repository. > 1. Skip to the [Use the TODO MCP agent](#use-the-todo-mcp-agent) section to continue. ## Deploy and run The sample repository contains all the code and configuration files for the MCP agent Azure deployment. The following steps walk you through the sample MCP agent Azure deployment process. ### Deploy to Azure > [!IMPORTANT] > Azure resources in this section start costing money immediately, even if you stop the command before it finishes. #### Set the JWT token - Set the JWT token for the MCP server by running the following command in the terminal at the bottom of the screen: ```bash # zsh/bash ./scripts/set-jwttoken.sh ``` ```powershell # PowerShell ./scripts/Set-JwtToken.ps1 ``` #### Add JWT token to azd environment configuration 1. Add the JWT token to azd environment configuration by running the following command in the terminal at the bottom of the screen: ```bash # zsh/bash env_dir=".azure/$(azd env get-value AZURE_ENV_NAME)" mkdir -p "$env_dir" cat ./src/McpTodo.ServerApp/.env >> "$env_dir/.env" ``` ```powershell # PowerShell $dotenv = Get-Content ./src/McpTodo.ServerApp/.env $dotenv | Add-Content -Path ./.azure/$(azd env get-value AZURE_ENV_NAME)/.env -Encoding utf8 -Force ``` > [!NOTE] > By default, the MCP client app is protected by the ACA built-in authentication feature. You can turn off this feature before running `azd up` by setting: > > ```bash > azd env set USE_LOGIN false > ``` 1. Run the following Azure Developer CLI command for Azure resource provisioning and source code deployment: ```shell azd up ``` 1. Use the following table to answer the prompts: |Prompt|Answer| |--|--| |Environment name|Use a short, lowercase name. Add your name or alias. For example, `my-mcp-agent`. The environment name becomes part of the resource group name.| |Subscription|Choose the subscription where you want to create resources.| |Location (for hosting)|Pick the model deployment location from the list.| |OpenAI Connection string|Paste the connection string for the OpenAI model you created earlier in the [Create the OpenAI Model connection string](#create-the-openai-model-connection-string) section.| 1. App deployment takes 5 to 10 minutes. 1. After deployment finishes, you can access the MCP agent using the URL in the output. The URL looks like this: ```bash https://...azurecontainerapps.io ``` 1. Open the URL in a web browser to use the MCP agent. ### Use the TODO MCP agent After the MCP agent is running, you can use the tools it provides in agent mode. To use MCP tools in agent mode: 1. Navigate to the client app URL and sign in to the app. > [!NOTE] > if you set the `USE_LOGIN` value to `false`, you might not be asked to sign in. 1. Enter a prompt such as "I need to send an email to my manager on Wednesday" in the chat input box and notice how tools are automatically invoked as needed. 1. The MCP agent uses the tools provided by the MCP server to fulfill the request and return a response in the chat interface. 1. Experiment with other prompts like: ```text Give me a list of to dos. Set "meeting at 1pm". Give me a list of to dos. Mark #1 as completed. Delete #1 from the to-do list. ``` ## Explore the code The sample repository contains all the code and configuration files for the MCP agent Azure deployment. The following sections walk you through the key components of the MCP agent code. ### MCP Client configuration and setup The application sets up the MCP client in `Program.cs`. This configuration defines how to connect and what options to use. The code uses several advanced patterns including .NET Aspire integration and service defaults: ```csharp builder.Services.AddSingleton(sp => { var config = sp.GetRequiredService(); var loggerFactory = sp.GetRequiredService(); var uri = new Uri(config["McpServers:TodoList"]!); var clientTransportOptions = new SseClientTransportOptions() { Endpoint = new Uri($"{uri.AbsoluteUri.TrimEnd('/')}/mcp"), AdditionalHeaders = new Dictionary { { "Authorization", $"Bearer {config["McpServers:JWT:Token"]!}" } } }; var clientTransport = new SseClientTransport(clientTransportOptions, loggerFactory); var clientOptions = new McpClientOptions() { ClientInfo = new Implementation() { Name = "MCP Todo Client", Version = "1.0.0", } }; return McpClientFactory.CreateAsync(clientTransport, clientOptions, loggerFactory).GetAwaiter().GetResult(); }); ``` **Key implementation details:** - **Transport Configuration**: `SseClientTransportOptions` supports both Server-Sent Events (SSE) and streamable HTTP transport. The transport method depends on the endpoint URL - endpoints ending with `/sse` use Server-Sent Events, while endpoints ending with `/mcp` use streamable HTTP. This approach enables real-time communication between client and server - **Authentication Headers**: JWT tokens go in the `AdditionalHeaders` to keep server communication secure - **Client Information**: `McpClientOptions` tells the server the client's name and version - **Factory Pattern**: `McpClientFactory.CreateAsync()` connects and completes the protocol handshake #### .NET Aspire service defaults integration The application uses .NET Aspire's service defaults pattern for cross-cutting concerns: ```csharp // McpTodo.ServiceDefaults/Extensions.cs public static TBuilder AddServiceDefaults(this TBuilder builder) where TBuilder : IHostApplicationBuilder { builder.ConfigureOpenTelemetry(); builder.AddDefaultHealthChecks(); builder.Services.AddServiceDiscovery(); builder.Services.ConfigureHttpClientDefaults(http => { // Turn on resilience by default http.AddStandardResilienceHandler(); // Turn on service discovery by default http.AddServiceDiscovery(); }); return builder; } ``` **Service defaults benefits:** - **Composable Extension Methods**: The system uses a clean builder pattern to add shared features - **Standard Resilience Handlers**: The system adds built-in retry, circuit breaker, and timeout rules for you - **Service Discovery Integration**: The system finds services automatically in container environments - **OpenTelemetry by Default**: The system gets full monitoring without any setup work The following diagram shows the relationship between cross-cutting concerns and application services: :::image type="content" source="./media/build-openai-mcp-server-dotnet/dependency-injection-graph.png" lightbox="./media/build-openai-mcp-server-dotnet/dependency-injection-graph.png" alt-text="Diagram showing the relationship between cross-cutting concerns and application services."::: #### Configuration URL Resolution The sample includes sophisticated URL resolution for different environments: ```csharp // AspireUrlParserExtensions.cs public static Uri Resolve(this Uri uri, IConfiguration config) { var absoluteUrl = uri.ToString(); if (absoluteUrl.StartsWith("https+http://")) { var appname = absoluteUrl.Substring("https+http://".Length).Split('/')[0]; var https = config[$"services:{appname}:https:0"]!; var http = config[$"services:{appname}:http:0"]!; return string.IsNullOrWhiteSpace(https) ? new Uri(http) : new Uri(https); } // Handle other URL formats... } ``` **Configuration Management Features:** - **Service Discovery Abstraction**: The system handles development and production URLs cleanly - **Protocol Negotiation**: The system chooses HTTPS first, then falls back to HTTP - **Configuration Convention**: The system uses standard .NET Aspire service setup patterns ### Authentication Implementation This sample uses JWT (JSON Web Token) authentication to secure the connection between the MCP client and server. ```bash dotnet user-secrets --project ./src/McpTodo.ClientApp set McpServers:JWT:Token "$TOKEN" ``` > [!NOTE] > The scripts created the `$TOKEN` variable automatically when you ran either the Bash (`set-jwttoken.sh`) or PowerShell (`Set-JwtToken.ps1`) script earlier in the **Deploy to Azure** section. > These scripts perform the following steps: > 1. Run `npm run generate-token` in the MCP server app to create a JWT token > 1. Parse the generated `.env` file to extract the JWT_TOKEN value > 1. Automatically store it in .NET user secrets for the MCPClient The MCP client retrieves the JWT token from configuration and includes it in the HTTP headers for authentication when connecting to the MCP server: ```csharp AdditionalHeaders = new Dictionary { { "Authorization", $"Bearer {config["McpServers:JWT:Token"]!}" } } ``` This approach ensures: - **Secure Communication**: The system only allows clients with valid tokens to connect to the MCP server - **Token-Based Authorization**: JWT tokens let the system verify users without storing session data - **Configuration Management**: The system stores sensitive tokens safely in user secrets during development #### Azure Container Apps Authentication Integration The infrastructure shows advanced authentication patterns using [Azure Container Apps built-in authentication and authorization features ("Easy Auth")](/azure/container-apps/authentication): ```bicep // containerapps-authconfigs.bicep resource containerappAuthConfig 'Microsoft.App/containerApps/authConfigs@2024-10-02-preview' = { properties: { identityProviders: { azureActiveDirectory: { enabled: true registration: { clientId: clientId openIdIssuer: openIdIssuer } } } login: { tokenStore: { enabled: true azureBlobStorage: { blobContainerUri: '${storageAccount.properties.primaryEndpoints.blob}/token-store' managedIdentityResourceId: userAssignedIdentity.id } } } } } ``` **Advanced Authentication Features:** - **Zero-Code Authentication**: Azure Container Apps provides built-in authentication - **Managed Identity for Storage**: The system stores tokens securely without connection strings - **Federated Identity Credentials**: The system enables workload identity for Kubernetes-style authentication The following diagram shows the security handshake between components: :::image type="content" source="./media/build-openai-mcp-server-dotnet/authentication-flow-sequence.png" lightbox="./media/build-openai-mcp-server-dotnet/authentication-flow-sequence.png" alt-text="Diagram showing the security handshake between components."::: ### Tool discovery and registration The MCP client discovers available tools from the server during component initialization in `Chat.razor`: ```csharp protected override async Task OnInitializedAsync() { messages.Add(new(ChatRole.System, SystemPrompt)); tools = await McpClient.ListToolsAsync(); chatOptions.Tools = [.. tools]; } ``` **How Tool Discovery Works:** 1. **Server Query**: `McpClient.ListToolsAsync()` sends a request to the MCP server to list available tools 2. **Schema Retrieval**: The server sends back tool definitions with names, descriptions, and input schemas 3. **Tool Registration**: The system registers tools with the `ChatOptions` object, making them available to the OpenAI client 4. **Type Safety**: The `McpClientTool` class inherits from `AIFunction`, giving smooth integration with Microsoft.Extensions.AI The following diagram shows how tool schemas are parsed and registered: :::image type="content" source="./media/build-openai-mcp-server-dotnet/tool-discovery-flow.png" lightbox="./media/build-openai-mcp-server-dotnet/tool-discovery-flow.png" alt-text="Diagram showing the tool discovery and registration flow."::: ### OpenAI integration and function invocation The chat client configuration demonstrates how MCP tools integrate with Azure OpenAI: ```csharp var chatClient = openAIClient.GetChatClient(config["OpenAI:DeploymentName"]).AsIChatClient(); builder.Services.AddChatClient(chatClient) .UseFunctionInvocation() .UseLogging(); ``` **Integration benefits:** - **Automatic Function Calling**: The `.UseFunctionInvocation()` extension turns on automatic tool execution based on LLM decisions - **Easy Tool Access**: MCP tools work as built-in functions for the OpenAI model - **Response Processing**: The system automatically adds tool results to the conversation flow ### Real-Time chat implementation The chat interface in `Chat.razor` demonstrates streaming responses and tool execution with advanced Blazor patterns: ```csharp private async Task AddUserMessageAsync(ChatMessage userMessage) { CancelAnyCurrentResponse(); // Add the user message to the conversation messages.Add(userMessage); chatSuggestions?.Clear(); await chatInput!.FocusAsync(); // Stream and display a new response from the IChatClient var responseText = new TextContent(""); currentResponseMessage = new ChatMessage(ChatRole.Assistant, [responseText]); currentResponseCancellation = new(); await foreach (var update in ChatClient.GetStreamingResponseAsync([.. messages], chatOptions, currentResponseCancellation.Token)) { messages.AddMessages(update, filter: c => c is not TextContent); responseText.Text += update.Text; ChatMessageItem.NotifyChanged(currentResponseMessage); } // Store the final response in the conversation, and begin getting suggestions messages.Add(currentResponseMessage!); currentResponseMessage = null; chatSuggestions?.Update(messages); } ``` **Streaming implementation features:** - **Real-Time Updates**: `GetStreamingResponseAsync()` sends response updates bit by bit - **Tool Execution**: The system processes function calls automatically during streaming - **UI Responsiveness**: `ChatMessageItem.NotifyChanged()` updates the UI in real-time - **Cancellation Support**: Users can cancel long-running operations #### Advanced Blazor UI patterns The implementation uses advanced UI patterns for real-time updates: **Memory-Safe event handling:** ```csharp // ChatMessageItem.razor private static readonly ConditionalWeakTable SubscribersLookup = new(); public static void NotifyChanged(ChatMessage source) { if (SubscribersLookup.TryGetValue(source, out var subscriber)) { subscriber.StateHasChanged(); } } ``` **Custom web components integration:** ```javascript // ChatMessageList.razor.js window.customElements.define('chat-messages', class ChatMessages extends HTMLElement { connectedCallback() { this._observer = new MutationObserver(mutations => this._scheduleAutoScroll(mutations)); this._observer.observe(this, { childList: true, attributes: true }); } _scheduleAutoScroll(mutations) { // Debounce the calls and handle smart auto-scrolling cancelAnimationFrame(this._nextAutoScroll); this._nextAutoScroll = requestAnimationFrame(() => { const addedUserMessage = mutations.some(m => Array.from(m.addedNodes).some(n => n.parentElement === this && n.classList?.contains('user-message'))); // Smart scrolling logic... }); } }); ``` **Advanced state management:** ```csharp // Chat.razor private void CancelAnyCurrentResponse() { // If a response was cancelled while streaming, include it in the conversation so it's not lost if (currentResponseMessage is not null) { messages.Add(currentResponseMessage); } currentResponseCancellation?.Cancel(); currentResponseMessage = null; } ``` **Blazor UI benefits:** - **Hybrid Web Components**: The system combines Blazor Server with custom elements for better performance - **Memory-Safe Event Handling**: The system uses ConditionalWeakTable to prevent memory leaks - **Smart Auto-Scrolling**: The system provides user-friendly chat behavior with debouncing - **Graceful Cancellation**: The system saves partial work when users cancel operations ### Request/response flow Here's how a typical user interaction flows through the system: 1. **User Input**: The user types a message like "Add 'Buy groceries' to my todo list" 2. **Message Processing**: The system adds the message to the conversation history 3. **LLM Analysis**: Azure OpenAI analyzes the request and decides which tools to use 4. **Tool Discovery**: The model finds the right MCP tool (for example, `addTodo`) 5. **Tool Execution**: The MCP client calls the server with the needed parameters 6. **Response Processing**: The system adds the server response to the conversation 7. **UI Update**: The system shows the result to the user in real-time The following diagram shows how messages flow from user input through OpenAI to tool execution and back to the user interface: :::image type="content" source="./media/build-openai-mcp-server-dotnet/request-response-sequence.png" lightbox="./media/build-openai-mcp-server-dotnet/request-response-sequence.png" alt-text="Diagram showing the request/response flow."::: #### Async Pattern Management The application demonstrates sophisticated async patterns for background operations: ```csharp // ChatSuggestions.razor public void Update(IReadOnlyList messages) { // Runs in the background and handles its own cancellation/errors _ = UpdateSuggestionsAsync(messages); } private async Task UpdateSuggestionsAsync(IReadOnlyList messages) { cancellation?.Cancel(); cancellation = new CancellationTokenSource(); try { var response = await ChatClient.GetResponseAsync( [.. ReduceMessages(messages), new(ChatRole.User, Prompt)], cancellationToken: cancellation.Token); // Handle response... } catch (Exception ex) when (ex is not OperationCanceledException) { await DispatchExceptionAsync(ex); } } ``` **Background Task Benefits:** - **Fire-and-Forget with Safety**: The system uses `_ =` pattern with proper exception handling - **Smart Context Reduction**: The system limits conversation history to prevent token overflow - **Smart Cancellation**: The system properly cleans up competing operations ### Error handling and resilience The implementation includes several resilience patterns: ```csharp private void CancelAnyCurrentResponse() { // If a response was cancelled while streaming, include it in the conversation so it's not lost if (currentResponseMessage is not null) { messages.Add(currentResponseMessage); } currentResponseCancellation?.Cancel(); currentResponseMessage = null; } ``` **Resilience Features:** - **Graceful Cancellation**: The system saves in-progress responses when users cancel them - **Connection Recovery**: The SSE transport handles connection drops automatically - **State Management**: The UI state stays consistent during errors - **Logging Integration**: The system provides complete logging for debugging and monitoring #### Observability and health checks The application includes sophisticated observability patterns: **Smart Health Check Configuration:** ```csharp // Extensions.cs public static WebApplication MapDefaultEndpoints(this WebApplication app) { if (app.Environment.IsDevelopment()) { // All health checks must pass for app to be considered ready app.MapHealthChecks(HealthEndpointPath); // Only health checks tagged with "live" must pass for app to be considered alive app.MapHealthChecks(AlivenessEndpointPath, new HealthCheckOptions { Predicate = r => r.Tags.Contains("live") }); } return app; } ``` **OpenTelemetry with intelligent filtering:** ```csharp // Extensions.cs .AddAspNetCoreInstrumentation(tracing => // Exclude health check requests from tracing tracing.Filter = context => !context.Request.Path.StartsWithSegments(HealthEndpointPath) && !context.Request.Path.StartsWithSegments(AlivenessEndpointPath) ) ``` **Observability Benefits:** - **Environment-Aware Endpoints**: Security-conscious health check exposure - **Liveness vs Readiness**: Kubernetes-style health check patterns - **Telemetry Noise Reduction**: Filtering out routine health checks from traces ### Configuration and environment setup The application supports multiple environments through configuration: ```csharp var openAIClient = Constants.GitHubModelEndpoints.Contains(endpoint.TrimEnd('/')) ? new OpenAIClient(credential, openAIOptions) : new AzureOpenAIClient(new Uri(endpoint), credential); ``` **Configuration Options:** - **Azure OpenAI**: Production deployments typically use Azure OpenAI Service - **GitHub Models**: Development scenarios can use GitHub Models - **Local Development**: Support for local MCP server instances - **Container Deployment**: Azure Container Apps for production hosting ## Clean up resources After you finish using the MCP agent, clean up the resources you created to avoid incurring unnecessary costs. To clean up resources, follow these steps: - Delete the Azure resources created by the Azure Developer CLI by running the following command in the terminal at the bottom of the screen: ```shell azd down --purge --force ``` ### Clean up GitHub Codespaces #### [GitHub Codespaces](#tab/github-codespaces) Delete the GitHub Codespaces environment to maximize your free per-core hours. > [!IMPORTANT] > For more information about your GitHub account's free storage and core hours, see [GitHub Codespaces monthly included storage and core hours](https://docs.github.com/billing/managing-billing-for-github-codespaces/about-billing-for-github-codespaces#monthly-included-storage-and-core-hours-for-personal-accounts). 1. Sign into the [GitHub Codespaces dashboard](https://github.com/codespaces). 1. Find your active Codespaces created from the [`Azure-Samples/openai-mcp-agent-dotnet`](https://github.com/Azure-Samples/openai-mcp-agent-dotnet) GitHub repository. 1. Open the context menu for the codespace and select **Delete**. #### [Visual Studio Code](#tab/visual-studio-code) Stop the running development container and return to Visual Studio Code in your local workspace. Open the **Command Palette**, search for **Dev Containers**, and select **Dev Containers: Reopen Folder Locally**. > [!TIP] > Visual Studio Code stops the running development container, but the container still exists in Docker in a stopped state. Free up space on your local machine by deleting the container instance, image, and volumes from Docker. --- ## Get help Log your issue to the repository's [Issues](https://github.com/Azure-Samples/openai-mcp-agent-dotnet/issues). ## Related resources - [Build a TypeScript MCP server using Azure Container Apps](build-mcp-server-ts.md) ================================================ FILE: articles/ai/gen-ai-concepts-considerations-developers.md ================================================ --- title: Key concepts and considerations in generative AI description: Learn about the limitations of large language models (LLMs) and how to get the best results by modifying prompts, building an inference pipeline, and adjusting API call parameters. ms.date: 01/30/2026 content_well_notification: - AI-contribution ai-usage: ai-assisted ms.topic: concept-article ms.collection: ce-skilling-ai-copilot ms.subservice: intelligent-apps # CustomerIntent: As an AI app developer, I want to learn about the limitations and best practices for using LLMs in my applications. --- # Key concepts and considerations for building generative AI solutions Large language models (LLMs) are powerful, but they have limits. You need to know what LLMs can do by default and how to adjust them to get the best results for your generative AI apps. This article covers the main challenges with LLMs and shows simple ways to solve them and improve how you generate content, no matter what kind of generative AI features you build. ## Engineering challenges when working with LLMs Here are the most significant challenges and limitations to keep in mind when you work with LLMs: - **Knowledge cutoff**: LLMs only know what they were trained on up to a certain date. Without external data connections, they can’t access real-time or private information. - **Hallucination**: LLMs might generate inaccurate or misleading information. The Groundedness detection feature in Microsoft Foundry helps you determine whether an LLM’s responses are based on the source materials you provide. Ungrounded responses include information not supported by your data. Learn how to use groundedness detection in this [quickstart](/azure/ai-services/content-safety/quickstart-groundedness?tabs=python&pivots=programming-language-rest). - **Transparency**: You can’t always trace the source or accuracy of generated content, and there’s no built-in verification step. - **No domain-specific knowledge**: LLMs don’t know your internal or proprietary data unless you integrate it. - **Inability to learn from interactions**: LLMs don’t have memory or awareness of past interactions, so they can’t adapt or improve over time based on user feedback. To overcome these challenges and get the best results, supplement the LLM’s knowledge with your own data and use validation tools. ### Where LLMs get their information LLMs are trained on large datasets from books, articles, websites, and other sources. Their responses reflect patterns in this data, but anything that happened after the training cutoff isn’t included. Without external connections, LLMs can’t access real-time information or browse the internet, which can lead to outdated or incomplete answers. ## Factors that affect how inference works When you use an LLM, it might look like the model remembers your whole conversation. In reality, each new prompt you send includes all your earlier prompts and the model’s replies. The LLM uses this full history as context to create the next answer. This running history is the _context window_. Each LLM has a maximum context window size, which changes by model and version. If your conversation goes over this limit, the model drops the oldest parts and ignores them in its answer. Longer context windows mean the model has to process more data, which can slow down things and cost more. The context window size uses tokens, not words. Tokens are the smallest pieces of text the model can handle—these parts might be whole words, parts of words, or single characters, depending on the language and tokenizer. For developers, token usage directly impacts: - The maximum amount of conversation history the model can consider (context window) - The cost of each prompt and completion, since billing is based on the number of tokens processed ## What is tokenization? _Tokenization_ is the process of breaking text into tokens—the smallest units a model can process. Tokenization is essential for both training and inference with LLMs. Depending on the language and tokenizer, tokens might be whole words, subwords, or even single characters. Tokenization can be as simple as splitting by spaces and punctuation, or as complex as using algorithms that account for language structure and morphology. The OpenAI [tokenizer](https://platform.openai.com/tokenizer) page explains tokenization in detail and includes a calculator to show how sentences are split into tokens. In typical English text, one token is about four characters. On average, 100 tokens are roughly 75 words. For developers, the following libraries help estimate token counts for prompts and completions, which is useful for managing context window limits and costs: - the [tiktoken](https://github.com/openai/tiktoken) library (Python and JavaScript) - the [Microsoft.ML.Tokenizers](https://www.nuget.org/packages/Microsoft.ML.Tokenizers/2.0.0-preview.1.25127.4#readme-body-tab) library (.NET) ### Token usage affects billing Each Azure OpenAI API has a different billing methodology. For processing and generating text with the Responses or Chat Completions API, you're billed based on the number of tokens you submit as a prompt and the number of tokens that are generated as a result (completion). Each LLM model (for example, GPT-5.2, or GPT-5.2-mini) usually has a different price, which reflects the amount of computation required to process and generate tokens. Many times, price is presented as "price per 1,000 tokens" or "price per 1 million tokens." This pricing model has a significant effect on how you design the user interactions and the amount of preprocessing and post-processing you add. ## System prompts vs. user prompts So far, this article discussed _user prompts_. A _user prompt_ is what you send to the model and what the model replies to. OpenAI also added the _system prompt_ (or _custom instructions_). A system prompt is a set of rules you add to every chat. For example, you can tell the LLM to "always answer in haiku form." After that, every answer will be a haiku. This haiku example shows how you can change the LLM's answers by changing the prompt. Why change the user's prompt? If you build a generative AI app for work, customers, or partners, you might want to add rules to limit what the model can answer. But changing the user prompt is just one way to make text generation better. ## Methods to improve the text generation experience for users To improve text generation results, developers are limited to simply improving the prompt, and there are many prompt engineering techniques that can help. However, if you're building your own generative AI application, there are several ways to improve the text generation experience for users, and you might want to experiment with implementing all of them: - Programmatically modify the user prompts. - Implement an inference pipeline. - Retrieval-Augmented Generation (discussed in other articles). - Fine-tuning (discussed in other articles). ### Programmatically modify user prompts To add a system prompt to a user conversation, you don't use a special API. You just append instructions to the prompt as needed. But you can use a few techniques to improve user prompts: - **Contextual priming**: Craft system prompts that explicitly set the context of the conversation within the domain. This approach involves providing a brief description or a set of instructions at the beginning of each interaction. The instructions guide AI to stay within the problem domain. - **Example-based guidance**: In the initial prompt, include examples of the types of questions and answers that are relevant to your domain. This approach helps AI understand what kind of responses to expect. You can use any prompt-engineering technique. If you can accomplish it programmatically, you can improve the user prompt on their behalf. The caveat to this approach is that the longer the prompt, the higher the cost for each call to the LLM. Even so, this approach is likely the least expensive approach that this article describes. ### Implement an inference pipeline After you improve the user's prompt, the next step is to build an inference pipeline. An _inference pipeline_ is a process that: 1. Cleans up raw input (like text or images) 1. Sends it to the model (preprocessing) 1. Checks the model's answer to make sure it meets the user's needs before showing it (postprocessing). Preprocessing can include checking for keywords, scoring relevance, or changing the query to better fit your domain. For example, look at the user's first prompt. Ask the LLM if the prompt makes sense, follows your rules, is based on a correct idea, or needs rewriting to avoid bias. If the LLM finds problems, you can ask it to rewrite the prompt to get a better answer. Postprocessing can mean checking if the answer fits your domain and meets your standards. You might remove or flag answers that don't match your rules. For example, check the LLM's answer to see if it meets your quality and safety needs. You can ask the LLM to review its answer and change it if needed. Repeat this process until you get a good result. Keep in mind: every time you call an LLM in your inference pipeline, it takes longer to respond and costs more. You need to balance these trade-offs with your budget, speed, and how well your system works. For information about the specific steps to take to build an inference pipeline, see [Build an advanced retrieval-augmented generation system](advanced-retrieval-augmented-generation.md). ### Other factors that influence completions Beyond programmatically modifying the prompt, creating an inference pipeline, and other techniques, more details are discussed in [Augmenting a large-language model with retrieval-augmented generation and fine-tuning](augment-llm-rag-fine-tuning.md). Also, you can modify parameters when you make calls to the Azure OpenAI API. Here are some of the key parameters you can adjust to influence the model's output: - **`Temperature`**: Control the randomness of the output the model generates. At zero, the model becomes deterministic, consistently selecting the most likely next token from its training data. At a temperature of 1, the model balances between choosing high-probability tokens and introducing randomness into the output. - **`Max Tokens`**: Controls the maximum length of the response. Setting a higher or lower limit can affect the detail and scope of the generated content. - **`Top P` (nucleus sampling)**: Used with `Temperature` to control the randomness of the response. `Top P` limits AI to consider only the top percent of probability mass (`P`) when it generates each token. Lower values lead to text that is more focused and predictable. Higher values allow for more diversity. - **`Frequency Penalty`**: Decreases the likelihood of the model repeating the same line or phrase. Increasing this value helps avoid redundancy in the generated text. - **`Presence Penalty`**: Encourages the model to introduce new concepts and terms in the completion. `Presence Penalty` is useful for generating more diverse and creative outputs. - **`Stop Sequences`**: You can specify one or more sequences to instruct the API to stop generating more tokens. `Store Sequences` are useful for controlling the structure of the output, such as ending a completion at the end of a sentence or paragraph. - **`Logit Bias`**: Allows you to modify the likelihood of specified tokens appearing in the completion. `Logit Bias` can be used to guide the completion in a certain direction or to suppress specific content. ## Microsoft Azure OpenAI safeguards In addition to keeping the LLM's responses bound to specific subject matter or domains, you also likely are concerned about the kinds of questions your users are asking of the LLM. It's important to consider the kinds of answers it's generating. First, API calls to Microsoft Azure OpenAI Models in Microsoft Foundry automatically filter content that the API finds potentially offensive and reports this back to you in many filtering categories. You can directly use the [Content Moderation API](/azure/ai-services/content-moderator/api-reference) directly to check any content for potentially harmful content. Then, you can use [Azure AI Content Safety](/azure/ai-services/content-safety/overview) to help with text moderation, image moderation, jailbreak risk detection, and protected material detection. This service combines a portal setup, configuration, and reporting experience with code you can add to your application to identify harmful content. ## AI Agents AI agents are a new way to build generative AI apps that work on their own. They use LLMs to read and write text, and they can also connect to outside systems, APIs, and data sources. AI agents can manage complex tasks, make choices using real-time data, and learn from how people use them. For more information about AI agents, see [Quickstart: Create a new agent](/azure/ai-foundry/agents/quickstart?view=foundry-classic&pivots=programming-language-python-azure&preserve-view=true). ### Tool calling AI agents can use outside tools and APIs to get information, take action, or connect with other services. This feature lets them do more than just generate text and handle more complex tasks. For example, an AI agent can get real-time weather updates from a weather API or pull details from a database based on what a user asks. For more information about tool calling, see [Discover and manage tools in the Foundry tool catalog (preview)](/azure/ai-foundry/agents/concepts/tool-catalog?view=foundry&preserve-view=true). ### Model Context Protocol (MCP) The [Model Context Protocol](https://modelcontextprotocol.io/) (MCP) lets apps provide capabilities and context to a large language model. A key feature of MCP is defining tools that AI agents use to complete tasks. MCP servers can run locally, but remote MCP servers are crucial for sharing tools at cloud scale. For more information: see [Build Agents using Model Context Protocol on Azure](intro-agents-mcp.md). ## Final considerations for application design Understanding tokenization, pricing, context windows, and implementing programmatic improvements to enhance the users' text generation experience affects how you design your generative AI system. Here's a short list of things to consider and other takeaways from this article that might affect your application design decisions: - Evaluate the necessity of using the latest AI model against cost considerations. Models that are less expensive might suffice for your application's needs. Balance performance with budget constraints. - Consider optimizing the context window length to manage costs without significantly affecting the user experience. Trimming unnecessary parts of the conversation might reduce processing fees while maintaining quality interactions. - Assess how tokenization and the granularity of your inputs and outputs affect performance. Understanding how your chosen LLM handles tokenization can help you optimize the efficiency of your API calls, potentially reducing costs and improving response times. If you want to start experimenting with building a generative AI solution immediately, we recommend that you take a look at [Get started with the chat by using your own data sample for Python](/azure/developer/python/get-started-app-chat-template?tabs=github-codespaces). The tutorial is also available in [.NET](/dotnet/ai/get-started-app-chat-template?tabs=github-codespaces), [Java](/azure/developer/java/ai/get-started-app-chat-template?tabs=github-codespaces), and [JavaScript](/azure/developer/javascript/get-started-app-chat-template?tabs=github-codespaces). ================================================ FILE: articles/ai/get-started-app-chat-vision.md ================================================ --- title: "Get started with multimodal chat apps using Azure OpenAI" description: "Learn how to effectively use Azure OpenAI multimodal models to generate responses to user messages and uploaded images. Easily deploy with Azure Developer CLI." ms.date: 10/31/2025 ms.topic: get-started ms.subservice: intelligent-apps ms.custom: devx-track-python, devx-track-python-ai ms.collection: ce-skilling-ai-copilot content_well_notification: - AI-contribution ai-usage: ai-assisted # CustomerIntent: As a developer new to Azure OpenAI, I want to learn how to use Azure OpenAI multimodal models to add uploaded images to the chat stream from a simple example. --- # Get started with multimodal vision chat apps using Azure OpenAI This article shows you how to use Azure OpenAI multimodal models to generate responses to user messages and uploaded images in a chat app. This chat app sample also includes all the infrastructure and configuration needed to provision Azure OpenAI resources and deploy the app to Azure Container Apps using the Azure Developer CLI. By following the instructions in this article, you will: - Deploy an Azure Container chat app that uses managed identity for authentication. - Upload images to be used as part of the chat stream. - Chat with an Azure OpenAI multimodal Large Language Model (LLM) using the OpenAI library's Responses API. Once you complete this article, you can start modifying the new project with your custom code. > [!NOTE] > This article uses one or more [AI app templates](./intelligent-app-templates.md) as the basis for the examples and guidance in the article. AI app templates provide you with well-maintained, easy to deploy reference implementations that help to ensure a high-quality starting point for your AI apps. ## Architectural overview A simple architecture of the chat app is shown in the following diagram: :::image type="content" source="./media/get-started-app-chat-vision/simple-architecture-diagram.png" lightbox="./media/get-started-securing-your-ai-app/simple-architecture-diagram.png" alt-text="Diagram showing architecture from client to backend app."::: The chat app is running as an Azure Container App. The app uses managed identity via Microsoft Entra ID to authenticate with Azure OpenAI in production, instead of an API key. During development, the app supports multiple authentication methods including Azure Developer CLI credentials and API keys. The application architecture relies on the following services and components: - [Azure OpenAI](/azure/ai-services/openai/) represents the AI provider that we send the user's queries to. - [Azure Container Apps](/azure/container-apps/) is the container environment where the application is hosted. - [Managed Identity](/entra/identity/managed-identities-azure-resources/) helps us ensure best-in-class security and eliminates the requirement for you as a developer to securely manage a secret. - [Bicep files](/azure/azure-resource-manager/bicep/) for provisioning Azure resources, including Azure OpenAI, Azure Container Apps, Azure Container Registry, Azure Log Analytics, and role-based access control (RBAC) roles. - A Python [Quart](https://quart.palletsprojects.com) app that uses the [`openai`](https://pypi.org/project/openai/) package to generate responses to user messages with uploaded image files. - A basic HTML/JavaScript frontend that streams responses from the backend using [JSON Lines](http://jsonlines.org/) over a [ReadableStream](https://developer.mozilla.org/docs/Web/API/ReadableStream). ## Cost In an attempt to keep pricing as low as possible in this sample, most resources use a basic or consumption pricing tier. Alter your tier level as needed based on your intended usage. To stop incurring charges, delete the resources when you're done with the article. Learn more about [cost in the sample repo](https://github.com/Azure-Samples/openai-chat-vision-quickstart#costs). ## Prerequisites A [development container](https://containers.dev/) environment is available with all dependencies required to complete this article. You can run the development container in GitHub Codespaces (in a browser) or locally using Visual Studio Code. To use this article, you need to fulfill the following prerequisites: #### [GitHub Codespaces (recommended)](#tab/github-codespaces) - An Azure subscription - [Create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn) - Azure account permissions - Your Azure Account must have `Microsoft.Authorization/roleAssignments/write` permissions, such as [User Access Administrator](/azure/role-based-access-control/built-in-roles#user-access-administrator) or [Owner](/azure/role-based-access-control/built-in-roles#owner). - GitHub account #### [Visual Studio Code](#tab/visual-studio-code) - An Azure subscription - [Create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn) - Azure account permissions - Your Azure Account must have `Microsoft.Authorization/roleAssignments/write` permissions, such as [User Access Administrator](/azure/role-based-access-control/built-in-roles#user-access-administrator) or [Owner](/azure/role-based-access-control/built-in-roles#owner). - [Azure Developer CLI](/azure/developer/azure-developer-cli) - [Docker Desktop](https://www.docker.com/products/docker-desktop/) - start Docker Desktop if it's not already running - [Visual Studio Code](https://code.visualstudio.com/) - [Dev Container Extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) --- ## Open development environment Use the following instructions to deploy a preconfigured development environment containing all required dependencies to complete this article. #### [GitHub Codespaces (recommended)](#tab/github-codespaces) [GitHub Codespaces](https://docs.github.com/codespaces) runs a development container managed by GitHub with [Visual Studio Code for the Web](https://code.visualstudio.com/docs/editor/vscode-web) as the user interface. For the most straightforward development environment, use GitHub Codespaces so that you have the correct developer tools and dependencies preinstalled to complete this article. > [!IMPORTANT] > All GitHub accounts can use Codespaces for up to 60 hours free each month with two core instances. For more information, see [GitHub Codespaces monthly included storage and core hours](https://docs.github.com/billing/managing-billing-for-github-codespaces/about-billing-for-github-codespaces#monthly-included-storage-and-core-hours-for-personal-accounts). Use the following steps to create a new GitHub Codespace on the `main` branch of the [`Azure-Samples/openai-chat-vision-quickstart`](https://github.com/Azure-Samples/openai-chat-vision-quickstart) GitHub repository. 1. Right-click on the following button, and select _Open link in new window_. This action allows you to have the development environment and the documentation available for review. [![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/Azure-Samples/openai-chat-vision-quickstart) 1. On the **Create codespace** page, review and then select **Create new codespace** 1. Wait for the codespace to start. This startup process can take a few minutes. 1. Sign in to Azure with the Azure Developer CLI in the terminal at the bottom of the screen. ```azdeveloper azd auth login ``` 1. Copy the code from the terminal and then paste it into a browser. Follow the instructions to authenticate with your Azure account. The remaining tasks in this article take place in the context of this development container. #### [Visual Studio Code](#tab/visual-studio-code) The [Dev Containers extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) for Visual Studio Code requires [Docker](https://docs.docker.com/) to be installed on your local machine. The extension hosts the development container locally using the Docker host with the correct developer tools and dependencies preinstalled to complete this article. 1. Create a new local directory on your computer for the project. ```shell mkdir my-chat-vision-app ``` 1. Navigate to the directory you created. ```shell cd my-chat-vision-app ``` 1. Open Visual Studio Code in that directory: ```shell code . ``` 1. Open a new terminal in Visual Studio Code. 1. Run the following AZD command to bring the GitHub repository to your local computer. ```azdeveloper azd init -t openai-chat-vision-quickstart ``` 1. Open the Command Palette, search for and select **Dev Containers: Open Folder in Container** to open the project in a dev container. Wait until the dev container opens before continuing. 1. Sign in to Azure with the Azure Developer CLI. ```azdeveloper azd auth login ``` 1. The remaining exercises in this project take place in the context of this development container. --- ## Deploy and run The sample repository contains all the code and configuration files for the chat app Azure deployment. The following steps walk you through the sample chat app Azure deployment process. ### Deploy chat app to Azure > [!IMPORTANT] > To keep costs low, this sample uses basic or consumption pricing tiers for most resources. Adjust the tier as needed, and delete resources when you're done to avoid charges. 1. Run the following Azure Developer CLI command for Azure resource provisioning and source code deployment: ```azdeveloper azd up ``` 1. Use the following table to answer the prompts: |Prompt|Answer| |--|--| |Environment name|Keep it short and lowercase. Add your name or alias. For example, `chat-vision`. It's used as part of the resource group name.| |Subscription|Select the subscription to create the resources in. | |Location (for hosting)|Select a location near you from the list.| |Location for the Azure OpenAI model|Select a location near you from the list. If the same location is available as your first location, select that.| 1. Wait until app is deployed. Deployment usually takes between 5 and 10 minutes to complete. ### Use chat app to ask questions to the Large Language Model 1. The terminal displays a URL after successful application deployment. 1. Select that URL labeled `Deploying service web` to open the chat application in a browser. :::image type="content" source="./media/get-started-app-chat-vision/chat-speech.png" lightbox="./media/get-started-app-chat-vision/chat-speech.png" alt-text="Screenshot showing an uploaded image, a question about the image, the AI's response, and the text box."::: 1. In the browser, upload an image by clicking on **Choose File** and selecting an image. 1. Ask a question about the uploaded image such as "What is the image about?". 1. The answer comes from Azure OpenAI and the result is displayed. ## Exploring the sample code This sample uses an Azure OpenAI multimodal model to generate responses to user messages and uploaded images. ### Base64 Encoding the uploaded image in the frontend The uploaded image needs to be Base64 encoded so that it can be used directly as a Data URI as part of the message. In the sample, the following frontend code snippet in the `script`tag of the `src/quartapp/templates/index.html` file handles that functionality. The `toBase64` arrow function uses the `readAsDataURL` method of the`FileReader` to asynchronously read in the uploaded image file as a base64 encoded string. ```javascript const toBase64 = file => new Promise((resolve, reject) => { const reader = new FileReader(); reader.readAsDataURL(file); reader.onload = () => resolve(reader.result); reader.onerror = reject; }); ``` The `toBase64` function is called by a listener on the form's `submit` event. The `submit` event listener handles the complete chat interaction flow. When the user submits a message, the following flow occurs: 1. Gets the uploaded image file (if present) and encodes as Base64 1. Creates and displays the user's message in the chat, including the uploaded image 1. Prepares an assistant message container with a "Typing..." indicator 1. Adds the user's message to the message history array in Responses API format 1. Sends a `fetch` POST request to the `/chat/stream` endpoint with the message history and context (including the Base64 encoded image and filename) 1. Processes the streamed [JSON-lines response](https://jsonlines.org/) to display each text delta incrementally 1. Handles any errors during streaming 1. Adds a speech output button after receiving the complete response so users can hear the response 1. Clears the input field and returns focus for the next message ```javascript form.addEventListener("submit", async function(e) { e.preventDefault(); // Hide the no-messages-heading when a message is added document.getElementById("no-messages-heading").style.display = "none"; const file = document.getElementById("file").files[0]; const fileData = file ? await toBase64(file) : null; const message = messageInput.value; const userTemplateClone = userTemplate.content.cloneNode(true); userTemplateClone.querySelector(".message-content").innerText = message; if (file) { const img = document.createElement("img"); img.src = fileData; userTemplateClone.querySelector(".message-file").appendChild(img); } targetContainer.appendChild(userTemplateClone); const assistantTemplateClone = assistantTemplate.content.cloneNode(true); let messageDiv = assistantTemplateClone.querySelector(".message-content"); targetContainer.appendChild(assistantTemplateClone); messages.push({ "role": "user", "content": [{"type": "input_text", "text": message}] }); try { messageDiv.scrollIntoView(); const response = await fetch("/chat/stream", { method: "POST", headers: {"Content-Type": "application/json"}, body: JSON.stringify({ messages: messages, context: { file: fileData, file_name: file ? file.name : null } }) }); if (!response.ok || !response.body) { throw new Error(`Request failed (${response.status})`); } let answer = ""; for await (const chunk of readNDJSONStream(response.body)) { if (chunk.type === "error" || chunk.type === "response.failed") { messageDiv.innerHTML = "Error: " + (chunk.error || "Unknown error"); break; } if (chunk.type === "response.output_text.delta") { // Clear out the DIV if its the first answer chunk we've received if (answer == "") { messageDiv.innerHTML = ""; } answer += chunk.delta; messageDiv.innerHTML = converter.makeHtml(answer); messageDiv.scrollIntoView(); } } messages.push({ "role": "assistant", "content": [{"type": "output_text", "text": answer}] }); messageInput.value = ""; const speechOutput = document.createElement("speech-output-button"); speechOutput.setAttribute("text", answer); messageDiv.appendChild(speechOutput); messageInput.focus(); } catch (error) { messageDiv.innerHTML = "Error: " + error; } }); ``` ### Handling the image with the backend In the `src\quartapp\chat.py` file, the backend code for image handling starts after configuring keyless authentication. > [!NOTE] > For more information on how to use keyless connections for authentication and authorization to Azure OpenAI, check out the [Get started with the Azure OpenAI security building block](get-started-securing-your-ai-app.md) Microsoft Learn article. #### Authentication configuration The `configure_openai()` function sets up the OpenAI client before the app starts serving requests. It uses Quart's `@bp.before_app_serving` decorator to configure authentication based on environment variables. This flexible system lets developers work in different contexts without changing code. ##### Authentication modes explained - **Local development** (`OPENAI_HOST=local`): Connects to a local OpenAI-compatible API service (like Ollama or LocalAI) without authentication. Use this mode for testing without internet or API costs. - **Azure OpenAI with API key** (`AZURE_OPENAI_KEY_FOR_CHATVISION` environment variable): Uses an API key for authentication. Avoid this mode in production because API keys require manual rotation and pose security risks if exposed. Use it for local testing inside a Docker container without Azure CLI credentials. - **Production with Managed Identity** (`RUNNING_IN_PRODUCTION=true`): Uses `ManagedIdentityCredential` to authenticate with Azure OpenAI through the container app's managed identity. This method is recommended for production because it removes the need to manage secrets. Azure Container Apps automatically provide the managed identity and grant permissions during deployment via Bicep. - **Development with Azure CLI** (default mode): Uses `AzureDeveloperCliCredential` to authenticate with Azure OpenAI using locally signed-in Azure CLI credentials. This mode simplifies local development without managing API keys. ##### Key implementation details - The `get_bearer_token_provider()` function refreshes Azure credentials and uses them as bearer tokens. - The Azure OpenAI endpoint path ends with `/openai/v1/`, the generally available OpenAI-compatible endpoint for Microsoft Foundry Models. - The function is async, since Quart is an asynchronous web app framework. Quart lets request handlers be async, so while the app is awaiting slow LLM API responses, the server can keep handling other requests. Here's the complete authentication setup code from `chat.py`: ```python @bp.before_app_serving async def configure_openai(): bp.model_name = os.getenv("OPENAI_MODEL", "gpt-4o") openai_host = os.getenv("OPENAI_HOST", "azure") if openai_host == "local": bp.openai_client = AsyncOpenAI(api_key="no-key-required", base_url=os.getenv("LOCAL_OPENAI_ENDPOINT")) current_app.logger.info("Using local OpenAI-compatible API service with no key") elif os.getenv("AZURE_OPENAI_KEY_FOR_CHATVISION"): bp.openai_client = AsyncOpenAI( base_url=os.environ["AZURE_OPENAI_ENDPOINT"].rstrip("/") + "/openai/v1", api_key=os.getenv("AZURE_OPENAI_KEY_FOR_CHATVISION"), ) current_app.logger.info("Using Azure OpenAI with key") elif os.getenv("RUNNING_IN_PRODUCTION"): client_id = os.environ["AZURE_CLIENT_ID"] azure_credential = ManagedIdentityCredential(client_id=client_id) token_provider = get_bearer_token_provider(azure_credential, "https://cognitiveservices.azure.com/.default") bp.openai_client = AsyncOpenAI( base_url=os.environ["AZURE_OPENAI_ENDPOINT"].rstrip("/") + "/openai/v1", api_key=token_provider, ) current_app.logger.info("Using Azure OpenAI with managed identity credential for client ID %s", client_id) else: tenant_id = os.environ["AZURE_TENANT_ID"] azure_credential = AzureDeveloperCliCredential(tenant_id=tenant_id) token_provider = get_bearer_token_provider(azure_credential, "https://cognitiveservices.azure.com/.default") bp.openai_client = AsyncOpenAI( base_url=os.environ["AZURE_OPENAI_ENDPOINT"].rstrip("/") + "/openai/v1", api_key=token_provider, ) current_app.logger.info("Using Azure OpenAI with az CLI credential for tenant ID: %s", tenant_id) ``` #### Chat handler function The `chat_handler()` function processes chat requests sent to the `/chat/stream` endpoint. It receives a POST request with a JSON payload. The JSON payload includes: - **messages**: A list of conversation history. Each message has a `role` ("user" or "assistant") and `content` (an array of content parts using the [Responses API input format](https://platform.openai.com/docs/api-reference/responses)). - **context**: Extra data for processing, including: - **file**: Base64-encoded image data (for example, `data:image/png;base64,...`). - **file_name**: The uploaded image's original filename (useful for logging or identifying the image type). The handler extracts the message history and image data. If no image is uploaded, the image value is `null`, and the code handles this case. ```python @bp.post("/chat/stream") async def chat_handler(): request_json = await request.get_json() request_messages = request_json["messages"] # Get the base64 encoded image from the request context # This will be None if no image was uploaded image = request_json["context"]["file"] ``` ### Building the input array for vision requests The `response_stream()` function prepares the input array that is sent to the Azure OpenAI Responses API. The `@stream_with_context` decorator keeps the request context while streaming the response. #### Input preparation logic 1. **Start with conversation history**: The function begins with `all_input`, which includes all previous messages except the most recent one (`request_messages[0:-1]`). Messages are already in Responses API format from the frontend. 1. **Handle the current user message based on image presence**: - **With image**: Append an `input_image` content part to the user's existing content array. - **Without image**: Append the user's message as-is. ```python @stream_with_context async def response_stream(): # This sends all messages, so API request may exceed token limits all_input = list(request_messages[0:-1]) # Add the current user message, appending image if provided if image: user_content = request_messages[-1]["content"] + [{"type": "input_image", "image_url": image}] all_input.append({"role": "user", "content": user_content}) else: all_input.append(request_messages[-1]) ``` Next, `bp.openai_client.responses.create` calls the Azure OpenAI Responses API and streams the response. The `store=False` parameter instructs the API to not store responses on the server, making the call stateless. ```python openai_stream = await bp.openai_client.responses.create( model=bp.model_name, input=all_input, stream=True, temperature=0.3, store=False, ) ``` Finally, the response is streamed back to the client. The Responses API emits [many event types](https://platform.openai.com/docs/api-reference/responses-streaming), but only the `response.output_text.delta` event is needed for streaming generated text. Error events are logged and forwarded to the frontend. ```python try: async for event in openai_stream: if event.type == "response.output_text.delta": yield json.dumps({"type": event.type, "delta": event.delta}, ensure_ascii=False) + "\n" elif event.type in ("response.failed", "error"): current_app.logger.error("Responses API error: %s", event) yield json.dumps({"type": event.type}, ensure_ascii=False) + "\n" except Exception as e: current_app.logger.exception("Error in response stream") yield json.dumps({"error": str(e)}, ensure_ascii=False) + "\n" return Response(response_stream()) ``` #### Frontend libraries and features The frontend uses modern browser APIs and libraries to create an interactive chat experience. Developers can customize the interface or add features by understanding these components: 1. **Speech Input/Output**: Custom web components use the browser's Speech APIs: - **``**: Converts speech to text using the Web Speech API's `SpeechRecognition`. It provides a microphone button that listens for voice input and emits a `speech-input-result` event with the transcribed text. - **``**: Reads text aloud using the `SpeechSynthesis` API. It appears after each assistant response with a speaker icon, letting users hear the response. **Why use browser APIs instead of Azure Speech Services?** - No cost - runs entirely in the browser - Instant response - no network latency - Privacy - voice data stays on the user's device - No need for extra Azure resources These components are in `src/quartapp/static/speech-input.js` and `speech-output.js`. 1. **Image Preview**: Displays the uploaded image in the chat before analysis submission for confirmation. The preview updates automatically when a file is selected. ```javascript fileInput.addEventListener("change", async function() { const file = fileInput.files[0]; if (file) { const fileData = await toBase64(file); imagePreview.src = fileData; imagePreview.style.display = "block"; } }); ``` 1. **Bootstrap 5 and Bootstrap Icons**: Provides responsive UI components and icons. The app uses the Cosmo theme from Bootswatch for a modern look. 1. **Template-based Message Rendering**: Uses HTML `