azure-functions-durable 1.4.0rc2__tar.gz → 1.5.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/CHANGELOG.md +6 -0
- {azure-functions-durable-1.4.0rc2/azure_functions_durable.egg-info → azure-functions-durable-1.5.0}/PKG-INFO +2 -2
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/README.md +1 -1
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure/durable_functions/decorators/durable_app.py +8 -1
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure/durable_functions/models/DurableOrchestrationClient.py +49 -11
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure/durable_functions/models/DurableOrchestrationContext.py +17 -6
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure/durable_functions/models/TaskOrchestrationExecutor.py +1 -1
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure/durable_functions/models/actions/CallSubOrchestratorAction.py +3 -1
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure/durable_functions/models/actions/CallSubOrchestratorWithRetryAction.py +3 -1
- azure-functions-durable-1.5.0/azure/durable_functions/models/utils/http_utils.py +189 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0/azure_functions_durable.egg-info}/PKG-INFO +2 -2
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure_functions_durable.egg-info/SOURCES.txt +5 -1
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure_functions_durable.egg-info/requires.txt +1 -1
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/docs/openai_agents/README.md +3 -3
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/docs/openai_agents/getting-started.md +18 -5
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/docs/openai_agents/reference.md +1 -1
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/eng/ci/official-build.yml +4 -1
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/requirements.txt +1 -1
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples-v2/openai_agents/basic/hello_world.py +1 -1
- azure-functions-durable-1.5.0/samples-v2/openai_agents/customer_service/README.md +46 -0
- azure-functions-durable-1.5.0/samples-v2/openai_agents/customer_service/customer_service.py +176 -0
- azure-functions-durable-1.5.0/samples-v2/openai_agents/customer_service/customer_service_client.py +47 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples-v2/openai_agents/function_app.py +6 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples-v2/openai_agents/host.json +1 -1
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples-v2/openai_agents/local.settings.json.template +4 -1
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples-v2/orchestration_versioning/README.md +31 -1
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples-v2/orchestration_versioning/function_app.py +27 -10
- azure-functions-durable-1.5.0/samples-v2/orchestration_versioning/host.json +20 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/setup.py +1 -2
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/tests/models/test_DurableOrchestrationClient.py +83 -1
- azure-functions-durable-1.5.0/tests/utils/test_http_utils.py +287 -0
- azure-functions-durable-1.4.0rc2/azure/durable_functions/models/utils/http_utils.py +0 -80
- azure-functions-durable-1.4.0rc2/samples-v2/orchestration_versioning/host.json +0 -16
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/.devcontainer/devcontainer.json +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/.devcontainer/setup.sh +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/.flake8 +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/.github/ISSUE_TEMPLATE/----feature-request.md +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/.github/ISSUE_TEMPLATE/---bug-report.md +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/.github/policies/resourceManagement.yml +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/.github/workflows/codeQL.yml +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/.github/workflows/durable_python_action.yml +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/.github/workflows/submodule-sync.yml +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/.github/workflows/validate.yml +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/.gitignore +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/CODEOWNERS +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/CONTRIBUTING.md +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/LICENSE +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/MANIFEST.in +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/SECURITY.md +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure/__init__.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure/durable_functions/__init__.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure/durable_functions/constants.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure/durable_functions/decorators/__init__.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure/durable_functions/decorators/metadata.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure/durable_functions/entity.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure/durable_functions/models/DurableEntityContext.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure/durable_functions/models/DurableHttpRequest.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure/durable_functions/models/DurableOrchestrationBindings.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure/durable_functions/models/DurableOrchestrationStatus.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure/durable_functions/models/EntityStateResponse.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure/durable_functions/models/FunctionContext.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure/durable_functions/models/OrchestrationRuntimeStatus.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure/durable_functions/models/OrchestratorState.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure/durable_functions/models/PurgeHistoryResult.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure/durable_functions/models/ReplaySchema.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure/durable_functions/models/RetryOptions.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure/durable_functions/models/RpcManagementOptions.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure/durable_functions/models/Task.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure/durable_functions/models/TokenSource.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure/durable_functions/models/__init__.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure/durable_functions/models/actions/Action.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure/durable_functions/models/actions/ActionType.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure/durable_functions/models/actions/CallActivityAction.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure/durable_functions/models/actions/CallActivityWithRetryAction.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure/durable_functions/models/actions/CallEntityAction.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure/durable_functions/models/actions/CallHttpAction.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure/durable_functions/models/actions/CompoundAction.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure/durable_functions/models/actions/ContinueAsNewAction.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure/durable_functions/models/actions/CreateTimerAction.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure/durable_functions/models/actions/NoOpAction.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure/durable_functions/models/actions/SignalEntityAction.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure/durable_functions/models/actions/WaitForExternalEventAction.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure/durable_functions/models/actions/WhenAllAction.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure/durable_functions/models/actions/WhenAnyAction.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure/durable_functions/models/actions/__init__.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure/durable_functions/models/entities/EntityState.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure/durable_functions/models/entities/OperationResult.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure/durable_functions/models/entities/RequestMessage.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure/durable_functions/models/entities/ResponseMessage.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure/durable_functions/models/entities/Signal.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure/durable_functions/models/entities/__init__.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure/durable_functions/models/history/HistoryEvent.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure/durable_functions/models/history/HistoryEventType.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure/durable_functions/models/history/__init__.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure/durable_functions/models/utils/__init__.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure/durable_functions/models/utils/entity_utils.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure/durable_functions/models/utils/json_utils.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure/durable_functions/openai_agents/__init__.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure/durable_functions/openai_agents/context.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure/durable_functions/openai_agents/event_loop.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure/durable_functions/openai_agents/exceptions.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure/durable_functions/openai_agents/handoffs.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure/durable_functions/openai_agents/model_invocation_activity.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure/durable_functions/openai_agents/orchestrator_generator.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure/durable_functions/openai_agents/runner.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure/durable_functions/openai_agents/task_tracker.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure/durable_functions/openai_agents/tools.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure/durable_functions/openai_agents/usage_telemetry.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure/durable_functions/orchestrator.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure/durable_functions/testing/OrchestratorGeneratorWrapper.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure/durable_functions/testing/__init__.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure-pipelines-release.yml +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure-pipelines.yml +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure_functions_durable.egg-info/dependency_links.txt +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/azure_functions_durable.egg-info/top_level.txt +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/eng/ci/code-mirror.yml +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/eng/templates/build.yml +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/host.json +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/noxfile.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/aml_monitoring/.funcignore +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/aml_monitoring/.gitignore +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/aml_monitoring/aml_durable_orchestrator/__init__.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/aml_monitoring/aml_durable_orchestrator/function.json +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/aml_monitoring/aml_pipeline/__init__.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/aml_monitoring/aml_pipeline/function.json +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/aml_monitoring/aml_poll_status/__init__.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/aml_monitoring/aml_poll_status/function.json +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/aml_monitoring/extensions.csproj +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/aml_monitoring/host.json +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/aml_monitoring/local.settings.json +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/aml_monitoring/proxies.json +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/aml_monitoring/requirements.txt +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/aml_monitoring/shared/__init__.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/aml_monitoring/shared/aml_helper.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/aml_monitoring/shared/auth_helper.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/counter_entity/.funcignore +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/counter_entity/.gitignore +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/counter_entity/Counter/__init__.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/counter_entity/Counter/function.json +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/counter_entity/DurableOrchestration/__init__.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/counter_entity/DurableOrchestration/function.json +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/counter_entity/DurableTrigger/__init__.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/counter_entity/DurableTrigger/function.json +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/counter_entity/README.md +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/counter_entity/RetrieveEntity/__init__.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/counter_entity/RetrieveEntity/function.json +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/counter_entity/host.json +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/counter_entity/local.settings.json +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/counter_entity/requirements.txt +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/fan_in_fan_out/.funcignore +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/fan_in_fan_out/.gitignore +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/fan_in_fan_out/E2_BackupSiteContent/__init__.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/fan_in_fan_out/E2_BackupSiteContent/function.json +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/fan_in_fan_out/E2_CopyFileToBlob/__init__.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/fan_in_fan_out/E2_CopyFileToBlob/function.json +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/fan_in_fan_out/E2_GetFileList/__init__.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/fan_in_fan_out/E2_GetFileList/function.json +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/fan_in_fan_out/HttpStart/__init__.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/fan_in_fan_out/HttpStart/function.json +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/fan_in_fan_out/README.md +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/fan_in_fan_out/host.json +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/fan_in_fan_out/local.settings.json +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/fan_in_fan_out/proxies.json +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/fan_in_fan_out/requirements.txt +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/function_chaining/.funcignore +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/function_chaining/.gitignore +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/function_chaining/E1_HelloSequence/__init__.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/function_chaining/E1_HelloSequence/function.json +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/function_chaining/E1_SayHello/__init__.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/function_chaining/E1_SayHello/function.json +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/function_chaining/HttpStart/__init__.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/function_chaining/HttpStart/function.json +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/function_chaining/README.md +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/function_chaining/host.json +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/function_chaining/local.settings.json +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/function_chaining/proxies.json +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/function_chaining/requirements.txt +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/function_chaining_custom_status/.funcignore +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/function_chaining_custom_status/.gitignore +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/function_chaining_custom_status/DurableActivity/__init__.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/function_chaining_custom_status/DurableActivity/function.json +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/function_chaining_custom_status/DurableOrchestration/__init__.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/function_chaining_custom_status/DurableOrchestration/function.json +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/function_chaining_custom_status/DurableTrigger/__init__.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/function_chaining_custom_status/DurableTrigger/function.json +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/function_chaining_custom_status/README.md +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/function_chaining_custom_status/host.json +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/function_chaining_custom_status/local.settings.json +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/function_chaining_custom_status/proxies.json +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/function_chaining_custom_status/requirements.txt +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/human_interaction/.funcignore +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/human_interaction/.gitignore +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/human_interaction/E4_SMSPhoneVerification/__init__.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/human_interaction/E4_SMSPhoneVerification/function.json +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/human_interaction/HttpStart/__init__.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/human_interaction/HttpStart/function.json +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/human_interaction/README.md +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/human_interaction/SendSMSChallenge/__init__.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/human_interaction/SendSMSChallenge/function.json +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/human_interaction/host.json +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/human_interaction/local.settings.json +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/human_interaction/proxies.json +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/human_interaction/requirements.txt +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/monitor/.funcignore +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/monitor/.gitignore +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/monitor/E3_Monitor/__init__.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/monitor/E3_Monitor/function.json +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/monitor/E3_SendAlert/__init__.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/monitor/E3_SendAlert/function.json +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/monitor/E3_TooManyOpenIssues/__init__.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/monitor/E3_TooManyOpenIssues/function.json +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/monitor/HttpStart/__init__.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/monitor/HttpStart/function.json +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/monitor/README.md +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/monitor/host.json +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/monitor/local.settings.json +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/monitor/proxies.json +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/monitor/requirements.txt +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/serialize_arguments/.gitignore +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/serialize_arguments/DurableActivity/__init__.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/serialize_arguments/DurableActivity/function.json +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/serialize_arguments/DurableOrchestration/__init__.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/serialize_arguments/DurableOrchestration/function.json +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/serialize_arguments/DurableTrigger/__init__.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/serialize_arguments/DurableTrigger/function.json +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/serialize_arguments/README.md +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/serialize_arguments/host.json +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/serialize_arguments/local.settings.json +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/serialize_arguments/requirements.txt +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/serialize_arguments/shared_code/MyClasses.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/simple_sub_orchestration/.funcignore +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/simple_sub_orchestration/.gitignore +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/simple_sub_orchestration/DurableFunctionsHttpStart/__init__.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/simple_sub_orchestration/DurableFunctionsHttpStart/function.json +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/simple_sub_orchestration/DurableOrchestrator/__init__.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/simple_sub_orchestration/DurableOrchestrator/function.json +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/simple_sub_orchestration/DurableSubOrchestrator/__init__.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/simple_sub_orchestration/DurableSubOrchestrator/function.json +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/simple_sub_orchestration/Hello/__init__.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/simple_sub_orchestration/Hello/function.json +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/simple_sub_orchestration/README.md +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/simple_sub_orchestration/host.json +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/simple_sub_orchestration/local.settings.json +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/simple_sub_orchestration/proxies.json +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples/simple_sub_orchestration/requirements.txt +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples-v2/blueprint/.funcignore +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples-v2/blueprint/.gitignore +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples-v2/blueprint/durable_blueprints.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples-v2/blueprint/function_app.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples-v2/blueprint/host.json +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples-v2/blueprint/requirements.txt +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples-v2/blueprint/tests/readme.md +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples-v2/blueprint/tests/test_my_orchestrator.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples-v2/blueprint/tests/test_say_hello.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples-v2/blueprint/tests/test_start_orchestrator.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples-v2/fan_in_fan_out/.funcignore +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples-v2/fan_in_fan_out/.gitignore +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples-v2/fan_in_fan_out/README.md +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples-v2/fan_in_fan_out/function_app.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples-v2/fan_in_fan_out/host.json +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples-v2/fan_in_fan_out/proxies.json +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples-v2/fan_in_fan_out/requirements.txt +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples-v2/fan_in_fan_out/tests/readme.md +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples-v2/fan_in_fan_out/tests/test_E2_BackupSiteContent.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples-v2/fan_in_fan_out/tests/test_E2_CopyFileToBlob.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples-v2/fan_in_fan_out/tests/test_E2_GetFileList.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples-v2/fan_in_fan_out/tests/test_HttpStart.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples-v2/function_chaining/.funcignore +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples-v2/function_chaining/.gitignore +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples-v2/function_chaining/README.md +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples-v2/function_chaining/function_app.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples-v2/function_chaining/host.json +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples-v2/function_chaining/proxies.json +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples-v2/function_chaining/requirements.txt +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples-v2/function_chaining/tests/readme.md +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples-v2/function_chaining/tests/test_http_start.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples-v2/function_chaining/tests/test_my_orchestrator.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples-v2/function_chaining/tests/test_say_hello.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples-v2/openai_agents/.funcignore +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples-v2/openai_agents/.gitignore +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples-v2/openai_agents/README.md +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples-v2/openai_agents/__init__.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples-v2/openai_agents/basic/agent_lifecycle_example.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples-v2/openai_agents/basic/dynamic_system_prompt.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples-v2/openai_agents/basic/lifecycle_example.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples-v2/openai_agents/basic/local_image.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples-v2/openai_agents/basic/non_strict_output_type.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples-v2/openai_agents/basic/previous_response_id.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples-v2/openai_agents/basic/remote_image.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples-v2/openai_agents/basic/tools.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples-v2/openai_agents/handoffs/message_filter.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples-v2/openai_agents/requirements.txt +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples-v2/openai_agents/test_orchestrators.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples-v2/orchestration_versioning/.funcignore +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples-v2/orchestration_versioning/.gitignore +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/samples-v2/orchestration_versioning/requirements.txt +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/scripts/sample_deploy.sh +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/setup.cfg +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/tests/__init__.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/tests/conftest.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/tests/models/__init__.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/tests/models/test_DecoratorMetadata.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/tests/models/test_Decorators.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/tests/models/test_DurableOrchestrationBindings.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/tests/models/test_DurableOrchestrationContext.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/tests/models/test_DurableOrchestrationStatus.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/tests/models/test_OrchestrationState.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/tests/models/test_RpcManagementOptions.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/tests/models/test_TokenSource.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/tests/openai_agents/__init__.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/tests/openai_agents/test_context.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/tests/openai_agents/test_task_tracker.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/tests/openai_agents/test_usage_telemetry.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/tests/orchestrator/__init__.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/tests/orchestrator/models/OrchestrationInstance.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/tests/orchestrator/openai_agents/__init__.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/tests/orchestrator/openai_agents/test_openai_agents.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/tests/orchestrator/orchestrator_test_utils.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/tests/orchestrator/schemas/OrchetrationStateSchema.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/tests/orchestrator/test_call_http.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/tests/orchestrator/test_continue_as_new.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/tests/orchestrator/test_create_timer.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/tests/orchestrator/test_entity.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/tests/orchestrator/test_external_event.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/tests/orchestrator/test_fan_out_fan_in.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/tests/orchestrator/test_is_replaying_flag.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/tests/orchestrator/test_retries.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/tests/orchestrator/test_sequential_orchestrator.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/tests/orchestrator/test_sequential_orchestrator_custom_status.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/tests/orchestrator/test_sequential_orchestrator_with_retry.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/tests/orchestrator/test_serialization.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/tests/orchestrator/test_sub_orchestrator.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/tests/orchestrator/test_sub_orchestrator_with_retry.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/tests/orchestrator/test_task_any.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/tests/tasks/__init__.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/tests/tasks/tasks_test_utils.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/tests/tasks/test_long_timers.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/tests/tasks/test_new_uuid.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/tests/test_constants.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/tests/test_utils/ContextBuilder.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/tests/test_utils/EntityContextBuilder.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/tests/test_utils/__init__.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/tests/test_utils/constants.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/tests/test_utils/json_utils.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/tests/test_utils/testClasses.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/tests/utils/__init__.py +0 -0
- {azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/tests/utils/test_entity_utils.py +0 -0
|
@@ -2,6 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
|
|
5
|
+
## Unreleased
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
|
|
9
|
+
- Client operation correlation logging: `FunctionInvocationId` is now propagated via HTTP headers to the host for client operations, enabling correlation with host logs.
|
|
10
|
+
|
|
5
11
|
## 1.0.0b6
|
|
6
12
|
|
|
7
13
|
- [Create timer](https://github.com/Azure/azure-functions-durable-python/issues/35) functionality available
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: azure-functions-durable
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.5.0
|
|
4
4
|
Summary: Durable Functions For Python
|
|
5
5
|
Home-page: https://github.com/Azure/azure-functions-durable-python
|
|
6
6
|
Author: Azure Functions team at Microsoft Corp.
|
|
@@ -51,7 +51,7 @@ Follow these instructions to get started with Durable Functions in Python:
|
|
|
51
51
|
|
|
52
52
|
* Python Durable Functions requires [Azure Functions Core Tools](https://docs.microsoft.com/en-us/azure/azure-functions/functions-run-local) version 3.0.2630 or higher.
|
|
53
53
|
|
|
54
|
-
## Durable
|
|
54
|
+
## OpenAI Agent SDK Integration with Azure Durable Functions (Preview)
|
|
55
55
|
|
|
56
56
|
Build resilient, stateful AI agents backed by Durable Functions orchestration—see the full documentation at [docs/openai_agents/README.md](docs/openai_agents/README.md).
|
|
57
57
|
|
|
@@ -29,7 +29,7 @@ Follow these instructions to get started with Durable Functions in Python:
|
|
|
29
29
|
|
|
30
30
|
* Python Durable Functions requires [Azure Functions Core Tools](https://docs.microsoft.com/en-us/azure/azure-functions/functions-run-local) version 3.0.2630 or higher.
|
|
31
31
|
|
|
32
|
-
## Durable
|
|
32
|
+
## OpenAI Agent SDK Integration with Azure Durable Functions (Preview)
|
|
33
33
|
|
|
34
34
|
Build resilient, stateful AI agents backed by Durable Functions orchestration—see the full documentation at [docs/openai_agents/README.md](docs/openai_agents/README.md).
|
|
35
35
|
|
|
@@ -195,7 +195,14 @@ class Blueprint(TriggerApi, BindingApi, SettingsApi):
|
|
|
195
195
|
# construct rich object from it,
|
|
196
196
|
# and assign parameter to that rich object
|
|
197
197
|
starter = kwargs[parameter_name]
|
|
198
|
-
|
|
198
|
+
|
|
199
|
+
# Try to extract the function invocation ID from the context for correlation
|
|
200
|
+
function_invocation_id = None
|
|
201
|
+
context = kwargs.get('context')
|
|
202
|
+
if context is not None and hasattr(context, 'invocation_id'):
|
|
203
|
+
function_invocation_id = context.invocation_id
|
|
204
|
+
|
|
205
|
+
client = client_constructor(starter, function_invocation_id)
|
|
199
206
|
kwargs[parameter_name] = client
|
|
200
207
|
|
|
201
208
|
# Invoke user code with rich DF Client binding
|
|
@@ -26,7 +26,16 @@ class DurableOrchestrationClient:
|
|
|
26
26
|
orchestration instances.
|
|
27
27
|
"""
|
|
28
28
|
|
|
29
|
-
def __init__(self, context: str):
|
|
29
|
+
def __init__(self, context: str, function_invocation_id: Optional[str] = None):
|
|
30
|
+
"""Initialize a DurableOrchestrationClient.
|
|
31
|
+
|
|
32
|
+
Parameters
|
|
33
|
+
----------
|
|
34
|
+
context : str
|
|
35
|
+
The JSON-encoded client binding context.
|
|
36
|
+
function_invocation_id : Optional[str]
|
|
37
|
+
The function invocation ID for correlation with host-side logs.
|
|
38
|
+
"""
|
|
30
39
|
self.task_hub_name: str
|
|
31
40
|
self._uniqueWebHookOrigins: List[str]
|
|
32
41
|
self._event_name_placeholder: str = "{eventName}"
|
|
@@ -39,6 +48,7 @@ class DurableOrchestrationClient:
|
|
|
39
48
|
self._show_history_query_key: str = "showHistory"
|
|
40
49
|
self._show_history_output_query_key: str = "showHistoryOutput"
|
|
41
50
|
self._show_input_query_key: str = "showInput"
|
|
51
|
+
self._function_invocation_id: Optional[str] = function_invocation_id
|
|
42
52
|
self._orchestration_bindings: DurableOrchestrationBindings = \
|
|
43
53
|
DurableOrchestrationBindings.from_json(context)
|
|
44
54
|
self._post_async_request = post_async_request
|
|
@@ -48,7 +58,8 @@ class DurableOrchestrationClient:
|
|
|
48
58
|
async def start_new(self,
|
|
49
59
|
orchestration_function_name: str,
|
|
50
60
|
instance_id: Optional[str] = None,
|
|
51
|
-
client_input: Optional[Any] = None
|
|
61
|
+
client_input: Optional[Any] = None,
|
|
62
|
+
version: Optional[str] = None) -> str:
|
|
52
63
|
"""Start a new instance of the specified orchestrator function.
|
|
53
64
|
|
|
54
65
|
If an orchestration instance with the specified ID already exists, the
|
|
@@ -63,6 +74,9 @@ class DurableOrchestrationClient:
|
|
|
63
74
|
the Durable Functions extension will generate a random GUID (recommended).
|
|
64
75
|
client_input : Optional[Any]
|
|
65
76
|
JSON-serializable input value for the orchestrator function.
|
|
77
|
+
version : Optional[str]
|
|
78
|
+
The version to assign to the orchestration instance. If not specified,
|
|
79
|
+
the defaultVersion from host.json will be used.
|
|
66
80
|
|
|
67
81
|
Returns
|
|
68
82
|
-------
|
|
@@ -70,7 +84,9 @@ class DurableOrchestrationClient:
|
|
|
70
84
|
The ID of the new orchestration instance if successful, None if not.
|
|
71
85
|
"""
|
|
72
86
|
request_url = self._get_start_new_url(
|
|
73
|
-
instance_id=instance_id,
|
|
87
|
+
instance_id=instance_id,
|
|
88
|
+
orchestration_function_name=orchestration_function_name,
|
|
89
|
+
version=version)
|
|
74
90
|
|
|
75
91
|
trace_parent, trace_state = DurableOrchestrationClient._get_current_activity_context()
|
|
76
92
|
|
|
@@ -78,7 +94,8 @@ class DurableOrchestrationClient:
|
|
|
78
94
|
request_url,
|
|
79
95
|
self._get_json_input(client_input),
|
|
80
96
|
trace_parent,
|
|
81
|
-
trace_state
|
|
97
|
+
trace_state,
|
|
98
|
+
self._function_invocation_id)
|
|
82
99
|
|
|
83
100
|
status_code: int = response[0]
|
|
84
101
|
if status_code <= 202 and response[1]:
|
|
@@ -250,7 +267,10 @@ class DurableOrchestrationClient:
|
|
|
250
267
|
request_url = self._get_raise_event_url(
|
|
251
268
|
instance_id, event_name, task_hub_name, connection_name)
|
|
252
269
|
|
|
253
|
-
response = await self._post_async_request(
|
|
270
|
+
response = await self._post_async_request(
|
|
271
|
+
request_url,
|
|
272
|
+
json.dumps(event_data),
|
|
273
|
+
function_invocation_id=self._function_invocation_id)
|
|
254
274
|
|
|
255
275
|
switch_statement = {
|
|
256
276
|
202: lambda: None,
|
|
@@ -439,7 +459,10 @@ class DurableOrchestrationClient:
|
|
|
439
459
|
"""
|
|
440
460
|
request_url = f"{self._orchestration_bindings.rpc_base_url}instances/{instance_id}/" \
|
|
441
461
|
f"terminate?reason={quote(reason)}"
|
|
442
|
-
response = await self._post_async_request(
|
|
462
|
+
response = await self._post_async_request(
|
|
463
|
+
request_url,
|
|
464
|
+
None,
|
|
465
|
+
function_invocation_id=self._function_invocation_id)
|
|
443
466
|
switch_statement = {
|
|
444
467
|
202: lambda: None, # instance in progress
|
|
445
468
|
410: lambda: None, # instance failed or terminated
|
|
@@ -558,7 +581,8 @@ class DurableOrchestrationClient:
|
|
|
558
581
|
request_url,
|
|
559
582
|
json.dumps(operation_input) if operation_input else None,
|
|
560
583
|
trace_parent,
|
|
561
|
-
trace_state
|
|
584
|
+
trace_state,
|
|
585
|
+
self._function_invocation_id)
|
|
562
586
|
|
|
563
587
|
switch_statement = {
|
|
564
588
|
202: lambda: None # signal accepted
|
|
@@ -639,10 +663,15 @@ class DurableOrchestrationClient:
|
|
|
639
663
|
raise Exception(result)
|
|
640
664
|
|
|
641
665
|
def _get_start_new_url(
|
|
642
|
-
self, instance_id: Optional[str], orchestration_function_name: str
|
|
666
|
+
self, instance_id: Optional[str], orchestration_function_name: str,
|
|
667
|
+
version: Optional[str] = None) -> str:
|
|
643
668
|
instance_path = f'/{instance_id}' if instance_id is not None else ''
|
|
644
669
|
request_url = f'{self._orchestration_bindings.rpc_base_url}orchestrators/' \
|
|
645
670
|
f'{orchestration_function_name}{instance_path}'
|
|
671
|
+
|
|
672
|
+
if version is not None:
|
|
673
|
+
request_url += f'?version={quote(version)}'
|
|
674
|
+
|
|
646
675
|
return request_url
|
|
647
676
|
|
|
648
677
|
def _get_raise_event_url(
|
|
@@ -703,7 +732,10 @@ class DurableOrchestrationClient:
|
|
|
703
732
|
raise Exception("The Python SDK only supports RPC endpoints."
|
|
704
733
|
+ "Please remove the `localRpcEnabled` setting from host.json")
|
|
705
734
|
|
|
706
|
-
response = await self._post_async_request(
|
|
735
|
+
response = await self._post_async_request(
|
|
736
|
+
request_url,
|
|
737
|
+
None,
|
|
738
|
+
function_invocation_id=self._function_invocation_id)
|
|
707
739
|
status: int = response[0]
|
|
708
740
|
ex_msg: str = ""
|
|
709
741
|
if status == 200 or status == 202:
|
|
@@ -742,7 +774,10 @@ class DurableOrchestrationClient:
|
|
|
742
774
|
"""
|
|
743
775
|
request_url = f"{self._orchestration_bindings.rpc_base_url}instances/{instance_id}/" \
|
|
744
776
|
f"suspend?reason={quote(reason)}"
|
|
745
|
-
response = await self._post_async_request(
|
|
777
|
+
response = await self._post_async_request(
|
|
778
|
+
request_url,
|
|
779
|
+
None,
|
|
780
|
+
function_invocation_id=self._function_invocation_id)
|
|
746
781
|
switch_statement = {
|
|
747
782
|
202: lambda: None, # instance is suspended
|
|
748
783
|
410: lambda: None, # instance completed
|
|
@@ -777,7 +812,10 @@ class DurableOrchestrationClient:
|
|
|
777
812
|
"""
|
|
778
813
|
request_url = f"{self._orchestration_bindings.rpc_base_url}instances/{instance_id}/" \
|
|
779
814
|
f"resume?reason={quote(reason)}"
|
|
780
|
-
response = await self._post_async_request(
|
|
815
|
+
response = await self._post_async_request(
|
|
816
|
+
request_url,
|
|
817
|
+
None,
|
|
818
|
+
function_invocation_id=self._function_invocation_id)
|
|
781
819
|
switch_statement = {
|
|
782
820
|
202: lambda: None, # instance is resumed
|
|
783
821
|
410: lambda: None, # instance completed
|
|
@@ -246,8 +246,10 @@ class DurableOrchestrationContext:
|
|
|
246
246
|
The HTTP request method.
|
|
247
247
|
uri: str
|
|
248
248
|
The HTTP request uri.
|
|
249
|
-
content:
|
|
250
|
-
The HTTP request content.
|
|
249
|
+
content: str or dict, optional
|
|
250
|
+
The HTTP request content. Can be a string or a JSON-serializable dictionary.
|
|
251
|
+
Note: Although the type hint says 'str', a dictionary is accepted
|
|
252
|
+
and will be serialized to JSON.
|
|
251
253
|
headers: Optional[Dict[str, str]]
|
|
252
254
|
The HTTP request headers.
|
|
253
255
|
token_source: TokenSource
|
|
@@ -285,7 +287,8 @@ class DurableOrchestrationContext:
|
|
|
285
287
|
|
|
286
288
|
def call_sub_orchestrator(self,
|
|
287
289
|
name: Union[str, Callable], input_: Optional[Any] = None,
|
|
288
|
-
instance_id: Optional[str] = None
|
|
290
|
+
instance_id: Optional[str] = None,
|
|
291
|
+
version: Optional[str] = None) -> TaskBase:
|
|
289
292
|
"""Schedule sub-orchestration function named `name` for execution.
|
|
290
293
|
|
|
291
294
|
Parameters
|
|
@@ -296,6 +299,9 @@ class DurableOrchestrationContext:
|
|
|
296
299
|
The JSON-serializable input to pass to the orchestrator function.
|
|
297
300
|
instance_id: Optional[str]
|
|
298
301
|
A unique ID to use for the sub-orchestration instance.
|
|
302
|
+
version: Optional[str]
|
|
303
|
+
The version to assign to the sub-orchestration instance. If not specified,
|
|
304
|
+
the defaultVersion from host.json will be used.
|
|
299
305
|
|
|
300
306
|
Returns
|
|
301
307
|
-------
|
|
@@ -313,14 +319,15 @@ class DurableOrchestrationContext:
|
|
|
313
319
|
if isinstance(name, FunctionBuilder):
|
|
314
320
|
name = self._get_function_name(name, OrchestrationTrigger)
|
|
315
321
|
|
|
316
|
-
action = CallSubOrchestratorAction(name, input_, instance_id)
|
|
322
|
+
action = CallSubOrchestratorAction(name, input_, instance_id, version)
|
|
317
323
|
task = self._generate_task(action)
|
|
318
324
|
return task
|
|
319
325
|
|
|
320
326
|
def call_sub_orchestrator_with_retry(self,
|
|
321
327
|
name: Union[str, Callable], retry_options: RetryOptions,
|
|
322
328
|
input_: Optional[Any] = None,
|
|
323
|
-
instance_id: Optional[str] = None
|
|
329
|
+
instance_id: Optional[str] = None,
|
|
330
|
+
version: Optional[str] = None) -> TaskBase:
|
|
324
331
|
"""Schedule sub-orchestration function named `name` for execution, with retry-options.
|
|
325
332
|
|
|
326
333
|
Parameters
|
|
@@ -333,6 +340,9 @@ class DurableOrchestrationContext:
|
|
|
333
340
|
The JSON-serializable input to pass to the activity function. Defaults to None.
|
|
334
341
|
instance_id: str
|
|
335
342
|
The instance ID of the sub-orchestrator to call.
|
|
343
|
+
version: Optional[str]
|
|
344
|
+
The version to assign to the sub-orchestration instance. If not specified,
|
|
345
|
+
the defaultVersion from host.json will be used.
|
|
336
346
|
|
|
337
347
|
Returns
|
|
338
348
|
-------
|
|
@@ -350,7 +360,8 @@ class DurableOrchestrationContext:
|
|
|
350
360
|
if isinstance(name, FunctionBuilder):
|
|
351
361
|
name = self._get_function_name(name, OrchestrationTrigger)
|
|
352
362
|
|
|
353
|
-
action = CallSubOrchestratorWithRetryAction(
|
|
363
|
+
action = CallSubOrchestratorWithRetryAction(
|
|
364
|
+
name, retry_options, input_, instance_id, version)
|
|
354
365
|
task = self._generate_task(action, retry_options)
|
|
355
366
|
return task
|
|
356
367
|
|
|
@@ -276,7 +276,7 @@ class TaskOrchestrationExecutor:
|
|
|
276
276
|
message contains in it the string representation of the orchestration's
|
|
277
277
|
state
|
|
278
278
|
"""
|
|
279
|
-
if(self.output is not None):
|
|
279
|
+
if (self.output is not None):
|
|
280
280
|
try:
|
|
281
281
|
# Attempt to serialize the output. If serialization fails, raise an
|
|
282
282
|
# error indicating that the orchestration output is not serializable,
|
|
@@ -11,10 +11,11 @@ class CallSubOrchestratorAction(Action):
|
|
|
11
11
|
"""Defines the structure of the Call SubOrchestrator object."""
|
|
12
12
|
|
|
13
13
|
def __init__(self, function_name: str, _input: Optional[Any] = None,
|
|
14
|
-
instance_id: Optional[str] = None):
|
|
14
|
+
instance_id: Optional[str] = None, version: Optional[str] = None):
|
|
15
15
|
self.function_name: str = function_name
|
|
16
16
|
self._input: str = dumps(_input, default=_serialize_custom_object)
|
|
17
17
|
self.instance_id: Optional[str] = instance_id
|
|
18
|
+
self.version: Optional[str] = version
|
|
18
19
|
|
|
19
20
|
if not self.function_name:
|
|
20
21
|
raise ValueError("function_name cannot be empty")
|
|
@@ -37,4 +38,5 @@ class CallSubOrchestratorAction(Action):
|
|
|
37
38
|
add_attrib(json_dict, self, 'function_name', 'functionName')
|
|
38
39
|
add_attrib(json_dict, self, '_input', 'input')
|
|
39
40
|
add_attrib(json_dict, self, 'instance_id', 'instanceId')
|
|
41
|
+
add_attrib(json_dict, self, 'version', 'version')
|
|
40
42
|
return json_dict
|
|
@@ -13,11 +13,12 @@ class CallSubOrchestratorWithRetryAction(Action):
|
|
|
13
13
|
|
|
14
14
|
def __init__(self, function_name: str, retry_options: RetryOptions,
|
|
15
15
|
_input: Optional[Any] = None,
|
|
16
|
-
instance_id: Optional[str] = None):
|
|
16
|
+
instance_id: Optional[str] = None, version: Optional[str] = None):
|
|
17
17
|
self.function_name: str = function_name
|
|
18
18
|
self._input: str = dumps(_input, default=_serialize_custom_object)
|
|
19
19
|
self.retry_options: RetryOptions = retry_options
|
|
20
20
|
self.instance_id: Optional[str] = instance_id
|
|
21
|
+
self.version: Optional[str] = version
|
|
21
22
|
|
|
22
23
|
if not self.function_name:
|
|
23
24
|
raise ValueError("function_name cannot be empty")
|
|
@@ -41,4 +42,5 @@ class CallSubOrchestratorWithRetryAction(Action):
|
|
|
41
42
|
add_attrib(json_dict, self, '_input', 'input')
|
|
42
43
|
add_json_attrib(json_dict, self, 'retry_options', 'retryOptions')
|
|
43
44
|
add_attrib(json_dict, self, 'instance_id', 'instanceId')
|
|
45
|
+
add_attrib(json_dict, self, 'version', 'version')
|
|
44
46
|
return json_dict
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
from typing import Any, List, Union, Optional
|
|
2
|
+
import asyncio
|
|
3
|
+
|
|
4
|
+
import aiohttp
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
# Global session and lock for thread-safe initialization
|
|
8
|
+
_client_session: Optional[aiohttp.ClientSession] = None
|
|
9
|
+
_session_lock: asyncio.Lock = asyncio.Lock()
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
async def _get_session() -> aiohttp.ClientSession:
|
|
13
|
+
"""Get or create the shared ClientSession.
|
|
14
|
+
|
|
15
|
+
Returns
|
|
16
|
+
-------
|
|
17
|
+
aiohttp.ClientSession
|
|
18
|
+
The shared client session with configured timeout and connection pooling.
|
|
19
|
+
"""
|
|
20
|
+
global _client_session
|
|
21
|
+
|
|
22
|
+
# Double-check locking pattern for async
|
|
23
|
+
if _client_session is None or _client_session.closed:
|
|
24
|
+
async with _session_lock:
|
|
25
|
+
# Check again after acquiring lock
|
|
26
|
+
if _client_session is None or _client_session.closed:
|
|
27
|
+
# Configure timeout optimized for localhost IPC
|
|
28
|
+
timeout = aiohttp.ClientTimeout(
|
|
29
|
+
total=240, # 4-minute total timeout for slow operations
|
|
30
|
+
sock_connect=10, # Fast connection over localhost
|
|
31
|
+
sock_read=None # Covered by total timeout
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
# Configure TCP connector optimized for localhost IPC
|
|
35
|
+
connector = aiohttp.TCPConnector(
|
|
36
|
+
limit=30, # Maximum connections for single host
|
|
37
|
+
limit_per_host=30, # Maximum connections per host
|
|
38
|
+
enable_cleanup_closed=True # Enable cleanup of closed connections
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
_client_session = aiohttp.ClientSession(
|
|
42
|
+
timeout=timeout,
|
|
43
|
+
connector=connector
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
return _client_session
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
async def _handle_request_error():
|
|
50
|
+
"""Handle connection errors by closing and resetting the session.
|
|
51
|
+
|
|
52
|
+
This handles cases where the remote host process recycles.
|
|
53
|
+
"""
|
|
54
|
+
global _client_session
|
|
55
|
+
async with _session_lock:
|
|
56
|
+
if _client_session is not None and not _client_session.closed:
|
|
57
|
+
try:
|
|
58
|
+
await _client_session.close()
|
|
59
|
+
finally:
|
|
60
|
+
_client_session = None
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
async def _close_session() -> None:
|
|
64
|
+
"""Close the shared ClientSession if it exists.
|
|
65
|
+
|
|
66
|
+
Note: This function is currently only called by _handle_request_error().
|
|
67
|
+
There is no worker shutdown hook available, but process shutdown will
|
|
68
|
+
clean up all resources automatically.
|
|
69
|
+
"""
|
|
70
|
+
global _client_session
|
|
71
|
+
|
|
72
|
+
async with _session_lock:
|
|
73
|
+
if _client_session is not None and not _client_session.closed:
|
|
74
|
+
try:
|
|
75
|
+
await _client_session.close()
|
|
76
|
+
finally:
|
|
77
|
+
_client_session = None
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
async def post_async_request(url: str,
|
|
81
|
+
data: Any = None,
|
|
82
|
+
trace_parent: str = None,
|
|
83
|
+
trace_state: str = None,
|
|
84
|
+
function_invocation_id: str = None) -> List[Union[int, Any]]:
|
|
85
|
+
"""Post request with the data provided to the url provided.
|
|
86
|
+
|
|
87
|
+
Parameters
|
|
88
|
+
----------
|
|
89
|
+
url: str
|
|
90
|
+
url to make the post to
|
|
91
|
+
data: Any
|
|
92
|
+
object to post
|
|
93
|
+
trace_parent: str
|
|
94
|
+
traceparent header to send with the request
|
|
95
|
+
trace_state: str
|
|
96
|
+
tracestate header to send with the request
|
|
97
|
+
function_invocation_id: str
|
|
98
|
+
function invocation ID header to send for correlation
|
|
99
|
+
|
|
100
|
+
Returns
|
|
101
|
+
-------
|
|
102
|
+
[int, Any]
|
|
103
|
+
Tuple with the Response status code and the data returned from the request
|
|
104
|
+
"""
|
|
105
|
+
session = await _get_session()
|
|
106
|
+
headers = {}
|
|
107
|
+
if trace_parent:
|
|
108
|
+
headers["traceparent"] = trace_parent
|
|
109
|
+
if trace_state:
|
|
110
|
+
headers["tracestate"] = trace_state
|
|
111
|
+
if function_invocation_id:
|
|
112
|
+
headers["X-Azure-Functions-InvocationId"] = function_invocation_id
|
|
113
|
+
|
|
114
|
+
try:
|
|
115
|
+
async with session.post(url, json=data, headers=headers) as response:
|
|
116
|
+
# We disable aiohttp's input type validation
|
|
117
|
+
# as the server may respond with alternative
|
|
118
|
+
# data encodings. This is potentially unsafe.
|
|
119
|
+
# More here: https://docs.aiohttp.org/en/stable/client_advanced.html
|
|
120
|
+
data = await response.json(content_type=None)
|
|
121
|
+
return [response.status, data]
|
|
122
|
+
except (aiohttp.ClientError, asyncio.TimeoutError):
|
|
123
|
+
# On connection errors, close and recreate session for next request
|
|
124
|
+
await _handle_request_error()
|
|
125
|
+
raise
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
async def get_async_request(url: str,
|
|
129
|
+
function_invocation_id: str = None) -> List[Any]:
|
|
130
|
+
"""Get the data from the url provided.
|
|
131
|
+
|
|
132
|
+
Parameters
|
|
133
|
+
----------
|
|
134
|
+
url: str
|
|
135
|
+
url to get the data from
|
|
136
|
+
function_invocation_id: str
|
|
137
|
+
function invocation ID header to send for correlation
|
|
138
|
+
|
|
139
|
+
Returns
|
|
140
|
+
-------
|
|
141
|
+
[int, Any]
|
|
142
|
+
Tuple with the Response status code and the data returned from the request
|
|
143
|
+
"""
|
|
144
|
+
session = await _get_session()
|
|
145
|
+
headers = {}
|
|
146
|
+
if function_invocation_id:
|
|
147
|
+
headers["X-Azure-Functions-InvocationId"] = function_invocation_id
|
|
148
|
+
|
|
149
|
+
try:
|
|
150
|
+
async with session.get(url, headers=headers) as response:
|
|
151
|
+
data = await response.json(content_type=None)
|
|
152
|
+
if data is None:
|
|
153
|
+
data = ""
|
|
154
|
+
return [response.status, data]
|
|
155
|
+
except (aiohttp.ClientError, asyncio.TimeoutError):
|
|
156
|
+
# On connection errors, close and recreate session for next request
|
|
157
|
+
await _handle_request_error()
|
|
158
|
+
raise
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
async def delete_async_request(url: str,
|
|
162
|
+
function_invocation_id: str = None) -> List[Union[int, Any]]:
|
|
163
|
+
"""Delete the data from the url provided.
|
|
164
|
+
|
|
165
|
+
Parameters
|
|
166
|
+
----------
|
|
167
|
+
url: str
|
|
168
|
+
url to delete the data from
|
|
169
|
+
function_invocation_id: str
|
|
170
|
+
function invocation ID header to send for correlation
|
|
171
|
+
|
|
172
|
+
Returns
|
|
173
|
+
-------
|
|
174
|
+
[int, Any]
|
|
175
|
+
Tuple with the Response status code and the data returned from the request
|
|
176
|
+
"""
|
|
177
|
+
session = await _get_session()
|
|
178
|
+
headers = {}
|
|
179
|
+
if function_invocation_id:
|
|
180
|
+
headers["X-Azure-Functions-InvocationId"] = function_invocation_id
|
|
181
|
+
|
|
182
|
+
try:
|
|
183
|
+
async with session.delete(url, headers=headers) as response:
|
|
184
|
+
data = await response.json(content_type=None)
|
|
185
|
+
return [response.status, data]
|
|
186
|
+
except (aiohttp.ClientError, asyncio.TimeoutError):
|
|
187
|
+
# On connection errors, close and recreate session for next request
|
|
188
|
+
await _handle_request_error()
|
|
189
|
+
raise
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: azure-functions-durable
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.5.0
|
|
4
4
|
Summary: Durable Functions For Python
|
|
5
5
|
Home-page: https://github.com/Azure/azure-functions-durable-python
|
|
6
6
|
Author: Azure Functions team at Microsoft Corp.
|
|
@@ -51,7 +51,7 @@ Follow these instructions to get started with Durable Functions in Python:
|
|
|
51
51
|
|
|
52
52
|
* Python Durable Functions requires [Azure Functions Core Tools](https://docs.microsoft.com/en-us/azure/azure-functions/functions-run-local) version 3.0.2630 or higher.
|
|
53
53
|
|
|
54
|
-
## Durable
|
|
54
|
+
## OpenAI Agent SDK Integration with Azure Durable Functions (Preview)
|
|
55
55
|
|
|
56
56
|
Build resilient, stateful AI agents backed by Durable Functions orchestration—see the full documentation at [docs/openai_agents/README.md](docs/openai_agents/README.md).
|
|
57
57
|
|
|
@@ -153,6 +153,9 @@ samples-v2/openai_agents/basic/non_strict_output_type.py
|
|
|
153
153
|
samples-v2/openai_agents/basic/previous_response_id.py
|
|
154
154
|
samples-v2/openai_agents/basic/remote_image.py
|
|
155
155
|
samples-v2/openai_agents/basic/tools.py
|
|
156
|
+
samples-v2/openai_agents/customer_service/README.md
|
|
157
|
+
samples-v2/openai_agents/customer_service/customer_service.py
|
|
158
|
+
samples-v2/openai_agents/customer_service/customer_service_client.py
|
|
156
159
|
samples-v2/openai_agents/handoffs/message_filter.py
|
|
157
160
|
samples-v2/orchestration_versioning/.funcignore
|
|
158
161
|
samples-v2/orchestration_versioning/.gitignore
|
|
@@ -336,4 +339,5 @@ tests/test_utils/constants.py
|
|
|
336
339
|
tests/test_utils/json_utils.py
|
|
337
340
|
tests/test_utils/testClasses.py
|
|
338
341
|
tests/utils/__init__.py
|
|
339
|
-
tests/utils/test_entity_utils.py
|
|
342
|
+
tests/utils/test_entity_utils.py
|
|
343
|
+
tests/utils/test_http_utils.py
|
{azure-functions-durable-1.4.0rc2 → azure-functions-durable-1.5.0}/docs/openai_agents/README.md
RENAMED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
# Durable
|
|
1
|
+
# OpenAI Agent SDK Integration with Azure Durable Functions (Preview)
|
|
2
2
|
|
|
3
3
|
Build production-ready AI agents with automatic state persistence and failure recovery.
|
|
4
4
|
|
|
5
5
|
## Overview
|
|
6
6
|
|
|
7
|
-
The Durable
|
|
7
|
+
The OpenAI Agent SDK Integration with Azure Durable Functions (Preview) integration combines the familiar OpenAI Agents SDK with Azure Durable Functions to create reliable, stateful AI agents that can survive any failure and continue exactly where they stopped.
|
|
8
8
|
|
|
9
9
|
## Key Benefits
|
|
10
10
|
|
|
@@ -19,4 +19,4 @@ The Durable OpenAI Agents integration combines the familiar OpenAI Agents SDK wi
|
|
|
19
19
|
- [Getting Started](getting-started.md) - Setup and your first durable agent
|
|
20
20
|
- [Reference](reference.md) - Complete reference documentation
|
|
21
21
|
|
|
22
|
-
> Dependency & compatibility: The `azure-functions-durable` package does NOT declare `openai` or `openai-agents` as dependencies. If you need
|
|
22
|
+
> Dependency & compatibility: The `azure-functions-durable` package does NOT declare `openai` or `openai-agents` as dependencies. If you need the OpenAI Agent SDK Integration with Azure Durable Functions(Preview), explicitly add `openai` and `openai-agents` to your `requirements.txt` (see `samples-v2/openai_agents/requirements.txt`). This integration is validated with the versions currently pinned there (`openai==1.107.3`, `openai-agents==0.3.0`). Because the OpenAI ecosystem changes rapidly, if you encounter issues, first pin to these versions to rule out a version mismatch before filing an issue.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Getting Started with
|
|
1
|
+
# Getting Started with the OpenAI Agent SDK Integration with Azure Durable Functions (Preview)
|
|
2
2
|
|
|
3
3
|
Getting started guide for implementing stateful AI agents using Azure Durable Functions orchestration with automatic checkpointing and replay semantics.
|
|
4
4
|
|
|
@@ -13,7 +13,7 @@ Getting started guide for implementing stateful AI agents using Azure Durable Fu
|
|
|
13
13
|
|
|
14
14
|
### Create an Azure Functions App
|
|
15
15
|
|
|
16
|
-
This framework is designed specifically for **Azure Functions applications**. You need to create a Python Functions app to use
|
|
16
|
+
This framework is designed specifically for **Azure Functions applications**. You need to create a Python Functions app to use the OpenAI Agent SDK Integration with Azure Durable Functions (Preview).
|
|
17
17
|
|
|
18
18
|
**For new users**: If you're new to Azure Functions, follow these guides to get started:
|
|
19
19
|
- [Create your first Python function in Azure](https://learn.microsoft.com/en-us/azure/azure-functions/create-first-function-vs-code-python)
|
|
@@ -35,7 +35,7 @@ python -m venv venv
|
|
|
35
35
|
# On macOS/Linux:
|
|
36
36
|
source venv/bin/activate
|
|
37
37
|
# On Windows:
|
|
38
|
-
|
|
38
|
+
venv\Scripts\activate
|
|
39
39
|
```
|
|
40
40
|
|
|
41
41
|
### Install Dependencies
|
|
@@ -56,12 +56,24 @@ Then install them:
|
|
|
56
56
|
pip install -r requirements.txt
|
|
57
57
|
```
|
|
58
58
|
|
|
59
|
-
> Dependency & compatibility: The `azure-functions-durable` package does NOT declare `openai` or `openai-agents` as dependencies. If you need
|
|
59
|
+
> Dependency & compatibility: The `azure-functions-durable` package does NOT declare `openai` or `openai-agents` as dependencies. If you need the OpenAI Agents Integration for Reliability on Azure Functions (Preview), explicitly add `openai` and `openai-agents` to your `requirements.txt` (see `samples-v2/openai_agents/requirements.txt`). This integration is validated with the versions currently pinned there (`openai==1.107.3`, `openai-agents==0.3.0`). Because the OpenAI ecosystem changes rapidly, if you encounter issues, first pin to these versions to rule out a version mismatch before filing an issue.
|
|
60
60
|
|
|
61
61
|
### Configuring Durable Task Scheduler Backend
|
|
62
62
|
|
|
63
63
|
**Durable Task Scheduler is the preferred backend** for this integration as it provides enhanced performance, better observability, and simplified local development. While not a hard requirement, it's strongly recommended for production workloads.
|
|
64
64
|
|
|
65
|
+
IMPORTANT: Ensure your function app is using the *preview* extension bundle version 4.34.0 or higher by specifying it in `host.json`:
|
|
66
|
+
|
|
67
|
+
```json
|
|
68
|
+
{
|
|
69
|
+
"version": "2.0",
|
|
70
|
+
"extensionBundle": {
|
|
71
|
+
"id": "Microsoft.Azure.Functions.ExtensionBundle.Preview",
|
|
72
|
+
"version": "[4.34.0, 5.0.0)"
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
```
|
|
76
|
+
|
|
65
77
|
There are two ways to configure the backend locally:
|
|
66
78
|
|
|
67
79
|
#### Using the Emulator (Recommended)
|
|
@@ -126,8 +138,9 @@ Update `local.settings.json` with your service configuration:
|
|
|
126
138
|
"FUNCTIONS_WORKER_RUNTIME": "python",
|
|
127
139
|
"AZURE_OPENAI_ENDPOINT": "https://<resource-name>.openai.azure.com/",
|
|
128
140
|
"AZURE_OPENAI_DEPLOYMENT": "<deployment-name>",
|
|
141
|
+
"OPENAI_DEFAULT_MODEL": "<deployment-name>",
|
|
129
142
|
"AZURE_OPENAI_API_VERSION": "2024-10-01-preview",
|
|
130
|
-
"DURABLE_TASK_SCHEDULER_CONNECTION_STRING": "http://localhost:8080;Authentication=None;",
|
|
143
|
+
"DURABLE_TASK_SCHEDULER_CONNECTION_STRING": "Endpoint=http://localhost:8080;Authentication=None;",
|
|
131
144
|
"TASKHUB": "default"
|
|
132
145
|
}
|
|
133
146
|
}
|