conductor-python 1.3.4__tar.gz → 1.3.5__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.
- {conductor_python-1.3.4 → conductor_python-1.3.5}/PKG-INFO +169 -171
- {conductor_python-1.3.4 → conductor_python-1.3.5}/README.md +168 -170
- {conductor_python-1.3.4 → conductor_python-1.3.5}/pyproject.toml +4 -1
- conductor_python-1.3.5/src/conductor/__init__.py +6 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/automator/async_task_runner.py +47 -40
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/automator/task_handler.py +10 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/automator/task_runner.py +57 -126
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/api/async_task_resource_api.py +83 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/api/task_resource_api.py +83 -0
- conductor_python-1.3.4/src/conductor/__init__.py +0 -1
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/__init__.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/ai/__init__.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/ai/configuration.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/ai/integrations.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/ai/orchestrator.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/authorization_client.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/automator/__init__.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/automator/json_schema_generator.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/automator/utils.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/configuration/__init__.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/configuration/configuration.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/configuration/settings/__init__.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/configuration/settings/authentication_settings.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/configuration/settings/metrics_settings.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/context/__init__.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/context/task_context.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/event/__init__.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/event/conductor_event.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/event/event_client.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/event/event_dispatcher.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/event/listener_register.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/event/listeners.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/event/queue/__init__.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/event/queue/kafka_queue_configuration.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/event/queue/queue_configuration.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/event/queue/queue_worker_configuration.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/event/sync_event_dispatcher.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/event/sync_listener_register.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/event/task_events.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/event/task_runner_events.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/event/workflow_events.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/exceptions/__init__.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/exceptions/api_error.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/exceptions/api_exception_handler.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/helpers/__init__.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/helpers/helper.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/__init__.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/api/__init__.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/api/application_resource_api.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/api/authorization_resource_api.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/api/event_resource_api.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/api/gateway_auth_resource_api.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/api/group_resource_api.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/api/integration_resource_api.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/api/metadata_resource_api.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/api/prompt_resource_api.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/api/role_resource_api.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/api/scheduler_resource_api.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/api/schema_resource_api.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/api/secret_resource_api.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/api/service_registry_resource_api.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/api/token_resource_api.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/api/user_resource_api.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/api/workflow_bulk_resource_api.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/api/workflow_resource_api.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/api_client.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/async_api_client.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/async_rest.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/__init__.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/action.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/auditable.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/authentication_config.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/authorization_request.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/bulk_response.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/circuit_breaker_transition_response.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/conductor_application.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/conductor_user.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/correlation_ids_search_request.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/create_or_update_application_request.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/create_or_update_role_request.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/event_handler.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/external_storage_location.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/generate_token_request.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/group.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/health.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/health_check_status.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/integration.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/integration_api.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/integration_api_update.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/integration_def.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/integration_update.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/permission.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/poll_data.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/prompt_template.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/prompt_test_request.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/proto_registry_entry.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/rate_limit.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/request_param.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/rerun_workflow_request.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/response.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/role.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/save_schedule_request.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/schema_def.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/scrollable_search_result_workflow_summary.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/search_result_task.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/search_result_task_summary.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/search_result_workflow.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/search_result_workflow_schedule_execution_model.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/search_result_workflow_summary.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/service_method.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/service_registry.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/signal_response.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/skip_task_request.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/start_workflow.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/start_workflow_request.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/state_change_event.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/sub_workflow_params.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/subject_ref.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/tag_object.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/tag_string.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/target_ref.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/task.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/task_def.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/task_details.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/task_exec_log.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/task_result.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/task_result_status.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/task_summary.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/terminate_workflow.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/token.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/update_workflow_variables.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/upsert_group_request.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/upsert_user_request.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/workflow.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/workflow_def.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/workflow_run.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/workflow_schedule.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/workflow_schedule_execution_model.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/workflow_state_update.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/workflow_status.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/workflow_summary.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/workflow_tag.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/workflow_task.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/models/workflow_test_request.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/rest.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/http/thread.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/integration_client.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/metadata_client.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/orkes/__init__.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/orkes/api/__init__.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/orkes/api/tags_api.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/orkes/models/__init__.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/orkes/models/access_key.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/orkes/models/access_key_status.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/orkes/models/access_type.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/orkes/models/created_access_key.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/orkes/models/granted_permission.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/orkes/models/metadata_tag.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/orkes/models/ratelimit_tag.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/orkes/orkes_authorization_client.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/orkes/orkes_base_client.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/orkes/orkes_integration_client.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/orkes/orkes_metadata_client.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/orkes/orkes_prompt_client.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/orkes/orkes_scheduler_client.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/orkes/orkes_schema_client.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/orkes/orkes_secret_client.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/orkes/orkes_service_registry_client.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/orkes/orkes_task_client.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/orkes/orkes_workflow_client.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/orkes_clients.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/prompt_client.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/scheduler_client.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/schema_client.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/secret_client.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/service_registry_client.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/task_client.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/telemetry/__init__.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/telemetry/metrics_collector.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/telemetry/model/__init__.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/telemetry/model/metric_documentation.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/telemetry/model/metric_label.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/telemetry/model/metric_name.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/worker/__init__.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/worker/exception.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/worker/worker.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/worker/worker_config.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/worker/worker_interface.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/worker/worker_loader.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/worker/worker_task.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/workflow/__init__.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/workflow/conductor_workflow.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/workflow/executor/__init__.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/workflow/executor/workflow_executor.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/workflow/task/__init__.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/workflow/task/do_while_task.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/workflow/task/dynamic_fork_task.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/workflow/task/dynamic_task.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/workflow/task/event_task.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/workflow/task/fork_task.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/workflow/task/get_document.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/workflow/task/http_poll_task.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/workflow/task/http_task.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/workflow/task/human_task.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/workflow/task/inline.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/workflow/task/javascript_task.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/workflow/task/join_task.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/workflow/task/json_jq_task.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/workflow/task/kafka_publish.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/workflow/task/kafka_publish_input.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/workflow/task/llm_tasks/__init__.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/workflow/task/llm_tasks/call_mcp_tool.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/workflow/task/llm_tasks/chat_message.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/workflow/task/llm_tasks/generate_audio.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/workflow/task/llm_tasks/generate_image.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/workflow/task/llm_tasks/list_mcp_tools.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/workflow/task/llm_tasks/llm_chat_complete.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/workflow/task/llm_tasks/llm_generate_embeddings.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/workflow/task/llm_tasks/llm_index_documents.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/workflow/task/llm_tasks/llm_index_text.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/workflow/task/llm_tasks/llm_query_embeddings.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/workflow/task/llm_tasks/llm_search_embeddings.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/workflow/task/llm_tasks/llm_search_index.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/workflow/task/llm_tasks/llm_store_embeddings.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/workflow/task/llm_tasks/llm_text_complete.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/workflow/task/llm_tasks/tool_call.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/workflow/task/llm_tasks/tool_spec.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/workflow/task/llm_tasks/utils/__init__.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/workflow/task/llm_tasks/utils/embedding_model.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/workflow/task/llm_tasks/utils/prompt.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/workflow/task/set_variable_task.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/workflow/task/simple_task.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/workflow/task/start_workflow_task.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/workflow/task/sub_workflow_task.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/workflow/task/switch_task.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/workflow/task/task.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/workflow/task/task_type.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/workflow/task/terminate_task.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/workflow/task/timeout_policy.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/workflow/task/wait_for_webhook_task.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/workflow/task/wait_task.py +0 -0
- {conductor_python-1.3.4 → conductor_python-1.3.5}/src/conductor/client/workflow_client.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: conductor-python
|
|
3
|
-
Version: 1.3.
|
|
3
|
+
Version: 1.3.5
|
|
4
4
|
Summary: Python SDK for working with https://github.com/conductor-oss/conductor
|
|
5
5
|
License: Apache-2.0
|
|
6
6
|
Author: Orkes
|
|
@@ -40,33 +40,30 @@ Description-Content-Type: text/markdown
|
|
|
40
40
|
|
|
41
41
|
Python SDK for [Conductor](https://www.conductor-oss.org/) (OSS and Orkes Conductor) — an orchestration platform for building distributed applications, AI agents, and workflow-driven microservices. Define workflows as code, run workers anywhere, and let Conductor handle retries, state management, and observability.
|
|
42
42
|
|
|
43
|
-
If you find [Conductor](https://github.com/conductor-oss/conductor) useful, please consider giving it a star on GitHub
|
|
43
|
+
If you find [Conductor](https://github.com/conductor-oss/conductor) useful, please consider giving it a star on GitHub — it helps the project grow.
|
|
44
44
|
|
|
45
45
|
[](https://GitHub.com/conductor-oss/conductor/)
|
|
46
46
|
|
|
47
|
-
|
|
48
|
-
|
|
49
47
|
<!-- TOC -->
|
|
50
|
-
* [
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
* [
|
|
55
|
-
* [
|
|
56
|
-
* [
|
|
57
|
-
* [
|
|
58
|
-
* [
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
48
|
+
* [Start Conductor Server](#start-conductor-server)
|
|
49
|
+
* [Install the SDK](#install-the-sdk)
|
|
50
|
+
* [60-Second Quickstart](#60-second-quickstart)
|
|
51
|
+
* [Feature Showcase](#feature-showcase)
|
|
52
|
+
* [Workers: Sync and Async](#workers-sync-and-async)
|
|
53
|
+
* [Workflows with HTTP Calls and Waits](#workflows-with-http-calls-and-waits)
|
|
54
|
+
* [Long-Running Tasks with TaskContext](#long-running-tasks-with-taskcontext)
|
|
55
|
+
* [Monitoring with Metrics](#monitoring-with-metrics)
|
|
56
|
+
* [Managing Workflow Executions](#managing-workflow-executions)
|
|
57
|
+
* [AI & LLM Workflows](#ai--llm-workflows)
|
|
58
|
+
* [Why Conductor?](#why-conductor)
|
|
59
|
+
* [Examples](#examples)
|
|
60
|
+
* [Documentation](#documentation)
|
|
61
|
+
* [Frequently Asked Questions](#frequently-asked-questions)
|
|
62
|
+
* [Support](#support)
|
|
63
|
+
* [License](#license)
|
|
66
64
|
<!-- TOC -->
|
|
67
65
|
|
|
68
|
-
|
|
69
|
-
## Start Conductor server
|
|
66
|
+
## Start Conductor Server
|
|
70
67
|
|
|
71
68
|
If you don't already have a Conductor server running, pick one:
|
|
72
69
|
|
|
@@ -117,7 +114,7 @@ workflow.output_parameters({'result': greet_task.output('result')})
|
|
|
117
114
|
workflow.register(overwrite=True)
|
|
118
115
|
```
|
|
119
116
|
|
|
120
|
-
**Step 2: Write worker**
|
|
117
|
+
**Step 2: Write a worker**
|
|
121
118
|
|
|
122
119
|
Workers are just Python functions decorated with `@worker_task` that poll Conductor for tasks and execute them.
|
|
123
120
|
|
|
@@ -182,216 +179,201 @@ Run it:
|
|
|
182
179
|
python quickstart.py
|
|
183
180
|
```
|
|
184
181
|
|
|
185
|
-
> ### Using Orkes Conductor / Remote Server?
|
|
182
|
+
> ### Using Orkes Conductor / Remote Server?
|
|
186
183
|
> Export your authentication credentials as well:
|
|
187
|
-
>
|
|
184
|
+
>
|
|
188
185
|
> ```shell
|
|
189
186
|
> export CONDUCTOR_SERVER_URL="https://your-cluster.orkesconductor.io/api"
|
|
190
|
-
>
|
|
187
|
+
>
|
|
191
188
|
> # If using Orkes Conductor that requires auth key/secret
|
|
192
189
|
> export CONDUCTOR_AUTH_KEY="your-key"
|
|
193
190
|
> export CONDUCTOR_AUTH_SECRET="your-secret"
|
|
194
|
-
>
|
|
191
|
+
>
|
|
195
192
|
> # Optional — set to false to force HTTP/1.1 if your network environment has unstable long-lived HTTP/2 connections (default: true)
|
|
196
193
|
> # export CONDUCTOR_HTTP2_ENABLED=false
|
|
197
194
|
> ```
|
|
198
195
|
> See [Configuration](#configuration) for details.
|
|
199
196
|
|
|
200
|
-
That's it
|
|
197
|
+
That's it — you just defined a worker, built a workflow, and executed it. Open the Conductor UI (default:
|
|
201
198
|
[http://localhost:8127](http://localhost:8127)) to see the execution.
|
|
202
199
|
|
|
203
|
-
## Comprehensive worker example
|
|
204
|
-
The example includes sync + async workers, metrics, and long-running tasks
|
|
205
|
-
|
|
206
|
-
See [examples/workers_e2e.py](examples/workers_e2e.py)
|
|
207
|
-
|
|
208
200
|
---
|
|
209
201
|
|
|
210
|
-
##
|
|
202
|
+
## Feature Showcase
|
|
211
203
|
|
|
212
|
-
Workers
|
|
204
|
+
### Workers: Sync and Async
|
|
213
205
|
|
|
214
|
-
|
|
215
|
-
- use it as a workflow task (call it with `task_ref_name=...`)
|
|
216
|
-
|
|
217
|
-
Note: Workers can also be used by LLMs for tool calling (see [AI & LLM Workflows](#ai--llm-workflows)).
|
|
206
|
+
The SDK automatically selects the right runner based on your function signature — `TaskRunner` (thread pool) for sync functions, `AsyncTaskRunner` (event loop) for async.
|
|
218
207
|
|
|
219
208
|
```python
|
|
220
209
|
from conductor.client.worker.worker_task import worker_task
|
|
221
210
|
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
211
|
+
# Sync worker — for CPU-bound work (uses ThreadPoolExecutor)
|
|
212
|
+
@worker_task(task_definition_name='process_image', thread_count=4)
|
|
213
|
+
def process_image(image_url: str) -> dict:
|
|
214
|
+
import PIL.Image, io, requests
|
|
215
|
+
img = PIL.Image.open(io.BytesIO(requests.get(image_url).content))
|
|
216
|
+
img.thumbnail((256, 256))
|
|
217
|
+
return {'width': img.width, 'height': img.height}
|
|
226
218
|
|
|
227
|
-
**Async workers** for I/O-bound tasks — the SDK automatically uses `AsyncTaskRunner` (event loop, no thread overhead):
|
|
228
219
|
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
@worker_task(task_definition_name='fetch_data')
|
|
220
|
+
# Async worker — for I/O-bound work (uses AsyncTaskRunner, no thread overhead)
|
|
221
|
+
@worker_task(task_definition_name='fetch_data', thread_count=50)
|
|
233
222
|
async def fetch_data(url: str) -> dict:
|
|
223
|
+
import httpx
|
|
234
224
|
async with httpx.AsyncClient() as client:
|
|
235
|
-
|
|
236
|
-
return
|
|
225
|
+
resp = await client.get(url)
|
|
226
|
+
return resp.json()
|
|
237
227
|
```
|
|
238
228
|
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
Note: `@worker_task` functions are discovered only after their modules are imported. Either import your worker modules
|
|
242
|
-
explicitly, or pass `import_modules=[...]` when constructing `TaskHandler`.
|
|
229
|
+
Start workers with `TaskHandler` — it auto-discovers `@worker_task` functions and spawns one subprocess per worker:
|
|
243
230
|
|
|
244
231
|
```python
|
|
245
232
|
from conductor.client.automator.task_handler import TaskHandler
|
|
246
233
|
from conductor.client.configuration.configuration import Configuration
|
|
247
234
|
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
scan_for_annotated_workers=True, # auto-discover @worker_task functions
|
|
253
|
-
# monitor_processes=True and restart_on_failure=True by default
|
|
254
|
-
)
|
|
255
|
-
task_handler.start_processes()
|
|
256
|
-
try:
|
|
257
|
-
task_handler.join_processes() # blocks (workers poll forever)
|
|
258
|
-
finally:
|
|
259
|
-
task_handler.stop_processes()
|
|
235
|
+
config = Configuration()
|
|
236
|
+
with TaskHandler(configuration=config, scan_for_annotated_workers=True) as task_handler:
|
|
237
|
+
task_handler.start_processes()
|
|
238
|
+
task_handler.join_processes() # blocks forever (workers poll continuously)
|
|
260
239
|
```
|
|
261
240
|
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
**Resilience: auto-restart and health checks**
|
|
241
|
+
See [examples/worker_example.py](examples/worker_example.py) and [examples/workers_e2e.py](examples/workers_e2e.py) for complete examples.
|
|
265
242
|
|
|
243
|
+
### Workflows with HTTP Calls and Waits
|
|
266
244
|
|
|
267
|
-
|
|
268
|
-
they exit unexpectedly.
|
|
269
|
-
|
|
270
|
-
For a `/healthcheck` endpoint, you can use:
|
|
245
|
+
Chain custom workers with built-in system tasks — HTTP calls, waits, JavaScript, JQ transforms — all in one workflow:
|
|
271
246
|
|
|
272
247
|
```python
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
248
|
+
from conductor.client.workflow.conductor_workflow import ConductorWorkflow
|
|
249
|
+
from conductor.client.workflow.task.http_task import HttpTask
|
|
250
|
+
from conductor.client.workflow.task.wait_task import WaitTask
|
|
276
251
|
|
|
277
|
-
|
|
252
|
+
workflow = ConductorWorkflow(name='order_pipeline', version=1, executor=executor)
|
|
278
253
|
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
```
|
|
254
|
+
# Custom worker task
|
|
255
|
+
validate = validate_order(task_ref_name='validate', order_id=workflow.input('order_id'))
|
|
282
256
|
|
|
283
|
-
|
|
257
|
+
# Built-in HTTP task — call any API, no worker needed
|
|
258
|
+
charge_payment = HttpTask(task_ref_name='charge_payment', http_input={
|
|
259
|
+
'uri': 'https://api.stripe.com/v1/charges',
|
|
260
|
+
'method': 'POST',
|
|
261
|
+
'headers': {'Authorization': ['Bearer ${workflow.input.stripe_key}']},
|
|
262
|
+
'body': {'amount': '${validate.output.amount}'}
|
|
263
|
+
})
|
|
284
264
|
|
|
285
|
-
|
|
265
|
+
# Built-in Wait task — pause the workflow for 10 seconds
|
|
266
|
+
cool_down = WaitTask(task_ref_name='cool_down', wait_for_seconds=10)
|
|
286
267
|
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
export CONDUCTOR_WORKER_ALL_POLL_INTERVAL_MILLIS=250
|
|
290
|
-
export CONDUCTOR_WORKER_ALL_THREAD_COUNT=20
|
|
291
|
-
export CONDUCTOR_WORKER_ALL_DOMAIN=production
|
|
268
|
+
# Another custom worker task
|
|
269
|
+
notify = send_notification(task_ref_name='notify', message='Order complete')
|
|
292
270
|
|
|
293
|
-
#
|
|
294
|
-
|
|
271
|
+
# Chain with >> operator
|
|
272
|
+
workflow >> validate >> charge_payment >> cool_down >> notify
|
|
273
|
+
|
|
274
|
+
# Execute synchronously and wait for the result
|
|
275
|
+
result = workflow.execute(workflow_input={'order_id': 'ORD-123', 'stripe_key': 'sk_test_...'})
|
|
276
|
+
print(result.output)
|
|
295
277
|
```
|
|
296
278
|
|
|
297
|
-
See [
|
|
279
|
+
See [examples/kitchensink.py](examples/kitchensink.py) for all task types (HTTP, JavaScript, JQ, Switch, Terminate) and [examples/workflow_ops.py](examples/workflow_ops.py) for lifecycle operations.
|
|
298
280
|
|
|
299
|
-
|
|
281
|
+
### Long-Running Tasks with TaskContext
|
|
300
282
|
|
|
301
|
-
|
|
283
|
+
For tasks that take minutes or hours (batch processing, ML training, external approvals), use `TaskContext` to report progress and poll incrementally:
|
|
302
284
|
|
|
303
285
|
```python
|
|
304
|
-
from
|
|
305
|
-
from conductor.client.
|
|
306
|
-
from conductor.client.
|
|
286
|
+
from typing import Union
|
|
287
|
+
from conductor.client.worker.worker_task import worker_task
|
|
288
|
+
from conductor.client.context.task_context import get_task_context, TaskInProgress
|
|
307
289
|
|
|
308
|
-
|
|
309
|
-
|
|
290
|
+
@worker_task(task_definition_name='batch_job')
|
|
291
|
+
def batch_job(batch_id: str) -> Union[dict, TaskInProgress]:
|
|
292
|
+
ctx = get_task_context()
|
|
293
|
+
ctx.add_log(f"Processing batch {batch_id}, poll #{ctx.get_poll_count()}")
|
|
310
294
|
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
task_handler.stop_processes()
|
|
295
|
+
if ctx.get_poll_count() < 3:
|
|
296
|
+
# Not done yet — re-queue and check again in 30 seconds
|
|
297
|
+
return TaskInProgress(callback_after_seconds=30, output={'progress': ctx.get_poll_count() * 33})
|
|
298
|
+
|
|
299
|
+
# Done after 3 polls
|
|
300
|
+
return {'status': 'completed', 'batch_id': batch_id}
|
|
318
301
|
```
|
|
319
302
|
|
|
320
|
-
|
|
303
|
+
`TaskContext` also provides access to task metadata, retry counts, workflow IDs, and the ability to add logs visible in the Conductor UI.
|
|
321
304
|
|
|
322
|
-
|
|
323
|
-
- [Worker Design & Architecture](docs/design/WORKER_DESIGN.md) — AsyncTaskRunner vs TaskRunner, discovery, lifecycle
|
|
324
|
-
- [Worker Configuration](WORKER_CONFIGURATION.md) — Environment variable configuration system
|
|
325
|
-
- [Complete Worker Guide](docs/WORKER.md) — All worker patterns (function, class, annotation, async)
|
|
305
|
+
See [examples/task_context_example.py](examples/task_context_example.py) for all patterns (polling, retry-aware logic, async context, input access).
|
|
326
306
|
|
|
327
|
-
|
|
307
|
+
### Monitoring with Metrics
|
|
328
308
|
|
|
329
|
-
|
|
309
|
+
Enable Prometheus metrics with a single setting — the SDK exposes poll counts, execution times, error rates, and HTTP latency:
|
|
330
310
|
|
|
331
311
|
```python
|
|
312
|
+
from conductor.client.automator.task_handler import TaskHandler
|
|
332
313
|
from conductor.client.configuration.configuration import Configuration
|
|
333
|
-
from conductor.client.
|
|
334
|
-
from conductor.client.workflow.conductor_workflow import ConductorWorkflow
|
|
314
|
+
from conductor.client.configuration.settings.metrics_settings import MetricsSettings
|
|
335
315
|
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
workflow_executor = clients.get_workflow_executor()
|
|
316
|
+
config = Configuration()
|
|
317
|
+
metrics = MetricsSettings(directory='/tmp/conductor-metrics', http_port=8000)
|
|
339
318
|
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
# Registering is required if you want to start/execute by name+version; optional if you only execute inline.
|
|
344
|
-
workflow.register(overwrite=True)
|
|
319
|
+
with TaskHandler(configuration=config, metrics_settings=metrics, scan_for_annotated_workers=True) as task_handler:
|
|
320
|
+
task_handler.start_processes()
|
|
321
|
+
task_handler.join_processes()
|
|
345
322
|
```
|
|
346
323
|
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
result = workflow_executor.execute(name='greetings', version=1, workflow_input={'name': 'Orkes'})
|
|
352
|
-
print(result.output)
|
|
324
|
+
```shell
|
|
325
|
+
# Prometheus-compatible endpoint
|
|
326
|
+
curl http://localhost:8000/metrics
|
|
327
|
+
```
|
|
353
328
|
|
|
354
|
-
|
|
355
|
-
from conductor.client.http.models import StartWorkflowRequest
|
|
356
|
-
request = StartWorkflowRequest(name='greetings', version=1, input={'name': 'Orkes'})
|
|
357
|
-
workflow_id = workflow_executor.start_workflow(request)
|
|
329
|
+
See [examples/metrics_example.py](examples/metrics_example.py) and [METRICS.md](METRICS.md) for details on all tracked metrics.
|
|
358
330
|
|
|
359
|
-
|
|
360
|
-
run = workflow.execute(workflow_input={'name': 'Orkes'}, wait_for_seconds=10)
|
|
361
|
-
print(run.output)
|
|
362
|
-
```
|
|
331
|
+
### Managing Workflow Executions
|
|
363
332
|
|
|
364
|
-
|
|
333
|
+
Full lifecycle control — start, execute, pause, resume, terminate, retry, restart, rerun, signal, and search:
|
|
365
334
|
|
|
366
335
|
```python
|
|
336
|
+
from conductor.client.configuration.configuration import Configuration
|
|
337
|
+
from conductor.client.http.models import StartWorkflowRequest, RerunWorkflowRequest, TaskResult
|
|
367
338
|
from conductor.client.orkes_clients import OrkesClients
|
|
368
339
|
|
|
369
|
-
|
|
340
|
+
config = Configuration()
|
|
341
|
+
clients = OrkesClients(configuration=config)
|
|
370
342
|
workflow_client = clients.get_workflow_client()
|
|
343
|
+
task_client = clients.get_task_client()
|
|
344
|
+
executor = clients.get_workflow_executor()
|
|
371
345
|
|
|
346
|
+
# Start async (returns workflow ID immediately)
|
|
347
|
+
workflow_id = executor.start_workflow(StartWorkflowRequest(name='my_workflow', input={'key': 'value'}))
|
|
348
|
+
|
|
349
|
+
# Execute sync (blocks until workflow completes)
|
|
350
|
+
result = executor.execute(name='my_workflow', version=1, workflow_input={'key': 'value'})
|
|
351
|
+
|
|
352
|
+
# Lifecycle management
|
|
372
353
|
workflow_client.pause_workflow(workflow_id)
|
|
373
354
|
workflow_client.resume_workflow(workflow_id)
|
|
374
355
|
workflow_client.terminate_workflow(workflow_id, reason='no longer needed')
|
|
375
|
-
workflow_client.retry_workflow(workflow_id)
|
|
376
|
-
workflow_client.restart_workflow(workflow_id)
|
|
356
|
+
workflow_client.retry_workflow(workflow_id) # retry from last failed task
|
|
357
|
+
workflow_client.restart_workflow(workflow_id) # restart from the beginning
|
|
358
|
+
workflow_client.rerun_workflow(workflow_id, # rerun from a specific task
|
|
359
|
+
RerunWorkflowRequest(re_run_from_task_id=task_id))
|
|
360
|
+
|
|
361
|
+
# Send a signal to a waiting workflow (complete a WAIT task externally)
|
|
362
|
+
task_client.update_task(TaskResult(
|
|
363
|
+
workflow_instance_id=workflow_id,
|
|
364
|
+
task_id=wait_task_id,
|
|
365
|
+
status='COMPLETED',
|
|
366
|
+
output_data={'approved': True}
|
|
367
|
+
))
|
|
368
|
+
|
|
369
|
+
# Search workflows
|
|
370
|
+
results = workflow_client.search(query='status IN (RUNNING) AND correlationId = "order-123"')
|
|
377
371
|
```
|
|
378
372
|
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
- [Workflow Testing](docs/WORKFLOW_TESTING.md) — Unit testing with mock task outputs
|
|
382
|
-
- [Metadata Management](docs/METADATA.md) — Task & workflow definitions
|
|
383
|
-
|
|
384
|
-
## Troubleshooting
|
|
385
|
-
|
|
386
|
-
- Worker stops polling or crashes: `TaskHandler` monitors and restarts worker subprocesses by default. Consider exposing
|
|
387
|
-
a `/healthcheck` endpoint using `task_handler.is_healthy()` + `task_handler.get_worker_process_status()`. If you
|
|
388
|
-
enable metrics, alert on `worker_restart_total`.
|
|
389
|
-
- `httpcore.RemoteProtocolError: <ConnectionTerminated ...>`: the SDK recreates the underlying HTTP client and retries
|
|
390
|
-
once for idempotent requests. If your environment is still unstable with HTTP/2, set
|
|
391
|
-
`CONDUCTOR_HTTP2_ENABLED=false` (forces HTTP/1.1) — see `docs/WORKER.md`.
|
|
392
|
-
- FastAPI/Uvicorn: avoid running `uvicorn` with multiple web workers unless you explicitly want multiple independent
|
|
393
|
-
`TaskHandler`s polling Conductor (see `examples/fastapi_worker_service.py`).
|
|
373
|
+
See [examples/workflow_ops.py](examples/workflow_ops.py) for a complete walkthrough of every operation.
|
|
374
|
+
|
|
394
375
|
---
|
|
376
|
+
|
|
395
377
|
## AI & LLM Workflows
|
|
396
378
|
|
|
397
379
|
Conductor supports AI-native workflows including agentic tool calling, RAG pipelines, and multi-agent orchestration.
|
|
@@ -427,6 +409,23 @@ pip install "markitdown[pdf]"
|
|
|
427
409
|
python examples/rag_workflow.py document.pdf "What are the key findings?"
|
|
428
410
|
```
|
|
429
411
|
|
|
412
|
+
---
|
|
413
|
+
|
|
414
|
+
## Why Conductor?
|
|
415
|
+
|
|
416
|
+
| | |
|
|
417
|
+
|---|---|
|
|
418
|
+
| **Language agnostic** | Workers in Python, Java, Go, JS, C# — all in one workflow |
|
|
419
|
+
| **Durable execution** | Survives crashes, retries automatically, never loses state |
|
|
420
|
+
| **Built-in HTTP/Wait/JS tasks** | No code needed for common operations |
|
|
421
|
+
| **Horizontal scaling** | Built at Netflix for millions of workflows |
|
|
422
|
+
| **Full visibility** | UI shows every execution, every task, every retry |
|
|
423
|
+
| **Sync + Async execution** | Start-and-forget OR wait-for-result |
|
|
424
|
+
| **Human-in-the-loop** | WAIT tasks pause until an external signal |
|
|
425
|
+
| **AI-native** | LLM chat, RAG pipelines, function calling, MCP tools built-in |
|
|
426
|
+
|
|
427
|
+
---
|
|
428
|
+
|
|
430
429
|
## Examples
|
|
431
430
|
|
|
432
431
|
See the [Examples Guide](examples/README.md) for the full catalog. Key examples:
|
|
@@ -434,17 +433,16 @@ See the [Examples Guide](examples/README.md) for the full catalog. Key examples:
|
|
|
434
433
|
| Example | Description | Run |
|
|
435
434
|
|---------|-------------|-----|
|
|
436
435
|
| [workers_e2e.py](examples/workers_e2e.py) | End-to-end: sync + async workers, metrics | `python examples/workers_e2e.py` |
|
|
437
|
-
| [
|
|
436
|
+
| [kitchensink.py](examples/kitchensink.py) | All task types (HTTP, JS, JQ, Switch) | `python examples/kitchensink.py` |
|
|
437
|
+
| [workflow_ops.py](examples/workflow_ops.py) | Pause, resume, terminate, retry, restart, rerun, signal | `python examples/workflow_ops.py` |
|
|
438
|
+
| [task_context_example.py](examples/task_context_example.py) | Long-running tasks with TaskInProgress | `python examples/task_context_example.py` |
|
|
439
|
+
| [metrics_example.py](examples/metrics_example.py) | Prometheus metrics collection | `python examples/metrics_example.py` |
|
|
440
|
+
| [fastapi_worker_service.py](examples/fastapi_worker_service.py) | FastAPI: expose a workflow as an API (+ workers) | `uvicorn examples.fastapi_worker_service:app --port 8081 --workers 1` |
|
|
438
441
|
| [helloworld.py](examples/helloworld/helloworld.py) | Minimal hello world | `python examples/helloworld/helloworld.py` |
|
|
439
442
|
| [dynamic_workflow.py](examples/dynamic_workflow.py) | Build workflows programmatically | `python examples/dynamic_workflow.py` |
|
|
440
|
-
| [llm_chat.py](examples/agentic_workflows/llm_chat.py) | AI multi-turn chat | `python examples/agentic_workflows/llm_chat.py` |
|
|
441
|
-
| [rag_workflow.py](examples/rag_workflow.py) | RAG pipeline (PDF → pgvector → answer) | `python examples/rag_workflow.py file.pdf "question"` |
|
|
442
|
-
| [task_context_example.py](examples/task_context_example.py) | Long-running tasks with TaskInProgress | `python examples/task_context_example.py` |
|
|
443
|
-
| [workflow_ops.py](examples/workflow_ops.py) | Pause, resume, terminate workflows | `python examples/workflow_ops.py` |
|
|
444
443
|
| [test_workflows.py](examples/test_workflows.py) | Unit testing workflows | `python -m unittest examples.test_workflows` |
|
|
445
|
-
| [kitchensink.py](examples/kitchensink.py) | All task types (HTTP, JS, JQ, Switch) | `python examples/kitchensink.py` |
|
|
446
444
|
|
|
447
|
-
|
|
445
|
+
**API Journey Examples**
|
|
448
446
|
|
|
449
447
|
End-to-end examples covering all APIs for each domain:
|
|
450
448
|
|
|
@@ -474,13 +472,6 @@ End-to-end examples covering all APIs for each domain:
|
|
|
474
472
|
| [Metrics](METRICS.md) | Prometheus metrics collection |
|
|
475
473
|
| [Examples](examples/README.md) | Complete examples catalog |
|
|
476
474
|
|
|
477
|
-
## Support
|
|
478
|
-
|
|
479
|
-
- [Open an issue (SDK)](https://github.com/conductor-sdk/conductor-python/issues) for SDK bugs, questions, and feature requests
|
|
480
|
-
- [Open an issue (Conductor server)](https://github.com/conductor-oss/conductor/issues) for Conductor OSS server issues
|
|
481
|
-
- [Join the Conductor Slack](https://join.slack.com/t/orkes-conductor/shared_invite/zt-2vdbx239s-Eacdyqya9giNLHfrCavfaA) for community discussion and help
|
|
482
|
-
- [Orkes Community Forum](https://community.orkes.io/) for Q&A
|
|
483
|
-
|
|
484
475
|
## Frequently Asked Questions
|
|
485
476
|
|
|
486
477
|
**Is this the same as Netflix Conductor?**
|
|
@@ -505,7 +496,7 @@ No. While Conductor excels at asynchronous orchestration, it also supports synch
|
|
|
505
496
|
|
|
506
497
|
**Do I need to use a Conductor-specific framework?**
|
|
507
498
|
|
|
508
|
-
No. Conductor is language and framework agnostic. Use your preferred language and framework
|
|
499
|
+
No. Conductor is language and framework agnostic. Use your preferred language and framework — the [SDKs](https://github.com/conductor-oss/conductor#conductor-sdks) provide native integration for Python, Java, JavaScript, Go, C#, and more.
|
|
509
500
|
|
|
510
501
|
**Can I mix workers written in different languages?**
|
|
511
502
|
|
|
@@ -517,16 +508,23 @@ Python 3.9 and above.
|
|
|
517
508
|
|
|
518
509
|
**Should I use `def` or `async def` for my workers?**
|
|
519
510
|
|
|
520
|
-
Use `async def` for I/O-bound tasks (API calls, database queries)
|
|
511
|
+
Use `async def` for I/O-bound tasks (API calls, database queries) — the SDK uses `AsyncTaskRunner` with a single event loop for high concurrency with low overhead. Use regular `def` for CPU-bound or blocking work — the SDK uses `TaskRunner` with a thread pool. The SDK selects the right runner automatically based on your function signature.
|
|
521
512
|
|
|
522
513
|
**How do I run workers in production?**
|
|
523
514
|
|
|
524
|
-
Workers are standard Python processes. Deploy them as you would any Python application
|
|
515
|
+
Workers are standard Python processes. Deploy them as you would any Python application — in containers, VMs, or bare metal. Workers poll the Conductor server for tasks, so no inbound ports need to be opened. See [Worker Design](docs/design/WORKER_DESIGN.md) for architecture details.
|
|
525
516
|
|
|
526
517
|
**How do I test workflows without running a full Conductor server?**
|
|
527
518
|
|
|
528
519
|
The SDK provides a test framework that uses Conductor's `POST /api/workflow/test` endpoint to evaluate workflows with mock task outputs. See [Workflow Testing](docs/WORKFLOW_TESTING.md) for details.
|
|
529
520
|
|
|
521
|
+
## Support
|
|
522
|
+
|
|
523
|
+
- [Open an issue (SDK)](https://github.com/conductor-sdk/conductor-python/issues) for SDK bugs, questions, and feature requests
|
|
524
|
+
- [Open an issue (Conductor server)](https://github.com/conductor-oss/conductor/issues) for Conductor OSS server issues
|
|
525
|
+
- [Join the Conductor Slack](https://join.slack.com/t/orkes-conductor/shared_invite/zt-2vdbx239s-Eacdyqya9giNLHfrCavfaA) for community discussion and help
|
|
526
|
+
- [Orkes Community Forum](https://community.orkes.io/) for Q&A
|
|
527
|
+
|
|
530
528
|
## License
|
|
531
529
|
|
|
532
530
|
Apache 2.0
|