diff --git a/.github/workflows/build-samples.yml b/.github/workflows/build-samples.yml
index 66758e74..d959b1dd 100644
--- a/.github/workflows/build-samples.yml
+++ b/.github/workflows/build-samples.yml
@@ -31,7 +31,6 @@ jobs:
uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6
with:
dotnet-version: "10.x"
- dotnet-quality: "preview"
# Durable Task SDK samples (net10.0)
- name: Build DTS - FunctionChaining
@@ -93,9 +92,6 @@ jobs:
- name: Build DF - Saga
run: dotnet build samples/durable-functions/dotnet/Saga/DurableFunctionsSaga.csproj
- - name: Build DF - PdfSummarizer
- run: dotnet build samples/durable-functions/dotnet/PdfSummarizer/pdf-summarizer-dotnet.csproj
-
- name: Build DF - AiAgentTravelPlanOrchestrator
run: dotnet build samples/durable-functions/dotnet/AiAgentTravelPlanOrchestrator/TravelPlannerFunctions.csproj
@@ -222,9 +218,6 @@ jobs:
- name: Install DF - fan-out-fan-in
run: pip install -r samples/durable-functions/python/fan-out-fan-in/requirements.txt
- - name: Install DF - pdf-summarizer
- run: pip install -r samples/durable-functions/python/pdf-summarizer/requirements.txt
-
- name: Install DF - work-item-filtering
run: pip install -r samples/durable-functions/python/work-item-filtering/requirements.txt
@@ -248,7 +241,7 @@ jobs:
- name: Setup Node.js
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7
with:
- node-version: "20"
+ node-version: "22"
# Durable Functions samples
- name: Build DF JS - HelloCities
@@ -267,7 +260,7 @@ jobs:
- name: Setup Node.js
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7
with:
- node-version: "20"
+ node-version: "22"
# Durable Functions samples
- name: Build DF TS - HelloCities
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 830b5d10..c397cd56 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -51,12 +51,12 @@ chances of your issue being dealt with quickly:
* **Suggest a Fix** - if you can't fix the bug yourself, perhaps you can point to what might be
causing the problem (line of code or commit)
-You can file new issues by providing the above information at the corresponding repository's issues link: https://github.com/Azure/Durable-Task-Scheduler/issues/new.
+You can file new issues by providing the above information at the corresponding repository's issues link: https://github.com/Azure-Samples/Durable-Task-Scheduler/issues/new.
### Submitting a Pull Request (PR)
Before you submit your Pull Request (PR) consider the following guidelines:
-* Search the repository (https://github.com/Azure/Durable-Task-Scheduler/pulls) for an open or closed PR
+* Search the repository (https://github.com/Azure-Samples/Durable-Task-Scheduler/pulls) for an open or closed PR
that relates to your submission. You don't want to duplicate effort.
* Make your changes in a new git fork:
@@ -69,7 +69,7 @@ Before you submit your Pull Request (PR) consider the following guidelines:
* Rebase your fork and force push to your GitHub repository (this will update your Pull Request):
```shell
- git rebase master -i
+ git rebase main -i
git push -f
```
@@ -80,5 +80,5 @@ That's it! Thank you for your contribution!
- Each sample should have its own directory under the appropriate framework/language folder.
- Include a `README.md` following a consistent structure: description, prerequisites, how to run, and expected output.
- Use the Durable Task Scheduler emulator as the default development experience.
-- Include a `requirements.txt` (Python) or project file (`.csproj`/`.sln` for .NET, `build.gradle` for Java).
+- Include a `requirements.txt` (Python) or project file (`.csproj`/`.sln` for .NET, `build.gradle` for Java, `package.json` for JavaScript/TypeScript).
- Test your sample with the emulator before submitting.
diff --git a/README.md b/README.md
index 27a50975..711dc774 100644
--- a/README.md
+++ b/README.md
@@ -27,7 +27,7 @@
Workflows can run for hours, days, or even months, reliably resuming from the last completed step after any crash, restart, or redeployment. Common use cases include distributed transactions, multi-agent AI orchestration, data processing pipelines, and infrastructure management.
-Durable Task encompasses the Durable Task SDKs for self-hosted applications, [Durable Functions](https://learn.microsoft.com/azure/azure-functions/durable/durable-functions-overview) for serverless hosting on Azure Functions, and the [Durable Task Scheduler](https://learn.microsoft.com/azure/azure-functions/durable/durable-task-scheduler/durable-task-scheduler) - a fully managed backend service purpose-built for durable workloads.
+Durable Task encompasses the Durable Task SDKs for self-hosted applications, [Durable Functions](https://learn.microsoft.com/azure/azure-functions/durable/durable-functions-overview) for serverless hosting on Azure Functions, and the [Durable Task Scheduler](https://learn.microsoft.com/azure/durable-task/scheduler/durable-task-scheduler) - a fully managed backend service purpose-built for durable workloads.
#### What is Durable Execution?
@@ -39,12 +39,12 @@ Durable execution is an industry-wide approach to making ordinary code fault-tol
- ๐๏ธ **Fully managed** - no storage accounts to configure, no infrastructure to maintain
- โก **Purpose-built & fast** - optimized compute+memory; push-model gRPC streaming (no polling)
-- ๐ **Built-in dashboard** - monitor orchestrations, drill into history, pause/terminate/restart instances ([Learn more](https://learn.microsoft.com/azure/azure-functions/durable/durable-task-scheduler/durable-task-scheduler-dashboard))
+- ๐ **Built-in dashboard** - monitor orchestrations, drill into history, pause/terminate/restart instances ([Learn more](https://learn.microsoft.com/azure/durable-task/scheduler/durable-task-scheduler-dashboard))
- ๐ก๏ธ **Fault isolation** - runs as a separate Azure resource; failures don't cascade to your app
- ๐ **Independent scaling** - scheduler scales separately from your app; multiple apps can share one scheduler
-- ๐๏ธ **Multiple task hubs** - isolate workloads by environment, team, or project ([Learn more](https://learn.microsoft.com/azure/azure-functions/durable/durable-task-scheduler/durable-task-scheduler#multiple-task-hubs))
+- ๐๏ธ **Multiple task hubs** - isolate workloads by environment, team, or project ([Learn more](https://learn.microsoft.com/azure/durable-task/scheduler/durable-task-scheduler#multiple-task-hubs))
- ๐ณ **Emulator for local dev** - Docker-based emulator with dashboard included, zero Azure dependency
-- ๐ **Identity-based auth** - Microsoft Entra ID / managed identity, no secrets in connection strings ([Learn more](https://learn.microsoft.com/azure/azure-functions/durable/durable-task-scheduler/durable-task-scheduler-identity))
+- ๐ **Identity-based auth** - Microsoft Entra ID / managed identity, no secrets in connection strings ([Learn more](https://learn.microsoft.com/azure/durable-task/scheduler/durable-task-scheduler-identity))
- ๐ **Run anywhere** - Azure Functions, Container Apps, AKS, App Service, VMs

@@ -71,12 +71,16 @@ docker run -d -p 8080:8080 -p 8082:8082 mcr.microsoft.com/dts/dts-emulator:lates
### Step 2: Pick your language and run a sample
-| Language | Quickstart Sample | Run Command |
-|----------|-------------------|-------------|
-| .NET | Function Chaining | `cd samples/durable-task-sdks/dotnet/FunctionChaining/Worker && dotnet run` |
-| Python | Function Chaining | `cd samples/durable-task-sdks/python/function-chaining && pip install -r requirements.txt && python worker.py` |
-| Java | Function Chaining | `cd samples/durable-task-sdks/java/function-chaining && ./gradlew runChainingPattern` |
-| JavaScript | Function Chaining | `cd samples/durable-task-sdks/javascript/function-chaining && npm install && node worker.mjs` |
+Run the worker first, then run the client in a separate terminal to schedule orchestrations. Start each command at the repository root. The Java sample runs both in one process.
+
+See the [quickstart guide](./docs/quickstart.md) for runtime prerequisites (.NET 10, Python 3.9+, Java 21, or Node.js 22+) and Python virtual environment setup.
+
+| Language | Quickstart Sample | Worker Command | Client Command |
+|----------|-------------------|----------------|----------------|
+| .NET | [Function Chaining](./samples/durable-task-sdks/dotnet/FunctionChaining) | `cd samples/durable-task-sdks/dotnet/FunctionChaining/Worker && dotnet run` | `cd samples/durable-task-sdks/dotnet/FunctionChaining/Client && dotnet run` |
+| Python | [Function Chaining](./samples/durable-task-sdks/python/function-chaining) | `cd samples/durable-task-sdks/python/function-chaining && pip install -r requirements.txt && python worker.py` | `cd samples/durable-task-sdks/python/function-chaining && python client.py` |
+| Java | [Function Chaining](./samples/durable-task-sdks/java/function-chaining) | `cd samples/durable-task-sdks/java/function-chaining && ./gradlew runChainingPattern` | Included in the same process |
+| JavaScript (preview) | [Function Chaining](./samples/durable-task-sdks/javascript/function-chaining) | `cd samples/durable-task-sdks/javascript/function-chaining && npm install && npm run worker` | `cd samples/durable-task-sdks/javascript/function-chaining && npm run client` |
### Step 3: Open the dashboard
@@ -92,15 +96,17 @@ Navigate to **[http://localhost:8082](http://localhost:8082)** to view orchestra
| **Hosting** | Azure Functions | Any host (ACA, AKS, App Service, VMs) |
| **Triggers** | HTTP, Timer, Queue, etc. | Self-managed |
| **Scaling** | Built-in auto-scale | Bring your own scaling |
-| **Languages** | .NET, Python, Java, JavaScript | .NET, Python, Java, JavaScript |
+| **Languages** | .NET, Python, Java, JavaScript/TypeScript, PowerShell | .NET, Python, Java, JavaScript/TypeScript (preview), Go (beta) |
+
+Go samples in this repository are coming soon. The [Go SDK repository](https://github.com/microsoft/durabletask-go) contains the beta SDK and its own samples.
-๐ [Choosing an orchestration framework โ](https://learn.microsoft.com/azure/azure-functions/durable/durable-task-scheduler/choose-orchestration-framework)
+๐ [Choosing an orchestration framework โ](https://learn.microsoft.com/azure/durable-task/common/choose-orchestration-framework)
---
## Samples
-Explore production-ready examples across languages and frameworks.
+Explore examples across languages and frameworks.
๐ [**Full Sample Catalog โ**](./samples/README.md)
@@ -131,7 +137,8 @@ The Durable Task Scheduler provides a **built-in dashboard** for monitoring orch
- [.NET](https://learn.microsoft.com/dotnet/api/microsoft.durabletask?view=durabletask-dotnet-1.x)
- [Python](https://github.com/microsoft/durabletask-python)
- [Java](https://learn.microsoft.com/java/api/com.microsoft.durabletask?view=durabletask-java-1.x)
-- JavaScript (coming soon)
+- [JavaScript / TypeScript (preview)](https://github.com/microsoft/durabletask-js) - [JavaScript samples](./samples/durable-task-sdks/javascript/)
+- [Go (beta)](https://github.com/microsoft/durabletask-go) - samples in this repository coming soon
### Durable Functions
@@ -151,7 +158,9 @@ This repository includes specialized skills for AI coding assistants ([GitHub Co
| **durable-functions-dotnet** | Durable Functions with .NET isolated worker - orchestrations, activities, entities, and all workflow patterns | [Skill โ](.github/skills/durable-functions-dotnet/SKILL.md) |
| **durable-task-dotnet** | Durable Task SDK for .NET - portable orchestrations without Azure Functions dependency | [Skill โ](.github/skills/durable-task-dotnet/SKILL.md) |
| **durable-task-java** | Durable Task SDK for Java - orchestrations, activities, and common workflow patterns | [Skill โ](.github/skills/durable-task-java/SKILL.md) |
+| **durable-task-js** | Durable Task SDK for JavaScript/TypeScript - orchestrations, activities, entities, and common workflow patterns | [Skill โ](.github/skills/durable-task-js/SKILL.md) |
| **durable-task-python** | Durable Task SDK for Python - orchestrations, activities, entities, and stateful agents | [Skill โ](.github/skills/durable-task-python/SKILL.md) |
+| **migrate-backend-to-dts** | Migrate Durable Functions apps from Azure Storage, Netherite, or MSSQL to Durable Task Scheduler | [Skill โ](.github/skills/migrate-backend-to-dts/SKILL.md) |
**Usage:** Reference a skill file in your AI assistant (e.g., `#file:.github/skills/durable-task-dotnet/SKILL.md` in Copilot Chat) or ask it to read the skill before generating code. Skills are automatically detected by Claude Code when working on relevant files.
@@ -166,7 +175,7 @@ We welcome contributions! Please see [CONTRIBUTING.md](./CONTRIBUTING.md) for gu
## Community & Support
- ๐ [Official Documentation](https://aka.ms/dts-documentation)
-- ๐ฌ [GitHub Issues](https://github.com/Azure/Durable-Task-Scheduler/issues) - bugs and feature requests
+- ๐ฌ [GitHub Issues](https://github.com/Azure-Samples/Durable-Task-Scheduler/issues) - bugs and feature requests
- ๐ง Contact: [nicholas.greenfield@microsoft.com](mailto:nicholas.greenfield@microsoft.com), [jiayma@microsoft.com](mailto:jiayma@microsoft.com)
---
diff --git a/docs/FAQ.md b/docs/FAQ.md
index b2d4adc3..53ce190e 100644
--- a/docs/FAQ.md
+++ b/docs/FAQ.md
@@ -3,16 +3,16 @@
## General
**Q: What is the Durable Task Scheduler?**
-A: The Durable Task Scheduler is a fully managed Azure service for durable execution โ running fault-tolerant code that handles failures through automatic retries and state persistence. It serves as the backend for Durable Functions and the Durable Task SDKs. [Learn more โ](https://learn.microsoft.com/azure/azure-functions/durable/durable-task-scheduler/durable-task-scheduler)
+A: The Durable Task Scheduler is a fully managed Azure service for durable execution - running fault-tolerant code that handles failures through automatic retries and state persistence. It serves as the backend for Durable Functions and the Durable Task SDKs. [Learn more โ](https://learn.microsoft.com/azure/durable-task/scheduler/durable-task-scheduler)
**Q: What's the difference between Durable Functions and Durable Task SDKs?**
-A: Durable Functions is an extension of Azure Functions โ best for serverless, event-driven apps with built-in triggers and auto-scaling. Durable Task SDKs are lightweight client libraries that work on any compute (Container Apps, AKS, VMs, etc.) โ best when you need portability or already have a hosting environment. Both use the same Durable Task Scheduler backend. [See comparison โ](https://learn.microsoft.com/azure/azure-functions/durable/durable-task-scheduler/choose-orchestration-framework)
+A: Durable Functions is an extension of Azure Functions - best for serverless, event-driven apps with built-in triggers and auto-scaling. Durable Task SDKs are lightweight client libraries that work on any compute (Container Apps, AKS, VMs, etc.) - best when you need portability or already have a hosting environment. Both use the same Durable Task Scheduler backend. [See comparison โ](https://learn.microsoft.com/azure/durable-task/common/choose-orchestration-framework)
**Q: What languages are supported?**
-A: Durable Task SDKs: .NET, Python, Java (JavaScript coming soon). Durable Functions: .NET, Python, Java, JavaScript/TypeScript.
+A: Durable Task SDKs: .NET, Python, Java, [JavaScript/TypeScript (preview)](https://github.com/microsoft/durabletask-js), and [Go (beta)](https://github.com/microsoft/durabletask-go). [JavaScript samples](../samples/durable-task-sdks/javascript/) are available here; Go samples in this repository are coming soon. Durable Functions: .NET, Python, Java, JavaScript/TypeScript, and PowerShell. Go is a standalone SDK language, not a Durable Functions language.
**Q: How much does it cost?**
-A: The Durable Task Scheduler offers a Dedicated SKU (reserved capacity) and a Consumption SKU (preview, pay-per-use). The emulator is free for local development. [See pricing details โ](https://learn.microsoft.com/azure/azure-functions/durable/durable-task-scheduler/durable-task-scheduler-dedicated-sku)
+A: The Durable Task Scheduler offers a Dedicated SKU (reserved capacity) and a Consumption SKU (pay-per-use). Both are generally available. The emulator is free for local development. [See pricing details โ](https://learn.microsoft.com/azure/durable-task/scheduler/durable-task-scheduler-billing)
## Development
@@ -23,10 +23,10 @@ A: Yes! The Durable Task Scheduler emulator runs in Docker and provides the full
A: A task hub is a logical container for orchestration and entity instances. You can create multiple task hubs within a single scheduler to isolate workloads by environment (dev/test/prod), team, or project. Each task hub gets its own monitoring dashboard. [Learn more โ](https://learn.microsoft.com/azure/azure-functions/durable/durable-functions-task-hubs)
**Q: How does authentication work?**
-A: The Durable Task Scheduler uses identity-based authentication only (Microsoft Entra ID / managed identity). No shared keys or connection string secrets. For local development with the emulator, no authentication is required. [Learn more โ](https://learn.microsoft.com/azure/azure-functions/durable/durable-task-scheduler/durable-task-scheduler-identity)
+A: The Durable Task Scheduler uses identity-based authentication only (Microsoft Entra ID / managed identity). No shared keys or connection string secrets. For local development with the emulator, no authentication is required. [Learn more โ](https://learn.microsoft.com/azure/durable-task/scheduler/durable-task-scheduler-identity)
**Q: Can I use the Durable Task Scheduler with existing Durable Functions apps?**
-A: Yes! The Durable Task Scheduler is a backend provider for Durable Functions. You can switch from Azure Storage or other providers to the Durable Task Scheduler by updating your configuration. [Migration guide โ](https://learn.microsoft.com/azure/azure-functions/durable/durable-task-scheduler/develop-with-durable-task-scheduler-functions)
+A: Yes! The Durable Task Scheduler is a backend provider for Durable Functions. You can switch from Azure Storage or other providers to the Durable Task Scheduler by updating your configuration. [Configuration guide โ](https://learn.microsoft.com/azure/durable-task/scheduler/quickstart-durable-task-scheduler#understand-the-durable-task-scheduler-configuration)
## Monitoring & Observability
@@ -42,4 +42,4 @@ A: Yes. Durable Functions supports distributed tracing V2 with Application Insig
A: Ensure Docker is running and ports 8080/8082 are free. Try: `docker pull mcr.microsoft.com/dts/dts-emulator:latest` to get the latest image. If ports conflict, map to different ports: `docker run -d -p 9080:8080 -p 9082:8082 mcr.microsoft.com/dts/dts-emulator:latest`
**Q: Where do I report bugs or request features?**
-A: For issues with the Durable Task Scheduler service, use the [Azure/Durable-Task-Scheduler repo](https://github.com/Azure/Durable-Task-Scheduler/issues). For sample issues, open an issue in this repository.
+A: For Durable Task Scheduler service issues and sample issues, use [this repository's issue tracker](https://github.com/Azure-Samples/Durable-Task-Scheduler/issues). The former Azure/Durable-Task-Scheduler repository is archived.
diff --git a/docs/patterns.md b/docs/patterns.md
index 00f2d81a..81daab0c 100644
--- a/docs/patterns.md
+++ b/docs/patterns.md
@@ -1,6 +1,10 @@
# Orchestration Patterns
-This guide maps each common orchestration pattern to available samples and documentation. All patterns can be developed locally using the [Durable Task Scheduler emulator](https://learn.microsoft.com/azure/azure-functions/durable/durable-task-scheduler/develop-with-durable-task-scheduler).
+This guide maps each common orchestration pattern to available samples and documentation. All patterns can be developed locally using the [Durable Task Scheduler emulator](https://learn.microsoft.com/azure/durable-task/scheduler/develop-with-durable-task-scheduler).
+
+The [JavaScript/TypeScript SDK](https://github.com/microsoft/durabletask-js) is available in preview, with JavaScript examples linked below. Go samples in this repository are coming soon; the [Go SDK repository](https://github.com/microsoft/durabletask-go) contains the beta SDK and its own samples.
+
+A blank table cell means no sample is linked here.
---
@@ -16,9 +20,10 @@ Activity A โ Activity B โ Activity C โ Result
| Language | Durable Task SDK | Durable Functions |
|----------|-----------------|-------------------|
| .NET | [Sample](../samples/durable-task-sdks/dotnet/FunctionChaining) | [HelloCities](../samples/durable-functions/dotnet/HelloCities) |
-| Python | [Sample](../samples/durable-task-sdks/python/function-chaining) | โ |
+| Python | [Sample](../samples/durable-task-sdks/python/function-chaining) | [Hello Cities](../samples/durable-functions/python/hello-cities) |
| Java | [Sample](../samples/durable-task-sdks/java/function-chaining) | [HelloCities](../samples/durable-functions/java/HelloCities) |
-| JavaScript | โ | [HelloCities](../samples/durable-functions/javascript/HelloCities) |
+| JavaScript | [Sample](../samples/durable-task-sdks/javascript/function-chaining) | [HelloCities](../samples/durable-functions/javascript/HelloCities) |
+| TypeScript | See the JavaScript SDK sample above | [HelloCities](../samples/durable-functions/typescript/HelloCities) |
๐ [Learn more on Microsoft Learn โ](https://learn.microsoft.com/azure/azure-functions/durable/durable-functions-sequence)
@@ -37,10 +42,11 @@ Input โโโโผโ Activity B โโโผโ Aggregate โ Result
| Language | Durable Task SDK | Durable Functions |
|----------|-----------------|-------------------|
-| .NET | [Sample](../samples/durable-task-sdks/dotnet/FanOutFanIn) | โ |
+| .NET | [Sample](../samples/durable-task-sdks/dotnet/FanOutFanIn) | [Large Payload Fan-out/Fan-in](../samples/durable-functions/dotnet/LargePayloadFanOutFanIn) |
| Python | [Sample](../samples/durable-task-sdks/python/fan-out-fan-in) | [Fan-out/Fan-in](../samples/durable-functions/python/fan-out-fan-in) |
| Java | [Sample](../samples/durable-task-sdks/java/fan-out-fan-in) | [HelloCities](../samples/durable-functions/java/HelloCities) |
-| JavaScript | โ | [HelloCities](../samples/durable-functions/javascript/HelloCities) |
+| JavaScript | [Sample](../samples/durable-task-sdks/javascript/fan-out-fan-in) | [HelloCities](../samples/durable-functions/javascript/HelloCities) |
+| TypeScript | See the JavaScript SDK sample above | [HelloCities](../samples/durable-functions/typescript/HelloCities) |
๐ [Learn more on Microsoft Learn โ](https://learn.microsoft.com/azure/azure-functions/durable/durable-functions-cloud-backup)
@@ -60,8 +66,8 @@ Client โ GET /status โ 200 Completed (with result)
| Language | Durable Task SDK | Durable Functions |
|----------|-----------------|-------------------|
| .NET | [ASP.NET Web App](../samples/durable-task-sdks/dotnet/AspNetWebApp) | [HelloCities](../samples/durable-functions/dotnet/HelloCities) |
-| Python | [Sample](../samples/durable-task-sdks/python/async-http-api) | โ |
-| Java | [Sample](../samples/durable-task-sdks/java/async-http-api) | โ |
+| Python | [Sample](../samples/durable-task-sdks/python/async-http-api) | |
+| Java | [Sample](../samples/durable-task-sdks/java/async-http-api) | |
๐ [Learn more on Microsoft Learn โ](https://learn.microsoft.com/azure/azure-functions/durable/durable-functions-http-api)
@@ -80,9 +86,9 @@ Orchestration โ Wait for approval event
| Language | Durable Task SDK | Durable Functions |
|----------|-----------------|-------------------|
-| .NET | [Sample](../samples/durable-task-sdks/dotnet/HumanInteraction) | โ |
-| Python | [Sample](../samples/durable-task-sdks/python/human-interaction) | โ |
-| Java | [Sample](../samples/durable-task-sdks/java/human-interaction) | โ |
+| .NET | [Sample](../samples/durable-task-sdks/dotnet/HumanInteraction) | |
+| Python | [Sample](../samples/durable-task-sdks/python/human-interaction) | |
+| Java | [Sample](../samples/durable-task-sdks/java/human-interaction) | |
๐ [Learn more on Microsoft Learn โ](https://learn.microsoft.com/azure/azure-functions/durable/durable-functions-phone-verification)
@@ -99,9 +105,9 @@ Check status โ Not ready โ Wait โ Check status โ Ready โ Done
| Language | Durable Task SDK | Durable Functions |
|----------|-----------------|-------------------|
-| .NET | [Sample](../samples/durable-task-sdks/dotnet/Monitoring) | โ |
-| Python | [Sample](../samples/durable-task-sdks/python/monitoring) | โ |
-| Java | [Sample](../samples/durable-task-sdks/java/monitoring) | โ |
+| .NET | [Sample](../samples/durable-task-sdks/dotnet/Monitoring) | |
+| Python | [Sample](../samples/durable-task-sdks/python/monitoring) | |
+| Java | [Sample](../samples/durable-task-sdks/java/monitoring) | |
๐ [Learn more on Microsoft Learn โ](https://learn.microsoft.com/azure/azure-functions/durable/durable-functions-monitor)
@@ -120,9 +126,9 @@ Parent Orchestration
| Language | Durable Task SDK | Durable Functions |
|----------|-----------------|-------------------|
-| .NET | [Sample](../samples/durable-task-sdks/dotnet/SubOrchestrations) | โ |
-| Python | [Sample](../samples/durable-task-sdks/python/sub-orchestrations) | โ |
-| Java | [Sample](../samples/durable-task-sdks/java/sub-orchestrations) | โ |
+| .NET | [Sample](../samples/durable-task-sdks/dotnet/SubOrchestrations) | |
+| Python | [Sample](../samples/durable-task-sdks/python/sub-orchestrations) | |
+| Java | [Sample](../samples/durable-task-sdks/java/sub-orchestrations) | |
๐ [Learn more on Microsoft Learn โ](https://learn.microsoft.com/azure/azure-functions/durable/durable-functions-sub-orchestrations)
@@ -139,9 +145,9 @@ Process batch โ Continue as new โ Process batch โ Continue as new โ ...
| Language | Durable Task SDK | Durable Functions |
|----------|-----------------|-------------------|
-| .NET | [Sample](../samples/durable-task-sdks/dotnet/EternalOrchestrations) | โ |
-| Python | [Sample](../samples/durable-task-sdks/python/eternal-orchestrations) | โ |
-| Java | [Sample](../samples/durable-task-sdks/java/eternal-orchestrations) | โ |
+| .NET | [Sample](../samples/durable-task-sdks/dotnet/EternalOrchestrations) | |
+| Python | [Sample](../samples/durable-task-sdks/python/eternal-orchestrations) | |
+| Java | [Sample](../samples/durable-task-sdks/java/eternal-orchestrations) | |
๐ [Learn more on Microsoft Learn โ](https://learn.microsoft.com/azure/azure-functions/durable/durable-functions-eternal-orchestrations)
@@ -158,8 +164,8 @@ Coordinator (batch N) โ fan out children โ wait all โ continue_as_new โ
| Language | Durable Task SDK | Durable Functions |
|----------|-----------------|-------------------|
-| .NET | [Sample](../samples/durable-task-sdks/dotnet/BoundedCoordinator) | โ |
-| Python | [Sample](../samples/durable-task-sdks/python/bounded-coordinator) | โ |
+| .NET | [Sample](../samples/durable-task-sdks/dotnet/BoundedCoordinator) | |
+| Python | [Sample](../samples/durable-task-sdks/python/bounded-coordinator) | |
๐ [Learn more on Microsoft Learn โ](https://learn.microsoft.com/azure/azure-functions/durable/durable-functions-eternal-orchestrations)
@@ -179,8 +185,9 @@ Entity: Counter
| Language | Durable Task SDK | Durable Functions |
|----------|-----------------|-------------------|
-| .NET | [Sample](../samples/durable-task-sdks/dotnet/EntitiesSample) | โ |
-| Python | [Sample](../samples/durable-task-sdks/python/entities) | โ |
+| .NET | [Sample](../samples/durable-task-sdks/dotnet/EntitiesSample) | |
+| Python | [Sample](../samples/durable-task-sdks/python/entities) | |
+| Java | [Sample](../samples/durable-task-sdks/java/entities) | [Entities](../samples/durable-functions/java/Entities) |
๐ [Learn more on Microsoft Learn โ](https://learn.microsoft.com/azure/azure-functions/durable/durable-functions-entities)
@@ -198,8 +205,8 @@ Step 1 โ Step 2 โ Step 3 (fails!)
| Language | Durable Task SDK | Durable Functions |
|----------|-----------------|-------------------|
-| .NET | โ | [Saga Sample](../samples/durable-functions/dotnet/Saga) |
-| Python | [Sample](../samples/durable-task-sdks/python/saga) | โ |
+| .NET | | [Saga Sample](../samples/durable-functions/dotnet/Saga) |
+| Python | [Sample](../samples/durable-task-sdks/python/saga) | |
๐ [Learn more on Microsoft Learn โ](https://learn.microsoft.com/azure/architecture/reference-architectures/saga/saga)
@@ -210,8 +217,8 @@ Safely evolve orchestration logic without breaking in-flight instances.
| Language | Durable Task SDK | Durable Functions |
|----------|-----------------|-------------------|
-| .NET | [Sample](../samples/durable-task-sdks/dotnet/OrchestrationVersioning) | โ |
-| Python | [Sample](../samples/durable-task-sdks/python/versioning) | โ |
+| .NET | [Sample](../samples/durable-task-sdks/dotnet/OrchestrationVersioning) | |
+| Python | [Sample](../samples/durable-task-sdks/python/versioning) | |
๐ [Learn more on Microsoft Learn โ](https://learn.microsoft.com/azure/azure-functions/durable/durable-functions-versioning)
@@ -228,8 +235,8 @@ Schedule (every 5s) โ Start orchestration โ ... โ Start orchestration
| Language | Durable Task SDK | Durable Functions |
|----------|-----------------|-------------------|
-| .NET | [Schedule Web App](../samples/durable-task-sdks/dotnet/ScheduleWebApp) | โ |
-| Python | [Sample](../samples/durable-task-sdks/python/scheduled-tasks) | โ |
+| .NET | [Schedule Web App](../samples/durable-task-sdks/dotnet/ScheduleWebApp) | |
+| Python | [Sample](../samples/durable-task-sdks/python/scheduled-tasks) | |
---
diff --git a/docs/quickstart.md b/docs/quickstart.md
index ca49ef79..638781f0 100644
--- a/docs/quickstart.md
+++ b/docs/quickstart.md
@@ -21,76 +21,101 @@ Verify it's running by opening the dashboard: [http://localhost:8082](http://loc
Choose your language and follow the instructions:
+Clone the repository, then open each terminal at the repository root:
+
+```bash
+git clone https://github.com/Azure-Samples/Durable-Task-Scheduler.git
+cd Durable-Task-Scheduler
+```
+
### .NET
-**Requires:** [.NET 8 SDK](https://dotnet.microsoft.com/download/dotnet/8.0)
+**Requires:** [.NET 10 SDK](https://dotnet.microsoft.com/download/dotnet/10.0)
+
+Start the worker in Terminal 1:
```bash
-# Clone the repo
-git clone https://github.com/Azure/Durable-Task-Scheduler.git
-cd Durable-Task-Scheduler
+dotnet run --project samples/durable-task-sdks/dotnet/FunctionChaining/Worker
+```
-# Start the worker (Terminal 1)
-cd samples/durable-task-sdks/dotnet/FunctionChaining/Worker
-dotnet run
+Run the client in Terminal 2:
-# Run the client (Terminal 2)
-cd samples/durable-task-sdks/dotnet/FunctionChaining/Client
-dotnet run
+```bash
+dotnet run --project samples/durable-task-sdks/dotnet/FunctionChaining/Client
```
### Python
**Requires:** [Python 3.9+](https://www.python.org/downloads/)
-```bash
-# Clone the repo
-git clone https://github.com/Azure/Durable-Task-Scheduler.git
-cd Durable-Task-Scheduler
+Set up a virtual environment and start the worker in Terminal 1:
-# Set up environment
+```bash
cd samples/durable-task-sdks/python/function-chaining
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install -r requirements.txt
-
-# Start the worker (Terminal 1)
python worker.py
+```
+
+Activate the same virtual environment and run the client in Terminal 2:
-# Run the client (Terminal 2)
+```bash
+cd samples/durable-task-sdks/python/function-chaining
+source venv/bin/activate # Windows: venv\Scripts\activate
python client.py
```
### Java
-**Requires:** [Java 8+](https://adoptium.net/)
+**Requires:** [Java 21](https://adoptium.net/)
-```bash
-# Clone the repo
-git clone https://github.com/Azure/Durable-Task-Scheduler.git
-cd Durable-Task-Scheduler
+This sample starts the worker and client in the same process:
-# Run the sample
+```bash
cd samples/durable-task-sdks/java/function-chaining
./gradlew runChainingPattern
```
+If the Gradle wrapper is not executable, run `chmod +x gradlew` first.
+
+### JavaScript / TypeScript SDK (preview)
+
+**Requires:** [Node.js 22+](https://nodejs.org/). The [SDK](https://github.com/microsoft/durabletask-js) supports JavaScript and TypeScript; this sample uses JavaScript.
+
+Install dependencies and start the worker in Terminal 1:
+
+```bash
+cd samples/durable-task-sdks/javascript/function-chaining
+npm install
+npm run worker
+```
+
+Run the client in Terminal 2:
+
+```bash
+cd samples/durable-task-sdks/javascript/function-chaining
+npm run client
+```
+
+Go samples in this repository are coming soon. See the [Go SDK repository](https://github.com/microsoft/durabletask-go) for the beta SDK and its own samples.
+
## Step 3: View in the Dashboard
1. Open [http://localhost:8082](http://localhost:8082) in your browser
2. Click on the **default** task hub
3. You'll see your orchestration instance(s) in the list
-4. Click on an instance to view execution details โ each activity, its input/output, and timing
+4. Click on an instance to view execution details: each activity, its input/output, and timing
## What Just Happened?
-You ran a **function chaining** orchestration โ a sequential workflow where:
+You ran a **function chaining** orchestration, a sequential workflow where:
1. Activity A processed some input and passed its output to...
2. Activity B, which transformed it and passed it to...
3. Activity C, which produced the final result
-The orchestration is **durable** โ if the process had crashed at any point, it would have automatically resumed from where it left off.
+The orchestration is **durable**: if the process had crashed at any point, it would have automatically resumed from where it left off.
## Next Steps
@@ -100,4 +125,4 @@ The orchestration is **durable** โ if the process had crashed at any point, it
| Browse all samples | [Sample Catalog](../samples/README.md) |
| Learn about the Durable Task Scheduler | [Official Documentation](https://aka.ms/dts-documentation) |
| Add OpenTelemetry tracing | [Observability Guide](./observability.md) |
-| Deploy to Azure | [Azure deployment guide](https://learn.microsoft.com/azure/azure-functions/durable/durable-task-scheduler/develop-with-durable-task-scheduler) |
+| Deploy to Azure | [Azure deployment guide](https://learn.microsoft.com/azure/durable-task/scheduler/develop-with-durable-task-scheduler) |
diff --git a/media/images/PdfSummarizer/architecture_v3.png b/media/images/PdfSummarizer/architecture_v3.png
deleted file mode 100644
index a7802421..00000000
Binary files a/media/images/PdfSummarizer/architecture_v3.png and /dev/null differ
diff --git a/media/images/PdfSummarizer/dotnet-code.png b/media/images/PdfSummarizer/dotnet-code.png
deleted file mode 100644
index 72544d47..00000000
Binary files a/media/images/PdfSummarizer/dotnet-code.png and /dev/null differ
diff --git a/media/images/architecture_v2.png b/media/images/architecture_v2.png
deleted file mode 100644
index 911dbda2..00000000
Binary files a/media/images/architecture_v2.png and /dev/null differ
diff --git a/media/images/architecture_v3.png b/media/images/architecture_v3.png
deleted file mode 100644
index 8a00573f..00000000
Binary files a/media/images/architecture_v3.png and /dev/null differ
diff --git a/media/images/dotnet-code.png b/media/images/dotnet-code.png
deleted file mode 100644
index bc7f3e4c..00000000
Binary files a/media/images/dotnet-code.png and /dev/null differ
diff --git a/preview-features/on-demand-sandboxes/docs/dotnet.md b/preview-features/on-demand-sandboxes/docs/dotnet.md
index 34db4596..b19a3464 100644
--- a/preview-features/on-demand-sandboxes/docs/dotnet.md
+++ b/preview-features/on-demand-sandboxes/docs/dotnet.md
@@ -1,9 +1,9 @@
# On-demand Sandboxes: .NET guide
-> **Status:** Private preview ยท [Back to overview](./README.md)
+> **Status:** Private preview ยท [Back to overview](../README.md)
This guide walks through using On-demand Sandboxes with the **.NET** Durable Task SDK.
-Make sure you've read the [overview](./README.md) first.
+Make sure you've read the [overview](../README.md) first.
On-demand Sandboxes use a two-part model: a **sandbox worker profile** in your
orchestrator app that tells DTS which activities to offload, and a **worker image** that
@@ -258,4 +258,4 @@ sinks or building your own observability pipeline.
- [Configure the scheduler identity for image pull](#configure-the-scheduler-identity-for-image-pull)
- [End-to-end .NET sample](../samples/dotnet)
- [Python guide](./python.md)
-- [Back to overview](./README.md)
+- [Back to overview](../README.md)
diff --git a/preview-features/on-demand-sandboxes/docs/python.md b/preview-features/on-demand-sandboxes/docs/python.md
index 07714d87..ddc665c8 100644
--- a/preview-features/on-demand-sandboxes/docs/python.md
+++ b/preview-features/on-demand-sandboxes/docs/python.md
@@ -1,9 +1,9 @@
# On-demand Sandboxes: Python guide
-> **Status:** Private preview ยท [Back to overview](./README.md)
+> **Status:** Private preview ยท [Back to overview](../README.md)
This guide walks through using On-demand Sandboxes with the **Python** Durable Task SDK.
-Make sure you've read the [overview](./README.md) first.
+Make sure you've read the [overview](../README.md) first.
On-demand Sandboxes use a two-part model: a **sandbox worker profile** (the *declarer
app*) that tells DTS which activities to offload, and a **worker image** that contains
@@ -296,4 +296,4 @@ sinks or building your own observability pipeline.
- [Configure the scheduler identity for image pull](#configure-the-scheduler-identity-for-image-pull)
- [End-to-end Python sample](../samples/python)
- [.NET guide](./dotnet.md)
-- [Back to overview](./README.md)
+- [Back to overview](../README.md)
diff --git a/samples/README.md b/samples/README.md
index 3cebf534..912d799f 100644
--- a/samples/README.md
+++ b/samples/README.md
@@ -35,31 +35,40 @@ A quick-reference matrix showing which patterns are available in each language a
| Sub-orchestrations | [โ
](./durable-task-sdks/dotnet/SubOrchestrations) | [โ
](./durable-task-sdks/python/sub-orchestrations) | [โ
](./durable-task-sdks/java/sub-orchestrations) | |
| Eternal Orchestrations | [โ
](./durable-task-sdks/dotnet/EternalOrchestrations) | [โ
](./durable-task-sdks/python/eternal-orchestrations) | [โ
](./durable-task-sdks/java/eternal-orchestrations) | |
| Saga Pattern | | [โ
](./durable-task-sdks/python/saga) | | |
-| Durable Entities | [โ
](./durable-task-sdks/dotnet/EntitiesSample) | [โ
](./durable-task-sdks/python/entities) | | |
+| Durable Entities | [โ
](./durable-task-sdks/dotnet/EntitiesSample) | [โ
](./durable-task-sdks/python/entities) | [โ
](./durable-task-sdks/java/entities) | |
| Orchestration Versioning | [โ
](./durable-task-sdks/dotnet/OrchestrationVersioning) | [โ
](./durable-task-sdks/python/versioning) | | |
| ASP.NET Web API | [โ
](./durable-task-sdks/dotnet/AspNetWebApp) | | | |
| Scheduled Tasks | [โ
](./durable-task-sdks/dotnet/ScheduleWebApp) | [โ
](./durable-task-sdks/python/scheduled-tasks) | | |
| .NET Aspire Integration | [โ
](./durable-task-sdks/dotnet/DtsWithAspire) | | | |
| AI Agent Chaining | [โ
](./durable-task-sdks/dotnet/Agents/PromptChaining) | | | |
| AI Research Agent | | [โ
](./durable-task-sdks/python/arXiv_research_agent) | | |
-| Large Payload | [โ
](./durable-task-sdks/dotnet/LargePayload) | | | |
+| Large Payload | [โ
](./durable-task-sdks/dotnet/LargePayload) | [โ
](./durable-task-sdks/python/large-payload) | | |
| Export History | [โ
](./durable-task-sdks/dotnet/ExportHistoryWebApp) | [โ
](./durable-task-sdks/python/history-export) | | |
| Bounded Coordinator | [โ
](./durable-task-sdks/dotnet/BoundedCoordinator) | [โ
](./durable-task-sdks/python/bounded-coordinator) | | |
+| OpenTelemetry Tracing | [โ
](./durable-task-sdks/dotnet/OpenTelemetryTracing) | [โ
](./durable-task-sdks/python/opentelemetry-tracing) | [โ
](./durable-task-sdks/java/opentelemetry-tracing) | |
+| Agent-Directed Workflows | [โ
](./durable-task-sdks/dotnet/Agents/AgentDirectedWorkflows) | [โ
](./durable-task-sdks/python/agent-directed-workflows) | | |
+| Orchestration Management | | [โ
](./durable-task-sdks/python/orchestration-management) | | |
+| Work Item Filtering | [โ
](./scenarios/WorkItemFilteringSplitActivities) | [โ
](./durable-task-sdks/python/work-item-filtering) | [โ
](./scenarios/WorkItemFilteringSplitActivitiesJava) | |
+| In-Memory Testing | | [โ
](./durable-task-sdks/python/testing) | | |
### Durable Functions
-| Pattern | .NET | Python | Java | JavaScript | PowerShell |
-|---------|------|--------|------|------------|------------|
-| Hello Cities (Quickstart) | [โ
](./durable-functions/dotnet/HelloCities) | | [โ
](./durable-functions/java/HelloCities) | [โ
](./durable-functions/javascript/HelloCities) | [โ
](./durable-functions/powershell/HelloCities) |
-| Fan-out/Fan-in | | [โ
](./durable-functions/python/fan-out-fan-in) | [โ
](./durable-functions/java/HelloCities) | [โ
](./durable-functions/javascript/HelloCities) | [โ
](./durable-functions/powershell/HelloCities) |
-| Order Processor | [โ
](./durable-functions/dotnet/OrderProcessor) | | | |
-| Saga Pattern | [โ
](./durable-functions/dotnet/Saga) | | | |
-| Distributed Tracing | [โ
](./durable-functions/dotnet/DistributedTracing) | | | |
-| Large Payload | [โ
](./durable-functions/dotnet/LargePayload) | | | |
-| Large Payload Fan-out/Fan-in | [โ
](./durable-functions/dotnet/LargePayloadFanOutFanIn) | | | |
-| PDF Summarizer | [โ
](./durable-functions/dotnet/PdfSummarizer) | [โ
](./durable-functions/python/pdf-summarizer) | | |
-| AI Travel Planner | [โ
](./durable-functions/dotnet/AiAgentTravelPlanOrchestrator) | | | |
-| Aspire Integration | [โ
](./durable-functions/dotnet/AzureFunctionsAndDtsWithAspire) | | | |
+| Pattern | .NET | Python | Java | JavaScript | TypeScript | PowerShell |
+|---------|------|--------|------|------------|------------|------------|
+| Hello Cities (Quickstart) | [โ
](./durable-functions/dotnet/HelloCities) | [โ
](./durable-functions/python/hello-cities) | [โ
](./durable-functions/java/HelloCities) | [โ
](./durable-functions/javascript/HelloCities) | [โ
](./durable-functions/typescript/HelloCities) | [โ
](./durable-functions/powershell/HelloCities) |
+| Fan-out/Fan-in | [โ
](./durable-functions/dotnet/LargePayloadFanOutFanIn) | [โ
](./durable-functions/python/fan-out-fan-in) | [โ
](./durable-functions/java/HelloCities) | [โ
](./durable-functions/javascript/HelloCities) | [โ
](./durable-functions/typescript/HelloCities) | [โ
](./durable-functions/powershell/HelloCities) |
+| Order Processor | [โ
](./durable-functions/dotnet/OrderProcessor) | | | | | |
+| Saga Pattern | [โ
](./durable-functions/dotnet/Saga) | | | | | |
+| Distributed Tracing | [โ
](./durable-functions/dotnet/DistributedTracing) | | | | | |
+| Large Payload | [โ
](./durable-functions/dotnet/LargePayload) | | | | | |
+| Large Payload Fan-out/Fan-in | [โ
](./durable-functions/dotnet/LargePayloadFanOutFanIn) | | | | | |
+| AI Travel Planner | [โ
](./durable-functions/dotnet/AiAgentTravelPlanOrchestrator) | | | | | |
+| Aspire Integration | [โ
](./durable-functions/dotnet/AzureFunctionsAndDtsWithAspire) | | | | | |
+| Agent-Directed Workflows | [โ
](./durable-functions/dotnet/AgentDirectedWorkflows) | [โ
](./durable-functions/python/agent-directed-workflows) | | | | |
+| Durable Entities | | | [โ
](./durable-functions/java/Entities) | | | |
+| Work Item Filtering | [โ
](./durable-functions/dotnet/WorkItemFiltering) | [โ
](./durable-functions/python/work-item-filtering) | | | | |
+| Custom Exception Properties | [โ
](./durable-functions/dotnet/CustomExceptionPropertyProvider) | | | [โ
](./durable-functions/javascript/CustomExceptionPropertyProvider) | | |
+| Critical Sections | | | | [โ
](./durable-functions/javascript/CriticalSections) | [โ
](./durable-functions/typescript/CriticalSections) | |
---
@@ -83,6 +92,9 @@ A quick-reference matrix showing which patterns are available in each language a
| [Eternal Orchestrations](./durable-task-sdks/dotnet/EternalOrchestrations) | Eternal Orchestrations | Indefinitely running orchestration with ContinueAsNew |
| [OpenTelemetry Tracing](./durable-task-sdks/dotnet/OpenTelemetryTracing) | Observability | Distributed tracing with OpenTelemetry and Jaeger |
| [Large Payload](./durable-task-sdks/dotnet/LargePayload) | Large Payload | Blob-backed payload externalization for orchestration inputs and outputs larger than 1 MB |
+| [Export History](./durable-task-sdks/dotnet/ExportHistoryWebApp) | Export History | REST API for batch and continuous orchestration history export to Azure Blob Storage |
+| [Bounded Coordinator](./durable-task-sdks/dotnet/BoundedCoordinator) | Bounded Coordinator | Process child work in bounded batches and reset history with ContinueAsNew |
+| [Agent-Directed Workflows](./durable-task-sdks/dotnet/Agents/AgentDirectedWorkflows) | AI Agents | Entity-based agent loop with tool calling and Redis-backed response streaming |
### Python
@@ -100,6 +112,14 @@ A quick-reference matrix showing which patterns are available in each language a
| [AI Research Agent](./durable-task-sdks/python/arXiv_research_agent) | AI Agents | Autonomous research agent with arXiv + LLM |
| [Saga Pattern](./durable-task-sdks/python/saga) | Saga | Travel booking with compensating transactions |
| [OpenTelemetry Tracing](./durable-task-sdks/python/opentelemetry-tracing) | Observability | Distributed tracing with OpenTelemetry and Jaeger |
+| [Scheduled Tasks](./durable-task-sdks/python/scheduled-tasks) | Scheduled Tasks | Recurring orchestrations with pause, resume, and schedule management |
+| [Export History](./durable-task-sdks/python/history-export) | Export History | Export orchestration history to Azure Blob Storage |
+| [Bounded Coordinator](./durable-task-sdks/python/bounded-coordinator) | Bounded Coordinator | Process child work in bounded batches and reset history with continue-as-new |
+| [Large Payload](./durable-task-sdks/python/large-payload) | Large Payload | Transparently externalize large payloads to Azure Blob Storage |
+| [Orchestration Management](./durable-task-sdks/python/orchestration-management) | Management | Query, suspend, resume, terminate, and purge orchestration instances |
+| [Work Item Filtering](./durable-task-sdks/python/work-item-filtering) | Work Item Filtering | Route orchestration and activity work to workers that register matching tasks |
+| [In-Memory Testing](./durable-task-sdks/python/testing) | Testing | Test orchestrations and activities without Docker, an emulator, or Azure resources |
+| [Agent-Directed Workflows](./durable-task-sdks/python/agent-directed-workflows) | AI Agents | Entity-based agent loop with tool calling and response streaming |
### Java
@@ -112,14 +132,22 @@ A quick-reference matrix showing which patterns are available in each language a
| [Monitoring](./durable-task-sdks/java/monitoring) | Monitoring | Periodic polling pattern |
| [Sub-orchestrations](./durable-task-sdks/java/sub-orchestrations) | Sub-orchestrations | Nested orchestration composition |
| [Eternal Orchestrations](./durable-task-sdks/java/eternal-orchestrations) | Eternal Orchestrations | Continue-as-new pattern |
+| [Durable Entities](./durable-task-sdks/java/entities) | Durable Entities | Counter entity with state persisted across operations |
+| [OpenTelemetry Tracing](./durable-task-sdks/java/opentelemetry-tracing) | Observability | Distributed tracing with OpenTelemetry and Jaeger |
-### JavaScript
+### JavaScript / TypeScript (preview)
+
+The [JavaScript/TypeScript SDK](https://github.com/microsoft/durabletask-js) is available in preview. The samples below use JavaScript; see the [JavaScript sample guide](./durable-task-sdks/javascript/) for prerequisites and setup.
| Sample | Pattern | Description |
|--------|---------|-------------|
| [Function Chaining](./durable-task-sdks/javascript/function-chaining) | Function Chaining | Sequential workflow basics with JavaScript SDK |
| [Fan-out/Fan-in](./durable-task-sdks/javascript/fan-out-fan-in) | Fan-out/Fan-in | Parallel execution and result aggregation with JavaScript SDK |
+### Go (samples coming soon)
+
+Go samples in this repository are coming soon. The [official Go SDK repository](https://github.com/microsoft/durabletask-go) provides the beta SDK and its own samples for Durable Task Scheduler and the local emulator.
+
---
## Durable Functions
@@ -134,28 +162,42 @@ A quick-reference matrix showing which patterns are available in each language a
| [Aspire Integration](./durable-functions/dotnet/AzureFunctionsAndDtsWithAspire) | Aspire | Azure Functions + DTS with Aspire |
| [Large Payload](./durable-functions/dotnet/LargePayload) | Large Payload | Single round-trip orchestration that externalizes payloads larger than 1 MB to blob storage |
| [Large Payload Fan-out/Fan-in](./durable-functions/dotnet/LargePayloadFanOutFanIn) | Large Payload | Parallel orchestration that externalizes payloads larger than 1 MB for each activity result |
-| [PDF Summarizer](./durable-functions/dotnet/PdfSummarizer) | AI Pipeline | AI-powered document processing pipeline |
| [AI Travel Planner](./durable-functions/dotnet/AiAgentTravelPlanOrchestrator) | AI Agents | Multi-agent travel planning orchestration |
| [Distributed Tracing](./durable-functions/dotnet/DistributedTracing) | Observability | Distributed tracing with Application Insights and Jaeger |
+| [Agent-Directed Workflows](./durable-functions/dotnet/AgentDirectedWorkflows) | AI Agents | Entity-based agent loop with tool calling and Redis-backed response streaming |
+| [Work Item Filtering](./durable-functions/dotnet/WorkItemFiltering) | Work Item Filtering | Route work between two Function apps sharing a task hub |
+| [Custom Exception Properties](./durable-functions/dotnet/CustomExceptionPropertyProvider) | Error Handling | Propagate structured exception properties to orchestration failure details |
### Python
| Sample | Pattern | Description |
|--------|---------|-------------|
-| [PDF Summarizer](./durable-functions/python/pdf-summarizer) | AI Pipeline | AI-powered PDF summarization |
+| [Hello Cities](./durable-functions/python/hello-cities) | Quickstart | Basic orchestration with greeting activities |
| [Fan-out/Fan-in](./durable-functions/python/fan-out-fan-in) | Fan-out/Fan-in | Parallel processing with result aggregation |
+| [Agent-Directed Workflows](./durable-functions/python/agent-directed-workflows) | AI Agents | Entity-based agent loop with tool calling and response streaming |
+| [Work Item Filtering](./durable-functions/python/work-item-filtering) | Work Item Filtering | Route work between two Function apps sharing a task hub |
### Java
| Sample | Pattern | Description |
|--------|---------|-------------|
| [Hello Cities](./durable-functions/java/HelloCities) | Function Chaining, Fan-out/Fan-in | Java quickstart with sequential and parallel orchestration patterns |
+| [Durable Entities](./durable-functions/java/Entities) | Durable Entities | Stateful counter entity |
### JavaScript
| Sample | Pattern | Description |
|--------|---------|-------------|
| [Hello Cities](./durable-functions/javascript/HelloCities) | Function Chaining, Fan-out/Fan-in | JavaScript quickstart with sequential and parallel orchestration patterns |
+| [Critical Sections](./durable-functions/javascript/CriticalSections) | Entity Coordination | Coordinate access to entities with durable locks |
+| [Custom Exception Properties](./durable-functions/javascript/CustomExceptionPropertyProvider) | Error Handling | Propagate structured exception properties to orchestration failure details |
+
+### TypeScript
+
+| Sample | Pattern | Description |
+|--------|---------|-------------|
+| [Hello Cities](./durable-functions/typescript/HelloCities) | Function Chaining, Fan-out/Fan-in | TypeScript quickstart with sequential and parallel orchestration patterns |
+| [Critical Sections](./durable-functions/typescript/CriticalSections) | Entity Coordination | Coordinate access to entities with durable locks |
### PowerShell
@@ -167,42 +209,45 @@ A quick-reference matrix showing which patterns are available in each language a
## Durable Extension for Microsoft Agent Framework
-The [Durable Task extension for Microsoft Agent Framework](https://learn.microsoft.com/azure/durable-task/sdks/durable-agents-microsoft-agent-framework) lets you make any [Microsoft Agent Framework](https://github.com/microsoft/agent-framework) agent durable with persistent sessions, built-in API endpoints, and distributed scaling โ without changes to your agent logic. It also supports graph-based workflows via `WorkflowBuilder`.
+The [Durable Task extension for Microsoft Agent Framework](https://learn.microsoft.com/azure/durable-task/sdks/durable-agents-microsoft-agent-framework) lets you make any [Microsoft Agent Framework](https://github.com/microsoft/agent-framework) agent durable with persistent sessions, built-in API endpoints, and distributed scaling, without changes to your agent logic. It also supports graph-based workflows via `WorkflowBuilder`.
> **Setup:** These samples live in the `microsoft/agent-framework` repo and are included here via a Git submodule. Run `git submodule update --init external/agent-framework` after cloning.
+The links below open the samples at the pinned submodule revision in the upstream repository. This keeps navigation consistent with the included code even when upstream reorganizes its samples. The local sample directories are symlinks into the submodule and cannot be browsed through GitHub as ordinary directories.
+
๐ **[Full details and sample index โ](./durable-extension-for-agent-framework/)**
### Durable Agents (.NET)
| Sample | Hosting | Description |
|--------|---------|-------------|
-| [Single Agent](./durable-extension-for-agent-framework/dotnet/hosting/azure-functions/01-SingleAgent) | Azure Functions | Basic durable agent with persistent sessions |
-| [Orchestration Chaining](./durable-extension-for-agent-framework/dotnet/hosting/azure-functions/02-OrchestrationChaining) | Azure Functions | Multi-agent sequential orchestration |
-| [Orchestration Concurrency](./durable-extension-for-agent-framework/dotnet/hosting/azure-functions/03-OrchestrationConcurrency) | Azure Functions | Parallel agent execution (fan-out/fan-in) |
-| [Orchestration Conditionals](./durable-extension-for-agent-framework/dotnet/hosting/azure-functions/04-OrchestrationConditionals) | Azure Functions | Conditional routing between agents |
-| [Human-in-the-Loop](./durable-extension-for-agent-framework/dotnet/hosting/azure-functions/05-HumanInTheLoop) | Azure Functions | Agent pauses for human approval |
-| [Reliable Streaming](./durable-extension-for-agent-framework/dotnet/hosting/azure-functions/06-ReliableStreaming) | Azure Functions | Real-time token streaming with durability |
-| [Single Agent](./durable-extension-for-agent-framework/dotnet/hosting/console-apps/01-SingleAgent) | Console App | Same pattern without Azure Functions |
+| [Single Agent](https://github.com/microsoft/agent-framework/tree/3e54a689fc96d681a072fe7e7cfc445909dac74b/dotnet/samples/04-hosting/DurableAgents/AzureFunctions/01_SingleAgent) | Azure Functions | Basic durable agent with persistent sessions |
+| [Orchestration Chaining](https://github.com/microsoft/agent-framework/tree/3e54a689fc96d681a072fe7e7cfc445909dac74b/dotnet/samples/04-hosting/DurableAgents/AzureFunctions/02_AgentOrchestration_Chaining) | Azure Functions | Multi-agent sequential orchestration |
+| [Orchestration Concurrency](https://github.com/microsoft/agent-framework/tree/3e54a689fc96d681a072fe7e7cfc445909dac74b/dotnet/samples/04-hosting/DurableAgents/AzureFunctions/03_AgentOrchestration_Concurrency) | Azure Functions | Parallel agent execution (fan-out/fan-in) |
+| [Orchestration Conditionals](https://github.com/microsoft/agent-framework/tree/3e54a689fc96d681a072fe7e7cfc445909dac74b/dotnet/samples/04-hosting/DurableAgents/AzureFunctions/04_AgentOrchestration_Conditionals) | Azure Functions | Conditional routing between agents |
+| [Human-in-the-Loop](https://github.com/microsoft/agent-framework/tree/3e54a689fc96d681a072fe7e7cfc445909dac74b/dotnet/samples/04-hosting/DurableAgents/AzureFunctions/05_AgentOrchestration_HITL) | Azure Functions | Agent pauses for human approval |
+| [Reliable Streaming](https://github.com/microsoft/agent-framework/tree/3e54a689fc96d681a072fe7e7cfc445909dac74b/dotnet/samples/04-hosting/DurableAgents/AzureFunctions/08_ReliableStreaming) | Azure Functions | Real-time token streaming with durability |
+| [Single Agent](https://github.com/microsoft/agent-framework/tree/3e54a689fc96d681a072fe7e7cfc445909dac74b/dotnet/samples/04-hosting/DurableAgents/ConsoleApps/01_SingleAgent) | Console App | Same pattern without Azure Functions |
### Durable MAF Workflows (.NET)
| Sample | Hosting | Description |
|--------|---------|-------------|
-| [Sequential](./durable-extension-for-agent-framework/dotnet/durable-maf-workflows/azure-functions/01-Sequential) | Azure Functions | Order cancellation pipeline: look up โ cancel โ notify |
-| [Concurrent](./durable-extension-for-agent-framework/dotnet/durable-maf-workflows/azure-functions/02-Concurrent) | Azure Functions | Fan-out to multiple expert agents, fan-in to aggregate |
-| [Human-in-the-Loop](./durable-extension-for-agent-framework/dotnet/durable-maf-workflows/azure-functions/03-HumanInTheLoop) | Azure Functions | Expense reimbursement with multi-stage approvals |
-| [Sequential](./durable-extension-for-agent-framework/dotnet/durable-maf-workflows/console-apps/01-Sequential) | Console App | Sequential executor pipeline |
-| [Conditional Edges](./durable-extension-for-agent-framework/dotnet/durable-maf-workflows/console-apps/03-ConditionalEdges) | Console App | Runtime routing based on conditions |
+| [Sequential](https://github.com/microsoft/agent-framework/tree/3e54a689fc96d681a072fe7e7cfc445909dac74b/dotnet/samples/04-hosting/DurableWorkflows/AzureFunctions/01_SequentialWorkflow) | Azure Functions | Order cancellation pipeline: look up โ cancel โ notify |
+| [Concurrent](https://github.com/microsoft/agent-framework/tree/3e54a689fc96d681a072fe7e7cfc445909dac74b/dotnet/samples/04-hosting/DurableWorkflows/AzureFunctions/02_ConcurrentWorkflow) | Azure Functions | Fan-out to multiple expert agents, fan-in to aggregate |
+| [Human-in-the-Loop](https://github.com/microsoft/agent-framework/tree/3e54a689fc96d681a072fe7e7cfc445909dac74b/dotnet/samples/04-hosting/DurableWorkflows/AzureFunctions/03_WorkflowHITL) | Azure Functions | Expense reimbursement with multi-stage approvals |
+| [Sequential](https://github.com/microsoft/agent-framework/tree/3e54a689fc96d681a072fe7e7cfc445909dac74b/dotnet/samples/04-hosting/DurableWorkflows/ConsoleApps/01_SequentialWorkflow) | Console App | Sequential executor pipeline |
+| [Conditional Edges](https://github.com/microsoft/agent-framework/tree/3e54a689fc96d681a072fe7e7cfc445909dac74b/dotnet/samples/04-hosting/DurableWorkflows/ConsoleApps/03_ConditionalEdges) | Console App | Runtime routing based on conditions |
### Durable Agents (Python)
| Sample | Hosting | Description |
|--------|---------|-------------|
-| [Single Agent](./durable-extension-for-agent-framework/python/hosting/azure-functions/01-single-agent) | Azure Functions | Basic durable agent with persistent sessions |
-| [Multi-Agent Orchestration](./durable-extension-for-agent-framework/python/hosting/azure-functions/02-multi-agent-orchestration) | Azure Functions | Multiple agents in a durable orchestration |
-| [Tool Calling](./durable-extension-for-agent-framework/python/hosting/azure-functions/03-tool-calling) | Azure Functions | Agent with function tools |
-| [Single Agent](./durable-extension-for-agent-framework/python/hosting/durable-task/01-single-agent) | Durable Task SDK | Agent hosted with DT SDK directly |
+| [Single Agent](https://github.com/microsoft/agent-framework/tree/3e54a689fc96d681a072fe7e7cfc445909dac74b/python/samples/04-hosting/azure_functions/01_single_agent) | Azure Functions | Basic durable agent with persistent sessions |
+| [Multi-Agent Orchestration](https://github.com/microsoft/agent-framework/tree/3e54a689fc96d681a072fe7e7cfc445909dac74b/python/samples/04-hosting/azure_functions/02_multi_agent) | Azure Functions | Multiple agents in a durable orchestration |
+| [Human-in-the-Loop](https://github.com/microsoft/agent-framework/tree/3e54a689fc96d681a072fe7e7cfc445909dac74b/python/samples/04-hosting/azure_functions/07_single_agent_orchestration_hitl) | Azure Functions | Agent pauses for human approval |
+| [Reliable Streaming](https://github.com/microsoft/agent-framework/tree/3e54a689fc96d681a072fe7e7cfc445909dac74b/python/samples/04-hosting/azure_functions/03_reliable_streaming) | Azure Functions | Real-time token streaming with durability |
+| [Single Agent](https://github.com/microsoft/agent-framework/tree/3e54a689fc96d681a072fe7e7cfc445909dac74b/python/samples/04-hosting/durabletask/01_single_agent) | Durable Task SDK | Agent hosted with DT SDK directly |
---
@@ -211,6 +256,18 @@ The [Durable Task extension for Microsoft Agent Framework](https://learn.microso
| Sample | Description |
|--------|-------------|
| [Autoscaling in ACA](./scenarios/AutoscalingInACA) | KEDA-based dynamic worker scaling in Azure Container Apps |
+| [Document Processing on AKS](./scenarios/DocumentProcessingOnAKS) | .NET activity chaining and fan-out/fan-in on AKS with workload identity |
+| [Work Item Filtering: .NET](./scenarios/WorkItemFilteringSplitActivities) | Route orchestration, validation, and shipping work to separate .NET workers |
+| [Work Item Filtering: Java](./scenarios/WorkItemFilteringSplitActivitiesJava) | Route orchestration, validation, and shipping work to separate Java workers |
+| [Work Item Filtering: Python](./scenarios/WorkItemFilteringSplitActivitiesPython) | Route orchestration, validation, and shipping work to separate Python workers |
+
+---
+
+## Preview Features
+
+| Feature | Status | Samples |
+|---------|--------|---------|
+| [On-demand Sandboxes](../preview-features/on-demand-sandboxes/) | Private preview; access must be enabled on your scheduler | [.NET and Python samples](../preview-features/on-demand-sandboxes/samples/) |
---
diff --git a/samples/durable-extension-for-agent-framework/README.md b/samples/durable-extension-for-agent-framework/README.md
index cfe87f1d..5d41332d 100644
--- a/samples/durable-extension-for-agent-framework/README.md
+++ b/samples/durable-extension-for-agent-framework/README.md
@@ -1,6 +1,6 @@
-# Durable Extension for Microsoft Agent Framework โ Samples
+# Durable Extension for Microsoft Agent Framework - Samples
-The [Durable Task extension for Microsoft Agent Framework](https://learn.microsoft.com/azure/durable-task/sdks/durable-agents-microsoft-agent-framework) brings [durable execution](https://learn.microsoft.com/azure/durable-task/sdks/durable-task-for-ai-agents) directly into the [Microsoft Agent Framework](https://github.com/microsoft/agent-framework). You can register agents with the extension to make them automatically durable โ with persistent sessions, built-in API endpoints, and distributed scaling โ **without changes to your agent logic**.
+The [Durable Task extension for Microsoft Agent Framework](https://learn.microsoft.com/azure/durable-task/sdks/durable-agents-microsoft-agent-framework) brings [durable execution](https://learn.microsoft.com/azure/durable-task/sdks/durable-task-for-ai-agents) directly into the [Microsoft Agent Framework](https://github.com/microsoft/agent-framework). You can register agents with the extension to make them automatically durable, with persistent sessions, built-in API endpoints, and distributed scaling, **without changes to your agent logic**.
The extension internally implements [entity-based agent loops](https://learn.microsoft.com/azure/durable-task/sdks/durable-agents-patterns#entity-based-agent-loops), where each agent session is a durable entity that automatically manages conversation state and checkpointing.
@@ -8,7 +8,7 @@ The extension internally implements [entity-based agent loops](https://learn.mic
| Capability | Description |
|------------|-------------|
-| **Persistent sessions** | Conversation history survives restarts, crashes, and scaling events โ no external database needed |
+| **Persistent sessions** | Conversation history survives restarts, crashes, and scaling events, with no external database needed |
| **Automatic checkpointing** | Every agent interaction and tool call is checkpointed; completed work is never re-executed on recovery |
| **Built-in HTTP endpoints** | Send messages, check status, and manage sessions via auto-generated REST APIs |
| **Multi-agent orchestration** | Coordinate multiple specialized agents as steps in a durable orchestration with automatic recovery |
@@ -33,7 +33,7 @@ app.Run();
### Bring Your Own Compute (Console Apps, Containers, etc.)
-Host the agent with the Durable Task SDK directly โ no Azure Functions dependency:
+Host the agent with the Durable Task SDK directly, with no Azure Functions dependency:
```csharp
IHost host = Host.CreateDefaultBuilder(args)
@@ -58,7 +58,7 @@ These samples show how to host agents with the Durable Task extension. Each agen
|---------|-------------|
| **Single agent** | One LLM agent with persistent sessions and built-in HTTP endpoints |
| **Multi-agent orchestration** | Multiple specialized agents coordinated as checkpointed steps in a durable orchestration |
-| **Tool calling** | Agents with function tools โ tool calls are checkpointed and not re-executed on recovery |
+| **Tool calling** | Agents with function tools; tool calls are checkpointed and not re-executed on recovery |
| **MCP server** | Agent hosted as a [Model Context Protocol](https://modelcontextprotocol.io/) server |
| **Reliable streaming** | Real-time token streaming with durable delivery guarantees |
| **Human-in-the-loop** | Agents that pause for human approval before continuing |
@@ -93,15 +93,15 @@ dotnet/
console-apps/ โ Graph-based workflow samples (Console Apps)
```
-> **Note:** These directories are symlinks into the [`microsoft/agent-framework`](https://github.com/microsoft/agent-framework) repo, which is included as a Git submodule at `external/agent-framework`. This avoids duplicating samples across repos.
+> **Note:** These directories are symlinks into the [`microsoft/agent-framework`](https://github.com/microsoft/agent-framework) repo, which is included as a Git submodule at `external/agent-framework`. This avoids duplicating samples across repos. GitHub cannot browse through these symlinks as ordinary directories, so the sample index links directly to the pinned upstream revision. The links and local copies use the same revision, even if upstream reorganizes its samples.
## Getting Started
### Prerequisites
-1. [Docker](https://www.docker.com/products/docker-desktop/) โ for the Durable Task Scheduler emulator
+1. [Docker](https://www.docker.com/products/docker-desktop/) for the Durable Task Scheduler emulator
2. [.NET 10 SDK](https://dotnet.microsoft.com/download/dotnet/10.0) (for .NET samples) or [Python 3.10+](https://www.python.org/) (for Python samples)
-3. (Optional) [Azure OpenAI](https://learn.microsoft.com/azure/ai-services/openai/) endpoint for real LLM integration
+3. A model endpoint and credentials, such as [Azure OpenAI](https://learn.microsoft.com/azure/ai-services/openai/). Check each sample's README for its required model settings.
### First-time setup
@@ -129,6 +129,8 @@ The dashboard is available at [http://localhost:8082](http://localhost:8082).
To pull the latest samples from the agent-framework repo:
+Update the local symlink targets and the sample links in this README and [the sample catalog](../README.md) in the same change. The upstream directory layout has changed since the pinned revision, so pulling `main` alone can leave the local sample paths broken.
+
```bash
cd external/agent-framework
git pull origin main
@@ -141,61 +143,78 @@ A [GitHub Actions workflow](../../.github/workflows/update-agent-framework.yml)
## Sample Index
-### .NET โ Durable Agents (Hosting)
+### .NET - Durable Agents (Hosting)
| Sample | Hosting | Description |
|--------|---------|-------------|
-| [Single Agent](dotnet/hosting/azure-functions/01-SingleAgent) | Azure Functions | Basic durable agent with persistent sessions |
-| [Orchestration Chaining](dotnet/hosting/azure-functions/02-OrchestrationChaining) | Azure Functions | Multi-agent sequential orchestration |
-| [Orchestration Concurrency](dotnet/hosting/azure-functions/03-OrchestrationConcurrency) | Azure Functions | Parallel agent execution with fan-out/fan-in |
-| [Orchestration Conditionals](dotnet/hosting/azure-functions/04-OrchestrationConditionals) | Azure Functions | Conditional routing between agents |
-| [Human-in-the-Loop](dotnet/hosting/azure-functions/05-HumanInTheLoop) | Azure Functions | Agent pauses for human approval |
-| [ReliableStreaming](dotnet/hosting/azure-functions/06-ReliableStreaming) | Azure Functions | Real-time token streaming with durability |
-| [MCP Server](dotnet/hosting/azure-functions/07-McpServer) | Azure Functions | Agent as a Model Context Protocol server |
-| [Custom State](dotnet/hosting/azure-functions/08-CustomState) | Azure Functions | Agent with custom persistent state |
-| [Single Agent](dotnet/hosting/console-apps/01-SingleAgent) | Console App | Basic durable agent without Azure Functions |
-| [Orchestration Chaining](dotnet/hosting/console-apps/02-OrchestrationChaining) | Console App | Multi-agent orchestration in a console app |
-| [Orchestration Concurrency](dotnet/hosting/console-apps/03-OrchestrationConcurrency) | Console App | Parallel agents in a console app |
-| [Orchestration Conditionals](dotnet/hosting/console-apps/04-OrchestrationConditionals) | Console App | Conditional agent routing in a console app |
-| [Human-in-the-Loop](dotnet/hosting/console-apps/05-HumanInTheLoop) | Console App | Human approval in a console app |
-| [Custom State](dotnet/hosting/console-apps/06-CustomState) | Console App | Custom agent state in a console app |
-| [Durable Agent Client](dotnet/hosting/console-apps/07-DurableAgentClient) | Console App | Client for interacting with durable agents |
-
-### .NET โ Durable MAF Workflows
+| [Single Agent](https://github.com/microsoft/agent-framework/tree/3e54a689fc96d681a072fe7e7cfc445909dac74b/dotnet/samples/04-hosting/DurableAgents/AzureFunctions/01_SingleAgent) | Azure Functions | Basic durable agent with persistent sessions |
+| [Orchestration Chaining](https://github.com/microsoft/agent-framework/tree/3e54a689fc96d681a072fe7e7cfc445909dac74b/dotnet/samples/04-hosting/DurableAgents/AzureFunctions/02_AgentOrchestration_Chaining) | Azure Functions | Multi-agent sequential orchestration |
+| [Orchestration Concurrency](https://github.com/microsoft/agent-framework/tree/3e54a689fc96d681a072fe7e7cfc445909dac74b/dotnet/samples/04-hosting/DurableAgents/AzureFunctions/03_AgentOrchestration_Concurrency) | Azure Functions | Parallel agent execution with fan-out/fan-in |
+| [Orchestration Conditionals](https://github.com/microsoft/agent-framework/tree/3e54a689fc96d681a072fe7e7cfc445909dac74b/dotnet/samples/04-hosting/DurableAgents/AzureFunctions/04_AgentOrchestration_Conditionals) | Azure Functions | Conditional routing between agents |
+| [Human-in-the-Loop](https://github.com/microsoft/agent-framework/tree/3e54a689fc96d681a072fe7e7cfc445909dac74b/dotnet/samples/04-hosting/DurableAgents/AzureFunctions/05_AgentOrchestration_HITL) | Azure Functions | Agent pauses for human approval |
+| [Long-Running Tools](https://github.com/microsoft/agent-framework/tree/3e54a689fc96d681a072fe7e7cfc445909dac74b/dotnet/samples/04-hosting/DurableAgents/AzureFunctions/06_LongRunningTools) | Azure Functions | Durable execution of long-running agent tools |
+| [MCP Server](https://github.com/microsoft/agent-framework/tree/3e54a689fc96d681a072fe7e7cfc445909dac74b/dotnet/samples/04-hosting/DurableAgents/AzureFunctions/07_AgentAsMcpTool) | Azure Functions | Agent as a Model Context Protocol server |
+| [Reliable Streaming](https://github.com/microsoft/agent-framework/tree/3e54a689fc96d681a072fe7e7cfc445909dac74b/dotnet/samples/04-hosting/DurableAgents/AzureFunctions/08_ReliableStreaming) | Azure Functions | Real-time token streaming with durability |
+| [Single Agent](https://github.com/microsoft/agent-framework/tree/3e54a689fc96d681a072fe7e7cfc445909dac74b/dotnet/samples/04-hosting/DurableAgents/ConsoleApps/01_SingleAgent) | Console App | Basic durable agent without Azure Functions |
+| [Orchestration Chaining](https://github.com/microsoft/agent-framework/tree/3e54a689fc96d681a072fe7e7cfc445909dac74b/dotnet/samples/04-hosting/DurableAgents/ConsoleApps/02_AgentOrchestration_Chaining) | Console App | Multi-agent orchestration in a console app |
+| [Orchestration Concurrency](https://github.com/microsoft/agent-framework/tree/3e54a689fc96d681a072fe7e7cfc445909dac74b/dotnet/samples/04-hosting/DurableAgents/ConsoleApps/03_AgentOrchestration_Concurrency) | Console App | Parallel agents in a console app |
+| [Orchestration Conditionals](https://github.com/microsoft/agent-framework/tree/3e54a689fc96d681a072fe7e7cfc445909dac74b/dotnet/samples/04-hosting/DurableAgents/ConsoleApps/04_AgentOrchestration_Conditionals) | Console App | Conditional agent routing in a console app |
+| [Human-in-the-Loop](https://github.com/microsoft/agent-framework/tree/3e54a689fc96d681a072fe7e7cfc445909dac74b/dotnet/samples/04-hosting/DurableAgents/ConsoleApps/05_AgentOrchestration_HITL) | Console App | Human approval in a console app |
+| [Long-Running Tools](https://github.com/microsoft/agent-framework/tree/3e54a689fc96d681a072fe7e7cfc445909dac74b/dotnet/samples/04-hosting/DurableAgents/ConsoleApps/06_LongRunningTools) | Console App | Durable execution of long-running agent tools |
+| [Reliable Streaming](https://github.com/microsoft/agent-framework/tree/3e54a689fc96d681a072fe7e7cfc445909dac74b/dotnet/samples/04-hosting/DurableAgents/ConsoleApps/07_ReliableStreaming) | Console App | Real-time token streaming with durability |
+
+Standalone **Custom State** (custom persistent agent state) and **Durable Agent Client** (client access to durable agents) samples are not included in the pinned submodule revision.
+
+### .NET - Durable MAF Workflows
| Sample | Hosting | Description |
|--------|---------|-------------|
-| [Sequential](dotnet/durable-maf-workflows/azure-functions/01-Sequential) | Azure Functions | Order cancellation pipeline: look up โ cancel โ notify |
-| [Concurrent](dotnet/durable-maf-workflows/azure-functions/02-Concurrent) | Azure Functions | Fan-out to physicist & chemist agents, fan-in to aggregate |
-| [Human-in-the-Loop](dotnet/durable-maf-workflows/azure-functions/03-HumanInTheLoop) | Azure Functions | Expense reimbursement with manager + parallel finance approvals |
-| [MCP Tool](dotnet/durable-maf-workflows/azure-functions/04-McpTool) | Azure Functions | Workflow exposed as an MCP tool |
-| [Combined](dotnet/durable-maf-workflows/azure-functions/05-Combined) | Azure Functions | Workflows + agents in the same app |
-| [Sequential](dotnet/durable-maf-workflows/console-apps/01-Sequential) | Console App | Sequential executor pipeline |
-| [Concurrent](dotnet/durable-maf-workflows/console-apps/02-Concurrent) | Console App | Fan-out/fan-in with parallel execution |
-| [Conditional Edges](dotnet/durable-maf-workflows/console-apps/03-ConditionalEdges) | Console App | Runtime routing based on conditions |
-| [Events](dotnet/durable-maf-workflows/console-apps/04-Events) | Console App | Reacting to external events in workflows |
-| [Shared State](dotnet/durable-maf-workflows/console-apps/05-SharedState) | Console App | Passing state between workflow steps |
-| [Sub-Workflows](dotnet/durable-maf-workflows/console-apps/06-SubWorkflows) | Console App | Composing reusable sub-workflows |
-| [Human-in-the-Loop](dotnet/durable-maf-workflows/console-apps/07-HumanInTheLoop) | Console App | Workflow pauses for external approval |
-| [Streaming](dotnet/durable-maf-workflows/console-apps/08-Streaming) | Console App | Streaming workflow events |
-
-### Python โ Durable Agents (Hosting)
+| [Sequential](https://github.com/microsoft/agent-framework/tree/3e54a689fc96d681a072fe7e7cfc445909dac74b/dotnet/samples/04-hosting/DurableWorkflows/AzureFunctions/01_SequentialWorkflow) | Azure Functions | Order cancellation pipeline: look up โ cancel โ notify |
+| [Concurrent](https://github.com/microsoft/agent-framework/tree/3e54a689fc96d681a072fe7e7cfc445909dac74b/dotnet/samples/04-hosting/DurableWorkflows/AzureFunctions/02_ConcurrentWorkflow) | Azure Functions | Fan-out to physicist & chemist agents, fan-in to aggregate |
+| [Human-in-the-Loop](https://github.com/microsoft/agent-framework/tree/3e54a689fc96d681a072fe7e7cfc445909dac74b/dotnet/samples/04-hosting/DurableWorkflows/AzureFunctions/03_WorkflowHITL) | Azure Functions | Expense reimbursement with manager + parallel finance approvals |
+| [MCP Tool](https://github.com/microsoft/agent-framework/tree/3e54a689fc96d681a072fe7e7cfc445909dac74b/dotnet/samples/04-hosting/DurableWorkflows/AzureFunctions/04_WorkflowMcpTool) | Azure Functions | Workflow exposed as an MCP tool |
+| [Combined](https://github.com/microsoft/agent-framework/tree/3e54a689fc96d681a072fe7e7cfc445909dac74b/dotnet/samples/04-hosting/DurableWorkflows/AzureFunctions/05_WorkflowAndAgents) | Azure Functions | Workflows + agents in the same app |
+| [Sequential](https://github.com/microsoft/agent-framework/tree/3e54a689fc96d681a072fe7e7cfc445909dac74b/dotnet/samples/04-hosting/DurableWorkflows/ConsoleApps/01_SequentialWorkflow) | Console App | Sequential executor pipeline |
+| [Concurrent](https://github.com/microsoft/agent-framework/tree/3e54a689fc96d681a072fe7e7cfc445909dac74b/dotnet/samples/04-hosting/DurableWorkflows/ConsoleApps/02_ConcurrentWorkflow) | Console App | Fan-out/fan-in with parallel execution |
+| [Conditional Edges](https://github.com/microsoft/agent-framework/tree/3e54a689fc96d681a072fe7e7cfc445909dac74b/dotnet/samples/04-hosting/DurableWorkflows/ConsoleApps/03_ConditionalEdges) | Console App | Runtime routing based on conditions |
+| [Combined](https://github.com/microsoft/agent-framework/tree/3e54a689fc96d681a072fe7e7cfc445909dac74b/dotnet/samples/04-hosting/DurableWorkflows/ConsoleApps/04_WorkflowAndAgents) | Console App | Workflows + agents in the same app |
+| [Events](https://github.com/microsoft/agent-framework/tree/3e54a689fc96d681a072fe7e7cfc445909dac74b/dotnet/samples/04-hosting/DurableWorkflows/ConsoleApps/05_WorkflowEvents) | Console App | Reacting to external events in workflows |
+| [Shared State](https://github.com/microsoft/agent-framework/tree/3e54a689fc96d681a072fe7e7cfc445909dac74b/dotnet/samples/04-hosting/DurableWorkflows/ConsoleApps/06_WorkflowSharedState) | Console App | Passing state between workflow steps |
+| [Sub-Workflows](https://github.com/microsoft/agent-framework/tree/3e54a689fc96d681a072fe7e7cfc445909dac74b/dotnet/samples/04-hosting/DurableWorkflows/ConsoleApps/07_SubWorkflows) | Console App | Composing reusable sub-workflows |
+| [Human-in-the-Loop](https://github.com/microsoft/agent-framework/tree/3e54a689fc96d681a072fe7e7cfc445909dac74b/dotnet/samples/04-hosting/DurableWorkflows/ConsoleApps/08_WorkflowHITL) | Console App | Workflow pauses for external approval |
+
+A standalone **Streaming** workflow sample is not included in the pinned submodule revision. The reliable streaming agent samples above demonstrate durable token streaming.
+
+### Python - Durable Agents (Hosting)
| Sample | Hosting | Description |
|--------|---------|-------------|
-| [Single Agent](python/hosting/azure-functions/01-single-agent) | Azure Functions | Basic durable agent with persistent sessions |
-| [Multi-Agent Orchestration](python/hosting/azure-functions/02-multi-agent-orchestration) | Azure Functions | Multiple agents coordinated in an orchestration |
-| [Tool Calling](python/hosting/azure-functions/03-tool-calling) | Azure Functions | Agent with function tools |
-| [Human-in-the-Loop](python/hosting/azure-functions/04-human-in-the-loop) | Azure Functions | Agent pauses for human approval |
-| [Single Agent](python/hosting/durable-task/01-single-agent) | Durable Task SDK | Agent hosted with the DT SDK directly |
-| [Multi-Agent Orchestration](python/hosting/durable-task/02-multi-agent-orchestration) | Durable Task SDK | Multi-agent orchestration without Azure Functions |
-| [Tool Calling](python/hosting/durable-task/03-tool-calling) | Durable Task SDK | Tool-calling agent with the DT SDK |
-| [Human-in-the-Loop](python/hosting/durable-task/04-human-in-the-loop) | Durable Task SDK | Human approval with the DT SDK |
+| [Single Agent](https://github.com/microsoft/agent-framework/tree/3e54a689fc96d681a072fe7e7cfc445909dac74b/python/samples/04-hosting/azure_functions/01_single_agent) | Azure Functions | Basic durable agent with persistent sessions |
+| [Multi-Agent Orchestration](https://github.com/microsoft/agent-framework/tree/3e54a689fc96d681a072fe7e7cfc445909dac74b/python/samples/04-hosting/azure_functions/02_multi_agent) | Azure Functions | Multiple agents coordinated in an orchestration |
+| [Reliable Streaming](https://github.com/microsoft/agent-framework/tree/3e54a689fc96d681a072fe7e7cfc445909dac74b/python/samples/04-hosting/azure_functions/03_reliable_streaming) | Azure Functions | Real-time token streaming with durability |
+| [Orchestration Chaining](https://github.com/microsoft/agent-framework/tree/3e54a689fc96d681a072fe7e7cfc445909dac74b/python/samples/04-hosting/azure_functions/04_single_agent_orchestration_chaining) | Azure Functions | Sequential calls to a durable agent |
+| [Orchestration Concurrency](https://github.com/microsoft/agent-framework/tree/3e54a689fc96d681a072fe7e7cfc445909dac74b/python/samples/04-hosting/azure_functions/05_multi_agent_orchestration_concurrency) | Azure Functions | Parallel agent execution |
+| [Orchestration Conditionals](https://github.com/microsoft/agent-framework/tree/3e54a689fc96d681a072fe7e7cfc445909dac74b/python/samples/04-hosting/azure_functions/06_multi_agent_orchestration_conditionals) | Azure Functions | Conditional routing between agents |
+| [Human-in-the-Loop](https://github.com/microsoft/agent-framework/tree/3e54a689fc96d681a072fe7e7cfc445909dac74b/python/samples/04-hosting/azure_functions/07_single_agent_orchestration_hitl) | Azure Functions | Agent pauses for human approval |
+| [MCP Server](https://github.com/microsoft/agent-framework/tree/3e54a689fc96d681a072fe7e7cfc445909dac74b/python/samples/04-hosting/azure_functions/08_mcp_server) | Azure Functions | Agent exposed through Model Context Protocol |
+| [Workflow Shared State](https://github.com/microsoft/agent-framework/tree/3e54a689fc96d681a072fe7e7cfc445909dac74b/python/samples/04-hosting/azure_functions/09_workflow_shared_state) | Azure Functions | Shared state across workflow steps |
+| [Workflow Without Shared State](https://github.com/microsoft/agent-framework/tree/3e54a689fc96d681a072fe7e7cfc445909dac74b/python/samples/04-hosting/azure_functions/10_workflow_no_shared_state) | Azure Functions | Workflow steps without shared state |
+| [Parallel Workflow](https://github.com/microsoft/agent-framework/tree/3e54a689fc96d681a072fe7e7cfc445909dac74b/python/samples/04-hosting/azure_functions/11_workflow_parallel) | Azure Functions | Concurrent workflow steps |
+| [Workflow Human-in-the-Loop](https://github.com/microsoft/agent-framework/tree/3e54a689fc96d681a072fe7e7cfc445909dac74b/python/samples/04-hosting/azure_functions/12_workflow_hitl) | Azure Functions | Workflow pauses for external approval |
+| [Single Agent](https://github.com/microsoft/agent-framework/tree/3e54a689fc96d681a072fe7e7cfc445909dac74b/python/samples/04-hosting/durabletask/01_single_agent) | Durable Task SDK | Agent hosted with the DT SDK directly |
+| [Multi-Agent Orchestration](https://github.com/microsoft/agent-framework/tree/3e54a689fc96d681a072fe7e7cfc445909dac74b/python/samples/04-hosting/durabletask/02_multi_agent) | Durable Task SDK | Multi-agent orchestration without Azure Functions |
+| [Reliable Streaming](https://github.com/microsoft/agent-framework/tree/3e54a689fc96d681a072fe7e7cfc445909dac74b/python/samples/04-hosting/durabletask/03_single_agent_streaming) | Durable Task SDK | Durable token streaming without Azure Functions |
+| [Orchestration Chaining](https://github.com/microsoft/agent-framework/tree/3e54a689fc96d681a072fe7e7cfc445909dac74b/python/samples/04-hosting/durabletask/04_single_agent_orchestration_chaining) | Durable Task SDK | Sequential calls to a durable agent |
+| [Orchestration Concurrency](https://github.com/microsoft/agent-framework/tree/3e54a689fc96d681a072fe7e7cfc445909dac74b/python/samples/04-hosting/durabletask/05_multi_agent_orchestration_concurrency) | Durable Task SDK | Parallel agent execution |
+| [Orchestration Conditionals](https://github.com/microsoft/agent-framework/tree/3e54a689fc96d681a072fe7e7cfc445909dac74b/python/samples/04-hosting/durabletask/06_multi_agent_orchestration_conditionals) | Durable Task SDK | Conditional routing between agents |
+| [Human-in-the-Loop](https://github.com/microsoft/agent-framework/tree/3e54a689fc96d681a072fe7e7cfc445909dac74b/python/samples/04-hosting/durabletask/07_single_agent_orchestration_hitl) | Durable Task SDK | Human approval with the DT SDK |
+
+Agents can use function tools, but this revision does not include a standalone Python **Tool Calling** sample for either hosting option.
## Learn More
-- [Durable Task extension for Microsoft Agent Framework](https://learn.microsoft.com/azure/durable-task/sdks/durable-agents-microsoft-agent-framework) โ Full documentation
-- [Durable Task for AI Agents](https://learn.microsoft.com/azure/durable-task/sdks/durable-task-for-ai-agents) โ Why durable execution matters for AI agents
-- [Agentic Application Patterns](https://learn.microsoft.com/azure/durable-task/sdks/durable-agents-patterns) โ All supported patterns
-- [Microsoft Agent Framework](https://github.com/microsoft/agent-framework) โ The agent framework itself
-- [Durable Task Scheduler Dashboard](https://learn.microsoft.com/azure/durable-task/scheduler/durable-task-scheduler-dashboard) โ Monitor agents, orchestrations, and workflows
+- [Durable Task extension for Microsoft Agent Framework](https://learn.microsoft.com/azure/durable-task/sdks/durable-agents-microsoft-agent-framework) - Full documentation
+- [Durable Task for AI Agents](https://learn.microsoft.com/azure/durable-task/sdks/durable-task-for-ai-agents) - Why durable execution matters for AI agents
+- [Agentic Application Patterns](https://learn.microsoft.com/azure/durable-task/sdks/durable-agents-patterns) - All supported patterns
+- [Microsoft Agent Framework](https://github.com/microsoft/agent-framework) - The agent framework itself
+- [Durable Task Scheduler Dashboard](https://learn.microsoft.com/azure/durable-task/scheduler/durable-task-scheduler-dashboard) - Monitor agents, orchestrations, and workflows
diff --git a/samples/durable-functions/dotnet/AiAgentTravelPlanOrchestrator/README.md b/samples/durable-functions/dotnet/AiAgentTravelPlanOrchestrator/README.md
index 1c9d2020..052abfc3 100644
--- a/samples/durable-functions/dotnet/AiAgentTravelPlanOrchestrator/README.md
+++ b/samples/durable-functions/dotnet/AiAgentTravelPlanOrchestrator/README.md
@@ -79,7 +79,7 @@ Upon successful booking, the user receives a final confirmation with all travel
- Docker
- .NET 8 SDK
- Azure Functions Core Tools v4
-- Node.js 16+ and npm
+- Node.js 22.12+ and npm (required by the frontend's Azure Storage and Vite dependencies)
- Azure Developer CLI (azd)
- Azure Subscription with:
- Azure Functions resource
@@ -92,8 +92,8 @@ Upon successful booking, the user receives a final confirmation with all travel
### 1. Clone the Repository
```bash
-git clone https://github.com/yourusername/AiAgentOrchestrator.git
-cd AiAgentOrchestrator
+git clone https://github.com/Azure-Samples/Durable-Task-Scheduler.git
+cd Durable-Task-Scheduler/samples/durable-functions/dotnet/AiAgentTravelPlanOrchestrator
```
### 2. Configure Environment Variables
diff --git a/samples/durable-functions/dotnet/HelloCities/README.md b/samples/durable-functions/dotnet/HelloCities/README.md
index f15ffd83..4b9ee705 100644
--- a/samples/durable-functions/dotnet/HelloCities/README.md
+++ b/samples/durable-functions/dotnet/HelloCities/README.md
@@ -21,9 +21,9 @@ Click the image below to watch the video on YouTube.
-Let's begin working with Durable Functions using the new Durable Task Scheduler (private preview) backend provider.
+This quickstart uses Durable Functions with the Durable Task Scheduler backend provider.
-In this quickstart, the [provided sample](https://github.com/Azure/Azure-Functions-Durable-Task-Scheduler-Private-Preview/tree/main/quickstarts/HelloCities) uses the [official Durable Functions "hello cities" quickstart](https://learn.microsoft.com/azure/azure-functions/durable/durable-functions-isolated-create-first-csharp?pivots=code-editor-vscode). The sample schedules orchestrations that include 3 activities via an HTTP trigger.
+In this quickstart, the [provided sample](./http/) uses the [official Durable Functions "hello cities" quickstart](https://learn.microsoft.com/azure/azure-functions/durable/durable-functions-isolated-create-first-csharp?pivots=code-editor-vscode). The sample schedules orchestrations that include 3 activities via an HTTP trigger.
This quickstart showcases the necessary configuration for using Durable Task Scheduler as the backend provider for your Durable Function app. The template defaults to **Elastic Premium EP1 sku plan on Linux**.
@@ -32,6 +32,8 @@ This quickstart showcases the necessary configuration for using Durable Task Sch
- [Create an active Azure subscription](https://learn.microsoft.com/azure/guides/developer/azure-developer-guide#understanding-accounts-subscriptions-and-billing).
- [Azure Developer CLI (`azd`)](https://aka.ms/azd) installed
+- [.NET 8 SDK](https://dotnet.microsoft.com/download/dotnet/8.0)
+- [Azure Functions Core Tools v4](https://learn.microsoft.com/azure/azure-functions/functions-run-local) for the `func` commands below
## Log into the Azure CLI
@@ -40,6 +42,7 @@ In a terminal window, run the following command to log into the Azure CLI.
```azurecli
az login
+azd auth login
```
## Clone the project
@@ -47,13 +50,13 @@ az login
1. Clone this repo to your developer machine:
```shell
- git clone https://github.com/Azure/Durable-Task-Scheduler.git
+ git clone https://github.com/Azure-Samples/Durable-Task-Scheduler.git
```
-1. Navigate to the `hello cities` source code directory:
+1. Navigate to the `hello cities` sample directory. The function source code is in its `http/` subdirectory:
```shell
- cd Durable-Task-Scheduler/samples/durable-functions/dotnet/HelloCities/http/
+ cd Durable-Task-Scheduler/samples/durable-functions/dotnet/HelloCities
```
1. Open the Application in VS Code:
@@ -73,7 +76,7 @@ Use the [Azure Developer CLI (`azd`)](https://aka.ms/azd) to easily deploy the a
az provider show --namespace Microsoft.DurableTask --query "resourceTypes[?resourceType=='schedulers'].locations | [0]" --out table
```
-1. Navigate to `quickstarts/hello_cities` and run the following command to provision:
+1. From the `samples/durable-functions/dotnet/HelloCities` directory containing `azure.yaml`, run the following command to provision:
```bash
azd up
@@ -109,7 +112,7 @@ Use the [Azure Developer CLI (`azd`)](https://aka.ms/azd) to easily deploy the a
Invoke url: https://my-func-app.azurewebsites.net/api/durablefunctionsorchestrationcsharp1_httpstart
```
-1. Navigate to the `DurableFunctionsOrchestrationsCSharp1_HttpStart` URL to start an order processing orchestration instance. Use the durable task scheduler dashboard to check orchestration details.
+1. Navigate to the `DurableFunctionsOrchestrationCSharp1_HttpStart` URL to start a Hello Cities orchestration instance. Use the Durable Task Scheduler dashboard to check the three greeting activities and their results.
## Access dashboard after deployment
@@ -133,7 +136,7 @@ You can access the dashboard by going to **https://dashboard.durabletask.io/** a
## Identity-based authentication
-The durable task scheduler supports identity-based authentication only. This sample sets up the authentication through specifications in bicep files. If you're configuring identity-based access yourself, refer to [documentation on Microsoft Learn](https://learn.microsoft.com/azure/azure-functions/durable/durable-task-scheduler/develop-with-durable-task-scheduler?tabs=function-app-integrated-creation&pivots=az-cli#configure-identity-based-authentication-for-app-to-access-durable-task-scheduler).
+The durable task scheduler supports identity-based authentication only. This sample sets up the authentication through specifications in bicep files. If you're configuring identity-based access yourself, refer to [documentation on Microsoft Learn](https://learn.microsoft.com/azure/durable-task/scheduler/durable-task-scheduler-identity).
## Clean up resources
@@ -235,4 +238,4 @@ az durabletask taskhub list -s "SCHEDULER-NAME" -g "RESOURCE-GROUP"
Learn more about:
- [Durable Functions](https://learn.microsoft.com/azure/azure-functions/durable/durable-functions-overview)
-- [Durable Task Scheduler](https://learn.microsoft.com/azure/azure-functions/durable/durable-task-scheduler/durable-task-scheduler)
\ No newline at end of file
+- [Durable Task Scheduler](https://learn.microsoft.com/azure/durable-task/scheduler/durable-task-scheduler)
\ No newline at end of file
diff --git a/samples/durable-functions/dotnet/PdfSummarizer/.gitignore b/samples/durable-functions/dotnet/PdfSummarizer/.gitignore
deleted file mode 100644
index 4b3d3190..00000000
--- a/samples/durable-functions/dotnet/PdfSummarizer/.gitignore
+++ /dev/null
@@ -1,266 +0,0 @@
-## Ignore Visual Studio temporary files, build results, and
-## files generated by popular Visual Studio add-ons.
-
-.DS_Store
-
-# Azure Functions localsettings file
-local.settings.json
-
-# User-specific files
-*.suo
-*.user
-*.userosscache
-*.sln.docstates
-
-# User-specific files (MonoDevelop/Xamarin Studio)
-*.userprefs
-
-# Build results
-[Dd]ebug/
-[Dd]ebugPublic/
-[Rr]elease/
-[Rr]eleases/
-x64/
-x86/
-bld/
-[Bb]in/
-[Oo]bj/
-[Ll]og/
-
-# Visual Studio 2015 cache/options directory
-.vs/
-# Uncomment if you have tasks that create the project's static files in wwwroot
-#wwwroot/
-
-# MSTest test Results
-[Tt]est[Rr]esult*/
-[Bb]uild[Ll]og.*
-
-# NUNIT
-*.VisualState.xml
-TestResult.xml
-
-# Build Results of an ATL Project
-[Dd]ebugPS/
-[Rr]eleasePS/
-dlldata.c
-
-# DNX
-project.lock.json
-project.fragment.lock.json
-artifacts/
-
-*_i.c
-*_p.c
-*_i.h
-*.ilk
-*.meta
-*.obj
-*.pch
-*.pdb
-*.pgc
-*.pgd
-*.rsp
-*.sbr
-*.tlb
-*.tli
-*.tlh
-*.tmp
-*.tmp_proj
-*.log
-*.vspscc
-*.vssscc
-.builds
-*.pidb
-*.svclog
-*.scc
-
-# Chutzpah Test files
-_Chutzpah*
-
-# Visual C++ cache files
-ipch/
-*.aps
-*.ncb
-*.opendb
-*.opensdf
-*.sdf
-*.cachefile
-*.VC.db
-*.VC.VC.opendb
-
-# Visual Studio profiler
-*.psess
-*.vsp
-*.vspx
-*.sap
-
-# TFS 2012 Local Workspace
-$tf/
-
-# Guidance Automation Toolkit
-*.gpState
-
-# ReSharper is a .NET coding add-in
-_ReSharper*/
-*.[Rr]e[Ss]harper
-*.DotSettings.user
-
-# JustCode is a .NET coding add-in
-.JustCode
-
-# TeamCity is a build add-in
-_TeamCity*
-
-# DotCover is a Code Coverage Tool
-*.dotCover
-
-# NCrunch
-_NCrunch_*
-.*crunch*.local.xml
-nCrunchTemp_*
-
-# MightyMoose
-*.mm.*
-AutoTest.Net/
-
-# Web workbench (sass)
-.sass-cache/
-
-# Installshield output folder
-[Ee]xpress/
-
-# DocProject is a documentation generator add-in
-DocProject/buildhelp/
-DocProject/Help/*.HxT
-DocProject/Help/*.HxC
-DocProject/Help/*.hhc
-DocProject/Help/*.hhk
-DocProject/Help/*.hhp
-DocProject/Help/Html2
-DocProject/Help/html
-
-# Click-Once directory
-publish/
-
-# Publish Web Output
-*.[Pp]ublish.xml
-*.azurePubxml
-# TODO: Comment the next line if you want to checkin your web deploy settings
-# but database connection strings (with potential passwords) will be unencrypted
-#*.pubxml
-*.publishproj
-
-# Microsoft Azure Web App publish settings. Comment the next line if you want to
-# checkin your Azure Web App publish settings, but sensitive information contained
-# in these scripts will be unencrypted
-PublishScripts/
-
-# NuGet Packages
-*.nupkg
-# The packages folder can be ignored because of Package Restore
-**/packages/*
-# except build/, which is used as an MSBuild target.
-!**/packages/build/
-# Uncomment if necessary however generally it will be regenerated when needed
-#!**/packages/repositories.config
-# NuGet v3's project.json files produces more ignoreable files
-*.nuget.props
-*.nuget.targets
-
-# Microsoft Azure Build Output
-csx/
-*.build.csdef
-
-# Microsoft Azure Emulator
-ecf/
-rcf/
-
-# Windows Store app package directories and files
-AppPackages/
-BundleArtifacts/
-Package.StoreAssociation.xml
-_pkginfo.txt
-
-# Visual Studio cache files
-# files ending in .cache can be ignored
-*.[Cc]ache
-# but keep track of directories ending in .cache
-!*.[Cc]ache/
-
-# Others
-ClientBin/
-~$*
-*~
-*.dbmdl
-*.dbproj.schemaview
-*.jfm
-*.pfx
-*.publishsettings
-node_modules/
-orleans.codegen.cs
-
-# Since there are multiple workflows, uncomment next line to ignore bower_components
-# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
-#bower_components/
-
-# RIA/Silverlight projects
-Generated_Code/
-
-# Backup & report files from converting an old project file
-# to a newer Visual Studio version. Backup files are not needed,
-# because we have git ;-)
-_UpgradeReport_Files/
-Backup*/
-UpgradeLog*.XML
-UpgradeLog*.htm
-
-# SQL Server files
-*.mdf
-*.ldf
-
-# Business Intelligence projects
-*.rdl.data
-*.bim.layout
-*.bim_*.settings
-
-# Microsoft Fakes
-FakesAssemblies/
-
-# GhostDoc plugin setting file
-*.GhostDoc.xml
-
-# Node.js Tools for Visual Studio
-.ntvs_analysis.dat
-
-# Visual Studio 6 build log
-*.plg
-
-# Visual Studio 6 workspace options file
-*.opt
-
-# Visual Studio LightSwitch build output
-**/*.HTMLClient/GeneratedArtifacts
-**/*.DesktopClient/GeneratedArtifacts
-**/*.DesktopClient/ModelManifest.xml
-**/*.Server/GeneratedArtifacts
-**/*.Server/ModelManifest.xml
-_Pvt_Extensions
-
-# Paket dependency manager
-.paket/paket.exe
-paket-files/
-
-# FAKE - F# Make
-.fake/
-
-# JetBrains Rider
-.idea/
-*.sln.iml
-
-# CodeRush
-.cr/
-
-# Python Tools for Visual Studio (PTVS)
-__pycache__/
-*.pyc
\ No newline at end of file
diff --git a/samples/durable-functions/dotnet/PdfSummarizer/.vscode/extensions.json b/samples/durable-functions/dotnet/PdfSummarizer/.vscode/extensions.json
deleted file mode 100644
index bb763007..00000000
--- a/samples/durable-functions/dotnet/PdfSummarizer/.vscode/extensions.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "recommendations": [
- "ms-azuretools.vscode-azurefunctions",
- "ms-dotnettools.csharp"
- ]
-}
\ No newline at end of file
diff --git a/samples/durable-functions/dotnet/PdfSummarizer/.vscode/launch.json b/samples/durable-functions/dotnet/PdfSummarizer/.vscode/launch.json
deleted file mode 100644
index d526e723..00000000
--- a/samples/durable-functions/dotnet/PdfSummarizer/.vscode/launch.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
- "version": "0.2.0",
- "configurations": [
- {
- "name": "Attach to .NET Functions",
- "type": "coreclr",
- "request": "attach",
- "processId": "${command:azureFunctions.pickProcess}"
- }
- ]
-}
\ No newline at end of file
diff --git a/samples/durable-functions/dotnet/PdfSummarizer/.vscode/settings.json b/samples/durable-functions/dotnet/PdfSummarizer/.vscode/settings.json
deleted file mode 100644
index 4627ced4..00000000
--- a/samples/durable-functions/dotnet/PdfSummarizer/.vscode/settings.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "azureFunctions.deploySubpath": "bin/Release/net8.0/publish",
- "azureFunctions.projectLanguage": "C#",
- "azureFunctions.projectRuntime": "~4",
- "debug.internalConsoleOptions": "neverOpen",
- "azureFunctions.preDeployTask": "publish (functions)"
-}
\ No newline at end of file
diff --git a/samples/durable-functions/dotnet/PdfSummarizer/.vscode/tasks.json b/samples/durable-functions/dotnet/PdfSummarizer/.vscode/tasks.json
deleted file mode 100644
index 9b0588e9..00000000
--- a/samples/durable-functions/dotnet/PdfSummarizer/.vscode/tasks.json
+++ /dev/null
@@ -1,69 +0,0 @@
-{
- "version": "2.0.0",
- "tasks": [
- {
- "label": "clean (functions)",
- "command": "dotnet",
- "args": [
- "clean",
- "/property:GenerateFullPaths=true",
- "/consoleloggerparameters:NoSummary"
- ],
- "type": "process",
- "problemMatcher": "$msCompile"
- },
- {
- "label": "build (functions)",
- "command": "dotnet",
- "args": [
- "build",
- "/property:GenerateFullPaths=true",
- "/consoleloggerparameters:NoSummary"
- ],
- "type": "process",
- "dependsOn": "clean (functions)",
- "group": {
- "kind": "build",
- "isDefault": true
- },
- "problemMatcher": "$msCompile"
- },
- {
- "label": "clean release (functions)",
- "command": "dotnet",
- "args": [
- "clean",
- "--configuration",
- "Release",
- "/property:GenerateFullPaths=true",
- "/consoleloggerparameters:NoSummary"
- ],
- "type": "process",
- "problemMatcher": "$msCompile"
- },
- {
- "label": "publish (functions)",
- "command": "dotnet",
- "args": [
- "publish",
- "--configuration",
- "Release",
- "/property:GenerateFullPaths=true",
- "/consoleloggerparameters:NoSummary"
- ],
- "type": "process",
- "dependsOn": "clean release (functions)",
- "problemMatcher": "$msCompile"
- },
- {
- "type": "func",
- "dependsOn": "build (functions)",
- "options": {
- "cwd": "${workspaceFolder}/bin/Debug/net8.0"
- },
- "command": "host start",
- "isBackground": true,
- "problemMatcher": "$func-dotnet-watch"
- }
- ]
-}
\ No newline at end of file
diff --git a/samples/durable-functions/dotnet/PdfSummarizer/PdfSummarizer.cs b/samples/durable-functions/dotnet/PdfSummarizer/PdfSummarizer.cs
deleted file mode 100644
index 76ed54e0..00000000
--- a/samples/durable-functions/dotnet/PdfSummarizer/PdfSummarizer.cs
+++ /dev/null
@@ -1,150 +0,0 @@
-using Microsoft.Azure.Functions.Worker;
-using Microsoft.DurableTask;
-using Microsoft.DurableTask.Client;
-using Microsoft.Extensions.Logging;
-using Azure.Storage.Blobs;
-using Azure.Identity;
-using Azure.AI.FormRecognizer.DocumentAnalysis;
-using Newtonsoft.Json;
-using System.Net.Http.Headers;
-using Microsoft.Azure.Functions.Worker.Extensions.OpenAI;
-using Microsoft.Azure.Functions.Worker.Extensions.OpenAI.TextCompletion;
-using Azure;
-
-public class DurableFunctionApp
-{
- private readonly BlobServiceClient _blobServiceClient;
-
- public DurableFunctionApp()
- {
- var credential = new DefaultAzureCredential();
- var endpoint = Environment.GetEnvironmentVariable("AzureWebJobsStorage__blobServiceUri");
- _blobServiceClient = new BlobServiceClient(new Uri(endpoint), credential);
- }
-
- [Function("BlobTrigger")]
- public async Task BlobTrigger(
- [BlobTrigger("input/{name}", Connection = "AzureWebJobsStorage")] ReadOnlyMemory myBlob,
- string name,
- [DurableClient] DurableTaskClient starter,
- FunctionContext context)
- {
- var logger = context.GetLogger("BlobTrigger");
- logger.LogInformation($"C# Blob trigger function Processed blob\n Name:{name} \n Size: {myBlob.Length} Bytes");
-
- await starter.ScheduleNewOrchestrationInstanceAsync("ProcessDocument", name);
- }
-
- [Function("ProcessDocument")]
- public async Task ProcessDocument(
- [OrchestrationTrigger] TaskOrchestrationContext context,
- FunctionContext functionContext)
- {
- var logger = functionContext.GetLogger("ProcessDocument");
- string blobName = context.GetInput();
-
- var options = TaskOptions.FromRetryPolicy(new RetryPolicy(
- maxNumberOfAttempts: 3,
- firstRetryInterval: TimeSpan.FromSeconds(5)));
-
- // Ensure the activity function returns a value
- var result = await context.CallActivityAsync("AnalyzePdf", blobName, options);
-
- // Fan out to summarize the content in different languages
- var languages = new[] { "Japanese", "Spanish", "French" };
- var tasks = new List>();
- foreach (var language in languages)
- {
- tasks.Add(context.CallActivityAsync("SummarizeText", new { Text = result, Language = language }, options));
- }
-
- // Fan back in
- var summaries = await Task.WhenAll(tasks);
-
- // Write each summary to a separate file and upload to blob
- for (int i = 0; i < summaries.Length; i++)
- {
- await context.CallActivityAsync("WriteDoc", new WriteDocInput { BlobName = blobName, Summary = summaries[i], Language = languages[i] }, options);
- }
-
- return;
- }
-
- [Function("AnalyzePdf")]
- public async Task AnalyzePdf([ActivityTrigger] string blobName, FunctionContext context)
- {
- var logger = context.GetLogger("AnalyzePdf");
- logger.LogInformation("In AnalyzePdf activity");
-
- var containerClient = _blobServiceClient.GetBlobContainerClient("input");
- var blobClient = containerClient.GetBlobClient(blobName);
- var blob = await blobClient.DownloadContentAsync();
-
- var endpoint = Environment.GetEnvironmentVariable("COGNITIVE_SERVICES_ENDPOINT");
- var credential = new DefaultAzureCredential();
- var documentAnalysisClient = new DocumentAnalysisClient(new Uri(endpoint), credential);
- var modelId = "prebuilt-layout";
-
- AnalyzeDocumentOperation operation = await documentAnalysisClient.AnalyzeDocumentAsync(WaitUntil.Completed, modelId, blob.Value.Content.ToStream());
- AnalyzeResult result = operation.Value;
-
- var doc = string.Empty;
- foreach (var page in result.Pages)
- {
- foreach (var line in page.Lines)
- {
- doc += line.Content;
- }
- }
-
- return doc;
- }
-
- [Function("SummarizeText")]
- public async Task SummarizeText(
- [ActivityTrigger] dynamic input,
- [TextCompletionInput("Can you explain what the following text is about in {Language}? {Text}", Model = "%CHAT_MODEL_DEPLOYMENT_NAME%")] TextCompletionResponse response,
- FunctionContext context)
- {
- var logger = context.GetLogger("SummarizeText");
- logger.LogInformation("In SummarizeText activity");
-
- logger.LogInformation(response.Content);
- return response.Content.ToString();
- }
-
- [Function("WriteDoc")]
- public async Task WriteDoc([ActivityTrigger] WriteDocInput results, FunctionContext context)
- {
- var logger = context.GetLogger("WriteDoc");
- logger.LogInformation("In WriteDoc activity");
-
- var containerClient = _blobServiceClient.GetBlobContainerClient("output");
-
- try
- {
- var name = results.BlobName.Replace(".pdf", string.Empty);
- var fileName = $"{name}-summary-{results.Language}.txt";
-
- logger.LogInformation($"Uploading to blob {results.Summary}");
-
- await containerClient.UploadBlobAsync(fileName, new BinaryData(results.Summary));
- return null;
- }
- catch (Exception ex)
- {
- logger.LogError($"Error uploading to blob: {ex.Message}");
- throw;
- }
- }
-}
-
-// Define the WriteDocInput class here
-public class WriteDocInput
-{
- public string BlobName { get; set; }
- public string Summary { get; set; }
-
- public string Language { get; set; }
-
-}
\ No newline at end of file
diff --git a/samples/durable-functions/dotnet/PdfSummarizer/Program.cs b/samples/durable-functions/dotnet/PdfSummarizer/Program.cs
deleted file mode 100644
index a0d6ea3d..00000000
--- a/samples/durable-functions/dotnet/PdfSummarizer/Program.cs
+++ /dev/null
@@ -1,13 +0,0 @@
-using Microsoft.Azure.Functions.Worker;
-using Microsoft.Extensions.Hosting;
-using Microsoft.Extensions.DependencyInjection;
-
-var host = new HostBuilder()
- .ConfigureFunctionsWebApplication()
- .ConfigureServices(services => {
- services.AddApplicationInsightsTelemetryWorkerService();
- services.ConfigureFunctionsApplicationInsights();
- })
- .Build();
-
-host.Run();
\ No newline at end of file
diff --git a/samples/durable-functions/dotnet/PdfSummarizer/Properties/launchSettings.json b/samples/durable-functions/dotnet/PdfSummarizer/Properties/launchSettings.json
deleted file mode 100644
index c9484b72..00000000
--- a/samples/durable-functions/dotnet/PdfSummarizer/Properties/launchSettings.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "profiles": {
- "pdf_summarizer_dotnet": {
- "commandName": "Project",
- "commandLineArgs": "--port 7040",
- "launchBrowser": false
- }
- }
-}
\ No newline at end of file
diff --git a/samples/durable-functions/dotnet/PdfSummarizer/README.md b/samples/durable-functions/dotnet/PdfSummarizer/README.md
deleted file mode 100644
index 021169b0..00000000
--- a/samples/durable-functions/dotnet/PdfSummarizer/README.md
+++ /dev/null
@@ -1,90 +0,0 @@
-# Intelligent PDF Summarizer - .NET
-The purpose of this sample application is to demonstrate how Durable Functions can be leveraged to create intelligent applications, particularly in a document processing scenario. Order and durability are key here because the results from one activity are passed to the next. Also, calls to services like Cognitive Service or LLMs are costly and should not be repeated in the event of failures.
-
-This sample integrates various Azure services, including the new Durable Task Scheduler for Azure Durable Functions, Azure Storage, Azure Cognitive Services, and Azure Open AI.
-
-The application showcases how PDFs can be ingested and intelligently scanned to determine their content.
-
-
-
-The application's workflow is as follows:
-1. PDFs are uploaded to a blob storage input container.
-2. A durable function is triggered upon blob upload.
-3. The Durable Task Scheduler for Azure Durable Functions schedules an orchestration that:
-- - Downloads the blob (PDF).
-- - Utilizes the Azure Cognitive Service Form Recognizer endpoint to extract the text from the PDF.
-- - Sends the extracted text to Azure Open AI to analyze and determine the content of the PDF.
-- - Save the summary results from Azure Open AI to a new file and upload it to the output blob container.
-
-Below, you will find the instructions to set up and run this app locally..
-
-## Prerequsites
-- [Create an active Azure subscription](https://learn.microsoft.com/en-us/azure/guides/developer/azure-developer-guide#understanding-accounts-subscriptions-and-billing).
-- [Install the latest Azure Functions Core Tools to use the CLI](https://learn.microsoft.com/en-us/azure/azure-functions/functions-run-local)
-- [Enroll in the Durable Task Scheduler Preview](https://github.com/Azure/Azure-Functions-Durable-Task-Scheduler-Private-Preview/tree/main) and create a scheduler / taskhub resource.
-- [Start and configure an Azurite storage emulator for local storage](https://learn.microsoft.com/azure/storage/common/storage-use-azurite).
-
-## local.settings.json
-You will need to configure a `local.settings.json` file at the root of the repo that looks similar to the below. Make sure to replace the placeholders with your specific values.
-
-```json
-{
- "Values": {
- "AzureWebJobsStorage": "UseDevelopmentStorage=true",
- "AzureWebJobsFeatureFlags": "EnableWorkerIndexing",
- "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated",
- "DURABLE_TASK_SERVICE_CONNECTION_STRING": "Endpoint=;Authentication=DefaultAzure",
- "TASKHUB_NAME": "",
- "COGNITIVE_SERVICES_ENDPOINT": "",
- "AZURE_OPENAI_ENDPOINT": "",
- "CHAT_MODEL_DEPLOYMENT_NAME": ""
- }
-}
-```
-
-## Running the app locally
-1. Start Azurite: Begin by starting Azurite, the local Azure Storage emulator.
-
-2. Start the Function App: Start the function app to run the application locally.
-
-```bash
-func start --verbose
-```
-
-## Inspect the code
-This app leverages Durable Functions to orchestrate the application workflow. By using Durable Functions, there's no need for additional infrastructure like queues and state stores to manage task coordination and durability, which significantly reduces the complexity for developers.
-
-Take a look at the code snippet below, the `ProcessDocument` defines the entire workflow, which consists of a series of steps (activities) that need to be scheduled in sequence. Coordination is key, as the output of one activity is passed as an input to the next. Additionally, Durable Functions handle durability and retries, which ensure that if a failure occurs, such as a transient error or an issue with a dependent service, the workflow can recover gracefully.
-
-
-
-## Deploy the app to Azure
-Use the [Azure Developer CLI (`azd`)](https://aka.ms/azd) to easily deploy the app.
-
-1. In the root of the project, run the following command to provision and deploy the app:
-
- ```bash
- azd up
- ```
-
-2. When prompted, provide:
- - A name for your [Azure Developer CLI environment](https://learn.microsoft.com/en-us/azure/developer/azure-developer-cli/faq#what-is-an-environment-name).
- - The Azure subscription you'd like to use.
- - The Azure location to use.
-
- > **Note:** At the moment, the Durable Task Scheduler can only be deployed to `West US2` and `NorthCentral US`. Unfortunately, the AZD CLI does not support `North Central US` and Azure Open AI does not support `West US2`. The best way to navigage discrepencies is to select `West US2` as your AZD location and hardcode the `openAi` module location to a region like `East US2`.
-
-Once the azd up command finishes, the app will have successfully provisioned and deployed.
-
-# Using the app
-To use the app, simply upload a PDF to the Blob Storage `input` container. Once the PDF is transferred, it will be processed using document intelligence and Azure OpenAI. The resulting summary will be saved to a new file and uploaded to the `output` container.
-
-### Review Execution History in the Durable Task Scheduler Dashboard
-Since the application leverages the Durable Task Scheduler backend storage provider for Durable Functions, all orchestration executions are persisted and can be viewed in the monitoring and management dashboard.
-
-
-
-This dashboard enables you to monitor the status of ongoing and failed orchestrations, and troubleshoot any issues causing orchestrations to fail or become "stuck." It also displays the outputs from each activity execution. Additionally, you can use the timeline and sequence diagrams to gain insights into the orchestration execution, including the duration of each activity.
-
-
-
diff --git a/samples/durable-functions/dotnet/PdfSummarizer/azure.yaml b/samples/durable-functions/dotnet/PdfSummarizer/azure.yaml
deleted file mode 100644
index 892b98e9..00000000
--- a/samples/durable-functions/dotnet/PdfSummarizer/azure.yaml
+++ /dev/null
@@ -1,22 +0,0 @@
-# yaml-language-server: $schema=https://raw.githubusercontent.com/Azure/azure-dev/main/schemas/v1.0/azure.yaml.json
-
-name: PDF-Summarizer-Dotnet
-metadata:
- template: azd-init@1.10.1
-services:
- pdf-summarizer-dotnet:
- project: ./
- language: dotnet
- host: function
-hooks:
- postprovision:
- windows:
- shell: pwsh
- run: scripts/deploy.ps1
- interactive: true
- continueOnError: false
- posix:
- shell: sh
- run: scripts/deploy.sh
- interactive: true
- continueOnError: false
\ No newline at end of file
diff --git a/samples/durable-functions/dotnet/PdfSummarizer/host.json b/samples/durable-functions/dotnet/PdfSummarizer/host.json
deleted file mode 100644
index d5d6ac1b..00000000
--- a/samples/durable-functions/dotnet/PdfSummarizer/host.json
+++ /dev/null
@@ -1,24 +0,0 @@
-{
- "version": "2.0",
- "logging": {
- "applicationInsights": {
- "samplingSettings": {
- "isEnabled": true,
- "excludedTypes": "Request"
- },
- "enableLiveMetricsFilters": true,
- "logLevel": {
- "Host.Triggers.DurableTask": "Information"
- }
- }
- },
- "extensions": {
- "durableTask": {
- "storageProvider": {
- "type": "azureManaged",
- "connectionStringName": "DTS_CONNECTION_STRING"
- },
- "hubName": "%TASKHUB_NAME%"
- }
- }
-}
\ No newline at end of file
diff --git a/samples/durable-functions/dotnet/PdfSummarizer/infra/abbreviations.json b/samples/durable-functions/dotnet/PdfSummarizer/infra/abbreviations.json
deleted file mode 100644
index 1330bd23..00000000
--- a/samples/durable-functions/dotnet/PdfSummarizer/infra/abbreviations.json
+++ /dev/null
@@ -1,139 +0,0 @@
-{
- "analysisServicesServers": "as",
- "apiManagementService": "apim-",
- "appConfigurationConfigurationStores": "appcs-",
- "appManagedEnvironments": "cae-",
- "appContainerApps": "ca-",
- "authorizationPolicyDefinitions": "policy-",
- "automationAutomationAccounts": "aa-",
- "blueprintBlueprints": "bp-",
- "blueprintBlueprintsArtifacts": "bpa-",
- "cacheRedis": "redis-",
- "cdnProfiles": "cdnp-",
- "cdnProfilesEndpoints": "cdne-",
- "cognitiveServicesAccounts": "cog-",
- "cognitiveServicesFormRecognizer": "cog-fr-",
- "cognitiveServicesTextAnalytics": "cog-ta-",
- "cognitiveServicesDocumentIntelligence": "cog-di-",
- "computeAvailabilitySets": "avail-",
- "computeCloudServices": "cld-",
- "computeDiskEncryptionSets": "des",
- "computeDisks": "disk",
- "computeDisksOs": "osdisk",
- "computeGalleries": "gal",
- "computeSnapshots": "snap-",
- "computeVirtualMachines": "vm",
- "computeVirtualMachineScaleSets": "vmss-",
- "containerInstanceContainerGroups": "ci",
- "containerRegistryRegistries": "cr",
- "containerServiceManagedClusters": "aks-",
- "databricksWorkspaces": "dbw-",
- "dataFactoryFactories": "adf-",
- "dataLakeAnalyticsAccounts": "dla",
- "dataLakeStoreAccounts": "dls",
- "dataMigrationServices": "dms-",
- "dBforMySQLServers": "mysql-",
- "dBforPostgreSQLServers": "psql-",
- "devicesIotHubs": "iot-",
- "devicesProvisioningServices": "provs-",
- "devicesProvisioningServicesCertificates": "pcert-",
- "documentDBDatabaseAccounts": "cosmos-",
- "eventGridDomains": "evgd-",
- "eventGridDomainsTopics": "evgt-",
- "eventGridEventSubscriptions": "evgs-",
- "eventHubNamespaces": "evhns-",
- "eventHubNamespacesEventHubs": "evh-",
- "hdInsightClustersHadoop": "hadoop-",
- "hdInsightClustersHbase": "hbase-",
- "hdInsightClustersKafka": "kafka-",
- "hdInsightClustersMl": "mls-",
- "hdInsightClustersSpark": "spark-",
- "hdInsightClustersStorm": "storm-",
- "hybridComputeMachines": "arcs-",
- "insightsActionGroups": "ag-",
- "insightsComponents": "appi-",
- "keyVaultVaults": "kv-",
- "kubernetesConnectedClusters": "arck",
- "kustoClusters": "dec",
- "kustoClustersDatabases": "dedb",
- "logicIntegrationAccounts": "ia-",
- "logicWorkflows": "logic-",
- "machineLearningServicesWorkspaces": "mlw-",
- "managedIdentityUserAssignedIdentities": "id-",
- "managementManagementGroups": "mg-",
- "migrateAssessmentProjects": "migr-",
- "networkApplicationGateways": "agw-",
- "networkApplicationSecurityGroups": "asg-",
- "networkAzureFirewalls": "afw-",
- "networkBastionHosts": "bas-",
- "networkConnections": "con-",
- "networkDnsZones": "dnsz-",
- "networkExpressRouteCircuits": "erc-",
- "networkFirewallPolicies": "afwp-",
- "networkFirewallPoliciesWebApplication": "waf",
- "networkFirewallPoliciesRuleGroups": "wafrg",
- "networkFrontDoors": "fd-",
- "networkFrontdoorWebApplicationFirewallPolicies": "fdfp-",
- "networkLoadBalancersExternal": "lbe-",
- "networkLoadBalancersInternal": "lbi-",
- "networkLoadBalancersInboundNatRules": "rule-",
- "networkLocalNetworkGateways": "lgw-",
- "networkNatGateways": "ng-",
- "networkNetworkInterfaces": "nic-",
- "networkNetworkSecurityGroups": "nsg-",
- "networkNetworkSecurityGroupsSecurityRules": "nsgsr-",
- "networkNetworkWatchers": "nw-",
- "networkPrivateDnsZones": "pdnsz-",
- "networkPrivateLinkServices": "pl-",
- "networkPublicIPAddresses": "pip-",
- "networkPublicIPPrefixes": "ippre-",
- "networkRouteFilters": "rf-",
- "networkRouteTables": "rt-",
- "networkRouteTablesRoutes": "udr-",
- "networkTrafficManagerProfiles": "traf-",
- "networkVirtualNetworkGateways": "vgw-",
- "networkVirtualNetworks": "vnet-",
- "networkVirtualNetworksSubnets": "snet-",
- "networkVirtualNetworksVirtualNetworkPeerings": "peer-",
- "networkVirtualWans": "vwan-",
- "networkVpnGateways": "vpng-",
- "networkVpnGatewaysVpnConnections": "vcn-",
- "networkVpnGatewaysVpnSites": "vst-",
- "notificationHubsNamespaces": "ntfns-",
- "notificationHubsNamespacesNotificationHubs": "ntf-",
- "operationalInsightsWorkspaces": "log-",
- "portalDashboards": "dash-",
- "powerBIDedicatedCapacities": "pbi-",
- "purviewAccounts": "pview-",
- "recoveryServicesVaults": "rsv-",
- "resourcesResourceGroups": "rg-",
- "searchSearchServices": "srch-",
- "serviceBusNamespaces": "sb-",
- "serviceBusNamespacesQueues": "sbq-",
- "serviceBusNamespacesTopics": "sbt-",
- "serviceEndPointPolicies": "se-",
- "serviceFabricClusters": "sf-",
- "signalRServiceSignalR": "sigr",
- "sqlManagedInstances": "sqlmi-",
- "sqlServers": "sql-",
- "sqlServersDataWarehouse": "sqldw-",
- "sqlServersDatabases": "sqldb-",
- "sqlServersDatabasesStretch": "sqlstrdb-",
- "storageStorageAccounts": "st",
- "storageStorageAccountsVm": "stvm",
- "storSimpleManagers": "ssimp",
- "streamAnalyticsCluster": "asa-",
- "synapseWorkspaces": "syn",
- "synapseWorkspacesAnalyticsWorkspaces": "synw",
- "synapseWorkspacesSqlPoolsDedicated": "syndp",
- "synapseWorkspacesSqlPoolsSpark": "synsp",
- "timeSeriesInsightsEnvironments": "tsi-",
- "webServerFarms": "plan-",
- "webSitesAppService": "app-",
- "webSitesAppServiceEnvironment": "ase-",
- "webSitesFunctions": "func-",
- "webStaticSites": "stapp-",
- "dts": "dts-",
- "taskhub": "taskhub-"
-
-}
\ No newline at end of file
diff --git a/samples/durable-functions/dotnet/PdfSummarizer/infra/app/documentintelligence-Access.bicep b/samples/durable-functions/dotnet/PdfSummarizer/infra/app/documentintelligence-Access.bicep
deleted file mode 100644
index 0b30cfd3..00000000
--- a/samples/durable-functions/dotnet/PdfSummarizer/infra/app/documentintelligence-Access.bicep
+++ /dev/null
@@ -1,21 +0,0 @@
-metadata description = 'Creates a role assignment for a service principal.'
-param principalId string
-
-@allowed([
- 'Device'
- 'ForeignGroup'
- 'Group'
- 'ServicePrincipal'
- 'User'
-])
-param principalType string = 'ServicePrincipal'
-param roleDefinitionId string
-
-resource role 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
- name: guid(subscription().id, resourceGroup().id, principalId, roleDefinitionId)
- properties: {
- principalId: principalId
- principalType: principalType
- roleDefinitionId: resourceId('Microsoft.Authorization/roleDefinitions', roleDefinitionId)
- }
-}
diff --git a/samples/durable-functions/dotnet/PdfSummarizer/infra/app/dts-Access.bicep b/samples/durable-functions/dotnet/PdfSummarizer/infra/app/dts-Access.bicep
deleted file mode 100644
index a0935bf1..00000000
--- a/samples/durable-functions/dotnet/PdfSummarizer/infra/app/dts-Access.bicep
+++ /dev/null
@@ -1,18 +0,0 @@
-param principalID string
-param roleDefinitionID string
-param dtsName string
-param principalType string
-
-resource dts 'Microsoft.DurableTask/schedulers@2025-11-01' existing = {
- name: dtsName
-}
-
-resource dtsRoleAssignment 'Microsoft.Authorization/roleAssignments@2020-04-01-preview' = {
- name: guid(dts.id, principalID, roleDefinitionID )
- scope: dts
- properties: {
- roleDefinitionId: resourceId('Microsoft.Authorization/roleDefinitions', roleDefinitionID )
- principalId: principalID
- principalType: principalType
- }
-}
diff --git a/samples/durable-functions/dotnet/PdfSummarizer/infra/app/dts.bicep b/samples/durable-functions/dotnet/PdfSummarizer/infra/app/dts.bicep
deleted file mode 100644
index 6280e5a4..00000000
--- a/samples/durable-functions/dotnet/PdfSummarizer/infra/app/dts.bicep
+++ /dev/null
@@ -1,31 +0,0 @@
-param ipAllowlist array
-param location string
-param tags object = {}
-param name string
-param taskhubname string
-param skuName string
-param skuCapacity int = 0
-
-resource dts 'Microsoft.DurableTask/schedulers@2025-11-01' = {
- location: location
- tags: tags
- name: name
- properties: {
- ipAllowlist: ipAllowlist
- sku: skuName == 'Dedicated' ? {
- name: skuName
- capacity: skuCapacity
- } : {
- name: skuName
- }
- }
-}
-
-resource taskhub 'Microsoft.DurableTask/schedulers/taskhubs@2025-11-01' = {
- parent: dts
- name: taskhubname
-}
-
-output dts_NAME string = dts.name
-output dts_URL string = dts.properties.endpoint
-output TASKHUB_NAME string = taskhub.name
diff --git a/samples/durable-functions/dotnet/PdfSummarizer/infra/app/durable-function.bicep b/samples/durable-functions/dotnet/PdfSummarizer/infra/app/durable-function.bicep
deleted file mode 100644
index c19ccd67..00000000
--- a/samples/durable-functions/dotnet/PdfSummarizer/infra/app/durable-function.bicep
+++ /dev/null
@@ -1,54 +0,0 @@
-param name string
-param location string = resourceGroup().location
-param tags object = {}
-param applicationInsightsName string = ''
-param appServicePlanId string
-param appSettings object = {}
-param runtimeName string
-param runtimeVersion string
-param serviceName string = 'pdf-summarizer-dotnet'
-param storageAccountName string
-param virtualNetworkSubnetId string = ''
-param identityId string = ''
-param identityClientId string = ''
-param dtsURL string = ''
-param taskHubName string = ''
-param azureOpenaiService string
-param deploymentStorageContainerName string
-param documentIntelligenceEndpoint string
-
-var applicationInsightsIdentity = 'ClientId=${identityClientId};Authorization=AAD'
-
-
-module durableFunction '../core/host/functions.bicep' = {
- name: '${serviceName}-functions-module'
- params: {
- name: name
- location: location
- tags: union(tags, { 'azd-service-name': serviceName })
- identityType: 'UserAssigned'
- identityId: identityId
- appSettings: union(appSettings,
- {
- AzureWebJobsStorage__clientId : identityClientId
- AzureWebJobsStorage__credential : 'managedidentity'
- APPLICATIONINSIGHTS_AUTHENTICATION_STRING: applicationInsightsIdentity
- DTS_CONNECTION_STRING: 'Endpoint=${dtsURL};Authentication=ManagedIdentity;ClientID=${identityClientId}'
- TASKHUB_NAME: taskHubName
- AZURE_CLIENT_ID: identityClientId
- })
- documentIntelligenceEndpoint: documentIntelligenceEndpoint
- azureOpenaiService: azureOpenaiService
- applicationInsightsName: applicationInsightsName
- appServicePlanId: appServicePlanId
- runtimeName: runtimeName
- runtimeVersion: runtimeVersion
- storageAccountName: storageAccountName
- storageManagedIdentity: true
- deploymentStorageContainerName: deploymentStorageContainerName
- virtualNetworkSubnetId: virtualNetworkSubnetId
- }
-}
-
-output SERVICE_DURABLE_FUNCTION_NAME string = durableFunction.outputs.name
-output SERVICE_API_IDENTITY_PRINCIPAL_ID string = durableFunction.outputs.identityPrincipalId
diff --git a/samples/durable-functions/dotnet/PdfSummarizer/infra/app/openai-Access.bicep b/samples/durable-functions/dotnet/PdfSummarizer/infra/app/openai-Access.bicep
deleted file mode 100644
index d3fb68f4..00000000
--- a/samples/durable-functions/dotnet/PdfSummarizer/infra/app/openai-Access.bicep
+++ /dev/null
@@ -1,17 +0,0 @@
-param principalId string
-param roleDefinitionIds array
-param openAiAccountResourceName string
-
-resource account 'Microsoft.CognitiveServices/accounts@2023-05-01' existing = {
- name: openAiAccountResourceName
-}
-
-resource role 'Microsoft.Authorization/roleAssignments@2022-04-01' = [for roleDefinitionId in roleDefinitionIds: {
- name: guid(subscription().id, resourceGroup().id, principalId, roleDefinitionId)
- scope: account
- properties: {
- principalId: principalId
- principalType: 'ServicePrincipal'
- roleDefinitionId: resourceId('Microsoft.Authorization/roleDefinitions', roleDefinitionId)
- }
-}]
diff --git a/samples/durable-functions/dotnet/PdfSummarizer/infra/app/storage-Access.bicep b/samples/durable-functions/dotnet/PdfSummarizer/infra/app/storage-Access.bicep
deleted file mode 100644
index 498b501d..00000000
--- a/samples/durable-functions/dotnet/PdfSummarizer/infra/app/storage-Access.bicep
+++ /dev/null
@@ -1,21 +0,0 @@
-param principalID string
-param roleDefinitionID string
-param storageAccountName string
-param principalType string = 'ServicePrincipal' // Workaround for https://learn.microsoft.com/en-us/azure/role-based-access-control/role-assignments-template#new-service-principal
-
-resource storageAccount 'Microsoft.Storage/storageAccounts@2021-09-01' existing = {
- name: storageAccountName
-}
-
-// Allow access from API to storage account using a managed identity and least priv Storage roles
-resource storageRoleAssignment 'Microsoft.Authorization/roleAssignments@2020-04-01-preview' = {
- name: guid(storageAccount.id, principalID, roleDefinitionID)
- scope: storageAccount
- properties: {
- roleDefinitionId: resourceId('Microsoft.Authorization/roleDefinitions', roleDefinitionID)
- principalId: principalID
- principalType: principalType
- }
-}
-
-output ROLE_ASSIGNMENT_NAME string = storageRoleAssignment.name
diff --git a/samples/durable-functions/dotnet/PdfSummarizer/infra/app/storage-PrivateEndpoint.bicep b/samples/durable-functions/dotnet/PdfSummarizer/infra/app/storage-PrivateEndpoint.bicep
deleted file mode 100644
index b2ae5e2e..00000000
--- a/samples/durable-functions/dotnet/PdfSummarizer/infra/app/storage-PrivateEndpoint.bicep
+++ /dev/null
@@ -1,89 +0,0 @@
-// Parameters
-@description('Specifies the name of the virtual network.')
-param virtualNetworkName string
-
-@description('Specifies the name of the subnet which contains the virtual machine.')
-param subnetName string
-
-@description('Specifies the resource name of the Storage resource with an endpoint.')
-param resourceName string
-
-@description('Specifies the location.')
-param location string = resourceGroup().location
-
-param tags object = {}
-
-// Virtual Network
-resource vnet 'Microsoft.Network/virtualNetworks@2021-08-01' existing = {
- name: virtualNetworkName
-}
-
-resource storageAccount 'Microsoft.Storage/storageAccounts@2021-09-01' existing = {
- name: resourceName
-}
-
-var blobPrivateDNSZoneName = format('privatelink.blob.{0}', environment().suffixes.storage)
-var blobPrivateDnsZoneVirtualNetworkLinkName = format('{0}-link-{1}', resourceName, take(toLower(uniqueString(resourceName, virtualNetworkName)), 4))
-
-// Private DNS Zones
-resource blobPrivateDnsZone 'Microsoft.Network/privateDnsZones@2020-06-01' = {
- name: blobPrivateDNSZoneName
- location: 'global'
- tags: tags
- properties: {}
- dependsOn: [
- vnet
- ]
-}
-
-// Virtual Network Links
-resource blobPrivateDnsZoneVirtualNetworkLink 'Microsoft.Network/privateDnsZones/virtualNetworkLinks@2020-06-01' = {
- parent: blobPrivateDnsZone
- name: blobPrivateDnsZoneVirtualNetworkLinkName
- location: 'global'
- tags: tags
- properties: {
- registrationEnabled: false
- virtualNetwork: {
- id: vnet.id
- }
- }
-}
-
-// Private Endpoints
-resource blobPrivateEndpoint 'Microsoft.Network/privateEndpoints@2021-08-01' = {
- name: 'blob-private-endpoint'
- location: location
- tags: tags
- properties: {
- privateLinkServiceConnections: [
- {
- name: 'blobPrivateLinkConnection'
- properties: {
- privateLinkServiceId: storageAccount.id
- groupIds: [
- 'blob'
- ]
- }
- }
- ]
- subnet: {
- id: '${vnet.id}/subnets/${subnetName}'
- }
- }
-}
-
-resource blobPrivateDnsZoneGroupName 'Microsoft.Network/privateEndpoints/privateDnsZoneGroups@2022-01-01' = {
- parent: blobPrivateEndpoint
- name: 'blobPrivateDnsZoneGroup'
- properties: {
- privateDnsZoneConfigs: [
- {
- name: 'storageBlobARecord'
- properties: {
- privateDnsZoneId: blobPrivateDnsZone.id
- }
- }
- ]
- }
-}
diff --git a/samples/durable-functions/dotnet/PdfSummarizer/infra/app/vnet.bicep b/samples/durable-functions/dotnet/PdfSummarizer/infra/app/vnet.bicep
deleted file mode 100644
index bfa21d60..00000000
--- a/samples/durable-functions/dotnet/PdfSummarizer/infra/app/vnet.bicep
+++ /dev/null
@@ -1,75 +0,0 @@
-@description('Specifies the name of the virtual network.')
-param vNetName string
-
-@description('Specifies the location.')
-param location string = resourceGroup().location
-
-@description('Specifies the name of the subnet for the Service Bus private endpoint.')
-param peSubnetName string = 'private-endpoints-subnet'
-
-@description('Specifies the name of the subnet for Function App virtual network integration.')
-param appSubnetName string = 'app'
-
-param tags object = {}
-
-resource virtualNetwork 'Microsoft.Network/virtualNetworks@2023-05-01' = {
- name: vNetName
- location: location
- tags: tags
- properties: {
- addressSpace: {
- addressPrefixes: [
- '10.0.0.0/16'
- ]
- }
- encryption: {
- enabled: false
- enforcement: 'AllowUnencrypted'
- }
- subnets: [
- {
- name: peSubnetName
- id: resourceId('Microsoft.Network/virtualNetworks/subnets', vNetName, 'private-endpoints-subnet')
- properties: {
- addressPrefixes: [
- '10.0.1.0/24'
- ]
- delegations: []
- privateEndpointNetworkPolicies: 'Disabled'
- privateLinkServiceNetworkPolicies: 'Enabled'
- }
- type: 'Microsoft.Network/virtualNetworks/subnets'
- }
- {
- name: appSubnetName
- id: resourceId('Microsoft.Network/virtualNetworks/subnets', vNetName, 'app')
- properties: {
- addressPrefixes: [
- '10.0.2.0/24'
- ]
- delegations: [
- {
- name: 'delegation'
- id: resourceId('Microsoft.Network/virtualNetworks/subnets/delegations', vNetName, 'app', 'delegation')
- properties: {
- //'Microsoft.Web/serverFarms' is the correct delegation for Premium Function and App Service VNet integration
- serviceName: 'Microsoft.Web/serverFarms'
- }
- type: 'Microsoft.Network/virtualNetworks/subnets/delegations'
- }
- ]
- privateEndpointNetworkPolicies: 'Disabled'
- privateLinkServiceNetworkPolicies: 'Enabled'
- }
- type: 'Microsoft.Network/virtualNetworks/subnets'
- }
- ]
- virtualNetworkPeerings: []
- enableDdosProtection: false
- }
-}
-
-output peSubnetName string = virtualNetwork.properties.subnets[0].name
-output peSubnetID string = virtualNetwork.properties.subnets[0].id
-output appSubnetName string = virtualNetwork.properties.subnets[1].name
-output appSubnetID string = virtualNetwork.properties.subnets[1].id
diff --git a/samples/durable-functions/dotnet/PdfSummarizer/infra/core/ai/openai.bicep b/samples/durable-functions/dotnet/PdfSummarizer/infra/core/ai/openai.bicep
deleted file mode 100644
index b3d12ee4..00000000
--- a/samples/durable-functions/dotnet/PdfSummarizer/infra/core/ai/openai.bicep
+++ /dev/null
@@ -1,48 +0,0 @@
-param name string
-param location string = resourceGroup().location
-param tags object = {}
-
-param customSubDomainName string = name
-param deployments array = []
-param kind string = 'OpenAI'
-param publicNetworkAccess string = 'Enabled'
-param sku object = {
- name: 'S0'
-}
-
-resource account 'Microsoft.CognitiveServices/accounts@2023-10-01-preview' = {
- name: name
- location: location
- tags: tags
- kind: kind
- properties: {
- customSubDomainName: name
- networkAcls : {
- defaultAction: publicNetworkAccess == 'Enabled' ? 'Allow' : 'Deny'
- virtualNetworkRules: []
- ipRules: []
- }
- publicNetworkAccess: publicNetworkAccess
- }
- sku: sku
-}
-
-@batchSize(1)
-resource deployment 'Microsoft.CognitiveServices/accounts/deployments@2023-05-01' = [for deployment in deployments: {
- parent: account
- name: deployment.name
- sku: {
- name: 'Standard'
- capacity: deployment.capacity
- }
- properties: {
- model: deployment.model
- raiPolicyName: contains(deployment, 'raiPolicyName') ? deployment.raiPolicyName : null
- }
-}]
-
-output endpoint string = account.properties.endpoint
-output id string = account.id
-output name string = account.name
-output location string = account.location
-
\ No newline at end of file
diff --git a/samples/durable-functions/dotnet/PdfSummarizer/infra/core/host/appservice-appsettings.bicep b/samples/durable-functions/dotnet/PdfSummarizer/infra/core/host/appservice-appsettings.bicep
deleted file mode 100644
index f4b22f81..00000000
--- a/samples/durable-functions/dotnet/PdfSummarizer/infra/core/host/appservice-appsettings.bicep
+++ /dev/null
@@ -1,17 +0,0 @@
-metadata description = 'Updates app settings for an Azure App Service.'
-@description('The name of the app service resource within the current resource group scope')
-param name string
-
-@description('The app settings to be applied to the app service')
-@secure()
-param appSettings object
-
-resource appService 'Microsoft.Web/sites@2022-03-01' existing = {
- name: name
-}
-
-resource settings 'Microsoft.Web/sites/config@2022-03-01' = {
- name: 'appsettings'
- parent: appService
- properties: appSettings
-}
diff --git a/samples/durable-functions/dotnet/PdfSummarizer/infra/core/host/appservice.bicep b/samples/durable-functions/dotnet/PdfSummarizer/infra/core/host/appservice.bicep
deleted file mode 100644
index 9eb55851..00000000
--- a/samples/durable-functions/dotnet/PdfSummarizer/infra/core/host/appservice.bicep
+++ /dev/null
@@ -1,136 +0,0 @@
-metadata description = 'Creates an Azure App Service in an existing Azure App Service plan.'
-param name string
-param location string = resourceGroup().location
-param tags object = {}
-
-// Reference Properties
-param applicationInsightsName string = ''
-param appServicePlanId string
-param keyVaultName string = ''
-param managedIdentity bool = !empty(keyVaultName)
-@allowed(['SystemAssigned', 'UserAssigned'])
-param identityType string
-@description('User assigned identity name')
-param identityId string
-
-// Runtime Properties
-@allowed([
- 'dotnet', 'dotnetcore', 'dotnet-isolated', 'node', 'python', 'java', 'powershell', 'custom'
-])
-param runtimeName string
-param runtimeNameAndVersion string = '${runtimeName}|${runtimeVersion}'
-param runtimeVersion string
-
-// Microsoft.Web/sites Properties
-param kind string = 'app,linux'
-
-// Microsoft.Web/sites/config
-param allowedOrigins array = []
-param alwaysOn bool = true
-param appCommandLine string = ''
-@secure()
-param appSettings object = {}
-param clientAffinityEnabled bool = false
-param enableOryxBuild bool = contains(kind, 'linux')
-param functionAppScaleLimit int = -1
-param linuxFxVersion string = runtimeNameAndVersion
-param minimumElasticInstanceCount int = -1
-param numberOfWorkers int = -1
-param scmDoBuildDuringDeployment bool = false
-param use32BitWorkerProcess bool = false
-param ftpsState string = 'FtpsOnly'
-param healthCheckPath string = ''
-param virtualNetworkSubnetId string = ''
-
-resource appService 'Microsoft.Web/sites@2022-03-01' = {
- name: name
- location: location
- tags: tags
- kind: kind
- properties: {
- serverFarmId: appServicePlanId
- siteConfig: {
- linuxFxVersion: linuxFxVersion
- alwaysOn: alwaysOn
- ftpsState: ftpsState
- minTlsVersion: '1.2'
- appCommandLine: appCommandLine
- numberOfWorkers: numberOfWorkers != -1 ? numberOfWorkers : null
- minimumElasticInstanceCount: minimumElasticInstanceCount != -1 ? minimumElasticInstanceCount : null
- use32BitWorkerProcess: use32BitWorkerProcess
- functionAppScaleLimit: functionAppScaleLimit != -1 ? functionAppScaleLimit : null
- healthCheckPath: healthCheckPath
- cors: {
- allowedOrigins: union([ 'https://portal.azure.com', 'https://ms.portal.azure.com' ], allowedOrigins)
- }
- }
- clientAffinityEnabled: clientAffinityEnabled
- httpsOnly: true
- virtualNetworkSubnetId: !empty(virtualNetworkSubnetId) ? virtualNetworkSubnetId : null
- }
-
- identity: managedIdentity ? (identityType == 'UserAssigned' ? {
- type: 'UserAssigned'
- userAssignedIdentities: {
- '${identityId}': {}
- }
- } : {
- type: 'SystemAssigned'
- }) : null
-
- resource basicPublishingCredentialsPoliciesFtp 'basicPublishingCredentialsPolicies' = {
- name: 'ftp'
- properties: {
- allow: false
- }
- }
-
- resource basicPublishingCredentialsPoliciesScm 'basicPublishingCredentialsPolicies' = {
- name: 'scm'
- properties: {
- allow: false
- }
- }
-}
-
-// Updates to the single Microsoft.sites/web/config resources that need to be performed sequentially
-// sites/web/config 'appsettings'
-module configAppSettings 'appservice-appsettings.bicep' = {
- name: '${name}-appSettings'
- params: {
- name: appService.name
- appSettings: union(appSettings,
- {
- SCM_DO_BUILD_DURING_DEPLOYMENT: string(scmDoBuildDuringDeployment)
- ENABLE_ORYX_BUILD: string(enableOryxBuild)
- },
- runtimeName == 'python' && appCommandLine == '' ? { PYTHON_ENABLE_GUNICORN_MULTIWORKERS: 'true'} : {},
- !empty(applicationInsightsName) ? { APPLICATIONINSIGHTS_CONNECTION_STRING: applicationInsights.properties.ConnectionString } : {},
- !empty(keyVaultName) ? { AZURE_KEY_VAULT_ENDPOINT: keyVault.properties.vaultUri } : {})
- }
-}
-
-// sites/web/config 'logs'
-resource configLogs 'Microsoft.Web/sites/config@2022-03-01' = {
- name: 'logs'
- parent: appService
- properties: {
- applicationLogs: { fileSystem: { level: 'Verbose' } }
- detailedErrorMessages: { enabled: true }
- failedRequestsTracing: { enabled: true }
- httpLogs: { fileSystem: { enabled: true, retentionInDays: 1, retentionInMb: 35 } }
- }
- dependsOn: [configAppSettings]
-}
-
-resource keyVault 'Microsoft.KeyVault/vaults@2022-07-01' existing = if (!(empty(keyVaultName))) {
- name: keyVaultName
-}
-
-resource applicationInsights 'Microsoft.Insights/components@2020-02-02' existing = if (!empty(applicationInsightsName)) {
- name: applicationInsightsName
-}
-
-output identityPrincipalId string = managedIdentity ? string(appService.identity.userAssignedIdentities[identityId].principalId) : ''
-output name string = appService.name
-output uri string = 'https://${appService.properties.defaultHostName}'
diff --git a/samples/durable-functions/dotnet/PdfSummarizer/infra/core/host/appserviceplan.bicep b/samples/durable-functions/dotnet/PdfSummarizer/infra/core/host/appserviceplan.bicep
deleted file mode 100644
index 2e37e041..00000000
--- a/samples/durable-functions/dotnet/PdfSummarizer/infra/core/host/appserviceplan.bicep
+++ /dev/null
@@ -1,22 +0,0 @@
-metadata description = 'Creates an Azure App Service plan.'
-param name string
-param location string = resourceGroup().location
-param tags object = {}
-
-param kind string = ''
-param reserved bool = true
-param sku object
-
-resource appServicePlan 'Microsoft.Web/serverfarms@2022-03-01' = {
- name: name
- location: location
- tags: tags
- sku: sku
- kind: kind
- properties: {
- reserved: reserved
- }
-}
-
-output id string = appServicePlan.id
-output name string = appServicePlan.name
diff --git a/samples/durable-functions/dotnet/PdfSummarizer/infra/core/host/functions-flexconsumption.bicep b/samples/durable-functions/dotnet/PdfSummarizer/infra/core/host/functions-flexconsumption.bicep
deleted file mode 100644
index d6a5e632..00000000
--- a/samples/durable-functions/dotnet/PdfSummarizer/infra/core/host/functions-flexconsumption.bicep
+++ /dev/null
@@ -1,87 +0,0 @@
-param name string
-param location string = resourceGroup().location
-param tags object = {}
-
-// Reference Properties
-param applicationInsightsName string = ''
-param appServicePlanId string
-param storageAccountName string
-param virtualNetworkSubnetId string = ''
-@allowed(['SystemAssigned', 'UserAssigned'])
-param identityType string
-@description('User assigned identity name')
-param identityId string
-
-// Runtime Properties
-@allowed([
- 'dotnet-isolated', 'node', 'python', 'java', 'powershell', 'custom'
-])
-param runtimeName string
-@allowed(['3.10', '3.11', '7.4', '8.0', '10', '11', '17', '20'])
-param runtimeVersion string
-param kind string = 'functionapp,linux'
-
-// Microsoft.Web/sites/config
-param appSettings object = {}
-param instanceMemoryMB int = 2048
-param maximumInstanceCount int = 100
-param deploymentStorageContainerName string
-
-resource stg 'Microsoft.Storage/storageAccounts@2022-09-01' existing = {
- name: storageAccountName
-}
-
-resource functions 'Microsoft.Web/sites@2023-12-01' = {
- name: name
- location: location
- tags: tags
- kind: kind
- identity: {
- type: identityType
- userAssignedIdentities: {
- '${identityId}': {}
- }
- }
- properties: {
- serverFarmId: appServicePlanId
- functionAppConfig: {
- deployment: {
- storage: {
- type: 'blobContainer'
- value: '${stg.properties.primaryEndpoints.blob}${deploymentStorageContainerName}'
- authentication: {
- type: identityType == 'SystemAssigned' ? 'SystemAssignedIdentity' : 'UserAssignedIdentity'
- userAssignedIdentityResourceId: identityType == 'UserAssigned' ? identityId : ''
- }
- }
- }
- scaleAndConcurrency: {
- instanceMemoryMB: instanceMemoryMB
- maximumInstanceCount: maximumInstanceCount
- }
- runtime: {
- name: runtimeName
- version: runtimeVersion
- }
- }
- virtualNetworkSubnetId: virtualNetworkSubnetId
- }
-
- resource configAppSettings 'config' = {
- name: 'appsettings'
- properties: union(appSettings,
- {
- AzureWebJobsStorage__accountName: stg.name
- AzureWebJobsStorage__credential : 'managedidentity'
- APPLICATIONINSIGHTS_CONNECTION_STRING: applicationInsights.properties.ConnectionString
- })
- }
-}
-
-resource applicationInsights 'Microsoft.Insights/components@2020-02-02' existing = if (!empty(applicationInsightsName)) {
- name: applicationInsightsName
-}
-
-output name string = functions.name
-output uri string = 'https://${functions.properties.defaultHostName}'
-output identityPrincipalId string = identityType == 'SystemAssigned' ? functions.identity.principalId : ''
diff --git a/samples/durable-functions/dotnet/PdfSummarizer/infra/core/host/functions.bicep b/samples/durable-functions/dotnet/PdfSummarizer/infra/core/host/functions.bicep
deleted file mode 100644
index 256a4a39..00000000
--- a/samples/durable-functions/dotnet/PdfSummarizer/infra/core/host/functions.bicep
+++ /dev/null
@@ -1,116 +0,0 @@
-metadata description = 'Creates an Azure Function in an existing Azure App Service plan.'
-param name string
-param location string = resourceGroup().location
-param tags object = {}
-
-// Reference Properties
-param applicationInsightsName string = ''
-param appServicePlanId string
-param keyVaultName string = ''
-param managedIdentity bool = !empty(keyVaultName) || storageManagedIdentity
-param storageAccountName string
-param storageManagedIdentity bool = false
-param virtualNetworkSubnetId string = ''
-@allowed(['SystemAssigned', 'UserAssigned'])
-param identityType string
-@description('User assigned identity name')
-param identityId string
-
-// Runtime Properties
-@allowed([
- 'dotnet', 'dotnetcore', 'dotnet-isolated', 'node', 'python', 'java', 'powershell', 'custom'
-])
-param runtimeName string
-param runtimeNameAndVersion string = '${runtimeName}|${runtimeVersion}'
-param runtimeVersion string
-
-// Function Settings
-@allowed([
- '~4', '~3', '~2', '~1'
-])
-param extensionVersion string = '~4'
-
-// Microsoft.Web/sites Properties
-param kind string = 'functionapp,linux'
-
-// Microsoft.Web/sites/config
-param allowedOrigins array = []
-param alwaysOn bool = true
-param appCommandLine string = ''
-@secure()
-param appSettings object = {}
-param clientAffinityEnabled bool = false
-param enableOryxBuild bool = contains(kind, 'linux')
-param functionAppScaleLimit int = -1
-param linuxFxVersion string = runtimeNameAndVersion
-param minimumElasticInstanceCount int = -1
-param numberOfWorkers int = -1
-param scmDoBuildDuringDeployment bool = true
-param use32BitWorkerProcess bool = false
-param healthCheckPath string = ''
-param deploymentStorageContainerName string
-param deploymentStorageFileName string = 'functions' // Default to functions.zip name in WEBSITE_RUN_FROM_PACKAGE= value
-param azureOpenaiService string
-param documentIntelligenceEndpoint string
-
-module functions 'appservice.bicep' = {
- name: '${name}-functions'
- params: {
- name: name
- location: location
- tags: tags
- allowedOrigins: allowedOrigins
- alwaysOn: alwaysOn
- appCommandLine: appCommandLine
- applicationInsightsName: applicationInsightsName
- appServicePlanId: appServicePlanId
- appSettings: union(appSettings, {
- AzureWebJobsStorage__accountname: storage.name
- AzureWebJobsStorage__blobServiceUri: 'https://${storage.name}.blob.core.windows.net/'
- AzureWebJobsStorage__queueServiceUri: 'https://${storage.name}.queue.core.windows.net/'
- AzureWebJobsStorage__credential: 'managedidentity'
- FUNCTIONS_EXTENSION_VERSION: extensionVersion
- FUNCTIONS_WORKER_RUNTIME: runtimeName
- AZURE_OPENAI_ENDPOINT: 'https://${azureOpenaiService}.openai.azure.com/'
- COGNITIVE_SERVICES_ENDPOINT: documentIntelligenceEndpoint
- WEBSITE_RUN_FROM_PACKAGE: 'https://${storage.name}.blob.core.windows.net/${deploymentStorageContainerName}/${deploymentStorageFileName}.zip'
- WEBSITE_RUN_FROM_PACKAGE_BLOB_MI_RESOURCE_ID: storageManagedIdentity ? identityId : null
- })
- clientAffinityEnabled: clientAffinityEnabled
- enableOryxBuild: enableOryxBuild
- functionAppScaleLimit: functionAppScaleLimit
- healthCheckPath: healthCheckPath
- keyVaultName: keyVaultName
- kind: kind
- linuxFxVersion: linuxFxVersion
- managedIdentity: managedIdentity
- identityId: identityId
- identityType: identityType
- minimumElasticInstanceCount: minimumElasticInstanceCount
- numberOfWorkers: numberOfWorkers
- runtimeName: runtimeName
- runtimeVersion: runtimeVersion
- runtimeNameAndVersion: runtimeNameAndVersion
- scmDoBuildDuringDeployment: scmDoBuildDuringDeployment
- use32BitWorkerProcess: use32BitWorkerProcess
- virtualNetworkSubnetId: virtualNetworkSubnetId
- }
-}
-
-module storageOwnerRole '../security/role.bicep' = if (storageManagedIdentity) {
- name: 'search-index-contrib-role-api'
- params: {
- principalId: functions.outputs.identityPrincipalId
- // Search Index Data Contributor
- roleDefinitionId: '8ebe5a00-799e-43f5-93ac-243d3dce84a7'
- principalType: 'ServicePrincipal'
- }
-}
-
-resource storage 'Microsoft.Storage/storageAccounts@2021-09-01' existing = {
- name: storageAccountName
-}
-
-output identityPrincipalId string = managedIdentity ? functions.outputs.identityPrincipalId : ''
-output name string = functions.outputs.name
-output uri string = functions.outputs.uri
diff --git a/samples/durable-functions/dotnet/PdfSummarizer/infra/core/identity/userAssignedIdentity.bicep b/samples/durable-functions/dotnet/PdfSummarizer/infra/core/identity/userAssignedIdentity.bicep
deleted file mode 100644
index 0d4e02ea..00000000
--- a/samples/durable-functions/dotnet/PdfSummarizer/infra/core/identity/userAssignedIdentity.bicep
+++ /dev/null
@@ -1,14 +0,0 @@
-param identityName string
-param location string
-param tags object = {}
-
-resource userAssignedIdentity 'Microsoft.ManagedIdentity/userAssignedIdentities@2023-07-31-preview' = {
- name: identityName
- location: location
- tags: tags
-}
-
-output identityId string = userAssignedIdentity.id
-output identityName string = userAssignedIdentity.name
-output identityPrincipalId string = userAssignedIdentity.properties.principalId
-output identityClientId string = userAssignedIdentity.properties.clientId
diff --git a/samples/durable-functions/dotnet/PdfSummarizer/infra/core/monitor/appinsights-access.bicep b/samples/durable-functions/dotnet/PdfSummarizer/infra/core/monitor/appinsights-access.bicep
deleted file mode 100644
index f151b104..00000000
--- a/samples/durable-functions/dotnet/PdfSummarizer/infra/core/monitor/appinsights-access.bicep
+++ /dev/null
@@ -1,21 +0,0 @@
-param principalID string
-param roleDefinitionID string
-param appInsightsName string
-
-resource applicationInsights 'Microsoft.Insights/components@2020-02-02' existing = {
- name: appInsightsName
-}
-
-// Allow access from API to app insights using a managed identity and least priv role
-resource appInsightsRoleAssignment 'Microsoft.Authorization/roleAssignments@2020-04-01-preview' = {
- name: guid(applicationInsights.id, principalID, roleDefinitionID)
- scope: applicationInsights
- properties: {
- roleDefinitionId: resourceId('Microsoft.Authorization/roleDefinitions', roleDefinitionID)
- principalId: principalID
- principalType: 'ServicePrincipal' // Workaround for https://learn.microsoft.com/en-us/azure/role-based-access-control/role-assignments-template#new-service-principal
- }
-}
-
-output ROLE_ASSIGNMENT_NAME string = appInsightsRoleAssignment.name
-
diff --git a/samples/durable-functions/dotnet/PdfSummarizer/infra/core/monitor/applicationinsights.bicep b/samples/durable-functions/dotnet/PdfSummarizer/infra/core/monitor/applicationinsights.bicep
deleted file mode 100644
index f6d9ee51..00000000
--- a/samples/durable-functions/dotnet/PdfSummarizer/infra/core/monitor/applicationinsights.bicep
+++ /dev/null
@@ -1,22 +0,0 @@
-param name string
-param location string = resourceGroup().location
-param tags object = {}
-
-param logAnalyticsWorkspaceId string
-param disableLocalAuth bool = false
-
-resource applicationInsights 'Microsoft.Insights/components@2020-02-02' = {
- name: name
- location: location
- tags: tags
- kind: 'web'
- properties: {
- Application_Type: 'web'
- WorkspaceResourceId: logAnalyticsWorkspaceId
- DisableLocalAuth: disableLocalAuth
- }
-}
-
-output connectionString string = applicationInsights.properties.ConnectionString
-output instrumentationKey string = applicationInsights.properties.InstrumentationKey
-output name string = applicationInsights.name
diff --git a/samples/durable-functions/dotnet/PdfSummarizer/infra/core/monitor/loganalytics.bicep b/samples/durable-functions/dotnet/PdfSummarizer/infra/core/monitor/loganalytics.bicep
deleted file mode 100644
index 770544cc..00000000
--- a/samples/durable-functions/dotnet/PdfSummarizer/infra/core/monitor/loganalytics.bicep
+++ /dev/null
@@ -1,21 +0,0 @@
-param name string
-param location string = resourceGroup().location
-param tags object = {}
-
-resource logAnalytics 'Microsoft.OperationalInsights/workspaces@2021-12-01-preview' = {
- name: name
- location: location
- tags: tags
- properties: any({
- retentionInDays: 30
- features: {
- searchVersion: 1
- }
- sku: {
- name: 'PerGB2018'
- }
- })
-}
-
-output id string = logAnalytics.id
-output name string = logAnalytics.name
diff --git a/samples/durable-functions/dotnet/PdfSummarizer/infra/core/monitor/monitoring.bicep b/samples/durable-functions/dotnet/PdfSummarizer/infra/core/monitor/monitoring.bicep
deleted file mode 100644
index 791c5eb7..00000000
--- a/samples/durable-functions/dotnet/PdfSummarizer/infra/core/monitor/monitoring.bicep
+++ /dev/null
@@ -1,31 +0,0 @@
-param logAnalyticsName string
-param applicationInsightsName string
-param location string = resourceGroup().location
-param tags object = {}
-param disableLocalAuth bool = false
-
-module logAnalytics 'loganalytics.bicep' = {
- name: 'loganalytics'
- params: {
- name: logAnalyticsName
- location: location
- tags: tags
- }
-}
-
-module applicationInsights 'applicationinsights.bicep' = {
- name: 'applicationinsights'
- params: {
- name: applicationInsightsName
- location: location
- tags: tags
- logAnalyticsWorkspaceId: logAnalytics.outputs.id
- disableLocalAuth: disableLocalAuth
- }
-}
-
-output applicationInsightsConnectionString string = applicationInsights.outputs.connectionString
-output applicationInsightsInstrumentationKey string = applicationInsights.outputs.instrumentationKey
-output applicationInsightsName string = applicationInsights.outputs.name
-output logAnalyticsWorkspaceId string = logAnalytics.outputs.id
-output logAnalyticsWorkspaceName string = logAnalytics.outputs.name
diff --git a/samples/durable-functions/dotnet/PdfSummarizer/infra/core/security/role.bicep b/samples/durable-functions/dotnet/PdfSummarizer/infra/core/security/role.bicep
deleted file mode 100644
index 0b30cfd3..00000000
--- a/samples/durable-functions/dotnet/PdfSummarizer/infra/core/security/role.bicep
+++ /dev/null
@@ -1,21 +0,0 @@
-metadata description = 'Creates a role assignment for a service principal.'
-param principalId string
-
-@allowed([
- 'Device'
- 'ForeignGroup'
- 'Group'
- 'ServicePrincipal'
- 'User'
-])
-param principalType string = 'ServicePrincipal'
-param roleDefinitionId string
-
-resource role 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
- name: guid(subscription().id, resourceGroup().id, principalId, roleDefinitionId)
- properties: {
- principalId: principalId
- principalType: principalType
- roleDefinitionId: resourceId('Microsoft.Authorization/roleDefinitions', roleDefinitionId)
- }
-}
diff --git a/samples/durable-functions/dotnet/PdfSummarizer/infra/core/storage/storage-account.bicep b/samples/durable-functions/dotnet/PdfSummarizer/infra/core/storage/storage-account.bicep
deleted file mode 100644
index 6149fb2f..00000000
--- a/samples/durable-functions/dotnet/PdfSummarizer/infra/core/storage/storage-account.bicep
+++ /dev/null
@@ -1,101 +0,0 @@
-metadata description = 'Creates an Azure storage account.'
-param name string
-param location string = resourceGroup().location
-param tags object = {}
-
-@allowed([
- 'Cool'
- 'Hot'
- 'Premium' ])
-param accessTier string = 'Hot'
-param allowBlobPublicAccess bool = true
-param allowCrossTenantReplication bool = true
-param allowSharedKeyAccess bool = true
-param containers array = []
-param corsRules array = []
-param defaultToOAuthAuthentication bool = false
-param deleteRetentionPolicy object = {}
-@allowed([ 'AzureDnsZone', 'Standard' ])
-param dnsEndpointType string = 'Standard'
-param files array = []
-param kind string = 'StorageV2'
-param minimumTlsVersion string = 'TLS1_2'
-param queues array = []
-param shareDeleteRetentionPolicy object = {}
-param supportsHttpsTrafficOnly bool = true
-param tables array = []
-param networkAcls object = {
- bypass: 'AzureServices'
- defaultAction: 'Allow'
-}
-@allowed([ 'Enabled', 'Disabled' ])
-param publicNetworkAccess string = 'Enabled'
-param sku object = { name: 'Standard_LRS' }
-
-resource storage 'Microsoft.Storage/storageAccounts@2023-01-01' = {
- name: name
- location: location
- tags: tags
- kind: kind
- sku: sku
- properties: {
- accessTier: accessTier
- allowBlobPublicAccess: allowBlobPublicAccess
- allowCrossTenantReplication: allowCrossTenantReplication
- allowSharedKeyAccess: allowSharedKeyAccess
- defaultToOAuthAuthentication: defaultToOAuthAuthentication
- dnsEndpointType: dnsEndpointType
- minimumTlsVersion: minimumTlsVersion
- networkAcls: networkAcls
- publicNetworkAccess: publicNetworkAccess
- supportsHttpsTrafficOnly: supportsHttpsTrafficOnly
- }
-
- resource blobServices 'blobServices' = if (!empty(containers)) {
- name: 'default'
- properties: {
- cors: {
- corsRules: corsRules
- }
- deleteRetentionPolicy: deleteRetentionPolicy
- }
- resource container 'containers' = [for container in containers: {
- name: container.name
- properties: {
- publicAccess: contains(container, 'publicAccess') ? container.publicAccess : 'None'
- }
- }]
- }
-
- resource fileServices 'fileServices' = if (!empty(files)) {
- name: 'default'
- properties: {
- cors: {
- corsRules: corsRules
- }
- shareDeleteRetentionPolicy: shareDeleteRetentionPolicy
- }
- }
-
- resource queueServices 'queueServices' = if (!empty(queues)) {
- name: 'default'
- properties: {
-
- }
- resource queue 'queues' = [for queue in queues: {
- name: queue.name
- properties: {
- metadata: {}
- }
- }]
- }
-
- resource tableServices 'tableServices' = if (!empty(tables)) {
- name: 'default'
- properties: {}
- }
-}
-
-output id string = storage.id
-output name string = storage.name
-output primaryEndpoints object = storage.properties.primaryEndpoints
diff --git a/samples/durable-functions/dotnet/PdfSummarizer/infra/main.bicep b/samples/durable-functions/dotnet/PdfSummarizer/infra/main.bicep
deleted file mode 100644
index 9fabf898..00000000
--- a/samples/durable-functions/dotnet/PdfSummarizer/infra/main.bicep
+++ /dev/null
@@ -1,404 +0,0 @@
-targetScope = 'subscription'
-
-@minLength(1)
-@maxLength(64)
-@description('Name of the the environment which is used to generate a short unique hash used in all resources.')
-param environmentName string
-
-@minLength(1)
-@description('Primary location for all resources')
-@allowed(['australiaeast', 'eastasia', 'northcentralus', 'northeurope', 'southeastasia', 'swedencentral', 'uksouth', 'westus2', 'centralus'])
-@metadata({
- azd: {
- type: 'location'
- }
-})
-param location string
-
-@allowed([
- 'EP1'
- 'EP2'
- 'EP3'
- 'P1v2'
- 'P2v2'
- 'P3v2'
- 'P1v3'
- 'P2v3'
- 'P3v3'
- 'P1mv3'
- 'P2mv3'
- 'P3mv3'
- 'P4mv3'
- 'P5mv3'
- 'P0v3'
- 'S1'
- 'B1'
- 'B2'
- 'B3'
-])
-param functionSkuName string = 'EP1' // Uses main.parameters.json first
-
-@allowed([
- 'ElasticPremium'
- 'PremiumV3'
- 'Premium0V3'
- 'Standard'
- 'Basic'
-])
-
-param functionSkuTier string = 'ElasticPremium' // Uses main.parameters.json first
-param functionReservedPlan bool = true // Set to false to get a Windows OS plan
-
-param dtsLocation string = location
-param dtsSkuName string = 'Consumption'
-param dtsCapacity int = 1
-
-param documentIntelligenceSkuName string // Set in main.parameters.json
-param documentIntelligenceServiceName string = '' // Set in main.parameters.json
-
-param durableFunctionServiceName string = ''
-param durableFunctionUserAssignedIdentityName string = ''
-param applicationInsightsName string = ''
-param appServicePlanName string = ''
-param logAnalyticsName string = ''
-param resourceGroupName string = ''
-param storageAccountName string = ''
-param dtsName string = ''
-param taskHubName string = ''
-param vNetName string = ''
-param disableLocalAuth bool = true
-
-param openAiServiceName string = ''
-
-param openAiSkuName string
-@allowed([ 'azure', 'openai', 'azure_custom' ])
-param openAiHost string // Set in main.parameters.json
-
-@description('Public network access value for all deployed resources')
-@allowed(['Enabled', 'Disabled'])
-param publicNetworkAccess string = 'Enabled'
-
-param chatModelName string = ''
-param chatDeploymentName string = ''
-param chatDeploymentVersion string = ''
-param chatDeploymentCapacity int = 0
-param skipVnet bool = true
-
-var chatModel = {
- modelName: !empty(chatModelName) ? chatModelName : startsWith(openAiHost, 'azure') ? 'gpt-4o' : 'gpt-4o'
- deploymentName: !empty(chatDeploymentName) ? chatDeploymentName : 'chat'
- deploymentVersion: !empty(chatDeploymentVersion) ? chatDeploymentVersion : '2024-08-06'
- deploymentCapacity: chatDeploymentCapacity != 0 ? chatDeploymentCapacity : 40
-}
-
-var abbrs = loadJsonContent('./abbreviations.json')
-var resourceToken = toLower(uniqueString(subscription().id, environmentName, location))
-var tags = { 'azd-env-name': environmentName }
-var functionAppName = !empty(durableFunctionServiceName) ? durableFunctionServiceName : '${abbrs.webSitesFunctions}${resourceToken}'
-var deploymentStorageContainerName = 'app-package-${take(functionAppName, 32)}-${take(toLower(uniqueString(functionAppName, resourceToken)), 7)}'
-
-@description('Id of the user or app to assign application roles')
-param principalId string = ''
-
-// Organize resources in a resource group
-resource rg 'Microsoft.Resources/resourceGroups@2021-04-01' = {
- name: !empty(resourceGroupName) ? resourceGroupName : '${abbrs.resourcesResourceGroups}${environmentName}'
- location: location
- tags: tags
-}
-
-module durableFunctionUserAssignedIdentity './core/identity/userAssignedIdentity.bicep' = {
- name: 'DurableFunctionUserAssignedIdentity'
- scope: rg
- params: {
- location: location
- tags: tags
- identityName: !empty(durableFunctionUserAssignedIdentityName) ? durableFunctionUserAssignedIdentityName : '${abbrs.managedIdentityUserAssignedIdentities}durable-function-${resourceToken}'
- }
-}
-
-// The application backend is a function app
-module appServicePlan './core/host/appserviceplan.bicep' = {
- name: 'appserviceplan'
- scope: rg
- params: {
- name: !empty(appServicePlanName) ? appServicePlanName : '${abbrs.webServerFarms}${resourceToken}'
- location: location
- tags: tags
- sku: {
- name: functionSkuName // Change this to the desired Elastic Premium SKU
- tier: functionSkuTier
- }
- reserved: functionReservedPlan // Set to false to get a Windows OS plan
- }
-}
-
-module durableFunction './app/durable-function.bicep' = {
- name: 'pdf-summarizer-dotnet'
- scope: rg
- params: {
- name: functionAppName
- location: location
- tags: tags
- applicationInsightsName: monitoring.outputs.applicationInsightsName
- appServicePlanId: appServicePlan.outputs.id
- runtimeName: 'dotnet-isolated'
- runtimeVersion: '8.0'
- storageAccountName: storage.outputs.name
- identityId: durableFunctionUserAssignedIdentity.outputs.identityId
- identityClientId: durableFunctionUserAssignedIdentity.outputs.identityClientId
- deploymentStorageContainerName: deploymentStorageContainerName
- dtsURL: dts.outputs.dts_URL
- taskHubName: dts.outputs.TASKHUB_NAME
- azureOpenaiService: openAi.outputs.name
- documentIntelligenceEndpoint: documentIntelligence.outputs.endpoint
- appSettings: {
- CHAT_MODEL_DEPLOYMENT_NAME: chatModel.deploymentName
- }
- virtualNetworkSubnetId: serviceVirtualNetwork.outputs.appSubnetID
- }
-}
-
-// Backing storage for Azure functions durable function
-module storage './core/storage/storage-account.bicep' = {
- name: 'storage'
- scope: rg
- params: {
- name: !empty(storageAccountName) ? storageAccountName : '${abbrs.storageStorageAccounts}${resourceToken}'
- location: location
- tags: tags
- containers: [{
- name: deploymentStorageContainerName
- publicAccess: 'None'
- },{
- name: 'input'
- publicAccess: 'None'
-
- },{
- name: 'output'
- publicAccess: 'None'
- }]
- publicNetworkAccess: 'Enabled' // revisit for wave 3
- allowBlobPublicAccess: false
- }
-}
-
-var storageRoleDefinitionId = 'b7e6dc6d-f1e8-4753-8033-0f276bb0955b' //Storage Blob Data Owner role
-var queueStorageRoleDefinitionId = '974c5e8b-45b9-4653-ba55-5f855dd0fb88' //Queue Storage Blob Data Owner role
-var storageAccountRoleDefinitionId = '17d1049b-9a84-46fb-8f53-869881c3d3ab' //Storage Account Contributor role
-
-// Allow access from durable function to storage account using the Login identity of this bicep (usually AZD CLI)
-module storageRoleAssignmentApiUAMI 'app/storage-Access.bicep' = {
- name: 'storageRoleAssignmentUAMI'
- scope: rg
- params: {
- storageAccountName: storage.outputs.name
- roleDefinitionID: storageRoleDefinitionId
- principalID: principalId
- principalType: 'User'
- }
-}
-
-module queueStorageRoleAssignmentApi 'app/storage-Access.bicep' = {
- name: 'ququeStorageRoleAssignmentPocessorUAMI'
- scope: rg
- params: {
- storageAccountName: storage.outputs.name
- roleDefinitionID: queueStorageRoleDefinitionId
- principalID: durableFunctionUserAssignedIdentity.outputs.identityPrincipalId
- principalType: 'ServicePrincipal'
- }
-}
-
-module blobStorageRoleAssignmentApi 'app/storage-Access.bicep' = {
- name: 'blobStorageRoleAssignmentPocessor'
- scope: rg
- params: {
- storageAccountName: storage.outputs.name
- roleDefinitionID: storageRoleDefinitionId
- principalID: durableFunctionUserAssignedIdentity.outputs.identityPrincipalId
- principalType: 'ServicePrincipal'
- }
-}
-
-// Allow access from durable function to storage account using a user assigned managed identity
-module storageAccountRoleAssignmentApi 'app/storage-Access.bicep' = {
- name: 'storageAccountRoleAssignmentPocessor'
- scope: rg
- params: {
- storageAccountName: storage.outputs.name
- roleDefinitionID: storageAccountRoleDefinitionId
- principalID: durableFunctionUserAssignedIdentity.outputs.identityPrincipalId
- principalType: 'ServicePrincipal'
- }
-}
-
-// Virtual Network & private endpoint to blob storage
-module serviceVirtualNetwork 'app/vnet.bicep' = {
- name: 'serviceVirtualNetwork'
- scope: rg
- params: {
- location: location
- tags: tags
- vNetName: !empty(vNetName) ? vNetName : '${abbrs.networkVirtualNetworks}${resourceToken}'
- }
-}
-
-module storagePrivateEndpoint 'app/storage-PrivateEndpoint.bicep' = {
- name: 'servicePrivateEndpoint'
- scope: rg
- params: {
- location: location
- tags: tags
- virtualNetworkName: !empty(vNetName) ? vNetName : '${abbrs.networkVirtualNetworks}${resourceToken}'
- subnetName: serviceVirtualNetwork.outputs.peSubnetName
- resourceName: storage.outputs.name
- }
-}
-
-// Monitor application with Azure Monitor
-module monitoring './core/monitor/monitoring.bicep' = {
- name: 'monitoring'
- scope: rg
- params: {
- location: location
- tags: tags
- logAnalyticsName: !empty(logAnalyticsName) ? logAnalyticsName : '${abbrs.operationalInsightsWorkspaces}${resourceToken}'
- applicationInsightsName: !empty(applicationInsightsName) ? applicationInsightsName : '${abbrs.insightsComponents}${resourceToken}'
- disableLocalAuth: disableLocalAuth
- }
-}
-
-var monitoringRoleDefinitionId = '3913510d-42f4-4e42-8a64-420c390055eb' // Monitoring Metrics Publisher role ID
-
-// Allow access from durable function` to application insights using a managed identity
-module appInsightsRoleAssignmentApi './core/monitor/appinsights-access.bicep' = {
- name: 'appInsightsRoleAssignmentDurableFunction'
- scope: rg
- params: {
- appInsightsName: monitoring.outputs.applicationInsightsName
- roleDefinitionID: monitoringRoleDefinitionId
- principalID: durableFunctionUserAssignedIdentity.outputs.identityPrincipalId
- }
-}
-
-// Allow access from durable function to storage account using a user assigned managed identity
-module dtsRoleAssignment 'app/dts-Access.bicep' = {
- name: 'dtsRoleAssignment'
- scope: rg
- params: {
- roleDefinitionID: '0ad04412-c4d5-4796-b79c-f76d14c8d402'
- principalID: durableFunctionUserAssignedIdentity.outputs.identityPrincipalId
- principalType: 'ServicePrincipal'
- dtsName: dts.outputs.dts_NAME
- }
-}
-
-module dtsDashboardRoleAssignment 'app/dts-Access.bicep' = {
- name: 'dtsDashboardRoleAssignment'
- scope: rg
- params: {
- roleDefinitionID: '0ad04412-c4d5-4796-b79c-f76d14c8d402'
- principalID: principalId
- principalType: 'User'
- dtsName: dts.outputs.dts_NAME
- }
-}
-
-module dts './app/dts.bicep' = {
- scope: rg
- name: 'dtsResource'
- params: {
- name: !empty(dtsName) ? dtsName : '${abbrs.dts}${resourceToken}'
- taskhubname: !empty(taskHubName) ? taskHubName : '${abbrs.taskhub}${resourceToken}'
- location: dtsLocation
- tags: tags
- ipAllowlist: [
- '0.0.0.0/0'
- ]
- skuName: dtsSkuName
- skuCapacity: dtsCapacity
- }
-}
-
-module openAi 'core/ai/openai.bicep' = {
- name: 'openai'
- scope: rg
- params: {
- name: !empty(openAiServiceName) ? openAiServiceName : '${abbrs.cognitiveServicesAccounts}${resourceToken}'
- location: 'eastus2'
- tags: tags
- publicNetworkAccess: skipVnet == 'false' ? 'Disabled' : 'Enabled'
- sku: {
- name: openAiSkuName
- }
- deployments: [
- {
- name: chatModel.deploymentName
- capacity: chatModel.deploymentCapacity
- model: {
- format: 'OpenAI'
- name: chatModel.modelName
- version: chatModel.deploymentVersion
- }
- scaleSettings: {
- scaleType: 'Standard'
- }
- }
- ]
- }
-}
-
-// Learn more about Azure role-based access control (RBAC) and built-in-roles at https://docs.microsoft.com/en-us/azure/role-based-access-control/overview
-var CognitiveServicesRoleDefinitionIds = ['5e0bd9bd-7b93-4f28-af87-19fc36ad61bd'] // Cognitive Services OpenAI User
-module openAiRoleUser 'app/openai-Access.bicep' = {
- scope: rg
- name: 'openai-roles'
- params: {
- principalId: durableFunctionUserAssignedIdentity.outputs.identityPrincipalId
- openAiAccountResourceName: openAi.outputs.name
- roleDefinitionIds: CognitiveServicesRoleDefinitionIds
- }
-}
-
-module documentIntelligence 'br/public:avm/res/cognitive-services/account:0.5.4' = {
- name: 'documentintelligence'
- scope: rg
- params: {
- name: !empty(documentIntelligenceServiceName)
- ? documentIntelligenceServiceName
- : '${abbrs.cognitiveServicesDocumentIntelligence}${resourceToken}'
- kind: 'FormRecognizer'
- customSubDomainName: !empty(documentIntelligenceServiceName)
- ? documentIntelligenceServiceName
- : '${abbrs.cognitiveServicesDocumentIntelligence}${resourceToken}'
- publicNetworkAccess: publicNetworkAccess
- networkAcls: {
- defaultAction: 'Allow'
- }
- location: location
- disableLocalAuth: true
- tags: tags
- sku: documentIntelligenceSkuName
- }
-}
-
-module documentIntelligenceRoleBackend 'app/documentintelligence-Access.bicep' = {
- scope: rg
- name: 'documentintelligence-role-backend'
- params: {
- principalId: durableFunctionUserAssignedIdentity.outputs.identityPrincipalId
- roleDefinitionId: 'a97b65f3-24c7-4388-baec-2e87135dc908'
- principalType: 'ServicePrincipal'
- }
-}
-
-// App outputs
-output APPLICATIONINSIGHTS_CONNECTION_STRING string = monitoring.outputs.applicationInsightsConnectionString
-output AZURE_LOCATION string = location
-output AZURE_TENANT_ID string = tenant().tenantId
-output SERVICE_DURABLE_FUNCTION_NAME string = durableFunction.outputs.SERVICE_DURABLE_FUNCTION_NAME
-output AZURE_FUNCTION_NAME string = durableFunction.outputs.SERVICE_DURABLE_FUNCTION_NAME
-output AZURE_RESOURCE_GROUP string = rg.name
-output AZURE_STORAGE_ACCOUNT_NAME string = storage.outputs.name
-output AZURE_STORAGE_CONTAINER_NAME string = deploymentStorageContainerName
diff --git a/samples/durable-functions/dotnet/PdfSummarizer/infra/main.parameters.json b/samples/durable-functions/dotnet/PdfSummarizer/infra/main.parameters.json
deleted file mode 100644
index e72b9dc4..00000000
--- a/samples/durable-functions/dotnet/PdfSummarizer/infra/main.parameters.json
+++ /dev/null
@@ -1,81 +0,0 @@
-{
- "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
- "contentVersion": "1.0.0.0",
- "parameters": {
- "environmentName": {
- "value": "${AZURE_ENV_NAME}"
- },
- "location": {
- "value": "${AZURE_LOCATION}"
- },
- "principalId": {
- "value": "${AZURE_PRINCIPAL_ID}"
- },
- "openAiSkuName": {
- "value": "S0"
- },
- "openAiServiceName": {
- "value": "${AZURE_OPENAI_SERVICE}"
- },
- "openAiHost": {
- "value": "${OPENAI_HOST=azure}"
- },
- "openAiResourceGroupName": {
- "value": "${AZURE_OPENAI_RESOURCE_GROUP}"
- },
- "chatGptDeploymentName": {
- "value": "${AZURE_OPENAI_CHATGPT_DEPLOYMENT=chat}"
- },
- "chatGptDeploymentCapacity":{
- "value": "${AZURE_OPENAI_CHATGPT_DEPLOYMENT_CAPACITY}"
- },
- "chatGptDeploymentVersion":{
- "value": "${AZURE_OPENAI_CHATGPT_DEPLOYMENT_VERSION}"
- },
- "chatGptModelName":{
- "value": "${AZURE_OPENAI_CHATGPT_MODEL=gpt-35-turbo}"
- },
- "documentIntelligenceServiceName": {
- "value": "${AZURE_DOCUMENTINTELLIGENCE_SERVICE}"
- },
- "documentIntelligenceSkuName": {
- "value": "${AZURE_DOCUMENTINTELLIGENCE_SKU=S0}"
- },
- "embeddingDeploymentName": {
- "value": "${AZURE_OPENAI_EMB_DEPLOYMENT=embedding}"
- },
- "embeddingModelName":{
- "value": "${AZURE_OPENAI_EMB_MODEL_NAME=text-embedding-3-small}"
- },
- "embeddingDeploymentVersion":{
- "value": "${AZURE_OPENAI_EMB_DEPLOYMENT_VERSION}"
- },
- "embeddingDeploymentCapacity":{
- "value": "${AZURE_OPENAI_EMB_DEPLOYMENT_CAPACITY}"
- },
- "searchServiceName": {
- "value": "${AZURE_SEARCH_SERVICE}"
- },
- "searchServiceResourceGroupName": {
- "value": "${AZURE_SEARCH_SERVICE_RESOURCE_GROUP}"
- },
- "searchServiceIndexName": {
- "value": "${AZURE_SEARCH_INDEX=openai-index}"
- },
- "searchServiceSkuName": {
- "value": "${AZURE_SEARCH_SERVICE_SKU=standard}"
- },
- "storageAccountName": {
- "value": "${AZURE_STORAGE_ACCOUNT}"
- },
- "storageResourceGroupName": {
- "value": "${AZURE_STORAGE_RESOURCE_GROUP}"
- },
- "azFunctionHostingPlanType": {
- "value": "flexconsumption"
- },
- "systemPrompt": {
- "value": "${SYSTEM_PROMPT}=You are a helpful assistant. You are responding to requests from a user about internal emails and documents. You can and should refer to the internal documents to help respond to requests. If a user makes a request thats not covered by the documents provided in the query, you must say that you do not have access to the information and not try and get information from other places besides the documents provided. The following is a list of documents that you can refer to when answering questions. The documents are in the format [filename]: [text] and are separated by newlines. If you answer a question by referencing any of the documents, please cite the document in your answer. For example, if you answer a question by referencing info.txt, you should add \"Reference: info.txt\" to the end of your answer on a separate line."
- }
- }
-}
\ No newline at end of file
diff --git a/samples/durable-functions/dotnet/PdfSummarizer/infra/modules/fetch-container-image.bicep b/samples/durable-functions/dotnet/PdfSummarizer/infra/modules/fetch-container-image.bicep
deleted file mode 100644
index 78d1e7ee..00000000
--- a/samples/durable-functions/dotnet/PdfSummarizer/infra/modules/fetch-container-image.bicep
+++ /dev/null
@@ -1,8 +0,0 @@
-param exists bool
-param name string
-
-resource existingApp 'Microsoft.App/containerApps@2023-05-02-preview' existing = if (exists) {
- name: name
-}
-
-output containers array = exists ? existingApp.properties.template.containers : []
diff --git a/samples/durable-functions/dotnet/PdfSummarizer/infra/shared/apps-env.bicep b/samples/durable-functions/dotnet/PdfSummarizer/infra/shared/apps-env.bicep
deleted file mode 100644
index 030b8233..00000000
--- a/samples/durable-functions/dotnet/PdfSummarizer/infra/shared/apps-env.bicep
+++ /dev/null
@@ -1,33 +0,0 @@
-param name string
-param location string = resourceGroup().location
-param tags object = {}
-
-param logAnalyticsWorkspaceName string
-param applicationInsightsName string = ''
-
-resource containerAppsEnvironment 'Microsoft.App/managedEnvironments@2022-10-01' = {
- name: name
- location: location
- tags: tags
- properties: {
- appLogsConfiguration: {
- destination: 'log-analytics'
- logAnalyticsConfiguration: {
- customerId: logAnalyticsWorkspace.properties.customerId
- sharedKey: logAnalyticsWorkspace.listKeys().primarySharedKey
- }
- }
- daprAIConnectionString: applicationInsights.properties.ConnectionString
- }
-}
-
-resource logAnalyticsWorkspace 'Microsoft.OperationalInsights/workspaces@2022-10-01' existing = {
- name: logAnalyticsWorkspaceName
-}
-
-resource applicationInsights 'Microsoft.Insights/components@2020-02-02' existing = {
- name: applicationInsightsName
-}
-
-output name string = containerAppsEnvironment.name
-output domain string = containerAppsEnvironment.properties.defaultDomain
diff --git a/samples/durable-functions/dotnet/PdfSummarizer/infra/shared/dashboard-web.bicep b/samples/durable-functions/dotnet/PdfSummarizer/infra/shared/dashboard-web.bicep
deleted file mode 100644
index eccce0db..00000000
--- a/samples/durable-functions/dotnet/PdfSummarizer/infra/shared/dashboard-web.bicep
+++ /dev/null
@@ -1,1231 +0,0 @@
-param name string
-param applicationInsightsName string
-param location string = resourceGroup().location
-param tags object = {}
-
-// 2020-09-01-preview because that is the latest valid version
-resource applicationInsightsDashboard 'Microsoft.Portal/dashboards@2020-09-01-preview' = {
- name: name
- location: location
- tags: tags
- properties: {
- lenses: [
- {
- order: 0
- parts: [
- {
- position: {
- x: 0
- y: 0
- colSpan: 2
- rowSpan: 1
- }
- metadata: {
- inputs: [
- {
- name: 'id'
- value: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- }
- {
- name: 'Version'
- value: '1.0'
- }
- ]
- #disable-next-line BCP036
- type: 'Extension/AppInsightsExtension/PartType/AspNetOverviewPinnedPart'
- asset: {
- idInputName: 'id'
- type: 'ApplicationInsights'
- }
- defaultMenuItemId: 'overview'
- }
- }
- {
- position: {
- x: 2
- y: 0
- colSpan: 1
- rowSpan: 1
- }
- metadata: {
- inputs: [
- {
- name: 'ComponentId'
- value: {
- Name: applicationInsightsName
- SubscriptionId: subscription().subscriptionId
- ResourceGroup: resourceGroup().name
- }
- }
- {
- name: 'Version'
- value: '1.0'
- }
- ]
- #disable-next-line BCP036
- type: 'Extension/AppInsightsExtension/PartType/ProactiveDetectionAsyncPart'
- asset: {
- idInputName: 'ComponentId'
- type: 'ApplicationInsights'
- }
- defaultMenuItemId: 'ProactiveDetection'
- }
- }
- {
- position: {
- x: 3
- y: 0
- colSpan: 1
- rowSpan: 1
- }
- metadata: {
- inputs: [
- {
- name: 'ComponentId'
- value: {
- Name: applicationInsightsName
- SubscriptionId: subscription().subscriptionId
- ResourceGroup: resourceGroup().name
- }
- }
- {
- name: 'ResourceId'
- value: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- }
- ]
- #disable-next-line BCP036
- type: 'Extension/AppInsightsExtension/PartType/QuickPulseButtonSmallPart'
- asset: {
- idInputName: 'ComponentId'
- type: 'ApplicationInsights'
- }
- }
- }
- {
- position: {
- x: 4
- y: 0
- colSpan: 1
- rowSpan: 1
- }
- metadata: {
- inputs: [
- {
- name: 'ComponentId'
- value: {
- Name: applicationInsightsName
- SubscriptionId: subscription().subscriptionId
- ResourceGroup: resourceGroup().name
- }
- }
- {
- name: 'TimeContext'
- value: {
- durationMs: 86400000
- endTime: null
- createdTime: '2018-05-04T01:20:33.345Z'
- isInitialTime: true
- grain: 1
- useDashboardTimeRange: false
- }
- }
- {
- name: 'Version'
- value: '1.0'
- }
- ]
- #disable-next-line BCP036
- type: 'Extension/AppInsightsExtension/PartType/AvailabilityNavButtonPart'
- asset: {
- idInputName: 'ComponentId'
- type: 'ApplicationInsights'
- }
- }
- }
- {
- position: {
- x: 5
- y: 0
- colSpan: 1
- rowSpan: 1
- }
- metadata: {
- inputs: [
- {
- name: 'ComponentId'
- value: {
- Name: applicationInsightsName
- SubscriptionId: subscription().subscriptionId
- ResourceGroup: resourceGroup().name
- }
- }
- {
- name: 'TimeContext'
- value: {
- durationMs: 86400000
- endTime: null
- createdTime: '2018-05-08T18:47:35.237Z'
- isInitialTime: true
- grain: 1
- useDashboardTimeRange: false
- }
- }
- {
- name: 'ConfigurationId'
- value: '78ce933e-e864-4b05-a27b-71fd55a6afad'
- }
- ]
- #disable-next-line BCP036
- type: 'Extension/AppInsightsExtension/PartType/AppMapButtonPart'
- asset: {
- idInputName: 'ComponentId'
- type: 'ApplicationInsights'
- }
- }
- }
- {
- position: {
- x: 0
- y: 1
- colSpan: 3
- rowSpan: 1
- }
- metadata: {
- inputs: []
- type: 'Extension/HubsExtension/PartType/MarkdownPart'
- settings: {
- content: {
- settings: {
- content: '# Usage'
- title: ''
- subtitle: ''
- }
- }
- }
- }
- }
- {
- position: {
- x: 3
- y: 1
- colSpan: 1
- rowSpan: 1
- }
- metadata: {
- inputs: [
- {
- name: 'ComponentId'
- value: {
- Name: applicationInsightsName
- SubscriptionId: subscription().subscriptionId
- ResourceGroup: resourceGroup().name
- }
- }
- {
- name: 'TimeContext'
- value: {
- durationMs: 86400000
- endTime: null
- createdTime: '2018-05-04T01:22:35.782Z'
- isInitialTime: true
- grain: 1
- useDashboardTimeRange: false
- }
- }
- ]
- #disable-next-line BCP036
- type: 'Extension/AppInsightsExtension/PartType/UsageUsersOverviewPart'
- asset: {
- idInputName: 'ComponentId'
- type: 'ApplicationInsights'
- }
- }
- }
- {
- position: {
- x: 4
- y: 1
- colSpan: 3
- rowSpan: 1
- }
- metadata: {
- inputs: []
- type: 'Extension/HubsExtension/PartType/MarkdownPart'
- settings: {
- content: {
- settings: {
- content: '# Reliability'
- title: ''
- subtitle: ''
- }
- }
- }
- }
- }
- {
- position: {
- x: 7
- y: 1
- colSpan: 1
- rowSpan: 1
- }
- metadata: {
- inputs: [
- {
- name: 'ResourceId'
- value: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- }
- {
- name: 'DataModel'
- value: {
- version: '1.0.0'
- timeContext: {
- durationMs: 86400000
- createdTime: '2018-05-04T23:42:40.072Z'
- isInitialTime: false
- grain: 1
- useDashboardTimeRange: false
- }
- }
- isOptional: true
- }
- {
- name: 'ConfigurationId'
- value: '8a02f7bf-ac0f-40e1-afe9-f0e72cfee77f'
- isOptional: true
- }
- ]
- #disable-next-line BCP036
- type: 'Extension/AppInsightsExtension/PartType/CuratedBladeFailuresPinnedPart'
- isAdapter: true
- asset: {
- idInputName: 'ResourceId'
- type: 'ApplicationInsights'
- }
- defaultMenuItemId: 'failures'
- }
- }
- {
- position: {
- x: 8
- y: 1
- colSpan: 3
- rowSpan: 1
- }
- metadata: {
- inputs: []
- type: 'Extension/HubsExtension/PartType/MarkdownPart'
- settings: {
- content: {
- settings: {
- content: '# Responsiveness\r\n'
- title: ''
- subtitle: ''
- }
- }
- }
- }
- }
- {
- position: {
- x: 11
- y: 1
- colSpan: 1
- rowSpan: 1
- }
- metadata: {
- inputs: [
- {
- name: 'ResourceId'
- value: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- }
- {
- name: 'DataModel'
- value: {
- version: '1.0.0'
- timeContext: {
- durationMs: 86400000
- createdTime: '2018-05-04T23:43:37.804Z'
- isInitialTime: false
- grain: 1
- useDashboardTimeRange: false
- }
- }
- isOptional: true
- }
- {
- name: 'ConfigurationId'
- value: '2a8ede4f-2bee-4b9c-aed9-2db0e8a01865'
- isOptional: true
- }
- ]
- #disable-next-line BCP036
- type: 'Extension/AppInsightsExtension/PartType/CuratedBladePerformancePinnedPart'
- isAdapter: true
- asset: {
- idInputName: 'ResourceId'
- type: 'ApplicationInsights'
- }
- defaultMenuItemId: 'performance'
- }
- }
- {
- position: {
- x: 12
- y: 1
- colSpan: 3
- rowSpan: 1
- }
- metadata: {
- inputs: []
- type: 'Extension/HubsExtension/PartType/MarkdownPart'
- settings: {
- content: {
- settings: {
- content: '# Browser'
- title: ''
- subtitle: ''
- }
- }
- }
- }
- }
- {
- position: {
- x: 15
- y: 1
- colSpan: 1
- rowSpan: 1
- }
- metadata: {
- inputs: [
- {
- name: 'ComponentId'
- value: {
- Name: applicationInsightsName
- SubscriptionId: subscription().subscriptionId
- ResourceGroup: resourceGroup().name
- }
- }
- {
- name: 'MetricsExplorerJsonDefinitionId'
- value: 'BrowserPerformanceTimelineMetrics'
- }
- {
- name: 'TimeContext'
- value: {
- durationMs: 86400000
- createdTime: '2018-05-08T12:16:27.534Z'
- isInitialTime: false
- grain: 1
- useDashboardTimeRange: false
- }
- }
- {
- name: 'CurrentFilter'
- value: {
- eventTypes: [
- 4
- 1
- 3
- 5
- 2
- 6
- 13
- ]
- typeFacets: {}
- isPermissive: false
- }
- }
- {
- name: 'id'
- value: {
- Name: applicationInsightsName
- SubscriptionId: subscription().subscriptionId
- ResourceGroup: resourceGroup().name
- }
- }
- {
- name: 'Version'
- value: '1.0'
- }
- ]
- #disable-next-line BCP036
- type: 'Extension/AppInsightsExtension/PartType/MetricsExplorerBladePinnedPart'
- asset: {
- idInputName: 'ComponentId'
- type: 'ApplicationInsights'
- }
- defaultMenuItemId: 'browser'
- }
- }
- {
- position: {
- x: 0
- y: 2
- colSpan: 4
- rowSpan: 3
- }
- metadata: {
- inputs: [
- {
- name: 'options'
- value: {
- chart: {
- metrics: [
- {
- resourceMetadata: {
- id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- }
- name: 'sessions/count'
- aggregationType: 5
- namespace: 'microsoft.insights/components/kusto'
- metricVisualization: {
- displayName: 'Sessions'
- color: '#47BDF5'
- }
- }
- {
- resourceMetadata: {
- id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- }
- name: 'users/count'
- aggregationType: 5
- namespace: 'microsoft.insights/components/kusto'
- metricVisualization: {
- displayName: 'Users'
- color: '#7E58FF'
- }
- }
- ]
- title: 'Unique sessions and users'
- visualization: {
- chartType: 2
- legendVisualization: {
- isVisible: true
- position: 2
- hideSubtitle: false
- }
- axisVisualization: {
- x: {
- isVisible: true
- axisType: 2
- }
- y: {
- isVisible: true
- axisType: 1
- }
- }
- }
- openBladeOnClick: {
- openBlade: true
- destinationBlade: {
- extensionName: 'HubsExtension'
- bladeName: 'ResourceMenuBlade'
- parameters: {
- id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- menuid: 'segmentationUsers'
- }
- }
- }
- }
- }
- }
- {
- name: 'sharedTimeRange'
- isOptional: true
- }
- ]
- #disable-next-line BCP036
- type: 'Extension/HubsExtension/PartType/MonitorChartPart'
- settings: {}
- }
- }
- {
- position: {
- x: 4
- y: 2
- colSpan: 4
- rowSpan: 3
- }
- metadata: {
- inputs: [
- {
- name: 'options'
- value: {
- chart: {
- metrics: [
- {
- resourceMetadata: {
- id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- }
- name: 'requests/failed'
- aggregationType: 7
- namespace: 'microsoft.insights/components'
- metricVisualization: {
- displayName: 'Failed requests'
- color: '#EC008C'
- }
- }
- ]
- title: 'Failed requests'
- visualization: {
- chartType: 3
- legendVisualization: {
- isVisible: true
- position: 2
- hideSubtitle: false
- }
- axisVisualization: {
- x: {
- isVisible: true
- axisType: 2
- }
- y: {
- isVisible: true
- axisType: 1
- }
- }
- }
- openBladeOnClick: {
- openBlade: true
- destinationBlade: {
- extensionName: 'HubsExtension'
- bladeName: 'ResourceMenuBlade'
- parameters: {
- id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- menuid: 'failures'
- }
- }
- }
- }
- }
- }
- {
- name: 'sharedTimeRange'
- isOptional: true
- }
- ]
- #disable-next-line BCP036
- type: 'Extension/HubsExtension/PartType/MonitorChartPart'
- settings: {}
- }
- }
- {
- position: {
- x: 8
- y: 2
- colSpan: 4
- rowSpan: 3
- }
- metadata: {
- inputs: [
- {
- name: 'options'
- value: {
- chart: {
- metrics: [
- {
- resourceMetadata: {
- id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- }
- name: 'requests/duration'
- aggregationType: 4
- namespace: 'microsoft.insights/components'
- metricVisualization: {
- displayName: 'Server response time'
- color: '#00BCF2'
- }
- }
- ]
- title: 'Server response time'
- visualization: {
- chartType: 2
- legendVisualization: {
- isVisible: true
- position: 2
- hideSubtitle: false
- }
- axisVisualization: {
- x: {
- isVisible: true
- axisType: 2
- }
- y: {
- isVisible: true
- axisType: 1
- }
- }
- }
- openBladeOnClick: {
- openBlade: true
- destinationBlade: {
- extensionName: 'HubsExtension'
- bladeName: 'ResourceMenuBlade'
- parameters: {
- id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- menuid: 'performance'
- }
- }
- }
- }
- }
- }
- {
- name: 'sharedTimeRange'
- isOptional: true
- }
- ]
- #disable-next-line BCP036
- type: 'Extension/HubsExtension/PartType/MonitorChartPart'
- settings: {}
- }
- }
- {
- position: {
- x: 12
- y: 2
- colSpan: 4
- rowSpan: 3
- }
- metadata: {
- inputs: [
- {
- name: 'options'
- value: {
- chart: {
- metrics: [
- {
- resourceMetadata: {
- id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- }
- name: 'browserTimings/networkDuration'
- aggregationType: 4
- namespace: 'microsoft.insights/components'
- metricVisualization: {
- displayName: 'Page load network connect time'
- color: '#7E58FF'
- }
- }
- {
- resourceMetadata: {
- id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- }
- name: 'browserTimings/processingDuration'
- aggregationType: 4
- namespace: 'microsoft.insights/components'
- metricVisualization: {
- displayName: 'Client processing time'
- color: '#44F1C8'
- }
- }
- {
- resourceMetadata: {
- id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- }
- name: 'browserTimings/sendDuration'
- aggregationType: 4
- namespace: 'microsoft.insights/components'
- metricVisualization: {
- displayName: 'Send request time'
- color: '#EB9371'
- }
- }
- {
- resourceMetadata: {
- id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- }
- name: 'browserTimings/receiveDuration'
- aggregationType: 4
- namespace: 'microsoft.insights/components'
- metricVisualization: {
- displayName: 'Receiving response time'
- color: '#0672F1'
- }
- }
- ]
- title: 'Average page load time breakdown'
- visualization: {
- chartType: 3
- legendVisualization: {
- isVisible: true
- position: 2
- hideSubtitle: false
- }
- axisVisualization: {
- x: {
- isVisible: true
- axisType: 2
- }
- y: {
- isVisible: true
- axisType: 1
- }
- }
- }
- }
- }
- }
- {
- name: 'sharedTimeRange'
- isOptional: true
- }
- ]
- #disable-next-line BCP036
- type: 'Extension/HubsExtension/PartType/MonitorChartPart'
- settings: {}
- }
- }
- {
- position: {
- x: 0
- y: 5
- colSpan: 4
- rowSpan: 3
- }
- metadata: {
- inputs: [
- {
- name: 'options'
- value: {
- chart: {
- metrics: [
- {
- resourceMetadata: {
- id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- }
- name: 'availabilityResults/availabilityPercentage'
- aggregationType: 4
- namespace: 'microsoft.insights/components'
- metricVisualization: {
- displayName: 'Availability'
- color: '#47BDF5'
- }
- }
- ]
- title: 'Average availability'
- visualization: {
- chartType: 3
- legendVisualization: {
- isVisible: true
- position: 2
- hideSubtitle: false
- }
- axisVisualization: {
- x: {
- isVisible: true
- axisType: 2
- }
- y: {
- isVisible: true
- axisType: 1
- }
- }
- }
- openBladeOnClick: {
- openBlade: true
- destinationBlade: {
- extensionName: 'HubsExtension'
- bladeName: 'ResourceMenuBlade'
- parameters: {
- id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- menuid: 'availability'
- }
- }
- }
- }
- }
- }
- {
- name: 'sharedTimeRange'
- isOptional: true
- }
- ]
- #disable-next-line BCP036
- type: 'Extension/HubsExtension/PartType/MonitorChartPart'
- settings: {}
- }
- }
- {
- position: {
- x: 4
- y: 5
- colSpan: 4
- rowSpan: 3
- }
- metadata: {
- inputs: [
- {
- name: 'options'
- value: {
- chart: {
- metrics: [
- {
- resourceMetadata: {
- id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- }
- name: 'exceptions/server'
- aggregationType: 7
- namespace: 'microsoft.insights/components'
- metricVisualization: {
- displayName: 'Server exceptions'
- color: '#47BDF5'
- }
- }
- {
- resourceMetadata: {
- id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- }
- name: 'dependencies/failed'
- aggregationType: 7
- namespace: 'microsoft.insights/components'
- metricVisualization: {
- displayName: 'Dependency failures'
- color: '#7E58FF'
- }
- }
- ]
- title: 'Server exceptions and Dependency failures'
- visualization: {
- chartType: 2
- legendVisualization: {
- isVisible: true
- position: 2
- hideSubtitle: false
- }
- axisVisualization: {
- x: {
- isVisible: true
- axisType: 2
- }
- y: {
- isVisible: true
- axisType: 1
- }
- }
- }
- }
- }
- }
- {
- name: 'sharedTimeRange'
- isOptional: true
- }
- ]
- #disable-next-line BCP036
- type: 'Extension/HubsExtension/PartType/MonitorChartPart'
- settings: {}
- }
- }
- {
- position: {
- x: 8
- y: 5
- colSpan: 4
- rowSpan: 3
- }
- metadata: {
- inputs: [
- {
- name: 'options'
- value: {
- chart: {
- metrics: [
- {
- resourceMetadata: {
- id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- }
- name: 'performanceCounters/processorCpuPercentage'
- aggregationType: 4
- namespace: 'microsoft.insights/components'
- metricVisualization: {
- displayName: 'Processor time'
- color: '#47BDF5'
- }
- }
- {
- resourceMetadata: {
- id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- }
- name: 'performanceCounters/processCpuPercentage'
- aggregationType: 4
- namespace: 'microsoft.insights/components'
- metricVisualization: {
- displayName: 'Process CPU'
- color: '#7E58FF'
- }
- }
- ]
- title: 'Average processor and process CPU utilization'
- visualization: {
- chartType: 2
- legendVisualization: {
- isVisible: true
- position: 2
- hideSubtitle: false
- }
- axisVisualization: {
- x: {
- isVisible: true
- axisType: 2
- }
- y: {
- isVisible: true
- axisType: 1
- }
- }
- }
- }
- }
- }
- {
- name: 'sharedTimeRange'
- isOptional: true
- }
- ]
- #disable-next-line BCP036
- type: 'Extension/HubsExtension/PartType/MonitorChartPart'
- settings: {}
- }
- }
- {
- position: {
- x: 12
- y: 5
- colSpan: 4
- rowSpan: 3
- }
- metadata: {
- inputs: [
- {
- name: 'options'
- value: {
- chart: {
- metrics: [
- {
- resourceMetadata: {
- id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- }
- name: 'exceptions/browser'
- aggregationType: 7
- namespace: 'microsoft.insights/components'
- metricVisualization: {
- displayName: 'Browser exceptions'
- color: '#47BDF5'
- }
- }
- ]
- title: 'Browser exceptions'
- visualization: {
- chartType: 2
- legendVisualization: {
- isVisible: true
- position: 2
- hideSubtitle: false
- }
- axisVisualization: {
- x: {
- isVisible: true
- axisType: 2
- }
- y: {
- isVisible: true
- axisType: 1
- }
- }
- }
- }
- }
- }
- {
- name: 'sharedTimeRange'
- isOptional: true
- }
- ]
- #disable-next-line BCP036
- type: 'Extension/HubsExtension/PartType/MonitorChartPart'
- settings: {}
- }
- }
- {
- position: {
- x: 0
- y: 8
- colSpan: 4
- rowSpan: 3
- }
- metadata: {
- inputs: [
- {
- name: 'options'
- value: {
- chart: {
- metrics: [
- {
- resourceMetadata: {
- id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- }
- name: 'availabilityResults/count'
- aggregationType: 7
- namespace: 'microsoft.insights/components'
- metricVisualization: {
- displayName: 'Availability test results count'
- color: '#47BDF5'
- }
- }
- ]
- title: 'Availability test results count'
- visualization: {
- chartType: 2
- legendVisualization: {
- isVisible: true
- position: 2
- hideSubtitle: false
- }
- axisVisualization: {
- x: {
- isVisible: true
- axisType: 2
- }
- y: {
- isVisible: true
- axisType: 1
- }
- }
- }
- }
- }
- }
- {
- name: 'sharedTimeRange'
- isOptional: true
- }
- ]
- #disable-next-line BCP036
- type: 'Extension/HubsExtension/PartType/MonitorChartPart'
- settings: {}
- }
- }
- {
- position: {
- x: 4
- y: 8
- colSpan: 4
- rowSpan: 3
- }
- metadata: {
- inputs: [
- {
- name: 'options'
- value: {
- chart: {
- metrics: [
- {
- resourceMetadata: {
- id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- }
- name: 'performanceCounters/processIOBytesPerSecond'
- aggregationType: 4
- namespace: 'microsoft.insights/components'
- metricVisualization: {
- displayName: 'Process IO rate'
- color: '#47BDF5'
- }
- }
- ]
- title: 'Average process I/O rate'
- visualization: {
- chartType: 2
- legendVisualization: {
- isVisible: true
- position: 2
- hideSubtitle: false
- }
- axisVisualization: {
- x: {
- isVisible: true
- axisType: 2
- }
- y: {
- isVisible: true
- axisType: 1
- }
- }
- }
- }
- }
- }
- {
- name: 'sharedTimeRange'
- isOptional: true
- }
- ]
- #disable-next-line BCP036
- type: 'Extension/HubsExtension/PartType/MonitorChartPart'
- settings: {}
- }
- }
- {
- position: {
- x: 8
- y: 8
- colSpan: 4
- rowSpan: 3
- }
- metadata: {
- inputs: [
- {
- name: 'options'
- value: {
- chart: {
- metrics: [
- {
- resourceMetadata: {
- id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- }
- name: 'performanceCounters/memoryAvailableBytes'
- aggregationType: 4
- namespace: 'microsoft.insights/components'
- metricVisualization: {
- displayName: 'Available memory'
- color: '#47BDF5'
- }
- }
- ]
- title: 'Average available memory'
- visualization: {
- chartType: 2
- legendVisualization: {
- isVisible: true
- position: 2
- hideSubtitle: false
- }
- axisVisualization: {
- x: {
- isVisible: true
- axisType: 2
- }
- y: {
- isVisible: true
- axisType: 1
- }
- }
- }
- }
- }
- }
- {
- name: 'sharedTimeRange'
- isOptional: true
- }
- ]
- #disable-next-line BCP036
- type: 'Extension/HubsExtension/PartType/MonitorChartPart'
- settings: {}
- }
- }
- ]
- }
- ]
- }
-}
diff --git a/samples/durable-functions/dotnet/PdfSummarizer/infra/shared/keyvault.bicep b/samples/durable-functions/dotnet/PdfSummarizer/infra/shared/keyvault.bicep
deleted file mode 100644
index f84f7508..00000000
--- a/samples/durable-functions/dotnet/PdfSummarizer/infra/shared/keyvault.bicep
+++ /dev/null
@@ -1,31 +0,0 @@
-param name string
-param location string = resourceGroup().location
-param tags object = {}
-
-@description('Service principal that should be granted read access to the KeyVault. If unset, no service principal is granted access by default')
-param principalId string = ''
-
-var defaultAccessPolicies = !empty(principalId) ? [
- {
- objectId: principalId
- permissions: { secrets: [ 'get', 'list' ] }
- tenantId: subscription().tenantId
- }
-] : []
-
-resource keyVault 'Microsoft.KeyVault/vaults@2022-07-01' = {
- name: name
- location: location
- tags: tags
- properties: {
- tenantId: subscription().tenantId
- sku: { family: 'A', name: 'standard' }
- enabledForTemplateDeployment: true
- accessPolicies: union(defaultAccessPolicies, [
- // define access policies here
- ])
- }
-}
-
-output endpoint string = keyVault.properties.vaultUri
-output name string = keyVault.name
diff --git a/samples/durable-functions/dotnet/PdfSummarizer/infra/shared/monitoring.bicep b/samples/durable-functions/dotnet/PdfSummarizer/infra/shared/monitoring.bicep
deleted file mode 100644
index 4ae9796c..00000000
--- a/samples/durable-functions/dotnet/PdfSummarizer/infra/shared/monitoring.bicep
+++ /dev/null
@@ -1,34 +0,0 @@
-param logAnalyticsName string
-param applicationInsightsName string
-param location string = resourceGroup().location
-param tags object = {}
-
-resource logAnalytics 'Microsoft.OperationalInsights/workspaces@2021-12-01-preview' = {
- name: logAnalyticsName
- location: location
- tags: tags
- properties: any({
- retentionInDays: 30
- features: {
- searchVersion: 1
- }
- sku: {
- name: 'PerGB2018'
- }
- })
-}
-
-resource applicationInsights 'Microsoft.Insights/components@2020-02-02' = {
- name: applicationInsightsName
- location: location
- tags: tags
- kind: 'web'
- properties: {
- Application_Type: 'web'
- WorkspaceResourceId: logAnalytics.id
- }
-}
-
-output applicationInsightsName string = applicationInsights.name
-output logAnalyticsWorkspaceId string = logAnalytics.id
-output logAnalyticsWorkspaceName string = logAnalytics.name
diff --git a/samples/durable-functions/dotnet/PdfSummarizer/infra/shared/registry.bicep b/samples/durable-functions/dotnet/PdfSummarizer/infra/shared/registry.bicep
deleted file mode 100644
index d6629f86..00000000
--- a/samples/durable-functions/dotnet/PdfSummarizer/infra/shared/registry.bicep
+++ /dev/null
@@ -1,36 +0,0 @@
-param name string
-param location string = resourceGroup().location
-param tags object = {}
-
-param adminUserEnabled bool = true
-param anonymousPullEnabled bool = false
-param dataEndpointEnabled bool = false
-param encryption object = {
- status: 'disabled'
-}
-param networkRuleBypassOptions string = 'AzureServices'
-param publicNetworkAccess string = 'Enabled'
-param sku object = {
- name: 'Standard'
-}
-param zoneRedundancy string = 'Disabled'
-
-// 2023-01-01-preview needed for anonymousPullEnabled
-resource containerRegistry 'Microsoft.ContainerRegistry/registries@2023-01-01-preview' = {
- name: name
- location: location
- tags: tags
- sku: sku
- properties: {
- adminUserEnabled: adminUserEnabled
- anonymousPullEnabled: anonymousPullEnabled
- dataEndpointEnabled: dataEndpointEnabled
- encryption: encryption
- networkRuleBypassOptions: networkRuleBypassOptions
- publicNetworkAccess: publicNetworkAccess
- zoneRedundancy: zoneRedundancy
- }
-}
-
-output loginServer string = containerRegistry.properties.loginServer
-output name string = containerRegistry.name
diff --git a/samples/durable-functions/dotnet/PdfSummarizer/pdf-summarizer-dotnet.csproj b/samples/durable-functions/dotnet/PdfSummarizer/pdf-summarizer-dotnet.csproj
deleted file mode 100644
index 9e82aabe..00000000
--- a/samples/durable-functions/dotnet/PdfSummarizer/pdf-summarizer-dotnet.csproj
+++ /dev/null
@@ -1,42 +0,0 @@
-๏ปฟ
-
- net8.0
- v4
- Exe
- enable
- enable
- pdf_summarizer_dotnet
- e72707df-797f-4b46-b0c0-ad37a3e882b3
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- PreserveNewest
-
-
- PreserveNewest
- Never
-
-
-
-
-
-
-
diff --git a/samples/durable-functions/dotnet/PdfSummarizer/scripts/deploy.ps1 b/samples/durable-functions/dotnet/PdfSummarizer/scripts/deploy.ps1
deleted file mode 100644
index 326cc9ab..00000000
--- a/samples/durable-functions/dotnet/PdfSummarizer/scripts/deploy.ps1
+++ /dev/null
@@ -1,58 +0,0 @@
-#!/usr/bin/env pwsh
-
-# Check if required commands are available
-$commands = @("azd", "az", "func", "dotnet")
-
-foreach ($cmd in $commands) {
- if (-not (Get-Command $cmd -ErrorAction SilentlyContinue)) {
- Write-Error "Error: $cmd command is not available, check pre-requisites in README.md"
- exit 1
- }
-}
-
-# Delete the bin and obj folders to get around an issue - temporary, fix is coming
-Remove-Item -Recurse -Force ./bin, ./obj
-
-# Define variables
-$functionAppPath = "."
-$zipFilePath = "./bin/publish"
-$zipFileName = "functions.zip"
-
-# Create the application zip package
-azd package --output-path "$zipFilePath/$zipFileName"
-
-# Fetch Azure environment variables using azd env get-values
-$output = azd env get-values
-
-# Use a loop to set environment variables
-$output -split "`n" | ForEach-Object {
- $line = $_.Trim()
- if ($line) {
- $name, $value = $line -split '=', 2
- $name = $name.Trim('"')
- $value = $value.Trim('"')
- [System.Environment]::SetEnvironmentVariable($name, $value)
- Write-Output "$name=$value"
- }
-}
-
-Write-Output ""
-Write-Output "Environment variables set."
-Write-Output ""
-
-# Upload the zip package to Azure Storage Blob container
-Write-Output "Uploading functions.zip to Azure Storage Blob container $env:AZURE_STORAGE_ACCOUNT_NAME/$env:AZURE_STORAGE_CONTAINER_NAME/$zipFileName..."
-az storage blob upload --account-name $env:AZURE_STORAGE_ACCOUNT_NAME --container-name $env:AZURE_STORAGE_CONTAINER_NAME --name $zipFileName --file "$zipFilePath/$zipFileName" --auth-mode login --overwrite
-
-Write-Output "Deployed functions.zip successfully to $env:AZURE_STORAGE_ACCOUNT_NAME/$env:AZURE_STORAGE_CONTAINER_NAME/$zipFileName"
-
-# Restarting the function app with new functions.zip blob
-Write-Output "Restarting the function app..."
-az functionapp restart --name $env:AZURE_FUNCTION_NAME --resource-group $env:AZURE_RESOURCE_GROUP
-
-# Purge a deleted resource (commented out)
-# az resource delete --ids /subscriptions/$env:AZURE_SUBSCRIPTION_ID/resourceGroups/$env:AZURE_RESOURCE_GROUP/providers/Microsoft.CognitiveServices/accounts/$env:AZURE_FORMRECOGNIZER_SERVICE
-# az resource delete --ids /subscriptions/$env:AZURE_SUBSCRIPTION_ID/resourceGroups/$env:AZURE_RESOURCE_GROUP/providers/Microsoft.CognitiveServices/accounts/$env:AZURE_SEARCH_SERVICE
-
-# Recover (commented out)
-# az cognitiveservices account recover --location $env:AZURE_LOCATION --name $env:AZURE_FORMRECOGNIZER_SERVICE --resource-group $env:AZURE_RESOURCE_GROUP
\ No newline at end of file
diff --git a/samples/durable-functions/dotnet/PdfSummarizer/scripts/deploy.sh b/samples/durable-functions/dotnet/PdfSummarizer/scripts/deploy.sh
deleted file mode 100755
index d10eded2..00000000
--- a/samples/durable-functions/dotnet/PdfSummarizer/scripts/deploy.sh
+++ /dev/null
@@ -1,59 +0,0 @@
-#!/bin/bash
-
-
-commands=("azd" "az" "func" "dotnet")
-
-for cmd in "${commands[@]}"; do
- if ! command -v "$cmd" &>/dev/null; then
- echo "Error: $cmd command is not available, check pre-requisites in README.md"
- exit 1
- fi
-done
-
-# delete the bin and obj folders to get around an issue - temporary, fix is coming
-rm -rf ./bin
-rm -rf ./obj
-
-# Define variables
-functionAppPath="."
-zipFilePath="./bin/publish"
-zipFileName="functions.zip"
-
-# Create the the application zip package
-azd package --output-path $zipFilePath/$zipFileName
-
-# Fetch Azure environment variables using azd env get-values
-output=$(azd env get-values)
-
-# Use a file descriptor to avoid subshell
-while IFS= read -r line; do
- name=$(echo "$line" | cut -d'=' -f1 | sed 's/^["'\'']//;s/["'\'']$//')
- value=$(echo "$line" | cut -d'=' -f2 | sed 's/^["'\'']//;s/["'\'']$//')
- export "$name=$value"
- echo "$name=$value"
-done <<< "$output"
-
-echo ""
-echo "Environment variables set."
-echo ""
-# echo "Showing environment variables with env command:"
-# env
-
-# Upload the zip package to Azure Storage Blob container
-echo "Uploading functions.zip to Azure Storage Blob container $AZURE_STORAGE_ACCOUNT_NAME/$AZURE_STORAGE_CONTAINER_NAME/$zipFileName..."
-echo "az storage blob upload --account-name $AZURE_STORAGE_ACCOUNT_NAME --container-name $AZURE_STORAGE_CONTAINER_NAME --name $zipFileName --file $zipFilePath/$zipFileName --auth-mode login --overwrite"
-az storage blob upload --account-name $AZURE_STORAGE_ACCOUNT_NAME --container-name $AZURE_STORAGE_CONTAINER_NAME --name $zipFileName --file $zipFilePath/$zipFileName --auth-mode login --overwrite
-
-echo "Deployed functions.zip successfully to $AZURE_STORAGE_ACCOUNT_NAME/$AZURE_STORAGE_CONTAINER_NAME/$zipFileName"
-
-# Restarting the function app with new functions.zip blob
-echo "Restarting the function app..."
-echo "az functionapp restart --name $AZURE_FUNCTION_NAME --resource-group $AZURE_RESOURCE_GROUP"
-az functionapp restart --name $AZURE_FUNCTION_NAME --resource-group $AZURE_RESOURCE_GROUP
-
-# Purge a deleted resource
-# az resource delete --ids /subscriptions/$AZURE_SUBSCRIPTION_ID/resourceGroups/$AZURE_RESOURCE_GROUP/providers/Microsoft.CognitiveServices/accounts/$AZURE_FORMRECOGNIZER_SERVICE
-# az resource delete --ids /subscriptions/$AZURE_SUBSCRIPTION_ID/resourceGroups/$AZURE_RESOURCE_GROUP/providers/Microsoft.CognitiveServices/accounts/$AZURE_SEARCH_SERVICE
-
-# recover
-# az cognitiveservices account recover --location $AZURE_LOCATION --name $AZURE_FORMRECOGNIZER_SERVICE --resource-group $AZURE_RESOURCE_GROUP
\ No newline at end of file
diff --git a/samples/durable-functions/javascript/CustomExceptionPropertyProvider/README.md b/samples/durable-functions/javascript/CustomExceptionPropertyProvider/README.md
index bd62d0f4..c1277aec 100644
--- a/samples/durable-functions/javascript/CustomExceptionPropertyProvider/README.md
+++ b/samples/durable-functions/javascript/CustomExceptionPropertyProvider/README.md
@@ -1,4 +1,4 @@
-# Custom Exception Property Provider โ Durable Functions JavaScript
+# Custom Exception Property Provider - Durable Functions JavaScript
JavaScript | Durable Functions
@@ -10,7 +10,7 @@ An activity throws a `BusinessValidationException` carrying structured fields (s
## Prerequisites
-1. [Node.js 18+](https://nodejs.org/) (use Node 22 LTS; the Functions host does not yet support Node 24)
+1. [Node.js 22](https://nodejs.org/). Azure Functions v4 also supports Node.js 24; Node.js 22 is the last version supported on the classic Linux Consumption plan. See [supported languages](https://learn.microsoft.com/azure/azure-functions/functions-versions#languages).
2. [Azure Functions Core Tools v4](https://learn.microsoft.com/azure/azure-functions/functions-run-local)
3. [Docker](https://www.docker.com/products/docker-desktop/) (for the emulator)
@@ -70,7 +70,7 @@ The orchestration returns the caught `failureDetails`, whose `properties` carry
- `df.app.setExceptionPropertiesProvider({ getExceptionProperties(error) { ... } })` registers a global provider once at app startup.
- `businessActivity` throws a `BusinessValidationException` carrying the structured fields.
-- `orchestrationWithCustomException` calls the activity, catches the propagated `TaskFailedError`, and returns `e.failureDetails` โ including the custom `properties`.
+- `orchestrationWithCustomException` calls the activity, catches the propagated `TaskFailedError`, and returns `e.failureDetails`, including the custom `properties`.
## Learn More
diff --git a/samples/durable-functions/python/agent-directed-workflows/host.json b/samples/durable-functions/python/agent-directed-workflows/host.json
index a1239c05..c14a196f 100644
--- a/samples/durable-functions/python/agent-directed-workflows/host.json
+++ b/samples/durable-functions/python/agent-directed-workflows/host.json
@@ -18,7 +18,7 @@
}
},
"extensionBundle": {
- "id": "Microsoft.Azure.Functions.ExtensionBundle.Preview",
- "version": "[4.29.0, 5.0.0)"
+ "id": "Microsoft.Azure.Functions.ExtensionBundle",
+ "version": "[4.32.0, 5.0.0)"
}
}
diff --git a/samples/durable-functions/python/pdf-summarizer/.gitignore b/samples/durable-functions/python/pdf-summarizer/.gitignore
deleted file mode 100644
index 4b3d3190..00000000
--- a/samples/durable-functions/python/pdf-summarizer/.gitignore
+++ /dev/null
@@ -1,266 +0,0 @@
-## Ignore Visual Studio temporary files, build results, and
-## files generated by popular Visual Studio add-ons.
-
-.DS_Store
-
-# Azure Functions localsettings file
-local.settings.json
-
-# User-specific files
-*.suo
-*.user
-*.userosscache
-*.sln.docstates
-
-# User-specific files (MonoDevelop/Xamarin Studio)
-*.userprefs
-
-# Build results
-[Dd]ebug/
-[Dd]ebugPublic/
-[Rr]elease/
-[Rr]eleases/
-x64/
-x86/
-bld/
-[Bb]in/
-[Oo]bj/
-[Ll]og/
-
-# Visual Studio 2015 cache/options directory
-.vs/
-# Uncomment if you have tasks that create the project's static files in wwwroot
-#wwwroot/
-
-# MSTest test Results
-[Tt]est[Rr]esult*/
-[Bb]uild[Ll]og.*
-
-# NUNIT
-*.VisualState.xml
-TestResult.xml
-
-# Build Results of an ATL Project
-[Dd]ebugPS/
-[Rr]eleasePS/
-dlldata.c
-
-# DNX
-project.lock.json
-project.fragment.lock.json
-artifacts/
-
-*_i.c
-*_p.c
-*_i.h
-*.ilk
-*.meta
-*.obj
-*.pch
-*.pdb
-*.pgc
-*.pgd
-*.rsp
-*.sbr
-*.tlb
-*.tli
-*.tlh
-*.tmp
-*.tmp_proj
-*.log
-*.vspscc
-*.vssscc
-.builds
-*.pidb
-*.svclog
-*.scc
-
-# Chutzpah Test files
-_Chutzpah*
-
-# Visual C++ cache files
-ipch/
-*.aps
-*.ncb
-*.opendb
-*.opensdf
-*.sdf
-*.cachefile
-*.VC.db
-*.VC.VC.opendb
-
-# Visual Studio profiler
-*.psess
-*.vsp
-*.vspx
-*.sap
-
-# TFS 2012 Local Workspace
-$tf/
-
-# Guidance Automation Toolkit
-*.gpState
-
-# ReSharper is a .NET coding add-in
-_ReSharper*/
-*.[Rr]e[Ss]harper
-*.DotSettings.user
-
-# JustCode is a .NET coding add-in
-.JustCode
-
-# TeamCity is a build add-in
-_TeamCity*
-
-# DotCover is a Code Coverage Tool
-*.dotCover
-
-# NCrunch
-_NCrunch_*
-.*crunch*.local.xml
-nCrunchTemp_*
-
-# MightyMoose
-*.mm.*
-AutoTest.Net/
-
-# Web workbench (sass)
-.sass-cache/
-
-# Installshield output folder
-[Ee]xpress/
-
-# DocProject is a documentation generator add-in
-DocProject/buildhelp/
-DocProject/Help/*.HxT
-DocProject/Help/*.HxC
-DocProject/Help/*.hhc
-DocProject/Help/*.hhk
-DocProject/Help/*.hhp
-DocProject/Help/Html2
-DocProject/Help/html
-
-# Click-Once directory
-publish/
-
-# Publish Web Output
-*.[Pp]ublish.xml
-*.azurePubxml
-# TODO: Comment the next line if you want to checkin your web deploy settings
-# but database connection strings (with potential passwords) will be unencrypted
-#*.pubxml
-*.publishproj
-
-# Microsoft Azure Web App publish settings. Comment the next line if you want to
-# checkin your Azure Web App publish settings, but sensitive information contained
-# in these scripts will be unencrypted
-PublishScripts/
-
-# NuGet Packages
-*.nupkg
-# The packages folder can be ignored because of Package Restore
-**/packages/*
-# except build/, which is used as an MSBuild target.
-!**/packages/build/
-# Uncomment if necessary however generally it will be regenerated when needed
-#!**/packages/repositories.config
-# NuGet v3's project.json files produces more ignoreable files
-*.nuget.props
-*.nuget.targets
-
-# Microsoft Azure Build Output
-csx/
-*.build.csdef
-
-# Microsoft Azure Emulator
-ecf/
-rcf/
-
-# Windows Store app package directories and files
-AppPackages/
-BundleArtifacts/
-Package.StoreAssociation.xml
-_pkginfo.txt
-
-# Visual Studio cache files
-# files ending in .cache can be ignored
-*.[Cc]ache
-# but keep track of directories ending in .cache
-!*.[Cc]ache/
-
-# Others
-ClientBin/
-~$*
-*~
-*.dbmdl
-*.dbproj.schemaview
-*.jfm
-*.pfx
-*.publishsettings
-node_modules/
-orleans.codegen.cs
-
-# Since there are multiple workflows, uncomment next line to ignore bower_components
-# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
-#bower_components/
-
-# RIA/Silverlight projects
-Generated_Code/
-
-# Backup & report files from converting an old project file
-# to a newer Visual Studio version. Backup files are not needed,
-# because we have git ;-)
-_UpgradeReport_Files/
-Backup*/
-UpgradeLog*.XML
-UpgradeLog*.htm
-
-# SQL Server files
-*.mdf
-*.ldf
-
-# Business Intelligence projects
-*.rdl.data
-*.bim.layout
-*.bim_*.settings
-
-# Microsoft Fakes
-FakesAssemblies/
-
-# GhostDoc plugin setting file
-*.GhostDoc.xml
-
-# Node.js Tools for Visual Studio
-.ntvs_analysis.dat
-
-# Visual Studio 6 build log
-*.plg
-
-# Visual Studio 6 workspace options file
-*.opt
-
-# Visual Studio LightSwitch build output
-**/*.HTMLClient/GeneratedArtifacts
-**/*.DesktopClient/GeneratedArtifacts
-**/*.DesktopClient/ModelManifest.xml
-**/*.Server/GeneratedArtifacts
-**/*.Server/ModelManifest.xml
-_Pvt_Extensions
-
-# Paket dependency manager
-.paket/paket.exe
-paket-files/
-
-# FAKE - F# Make
-.fake/
-
-# JetBrains Rider
-.idea/
-*.sln.iml
-
-# CodeRush
-.cr/
-
-# Python Tools for Visual Studio (PTVS)
-__pycache__/
-*.pyc
\ No newline at end of file
diff --git a/samples/durable-functions/python/pdf-summarizer/README.md b/samples/durable-functions/python/pdf-summarizer/README.md
deleted file mode 100644
index 86066668..00000000
--- a/samples/durable-functions/python/pdf-summarizer/README.md
+++ /dev/null
@@ -1,125 +0,0 @@
-# Intelligent PDF Summarizer - Python
-The purpose of this sample application is to demonstrate how Durable Functions can be leveraged to create intelligent applications, particularly in a document processing scenario. Order and durability are key here because the results from one activity are passed to the next. Also, calls to services like Cognitive Service or LLMs are costly and should not be repeated in the event of failures.
-
-This sample integrates various Azure services, including the new Durable Task Scheduler for Azure Durable Functions, Azure Storage, Azure Cognitive Services, and Azure Open AI.
-
-The application showcases how PDFs can be ingested and intelligently scanned to determine their content.
-
-
-
-The application's workflow is as follows:
-1. PDFs are uploaded to a blob storage input container.
-2. A durable function is triggered upon blob upload.
-3. The Durable Task Scheduler for Azure Durable Functions schedules an orchestration that:
-- - Downloads the blob (PDF).
-- - Utilizes the Azure Cognitive Service Form Recognizer endpoint to extract the text from the PDF.
-- - Sends the extracted text to Azure Open AI to analyze and determine the content of the PDF.
-- - Save the summary results from Azure Open AI to a new file and upload it to the output blob container.
-
-This sample uses **managed identity** for all Azure service connections and does **not** require public access to the storage account, making it compliant with enterprise security policies.
-
-## Prerequisites
-
-1. [Python 3.9+](https://www.python.org/downloads/)
-2. [Create an active Azure subscription](https://learn.microsoft.com/en-us/azure/guides/developer/azure-developer-guide#understanding-accounts-subscriptions-and-billing).
-3. [Install the latest Azure Functions Core Tools to use the CLI](https://learn.microsoft.com/en-us/azure/azure-functions/functions-run-local)
-4. [Install Azure Developer CLI (azd)](https://aka.ms/azd) for deployment
-
-## Deploy the app to Azure
-
-The recommended way to get started is to deploy the app to Azure first using `azd`, which will provision all required Azure resources. After deployment, you can optionally run and test the app locally.
-
-Use the [Azure Developer CLI (`azd`)](https://aka.ms/azd) to deploy the app. This will provision all necessary Azure services including:
-- Durable Task Scheduler with taskhub
-- Storage Account (with managed identity access, no public access required)
-- Azure OpenAI
-- Azure Cognitive Services (Document Intelligence)
-- Function App with managed identity
-
-1. In the root of the project, run the following command to provision and deploy the app:
-
- ```bash
- azd up
- ```
-
-2. When prompted, provide:
- - A name for your [Azure Developer CLI environment](https://learn.microsoft.com/en-us/azure/developer/azure-developer-cli/faq#what-is-an-environment-name).
- - The Azure subscription you'd like to use.
- - The Azure location to use.
-
- > **Note:** At the moment, the Durable Task Scheduler can only be deployed to `West US2` and `NorthCentral US`. Unfortunately, the AZD CLI does not support `North Central US` and Azure Open AI does not support `West US2`. The best way to navigate discrepancies is to select `West US2` as your AZD location and hardcode the `openAi` module location to a region like `East US2`.
-
-Once the azd up command finishes, the app will have successfully provisioned and deployed.
-
-## Running the app locally (Optional)
-
-If you want to run the app locally after deploying to Azure, follow these steps:
-
-### Prerequisites for local development
-- [Start and configure an Azurite storage emulator for local storage](https://learn.microsoft.com/azure/storage/common/storage-use-azurite).
-
-### local.settings.json
-You will need to configure a `local.settings.json` file at the root of the repo that looks similar to the below. After running `azd up`, you can retrieve these values from the Azure portal or by running `azd env get-values`.
-
-```json
-{
- "Values": {
- "AzureWebJobsStorage": "UseDevelopmentStorage=true",
- "AzureWebJobsFeatureFlags": "EnableWorkerIndexing",
- "FUNCTIONS_WORKER_RUNTIME": "python",
- "DURABLE_TASK_SCHEDULER_CONNECTION_STRING": "Endpoint=;Authentication=DefaultAzure",
- "TASKHUB_NAME": "",
- "STORAGE_ACCOUNT_NAME": "",
- "COGNITIVE_SERVICES_ENDPOINT": "",
- "AZURE_OPENAI_ENDPOINT": "",
- "CHAT_MODEL_DEPLOYMENT_NAME": ""
- }
-}
-```
-
-### Running locally
-
-1. Start Azurite: Begin by starting Azurite, the local Azure Storage emulator.
-
-2. Install the Requirements: Open your terminal and run the following command to install the necessary packages:
-
- ```bash
- python3 -m pip install -r requirements.txt
- ```
-
-3. Install the Durable Task Scheduler Extension Packages: Execute the following commands to install the required Durable Task Scheduler extension packages:
-
- ```bash
- func extensions install --package Microsoft.Azure.WebJobs.Extensions.DurableTask.AzureManaged --version 0.3.0-alpha
- ```
-
- ```bash
- func extensions install --package Microsoft.Azure.WebJobs.Extensions.DurableTask --version 2.13.7
- ```
-
-4. Start the Function App: Start the function app to run the application locally.
-
- ```bash
- func start --verbose
- ```
-
-## Inspect the code
-
-This app leverages Durable Functions to orchestrate the application workflow. By using Durable Functions, there's no need for additional infrastructure like queues and state stores to manage task coordination and durability, which significantly reduces the complexity for developers.
-
-Take a look at the code snippet below, the `process_document` defines the entire workflow, which consists of a series of steps (activities) that need to be scheduled in sequence. Coordination is key, as the output of one activity is passed as an input to the next. Additionally, Durable Functions handle durability and retries, which ensure that if a failure occurs, such as a transient error or an issue with a dependent service, the workflow can recover gracefully.
-
-
-
-## Using the app
-To use the app, simply upload a PDF to the Blob Storage `input` container. You can use [Azure Storage Explorer](https://azure.microsoft.com/features/storage-explorer/) to connect to your storage account using your Azure AD credentials (no connection strings or SAS tokens required). Once the PDF is uploaded, it will be processed using document intelligence and Azure OpenAI. The resulting summary will be saved to a new file and uploaded to the `output` container.
-
-### Review Execution History in the Durable Task Scheduler Dashboard
-Since the application leverages the Durable Task Scheduler backend storage provider for Durable Functions, all orchestration executions are persisted and can be viewed in the monitoring and management dashboard.
-
-
-
-This dashboard enables you to monitor the status of ongoing and failed orchestrations, and troubleshoot any issues causing orchestrations to fail or become "stuck." It also displays the outputs from each activity execution. Additionally, you can use the timeline and sequence diagrams to gain insights into the orchestration execution, including the duration of each activity.
-
-
-
diff --git a/samples/durable-functions/python/pdf-summarizer/azure.yaml b/samples/durable-functions/python/pdf-summarizer/azure.yaml
deleted file mode 100644
index 61f62853..00000000
--- a/samples/durable-functions/python/pdf-summarizer/azure.yaml
+++ /dev/null
@@ -1,10 +0,0 @@
-# yaml-language-server: $schema=https://raw.githubusercontent.com/Azure/azure-dev/main/schemas/v1.0/azure.yaml.json
-
-name: functions-app
-metadata:
- template: azd-init@1.10.1
-services:
- function-app:
- project: ./
- language: python
- host: function
diff --git a/samples/durable-functions/python/pdf-summarizer/function_app.py b/samples/durable-functions/python/pdf-summarizer/function_app.py
deleted file mode 100644
index 77c2786f..00000000
--- a/samples/durable-functions/python/pdf-summarizer/function_app.py
+++ /dev/null
@@ -1,98 +0,0 @@
-import logging
-import os
-from azure.storage.blob import BlobServiceClient
-import azure.functions as func
-import azure.durable_functions as df
-from azure.identity import DefaultAzureCredential
-from azure.ai.formrecognizer import DocumentAnalysisClient
-import json
-import time
-from requests import get, post
-import requests
-from datetime import datetime
-
-my_app = df.DFApp(http_auth_level=func.AuthLevel.ANONYMOUS)
-
-# Use managed identity to access blob storage
-credential = DefaultAzureCredential()
-storage_account_name = os.environ.get("STORAGE_ACCOUNT_NAME")
-if not storage_account_name:
- raise ValueError("STORAGE_ACCOUNT_NAME environment variable is required but not set")
-
-blob_service_client = BlobServiceClient(
- account_url=f"https://{storage_account_name}.blob.core.windows.net",
- credential=credential
-)
-
-@my_app.blob_trigger(arg_name="myblob", path="input", connection="AzureWebJobsStorage")
-@my_app.durable_client_input(client_name="client")
-async def blob_trigger(myblob: func.InputStream, client):
- logging.info(f"Python blob trigger function processed blob"
- f"Name: {myblob.name}"
- f"Blob Size: {myblob.length} bytes")
-
- blobName = myblob.name.split("/")[1]
- await client.start_new("process_document", client_input=blobName)
-
-# Orchestrator
-@my_app.orchestration_trigger(context_name="context")
-def process_document(context):
- blobName: str = context.get_input()
-
- first_retry_interval_in_milliseconds = 5000
- max_number_of_attempts = 3
- retry_options = df.RetryOptions(first_retry_interval_in_milliseconds, max_number_of_attempts)
-
- # Download the PDF from Blob Storage and use Document Intelligence Form Recognizer to analyze its contents.
- result = yield context.call_activity_with_retry("analyze_pdf", retry_options, blobName)
- # Send the analyzed contents to Azure OpenAI to generate a summary.
- result2 = yield context.call_activity_with_retry("summarize_text", retry_options, result)
- # Save the summary to a new file and upload it back to storage.
- result3 = yield context.call_activity_with_retry("write_doc", retry_options, { "blobName": blobName, "summary": result2 })
-
- return logging.info(f"Successfully uploaded summary to {result3}")
-
-@my_app.activity_trigger(input_name='blobName')
-def analyze_pdf(blobName):
- logging.info(f"in analyze_text activity")
- global blob_service_client
- container_client = blob_service_client.get_container_client("input")
- blob_client = container_client.get_blob_client(blobName)
- blob = blob_client.download_blob().read()
- doc = ''
-
- endpoint = os.environ["COGNITIVE_SERVICES_ENDPOINT"]
- credential = DefaultAzureCredential()
-
- document_analysis_client = DocumentAnalysisClient(endpoint, credential)
-
- poller = document_analysis_client.begin_analyze_document("prebuilt-layout", document=blob, locale="en-US")
- result = poller.result().pages
-
- for page in result:
- for line in page.lines:
- doc += line.content
-
- return doc
-
-@my_app.activity_trigger(input_name='results')
-@my_app.generic_input_binding(arg_name="response", type="textCompletion", data_type=func.DataType.STRING, prompt="Can you explain what the following text is about? {results}", model = "%CHAT_MODEL_DEPLOYMENT_NAME%")
-def summarize_text(results, response: str):
- logging.info(f"in summarize_text activity")
- response_json = json.loads(response)
- logging.info(response_json['content'])
- return response_json
-
-@my_app.activity_trigger(input_name='results')
-def write_doc(results):
- logging.info(f"in write_doc activity")
- global blob_service_client
- container_client=blob_service_client.get_container_client("output")
-
- summary = results['blobName'] + "-" + str(datetime.now())
- sanitizedSummary = summary.replace(".", "-")
- fileName = sanitizedSummary + ".txt"
-
- logging.info("uploading to blob" + results['summary']['content'])
- container_client.upload_blob(name=fileName, data=results['summary']['content'])
- return str(summary + ".txt")
diff --git a/samples/durable-functions/python/pdf-summarizer/host.json b/samples/durable-functions/python/pdf-summarizer/host.json
deleted file mode 100644
index b7dd3254..00000000
--- a/samples/durable-functions/python/pdf-summarizer/host.json
+++ /dev/null
@@ -1,25 +0,0 @@
-{
- "version": "2.0",
- "logging": {
- "applicationInsights": {
- "samplingSettings": {
- "isEnabled": true,
- "excludedTypes": "Request,Error"
- }
- }
- },
- "extensions": {
- "durableTask": {
- "storageProvider": {
- "type": "azureManaged",
- "connectionStringName": "DURABLE_TASK_SCHEDULER_CONNECTION_STRING"
- },
- "hubName": "TASKHUB_NAME"
- }
- },
- "extensionBundle": {
- "id": "Microsoft.Azure.Functions.ExtensionBundle.Preview",
- "version": "[4.29.0, 5.0.0)"
- }
-}
-
diff --git a/samples/durable-functions/python/pdf-summarizer/infra/abbreviations.json b/samples/durable-functions/python/pdf-summarizer/infra/abbreviations.json
deleted file mode 100644
index 545600f0..00000000
--- a/samples/durable-functions/python/pdf-summarizer/infra/abbreviations.json
+++ /dev/null
@@ -1,138 +0,0 @@
-{
- "analysisServicesServers": "as",
- "apiManagementService": "apim-",
- "appConfigurationConfigurationStores": "appcs-",
- "appManagedEnvironments": "cae-",
- "appContainerApps": "ca-",
- "authorizationPolicyDefinitions": "policy-",
- "automationAutomationAccounts": "aa-",
- "blueprintBlueprints": "bp-",
- "blueprintBlueprintsArtifacts": "bpa-",
- "cacheRedis": "redis-",
- "cdnProfiles": "cdnp-",
- "cdnProfilesEndpoints": "cdne-",
- "cognitiveServicesAccounts": "cog-",
- "cognitiveServicesFormRecognizer": "cog-fr-",
- "cognitiveServicesTextAnalytics": "cog-ta-",
- "cognitiveServicesDocumentIntelligence": "cog-di-",
- "computeAvailabilitySets": "avail-",
- "computeCloudServices": "cld-",
- "computeDiskEncryptionSets": "des",
- "computeDisks": "disk",
- "computeDisksOs": "osdisk",
- "computeGalleries": "gal",
- "computeSnapshots": "snap-",
- "computeVirtualMachines": "vm",
- "computeVirtualMachineScaleSets": "vmss-",
- "containerInstanceContainerGroups": "ci",
- "containerRegistryRegistries": "cr",
- "containerServiceManagedClusters": "aks-",
- "databricksWorkspaces": "dbw-",
- "dataFactoryFactories": "adf-",
- "dataLakeAnalyticsAccounts": "dla",
- "dataLakeStoreAccounts": "dls",
- "dataMigrationServices": "dms-",
- "dBforMySQLServers": "mysql-",
- "dBforPostgreSQLServers": "psql-",
- "devicesIotHubs": "iot-",
- "devicesProvisioningServices": "provs-",
- "devicesProvisioningServicesCertificates": "pcert-",
- "documentDBDatabaseAccounts": "cosmos-",
- "eventGridDomains": "evgd-",
- "eventGridDomainsTopics": "evgt-",
- "eventGridEventSubscriptions": "evgs-",
- "eventHubNamespaces": "evhns-",
- "eventHubNamespacesEventHubs": "evh-",
- "hdInsightClustersHadoop": "hadoop-",
- "hdInsightClustersHbase": "hbase-",
- "hdInsightClustersKafka": "kafka-",
- "hdInsightClustersMl": "mls-",
- "hdInsightClustersSpark": "spark-",
- "hdInsightClustersStorm": "storm-",
- "hybridComputeMachines": "arcs-",
- "insightsActionGroups": "ag-",
- "insightsComponents": "appi-",
- "keyVaultVaults": "kv-",
- "kubernetesConnectedClusters": "arck",
- "kustoClusters": "dec",
- "kustoClustersDatabases": "dedb",
- "logicIntegrationAccounts": "ia-",
- "logicWorkflows": "logic-",
- "machineLearningServicesWorkspaces": "mlw-",
- "managedIdentityUserAssignedIdentities": "id-",
- "managementManagementGroups": "mg-",
- "migrateAssessmentProjects": "migr-",
- "networkApplicationGateways": "agw-",
- "networkApplicationSecurityGroups": "asg-",
- "networkAzureFirewalls": "afw-",
- "networkBastionHosts": "bas-",
- "networkConnections": "con-",
- "networkDnsZones": "dnsz-",
- "networkExpressRouteCircuits": "erc-",
- "networkFirewallPolicies": "afwp-",
- "networkFirewallPoliciesWebApplication": "waf",
- "networkFirewallPoliciesRuleGroups": "wafrg",
- "networkFrontDoors": "fd-",
- "networkFrontdoorWebApplicationFirewallPolicies": "fdfp-",
- "networkLoadBalancersExternal": "lbe-",
- "networkLoadBalancersInternal": "lbi-",
- "networkLoadBalancersInboundNatRules": "rule-",
- "networkLocalNetworkGateways": "lgw-",
- "networkNatGateways": "ng-",
- "networkNetworkInterfaces": "nic-",
- "networkNetworkSecurityGroups": "nsg-",
- "networkNetworkSecurityGroupsSecurityRules": "nsgsr-",
- "networkNetworkWatchers": "nw-",
- "networkPrivateDnsZones": "pdnsz-",
- "networkPrivateLinkServices": "pl-",
- "networkPublicIPAddresses": "pip-",
- "networkPublicIPPrefixes": "ippre-",
- "networkRouteFilters": "rf-",
- "networkRouteTables": "rt-",
- "networkRouteTablesRoutes": "udr-",
- "networkTrafficManagerProfiles": "traf-",
- "networkVirtualNetworkGateways": "vgw-",
- "networkVirtualNetworks": "vnet-",
- "networkVirtualNetworksSubnets": "snet-",
- "networkVirtualNetworksVirtualNetworkPeerings": "peer-",
- "networkVirtualWans": "vwan-",
- "networkVpnGateways": "vpng-",
- "networkVpnGatewaysVpnConnections": "vcn-",
- "networkVpnGatewaysVpnSites": "vst-",
- "notificationHubsNamespaces": "ntfns-",
- "notificationHubsNamespacesNotificationHubs": "ntf-",
- "operationalInsightsWorkspaces": "log-",
- "portalDashboards": "dash-",
- "powerBIDedicatedCapacities": "pbi-",
- "purviewAccounts": "pview-",
- "recoveryServicesVaults": "rsv-",
- "resourcesResourceGroups": "rg-",
- "searchSearchServices": "srch-",
- "serviceBusNamespaces": "sb-",
- "serviceBusNamespacesQueues": "sbq-",
- "serviceBusNamespacesTopics": "sbt-",
- "serviceEndPointPolicies": "se-",
- "serviceFabricClusters": "sf-",
- "signalRServiceSignalR": "sigr",
- "sqlManagedInstances": "sqlmi-",
- "sqlServers": "sql-",
- "sqlServersDataWarehouse": "sqldw-",
- "sqlServersDatabases": "sqldb-",
- "sqlServersDatabasesStretch": "sqlstrdb-",
- "storageStorageAccounts": "st",
- "storageStorageAccountsVm": "stvm",
- "storSimpleManagers": "ssimp",
- "streamAnalyticsCluster": "asa-",
- "synapseWorkspaces": "syn",
- "synapseWorkspacesAnalyticsWorkspaces": "synw",
- "synapseWorkspacesSqlPoolsDedicated": "syndp",
- "synapseWorkspacesSqlPoolsSpark": "synsp",
- "timeSeriesInsightsEnvironments": "tsi-",
- "webServerFarms": "plan-",
- "webSitesAppService": "app-",
- "webSitesAppServiceEnvironment": "ase-",
- "webSitesFunctions": "func-",
- "webStaticSites": "stapp-",
- "dts": "dts-",
- "taskhub": "taskhub-"
-}
\ No newline at end of file
diff --git a/samples/durable-functions/python/pdf-summarizer/infra/app/documentintelligence-Access.bicep b/samples/durable-functions/python/pdf-summarizer/infra/app/documentintelligence-Access.bicep
deleted file mode 100644
index 0b30cfd3..00000000
--- a/samples/durable-functions/python/pdf-summarizer/infra/app/documentintelligence-Access.bicep
+++ /dev/null
@@ -1,21 +0,0 @@
-metadata description = 'Creates a role assignment for a service principal.'
-param principalId string
-
-@allowed([
- 'Device'
- 'ForeignGroup'
- 'Group'
- 'ServicePrincipal'
- 'User'
-])
-param principalType string = 'ServicePrincipal'
-param roleDefinitionId string
-
-resource role 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
- name: guid(subscription().id, resourceGroup().id, principalId, roleDefinitionId)
- properties: {
- principalId: principalId
- principalType: principalType
- roleDefinitionId: resourceId('Microsoft.Authorization/roleDefinitions', roleDefinitionId)
- }
-}
diff --git a/samples/durable-functions/python/pdf-summarizer/infra/app/dts-Access.bicep b/samples/durable-functions/python/pdf-summarizer/infra/app/dts-Access.bicep
deleted file mode 100644
index a0935bf1..00000000
--- a/samples/durable-functions/python/pdf-summarizer/infra/app/dts-Access.bicep
+++ /dev/null
@@ -1,18 +0,0 @@
-param principalID string
-param roleDefinitionID string
-param dtsName string
-param principalType string
-
-resource dts 'Microsoft.DurableTask/schedulers@2025-11-01' existing = {
- name: dtsName
-}
-
-resource dtsRoleAssignment 'Microsoft.Authorization/roleAssignments@2020-04-01-preview' = {
- name: guid(dts.id, principalID, roleDefinitionID )
- scope: dts
- properties: {
- roleDefinitionId: resourceId('Microsoft.Authorization/roleDefinitions', roleDefinitionID )
- principalId: principalID
- principalType: principalType
- }
-}
diff --git a/samples/durable-functions/python/pdf-summarizer/infra/app/dts.bicep b/samples/durable-functions/python/pdf-summarizer/infra/app/dts.bicep
deleted file mode 100644
index 6280e5a4..00000000
--- a/samples/durable-functions/python/pdf-summarizer/infra/app/dts.bicep
+++ /dev/null
@@ -1,31 +0,0 @@
-param ipAllowlist array
-param location string
-param tags object = {}
-param name string
-param taskhubname string
-param skuName string
-param skuCapacity int = 0
-
-resource dts 'Microsoft.DurableTask/schedulers@2025-11-01' = {
- location: location
- tags: tags
- name: name
- properties: {
- ipAllowlist: ipAllowlist
- sku: skuName == 'Dedicated' ? {
- name: skuName
- capacity: skuCapacity
- } : {
- name: skuName
- }
- }
-}
-
-resource taskhub 'Microsoft.DurableTask/schedulers/taskhubs@2025-11-01' = {
- parent: dts
- name: taskhubname
-}
-
-output dts_NAME string = dts.name
-output dts_URL string = dts.properties.endpoint
-output TASKHUB_NAME string = taskhub.name
diff --git a/samples/durable-functions/python/pdf-summarizer/infra/app/durable-function.bicep b/samples/durable-functions/python/pdf-summarizer/infra/app/durable-function.bicep
deleted file mode 100644
index e01de2b5..00000000
--- a/samples/durable-functions/python/pdf-summarizer/infra/app/durable-function.bicep
+++ /dev/null
@@ -1,54 +0,0 @@
-param name string
-param location string = resourceGroup().location
-param tags object = {}
-param applicationInsightsName string = ''
-param appServicePlanId string
-param appSettings object = {}
-param runtimeName string
-param runtimeVersion string
-param serviceName string = 'function-app'
-param storageAccountName string
-param virtualNetworkSubnetId string = ''
-param identityId string = ''
-param identityClientId string = ''
-param dtsURL string = ''
-param taskHubName string = ''
-param azureOpenaiService string
-param documentIntelligenceEndpoint string
-
-var applicationInsightsIdentity = 'ClientId=${identityClientId};Authorization=AAD'
-
-
-module durableFunction '../core/host/functions.bicep' = {
- name: '${serviceName}-functions-module'
- params: {
- name: name
- location: location
- tags: union(tags, { 'azd-service-name': serviceName })
- identityType: 'UserAssigned'
- identityId: identityId
- appSettings: union(appSettings,
- {
- AzureWebJobsStorage__clientId : identityClientId
- AzureWebJobsStorage__credential : 'managedidentity'
- APPLICATIONINSIGHTS_AUTHENTICATION_STRING: applicationInsightsIdentity
- DURABLE_TASK_SCHEDULER_CONNECTION_STRING: 'Endpoint=${dtsURL};Authentication=ManagedIdentity;ClientID=${identityClientId}'
- TASKHUB_NAME: taskHubName
- AZURE_CLIENT_ID: identityClientId
- STORAGE_ACCOUNT_NAME: storageAccountName
- })
- documentIntelligenceEndpoint: documentIntelligenceEndpoint
- azureOpenaiService: azureOpenaiService
- applicationInsightsName: applicationInsightsName
- appServicePlanId: appServicePlanId
- runtimeName: runtimeName
- runtimeVersion: runtimeVersion
- storageAccountName: storageAccountName
- storageManagedIdentity: true
- // deploymentStorageContainerName: deploymentStorageContainerName
- virtualNetworkSubnetId: virtualNetworkSubnetId
- }
-}
-
-output SERVICE_DURABLE_FUNCTION_NAME string = durableFunction.outputs.name
-output SERVICE_API_IDENTITY_PRINCIPAL_ID string = durableFunction.outputs.identityPrincipalId
diff --git a/samples/durable-functions/python/pdf-summarizer/infra/app/openai-Access.bicep b/samples/durable-functions/python/pdf-summarizer/infra/app/openai-Access.bicep
deleted file mode 100644
index d3fb68f4..00000000
--- a/samples/durable-functions/python/pdf-summarizer/infra/app/openai-Access.bicep
+++ /dev/null
@@ -1,17 +0,0 @@
-param principalId string
-param roleDefinitionIds array
-param openAiAccountResourceName string
-
-resource account 'Microsoft.CognitiveServices/accounts@2023-05-01' existing = {
- name: openAiAccountResourceName
-}
-
-resource role 'Microsoft.Authorization/roleAssignments@2022-04-01' = [for roleDefinitionId in roleDefinitionIds: {
- name: guid(subscription().id, resourceGroup().id, principalId, roleDefinitionId)
- scope: account
- properties: {
- principalId: principalId
- principalType: 'ServicePrincipal'
- roleDefinitionId: resourceId('Microsoft.Authorization/roleDefinitions', roleDefinitionId)
- }
-}]
diff --git a/samples/durable-functions/python/pdf-summarizer/infra/app/storage-Access.bicep b/samples/durable-functions/python/pdf-summarizer/infra/app/storage-Access.bicep
deleted file mode 100644
index 498b501d..00000000
--- a/samples/durable-functions/python/pdf-summarizer/infra/app/storage-Access.bicep
+++ /dev/null
@@ -1,21 +0,0 @@
-param principalID string
-param roleDefinitionID string
-param storageAccountName string
-param principalType string = 'ServicePrincipal' // Workaround for https://learn.microsoft.com/en-us/azure/role-based-access-control/role-assignments-template#new-service-principal
-
-resource storageAccount 'Microsoft.Storage/storageAccounts@2021-09-01' existing = {
- name: storageAccountName
-}
-
-// Allow access from API to storage account using a managed identity and least priv Storage roles
-resource storageRoleAssignment 'Microsoft.Authorization/roleAssignments@2020-04-01-preview' = {
- name: guid(storageAccount.id, principalID, roleDefinitionID)
- scope: storageAccount
- properties: {
- roleDefinitionId: resourceId('Microsoft.Authorization/roleDefinitions', roleDefinitionID)
- principalId: principalID
- principalType: principalType
- }
-}
-
-output ROLE_ASSIGNMENT_NAME string = storageRoleAssignment.name
diff --git a/samples/durable-functions/python/pdf-summarizer/infra/app/storage-PrivateEndpoint.bicep b/samples/durable-functions/python/pdf-summarizer/infra/app/storage-PrivateEndpoint.bicep
deleted file mode 100644
index b2ae5e2e..00000000
--- a/samples/durable-functions/python/pdf-summarizer/infra/app/storage-PrivateEndpoint.bicep
+++ /dev/null
@@ -1,89 +0,0 @@
-// Parameters
-@description('Specifies the name of the virtual network.')
-param virtualNetworkName string
-
-@description('Specifies the name of the subnet which contains the virtual machine.')
-param subnetName string
-
-@description('Specifies the resource name of the Storage resource with an endpoint.')
-param resourceName string
-
-@description('Specifies the location.')
-param location string = resourceGroup().location
-
-param tags object = {}
-
-// Virtual Network
-resource vnet 'Microsoft.Network/virtualNetworks@2021-08-01' existing = {
- name: virtualNetworkName
-}
-
-resource storageAccount 'Microsoft.Storage/storageAccounts@2021-09-01' existing = {
- name: resourceName
-}
-
-var blobPrivateDNSZoneName = format('privatelink.blob.{0}', environment().suffixes.storage)
-var blobPrivateDnsZoneVirtualNetworkLinkName = format('{0}-link-{1}', resourceName, take(toLower(uniqueString(resourceName, virtualNetworkName)), 4))
-
-// Private DNS Zones
-resource blobPrivateDnsZone 'Microsoft.Network/privateDnsZones@2020-06-01' = {
- name: blobPrivateDNSZoneName
- location: 'global'
- tags: tags
- properties: {}
- dependsOn: [
- vnet
- ]
-}
-
-// Virtual Network Links
-resource blobPrivateDnsZoneVirtualNetworkLink 'Microsoft.Network/privateDnsZones/virtualNetworkLinks@2020-06-01' = {
- parent: blobPrivateDnsZone
- name: blobPrivateDnsZoneVirtualNetworkLinkName
- location: 'global'
- tags: tags
- properties: {
- registrationEnabled: false
- virtualNetwork: {
- id: vnet.id
- }
- }
-}
-
-// Private Endpoints
-resource blobPrivateEndpoint 'Microsoft.Network/privateEndpoints@2021-08-01' = {
- name: 'blob-private-endpoint'
- location: location
- tags: tags
- properties: {
- privateLinkServiceConnections: [
- {
- name: 'blobPrivateLinkConnection'
- properties: {
- privateLinkServiceId: storageAccount.id
- groupIds: [
- 'blob'
- ]
- }
- }
- ]
- subnet: {
- id: '${vnet.id}/subnets/${subnetName}'
- }
- }
-}
-
-resource blobPrivateDnsZoneGroupName 'Microsoft.Network/privateEndpoints/privateDnsZoneGroups@2022-01-01' = {
- parent: blobPrivateEndpoint
- name: 'blobPrivateDnsZoneGroup'
- properties: {
- privateDnsZoneConfigs: [
- {
- name: 'storageBlobARecord'
- properties: {
- privateDnsZoneId: blobPrivateDnsZone.id
- }
- }
- ]
- }
-}
diff --git a/samples/durable-functions/python/pdf-summarizer/infra/app/vnet.bicep b/samples/durable-functions/python/pdf-summarizer/infra/app/vnet.bicep
deleted file mode 100644
index bfa21d60..00000000
--- a/samples/durable-functions/python/pdf-summarizer/infra/app/vnet.bicep
+++ /dev/null
@@ -1,75 +0,0 @@
-@description('Specifies the name of the virtual network.')
-param vNetName string
-
-@description('Specifies the location.')
-param location string = resourceGroup().location
-
-@description('Specifies the name of the subnet for the Service Bus private endpoint.')
-param peSubnetName string = 'private-endpoints-subnet'
-
-@description('Specifies the name of the subnet for Function App virtual network integration.')
-param appSubnetName string = 'app'
-
-param tags object = {}
-
-resource virtualNetwork 'Microsoft.Network/virtualNetworks@2023-05-01' = {
- name: vNetName
- location: location
- tags: tags
- properties: {
- addressSpace: {
- addressPrefixes: [
- '10.0.0.0/16'
- ]
- }
- encryption: {
- enabled: false
- enforcement: 'AllowUnencrypted'
- }
- subnets: [
- {
- name: peSubnetName
- id: resourceId('Microsoft.Network/virtualNetworks/subnets', vNetName, 'private-endpoints-subnet')
- properties: {
- addressPrefixes: [
- '10.0.1.0/24'
- ]
- delegations: []
- privateEndpointNetworkPolicies: 'Disabled'
- privateLinkServiceNetworkPolicies: 'Enabled'
- }
- type: 'Microsoft.Network/virtualNetworks/subnets'
- }
- {
- name: appSubnetName
- id: resourceId('Microsoft.Network/virtualNetworks/subnets', vNetName, 'app')
- properties: {
- addressPrefixes: [
- '10.0.2.0/24'
- ]
- delegations: [
- {
- name: 'delegation'
- id: resourceId('Microsoft.Network/virtualNetworks/subnets/delegations', vNetName, 'app', 'delegation')
- properties: {
- //'Microsoft.Web/serverFarms' is the correct delegation for Premium Function and App Service VNet integration
- serviceName: 'Microsoft.Web/serverFarms'
- }
- type: 'Microsoft.Network/virtualNetworks/subnets/delegations'
- }
- ]
- privateEndpointNetworkPolicies: 'Disabled'
- privateLinkServiceNetworkPolicies: 'Enabled'
- }
- type: 'Microsoft.Network/virtualNetworks/subnets'
- }
- ]
- virtualNetworkPeerings: []
- enableDdosProtection: false
- }
-}
-
-output peSubnetName string = virtualNetwork.properties.subnets[0].name
-output peSubnetID string = virtualNetwork.properties.subnets[0].id
-output appSubnetName string = virtualNetwork.properties.subnets[1].name
-output appSubnetID string = virtualNetwork.properties.subnets[1].id
diff --git a/samples/durable-functions/python/pdf-summarizer/infra/core/ai/cognitiveservices.bicep b/samples/durable-functions/python/pdf-summarizer/infra/core/ai/cognitiveservices.bicep
deleted file mode 100644
index 2728b239..00000000
--- a/samples/durable-functions/python/pdf-summarizer/infra/core/ai/cognitiveservices.bicep
+++ /dev/null
@@ -1,47 +0,0 @@
-param name string
-param location string = resourceGroup().location
-param tags object = {}
-
-param customSubDomainName string = name
-param deployments array = []
-param kind string = 'OpenAI'
-param publicNetworkAccess string = 'Enabled'
-param sku object = {
- name: 'S0'
-}
-
-resource account 'Microsoft.CognitiveServices/accounts@2023-10-01-preview' = {
- name: name
- location: location
- tags: tags
- kind: kind
- properties: {
- customSubDomainName: name
- networkAcls : {
- defaultAction: publicNetworkAccess == 'Enabled' ? 'Allow' : 'Deny'
- virtualNetworkRules: []
- ipRules: []
- }
- publicNetworkAccess: publicNetworkAccess
- }
- sku: sku
-}
-
-@batchSize(1)
-resource deployment 'Microsoft.CognitiveServices/accounts/deployments@2023-05-01' = [for deployment in deployments: {
- parent: account
- name: deployment.name
- sku: {
- name: 'Standard'
- capacity: deployment.capacity
- }
- properties: {
- model: deployment.model
- raiPolicyName: contains(deployment, 'raiPolicyName') ? deployment.raiPolicyName : null
- }
-}]
-
-output endpoint string = account.properties.endpoint
-output id string = account.id
-output name string = account.name
-output location string = account.location
diff --git a/samples/durable-functions/python/pdf-summarizer/infra/core/host/appservice-appsettings.bicep b/samples/durable-functions/python/pdf-summarizer/infra/core/host/appservice-appsettings.bicep
deleted file mode 100644
index f4b22f81..00000000
--- a/samples/durable-functions/python/pdf-summarizer/infra/core/host/appservice-appsettings.bicep
+++ /dev/null
@@ -1,17 +0,0 @@
-metadata description = 'Updates app settings for an Azure App Service.'
-@description('The name of the app service resource within the current resource group scope')
-param name string
-
-@description('The app settings to be applied to the app service')
-@secure()
-param appSettings object
-
-resource appService 'Microsoft.Web/sites@2022-03-01' existing = {
- name: name
-}
-
-resource settings 'Microsoft.Web/sites/config@2022-03-01' = {
- name: 'appsettings'
- parent: appService
- properties: appSettings
-}
diff --git a/samples/durable-functions/python/pdf-summarizer/infra/core/host/appservice.bicep b/samples/durable-functions/python/pdf-summarizer/infra/core/host/appservice.bicep
deleted file mode 100644
index 9eb55851..00000000
--- a/samples/durable-functions/python/pdf-summarizer/infra/core/host/appservice.bicep
+++ /dev/null
@@ -1,136 +0,0 @@
-metadata description = 'Creates an Azure App Service in an existing Azure App Service plan.'
-param name string
-param location string = resourceGroup().location
-param tags object = {}
-
-// Reference Properties
-param applicationInsightsName string = ''
-param appServicePlanId string
-param keyVaultName string = ''
-param managedIdentity bool = !empty(keyVaultName)
-@allowed(['SystemAssigned', 'UserAssigned'])
-param identityType string
-@description('User assigned identity name')
-param identityId string
-
-// Runtime Properties
-@allowed([
- 'dotnet', 'dotnetcore', 'dotnet-isolated', 'node', 'python', 'java', 'powershell', 'custom'
-])
-param runtimeName string
-param runtimeNameAndVersion string = '${runtimeName}|${runtimeVersion}'
-param runtimeVersion string
-
-// Microsoft.Web/sites Properties
-param kind string = 'app,linux'
-
-// Microsoft.Web/sites/config
-param allowedOrigins array = []
-param alwaysOn bool = true
-param appCommandLine string = ''
-@secure()
-param appSettings object = {}
-param clientAffinityEnabled bool = false
-param enableOryxBuild bool = contains(kind, 'linux')
-param functionAppScaleLimit int = -1
-param linuxFxVersion string = runtimeNameAndVersion
-param minimumElasticInstanceCount int = -1
-param numberOfWorkers int = -1
-param scmDoBuildDuringDeployment bool = false
-param use32BitWorkerProcess bool = false
-param ftpsState string = 'FtpsOnly'
-param healthCheckPath string = ''
-param virtualNetworkSubnetId string = ''
-
-resource appService 'Microsoft.Web/sites@2022-03-01' = {
- name: name
- location: location
- tags: tags
- kind: kind
- properties: {
- serverFarmId: appServicePlanId
- siteConfig: {
- linuxFxVersion: linuxFxVersion
- alwaysOn: alwaysOn
- ftpsState: ftpsState
- minTlsVersion: '1.2'
- appCommandLine: appCommandLine
- numberOfWorkers: numberOfWorkers != -1 ? numberOfWorkers : null
- minimumElasticInstanceCount: minimumElasticInstanceCount != -1 ? minimumElasticInstanceCount : null
- use32BitWorkerProcess: use32BitWorkerProcess
- functionAppScaleLimit: functionAppScaleLimit != -1 ? functionAppScaleLimit : null
- healthCheckPath: healthCheckPath
- cors: {
- allowedOrigins: union([ 'https://portal.azure.com', 'https://ms.portal.azure.com' ], allowedOrigins)
- }
- }
- clientAffinityEnabled: clientAffinityEnabled
- httpsOnly: true
- virtualNetworkSubnetId: !empty(virtualNetworkSubnetId) ? virtualNetworkSubnetId : null
- }
-
- identity: managedIdentity ? (identityType == 'UserAssigned' ? {
- type: 'UserAssigned'
- userAssignedIdentities: {
- '${identityId}': {}
- }
- } : {
- type: 'SystemAssigned'
- }) : null
-
- resource basicPublishingCredentialsPoliciesFtp 'basicPublishingCredentialsPolicies' = {
- name: 'ftp'
- properties: {
- allow: false
- }
- }
-
- resource basicPublishingCredentialsPoliciesScm 'basicPublishingCredentialsPolicies' = {
- name: 'scm'
- properties: {
- allow: false
- }
- }
-}
-
-// Updates to the single Microsoft.sites/web/config resources that need to be performed sequentially
-// sites/web/config 'appsettings'
-module configAppSettings 'appservice-appsettings.bicep' = {
- name: '${name}-appSettings'
- params: {
- name: appService.name
- appSettings: union(appSettings,
- {
- SCM_DO_BUILD_DURING_DEPLOYMENT: string(scmDoBuildDuringDeployment)
- ENABLE_ORYX_BUILD: string(enableOryxBuild)
- },
- runtimeName == 'python' && appCommandLine == '' ? { PYTHON_ENABLE_GUNICORN_MULTIWORKERS: 'true'} : {},
- !empty(applicationInsightsName) ? { APPLICATIONINSIGHTS_CONNECTION_STRING: applicationInsights.properties.ConnectionString } : {},
- !empty(keyVaultName) ? { AZURE_KEY_VAULT_ENDPOINT: keyVault.properties.vaultUri } : {})
- }
-}
-
-// sites/web/config 'logs'
-resource configLogs 'Microsoft.Web/sites/config@2022-03-01' = {
- name: 'logs'
- parent: appService
- properties: {
- applicationLogs: { fileSystem: { level: 'Verbose' } }
- detailedErrorMessages: { enabled: true }
- failedRequestsTracing: { enabled: true }
- httpLogs: { fileSystem: { enabled: true, retentionInDays: 1, retentionInMb: 35 } }
- }
- dependsOn: [configAppSettings]
-}
-
-resource keyVault 'Microsoft.KeyVault/vaults@2022-07-01' existing = if (!(empty(keyVaultName))) {
- name: keyVaultName
-}
-
-resource applicationInsights 'Microsoft.Insights/components@2020-02-02' existing = if (!empty(applicationInsightsName)) {
- name: applicationInsightsName
-}
-
-output identityPrincipalId string = managedIdentity ? string(appService.identity.userAssignedIdentities[identityId].principalId) : ''
-output name string = appService.name
-output uri string = 'https://${appService.properties.defaultHostName}'
diff --git a/samples/durable-functions/python/pdf-summarizer/infra/core/host/appserviceplan.bicep b/samples/durable-functions/python/pdf-summarizer/infra/core/host/appserviceplan.bicep
deleted file mode 100644
index 2e37e041..00000000
--- a/samples/durable-functions/python/pdf-summarizer/infra/core/host/appserviceplan.bicep
+++ /dev/null
@@ -1,22 +0,0 @@
-metadata description = 'Creates an Azure App Service plan.'
-param name string
-param location string = resourceGroup().location
-param tags object = {}
-
-param kind string = ''
-param reserved bool = true
-param sku object
-
-resource appServicePlan 'Microsoft.Web/serverfarms@2022-03-01' = {
- name: name
- location: location
- tags: tags
- sku: sku
- kind: kind
- properties: {
- reserved: reserved
- }
-}
-
-output id string = appServicePlan.id
-output name string = appServicePlan.name
diff --git a/samples/durable-functions/python/pdf-summarizer/infra/core/host/functions-flexconsumption.bicep b/samples/durable-functions/python/pdf-summarizer/infra/core/host/functions-flexconsumption.bicep
deleted file mode 100644
index d6a5e632..00000000
--- a/samples/durable-functions/python/pdf-summarizer/infra/core/host/functions-flexconsumption.bicep
+++ /dev/null
@@ -1,87 +0,0 @@
-param name string
-param location string = resourceGroup().location
-param tags object = {}
-
-// Reference Properties
-param applicationInsightsName string = ''
-param appServicePlanId string
-param storageAccountName string
-param virtualNetworkSubnetId string = ''
-@allowed(['SystemAssigned', 'UserAssigned'])
-param identityType string
-@description('User assigned identity name')
-param identityId string
-
-// Runtime Properties
-@allowed([
- 'dotnet-isolated', 'node', 'python', 'java', 'powershell', 'custom'
-])
-param runtimeName string
-@allowed(['3.10', '3.11', '7.4', '8.0', '10', '11', '17', '20'])
-param runtimeVersion string
-param kind string = 'functionapp,linux'
-
-// Microsoft.Web/sites/config
-param appSettings object = {}
-param instanceMemoryMB int = 2048
-param maximumInstanceCount int = 100
-param deploymentStorageContainerName string
-
-resource stg 'Microsoft.Storage/storageAccounts@2022-09-01' existing = {
- name: storageAccountName
-}
-
-resource functions 'Microsoft.Web/sites@2023-12-01' = {
- name: name
- location: location
- tags: tags
- kind: kind
- identity: {
- type: identityType
- userAssignedIdentities: {
- '${identityId}': {}
- }
- }
- properties: {
- serverFarmId: appServicePlanId
- functionAppConfig: {
- deployment: {
- storage: {
- type: 'blobContainer'
- value: '${stg.properties.primaryEndpoints.blob}${deploymentStorageContainerName}'
- authentication: {
- type: identityType == 'SystemAssigned' ? 'SystemAssignedIdentity' : 'UserAssignedIdentity'
- userAssignedIdentityResourceId: identityType == 'UserAssigned' ? identityId : ''
- }
- }
- }
- scaleAndConcurrency: {
- instanceMemoryMB: instanceMemoryMB
- maximumInstanceCount: maximumInstanceCount
- }
- runtime: {
- name: runtimeName
- version: runtimeVersion
- }
- }
- virtualNetworkSubnetId: virtualNetworkSubnetId
- }
-
- resource configAppSettings 'config' = {
- name: 'appsettings'
- properties: union(appSettings,
- {
- AzureWebJobsStorage__accountName: stg.name
- AzureWebJobsStorage__credential : 'managedidentity'
- APPLICATIONINSIGHTS_CONNECTION_STRING: applicationInsights.properties.ConnectionString
- })
- }
-}
-
-resource applicationInsights 'Microsoft.Insights/components@2020-02-02' existing = if (!empty(applicationInsightsName)) {
- name: applicationInsightsName
-}
-
-output name string = functions.name
-output uri string = 'https://${functions.properties.defaultHostName}'
-output identityPrincipalId string = identityType == 'SystemAssigned' ? functions.identity.principalId : ''
diff --git a/samples/durable-functions/python/pdf-summarizer/infra/core/host/functions.bicep b/samples/durable-functions/python/pdf-summarizer/infra/core/host/functions.bicep
deleted file mode 100644
index 9a0e10f9..00000000
--- a/samples/durable-functions/python/pdf-summarizer/infra/core/host/functions.bicep
+++ /dev/null
@@ -1,119 +0,0 @@
-metadata description = 'Creates an Azure Function in an existing Azure App Service plan.'
-param name string
-param location string = resourceGroup().location
-param tags object = {}
-
-// Reference Properties
-param applicationInsightsName string = ''
-param appServicePlanId string
-param keyVaultName string = ''
-param managedIdentity bool = !empty(keyVaultName) || storageManagedIdentity
-param storageAccountName string
-param storageManagedIdentity bool = false
-param virtualNetworkSubnetId string = ''
-@allowed(['SystemAssigned', 'UserAssigned'])
-param identityType string
-@description('User assigned identity name')
-param identityId string
-
-// Runtime Properties
-@allowed([
- 'dotnet', 'dotnetcore', 'dotnet-isolated', 'node', 'python', 'java', 'powershell', 'custom'
-])
-param runtimeName string
-param runtimeNameAndVersion string = '${runtimeName}|${runtimeVersion}'
-param runtimeVersion string
-
-// Function Settings
-@allowed([
- '~4', '~3', '~2', '~1'
-])
-param extensionVersion string = '~4'
-
-// Microsoft.Web/sites Properties
-param kind string = 'functionapp,linux'
-
-// Microsoft.Web/sites/config
-param allowedOrigins array = []
-param alwaysOn bool = true
-param appCommandLine string = ''
-@secure()
-param appSettings object = {}
-param clientAffinityEnabled bool = false
-param enableOryxBuild bool = contains(kind, 'linux')
-param functionAppScaleLimit int = -1
-param linuxFxVersion string = runtimeNameAndVersion
-param minimumElasticInstanceCount int = -1
-param numberOfWorkers int = -1
-param scmDoBuildDuringDeployment bool = true
-param use32BitWorkerProcess bool = false
-param healthCheckPath string = ''
-// param deploymentStorageContainerName string
-// param deploymentStorageFileName string = 'functions' // Default to functions.zip name in WEBSITE_RUN_FROM_PACKAGE= value
-param azureOpenaiService string
-param documentIntelligenceEndpoint string
-
-module functions 'appservice.bicep' = {
- name: '${name}-functions'
- params: {
- name: name
- location: location
- tags: tags
- allowedOrigins: allowedOrigins
- alwaysOn: alwaysOn
- appCommandLine: appCommandLine
- applicationInsightsName: applicationInsightsName
- appServicePlanId: appServicePlanId
- appSettings: union(appSettings, storageManagedIdentity ? {
- AzureWebJobsStorage__accountName: storage.name
- STORAGE_ACCOUNT_NAME: storage.name
- FUNCTIONS_EXTENSION_VERSION: extensionVersion
- FUNCTIONS_WORKER_RUNTIME: runtimeName
- AZURE_OPENAI_ENDPOINT: 'https://${azureOpenaiService}.openai.azure.com/'
- COGNITIVE_SERVICES_ENDPOINT: documentIntelligenceEndpoint
- } : {
- AzureWebJobsStorage: 'DefaultEndpointsProtocol=https;AccountName=${storage.name};AccountKey=${storage.listKeys().keys[0].value};EndpointSuffix=${environment().suffixes.storage}'
- STORAGE_ACCOUNT_NAME: storage.name
- FUNCTIONS_EXTENSION_VERSION: extensionVersion
- FUNCTIONS_WORKER_RUNTIME: runtimeName
- AZURE_OPENAI_ENDPOINT: 'https://${azureOpenaiService}.openai.azure.com/'
- COGNITIVE_SERVICES_ENDPOINT: documentIntelligenceEndpoint
- })
- clientAffinityEnabled: clientAffinityEnabled
- enableOryxBuild: enableOryxBuild
- functionAppScaleLimit: functionAppScaleLimit
- healthCheckPath: healthCheckPath
- keyVaultName: keyVaultName
- kind: kind
- linuxFxVersion: linuxFxVersion
- managedIdentity: managedIdentity
- identityId: identityId
- identityType: identityType
- minimumElasticInstanceCount: minimumElasticInstanceCount
- numberOfWorkers: numberOfWorkers
- runtimeName: runtimeName
- runtimeVersion: runtimeVersion
- runtimeNameAndVersion: runtimeNameAndVersion
- scmDoBuildDuringDeployment: scmDoBuildDuringDeployment
- use32BitWorkerProcess: use32BitWorkerProcess
- virtualNetworkSubnetId: virtualNetworkSubnetId
- }
-}
-
-module storageOwnerRole '../security/role.bicep' = if (storageManagedIdentity) {
- name: 'storage-blob-data-owner-role-function'
- params: {
- principalId: functions.outputs.identityPrincipalId
- // Storage Blob Data Owner
- roleDefinitionId: 'b7e6dc6d-f1e8-4753-8033-0f276bb0955b'
- principalType: 'ServicePrincipal'
- }
-}
-
-resource storage 'Microsoft.Storage/storageAccounts@2021-09-01' existing = {
- name: storageAccountName
-}
-
-output identityPrincipalId string = managedIdentity ? functions.outputs.identityPrincipalId : ''
-output name string = functions.outputs.name
-output uri string = functions.outputs.uri
diff --git a/samples/durable-functions/python/pdf-summarizer/infra/core/identity/userAssignedIdentity.bicep b/samples/durable-functions/python/pdf-summarizer/infra/core/identity/userAssignedIdentity.bicep
deleted file mode 100644
index 0d4e02ea..00000000
--- a/samples/durable-functions/python/pdf-summarizer/infra/core/identity/userAssignedIdentity.bicep
+++ /dev/null
@@ -1,14 +0,0 @@
-param identityName string
-param location string
-param tags object = {}
-
-resource userAssignedIdentity 'Microsoft.ManagedIdentity/userAssignedIdentities@2023-07-31-preview' = {
- name: identityName
- location: location
- tags: tags
-}
-
-output identityId string = userAssignedIdentity.id
-output identityName string = userAssignedIdentity.name
-output identityPrincipalId string = userAssignedIdentity.properties.principalId
-output identityClientId string = userAssignedIdentity.properties.clientId
diff --git a/samples/durable-functions/python/pdf-summarizer/infra/core/monitor/appinsights-access.bicep b/samples/durable-functions/python/pdf-summarizer/infra/core/monitor/appinsights-access.bicep
deleted file mode 100644
index f151b104..00000000
--- a/samples/durable-functions/python/pdf-summarizer/infra/core/monitor/appinsights-access.bicep
+++ /dev/null
@@ -1,21 +0,0 @@
-param principalID string
-param roleDefinitionID string
-param appInsightsName string
-
-resource applicationInsights 'Microsoft.Insights/components@2020-02-02' existing = {
- name: appInsightsName
-}
-
-// Allow access from API to app insights using a managed identity and least priv role
-resource appInsightsRoleAssignment 'Microsoft.Authorization/roleAssignments@2020-04-01-preview' = {
- name: guid(applicationInsights.id, principalID, roleDefinitionID)
- scope: applicationInsights
- properties: {
- roleDefinitionId: resourceId('Microsoft.Authorization/roleDefinitions', roleDefinitionID)
- principalId: principalID
- principalType: 'ServicePrincipal' // Workaround for https://learn.microsoft.com/en-us/azure/role-based-access-control/role-assignments-template#new-service-principal
- }
-}
-
-output ROLE_ASSIGNMENT_NAME string = appInsightsRoleAssignment.name
-
diff --git a/samples/durable-functions/python/pdf-summarizer/infra/core/monitor/applicationinsights.bicep b/samples/durable-functions/python/pdf-summarizer/infra/core/monitor/applicationinsights.bicep
deleted file mode 100644
index f6d9ee51..00000000
--- a/samples/durable-functions/python/pdf-summarizer/infra/core/monitor/applicationinsights.bicep
+++ /dev/null
@@ -1,22 +0,0 @@
-param name string
-param location string = resourceGroup().location
-param tags object = {}
-
-param logAnalyticsWorkspaceId string
-param disableLocalAuth bool = false
-
-resource applicationInsights 'Microsoft.Insights/components@2020-02-02' = {
- name: name
- location: location
- tags: tags
- kind: 'web'
- properties: {
- Application_Type: 'web'
- WorkspaceResourceId: logAnalyticsWorkspaceId
- DisableLocalAuth: disableLocalAuth
- }
-}
-
-output connectionString string = applicationInsights.properties.ConnectionString
-output instrumentationKey string = applicationInsights.properties.InstrumentationKey
-output name string = applicationInsights.name
diff --git a/samples/durable-functions/python/pdf-summarizer/infra/core/monitor/loganalytics.bicep b/samples/durable-functions/python/pdf-summarizer/infra/core/monitor/loganalytics.bicep
deleted file mode 100644
index 770544cc..00000000
--- a/samples/durable-functions/python/pdf-summarizer/infra/core/monitor/loganalytics.bicep
+++ /dev/null
@@ -1,21 +0,0 @@
-param name string
-param location string = resourceGroup().location
-param tags object = {}
-
-resource logAnalytics 'Microsoft.OperationalInsights/workspaces@2021-12-01-preview' = {
- name: name
- location: location
- tags: tags
- properties: any({
- retentionInDays: 30
- features: {
- searchVersion: 1
- }
- sku: {
- name: 'PerGB2018'
- }
- })
-}
-
-output id string = logAnalytics.id
-output name string = logAnalytics.name
diff --git a/samples/durable-functions/python/pdf-summarizer/infra/core/monitor/monitoring.bicep b/samples/durable-functions/python/pdf-summarizer/infra/core/monitor/monitoring.bicep
deleted file mode 100644
index 791c5eb7..00000000
--- a/samples/durable-functions/python/pdf-summarizer/infra/core/monitor/monitoring.bicep
+++ /dev/null
@@ -1,31 +0,0 @@
-param logAnalyticsName string
-param applicationInsightsName string
-param location string = resourceGroup().location
-param tags object = {}
-param disableLocalAuth bool = false
-
-module logAnalytics 'loganalytics.bicep' = {
- name: 'loganalytics'
- params: {
- name: logAnalyticsName
- location: location
- tags: tags
- }
-}
-
-module applicationInsights 'applicationinsights.bicep' = {
- name: 'applicationinsights'
- params: {
- name: applicationInsightsName
- location: location
- tags: tags
- logAnalyticsWorkspaceId: logAnalytics.outputs.id
- disableLocalAuth: disableLocalAuth
- }
-}
-
-output applicationInsightsConnectionString string = applicationInsights.outputs.connectionString
-output applicationInsightsInstrumentationKey string = applicationInsights.outputs.instrumentationKey
-output applicationInsightsName string = applicationInsights.outputs.name
-output logAnalyticsWorkspaceId string = logAnalytics.outputs.id
-output logAnalyticsWorkspaceName string = logAnalytics.outputs.name
diff --git a/samples/durable-functions/python/pdf-summarizer/infra/core/security/role.bicep b/samples/durable-functions/python/pdf-summarizer/infra/core/security/role.bicep
deleted file mode 100644
index 0b30cfd3..00000000
--- a/samples/durable-functions/python/pdf-summarizer/infra/core/security/role.bicep
+++ /dev/null
@@ -1,21 +0,0 @@
-metadata description = 'Creates a role assignment for a service principal.'
-param principalId string
-
-@allowed([
- 'Device'
- 'ForeignGroup'
- 'Group'
- 'ServicePrincipal'
- 'User'
-])
-param principalType string = 'ServicePrincipal'
-param roleDefinitionId string
-
-resource role 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
- name: guid(subscription().id, resourceGroup().id, principalId, roleDefinitionId)
- properties: {
- principalId: principalId
- principalType: principalType
- roleDefinitionId: resourceId('Microsoft.Authorization/roleDefinitions', roleDefinitionId)
- }
-}
diff --git a/samples/durable-functions/python/pdf-summarizer/infra/core/storage/storage-account.bicep b/samples/durable-functions/python/pdf-summarizer/infra/core/storage/storage-account.bicep
deleted file mode 100644
index 6149fb2f..00000000
--- a/samples/durable-functions/python/pdf-summarizer/infra/core/storage/storage-account.bicep
+++ /dev/null
@@ -1,101 +0,0 @@
-metadata description = 'Creates an Azure storage account.'
-param name string
-param location string = resourceGroup().location
-param tags object = {}
-
-@allowed([
- 'Cool'
- 'Hot'
- 'Premium' ])
-param accessTier string = 'Hot'
-param allowBlobPublicAccess bool = true
-param allowCrossTenantReplication bool = true
-param allowSharedKeyAccess bool = true
-param containers array = []
-param corsRules array = []
-param defaultToOAuthAuthentication bool = false
-param deleteRetentionPolicy object = {}
-@allowed([ 'AzureDnsZone', 'Standard' ])
-param dnsEndpointType string = 'Standard'
-param files array = []
-param kind string = 'StorageV2'
-param minimumTlsVersion string = 'TLS1_2'
-param queues array = []
-param shareDeleteRetentionPolicy object = {}
-param supportsHttpsTrafficOnly bool = true
-param tables array = []
-param networkAcls object = {
- bypass: 'AzureServices'
- defaultAction: 'Allow'
-}
-@allowed([ 'Enabled', 'Disabled' ])
-param publicNetworkAccess string = 'Enabled'
-param sku object = { name: 'Standard_LRS' }
-
-resource storage 'Microsoft.Storage/storageAccounts@2023-01-01' = {
- name: name
- location: location
- tags: tags
- kind: kind
- sku: sku
- properties: {
- accessTier: accessTier
- allowBlobPublicAccess: allowBlobPublicAccess
- allowCrossTenantReplication: allowCrossTenantReplication
- allowSharedKeyAccess: allowSharedKeyAccess
- defaultToOAuthAuthentication: defaultToOAuthAuthentication
- dnsEndpointType: dnsEndpointType
- minimumTlsVersion: minimumTlsVersion
- networkAcls: networkAcls
- publicNetworkAccess: publicNetworkAccess
- supportsHttpsTrafficOnly: supportsHttpsTrafficOnly
- }
-
- resource blobServices 'blobServices' = if (!empty(containers)) {
- name: 'default'
- properties: {
- cors: {
- corsRules: corsRules
- }
- deleteRetentionPolicy: deleteRetentionPolicy
- }
- resource container 'containers' = [for container in containers: {
- name: container.name
- properties: {
- publicAccess: contains(container, 'publicAccess') ? container.publicAccess : 'None'
- }
- }]
- }
-
- resource fileServices 'fileServices' = if (!empty(files)) {
- name: 'default'
- properties: {
- cors: {
- corsRules: corsRules
- }
- shareDeleteRetentionPolicy: shareDeleteRetentionPolicy
- }
- }
-
- resource queueServices 'queueServices' = if (!empty(queues)) {
- name: 'default'
- properties: {
-
- }
- resource queue 'queues' = [for queue in queues: {
- name: queue.name
- properties: {
- metadata: {}
- }
- }]
- }
-
- resource tableServices 'tableServices' = if (!empty(tables)) {
- name: 'default'
- properties: {}
- }
-}
-
-output id string = storage.id
-output name string = storage.name
-output primaryEndpoints object = storage.properties.primaryEndpoints
diff --git a/samples/durable-functions/python/pdf-summarizer/infra/main.bicep b/samples/durable-functions/python/pdf-summarizer/infra/main.bicep
deleted file mode 100644
index bc6201bb..00000000
--- a/samples/durable-functions/python/pdf-summarizer/infra/main.bicep
+++ /dev/null
@@ -1,379 +0,0 @@
-targetScope = 'subscription'
-
-@minLength(1)
-@maxLength(64)
-@description('Name of the the environment which is used to generate a short unique hash used in all resources.')
-param environmentName string
-
-@minLength(1)
-@description('Primary location for all resources')
-@allowed(['australiaeast', 'eastasia', 'eastus', 'eastus2', 'northeurope', 'southcentralus', 'southeastasia', 'swedencentral', 'uksouth', 'westus2', 'eastus2euap'])
-@metadata({
- azd: {
- type: 'location'
- }
-})
-param location string
-
-@allowed([
- 'EP1'
- 'EP2'
- 'EP3'
- 'P1v2'
- 'P2v2'
- 'P3v2'
- 'P1v3'
- 'P2v3'
- 'P3v3'
- 'P1mv3'
- 'P2mv3'
- 'P3mv3'
- 'P4mv3'
- 'P5mv3'
- 'P0v3'
- 'S1'
- 'B1'
- 'B2'
- 'B3'
-])
-param functionSkuName string = 'EP1' // Uses main.parameters.json first
-
-@allowed([
- 'ElasticPremium'
- 'PremiumV3'
- 'Premium0V3'
- 'Standard'
- 'Basic'
-])
-
-param functionSkuTier string = 'ElasticPremium' // Uses main.parameters.json first
-param functionReservedPlan bool = true // Set to false to get a Windows OS plan
-
-param dtsLocation string = location
-param dtsSkuName string = 'Consumption'
-param dtsCapacity int = 1
-
-param documentIntelligenceSkuName string // Set in main.parameters.json
-param documentIntelligenceServiceName string = '' // Set in main.parameters.json
-
-param durableFunctionServiceName string = ''
-param durableFunctionUserAssignedIdentityName string = ''
-param applicationInsightsName string = ''
-param appServicePlanName string = ''
-param logAnalyticsName string = ''
-param resourceGroupName string = ''
-param storageAccountName string = ''
-param dtsName string = ''
-param taskHubName string = ''
-param vNetName string = ''
-param disableLocalAuth bool = true
-
-param openAiServiceName string = ''
-
-param openAiSkuName string
-@allowed([ 'azure', 'openai', 'azure_custom' ])
-param openAiHost string // Set in main.parameters.json
-
-@description('Public network access value for all deployed resources')
-@allowed(['Enabled', 'Disabled'])
-param publicNetworkAccess string = 'Enabled'
-
-param chatModelName string = ''
-param chatDeploymentName string = ''
-param chatDeploymentVersion string = ''
-param chatDeploymentCapacity int = 0
-
-var chatModel = {
- modelName: !empty(chatModelName) ? chatModelName : startsWith(openAiHost, 'azure') ? 'gpt-4o' : 'gpt-4o'
- deploymentName: !empty(chatDeploymentName) ? chatDeploymentName : 'chat'
- deploymentVersion: !empty(chatDeploymentVersion) ? chatDeploymentVersion : '2024-08-06'
- deploymentCapacity: chatDeploymentCapacity != 0 ? chatDeploymentCapacity : 28
-}
-
-var abbrs = loadJsonContent('./abbreviations.json')
-var resourceToken = toLower(uniqueString(subscription().id, environmentName, location))
-var tags = { 'azd-env-name': environmentName }
-var functionAppName = !empty(durableFunctionServiceName) ? durableFunctionServiceName : '${abbrs.webSitesFunctions}${resourceToken}'
-var deploymentStorageContainerName = 'app-package-${take(functionAppName, 32)}-${take(toLower(uniqueString(functionAppName, resourceToken)), 7)}'
-
-@description('Id of the user or app to assign application roles')
-param principalId string = ''
-
-// Organize resources in a resource group
-resource rg 'Microsoft.Resources/resourceGroups@2021-04-01' = {
- name: !empty(resourceGroupName) ? resourceGroupName : '${abbrs.resourcesResourceGroups}${environmentName}'
- location: location
- tags: tags
-}
-
-module durableFunctionUserAssignedIdentity './core/identity/userAssignedIdentity.bicep' = {
- name: 'DurableFunctionUserAssignedIdentity'
- scope: rg
- params: {
- location: location
- tags: tags
- identityName: !empty(durableFunctionUserAssignedIdentityName) ? durableFunctionUserAssignedIdentityName : '${abbrs.managedIdentityUserAssignedIdentities}durable-function-${resourceToken}'
- }
-}
-
-// The application backend is a function app
-module appServicePlan './core/host/appserviceplan.bicep' = {
- name: 'appserviceplan'
- scope: rg
- params: {
- name: !empty(appServicePlanName) ? appServicePlanName : '${abbrs.webServerFarms}${resourceToken}'
- location: location
- tags: tags
- sku: {
- name: functionSkuName // Change this to the desired Elastic Premium SKU
- tier: functionSkuTier
- }
- reserved: functionReservedPlan // Set to false to get a Windows OS plan
- }
-}
-
-module durableFunction './app/durable-function.bicep' = {
- name: 'function-app'
- scope: rg
- params: {
- name: functionAppName
- location: location
- tags: tags
- applicationInsightsName: monitoring.outputs.applicationInsightsName
- appServicePlanId: appServicePlan.outputs.id
- runtimeName: 'python'
- runtimeVersion: '3.9'
- storageAccountName: storage.outputs.name
- identityId: durableFunctionUserAssignedIdentity.outputs.identityId
- identityClientId: durableFunctionUserAssignedIdentity.outputs.identityClientId
- dtsURL: dts.outputs.dts_URL
- taskHubName: dts.outputs.TASKHUB_NAME
- azureOpenaiService: openAi.outputs.name
- documentIntelligenceEndpoint: documentIntelligence.outputs.endpoint
- appSettings: {
- CHAT_MODEL_DEPLOYMENT_NAME: chatModel.deploymentName
- }
- virtualNetworkSubnetId: serviceVirtualNetwork.outputs.appSubnetID
- }
-}
-
-// Backing storage for Azure functions durable function
-module storage './core/storage/storage-account.bicep' = {
- name: 'storage'
- scope: rg
- params: {
- name: !empty(storageAccountName) ? storageAccountName : '${abbrs.storageStorageAccounts}${resourceToken}'
- location: location
- tags: tags
- containers: [{
- name: deploymentStorageContainerName
- publicAccess: 'None'
- },{
- name: 'input'
- publicAccess: 'None'
-
- },{
- name: 'output'
- publicAccess: 'None'
- }]
- publicNetworkAccess: 'Enabled'
- allowBlobPublicAccess: false
- }
-}
-
-var storageRoleDefinitionId = 'b7e6dc6d-f1e8-4753-8033-0f276bb0955b' //Storage Blob Data Owner role
-
-// Allow access from durable function to storage account using a user assigned managed identity
-module storageRoleAssignmentApiUAMI 'app/storage-Access.bicep' = {
- name: 'storageRoleAssignmentPocessorUAMI'
- scope: rg
- params: {
- storageAccountName: storage.outputs.name
- roleDefinitionID: storageRoleDefinitionId
- principalID: durableFunctionUserAssignedIdentity.outputs.identityPrincipalId
- principalType: 'ServicePrincipal'
- }
-}
-
-// Allow access from durable function to storage account using the Login identity of this bicep (usually AZD CLI)
-module storageRoleAssignmentApi 'app/storage-Access.bicep' = {
- name: 'storageRoleAssignmentDurableFunctionLoginIdentity'
- scope: rg
- params: {
- storageAccountName: storage.outputs.name
- roleDefinitionID: storageRoleDefinitionId
- principalID: principalId
- principalType: 'User'
- }
-}
-
-// Virtual Network & private endpoint to blob storage
-module serviceVirtualNetwork 'app/vnet.bicep' = {
- name: 'serviceVirtualNetwork'
- scope: rg
- params: {
- location: location
- tags: tags
- vNetName: !empty(vNetName) ? vNetName : '${abbrs.networkVirtualNetworks}${resourceToken}'
- }
-}
-
-module storagePrivateEndpoint 'app/storage-PrivateEndpoint.bicep' = {
- name: 'servicePrivateEndpoint'
- scope: rg
- params: {
- location: location
- tags: tags
- virtualNetworkName: !empty(vNetName) ? vNetName : '${abbrs.networkVirtualNetworks}${resourceToken}'
- subnetName: serviceVirtualNetwork.outputs.peSubnetName
- resourceName: storage.outputs.name
- }
-}
-
-// Monitor application with Azure Monitor
-module monitoring './core/monitor/monitoring.bicep' = {
- name: 'monitoring'
- scope: rg
- params: {
- location: location
- tags: tags
- logAnalyticsName: !empty(logAnalyticsName) ? logAnalyticsName : '${abbrs.operationalInsightsWorkspaces}${resourceToken}'
- applicationInsightsName: !empty(applicationInsightsName) ? applicationInsightsName : '${abbrs.insightsComponents}${resourceToken}'
- disableLocalAuth: disableLocalAuth
- }
-}
-
-var monitoringRoleDefinitionId = '3913510d-42f4-4e42-8a64-420c390055eb' // Monitoring Metrics Publisher role ID
-
-// Allow access from durable function` to application insights using a managed identity
-module appInsightsRoleAssignmentApi './core/monitor/appinsights-access.bicep' = {
- name: 'appInsightsRoleAssignmentDurableFunction'
- scope: rg
- params: {
- appInsightsName: monitoring.outputs.applicationInsightsName
- roleDefinitionID: monitoringRoleDefinitionId
- principalID: durableFunctionUserAssignedIdentity.outputs.identityPrincipalId
- }
-}
-
-// Allow access from durable function to storage account using a user assigned managed identity
-module dtsRoleAssignment 'app/dts-Access.bicep' = {
- name: 'dtsRoleAssignment'
- scope: rg
- params: {
- roleDefinitionID: '0ad04412-c4d5-4796-b79c-f76d14c8d402'
- principalID: durableFunctionUserAssignedIdentity.outputs.identityPrincipalId
- principalType: 'ServicePrincipal'
- dtsName: dts.outputs.dts_NAME
- }
-}
-
-module dtsDashboardRoleAssignment 'app/dts-Access.bicep' = {
- name: 'dtsDashboardRoleAssignment'
- scope: rg
- params: {
- roleDefinitionID: '0ad04412-c4d5-4796-b79c-f76d14c8d402'
- principalID: principalId
- principalType: 'User'
- dtsName: dts.outputs.dts_NAME
- }
-}
-
-module dts './app/dts.bicep' = {
- scope: rg
- name: 'dtsResource'
- params: {
- name: !empty(dtsName) ? dtsName : '${abbrs.dts}${resourceToken}'
- taskhubname: !empty(taskHubName) ? taskHubName : '${abbrs.taskhub}${resourceToken}'
- location: dtsLocation
- tags: tags
- ipAllowlist: [
- '0.0.0.0/0'
- ]
- skuName: dtsSkuName
- skuCapacity: dtsCapacity
- }
-}
-
-module openAi './core/ai/cognitiveservices.bicep' = {
- name: 'openai'
- scope: rg
- params: {
- name: !empty(openAiServiceName) ? openAiServiceName : '${abbrs.cognitiveServicesAccounts}${resourceToken}'
- location: 'eastus2'
-
- tags: tags
- publicNetworkAccess: 'Enabled'
- sku: {
- name: openAiSkuName
- }
- deployments: [
- {
- name: chatModel.deploymentName
- capacity: chatModel.deploymentCapacity
- model: {
- format: 'OpenAI'
- name: chatModel.modelName
- version: chatModel.deploymentVersion
- }
- scaleSettings: {
- scaleType: 'Standard'
- }
- }
- ]
- }
-}
-
-// Learn more about Azure role-based access control (RBAC) and built-in-roles at https://docs.microsoft.com/en-us/azure/role-based-access-control/overview
-var CognitiveServicesRoleDefinitionIds = ['5e0bd9bd-7b93-4f28-af87-19fc36ad61bd'] // Cognitive Services OpenAI User
-module openAiRoleUser 'app/openai-Access.bicep' = {
- scope: rg
- name: 'openai-roles'
- params: {
- principalId: durableFunctionUserAssignedIdentity.outputs.identityPrincipalId
- openAiAccountResourceName: openAi.outputs.name
- roleDefinitionIds: CognitiveServicesRoleDefinitionIds
- }
-}
-
-module documentIntelligence 'br/public:avm/res/cognitive-services/account:0.5.4' = {
- name: 'documentintelligence'
- scope: rg
- params: {
- name: !empty(documentIntelligenceServiceName)
- ? documentIntelligenceServiceName
- : '${abbrs.cognitiveServicesDocumentIntelligence}${resourceToken}'
- kind: 'FormRecognizer'
- customSubDomainName: !empty(documentIntelligenceServiceName)
- ? documentIntelligenceServiceName
- : '${abbrs.cognitiveServicesDocumentIntelligence}${resourceToken}'
- publicNetworkAccess: publicNetworkAccess
- networkAcls: {
- defaultAction: 'Allow'
- }
- location: location
- disableLocalAuth: true
- tags: tags
- sku: documentIntelligenceSkuName
- }
-}
-
-module documentIntelligenceRoleBackend 'app/documentintelligence-Access.bicep' = {
- scope: rg
- name: 'documentintelligence-role-backend'
- params: {
- principalId: durableFunctionUserAssignedIdentity.outputs.identityPrincipalId
- roleDefinitionId: 'a97b65f3-24c7-4388-baec-2e87135dc908'
- principalType: 'ServicePrincipal'
- }
-}
-
-// App outputs
-output APPLICATIONINSIGHTS_CONNECTION_STRING string = monitoring.outputs.applicationInsightsConnectionString
-output AZURE_LOCATION string = location
-output AZURE_TENANT_ID string = tenant().tenantId
-output SERVICE_DURABLE_FUNCTION_NAME string = durableFunction.outputs.SERVICE_DURABLE_FUNCTION_NAME
-output AZURE_FUNCTION_NAME string = durableFunction.outputs.SERVICE_DURABLE_FUNCTION_NAME
-output AZURE_RESOURCE_GROUP string = rg.name
-output AZURE_STORAGE_ACCOUNT_NAME string = storage.outputs.name
-output AZURE_STORAGE_CONTAINER_NAME string = deploymentStorageContainerName
diff --git a/samples/durable-functions/python/pdf-summarizer/infra/main.parameters.json b/samples/durable-functions/python/pdf-summarizer/infra/main.parameters.json
deleted file mode 100644
index e72b9dc4..00000000
--- a/samples/durable-functions/python/pdf-summarizer/infra/main.parameters.json
+++ /dev/null
@@ -1,81 +0,0 @@
-{
- "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
- "contentVersion": "1.0.0.0",
- "parameters": {
- "environmentName": {
- "value": "${AZURE_ENV_NAME}"
- },
- "location": {
- "value": "${AZURE_LOCATION}"
- },
- "principalId": {
- "value": "${AZURE_PRINCIPAL_ID}"
- },
- "openAiSkuName": {
- "value": "S0"
- },
- "openAiServiceName": {
- "value": "${AZURE_OPENAI_SERVICE}"
- },
- "openAiHost": {
- "value": "${OPENAI_HOST=azure}"
- },
- "openAiResourceGroupName": {
- "value": "${AZURE_OPENAI_RESOURCE_GROUP}"
- },
- "chatGptDeploymentName": {
- "value": "${AZURE_OPENAI_CHATGPT_DEPLOYMENT=chat}"
- },
- "chatGptDeploymentCapacity":{
- "value": "${AZURE_OPENAI_CHATGPT_DEPLOYMENT_CAPACITY}"
- },
- "chatGptDeploymentVersion":{
- "value": "${AZURE_OPENAI_CHATGPT_DEPLOYMENT_VERSION}"
- },
- "chatGptModelName":{
- "value": "${AZURE_OPENAI_CHATGPT_MODEL=gpt-35-turbo}"
- },
- "documentIntelligenceServiceName": {
- "value": "${AZURE_DOCUMENTINTELLIGENCE_SERVICE}"
- },
- "documentIntelligenceSkuName": {
- "value": "${AZURE_DOCUMENTINTELLIGENCE_SKU=S0}"
- },
- "embeddingDeploymentName": {
- "value": "${AZURE_OPENAI_EMB_DEPLOYMENT=embedding}"
- },
- "embeddingModelName":{
- "value": "${AZURE_OPENAI_EMB_MODEL_NAME=text-embedding-3-small}"
- },
- "embeddingDeploymentVersion":{
- "value": "${AZURE_OPENAI_EMB_DEPLOYMENT_VERSION}"
- },
- "embeddingDeploymentCapacity":{
- "value": "${AZURE_OPENAI_EMB_DEPLOYMENT_CAPACITY}"
- },
- "searchServiceName": {
- "value": "${AZURE_SEARCH_SERVICE}"
- },
- "searchServiceResourceGroupName": {
- "value": "${AZURE_SEARCH_SERVICE_RESOURCE_GROUP}"
- },
- "searchServiceIndexName": {
- "value": "${AZURE_SEARCH_INDEX=openai-index}"
- },
- "searchServiceSkuName": {
- "value": "${AZURE_SEARCH_SERVICE_SKU=standard}"
- },
- "storageAccountName": {
- "value": "${AZURE_STORAGE_ACCOUNT}"
- },
- "storageResourceGroupName": {
- "value": "${AZURE_STORAGE_RESOURCE_GROUP}"
- },
- "azFunctionHostingPlanType": {
- "value": "flexconsumption"
- },
- "systemPrompt": {
- "value": "${SYSTEM_PROMPT}=You are a helpful assistant. You are responding to requests from a user about internal emails and documents. You can and should refer to the internal documents to help respond to requests. If a user makes a request thats not covered by the documents provided in the query, you must say that you do not have access to the information and not try and get information from other places besides the documents provided. The following is a list of documents that you can refer to when answering questions. The documents are in the format [filename]: [text] and are separated by newlines. If you answer a question by referencing any of the documents, please cite the document in your answer. For example, if you answer a question by referencing info.txt, you should add \"Reference: info.txt\" to the end of your answer on a separate line."
- }
- }
-}
\ No newline at end of file
diff --git a/samples/durable-functions/python/pdf-summarizer/infra/modules/fetch-container-image.bicep b/samples/durable-functions/python/pdf-summarizer/infra/modules/fetch-container-image.bicep
deleted file mode 100644
index 78d1e7ee..00000000
--- a/samples/durable-functions/python/pdf-summarizer/infra/modules/fetch-container-image.bicep
+++ /dev/null
@@ -1,8 +0,0 @@
-param exists bool
-param name string
-
-resource existingApp 'Microsoft.App/containerApps@2023-05-02-preview' existing = if (exists) {
- name: name
-}
-
-output containers array = exists ? existingApp.properties.template.containers : []
diff --git a/samples/durable-functions/python/pdf-summarizer/infra/shared/apps-env.bicep b/samples/durable-functions/python/pdf-summarizer/infra/shared/apps-env.bicep
deleted file mode 100644
index 030b8233..00000000
--- a/samples/durable-functions/python/pdf-summarizer/infra/shared/apps-env.bicep
+++ /dev/null
@@ -1,33 +0,0 @@
-param name string
-param location string = resourceGroup().location
-param tags object = {}
-
-param logAnalyticsWorkspaceName string
-param applicationInsightsName string = ''
-
-resource containerAppsEnvironment 'Microsoft.App/managedEnvironments@2022-10-01' = {
- name: name
- location: location
- tags: tags
- properties: {
- appLogsConfiguration: {
- destination: 'log-analytics'
- logAnalyticsConfiguration: {
- customerId: logAnalyticsWorkspace.properties.customerId
- sharedKey: logAnalyticsWorkspace.listKeys().primarySharedKey
- }
- }
- daprAIConnectionString: applicationInsights.properties.ConnectionString
- }
-}
-
-resource logAnalyticsWorkspace 'Microsoft.OperationalInsights/workspaces@2022-10-01' existing = {
- name: logAnalyticsWorkspaceName
-}
-
-resource applicationInsights 'Microsoft.Insights/components@2020-02-02' existing = {
- name: applicationInsightsName
-}
-
-output name string = containerAppsEnvironment.name
-output domain string = containerAppsEnvironment.properties.defaultDomain
diff --git a/samples/durable-functions/python/pdf-summarizer/infra/shared/dashboard-web.bicep b/samples/durable-functions/python/pdf-summarizer/infra/shared/dashboard-web.bicep
deleted file mode 100644
index eccce0db..00000000
--- a/samples/durable-functions/python/pdf-summarizer/infra/shared/dashboard-web.bicep
+++ /dev/null
@@ -1,1231 +0,0 @@
-param name string
-param applicationInsightsName string
-param location string = resourceGroup().location
-param tags object = {}
-
-// 2020-09-01-preview because that is the latest valid version
-resource applicationInsightsDashboard 'Microsoft.Portal/dashboards@2020-09-01-preview' = {
- name: name
- location: location
- tags: tags
- properties: {
- lenses: [
- {
- order: 0
- parts: [
- {
- position: {
- x: 0
- y: 0
- colSpan: 2
- rowSpan: 1
- }
- metadata: {
- inputs: [
- {
- name: 'id'
- value: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- }
- {
- name: 'Version'
- value: '1.0'
- }
- ]
- #disable-next-line BCP036
- type: 'Extension/AppInsightsExtension/PartType/AspNetOverviewPinnedPart'
- asset: {
- idInputName: 'id'
- type: 'ApplicationInsights'
- }
- defaultMenuItemId: 'overview'
- }
- }
- {
- position: {
- x: 2
- y: 0
- colSpan: 1
- rowSpan: 1
- }
- metadata: {
- inputs: [
- {
- name: 'ComponentId'
- value: {
- Name: applicationInsightsName
- SubscriptionId: subscription().subscriptionId
- ResourceGroup: resourceGroup().name
- }
- }
- {
- name: 'Version'
- value: '1.0'
- }
- ]
- #disable-next-line BCP036
- type: 'Extension/AppInsightsExtension/PartType/ProactiveDetectionAsyncPart'
- asset: {
- idInputName: 'ComponentId'
- type: 'ApplicationInsights'
- }
- defaultMenuItemId: 'ProactiveDetection'
- }
- }
- {
- position: {
- x: 3
- y: 0
- colSpan: 1
- rowSpan: 1
- }
- metadata: {
- inputs: [
- {
- name: 'ComponentId'
- value: {
- Name: applicationInsightsName
- SubscriptionId: subscription().subscriptionId
- ResourceGroup: resourceGroup().name
- }
- }
- {
- name: 'ResourceId'
- value: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- }
- ]
- #disable-next-line BCP036
- type: 'Extension/AppInsightsExtension/PartType/QuickPulseButtonSmallPart'
- asset: {
- idInputName: 'ComponentId'
- type: 'ApplicationInsights'
- }
- }
- }
- {
- position: {
- x: 4
- y: 0
- colSpan: 1
- rowSpan: 1
- }
- metadata: {
- inputs: [
- {
- name: 'ComponentId'
- value: {
- Name: applicationInsightsName
- SubscriptionId: subscription().subscriptionId
- ResourceGroup: resourceGroup().name
- }
- }
- {
- name: 'TimeContext'
- value: {
- durationMs: 86400000
- endTime: null
- createdTime: '2018-05-04T01:20:33.345Z'
- isInitialTime: true
- grain: 1
- useDashboardTimeRange: false
- }
- }
- {
- name: 'Version'
- value: '1.0'
- }
- ]
- #disable-next-line BCP036
- type: 'Extension/AppInsightsExtension/PartType/AvailabilityNavButtonPart'
- asset: {
- idInputName: 'ComponentId'
- type: 'ApplicationInsights'
- }
- }
- }
- {
- position: {
- x: 5
- y: 0
- colSpan: 1
- rowSpan: 1
- }
- metadata: {
- inputs: [
- {
- name: 'ComponentId'
- value: {
- Name: applicationInsightsName
- SubscriptionId: subscription().subscriptionId
- ResourceGroup: resourceGroup().name
- }
- }
- {
- name: 'TimeContext'
- value: {
- durationMs: 86400000
- endTime: null
- createdTime: '2018-05-08T18:47:35.237Z'
- isInitialTime: true
- grain: 1
- useDashboardTimeRange: false
- }
- }
- {
- name: 'ConfigurationId'
- value: '78ce933e-e864-4b05-a27b-71fd55a6afad'
- }
- ]
- #disable-next-line BCP036
- type: 'Extension/AppInsightsExtension/PartType/AppMapButtonPart'
- asset: {
- idInputName: 'ComponentId'
- type: 'ApplicationInsights'
- }
- }
- }
- {
- position: {
- x: 0
- y: 1
- colSpan: 3
- rowSpan: 1
- }
- metadata: {
- inputs: []
- type: 'Extension/HubsExtension/PartType/MarkdownPart'
- settings: {
- content: {
- settings: {
- content: '# Usage'
- title: ''
- subtitle: ''
- }
- }
- }
- }
- }
- {
- position: {
- x: 3
- y: 1
- colSpan: 1
- rowSpan: 1
- }
- metadata: {
- inputs: [
- {
- name: 'ComponentId'
- value: {
- Name: applicationInsightsName
- SubscriptionId: subscription().subscriptionId
- ResourceGroup: resourceGroup().name
- }
- }
- {
- name: 'TimeContext'
- value: {
- durationMs: 86400000
- endTime: null
- createdTime: '2018-05-04T01:22:35.782Z'
- isInitialTime: true
- grain: 1
- useDashboardTimeRange: false
- }
- }
- ]
- #disable-next-line BCP036
- type: 'Extension/AppInsightsExtension/PartType/UsageUsersOverviewPart'
- asset: {
- idInputName: 'ComponentId'
- type: 'ApplicationInsights'
- }
- }
- }
- {
- position: {
- x: 4
- y: 1
- colSpan: 3
- rowSpan: 1
- }
- metadata: {
- inputs: []
- type: 'Extension/HubsExtension/PartType/MarkdownPart'
- settings: {
- content: {
- settings: {
- content: '# Reliability'
- title: ''
- subtitle: ''
- }
- }
- }
- }
- }
- {
- position: {
- x: 7
- y: 1
- colSpan: 1
- rowSpan: 1
- }
- metadata: {
- inputs: [
- {
- name: 'ResourceId'
- value: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- }
- {
- name: 'DataModel'
- value: {
- version: '1.0.0'
- timeContext: {
- durationMs: 86400000
- createdTime: '2018-05-04T23:42:40.072Z'
- isInitialTime: false
- grain: 1
- useDashboardTimeRange: false
- }
- }
- isOptional: true
- }
- {
- name: 'ConfigurationId'
- value: '8a02f7bf-ac0f-40e1-afe9-f0e72cfee77f'
- isOptional: true
- }
- ]
- #disable-next-line BCP036
- type: 'Extension/AppInsightsExtension/PartType/CuratedBladeFailuresPinnedPart'
- isAdapter: true
- asset: {
- idInputName: 'ResourceId'
- type: 'ApplicationInsights'
- }
- defaultMenuItemId: 'failures'
- }
- }
- {
- position: {
- x: 8
- y: 1
- colSpan: 3
- rowSpan: 1
- }
- metadata: {
- inputs: []
- type: 'Extension/HubsExtension/PartType/MarkdownPart'
- settings: {
- content: {
- settings: {
- content: '# Responsiveness\r\n'
- title: ''
- subtitle: ''
- }
- }
- }
- }
- }
- {
- position: {
- x: 11
- y: 1
- colSpan: 1
- rowSpan: 1
- }
- metadata: {
- inputs: [
- {
- name: 'ResourceId'
- value: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- }
- {
- name: 'DataModel'
- value: {
- version: '1.0.0'
- timeContext: {
- durationMs: 86400000
- createdTime: '2018-05-04T23:43:37.804Z'
- isInitialTime: false
- grain: 1
- useDashboardTimeRange: false
- }
- }
- isOptional: true
- }
- {
- name: 'ConfigurationId'
- value: '2a8ede4f-2bee-4b9c-aed9-2db0e8a01865'
- isOptional: true
- }
- ]
- #disable-next-line BCP036
- type: 'Extension/AppInsightsExtension/PartType/CuratedBladePerformancePinnedPart'
- isAdapter: true
- asset: {
- idInputName: 'ResourceId'
- type: 'ApplicationInsights'
- }
- defaultMenuItemId: 'performance'
- }
- }
- {
- position: {
- x: 12
- y: 1
- colSpan: 3
- rowSpan: 1
- }
- metadata: {
- inputs: []
- type: 'Extension/HubsExtension/PartType/MarkdownPart'
- settings: {
- content: {
- settings: {
- content: '# Browser'
- title: ''
- subtitle: ''
- }
- }
- }
- }
- }
- {
- position: {
- x: 15
- y: 1
- colSpan: 1
- rowSpan: 1
- }
- metadata: {
- inputs: [
- {
- name: 'ComponentId'
- value: {
- Name: applicationInsightsName
- SubscriptionId: subscription().subscriptionId
- ResourceGroup: resourceGroup().name
- }
- }
- {
- name: 'MetricsExplorerJsonDefinitionId'
- value: 'BrowserPerformanceTimelineMetrics'
- }
- {
- name: 'TimeContext'
- value: {
- durationMs: 86400000
- createdTime: '2018-05-08T12:16:27.534Z'
- isInitialTime: false
- grain: 1
- useDashboardTimeRange: false
- }
- }
- {
- name: 'CurrentFilter'
- value: {
- eventTypes: [
- 4
- 1
- 3
- 5
- 2
- 6
- 13
- ]
- typeFacets: {}
- isPermissive: false
- }
- }
- {
- name: 'id'
- value: {
- Name: applicationInsightsName
- SubscriptionId: subscription().subscriptionId
- ResourceGroup: resourceGroup().name
- }
- }
- {
- name: 'Version'
- value: '1.0'
- }
- ]
- #disable-next-line BCP036
- type: 'Extension/AppInsightsExtension/PartType/MetricsExplorerBladePinnedPart'
- asset: {
- idInputName: 'ComponentId'
- type: 'ApplicationInsights'
- }
- defaultMenuItemId: 'browser'
- }
- }
- {
- position: {
- x: 0
- y: 2
- colSpan: 4
- rowSpan: 3
- }
- metadata: {
- inputs: [
- {
- name: 'options'
- value: {
- chart: {
- metrics: [
- {
- resourceMetadata: {
- id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- }
- name: 'sessions/count'
- aggregationType: 5
- namespace: 'microsoft.insights/components/kusto'
- metricVisualization: {
- displayName: 'Sessions'
- color: '#47BDF5'
- }
- }
- {
- resourceMetadata: {
- id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- }
- name: 'users/count'
- aggregationType: 5
- namespace: 'microsoft.insights/components/kusto'
- metricVisualization: {
- displayName: 'Users'
- color: '#7E58FF'
- }
- }
- ]
- title: 'Unique sessions and users'
- visualization: {
- chartType: 2
- legendVisualization: {
- isVisible: true
- position: 2
- hideSubtitle: false
- }
- axisVisualization: {
- x: {
- isVisible: true
- axisType: 2
- }
- y: {
- isVisible: true
- axisType: 1
- }
- }
- }
- openBladeOnClick: {
- openBlade: true
- destinationBlade: {
- extensionName: 'HubsExtension'
- bladeName: 'ResourceMenuBlade'
- parameters: {
- id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- menuid: 'segmentationUsers'
- }
- }
- }
- }
- }
- }
- {
- name: 'sharedTimeRange'
- isOptional: true
- }
- ]
- #disable-next-line BCP036
- type: 'Extension/HubsExtension/PartType/MonitorChartPart'
- settings: {}
- }
- }
- {
- position: {
- x: 4
- y: 2
- colSpan: 4
- rowSpan: 3
- }
- metadata: {
- inputs: [
- {
- name: 'options'
- value: {
- chart: {
- metrics: [
- {
- resourceMetadata: {
- id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- }
- name: 'requests/failed'
- aggregationType: 7
- namespace: 'microsoft.insights/components'
- metricVisualization: {
- displayName: 'Failed requests'
- color: '#EC008C'
- }
- }
- ]
- title: 'Failed requests'
- visualization: {
- chartType: 3
- legendVisualization: {
- isVisible: true
- position: 2
- hideSubtitle: false
- }
- axisVisualization: {
- x: {
- isVisible: true
- axisType: 2
- }
- y: {
- isVisible: true
- axisType: 1
- }
- }
- }
- openBladeOnClick: {
- openBlade: true
- destinationBlade: {
- extensionName: 'HubsExtension'
- bladeName: 'ResourceMenuBlade'
- parameters: {
- id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- menuid: 'failures'
- }
- }
- }
- }
- }
- }
- {
- name: 'sharedTimeRange'
- isOptional: true
- }
- ]
- #disable-next-line BCP036
- type: 'Extension/HubsExtension/PartType/MonitorChartPart'
- settings: {}
- }
- }
- {
- position: {
- x: 8
- y: 2
- colSpan: 4
- rowSpan: 3
- }
- metadata: {
- inputs: [
- {
- name: 'options'
- value: {
- chart: {
- metrics: [
- {
- resourceMetadata: {
- id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- }
- name: 'requests/duration'
- aggregationType: 4
- namespace: 'microsoft.insights/components'
- metricVisualization: {
- displayName: 'Server response time'
- color: '#00BCF2'
- }
- }
- ]
- title: 'Server response time'
- visualization: {
- chartType: 2
- legendVisualization: {
- isVisible: true
- position: 2
- hideSubtitle: false
- }
- axisVisualization: {
- x: {
- isVisible: true
- axisType: 2
- }
- y: {
- isVisible: true
- axisType: 1
- }
- }
- }
- openBladeOnClick: {
- openBlade: true
- destinationBlade: {
- extensionName: 'HubsExtension'
- bladeName: 'ResourceMenuBlade'
- parameters: {
- id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- menuid: 'performance'
- }
- }
- }
- }
- }
- }
- {
- name: 'sharedTimeRange'
- isOptional: true
- }
- ]
- #disable-next-line BCP036
- type: 'Extension/HubsExtension/PartType/MonitorChartPart'
- settings: {}
- }
- }
- {
- position: {
- x: 12
- y: 2
- colSpan: 4
- rowSpan: 3
- }
- metadata: {
- inputs: [
- {
- name: 'options'
- value: {
- chart: {
- metrics: [
- {
- resourceMetadata: {
- id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- }
- name: 'browserTimings/networkDuration'
- aggregationType: 4
- namespace: 'microsoft.insights/components'
- metricVisualization: {
- displayName: 'Page load network connect time'
- color: '#7E58FF'
- }
- }
- {
- resourceMetadata: {
- id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- }
- name: 'browserTimings/processingDuration'
- aggregationType: 4
- namespace: 'microsoft.insights/components'
- metricVisualization: {
- displayName: 'Client processing time'
- color: '#44F1C8'
- }
- }
- {
- resourceMetadata: {
- id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- }
- name: 'browserTimings/sendDuration'
- aggregationType: 4
- namespace: 'microsoft.insights/components'
- metricVisualization: {
- displayName: 'Send request time'
- color: '#EB9371'
- }
- }
- {
- resourceMetadata: {
- id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- }
- name: 'browserTimings/receiveDuration'
- aggregationType: 4
- namespace: 'microsoft.insights/components'
- metricVisualization: {
- displayName: 'Receiving response time'
- color: '#0672F1'
- }
- }
- ]
- title: 'Average page load time breakdown'
- visualization: {
- chartType: 3
- legendVisualization: {
- isVisible: true
- position: 2
- hideSubtitle: false
- }
- axisVisualization: {
- x: {
- isVisible: true
- axisType: 2
- }
- y: {
- isVisible: true
- axisType: 1
- }
- }
- }
- }
- }
- }
- {
- name: 'sharedTimeRange'
- isOptional: true
- }
- ]
- #disable-next-line BCP036
- type: 'Extension/HubsExtension/PartType/MonitorChartPart'
- settings: {}
- }
- }
- {
- position: {
- x: 0
- y: 5
- colSpan: 4
- rowSpan: 3
- }
- metadata: {
- inputs: [
- {
- name: 'options'
- value: {
- chart: {
- metrics: [
- {
- resourceMetadata: {
- id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- }
- name: 'availabilityResults/availabilityPercentage'
- aggregationType: 4
- namespace: 'microsoft.insights/components'
- metricVisualization: {
- displayName: 'Availability'
- color: '#47BDF5'
- }
- }
- ]
- title: 'Average availability'
- visualization: {
- chartType: 3
- legendVisualization: {
- isVisible: true
- position: 2
- hideSubtitle: false
- }
- axisVisualization: {
- x: {
- isVisible: true
- axisType: 2
- }
- y: {
- isVisible: true
- axisType: 1
- }
- }
- }
- openBladeOnClick: {
- openBlade: true
- destinationBlade: {
- extensionName: 'HubsExtension'
- bladeName: 'ResourceMenuBlade'
- parameters: {
- id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- menuid: 'availability'
- }
- }
- }
- }
- }
- }
- {
- name: 'sharedTimeRange'
- isOptional: true
- }
- ]
- #disable-next-line BCP036
- type: 'Extension/HubsExtension/PartType/MonitorChartPart'
- settings: {}
- }
- }
- {
- position: {
- x: 4
- y: 5
- colSpan: 4
- rowSpan: 3
- }
- metadata: {
- inputs: [
- {
- name: 'options'
- value: {
- chart: {
- metrics: [
- {
- resourceMetadata: {
- id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- }
- name: 'exceptions/server'
- aggregationType: 7
- namespace: 'microsoft.insights/components'
- metricVisualization: {
- displayName: 'Server exceptions'
- color: '#47BDF5'
- }
- }
- {
- resourceMetadata: {
- id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- }
- name: 'dependencies/failed'
- aggregationType: 7
- namespace: 'microsoft.insights/components'
- metricVisualization: {
- displayName: 'Dependency failures'
- color: '#7E58FF'
- }
- }
- ]
- title: 'Server exceptions and Dependency failures'
- visualization: {
- chartType: 2
- legendVisualization: {
- isVisible: true
- position: 2
- hideSubtitle: false
- }
- axisVisualization: {
- x: {
- isVisible: true
- axisType: 2
- }
- y: {
- isVisible: true
- axisType: 1
- }
- }
- }
- }
- }
- }
- {
- name: 'sharedTimeRange'
- isOptional: true
- }
- ]
- #disable-next-line BCP036
- type: 'Extension/HubsExtension/PartType/MonitorChartPart'
- settings: {}
- }
- }
- {
- position: {
- x: 8
- y: 5
- colSpan: 4
- rowSpan: 3
- }
- metadata: {
- inputs: [
- {
- name: 'options'
- value: {
- chart: {
- metrics: [
- {
- resourceMetadata: {
- id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- }
- name: 'performanceCounters/processorCpuPercentage'
- aggregationType: 4
- namespace: 'microsoft.insights/components'
- metricVisualization: {
- displayName: 'Processor time'
- color: '#47BDF5'
- }
- }
- {
- resourceMetadata: {
- id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- }
- name: 'performanceCounters/processCpuPercentage'
- aggregationType: 4
- namespace: 'microsoft.insights/components'
- metricVisualization: {
- displayName: 'Process CPU'
- color: '#7E58FF'
- }
- }
- ]
- title: 'Average processor and process CPU utilization'
- visualization: {
- chartType: 2
- legendVisualization: {
- isVisible: true
- position: 2
- hideSubtitle: false
- }
- axisVisualization: {
- x: {
- isVisible: true
- axisType: 2
- }
- y: {
- isVisible: true
- axisType: 1
- }
- }
- }
- }
- }
- }
- {
- name: 'sharedTimeRange'
- isOptional: true
- }
- ]
- #disable-next-line BCP036
- type: 'Extension/HubsExtension/PartType/MonitorChartPart'
- settings: {}
- }
- }
- {
- position: {
- x: 12
- y: 5
- colSpan: 4
- rowSpan: 3
- }
- metadata: {
- inputs: [
- {
- name: 'options'
- value: {
- chart: {
- metrics: [
- {
- resourceMetadata: {
- id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- }
- name: 'exceptions/browser'
- aggregationType: 7
- namespace: 'microsoft.insights/components'
- metricVisualization: {
- displayName: 'Browser exceptions'
- color: '#47BDF5'
- }
- }
- ]
- title: 'Browser exceptions'
- visualization: {
- chartType: 2
- legendVisualization: {
- isVisible: true
- position: 2
- hideSubtitle: false
- }
- axisVisualization: {
- x: {
- isVisible: true
- axisType: 2
- }
- y: {
- isVisible: true
- axisType: 1
- }
- }
- }
- }
- }
- }
- {
- name: 'sharedTimeRange'
- isOptional: true
- }
- ]
- #disable-next-line BCP036
- type: 'Extension/HubsExtension/PartType/MonitorChartPart'
- settings: {}
- }
- }
- {
- position: {
- x: 0
- y: 8
- colSpan: 4
- rowSpan: 3
- }
- metadata: {
- inputs: [
- {
- name: 'options'
- value: {
- chart: {
- metrics: [
- {
- resourceMetadata: {
- id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- }
- name: 'availabilityResults/count'
- aggregationType: 7
- namespace: 'microsoft.insights/components'
- metricVisualization: {
- displayName: 'Availability test results count'
- color: '#47BDF5'
- }
- }
- ]
- title: 'Availability test results count'
- visualization: {
- chartType: 2
- legendVisualization: {
- isVisible: true
- position: 2
- hideSubtitle: false
- }
- axisVisualization: {
- x: {
- isVisible: true
- axisType: 2
- }
- y: {
- isVisible: true
- axisType: 1
- }
- }
- }
- }
- }
- }
- {
- name: 'sharedTimeRange'
- isOptional: true
- }
- ]
- #disable-next-line BCP036
- type: 'Extension/HubsExtension/PartType/MonitorChartPart'
- settings: {}
- }
- }
- {
- position: {
- x: 4
- y: 8
- colSpan: 4
- rowSpan: 3
- }
- metadata: {
- inputs: [
- {
- name: 'options'
- value: {
- chart: {
- metrics: [
- {
- resourceMetadata: {
- id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- }
- name: 'performanceCounters/processIOBytesPerSecond'
- aggregationType: 4
- namespace: 'microsoft.insights/components'
- metricVisualization: {
- displayName: 'Process IO rate'
- color: '#47BDF5'
- }
- }
- ]
- title: 'Average process I/O rate'
- visualization: {
- chartType: 2
- legendVisualization: {
- isVisible: true
- position: 2
- hideSubtitle: false
- }
- axisVisualization: {
- x: {
- isVisible: true
- axisType: 2
- }
- y: {
- isVisible: true
- axisType: 1
- }
- }
- }
- }
- }
- }
- {
- name: 'sharedTimeRange'
- isOptional: true
- }
- ]
- #disable-next-line BCP036
- type: 'Extension/HubsExtension/PartType/MonitorChartPart'
- settings: {}
- }
- }
- {
- position: {
- x: 8
- y: 8
- colSpan: 4
- rowSpan: 3
- }
- metadata: {
- inputs: [
- {
- name: 'options'
- value: {
- chart: {
- metrics: [
- {
- resourceMetadata: {
- id: '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.Insights/components/${applicationInsightsName}'
- }
- name: 'performanceCounters/memoryAvailableBytes'
- aggregationType: 4
- namespace: 'microsoft.insights/components'
- metricVisualization: {
- displayName: 'Available memory'
- color: '#47BDF5'
- }
- }
- ]
- title: 'Average available memory'
- visualization: {
- chartType: 2
- legendVisualization: {
- isVisible: true
- position: 2
- hideSubtitle: false
- }
- axisVisualization: {
- x: {
- isVisible: true
- axisType: 2
- }
- y: {
- isVisible: true
- axisType: 1
- }
- }
- }
- }
- }
- }
- {
- name: 'sharedTimeRange'
- isOptional: true
- }
- ]
- #disable-next-line BCP036
- type: 'Extension/HubsExtension/PartType/MonitorChartPart'
- settings: {}
- }
- }
- ]
- }
- ]
- }
-}
diff --git a/samples/durable-functions/python/pdf-summarizer/infra/shared/keyvault.bicep b/samples/durable-functions/python/pdf-summarizer/infra/shared/keyvault.bicep
deleted file mode 100644
index f84f7508..00000000
--- a/samples/durable-functions/python/pdf-summarizer/infra/shared/keyvault.bicep
+++ /dev/null
@@ -1,31 +0,0 @@
-param name string
-param location string = resourceGroup().location
-param tags object = {}
-
-@description('Service principal that should be granted read access to the KeyVault. If unset, no service principal is granted access by default')
-param principalId string = ''
-
-var defaultAccessPolicies = !empty(principalId) ? [
- {
- objectId: principalId
- permissions: { secrets: [ 'get', 'list' ] }
- tenantId: subscription().tenantId
- }
-] : []
-
-resource keyVault 'Microsoft.KeyVault/vaults@2022-07-01' = {
- name: name
- location: location
- tags: tags
- properties: {
- tenantId: subscription().tenantId
- sku: { family: 'A', name: 'standard' }
- enabledForTemplateDeployment: true
- accessPolicies: union(defaultAccessPolicies, [
- // define access policies here
- ])
- }
-}
-
-output endpoint string = keyVault.properties.vaultUri
-output name string = keyVault.name
diff --git a/samples/durable-functions/python/pdf-summarizer/infra/shared/monitoring.bicep b/samples/durable-functions/python/pdf-summarizer/infra/shared/monitoring.bicep
deleted file mode 100644
index 4ae9796c..00000000
--- a/samples/durable-functions/python/pdf-summarizer/infra/shared/monitoring.bicep
+++ /dev/null
@@ -1,34 +0,0 @@
-param logAnalyticsName string
-param applicationInsightsName string
-param location string = resourceGroup().location
-param tags object = {}
-
-resource logAnalytics 'Microsoft.OperationalInsights/workspaces@2021-12-01-preview' = {
- name: logAnalyticsName
- location: location
- tags: tags
- properties: any({
- retentionInDays: 30
- features: {
- searchVersion: 1
- }
- sku: {
- name: 'PerGB2018'
- }
- })
-}
-
-resource applicationInsights 'Microsoft.Insights/components@2020-02-02' = {
- name: applicationInsightsName
- location: location
- tags: tags
- kind: 'web'
- properties: {
- Application_Type: 'web'
- WorkspaceResourceId: logAnalytics.id
- }
-}
-
-output applicationInsightsName string = applicationInsights.name
-output logAnalyticsWorkspaceId string = logAnalytics.id
-output logAnalyticsWorkspaceName string = logAnalytics.name
diff --git a/samples/durable-functions/python/pdf-summarizer/infra/shared/registry.bicep b/samples/durable-functions/python/pdf-summarizer/infra/shared/registry.bicep
deleted file mode 100644
index d6629f86..00000000
--- a/samples/durable-functions/python/pdf-summarizer/infra/shared/registry.bicep
+++ /dev/null
@@ -1,36 +0,0 @@
-param name string
-param location string = resourceGroup().location
-param tags object = {}
-
-param adminUserEnabled bool = true
-param anonymousPullEnabled bool = false
-param dataEndpointEnabled bool = false
-param encryption object = {
- status: 'disabled'
-}
-param networkRuleBypassOptions string = 'AzureServices'
-param publicNetworkAccess string = 'Enabled'
-param sku object = {
- name: 'Standard'
-}
-param zoneRedundancy string = 'Disabled'
-
-// 2023-01-01-preview needed for anonymousPullEnabled
-resource containerRegistry 'Microsoft.ContainerRegistry/registries@2023-01-01-preview' = {
- name: name
- location: location
- tags: tags
- sku: sku
- properties: {
- adminUserEnabled: adminUserEnabled
- anonymousPullEnabled: anonymousPullEnabled
- dataEndpointEnabled: dataEndpointEnabled
- encryption: encryption
- networkRuleBypassOptions: networkRuleBypassOptions
- publicNetworkAccess: publicNetworkAccess
- zoneRedundancy: zoneRedundancy
- }
-}
-
-output loginServer string = containerRegistry.properties.loginServer
-output name string = containerRegistry.name
diff --git a/samples/durable-functions/python/pdf-summarizer/next-steps.md b/samples/durable-functions/python/pdf-summarizer/next-steps.md
deleted file mode 100644
index 1377f4e3..00000000
--- a/samples/durable-functions/python/pdf-summarizer/next-steps.md
+++ /dev/null
@@ -1,93 +0,0 @@
-# Next Steps after `azd init`
-
-## Table of Contents
-
-1. [Next Steps](#next-steps)
-2. [What was added](#what-was-added)
-3. [Billing](#billing)
-4. [Troubleshooting](#troubleshooting)
-
-## Next Steps
-
-### Provision infrastructure and deploy application code
-
-Run `azd up` to provision your infrastructure and deploy to Azure (or run `azd provision` then `azd deploy` to accomplish the tasks separately). Visit the service endpoints listed to see your application up-and-running!
-
-To troubleshoot any issues, see [troubleshooting](#troubleshooting).
-
-### Configure environment variables for running services
-
-Configure environment variables for running services by updating `settings` in [main.parameters.json](./infra/main.parameters.json).
-
-### Configure CI/CD pipeline
-
-1. Create a workflow pipeline file locally. The following starters are available:
- - [Deploy with GitHub Actions](https://github.com/Azure-Samples/azd-starter-bicep/blob/main/.github/workflows/azure-dev.yml)
- - [Deploy with Azure Pipelines](https://github.com/Azure-Samples/azd-starter-bicep/blob/main/.azdo/pipelines/azure-dev.yml)
-2. Run `azd pipeline config` to configure the deployment pipeline to connect securely to Azure.
-
-## What was added
-
-### Infrastructure configuration
-
-To describe the infrastructure and application, `azure.yaml` along with Infrastructure as Code files using Bicep were added with the following directory structure:
-
-```yaml
-- azure.yaml # azd project configuration
-- infra/ # Infrastructure as Code (bicep) files
- - main.bicep # main deployment module
- - app/ # Application resource modules
- - shared/ # Shared resource modules
- - modules/ # Library modules
-```
-
-Each bicep file declares resources to be provisioned. The resources are provisioned when running `azd up` or `azd provision`.
-
-- [app/functions-app.bicep](./infra/app/functions-app.bicep) - Azure Container Apps resources to host the 'functions-app' service.
-- [shared/keyvault.bicep](./infra/shared/keyvault.bicep) - Azure KeyVault to store secrets.
-- [shared/monitoring.bicep](./infra/shared/monitoring.bicep) - Azure Log Analytics workspace and Application Insights to log and store instrumentation logs.
-- [shared/registry.bicep](./infra/shared/registry.bicep) - Azure Container Registry to store docker images.
-
-More information about [Bicep](https://aka.ms/bicep) language.
-
-### Build from source (no Dockerfile)
-
-#### Build with Buildpacks using Oryx
-
-If your project does not contain a Dockerfile, we will use [Buildpacks](https://buildpacks.io/) using [Oryx](https://github.com/microsoft/Oryx/blob/main/doc/README.md) to create an image for the services in `azure.yaml` and get your containerized app onto Azure.
-
-To produce and run the docker image locally:
-
-1. Run `azd package` to build the image.
-2. Copy the *Image Tag* shown.
-3. Run `docker run -it ` to run the image locally.
-
-#### Exposed port
-
-Oryx will automatically set `PORT` to a default value of `80` (port `8080` for Java). Additionally, it will auto-configure supported web servers such as `gunicorn` and `ASP .NET Core` to listen to the target `PORT`. If your application already listens to the port specified by the `PORT` variable, the application will work out-of-the-box. Otherwise, you may need to perform one of the steps below:
-
-1. Update your application code or configuration to listen to the port specified by the `PORT` variable
-1. (Alternatively) Search for `targetPort` in a .bicep file under the `infra/app` folder, and update the variable to match the port used by the application.
-
-## Billing
-
-Visit the *Cost Management + Billing* page in Azure Portal to track current spend. For more information about how you're billed, and how you can monitor the costs incurred in your Azure subscriptions, visit [billing overview](https://learn.microsoft.com/azure/developer/intro/azure-developer-billing).
-
-## Troubleshooting
-
-Q: I visited the service endpoint listed, and I'm seeing a blank page, a generic welcome page, or an error page.
-
-A: Your service may have failed to start, or it may be missing some configuration settings. To investigate further:
-
-1. Run `azd show`. Click on the link under "View in Azure Portal" to open the resource group in Azure Portal.
-2. Navigate to the specific Container App service that is failing to deploy.
-3. Click on the failing revision under "Revisions with Issues".
-4. Review "Status details" for more information about the type of failure.
-5. Observe the log outputs from Console log stream and System log stream to identify any errors.
-6. If logs are written to disk, use *Console* in the navigation to connect to a shell within the running container.
-
-For more troubleshooting information, visit [Container Apps troubleshooting](https://learn.microsoft.com/azure/container-apps/troubleshooting).
-
-### Additional information
-
-For additional information about setting up your `azd` project, visit our official [docs](https://learn.microsoft.com/azure/developer/azure-developer-cli/make-azd-compatible?pivots=azd-convert).
diff --git a/samples/durable-functions/python/pdf-summarizer/requirements.txt b/samples/durable-functions/python/pdf-summarizer/requirements.txt
deleted file mode 100644
index 01f0b556..00000000
--- a/samples/durable-functions/python/pdf-summarizer/requirements.txt
+++ /dev/null
@@ -1,15 +0,0 @@
-# DO NOT include azure-functions-worker in this file
-# The Python Worker is managed by Azure Functions platform
-# Manually managing azure-functions-worker may cause unexpected issues
-
-cryptography
-azure-functions
-azure-functions-durable
-azure-ai-documentintelligence
-azure-storage-blob
-azure-identity
-azure-ai-formrecognizer
-requests
-pandas
-numpy
-PyPDF2
\ No newline at end of file
diff --git a/samples/durable-task-sdks/dotnet/Agents/AgentDirectedWorkflows/README.md b/samples/durable-task-sdks/dotnet/Agents/AgentDirectedWorkflows/README.md
index 49089eea..8c1950d9 100644
--- a/samples/durable-task-sdks/dotnet/Agents/AgentDirectedWorkflows/README.md
+++ b/samples/durable-task-sdks/dotnet/Agents/AgentDirectedWorkflows/README.md
@@ -1,14 +1,14 @@
-# Agent-Directed Workflows โ Durable Task SDK (.NET)
+# Agent-Directed Workflows - Durable Task SDK (.NET)
This sample demonstrates how to build an **agent-directed workflow** (agent loop) using [durable entities](https://learn.microsoft.com/azure/durable-task/concepts/entities) from the [Durable Task SDK for .NET](https://github.com/microsoft/durabletask-dotnet) with the [Durable Task Scheduler](https://learn.microsoft.com/azure/durable-task/overview).
It corresponds to the **"Build your own using orchestrations and entities"** approach described in the [Durable Task for AI Agents](https://learn.microsoft.com/azure/durable-task/sdks/durable-task-for-ai-agents) comparison table, using the **entity-based agent loop** pattern from [Agentic Application Patterns](https://learn.microsoft.com/azure/durable-task/sdks/durable-agents-patterns#entity-based-agent-loops).
-> **Note:** A [Durable Functions version](../../../durable-functions/dotnet/AgentDirectedWorkflows/) of this sample is also available. This version uses the Durable Task SDK directly (no Azure Functions dependency), which gives you full control over the web host and API surface.
+> **Note:** A [Durable Functions version](../../../../durable-functions/dotnet/AgentDirectedWorkflows/) of this sample is also available. This version uses the Durable Task SDK directly (no Azure Functions dependency), which gives you full control over the web host and API surface.
## What Is an Agent-Directed Workflow?
-In a typical deterministic workflow, *your code* controls the execution path โ you define the sequence of steps ahead of time. In an **agent-directed workflow** (also called an agent loop), the **LLM drives the control flow**. You provide tools and instructions, but the agent decides which tools to call, in what order, and when the task is complete. The execution path isn't known until runtime.
+In a typical deterministic workflow, *your code* controls the execution path: you define the sequence of steps ahead of time. In an **agent-directed workflow** (also called an agent loop), the **LLM drives the control flow**. You provide tools and instructions, but the agent decides which tools to call, in what order, and when the task is complete. The execution path isn't known until runtime.
This pattern is well suited for conversational agents with tool-calling capabilities, open-ended research tasks, and any scenario where the number and order of steps can't be predicted.
@@ -16,7 +16,7 @@ This pattern is well suited for conversational agents with tool-calling capabili
### The Core Idea
-Each chat session is a **durable entity** โ a long-lived, stateful actor managed by the Durable Task Scheduler. The entity holds the full conversation history in its state. When you send it a message, it runs the agent loop internally and **streams the LLM's response in real-time** via Redis pub/sub:
+Each chat session is a **durable entity**, a long-lived, stateful actor managed by the Durable Task Scheduler. The entity holds the full conversation history in its state. When you send it a message, it runs the agent loop internally and **streams the LLM's response in real-time** via Redis pub/sub:
```
User: "What's the weather in Seattle?"
@@ -49,14 +49,14 @@ User: "What's the weather in Seattle?"
**Key properties:**
- **Durable state**: The entity's conversation history survives restarts, crashes, and scaling events.
- **Real-time streaming**: LLM response tokens are published to Redis and forwarded to the client as SSE events as they're generated.
-- **No orchestration bridge**: The HTTP layer signals the entity (fire-and-forget) and reads the response from Redis โ no intermediate orchestration needed.
+- **No orchestration bridge**: The HTTP layer signals the entity (fire-and-forget) and reads the response from Redis, with no intermediate orchestration needed.
### Why Entities?
Durable entities are a natural fit for AI agents because:
- **Long-lived state**: An entity persists for as long as you need it. A chat session can last minutes, days, or weeks.
-- **Automatic persistence**: You just read and write `State` โ the framework handles serialization and storage.
+- **Automatic persistence**: You read and write `State`; the framework handles serialization and storage.
- **Actor model**: Each entity processes one operation at a time, so there are no concurrency issues with the conversation history.
- **Addressable**: Each entity has a unique ID (the session ID), making it easy to route messages to the right agent.
@@ -86,15 +86,15 @@ AgentDirectedWorkflows/
### Key Files Explained
-**`ChatAgentEntity.cs`** โ The durable entity. Its `Message()` method is the agent loop: it streams from the LLM via `GetStreamingResponseAsync`, publishes text chunks to Redis, checks for tool calls, and repeats until the LLM gives a final text reply. State (conversation history) is persisted automatically.
+**`ChatAgentEntity.cs`** - The durable entity. Its `Message()` method is the agent loop: it streams from the LLM via `GetStreamingResponseAsync`, publishes text chunks to Redis, checks for tool calls, and repeats until the LLM gives a final text reply. State (conversation history) is persisted automatically.
-**`Program.cs`** โ A standard ASP.NET minimal API that:
+**`Program.cs`** - A standard ASP.NET minimal API that:
1. Registers the `IChatClient` (Azure OpenAI if configured, echo fallback otherwise)
2. Registers the Redis `IConnectionMultiplexer` for pub/sub streaming
3. Registers the Durable Task worker with the entity
4. Defines SSE streaming endpoints for interacting with agent sessions
-**`Tools/AgentTools.cs`** โ Defines what tools the LLM can call. Currently includes `get_weather` (with a hardcoded response). To add new capabilities, add a definition and an execution case. The LLM discovers available tools automatically.
+**`Tools/AgentTools.cs`** - Defines what tools the LLM can call. Currently includes `get_weather` (with a hardcoded response). To add new capabilities, add a definition and an execution case. The LLM discovers available tools automatically.
## Prerequisites
@@ -122,7 +122,7 @@ export AZURE_OPENAI_ENDPOINT="https://.openai.azure.com"
export AZURE_OPENAI_DEPLOYMENT=""
```
-The sample uses `DefaultAzureCredential` for authentication โ make sure you're signed in via `az login`.
+The sample uses `DefaultAzureCredential` for authentication. Make sure you're signed in via `az login`.
### 3. Run the app
@@ -135,7 +135,7 @@ The app connects to the local emulator at `http://localhost:8080` by default.
### 4. Chat with the agent
```bash
-# Streaming (default) โ response streams as Server-Sent Events
+# Streaming (default): response streams as Server-Sent Events
curl -N -X POST http://localhost:5000/chat/session1 \
-H "Content-Type: application/json" \
-d '{"message":"What is the weather in Seattle?"}'
@@ -147,7 +147,7 @@ curl -N -X POST http://localhost:5000/chat/session1 \
# data: {"type":"chunk","content":" in Seattle."}
# data: {"type":"done"}
-# Non-streaming โ waits for the full response and returns JSON
+# Non-streaming: waits for the full response and returns JSON
curl -X POST "http://localhost:5000/chat/session1?stream=false" \
-H "Content-Type: application/json" \
-d '{"message":"What is the weather in Seattle?"}'
@@ -201,7 +201,7 @@ The LLM will automatically discover the new tool and call it when appropriate.
## Learn More
-- [Durable Task for AI Agents](https://learn.microsoft.com/azure/durable-task/sdks/durable-task-for-ai-agents) โ Overview of how durable execution solves production challenges for AI agents
-- [Agentic Application Patterns](https://learn.microsoft.com/azure/durable-task/sdks/durable-agents-patterns) โ All supported patterns (deterministic workflows, agent loops, orchestration-based vs entity-based)
-- [Durable Entities](https://learn.microsoft.com/azure/durable-task/concepts/entities) โ Deep dive on the entity programming model
-- [Microsoft.Extensions.AI](https://learn.microsoft.com/dotnet/ai/microsoft-extensions-ai) โ The AI abstraction layer used for LLM integration
+- [Durable Task for AI Agents](https://learn.microsoft.com/azure/durable-task/sdks/durable-task-for-ai-agents) - Overview of how durable execution solves production challenges for AI agents
+- [Agentic Application Patterns](https://learn.microsoft.com/azure/durable-task/sdks/durable-agents-patterns) - All supported patterns (deterministic workflows, agent loops, orchestration-based vs entity-based)
+- [Durable Entities](https://learn.microsoft.com/azure/durable-task/common/durable-task-entities) - Deep dive on the entity programming model
+- [Microsoft.Extensions.AI](https://learn.microsoft.com/dotnet/ai/microsoft-extensions-ai) - The AI abstraction layer used for LLM integration
diff --git a/samples/durable-task-sdks/dotnet/Agents/PromptChaining/README.md b/samples/durable-task-sdks/dotnet/Agents/PromptChaining/README.md
index 647b9e98..a5d9c38d 100644
--- a/samples/durable-task-sdks/dotnet/Agents/PromptChaining/README.md
+++ b/samples/durable-task-sdks/dotnet/Agents/PromptChaining/README.md
@@ -16,7 +16,7 @@ The workflow is orchestrated using the Durable Task SDK, which handles the workf
## Prerequisites
-- [.NET 8 SDK](https://dotnet.microsoft.com/download/dotnet/8.0)
+- [.NET 10 SDK](https://dotnet.microsoft.com/download/dotnet/10.0)
- [Docker](https://www.docker.com/products/docker-desktop/) (for the Durable Task Scheduler emulator)
- Azure AI Projects service
- Azure credentials (via az login)
diff --git a/samples/durable-task-sdks/dotnet/AspNetWebApp/README.md b/samples/durable-task-sdks/dotnet/AspNetWebApp/README.md
index 2a7667e1..b864a744 100644
--- a/samples/durable-task-sdks/dotnet/AspNetWebApp/README.md
+++ b/samples/durable-task-sdks/dotnet/AspNetWebApp/README.md
@@ -2,11 +2,11 @@
In addition to [Durable Functions](https://learn.microsoft.com/azure/azure-functions/durable/durable-functions-overview), the [Durable Task SDK for .NET](https://github.com/microsoft/durabletask-dotnet) can also use the durable task scheduler for managing orchestration state.
-This directory includes a sample .NET console app that demonstrates how to use the scheduler with the Durable Task SDK for .NET (without any Azure Functions dependency).
+This directory includes a sample ASP.NET Core web app that demonstrates how to use the scheduler with the Durable Task SDK for .NET (without any Azure Functions dependency).
## Prerequisites
-- [.NET 8 SDK](https://dotnet.microsoft.com/download/dotnet/8.0)
+- [.NET 10 SDK](https://dotnet.microsoft.com/download/dotnet/10.0)
- [Azure CLI](https://docs.microsoft.com/cli/azure/install-azure-cli)
- [Docker](https://www.docker.com/products/docker-desktop/) (for running the emulator) installed
diff --git a/samples/durable-task-sdks/dotnet/EntitiesSample/README.md b/samples/durable-task-sdks/dotnet/EntitiesSample/README.md
index ee3145f6..96f81c1a 100644
--- a/samples/durable-task-sdks/dotnet/EntitiesSample/README.md
+++ b/samples/durable-task-sdks/dotnet/EntitiesSample/README.md
@@ -4,7 +4,7 @@ The [Durable Task SDK for .NET](https://github.com/microsoft/durabletask-dotnet)
## Prerequisites
-- [.NET 8 SDK](https://dotnet.microsoft.com/download/dotnet/8.0)
+- [.NET 10 SDK](https://dotnet.microsoft.com/download/dotnet/10.0)
- [Azure CLI](https://docs.microsoft.com/cli/azure/install-azure-cli)
- [Docker](https://www.docker.com/get-started) installed
diff --git a/samples/durable-task-sdks/dotnet/EternalOrchestrations/README.md b/samples/durable-task-sdks/dotnet/EternalOrchestrations/README.md
index f28a9cb9..fbd1fa87 100644
--- a/samples/durable-task-sdks/dotnet/EternalOrchestrations/README.md
+++ b/samples/durable-task-sdks/dotnet/EternalOrchestrations/README.md
@@ -1,4 +1,4 @@
-# Eternal Orchestrations โ Durable Task SDK (.NET)
+# Eternal Orchestrations - Durable Task SDK (.NET)
.NET | Durable Task SDK
@@ -14,7 +14,7 @@ This pattern is useful for:
## Prerequisites
-1. [.NET 8 SDK](https://dotnet.microsoft.com/download/dotnet/8.0)
+1. [.NET 10 SDK](https://dotnet.microsoft.com/download/dotnet/10.0)
2. [Docker](https://www.docker.com/products/docker-desktop/) (for the emulator)
## Quick Run
diff --git a/samples/durable-task-sdks/dotnet/FanOutFanIn/README.md b/samples/durable-task-sdks/dotnet/FanOutFanIn/README.md
index 85078699..a21dfc87 100644
--- a/samples/durable-task-sdks/dotnet/FanOutFanIn/README.md
+++ b/samples/durable-task-sdks/dotnet/FanOutFanIn/README.md
@@ -20,7 +20,7 @@ This pattern is useful for:
## Prerequisites
-1. [.NET 8 SDK](https://dotnet.microsoft.com/download/dotnet/8.0) or later
+1. [.NET 10 SDK](https://dotnet.microsoft.com/download/dotnet/10.0) or later
2. [Docker](https://www.docker.com/products/docker-desktop/) (for running the emulator) installed
3. [Azure CLI](https://docs.microsoft.com/cli/azure/install-azure-cli) (if using a deployed Durable Task Scheduler)
diff --git a/samples/durable-task-sdks/dotnet/FunctionChaining/README.md b/samples/durable-task-sdks/dotnet/FunctionChaining/README.md
index 53b3d1f4..211b8cc1 100644
--- a/samples/durable-task-sdks/dotnet/FunctionChaining/README.md
+++ b/samples/durable-task-sdks/dotnet/FunctionChaining/README.md
@@ -18,7 +18,7 @@ This pattern is useful for:
## Prerequisites
-1. [.NET 8 SDK](https://dotnet.microsoft.com/download/dotnet/8.0) or later
+1. [.NET 10 SDK](https://dotnet.microsoft.com/download/dotnet/10.0) or later
2. [Docker](https://www.docker.com/products/docker-desktop/) (for running the emulator) installed
3. [Azure CLI](https://docs.microsoft.com/cli/azure/install-azure-cli) (if using a deployed Durable Task Scheduler)
@@ -112,7 +112,7 @@ The connection string is constructed dynamically based on the environment:
// For local emulator
connectionString = $"Endpoint={schedulerEndpoint};TaskHub={taskHubName};Authentication=None";
-// For Azure deployed emulator
+// For a deployed Azure scheduler
connectionString = $"Endpoint={schedulerEndpoint};TaskHub={taskHubName};Authentication=DefaultAzure";
```
@@ -150,7 +150,7 @@ Once you have set up either the emulator or deployed scheduler, follow these ste
This sample includes an `azure.yaml` configuration file that allows you to deploy the entire solution to Azure using Azure Developer CLI (AZD).
-> **Note:** This sample uses the shared infrastructure templates located at [`samples/infra/`](../../infra/).
+> **Note:** This sample uses the shared infrastructure templates located at [`samples/infra/`](../../../infra/).
#### Prerequisites for AZD Deployment
@@ -287,36 +287,35 @@ foreach (string id in allInstanceIds)
## Understanding the Output
When you run the client, you should see:
-1. The client starting an orchestration with a name input
+1. The client scheduling 20 orchestrations with name inputs (`User_1` through `User_20`), one every 5 seconds
2. The worker processing the chained activities
-3. The client displaying the final result from the completed orchestration
+3. The client reporting completion for each orchestration and final completed/failed counts
Example output:
```
-Starting greeting orchestration for name: GitHub Copilot
-Started orchestration with ID: 7f8e9a6b-1c2d-3e4f-5a6b-7c8d9e0f1a2b
-Waiting for orchestration to complete...
-Orchestration completed with status: Completed
-Greeting result: Hello GitHub Copilot! It's nice to meet you. Welcome to the Durable Task Framework!
+Scheduling orchestration #1 (User_1)
+Orchestration #1 scheduled in 42ms with ID: 7f8e9a6b-1c2d-3e4f-5a6b-7c8d9e0f1a2b
+All 20 orchestrations scheduled. Waiting for completion...
+Orchestration 7f8e9a6b-1c2d-3e4f-5a6b-7c8d9e0f1a2b completed successfully
+FINAL RESULTS: 20 completed, 0 failed, 20 total orchestrations
```
+The client does not fetch orchestration output. In the dashboard, the first orchestration's output is `Hello User_1! How are you today? I hope you're doing well!`.
+
When you run the sample, you'll see output from both the worker and client processes:
### Worker Output
The worker shows:
- Registration of the orchestrator and activities
-- Log entries when each activity is called, showing details of the order processing
-- The progression through the chain of activities from order processing to payment to shipping to notification
+- Log entries when each activity is called, showing the name or greeting received
+- The progression through `SayHelloActivity`, `ProcessGreetingActivity`, and `FinalizeResponseActivity`
### Client Output
The client shows:
-- Starting the orchestration with the order details
+- Starting each orchestration with its name input
- The unique orchestration instance ID
-- The final result, which includes:
- - The order ID
- - Status (which should be "Completed")
- - Payment ID (randomly generated)
- - Shipping ID (randomly generated)
+- Completion status for each instance (which should be "Completed")
+- Final counts of completed, failed, and total orchestrations
This demonstrates the chaining of functions in a sequence, with each function building on the state from the previous one.
@@ -329,7 +328,7 @@ To access the Durable Task Scheduler Dashboard and review your orchestration:
2. Click on the "default" task hub
3. You'll see the orchestration instance in the list
4. Click on the instance ID to view the execution details, which will show:
- - The sequential execution of the four activities
+ - The sequential execution of the three activities
- The input and output at each step
- The time taken for each step
@@ -340,4 +339,4 @@ To access the Durable Task Scheduler Dashboard and review your orchestration:
4. Search for your orchestration instance ID
5. Review the execution details
-The dashboard visualizes the sequential nature of function chaining, making it easy to see the flow of data from one activity to the next throughout the order processing workflow.
+The dashboard shows the sequential nature of function chaining and the flow of greeting data from one activity to the next.
diff --git a/samples/durable-task-sdks/dotnet/HumanInteraction/README.md b/samples/durable-task-sdks/dotnet/HumanInteraction/README.md
index 3bb82cb1..5d10c916 100644
--- a/samples/durable-task-sdks/dotnet/HumanInteraction/README.md
+++ b/samples/durable-task-sdks/dotnet/HumanInteraction/README.md
@@ -18,7 +18,7 @@ This pattern is useful for:
## Prerequisites
-1. [.NET 8 SDK](https://dotnet.microsoft.com/download/dotnet/8.0) or later
+1. [.NET 10 SDK](https://dotnet.microsoft.com/download/dotnet/10.0) or later
2. [Docker](https://www.docker.com/products/docker-desktop/) (for running the emulator) installed
3. [Azure CLI](https://docs.microsoft.com/cli/azure/install-azure-cli) (if using a deployed Durable Task Scheduler)
diff --git a/samples/durable-task-sdks/dotnet/Monitoring/README.md b/samples/durable-task-sdks/dotnet/Monitoring/README.md
index a1fc4ba1..0c74186b 100644
--- a/samples/durable-task-sdks/dotnet/Monitoring/README.md
+++ b/samples/durable-task-sdks/dotnet/Monitoring/README.md
@@ -1,4 +1,4 @@
-# Monitor Pattern โ Durable Task SDK (.NET)
+# Monitor Pattern - Durable Task SDK (.NET)
.NET | Durable Task SDK
@@ -13,7 +13,7 @@ This pattern is useful for:
## Prerequisites
-1. [.NET 8 SDK](https://dotnet.microsoft.com/download/dotnet/8.0)
+1. [.NET 10 SDK](https://dotnet.microsoft.com/download/dotnet/10.0)
2. [Docker](https://www.docker.com/products/docker-desktop/) (for the emulator)
## Quick Run
diff --git a/samples/durable-task-sdks/dotnet/OpenTelemetryTracing/README.md b/samples/durable-task-sdks/dotnet/OpenTelemetryTracing/README.md
index 7e9f831d..9b3768e0 100644
--- a/samples/durable-task-sdks/dotnet/OpenTelemetryTracing/README.md
+++ b/samples/durable-task-sdks/dotnet/OpenTelemetryTracing/README.md
@@ -2,14 +2,14 @@
| | |
|-|-|
-| **Language** | C# (.NET 8) |
+| **Language** | C# (.NET 10) |
| **SDK** | Durable Task SDK |
This sample shows how to wire up [OpenTelemetry](https://opentelemetry.io/) with the Durable Task SDK to visualize orchestration flows in [Jaeger](https://www.jaegertracing.io/). It demonstrates trace correlation across an orchestrator, activities, and sub-orchestrations so you can see the full distributed trace of an order-processing workflow.
## Prerequisites
-- [.NET 8 SDK](https://dotnet.microsoft.com/download/dotnet/8.0)
+- [.NET 10 SDK](https://dotnet.microsoft.com/download/dotnet/10.0)
- [Docker](https://www.docker.com/products/docker-desktop)
## Quick Run
@@ -43,7 +43,7 @@ dotnet run --project Client
1. Open the Jaeger UI at **http://localhost:16686**
2. Select the **durable-worker** service from the dropdown
3. Click **Find Traces**
-4. Click on a trace to see the full span tree โ you'll see the orchestrator span with child spans for each activity (`ValidateOrder`, `ProcessPayment`, `ShipOrder`, `SendNotification`)
+4. Click on a trace to see the full span tree: the orchestrator span with child spans for each activity (`ValidateOrder`, `ProcessPayment`, `ShipOrder`, `SendNotification`)
You can also view the orchestration status in the DTS Dashboard at **http://localhost:8082**.
diff --git a/samples/durable-task-sdks/dotnet/OrchestrationVersioning/README.md b/samples/durable-task-sdks/dotnet/OrchestrationVersioning/README.md
index 801f9ac5..8034a403 100644
--- a/samples/durable-task-sdks/dotnet/OrchestrationVersioning/README.md
+++ b/samples/durable-task-sdks/dotnet/OrchestrationVersioning/README.md
@@ -2,9 +2,9 @@
In addition to [Durable Functions](https://learn.microsoft.com/azure/azure-functions/durable/durable-functions-overview), the [Durable Task SDK for .NET](https://github.com/microsoft/durabletask-dotnet) can also use the durable task scheduler for managing orchestration state.
-This directory includes a sample .NET console app that demonstrates how to utilize Orchestration Versioning with the Durable Task SDK for .NET.
+This directory includes a sample ASP.NET Core web app that demonstrates how to use Orchestration Versioning with the Durable Task SDK for .NET.
-- [.NET 8 SDK](https://dotnet.microsoft.com/download/dotnet/8.0)
+- [.NET 10 SDK](https://dotnet.microsoft.com/download/dotnet/10.0)
- [Azure CLI](https://docs.microsoft.com/cli/azure/install-azure-cli)
- [Docker](https://www.docker.com/products/docker-desktop/) (for running the emulator) installed
@@ -267,8 +267,9 @@ Once logged in, you should see the orchestrations that were created by the sampl
## Optional: Deploy to Azure Container Apps
1. Create an container app following the instructions in the [Azure Container App documentation](https://learn.microsoft.com/azure/container-apps/get-started?tabs=bash).
-1. During step 1, specify the deployed container app code folder at samples\durable-task-sdks\dotnet\OrchestrationVersioning
-1. Follow the instructions to create a user managed identity and assign the `Durable Task Data Contributor` role then attach it to the container app you created in step 1 at [Azure-Functions-Durable-Task-Scheduler-Private-Preview](..\..\..\..\docs\configure-existing-app.md#run-the-app-on-azure-net). Please skip section "Add required environment variables to app" since these environment variables are not required for deploying to container app.
+1. During step 1, specify the deployed container app code folder at `samples/durable-task-sdks/dotnet/OrchestrationVersioning`.
+1. Follow the [identity-based authentication guidance](https://learn.microsoft.com/azure/durable-task/scheduler/durable-task-scheduler-identity) to create a user-assigned managed identity, assign it the `Durable Task Data Contributor` role on your task hub, and attach it to the container app.
+1. Set the container app's `DURABLE_TASK_SCHEDULER_CONNECTION_STRING` environment variable to `Endpoint=;TaskHub=;Authentication=ManagedIdentity;ClientID=`. The app requires this setting in Azure as well as locally.
1. Call the container app endpoint at `http://sampleapi-.azurecontainerapps.io/scenarios/hellocities?count=10`, Sample curl command:
```bash
diff --git a/samples/durable-task-sdks/dotnet/ScheduleWebApp/README.md b/samples/durable-task-sdks/dotnet/ScheduleWebApp/README.md
index d9952a3b..0fddfd0a 100644
--- a/samples/durable-task-sdks/dotnet/ScheduleWebApp/README.md
+++ b/samples/durable-task-sdks/dotnet/ScheduleWebApp/README.md
@@ -4,7 +4,7 @@ This sample demonstrates a web application that leverages the durable task sched
## Prerequisites
-1. [.NET 8 SDK](https://dotnet.microsoft.com/download/dotnet/8.0) or later
+1. [.NET 10 SDK](https://dotnet.microsoft.com/download/dotnet/10.0) or later
2. [Docker](https://www.docker.com/products/docker-desktop/) (for running the emulator) installed
3. [Azure CLI](https://docs.microsoft.com/cli/azure/install-azure-cli) (if using a deployed Durable Task Scheduler)
diff --git a/samples/durable-task-sdks/dotnet/SubOrchestrations/README.md b/samples/durable-task-sdks/dotnet/SubOrchestrations/README.md
index 983e8403..e21edc4b 100644
--- a/samples/durable-task-sdks/dotnet/SubOrchestrations/README.md
+++ b/samples/durable-task-sdks/dotnet/SubOrchestrations/README.md
@@ -1,4 +1,4 @@
-# Sub-Orchestrations โ Durable Task SDK (.NET)
+# Sub-Orchestrations - Durable Task SDK (.NET)
.NET | Durable Task SDK
@@ -13,7 +13,7 @@ This pattern is useful for:
## Prerequisites
-1. [.NET 8 SDK](https://dotnet.microsoft.com/download/dotnet/8.0)
+1. [.NET 10 SDK](https://dotnet.microsoft.com/download/dotnet/10.0)
2. [Docker](https://www.docker.com/products/docker-desktop/) (for the emulator)
## Quick Run
diff --git a/samples/durable-task-sdks/java/README.md b/samples/durable-task-sdks/java/README.md
index 17672f16..0086728e 100644
--- a/samples/durable-task-sdks/java/README.md
+++ b/samples/durable-task-sdks/java/README.md
@@ -4,7 +4,7 @@ This directory contains sample applications demonstrating various patterns using
## Prerequisites
-- Java 8 or later
+- [Java 21](https://adoptium.net/)
- [Docker](https://www.docker.com/get-started)
## Running the samples with the Durable Task Scheduler Emulator
@@ -24,7 +24,7 @@ The samples can be run locally using the Durable Task Scheduler Emulator. The em
2. Set the connection string environment variable:
```bash
# Windows
- set DURABLE_TASK_CONNECTION_STRING="Endpoint=http://localhost:8080;TaskHub=default;Authentication=None"
+ set "DURABLE_TASK_CONNECTION_STRING=Endpoint=http://localhost:8080;TaskHub=default;Authentication=None"
# Linux/macOS
export DURABLE_TASK_CONNECTION_STRING="Endpoint=http://localhost:8080;TaskHub=default;Authentication=None"
@@ -116,7 +116,7 @@ You can view the orchestrations in the Durable Task Scheduler emulator's dashboa
## Using Durable Task Scheduler
-To use a Durable Task Scheduler running in Azure instead of the emulator, set the connection string to your Durable Task Scheduler connection string. The [format of the string)[(https://learn.microsoft.com/azure/azure-functions/durable/durable-task-scheduler/durable-task-scheduler-identity?tabs=df&pivots=az-cli)] depends on the type of managed identity you use.
+To use a Durable Task Scheduler running in Azure instead of the emulator, set the connection string to your Durable Task Scheduler connection string. The [format of the string](https://learn.microsoft.com/azure/durable-task/scheduler/durable-task-scheduler-identity) depends on the type of managed identity you use.
```bash
# Windows
diff --git a/samples/durable-task-sdks/java/function-chaining/README.md b/samples/durable-task-sdks/java/function-chaining/README.md
index 084e4b36..8433dce6 100644
--- a/samples/durable-task-sdks/java/function-chaining/README.md
+++ b/samples/durable-task-sdks/java/function-chaining/README.md
@@ -26,7 +26,7 @@ This pattern is useful for:
## Prerequisites
-- Java 8 or later
+- [Java 21](https://adoptium.net/)
- [Docker](https://www.docker.com/get-started)
- [Azure CLI](https://docs.microsoft.com/cli/azure/install-azure-cli) (if using a deployed Durable Task Scheduler)
@@ -82,10 +82,10 @@ For production scenarios or when you're ready to deploy to Azure:
1. Set the connection string environment variable:
```bash
# Windows
- set DURABLE_TASK_CONNECTION_STRING="Endpoint={scheduler endpoint};Authentication=DefaultAzure"
+ set "DURABLE_TASK_CONNECTION_STRING=Endpoint={scheduler endpoint};TaskHub={task hub name};Authentication=DefaultAzure"
# Linux/macOS
- export DURABLE_TASK_CONNECTION_STRING="Endpoint={scheduler endpoint};Authentication=DefaultAzure"
+ export DURABLE_TASK_CONNECTION_STRING="Endpoint={scheduler endpoint};TaskHub={task hub name};Authentication=DefaultAzure"
```
## How to Run the Sample
diff --git a/samples/durable-task-sdks/javascript/README.md b/samples/durable-task-sdks/javascript/README.md
index d922c1f8..6be34c72 100644
--- a/samples/durable-task-sdks/javascript/README.md
+++ b/samples/durable-task-sdks/javascript/README.md
@@ -1,6 +1,6 @@
# JavaScript Samples for Durable Task SDK
-This directory contains sample applications demonstrating orchestration patterns using the Durable Task JavaScript SDK with Azure Durable Task Scheduler.
+This directory contains sample applications demonstrating orchestration patterns using the [Durable Task JavaScript/TypeScript SDK](https://github.com/microsoft/durabletask-js) with Azure Durable Task Scheduler. The SDK is available in preview. These samples use JavaScript.
## Prerequisites
@@ -22,8 +22,8 @@ This directory contains sample applications demonstrating orchestration patterns
## Available samples
-- **function-chaining**: Sequential activity pipeline workflow, with local emulator and `azd` deployment support.
-- **fan-out-fan-in**: Parallel processing and aggregation workflow, with both local emulator and `azd` deployment support.
+- **[function-chaining](./function-chaining/)**: Sequential activity pipeline workflow, with local emulator and `azd` deployment support.
+- **[fan-out-fan-in](./fan-out-fan-in/)**: Parallel processing and aggregation workflow, with both local emulator and `azd` deployment support.
## Running the sample