conductor-python 1.3.3__tar.gz → 1.3.4__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.3 → conductor_python-1.3.4}/PKG-INFO +222 -100
- {conductor_python-1.3.3 → conductor_python-1.3.4}/README.md +221 -99
- {conductor_python-1.3.3 → conductor_python-1.3.4}/pyproject.toml +1 -1
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/automator/json_schema_generator.py +7 -5
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/automator/task_handler.py +230 -19
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/async_rest.py +88 -60
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/rest.py +95 -60
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/telemetry/metrics_collector.py +107 -76
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/telemetry/model/metric_documentation.py +1 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/telemetry/model/metric_name.py +1 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/__init__.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/__init__.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/ai/__init__.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/ai/configuration.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/ai/integrations.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/ai/orchestrator.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/authorization_client.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/automator/__init__.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/automator/async_task_runner.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/automator/task_runner.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/automator/utils.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/configuration/__init__.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/configuration/configuration.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/configuration/settings/__init__.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/configuration/settings/authentication_settings.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/configuration/settings/metrics_settings.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/context/__init__.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/context/task_context.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/event/__init__.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/event/conductor_event.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/event/event_client.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/event/event_dispatcher.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/event/listener_register.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/event/listeners.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/event/queue/__init__.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/event/queue/kafka_queue_configuration.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/event/queue/queue_configuration.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/event/queue/queue_worker_configuration.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/event/sync_event_dispatcher.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/event/sync_listener_register.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/event/task_events.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/event/task_runner_events.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/event/workflow_events.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/exceptions/__init__.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/exceptions/api_error.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/exceptions/api_exception_handler.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/helpers/__init__.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/helpers/helper.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/__init__.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/api/__init__.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/api/application_resource_api.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/api/async_task_resource_api.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/api/authorization_resource_api.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/api/event_resource_api.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/api/gateway_auth_resource_api.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/api/group_resource_api.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/api/integration_resource_api.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/api/metadata_resource_api.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/api/prompt_resource_api.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/api/role_resource_api.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/api/scheduler_resource_api.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/api/schema_resource_api.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/api/secret_resource_api.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/api/service_registry_resource_api.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/api/task_resource_api.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/api/token_resource_api.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/api/user_resource_api.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/api/workflow_bulk_resource_api.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/api/workflow_resource_api.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/api_client.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/async_api_client.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/__init__.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/action.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/auditable.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/authentication_config.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/authorization_request.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/bulk_response.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/circuit_breaker_transition_response.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/conductor_application.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/conductor_user.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/correlation_ids_search_request.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/create_or_update_application_request.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/create_or_update_role_request.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/event_handler.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/external_storage_location.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/generate_token_request.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/group.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/health.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/health_check_status.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/integration.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/integration_api.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/integration_api_update.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/integration_def.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/integration_update.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/permission.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/poll_data.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/prompt_template.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/prompt_test_request.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/proto_registry_entry.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/rate_limit.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/request_param.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/rerun_workflow_request.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/response.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/role.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/save_schedule_request.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/schema_def.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/scrollable_search_result_workflow_summary.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/search_result_task.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/search_result_task_summary.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/search_result_workflow.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/search_result_workflow_schedule_execution_model.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/search_result_workflow_summary.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/service_method.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/service_registry.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/signal_response.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/skip_task_request.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/start_workflow.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/start_workflow_request.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/state_change_event.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/sub_workflow_params.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/subject_ref.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/tag_object.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/tag_string.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/target_ref.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/task.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/task_def.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/task_details.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/task_exec_log.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/task_result.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/task_result_status.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/task_summary.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/terminate_workflow.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/token.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/update_workflow_variables.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/upsert_group_request.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/upsert_user_request.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/workflow.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/workflow_def.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/workflow_run.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/workflow_schedule.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/workflow_schedule_execution_model.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/workflow_state_update.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/workflow_status.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/workflow_summary.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/workflow_tag.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/workflow_task.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/models/workflow_test_request.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/http/thread.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/integration_client.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/metadata_client.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/orkes/__init__.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/orkes/api/__init__.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/orkes/api/tags_api.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/orkes/models/__init__.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/orkes/models/access_key.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/orkes/models/access_key_status.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/orkes/models/access_type.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/orkes/models/created_access_key.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/orkes/models/granted_permission.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/orkes/models/metadata_tag.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/orkes/models/ratelimit_tag.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/orkes/orkes_authorization_client.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/orkes/orkes_base_client.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/orkes/orkes_integration_client.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/orkes/orkes_metadata_client.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/orkes/orkes_prompt_client.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/orkes/orkes_scheduler_client.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/orkes/orkes_schema_client.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/orkes/orkes_secret_client.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/orkes/orkes_service_registry_client.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/orkes/orkes_task_client.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/orkes/orkes_workflow_client.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/orkes_clients.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/prompt_client.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/scheduler_client.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/schema_client.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/secret_client.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/service_registry_client.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/task_client.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/telemetry/__init__.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/telemetry/model/__init__.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/telemetry/model/metric_label.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/worker/__init__.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/worker/exception.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/worker/worker.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/worker/worker_config.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/worker/worker_interface.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/worker/worker_loader.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/worker/worker_task.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/workflow/__init__.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/workflow/conductor_workflow.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/workflow/executor/__init__.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/workflow/executor/workflow_executor.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/workflow/task/__init__.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/workflow/task/do_while_task.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/workflow/task/dynamic_fork_task.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/workflow/task/dynamic_task.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/workflow/task/event_task.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/workflow/task/fork_task.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/workflow/task/get_document.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/workflow/task/http_poll_task.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/workflow/task/http_task.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/workflow/task/human_task.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/workflow/task/inline.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/workflow/task/javascript_task.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/workflow/task/join_task.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/workflow/task/json_jq_task.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/workflow/task/kafka_publish.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/workflow/task/kafka_publish_input.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/workflow/task/llm_tasks/__init__.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/workflow/task/llm_tasks/call_mcp_tool.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/workflow/task/llm_tasks/chat_message.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/workflow/task/llm_tasks/generate_audio.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/workflow/task/llm_tasks/generate_image.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/workflow/task/llm_tasks/list_mcp_tools.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/workflow/task/llm_tasks/llm_chat_complete.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/workflow/task/llm_tasks/llm_generate_embeddings.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/workflow/task/llm_tasks/llm_index_documents.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/workflow/task/llm_tasks/llm_index_text.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/workflow/task/llm_tasks/llm_query_embeddings.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/workflow/task/llm_tasks/llm_search_embeddings.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/workflow/task/llm_tasks/llm_search_index.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/workflow/task/llm_tasks/llm_store_embeddings.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/workflow/task/llm_tasks/llm_text_complete.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/workflow/task/llm_tasks/tool_call.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/workflow/task/llm_tasks/tool_spec.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/workflow/task/llm_tasks/utils/__init__.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/workflow/task/llm_tasks/utils/embedding_model.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/workflow/task/llm_tasks/utils/prompt.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/workflow/task/set_variable_task.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/workflow/task/simple_task.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/workflow/task/start_workflow_task.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/workflow/task/sub_workflow_task.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/workflow/task/switch_task.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/workflow/task/task.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/workflow/task/task_type.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/workflow/task/terminate_task.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/workflow/task/timeout_policy.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/workflow/task/wait_for_webhook_task.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/src/conductor/client/workflow/task/wait_task.py +0 -0
- {conductor_python-1.3.3 → conductor_python-1.3.4}/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.4
|
|
4
4
|
Summary: Python SDK for working with https://github.com/conductor-oss/conductor
|
|
5
5
|
License: Apache-2.0
|
|
6
6
|
Author: Orkes
|
|
@@ -31,74 +31,145 @@ Requires-Dist: six (>=1.10)
|
|
|
31
31
|
Requires-Dist: typing-extensions (>=4.2.0)
|
|
32
32
|
Description-Content-Type: text/markdown
|
|
33
33
|
|
|
34
|
-
#
|
|
34
|
+
# Python SDK for Conductor
|
|
35
35
|
|
|
36
|
-
[](https://github.com/conductor-sdk/conductor-python/actions/workflows/pull_request.yml)
|
|
37
|
+
[](https://pypi.org/project/conductor-python/)
|
|
38
|
+
[](https://pypi.org/project/conductor-python/)
|
|
39
|
+
[](LICENSE)
|
|
37
40
|
|
|
38
|
-
Python SDK for [Conductor](https://www.conductor-oss.org/)
|
|
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.
|
|
39
42
|
|
|
40
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.
|
|
41
44
|
|
|
42
45
|
[](https://GitHub.com/conductor-oss/conductor/)
|
|
43
46
|
|
|
44
|
-
## 60-Second Quickstart
|
|
45
47
|
|
|
46
|
-
Install the SDK and create a single file `quickstart.py`:
|
|
47
48
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
49
|
+
<!-- TOC -->
|
|
50
|
+
* [Python SDK for Conductor](#python-sdk-for-conductor)
|
|
51
|
+
* [Start Conductor server](#start--conductor-server)
|
|
52
|
+
* [Install the SDK](#install-the-sdk)
|
|
53
|
+
* [60-Second Quickstart](#60-second-quickstart)
|
|
54
|
+
* [Comprehensive worker example](#comprehensive-worker-example-)
|
|
55
|
+
* [Workers](#workers)
|
|
56
|
+
* [Monitoring Workers](#monitoring-workers)
|
|
57
|
+
* [Workflows](#workflows)
|
|
58
|
+
* [Troubleshooting](#troubleshooting)
|
|
59
|
+
* [AI & LLM Workflows](#ai--llm-workflows)
|
|
60
|
+
* [Examples](#examples)
|
|
61
|
+
* [API Journey Examples](#api-journey-examples)
|
|
62
|
+
* [Documentation](#documentation)
|
|
63
|
+
* [Support](#support)
|
|
64
|
+
* [Frequently Asked Questions](#frequently-asked-questions)
|
|
65
|
+
* [License](#license)
|
|
66
|
+
<!-- TOC -->
|
|
67
|
+
|
|
51
68
|
|
|
52
|
-
##
|
|
69
|
+
## Start Conductor server
|
|
53
70
|
|
|
54
|
-
If you don't already have a Conductor server running:
|
|
71
|
+
If you don't already have a Conductor server running, pick one:
|
|
72
|
+
|
|
73
|
+
**Docker Compose (recommended, includes UI):**
|
|
74
|
+
|
|
75
|
+
```shell
|
|
76
|
+
docker run -p 8080:8080 conductoross/conductor:latest
|
|
77
|
+
```
|
|
78
|
+
The UI will be available at `http://localhost:8080` and the API at `http://localhost:8080/api`
|
|
55
79
|
|
|
56
|
-
**
|
|
80
|
+
**MacOS / Linux (one-liner):** (If you don't want to use docker, you can install and run the binary directly)
|
|
57
81
|
```shell
|
|
58
82
|
curl -sSL https://raw.githubusercontent.com/conductor-oss/conductor/main/conductor_server.sh | sh
|
|
59
83
|
```
|
|
60
84
|
|
|
61
|
-
**
|
|
85
|
+
**Conductor CLI**
|
|
62
86
|
```shell
|
|
63
|
-
|
|
87
|
+
# Installs conductor cli
|
|
88
|
+
npm install -g @conductor-oss/conductor-cli
|
|
89
|
+
|
|
90
|
+
# Start the open source conductor server
|
|
91
|
+
conductor server start
|
|
92
|
+
# see conductor server --help for all the available commands
|
|
64
93
|
```
|
|
65
|
-
The UI will be available at `http://localhost:8080`.
|
|
66
94
|
|
|
67
|
-
##
|
|
95
|
+
## Install the SDK
|
|
96
|
+
|
|
97
|
+
```shell
|
|
98
|
+
pip install conductor-python
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## 60-Second Quickstart
|
|
102
|
+
|
|
103
|
+
**Step 1: Create a workflow**
|
|
104
|
+
|
|
105
|
+
Workflows are definitions that reference task types (e.g. a SIMPLE task called `greet`). We'll build a workflow called
|
|
106
|
+
`greetings` that runs one task and returns its output.
|
|
107
|
+
|
|
108
|
+
Assuming you have a `WorkflowExecutor` (`executor`) and a worker task (`greet`):
|
|
109
|
+
|
|
110
|
+
```python
|
|
111
|
+
from conductor.client.workflow.conductor_workflow import ConductorWorkflow
|
|
112
|
+
|
|
113
|
+
workflow = ConductorWorkflow(name='greetings', version=1, executor=executor)
|
|
114
|
+
greet_task = greet(task_ref_name='greet_ref', name=workflow.input('name'))
|
|
115
|
+
workflow >> greet_task
|
|
116
|
+
workflow.output_parameters({'result': greet_task.output('result')})
|
|
117
|
+
workflow.register(overwrite=True)
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
**Step 2: Write worker**
|
|
121
|
+
|
|
122
|
+
Workers are just Python functions decorated with `@worker_task` that poll Conductor for tasks and execute them.
|
|
123
|
+
|
|
124
|
+
```python
|
|
125
|
+
from conductor.client.worker.worker_task import worker_task
|
|
126
|
+
|
|
127
|
+
# register_task_def=True is convenient for local dev quickstarts; in production, manage task definitions separately.
|
|
128
|
+
@worker_task(task_definition_name='greet', register_task_def=True)
|
|
129
|
+
def greet(name: str) -> str:
|
|
130
|
+
return f'Hello {name}'
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
**Step 3: Run your first workflow app**
|
|
134
|
+
|
|
135
|
+
Create a `quickstart.py` with the following:
|
|
136
|
+
|
|
68
137
|
```python
|
|
69
138
|
from conductor.client.automator.task_handler import TaskHandler
|
|
70
139
|
from conductor.client.configuration.configuration import Configuration
|
|
140
|
+
from conductor.client.orkes_clients import OrkesClients
|
|
71
141
|
from conductor.client.workflow.conductor_workflow import ConductorWorkflow
|
|
72
|
-
from conductor.client.workflow.executor.workflow_executor import WorkflowExecutor
|
|
73
142
|
from conductor.client.worker.worker_task import worker_task
|
|
74
143
|
|
|
75
144
|
|
|
76
|
-
#
|
|
77
|
-
@worker_task(task_definition_name='greet')
|
|
145
|
+
# A worker is any Python function.
|
|
146
|
+
@worker_task(task_definition_name='greet', register_task_def=True)
|
|
78
147
|
def greet(name: str) -> str:
|
|
79
148
|
return f'Hello {name}'
|
|
80
149
|
|
|
81
150
|
|
|
82
151
|
def main():
|
|
83
|
-
#
|
|
152
|
+
# Configure the SDK (reads CONDUCTOR_SERVER_URL / CONDUCTOR_AUTH_* from env).
|
|
84
153
|
config = Configuration()
|
|
85
154
|
|
|
86
|
-
|
|
87
|
-
executor =
|
|
88
|
-
workflow = ConductorWorkflow(name='greetings', version=1, executor=executor)
|
|
89
|
-
workflow >> greet(task_ref_name='greet_ref', name=workflow.input('name'))
|
|
90
|
-
workflow.register(True)
|
|
155
|
+
clients = OrkesClients(configuration=config)
|
|
156
|
+
executor = clients.get_workflow_executor()
|
|
91
157
|
|
|
92
|
-
#
|
|
93
|
-
|
|
94
|
-
|
|
158
|
+
# Build a workflow with the >> operator.
|
|
159
|
+
workflow = ConductorWorkflow(name='greetings', version=1, executor=executor)
|
|
160
|
+
greet_task = greet(task_ref_name='greet_ref', name=workflow.input('name'))
|
|
161
|
+
workflow >> greet_task
|
|
162
|
+
workflow.output_parameters({'result': greet_task.output('result')})
|
|
163
|
+
workflow.register(overwrite=True)
|
|
95
164
|
|
|
96
|
-
#
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
print(f'execution: {config.ui_host}/execution/{result.workflow_id}')
|
|
165
|
+
# Start polling for tasks (one worker subprocess per worker function).
|
|
166
|
+
with TaskHandler(configuration=config, scan_for_annotated_workers=True) as task_handler:
|
|
167
|
+
task_handler.start_processes()
|
|
100
168
|
|
|
101
|
-
|
|
169
|
+
# Run the workflow and get the result.
|
|
170
|
+
run = executor.execute(name='greetings', version=1, workflow_input={'name': 'Conductor'})
|
|
171
|
+
print(f'result: {run.output["result"]}')
|
|
172
|
+
print(f'execution: {config.ui_host}/execution/{run.workflow_id}')
|
|
102
173
|
|
|
103
174
|
|
|
104
175
|
if __name__ == '__main__':
|
|
@@ -108,42 +179,42 @@ if __name__ == '__main__':
|
|
|
108
179
|
Run it:
|
|
109
180
|
|
|
110
181
|
```shell
|
|
111
|
-
export CONDUCTOR_SERVER_URL="http://localhost:8080/api"
|
|
112
182
|
python quickstart.py
|
|
113
183
|
```
|
|
114
184
|
|
|
115
|
-
>
|
|
185
|
+
> ### Using Orkes Conductor / Remote Server?
|
|
186
|
+
> Export your authentication credentials as well:
|
|
187
|
+
>
|
|
116
188
|
> ```shell
|
|
117
189
|
> export CONDUCTOR_SERVER_URL="https://your-cluster.orkesconductor.io/api"
|
|
190
|
+
>
|
|
191
|
+
> # If using Orkes Conductor that requires auth key/secret
|
|
118
192
|
> export CONDUCTOR_AUTH_KEY="your-key"
|
|
119
193
|
> export CONDUCTOR_AUTH_SECRET="your-secret"
|
|
194
|
+
>
|
|
195
|
+
> # Optional — set to false to force HTTP/1.1 if your network environment has unstable long-lived HTTP/2 connections (default: true)
|
|
196
|
+
> # export CONDUCTOR_HTTP2_ENABLED=false
|
|
120
197
|
> ```
|
|
121
198
|
> See [Configuration](#configuration) for details.
|
|
122
199
|
|
|
123
|
-
That's it -- you just defined a worker, built a workflow, and executed it. Open
|
|
200
|
+
That's it -- you just defined a worker, built a workflow, and executed it. Open the Conductor UI (default:
|
|
201
|
+
[http://localhost:8127](http://localhost:8127)) to see the execution.
|
|
124
202
|
|
|
125
|
-
|
|
203
|
+
## Comprehensive worker example
|
|
204
|
+
The example includes sync + async workers, metrics, and long-running tasks
|
|
126
205
|
|
|
127
206
|
See [examples/workers_e2e.py](examples/workers_e2e.py)
|
|
128
207
|
|
|
129
|
-
### Configuration
|
|
130
|
-
|
|
131
|
-
The SDK reads configuration from environment variables:
|
|
132
|
-
|
|
133
|
-
```shell
|
|
134
|
-
# Required — Conductor server endpoint
|
|
135
|
-
export CONDUCTOR_SERVER_URL="http://localhost:8080/api"
|
|
136
|
-
|
|
137
|
-
# Optional — Authentication (required for Orkes Conductor)
|
|
138
|
-
export CONDUCTOR_AUTH_KEY="your-key"
|
|
139
|
-
export CONDUCTOR_AUTH_SECRET="your-secret"
|
|
140
|
-
```
|
|
141
208
|
---
|
|
142
209
|
|
|
143
210
|
## Workers
|
|
144
211
|
|
|
145
|
-
Workers are Python functions that execute tasks. Decorate any function with `@worker_task` to
|
|
146
|
-
|
|
212
|
+
Workers are Python functions that execute Conductor tasks. Decorate any function with `@worker_task` to:
|
|
213
|
+
|
|
214
|
+
- register it as a worker (auto-discovered by `TaskHandler`)
|
|
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)).
|
|
147
218
|
|
|
148
219
|
```python
|
|
149
220
|
from conductor.client.worker.worker_task import worker_task
|
|
@@ -156,6 +227,8 @@ def greet(name: str) -> str:
|
|
|
156
227
|
**Async workers** for I/O-bound tasks — the SDK automatically uses `AsyncTaskRunner` (event loop, no thread overhead):
|
|
157
228
|
|
|
158
229
|
```python
|
|
230
|
+
import httpx
|
|
231
|
+
|
|
159
232
|
@worker_task(task_definition_name='fetch_data')
|
|
160
233
|
async def fetch_data(url: str) -> dict:
|
|
161
234
|
async with httpx.AsyncClient() as client:
|
|
@@ -165,6 +238,9 @@ async def fetch_data(url: str) -> dict:
|
|
|
165
238
|
|
|
166
239
|
**Start workers** with `TaskHandler`:
|
|
167
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`.
|
|
243
|
+
|
|
168
244
|
```python
|
|
169
245
|
from conductor.client.automator.task_handler import TaskHandler
|
|
170
246
|
from conductor.client.configuration.configuration import Configuration
|
|
@@ -173,13 +249,76 @@ api_config = Configuration()
|
|
|
173
249
|
task_handler = TaskHandler(
|
|
174
250
|
workers=[],
|
|
175
251
|
configuration=api_config,
|
|
176
|
-
scan_for_annotated_workers=True,
|
|
252
|
+
scan_for_annotated_workers=True, # auto-discover @worker_task functions
|
|
253
|
+
# monitor_processes=True and restart_on_failure=True by default
|
|
177
254
|
)
|
|
178
255
|
task_handler.start_processes()
|
|
256
|
+
try:
|
|
257
|
+
task_handler.join_processes() # blocks (workers poll forever)
|
|
258
|
+
finally:
|
|
259
|
+
task_handler.stop_processes()
|
|
179
260
|
```
|
|
180
261
|
|
|
181
262
|
Workers support complex inputs (dataclasses), long-running tasks (`TaskInProgress`), and hierarchical configuration via environment variables.
|
|
182
263
|
|
|
264
|
+
**Resilience: auto-restart and health checks**
|
|
265
|
+
|
|
266
|
+
|
|
267
|
+
Workers are typically long-lived services. By default, `TaskHandler` monitors worker subprocesses and restarts them if
|
|
268
|
+
they exit unexpectedly.
|
|
269
|
+
|
|
270
|
+
For a `/healthcheck` endpoint, you can use:
|
|
271
|
+
|
|
272
|
+
```python
|
|
273
|
+
task_handler.is_healthy()
|
|
274
|
+
task_handler.get_worker_process_status()
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
To disable monitoring/restarts (e.g., local debugging):
|
|
278
|
+
|
|
279
|
+
```python
|
|
280
|
+
TaskHandler(..., monitor_processes=False, restart_on_failure=False)
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
**Worker Configuration**
|
|
284
|
+
|
|
285
|
+
Workers support hierarchical environment variable configuration — global settings that can be overridden per worker:
|
|
286
|
+
|
|
287
|
+
```shell
|
|
288
|
+
# Global (all workers)
|
|
289
|
+
export CONDUCTOR_WORKER_ALL_POLL_INTERVAL_MILLIS=250
|
|
290
|
+
export CONDUCTOR_WORKER_ALL_THREAD_COUNT=20
|
|
291
|
+
export CONDUCTOR_WORKER_ALL_DOMAIN=production
|
|
292
|
+
|
|
293
|
+
# Per-worker override
|
|
294
|
+
export CONDUCTOR_WORKER_GREETINGS_THREAD_COUNT=50
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
See [WORKER_CONFIGURATION.md](WORKER_CONFIGURATION.md) for all options.
|
|
298
|
+
|
|
299
|
+
## Monitoring Workers
|
|
300
|
+
|
|
301
|
+
Enable Prometheus metrics:
|
|
302
|
+
|
|
303
|
+
```python
|
|
304
|
+
from conductor.client.automator.task_handler import TaskHandler
|
|
305
|
+
from conductor.client.configuration.configuration import Configuration
|
|
306
|
+
from conductor.client.configuration.settings.metrics_settings import MetricsSettings
|
|
307
|
+
|
|
308
|
+
api_config = Configuration()
|
|
309
|
+
metrics_settings = MetricsSettings(directory='/tmp/conductor-metrics', http_port=8000)
|
|
310
|
+
|
|
311
|
+
task_handler = TaskHandler(configuration=api_config, metrics_settings=metrics_settings, scan_for_annotated_workers=True)
|
|
312
|
+
task_handler.start_processes()
|
|
313
|
+
# Metrics at http://localhost:8000/metrics
|
|
314
|
+
try:
|
|
315
|
+
task_handler.join_processes() # blocks (workers poll forever)
|
|
316
|
+
finally:
|
|
317
|
+
task_handler.stop_processes()
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
See [METRICS.md](METRICS.md) for details.
|
|
321
|
+
|
|
183
322
|
**Learn more:**
|
|
184
323
|
- [Worker Design & Architecture](docs/design/WORKER_DESIGN.md) — AsyncTaskRunner vs TaskRunner, discovery, lifecycle
|
|
185
324
|
- [Worker Configuration](WORKER_CONFIGURATION.md) — Environment variable configuration system
|
|
@@ -190,13 +329,19 @@ Workers support complex inputs (dataclasses), long-running tasks (`TaskInProgres
|
|
|
190
329
|
Define workflows in Python using the `>>` operator to chain tasks:
|
|
191
330
|
|
|
192
331
|
```python
|
|
332
|
+
from conductor.client.configuration.configuration import Configuration
|
|
333
|
+
from conductor.client.orkes_clients import OrkesClients
|
|
193
334
|
from conductor.client.workflow.conductor_workflow import ConductorWorkflow
|
|
194
|
-
from conductor.client.workflow.executor.workflow_executor import WorkflowExecutor
|
|
195
335
|
|
|
196
|
-
|
|
336
|
+
api_config = Configuration()
|
|
337
|
+
clients = OrkesClients(configuration=api_config)
|
|
338
|
+
workflow_executor = clients.get_workflow_executor()
|
|
339
|
+
|
|
197
340
|
workflow = ConductorWorkflow(name='greetings', version=1, executor=workflow_executor)
|
|
341
|
+
# Assuming greet is defined (see Workers section above).
|
|
198
342
|
workflow >> greet(task_ref_name='greet_ref', name=workflow.input('name'))
|
|
199
|
-
|
|
343
|
+
# Registering is required if you want to start/execute by name+version; optional if you only execute inline.
|
|
344
|
+
workflow.register(overwrite=True)
|
|
200
345
|
```
|
|
201
346
|
|
|
202
347
|
**Execute workflows:**
|
|
@@ -209,10 +354,14 @@ print(result.output)
|
|
|
209
354
|
# Asynchronous (returns workflow ID immediately)
|
|
210
355
|
from conductor.client.http.models import StartWorkflowRequest
|
|
211
356
|
request = StartWorkflowRequest(name='greetings', version=1, input={'name': 'Orkes'})
|
|
212
|
-
workflow_id =
|
|
357
|
+
workflow_id = workflow_executor.start_workflow(request)
|
|
358
|
+
|
|
359
|
+
# Inline (sends the workflow definition with the request; no prior register required)
|
|
360
|
+
run = workflow.execute(workflow_input={'name': 'Orkes'}, wait_for_seconds=10)
|
|
361
|
+
print(run.output)
|
|
213
362
|
```
|
|
214
363
|
|
|
215
|
-
**Manage running workflows:**
|
|
364
|
+
**Manage running workflows and send signals:**
|
|
216
365
|
|
|
217
366
|
```python
|
|
218
367
|
from conductor.client.orkes_clients import OrkesClients
|
|
@@ -232,21 +381,22 @@ workflow_client.restart_workflow(workflow_id)
|
|
|
232
381
|
- [Workflow Testing](docs/WORKFLOW_TESTING.md) — Unit testing with mock task outputs
|
|
233
382
|
- [Metadata Management](docs/METADATA.md) — Task & workflow definitions
|
|
234
383
|
|
|
235
|
-
##
|
|
236
|
-
|
|
237
|
-
The complete Hello World example lives in [`examples/helloworld/`](examples/helloworld/):
|
|
238
|
-
|
|
239
|
-
```shell
|
|
240
|
-
python examples/helloworld/helloworld.py
|
|
241
|
-
```
|
|
242
|
-
|
|
243
|
-
It creates a `greetings` workflow with one worker task, runs the worker, executes the workflow, and prints the result. See the [Hello World source](examples/helloworld/helloworld.py) for the full code.
|
|
384
|
+
## Troubleshooting
|
|
244
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`).
|
|
394
|
+
---
|
|
245
395
|
## AI & LLM Workflows
|
|
246
396
|
|
|
247
397
|
Conductor supports AI-native workflows including agentic tool calling, RAG pipelines, and multi-agent orchestration.
|
|
248
398
|
|
|
249
|
-
|
|
399
|
+
**Agentic Workflows**
|
|
250
400
|
|
|
251
401
|
Build AI agents where LLMs dynamically select and call Python workers as tools. See [examples/agentic_workflows/](examples/agentic_workflows/) for all examples.
|
|
252
402
|
|
|
@@ -258,7 +408,7 @@ Build AI agents where LLMs dynamically select and call Python workers as tools.
|
|
|
258
408
|
| [function_calling_example.py](examples/agentic_workflows/function_calling_example.py) | LLM picks which Python function to call based on user queries |
|
|
259
409
|
| [mcp_weather_agent.py](examples/agentic_workflows/mcp_weather_agent.py) | AI agent using MCP tools for weather queries |
|
|
260
410
|
|
|
261
|
-
|
|
411
|
+
**LLM and RAG Workflows**
|
|
262
412
|
|
|
263
413
|
| Example | Description |
|
|
264
414
|
|---------|-------------|
|
|
@@ -277,36 +427,6 @@ pip install "markitdown[pdf]"
|
|
|
277
427
|
python examples/rag_workflow.py document.pdf "What are the key findings?"
|
|
278
428
|
```
|
|
279
429
|
|
|
280
|
-
### Worker Configuration
|
|
281
|
-
|
|
282
|
-
Workers support hierarchical environment variable configuration — global settings that can be overridden per worker:
|
|
283
|
-
|
|
284
|
-
```shell
|
|
285
|
-
# Global (all workers)
|
|
286
|
-
export CONDUCTOR_WORKER_ALL_POLL_INTERVAL_MILLIS=250
|
|
287
|
-
export CONDUCTOR_WORKER_ALL_THREAD_COUNT=20
|
|
288
|
-
export CONDUCTOR_WORKER_ALL_DOMAIN=production
|
|
289
|
-
|
|
290
|
-
# Per-worker override
|
|
291
|
-
export CONDUCTOR_WORKER_GREETINGS_THREAD_COUNT=50
|
|
292
|
-
```
|
|
293
|
-
|
|
294
|
-
See [WORKER_CONFIGURATION.md](WORKER_CONFIGURATION.md) for all options.
|
|
295
|
-
|
|
296
|
-
### Monitoring
|
|
297
|
-
|
|
298
|
-
Enable Prometheus metrics:
|
|
299
|
-
|
|
300
|
-
```python
|
|
301
|
-
from conductor.client.configuration.settings.metrics_settings import MetricsSettings
|
|
302
|
-
|
|
303
|
-
metrics_settings = MetricsSettings(directory='/tmp/conductor-metrics', http_port=8000)
|
|
304
|
-
task_handler = TaskHandler(configuration=api_config, metrics_settings=metrics_settings, scan_for_annotated_workers=True)
|
|
305
|
-
# Metrics at http://localhost:8000/metrics
|
|
306
|
-
```
|
|
307
|
-
|
|
308
|
-
See [METRICS.md](METRICS.md) for details.
|
|
309
|
-
|
|
310
430
|
## Examples
|
|
311
431
|
|
|
312
432
|
See the [Examples Guide](examples/README.md) for the full catalog. Key examples:
|
|
@@ -314,6 +434,7 @@ See the [Examples Guide](examples/README.md) for the full catalog. Key examples:
|
|
|
314
434
|
| Example | Description | Run |
|
|
315
435
|
|---------|-------------|-----|
|
|
316
436
|
| [workers_e2e.py](examples/workers_e2e.py) | End-to-end: sync + async workers, metrics | `python examples/workers_e2e.py` |
|
|
437
|
+
| [fastapi_worker_service.py](examples/fastapi_worker_service.py) | FastAPI: expose a workflow as an API (+ workers) (deps: fastapi, uvicorn) | `uvicorn examples.fastapi_worker_service:app --port 8081 --workers 1` |
|
|
317
438
|
| [helloworld.py](examples/helloworld/helloworld.py) | Minimal hello world | `python examples/helloworld/helloworld.py` |
|
|
318
439
|
| [dynamic_workflow.py](examples/dynamic_workflow.py) | Build workflows programmatically | `python examples/dynamic_workflow.py` |
|
|
319
440
|
| [llm_chat.py](examples/agentic_workflows/llm_chat.py) | AI multi-turn chat | `python examples/agentic_workflows/llm_chat.py` |
|
|
@@ -323,7 +444,7 @@ See the [Examples Guide](examples/README.md) for the full catalog. Key examples:
|
|
|
323
444
|
| [test_workflows.py](examples/test_workflows.py) | Unit testing workflows | `python -m unittest examples.test_workflows` |
|
|
324
445
|
| [kitchensink.py](examples/kitchensink.py) | All task types (HTTP, JS, JQ, Switch) | `python examples/kitchensink.py` |
|
|
325
446
|
|
|
326
|
-
|
|
447
|
+
## API Journey Examples
|
|
327
448
|
|
|
328
449
|
End-to-end examples covering all APIs for each domain:
|
|
329
450
|
|
|
@@ -355,7 +476,8 @@ End-to-end examples covering all APIs for each domain:
|
|
|
355
476
|
|
|
356
477
|
## Support
|
|
357
478
|
|
|
358
|
-
- [Open an issue](https://github.com/conductor-
|
|
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
|
|
359
481
|
- [Join the Conductor Slack](https://join.slack.com/t/orkes-conductor/shared_invite/zt-2vdbx239s-Eacdyqya9giNLHfrCavfaA) for community discussion and help
|
|
360
482
|
- [Orkes Community Forum](https://community.orkes.io/) for Q&A
|
|
361
483
|
|