{"id":30144104,"url":"https://github.com/conductor-oss/python-sdk","last_synced_at":"2026-04-01T18:26:34.470Z","repository":{"id":37939302,"uuid":"454220635","full_name":"conductor-oss/python-sdk","owner":"conductor-oss","description":"Conductor OSS SDK for Python programming language","archived":false,"fork":false,"pushed_at":"2026-03-25T01:20:27.000Z","size":5174,"stargazers_count":92,"open_issues_count":31,"forks_count":38,"subscribers_count":7,"default_branch":"main","last_synced_at":"2026-03-26T07:44:50.383Z","etag":null,"topics":["conductor","data-pipelines","durable-computing","durable-execution","etl-pipeline","python","workflow"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/conductor-oss.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2022-02-01T00:54:09.000Z","updated_at":"2026-03-19T06:13:11.000Z","dependencies_parsed_at":"2023-12-02T08:25:58.925Z","dependency_job_id":"4d331ed8-14cc-4a6b-81c5-c9396151dd3b","html_url":"https://github.com/conductor-oss/python-sdk","commit_stats":{"total_commits":398,"total_committers":9,"mean_commits":44.22222222222222,"dds":0.09045226130653261,"last_synced_commit":"76064aa6ce54d291d76abe042be8159283c8ef23"},"previous_names":["conductor-sdk/conductor-python"],"tags_count":77,"template":false,"template_full_name":null,"purl":"pkg:github/conductor-oss/python-sdk","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/conductor-oss%2Fpython-sdk","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/conductor-oss%2Fpython-sdk/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/conductor-oss%2Fpython-sdk/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/conductor-oss%2Fpython-sdk/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/conductor-oss","download_url":"https://codeload.github.com/conductor-oss/python-sdk/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/conductor-oss%2Fpython-sdk/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31290850,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-01T13:12:26.723Z","status":"ssl_error","status_checked_at":"2026-04-01T13:12:25.102Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["conductor","data-pipelines","durable-computing","durable-execution","etl-pipeline","python","workflow"],"created_at":"2025-08-11T07:37:35.717Z","updated_at":"2026-04-01T18:26:34.463Z","avatar_url":"https://github.com/conductor-oss.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Python SDK for Conductor\n\n[![CI](https://github.com/conductor-sdk/conductor-python/actions/workflows/pull_request.yml/badge.svg)](https://github.com/conductor-sdk/conductor-python/actions/workflows/pull_request.yml)\n[![PyPI](https://img.shields.io/pypi/v/conductor-python.svg)](https://pypi.org/project/conductor-python/)\n[![Python Versions](https://img.shields.io/pypi/pyversions/conductor-python.svg)](https://pypi.org/project/conductor-python/)\n[![License](https://img.shields.io/pypi/l/conductor-python.svg)](LICENSE)\n\nPython 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.\n\nIf you find [Conductor](https://github.com/conductor-oss/conductor) useful, please consider giving it a star on GitHub — it helps the project grow.\n\n[![GitHub stars](https://img.shields.io/github/stars/conductor-oss/conductor.svg?style=social\u0026label=Star\u0026maxAge=)](https://GitHub.com/conductor-oss/conductor/)\n\n\u003c!-- TOC --\u003e\n* [Start Conductor Server](#start-conductor-server)\n* [Install the SDK](#install-the-sdk)\n* [60-Second Quickstart](#60-second-quickstart)\n* [Feature Showcase](#feature-showcase)\n  * [Workers: Sync and Async](#workers-sync-and-async)\n  * [Workflows with HTTP Calls and Waits](#workflows-with-http-calls-and-waits)\n  * [Long-Running Tasks with TaskContext](#long-running-tasks-with-taskcontext)\n  * [Monitoring with Metrics](#monitoring-with-metrics)\n  * [Managing Workflow Executions](#managing-workflow-executions)\n* [AI \u0026 LLM Workflows](#ai--llm-workflows)\n* [Why Conductor?](#why-conductor)\n* [Examples](#examples)\n* [Documentation](#documentation)\n* [Frequently Asked Questions](#frequently-asked-questions)\n* [Support](#support)\n* [License](#license)\n\u003c!-- TOC --\u003e\n\n## Start Conductor Server\n\nIf you don't already have a Conductor server running, pick one:\n\n**Docker Compose (recommended, includes UI):**\n\n```shell\ndocker run -p 8080:8080 conductoross/conductor:latest\n```\nThe UI will be available at `http://localhost:8080` and the API at `http://localhost:8080/api`\n\n**MacOS / Linux (one-liner):** (If you don't want to use docker, you can install and run the binary directly)\n```shell\ncurl -sSL https://raw.githubusercontent.com/conductor-oss/conductor/main/conductor_server.sh | sh\n```\n\n**Conductor CLI**\n```shell\n# Installs conductor cli\nnpm install -g @conductor-oss/conductor-cli\n\n# Start the open source conductor server\nconductor server start\n# see conductor server --help for all the available commands\n```\n\n## Install the SDK\n\n```shell\npython3 -m venv conductor-env\nsource conductor-env/bin/activate  # Windows: conductor-env\\Scripts\\activate\npip install conductor-python\n```\n\n\u003e **Already in a virtual environment?** Skip the `venv` step and run `pip install conductor-python` directly. On macOS, Windows, or in containers where system Python is not locked down, you can also install globally.\n\n## 60-Second Quickstart\n\n**Step 1: Create a workflow**\n\nWorkflows are definitions that reference task types (e.g. a SIMPLE task called `greet`). We'll build a workflow called\n`greetings` that runs one task and returns its output.\n\nAssuming you have a `WorkflowExecutor` (`executor`) and a worker task (`greet`):\n\n```python\nfrom conductor.client.workflow.conductor_workflow import ConductorWorkflow\n\nworkflow = ConductorWorkflow(name='greetings', version=1, executor=executor)\ngreet_task = greet(task_ref_name='greet_ref', name=workflow.input('name'))\nworkflow \u003e\u003e greet_task\nworkflow.output_parameters({'result': greet_task.output('result')})\nworkflow.register(overwrite=True)\n```\n\n**Step 2: Write a worker**\n\nWorkers are just Python functions decorated with `@worker_task` that poll Conductor for tasks and execute them.\n\n```python\nfrom conductor.client.worker.worker_task import worker_task\n\n# register_task_def=True is convenient for local dev quickstarts; in production, manage task definitions separately.\n@worker_task(task_definition_name='greet', register_task_def=True)\ndef greet(name: str) -\u003e str:\n    return f'Hello {name}'\n```\n\n**Step 3: Run your first workflow app**\n\nCreate a `quickstart.py` with the following:\n\n```python\nfrom conductor.client.automator.task_handler import TaskHandler\nfrom conductor.client.configuration.configuration import Configuration\nfrom conductor.client.orkes_clients import OrkesClients\nfrom conductor.client.workflow.conductor_workflow import ConductorWorkflow\nfrom conductor.client.worker.worker_task import worker_task\n\n\n# A worker is any Python function.\n@worker_task(task_definition_name='greet', register_task_def=True)\ndef greet(name: str) -\u003e str:\n    return f'Hello {name}'\n\n\ndef main():\n    # Configure the SDK (reads CONDUCTOR_SERVER_URL / CONDUCTOR_AUTH_* from env).\n    config = Configuration()\n\n    clients = OrkesClients(configuration=config)\n    executor = clients.get_workflow_executor()\n\n    # Build a workflow with the \u003e\u003e operator.\n    workflow = ConductorWorkflow(name='greetings', version=1, executor=executor)\n    greet_task = greet(task_ref_name='greet_ref', name=workflow.input('name'))\n    workflow \u003e\u003e greet_task\n    workflow.output_parameters({'result': greet_task.output('result')})\n    workflow.register(overwrite=True)\n\n    # Start polling for tasks (one worker subprocess per worker function).\n    with TaskHandler(configuration=config, scan_for_annotated_workers=True) as task_handler:\n        task_handler.start_processes()\n\n        # Run the workflow and get the result.\n        run = executor.execute(name='greetings', version=1, workflow_input={'name': 'Conductor'})\n        print(f'result: {run.output[\"result\"]}')\n        print(f'execution: {config.ui_host}/execution/{run.workflow_id}')\n\n\nif __name__ == '__main__':\n    main()\n```\n\nRun it:\n\n```shell\npython quickstart.py\n```\n\n\u003e ### Using Orkes Conductor / Remote Server?\n\u003e Export your authentication credentials as well:\n\u003e\n\u003e ```shell\n\u003e export CONDUCTOR_SERVER_URL=\"https://your-cluster.orkesconductor.io/api\"\n\u003e\n\u003e # If using Orkes Conductor that requires auth key/secret\n\u003e export CONDUCTOR_AUTH_KEY=\"your-key\"\n\u003e export CONDUCTOR_AUTH_SECRET=\"your-secret\"\n\u003e\n\u003e # Optional — set to false to force HTTP/1.1 if your network environment has unstable long-lived HTTP/2 connections (default: true)\n\u003e # export CONDUCTOR_HTTP2_ENABLED=false\n\u003e ```\n\u003e See [Configuration](#configuration) for details.\n\nThat's it — you just defined a worker, built a workflow, and executed it. Open the Conductor UI (default:\n[http://localhost:8080](http://localhost:8080)) to see the execution.\n\n---\n\n## Feature Showcase\n\n### Workers: Sync and Async\n\nThe SDK automatically selects the right runner based on your function signature — `TaskRunner` (thread pool) for sync functions, `AsyncTaskRunner` (event loop) for async.\n\n```python\nfrom conductor.client.worker.worker_task import worker_task\n\n# Sync worker — for CPU-bound work (uses ThreadPoolExecutor)\n@worker_task(task_definition_name='process_image', thread_count=4)\ndef process_image(image_url: str) -\u003e dict:\n    import PIL.Image, io, requests\n    img = PIL.Image.open(io.BytesIO(requests.get(image_url).content))\n    img.thumbnail((256, 256))\n    return {'width': img.width, 'height': img.height}\n\n\n# Async worker — for I/O-bound work (uses AsyncTaskRunner, no thread overhead)\n@worker_task(task_definition_name='fetch_data', thread_count=50)\nasync def fetch_data(url: str) -\u003e dict:\n    import httpx\n    async with httpx.AsyncClient() as client:\n        resp = await client.get(url)\n    return resp.json()\n```\n\nStart workers with `TaskHandler` — it auto-discovers `@worker_task` functions and spawns one subprocess per worker:\n\n```python\nfrom conductor.client.automator.task_handler import TaskHandler\nfrom conductor.client.configuration.configuration import Configuration\n\nconfig = Configuration()\nwith TaskHandler(configuration=config, scan_for_annotated_workers=True) as task_handler:\n    task_handler.start_processes()\n    task_handler.join_processes()  # blocks forever (workers poll continuously)\n```\n\nSee [examples/worker_example.py](examples/worker_example.py) and [examples/workers_e2e.py](examples/workers_e2e.py) for complete examples.\n\n### Workflows with HTTP Calls and Waits\n\nChain custom workers with built-in system tasks — HTTP calls, waits, JavaScript, JQ transforms — all in one workflow:\n\n```python\nfrom conductor.client.workflow.conductor_workflow import ConductorWorkflow\nfrom conductor.client.workflow.task.http_task import HttpTask\nfrom conductor.client.workflow.task.wait_task import WaitTask\n\nworkflow = ConductorWorkflow(name='order_pipeline', version=1, executor=executor)\n\n# Custom worker task\nvalidate = validate_order(task_ref_name='validate', order_id=workflow.input('order_id'))\n\n# Built-in HTTP task — call any API, no worker needed\ncharge_payment = HttpTask(task_ref_name='charge_payment', http_input={\n    'uri': 'https://api.stripe.com/v1/charges',\n    'method': 'POST',\n    'headers': {'Authorization': ['Bearer ${workflow.input.stripe_key}']},\n    'body': {'amount': '${validate.output.amount}'}\n})\n\n# Built-in Wait task — pause the workflow for 10 seconds\ncool_down = WaitTask(task_ref_name='cool_down', wait_for_seconds=10)\n\n# Another custom worker task\nnotify = send_notification(task_ref_name='notify', message='Order complete')\n\n# Chain with \u003e\u003e operator\nworkflow \u003e\u003e validate \u003e\u003e charge_payment \u003e\u003e cool_down \u003e\u003e notify\n\n# Execute synchronously and wait for the result\nresult = workflow.execute(workflow_input={'order_id': 'ORD-123', 'stripe_key': 'sk_test_...'})\nprint(result.output)\n```\n\nSee [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.\n\n### Long-Running Tasks with TaskContext\n\nFor tasks that take minutes or hours (batch processing, ML training, external approvals), use `TaskContext` to report progress and poll incrementally:\n\n```python\nfrom typing import Union\nfrom conductor.client.worker.worker_task import worker_task\nfrom conductor.client.context.task_context import get_task_context, TaskInProgress\n\n@worker_task(task_definition_name='batch_job')\ndef batch_job(batch_id: str) -\u003e Union[dict, TaskInProgress]:\n    ctx = get_task_context()\n    ctx.add_log(f\"Processing batch {batch_id}, poll #{ctx.get_poll_count()}\")\n\n    if ctx.get_poll_count() \u003c 3:\n        # Not done yet — re-queue and check again in 30 seconds\n        return TaskInProgress(callback_after_seconds=30, output={'progress': ctx.get_poll_count() * 33})\n\n    # Done after 3 polls\n    return {'status': 'completed', 'batch_id': batch_id}\n```\n\n`TaskContext` also provides access to task metadata, retry counts, workflow IDs, and the ability to add logs visible in the Conductor UI.\n\nSee [examples/task_context_example.py](examples/task_context_example.py) for all patterns (polling, retry-aware logic, async context, input access).\n\n### Monitoring with Metrics\n\nEnable Prometheus metrics with a single setting — the SDK exposes poll counts, execution times, error rates, and HTTP latency:\n\n```python\nfrom conductor.client.automator.task_handler import TaskHandler\nfrom conductor.client.configuration.configuration import Configuration\nfrom conductor.client.configuration.settings.metrics_settings import MetricsSettings\n\nconfig = Configuration()\nmetrics = MetricsSettings(directory='/tmp/conductor-metrics', http_port=8000)\n\nwith TaskHandler(configuration=config, metrics_settings=metrics, scan_for_annotated_workers=True) as task_handler:\n    task_handler.start_processes()\n    task_handler.join_processes()\n```\n\n```shell\n# Prometheus-compatible endpoint\ncurl http://localhost:8000/metrics\n```\n\nSee [examples/metrics_example.py](examples/metrics_example.py) and [METRICS.md](METRICS.md) for details on all tracked metrics.\n\n### Managing Workflow Executions\n\nFull lifecycle control — start, execute, pause, resume, terminate, retry, restart, rerun, signal, and search:\n\n```python\nfrom conductor.client.configuration.configuration import Configuration\nfrom conductor.client.http.models import StartWorkflowRequest, RerunWorkflowRequest, TaskResult\nfrom conductor.client.orkes_clients import OrkesClients\n\nconfig = Configuration()\nclients = OrkesClients(configuration=config)\nworkflow_client = clients.get_workflow_client()\ntask_client = clients.get_task_client()\nexecutor = clients.get_workflow_executor()\n\n# Start async (returns workflow ID immediately)\nworkflow_id = executor.start_workflow(StartWorkflowRequest(name='my_workflow', input={'key': 'value'}))\n\n# Execute sync (blocks until workflow completes)\nresult = executor.execute(name='my_workflow', version=1, workflow_input={'key': 'value'})\n\n# Lifecycle management\nworkflow_client.pause_workflow(workflow_id)\nworkflow_client.resume_workflow(workflow_id)\nworkflow_client.terminate_workflow(workflow_id, reason='no longer needed')\nworkflow_client.retry_workflow(workflow_id)          # retry from last failed task\nworkflow_client.restart_workflow(workflow_id)         # restart from the beginning\nworkflow_client.rerun_workflow(workflow_id,           # rerun from a specific task\n    RerunWorkflowRequest(re_run_from_task_id=task_id))\n\n# Send a signal to a waiting workflow (complete a WAIT task externally)\ntask_client.update_task(TaskResult(\n    workflow_instance_id=workflow_id,\n    task_id=wait_task_id,\n    status='COMPLETED',\n    output_data={'approved': True}\n))\n\n# Search workflows\nresults = workflow_client.search(query='status IN (RUNNING) AND correlationId = \"order-123\"')\n```\n\nSee [examples/workflow_ops.py](examples/workflow_ops.py) for a complete walkthrough of every operation.\n\n---\n\n## AI \u0026 LLM Workflows\n\nConductor supports AI-native workflows including agentic tool calling, RAG pipelines, and multi-agent orchestration.\n\n**Agentic Workflows**\n\nBuild AI agents where LLMs dynamically select and call Python workers as tools. See [examples/agentic_workflows/](examples/agentic_workflows/) for all examples.\n\n| Example | Description |\n|---------|-------------|\n| [llm_chat.py](examples/agentic_workflows/llm_chat.py) | Automated multi-turn science Q\u0026A between two LLMs |\n| [llm_chat_human_in_loop.py](examples/agentic_workflows/llm_chat_human_in_loop.py) | Interactive chat with WAIT task pauses for user input |\n| [multiagent_chat.py](examples/agentic_workflows/multiagent_chat.py) | Multi-agent debate with moderator routing between panelists |\n| [function_calling_example.py](examples/agentic_workflows/function_calling_example.py) | LLM picks which Python function to call based on user queries |\n| [mcp_weather_agent.py](examples/agentic_workflows/mcp_weather_agent.py) | AI agent using MCP tools for weather queries |\n\n**LLM and RAG Workflows**\n\n| Example | Description |\n|---------|-------------|\n| [rag_workflow.py](examples/rag_workflow.py) | End-to-end RAG: document conversion (PDF/Word/Excel), pgvector indexing, semantic search, answer generation |\n| [vector_db_helloworld.py](examples/orkes/vector_db_helloworld.py) | Vector database operations: text indexing, embedding generation, and semantic search with Pinecone |\n\n```shell\n# Automated multi-turn chat\npython examples/agentic_workflows/llm_chat.py\n\n# Multi-agent debate\npython examples/agentic_workflows/multiagent_chat.py --topic \"renewable energy\"\n\n# RAG pipeline\npip install \"markitdown[pdf]\"\npython examples/rag_workflow.py document.pdf \"What are the key findings?\"\n```\n\n---\n\n## Why Conductor?\n\n| | |\n|---|---|\n| **Language agnostic** | Workers in Python, Java, Go, JS, C# — all in one workflow |\n| **Durable execution** | Survives crashes, retries automatically, never loses state |\n| **Built-in HTTP/Wait/JS tasks** | No code needed for common operations |\n| **Horizontal scaling** | Built at Netflix for millions of workflows |\n| **Full visibility** | UI shows every execution, every task, every retry |\n| **Sync + Async execution** | Start-and-forget OR wait-for-result |\n| **Human-in-the-loop** | WAIT tasks pause until an external signal |\n| **AI-native** | LLM chat, RAG pipelines, function calling, MCP tools built-in |\n\n---\n\n## Examples\n\nSee the [Examples Guide](examples/README.md) for the full catalog. Key examples:\n\n| Example | Description | Run |\n|---------|-------------|-----|\n| [workers_e2e.py](examples/workers_e2e.py) | End-to-end: sync + async workers, metrics | `python examples/workers_e2e.py` |\n| [kitchensink.py](examples/kitchensink.py) | All task types (HTTP, JS, JQ, Switch) | `python examples/kitchensink.py` |\n| [workflow_ops.py](examples/workflow_ops.py) | Pause, resume, terminate, retry, restart, rerun, signal | `python examples/workflow_ops.py` |\n| [task_context_example.py](examples/task_context_example.py) | Long-running tasks with TaskInProgress | `python examples/task_context_example.py` |\n| [metrics_example.py](examples/metrics_example.py) | Prometheus metrics collection | `python examples/metrics_example.py` |\n| [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` |\n| [helloworld.py](examples/helloworld/helloworld.py) | Minimal hello world | `python examples/helloworld/helloworld.py` |\n| [dynamic_workflow.py](examples/dynamic_workflow.py) | Build workflows programmatically | `python examples/dynamic_workflow.py` |\n| [test_workflows.py](examples/test_workflows.py) | Unit testing workflows | `python -m unittest examples.test_workflows` |\n\n**API Journey Examples**\n\nEnd-to-end examples covering all APIs for each domain:\n\n| Example | APIs | Run |\n|---------|------|-----|\n| [authorization_journey.py](examples/authorization_journey.py) | Authorization APIs | `python examples/authorization_journey.py` |\n| [metadata_journey.py](examples/metadata_journey.py) | Metadata APIs | `python examples/metadata_journey.py` |\n| [schedule_journey.py](examples/schedule_journey.py) | Schedule APIs | `python examples/schedule_journey.py` |\n| [prompt_journey.py](examples/prompt_journey.py) | Prompt APIs | `python examples/prompt_journey.py` |\n\n## Documentation\n\n| Document | Description |\n|----------|-------------|\n| [Worker Design](docs/design/WORKER_DESIGN.md) | Architecture: AsyncTaskRunner vs TaskRunner, discovery, lifecycle |\n| [Worker Guide](docs/WORKER.md) | All worker patterns (function, class, annotation, async) |\n| [Worker Configuration](WORKER_CONFIGURATION.md) | Hierarchical environment variable configuration |\n| [Workflow Management](docs/WORKFLOW.md) | Start, pause, resume, terminate, retry, search |\n| [Workflow Testing](docs/WORKFLOW_TESTING.md) | Unit testing with mock outputs |\n| [Task Management](docs/TASK_MANAGEMENT.md) | Task operations |\n| [Metadata](docs/METADATA.md) | Task \u0026 workflow definitions |\n| [Authorization](docs/AUTHORIZATION.md) | Users, groups, applications, permissions |\n| [Schedules](docs/SCHEDULE.md) | Workflow scheduling |\n| [Secrets](docs/SECRET_MANAGEMENT.md) | Secret storage |\n| [Prompts](docs/PROMPT.md) | AI/LLM prompt templates |\n| [Integrations](docs/INTEGRATION.md) | AI/LLM provider integrations |\n| [Metrics](METRICS.md) | Prometheus metrics collection |\n| [Examples](examples/README.md) | Complete examples catalog |\n\n## Frequently Asked Questions\n\n**Is this the same as Netflix Conductor?**\n\nYes. Conductor OSS is the continuation of the original [Netflix Conductor](https://github.com/Netflix/conductor) repository after Netflix contributed the project to the open-source foundation.\n\n**Is this project actively maintained?**\n\nYes. [Orkes](https://orkes.io) is the primary maintainer and offers an enterprise SaaS platform for Conductor across all major cloud providers.\n\n**Can Conductor scale to handle my workload?**\n\nConductor was built at Netflix to handle massive scale and has been battle-tested in production environments processing millions of workflows. It scales horizontally to meet virtually any demand.\n\n**Does Conductor support durable code execution?**\n\nYes. Conductor ensures workflows complete reliably even in the face of infrastructure failures, process crashes, or network issues.\n\n**Are workflows always asynchronous?**\n\nNo. While Conductor excels at asynchronous orchestration, it also supports synchronous workflow execution when immediate results are required.\n\n**Do I need to use a Conductor-specific framework?**\n\nNo. 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.\n\n**Can I mix workers written in different languages?**\n\nYes. A single workflow can have workers written in Python, Java, Go, or any other supported language. Workers communicate through the Conductor server, not directly with each other.\n\n**What Python versions are supported?**\n\nPython 3.9 and above.\n\n**Should I use `def` or `async def` for my workers?**\n\nUse `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.\n\n**How do I run workers in production?**\n\nWorkers 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.\n\n**How do I test workflows without running a full Conductor server?**\n\nThe 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.\n\n## Support\n\n- [Open an issue (SDK)](https://github.com/conductor-sdk/conductor-python/issues) for SDK bugs, questions, and feature requests\n- [Open an issue (Conductor server)](https://github.com/conductor-oss/conductor/issues) for Conductor OSS server issues\n- [Join the Conductor Slack](https://join.slack.com/t/orkes-conductor/shared_invite/zt-2vdbx239s-Eacdyqya9giNLHfrCavfaA) for community discussion and help\n- [Orkes Community Forum](https://community.orkes.io/) for Q\u0026A\n\n## License\n\nApache 2.0\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fconductor-oss%2Fpython-sdk","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fconductor-oss%2Fpython-sdk","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fconductor-oss%2Fpython-sdk/lists"}