{"id":13565955,"url":"https://github.com/couler-proj/couler","last_synced_at":"2026-01-14T14:17:53.896Z","repository":{"id":40274937,"uuid":"288523518","full_name":"couler-proj/couler","owner":"couler-proj","description":"Unified Interface for Constructing and Managing Workflows on different workflow engines, such as Argo Workflows, Tekton Pipelines, and Apache Airflow.","archived":false,"fork":false,"pushed_at":"2024-10-08T03:31:54.000Z","size":3313,"stargazers_count":933,"open_issues_count":21,"forks_count":86,"subscribers_count":22,"default_branch":"master","last_synced_at":"2025-04-03T23:33:06.826Z","etag":null,"topics":["apache-airflow","argo-workflows","cloud-native","distributed-computing","kubeflow","kubernetes","machine-learning","python","scheduler","tekton-pipelines","unified-api","unified-interface","workflow-automation","workflow-engine","workflow-management"],"latest_commit_sha":null,"homepage":"https://couler-proj.github.io/couler/index.html","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/couler-proj.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":"AUTHORS","dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-08-18T17:41:29.000Z","updated_at":"2025-04-03T11:09:03.000Z","dependencies_parsed_at":"2022-06-27T12:33:47.632Z","dependency_job_id":"65663591-84d7-4fb2-b232-8604e5da290e","html_url":"https://github.com/couler-proj/couler","commit_stats":{"total_commits":196,"total_committers":38,"mean_commits":5.157894736842105,"dds":"0.40306122448979587","last_synced_commit":"44fc694bfd2b84a42bd6ba3355649860bef6ebcd"},"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/couler-proj/couler","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/couler-proj%2Fcouler","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/couler-proj%2Fcouler/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/couler-proj%2Fcouler/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/couler-proj%2Fcouler/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/couler-proj","download_url":"https://codeload.github.com/couler-proj/couler/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/couler-proj%2Fcouler/sbom","scorecard":{"id":306007,"data":{"date":"2025-08-11","repo":{"name":"github.com/couler-proj/couler","commit":"5c437c2f1552656b68dec1e4b562b57b027efe25"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.6,"checks":[{"name":"Code-Review","score":8,"reason":"Found 25/29 approved changesets -- score normalized to 8","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Security-Policy","score":10,"reason":"security policy file detected","details":["Info: security policy file detected: SECURITY.md:1","Info: Found linked content: SECURITY.md:1","Info: Found disclosure, vulnerability, and/or timelines in security policy: SECURITY.md:1","Info: Found text in security policy: SECURITY.md:1"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/build.yml:1","Warn: no topLevel permission defined: .github/workflows/docs.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":2,"reason":"dependency not pinned by hash detected -- score normalized to 2","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/couler-proj/couler/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/couler-proj/couler/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:26: update your workflow using https://app.stepsecurity.io/secureworkflow/couler-proj/couler/build.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/build.yml:37: update your workflow using https://app.stepsecurity.io/secureworkflow/couler-proj/couler/build.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/build.yml:55: update your workflow using https://app.stepsecurity.io/secureworkflow/couler-proj/couler/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/docs.yml:10: update your workflow using https://app.stepsecurity.io/secureworkflow/couler-proj/couler/docs.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/docs.yml:11: update your workflow using https://app.stepsecurity.io/secureworkflow/couler-proj/couler/docs.yml/master?enable=pin","Warn: pipCommand not pinned by hash: .github/workflows/build.yml:31","Warn: pipCommand not pinned by hash: .github/workflows/build.yml:32","Warn: goCommand not pinned by hash: .github/workflows/build.yml:34","Warn: pipCommand not pinned by hash: .github/workflows/docs.yml:15","Info:   0 out of   5 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   2 third-party GitHubAction dependencies pinned","Info:   2 out of   3 goCommand dependencies pinned","Info:   0 out of   3 pipCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":5,"reason":"badge detected: Passing","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 26 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":0,"reason":"28 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GO-2022-0236 / GHSA-h86h-8ppg-mxmh","Warn: Project is vulnerable to: GO-2021-0238 / GHSA-83g2-8m93-v3w7","Warn: Project is vulnerable to: GO-2022-0288","Warn: Project is vulnerable to: GO-2022-0969 / GHSA-69cg-p879-7622","Warn: Project is vulnerable to: GO-2022-1144 / GHSA-xrjj-mj9h-534m","Warn: Project is vulnerable to: GO-2023-1571 / GHSA-vvpx-j8f3-3w6h","Warn: Project is vulnerable to: GO-2023-1988 / GHSA-2wrh-6pvc-2jm9","Warn: Project is vulnerable to: GO-2023-2102 / GHSA-4374-p667-p6c8","Warn: Project is vulnerable to: GHSA-qppj-fm5r-hxr3","Warn: Project is vulnerable to: GO-2024-2687 / GHSA-4v7x-pqxf-cx7m","Warn: Project is vulnerable to: GO-2024-3333","Warn: Project is vulnerable to: GO-2025-3503 / GHSA-qxp5-gwg8-xv66","Warn: Project is vulnerable to: GO-2025-3595 / GHSA-vvgc-356p-c3xw","Warn: Project is vulnerable to: GO-2022-0493 / GHSA-p782-xgp4-8hr8","Warn: Project is vulnerable to: GO-2021-0113 / GHSA-ppp9-7jff-5vj2","Warn: Project is vulnerable to: GO-2022-1059 / GHSA-69ch-w2m2-3vjp","Warn: Project is vulnerable to: GO-2024-2611 / GHSA-8r3f-844c-mc37","Warn: Project is vulnerable to: GO-2024-2748 / GHSA-33c5-9fx5-fvjm","Warn: Project is vulnerable to: GO-2021-0064 / GHSA-8cfg-vx93-jvxw","Warn: Project is vulnerable to: GHSA-cpwx-vrp4-4pq7","Warn: Project is vulnerable to: GHSA-gmj6-6f8f-6699","Warn: Project is vulnerable to: GHSA-h5c8-rqwp-cp95","Warn: Project is vulnerable to: GHSA-h75v-3vvj-5mfj","Warn: Project is vulnerable to: GHSA-q2x7-8rv6-6q7h","Warn: Project is vulnerable to: PYSEC-2022-48 / GHSA-77rm-9x9h-xj3g","Warn: Project is vulnerable to: GHSA-8gq9-2x98-w8hf","Warn: Project is vulnerable to: GHSA-8qvm-5x2c-j2w7","Warn: Project is vulnerable to: PYSEC-2017-65 / GHSA-jwvw-v7c5-m82h"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-17T22:04:06.445Z","repository_id":40274937,"created_at":"2025-08-17T22:04:06.445Z","updated_at":"2025-08-17T22:04:06.445Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28422571,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-14T13:30:50.153Z","status":"ssl_error","status_checked_at":"2026-01-14T13:29:08.907Z","response_time":107,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: 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":["apache-airflow","argo-workflows","cloud-native","distributed-computing","kubeflow","kubernetes","machine-learning","python","scheduler","tekton-pipelines","unified-api","unified-interface","workflow-automation","workflow-engine","workflow-management"],"created_at":"2024-08-01T13:01:58.821Z","updated_at":"2026-01-14T14:17:53.876Z","avatar_url":"https://github.com/couler-proj.png","language":"Python","funding_links":[],"categories":["Uncategorized","Python","Data Pipeline ETL Frameworks","Ecosystem Projects","Data Pipeline","Workflows","Continuous Delivery \u0026 GitOps","Building","Full fledged product","kubernetes","Workflow Tools"],"sub_categories":["Uncategorized","General-Purpose Machine Learning","Workflows"],"readme":"# Couler\n\n## What is Couler?\n\n* Couler is a system designed for unified machine learning workflow optimization in the cloud. Couler endeavors to provide a unified interface for constructing and optimizing workflows across various workflow engines, such as [Argo Workflows](https://github.com/argoproj/argo-workflows), [Tekton Pipelines](https://tekton.dev/), and [Apache Airflow](https://airflow.apache.org/). Couler enhances workflow efficiency through features like Autonomous Workflow Construction, Automatic Artifact Caching Mechanisms, Big Workflow Auto Parallelism Optimization, and Automatic Hyperparameters Tuning.\n* Couler is included in [CNCF Cloud Native Landscape](https://landscape.cncf.io/) and [LF AI Landscape](https://landscape.lfai.foundation).\n* Check out our technical report published on ICDE 2024 [here](https://arxiv.org/abs/2403.07608).\n\n\u003e Note that while one of ambitious goals of Couler is to support multiple workflow engines, Couler currently only supports Argo Workflows as the workflow orchestration backend. An ambitious goal of Couler is to provide support for multiple workflow engines. While it initially supported only Argo Workflows for workflow orchestration, we are actively working on enhancing our support for Airflow and the current system supports about 40-50% of the Airflow API.\n\u003e In addition, if you are looking for a Python SDK that provides access to all the available features from Argo Workflows, you might want to check out [the low-level Python SDK maintained by the Argo Workflows team](https://argoproj.github.io/argo-workflows/client-libraries/).\n\n\n## Who uses Couler?\n\nYou can find a list of organizations who are using Couler in [ADOPTERS.md](ADOPTERS.md). If you'd like to add your organization to the list, please send us a pull request.\n\n## Why use Couler?\n\nMany workflow engines exist nowadays, e.g. [Argo Workflows](https://github.com/argoproj/argo-workflows), [Tekton Pipelines](https://tekton.dev/), and [Apache Airflow](https://airflow.apache.org/).\nHowever, their programming experience varies and they have different level of abstractions\nthat are often obscure and complex. The code snippets below are some examples for constructing workflows\nusing Apache Airflow and [Kubeflow Pipelines](https://github.com/kubeflow/pipelines/).\n\n\u003ctable\u003e\n\u003ctr\u003e\u003cth\u003eApache Airflow\u003c/th\u003e\u003cth\u003eKubeflow Pipelines\u003c/th\u003e\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd valign=\"top\"\u003e\u003cp\u003e\n\n```python\ndef create_dag(dag_id,\n               schedule,\n               dag_number,\n               default_args):\n    def hello_world_py(*args):\n        print('Hello World')\n\n    dag = DAG(dag_id,\n              schedule_interval=schedule,\n              default_args=default_args)\n    with dag:\n        t1 = PythonOperator(\n            task_id='hello_world',\n            python_callable=hello_world_py,\n            dag_number=dag_number)\n    return dag\n\nfor n in range(1, 10):\n    default_args = {'owner': 'airflow',\n                    'start_date': datetime(2018, 1, 1)\n                    }\n    globals()[dag_id] = create_dag(\n        'hello_world_{}'.format(str(n)),\n        '@daily',\n        n,\n        default_args)\n```\n\n\u003c/p\u003e\u003c/td\u003e\n\u003ctd valign=\"top\"\u003e\u003cp\u003e\n\n```python\nclass FlipCoinOp(dsl.ContainerOp):\n    \"\"\"Flip a coin and output heads or tails randomly.\"\"\"\n    def __init__(self):\n        super(FlipCoinOp, self).__init__(\n            name='Flip',\n            image='python:alpine3.6',\n            command=['sh', '-c'],\n            arguments=['python -c \"import random; result = \\'heads\\' if random.randint(0,1) == 0 '\n                       'else \\'tails\\'; print(result)\" | tee /tmp/output'],\n            file_outputs={'output': '/tmp/output'})\n\nclass PrintOp(dsl.ContainerOp):\n    \"\"\"Print a message.\"\"\"\n    def __init__(self, msg):\n        super(PrintOp, self).__init__(\n            name='Print',\n            image='alpine:3.6',\n            command=['echo', msg],\n        )\n\n# define the recursive operation\n@graph_component\ndef flip_component(flip_result):\n    print_flip = PrintOp(flip_result)\n    flipA = FlipCoinOp().after(print_flip)\n    with dsl.Condition(flipA.output == 'heads'):\n        flip_component(flipA.output)\n\n@dsl.pipeline(\n    name='pipeline flip coin',\n    description='shows how to use graph_component.'\n)\ndef recursive():\n    flipA = FlipCoinOp()\n    flipB = FlipCoinOp()\n    flip_loop = flip_component(flipA.output)\n    flip_loop.after(flipB)\n    PrintOp('cool, it is over. %s' % flipA.output).after(flip_loop)\n```\n\n\u003c/p\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/table\u003e\n\nCouler is a system for unified Mechine Learning (ML) workflow optimization in cloud and the contributions are outlined below::\n\n* Simplicity and Extensibility: Couler provides a unified programming interface for workflow definition, ensuring independence from the workflow engine and compatibility with various workflow engines such as Argo Workflows, Airflow, and Tekton. \n* Automation: Couler integrates LLMs in unified programming code generation. By leveraging LLMs, Couler facilitates the generation of unified programming code using NL descriptions. Additionally, we automate hyperparameters tuning through the integration of Dataset Card and Model Card, enhancing the effectiveness of the autoML process.\n* Efficiency: Couler introduces the Intermediate Representative (IR) to depict the workflow Directed Acyclic Graph (DAG), optimizing extensive workflow computations by dividing a large workflow into smaller ones for auto-parallelism optimization. Couler also implements dynamic caching of artifacts, which are the outputs of jobs in the workflow, to minimize redundant computations and ensure fault tolerance.\n* Open Source Community: The released open-source version of Couler has garnered adoption from multiple companies and end-users. For instance, over 3000 end users are utilizing Couler within Ant Group, and more than 20 companies have adopted Couler as their default workflow engine interface.\n\nPlease see the following sections for installation guide and examples.\n\n## Installation\n\n* Couler currently only supports Argo Workflows. Please see instructions [here](https://argoproj.github.io/argo-workflows/quick-start/#install-argo-workflows)\nto install Argo Workflows on your Kubernetes cluster.\n* Install Python 3.6+\n* Install Couler Python SDK via the following command:\n\n```bash\npython3 -m pip install git+https://github.com/couler-proj/couler --ignore-installed\n```\nAlternatively, you can clone this repository and then run the following to install:\n\n```bash\npython setup.py install\n```\n\n## Try Couler with Argo Workflows\n\nClick [here](https://katacoda.com/argoproj/courses/argo-workflows/python) to launch the interactive Katacoda environment and learn how to write and submit your first Argo workflow using Couler Python SDK in your browser!\n\n## Examples\n\n### Coin Flip\n\nThis example combines the use of a Python function result, along with conditionals,\nto take a dynamic path in the workflow. In this example, depending on the result\nof the first step defined in `flip_coin()`, the template will either run the\n`heads()` step or the `tails()` step.\n\nSteps can be defined via either `couler.run_script()`\nfor Python functions or `couler.run_container()` for containers. In addition,\nthe conditional logic to decide whether to flip the coin in this example\nis defined via the combined use of `couler.when()` and `couler.equal()`.\n\n```python\nimport couler.argo as couler\nfrom couler.argo_submitter import ArgoSubmitter\n\n\ndef random_code():\n    import random\n\n    res = \"heads\" if random.randint(0, 1) == 0 else \"tails\"\n    print(res)\n\n\ndef flip_coin():\n    return couler.run_script(image=\"python:alpine3.6\", source=random_code)\n\n\ndef heads():\n    return couler.run_container(\n        image=\"alpine:3.6\", command=[\"sh\", \"-c\", 'echo \"it was heads\"']\n    )\n\n\ndef tails():\n    return couler.run_container(\n        image=\"alpine:3.6\", command=[\"sh\", \"-c\", 'echo \"it was tails\"']\n    )\n\n\nresult = flip_coin()\ncouler.when(couler.equal(result, \"heads\"), lambda: heads())\ncouler.when(couler.equal(result, \"tails\"), lambda: tails())\n\nsubmitter = ArgoSubmitter()\ncouler.run(submitter=submitter)\n```\n\n### DAG\n\nThis example demonstrates different ways to define the workflow as a directed-acyclic graph (DAG) by specifying the\ndependencies of each task via `couler.set_dependencies()` and `couler.dag()`. Please see the code comments for the\nspecific shape of DAG that we've defined in `linear()` and `diamond()`.\n\n```python\nimport couler.argo as couler\nfrom couler.argo_submitter import ArgoSubmitter\n\n\ndef job(name):\n    couler.run_container(\n        image=\"docker/whalesay:latest\",\n        command=[\"cowsay\"],\n        args=[name],\n        step_name=name,\n    )\n\n\n#     A\n#    / \\\n#   B   C\n#  /\n# D\ndef linear():\n    couler.set_dependencies(lambda: job(name=\"A\"), dependencies=None)\n    couler.set_dependencies(lambda: job(name=\"B\"), dependencies=[\"A\"])\n    couler.set_dependencies(lambda: job(name=\"C\"), dependencies=[\"A\"])\n    couler.set_dependencies(lambda: job(name=\"D\"), dependencies=[\"B\"])\n\n#   A\n#  / \\\n# B   C\n#  \\ /\n#   D\ndef diamond():\n    couler.dag(\n        [\n            [lambda: job(name=\"A\")],\n            [lambda: job(name=\"A\"), lambda: job(name=\"B\")],  # A -\u003e B\n            [lambda: job(name=\"A\"), lambda: job(name=\"C\")],  # A -\u003e C\n            [lambda: job(name=\"B\"), lambda: job(name=\"D\")],  # B -\u003e D\n            [lambda: job(name=\"C\"), lambda: job(name=\"D\")],  # C -\u003e D\n        ]\n    )\n\n\nlinear()\nsubmitter = ArgoSubmitter()\ncouler.run(submitter=submitter)\n```\n\nNote that the current version only works with Argo Workflows but we are actively working on the design of the unified\ninterface that is extensible to additional workflow engines. Please stay tuned for more updates and we welcome\nany feedback and contributions from the community.\n\n## Community Blogs and Presentations\n\n* [Introducing Couler: Unified Interface for Constructing and Managing Workflows, Argo Workflows Community Meeting](https://docs.google.com/presentation/d/11KVEkKQGeV3R_-nHdqlzQV2uOrya94ra6Ilm_k6RwE4/edit?usp=sharing)\n* [Authoring and Submitting Argo Workflows using Python](https://blog.argoproj.io/authoring-and-submitting-argo-workflows-using-python-aff9a070d95f)\n\n## Citation\n\nPlease cite the repo if you use the code in this repo.\n```bibtex\n@misc{Couler,\n  author = {Xiaoda Wang, Yuan Tang, Tengda Guo, Bo Sang, Jingji Wu, Jian Sha, Ke Zhang, Jiang Qian, Mingjie Tang},\n  title = {Couler: Unified Machine Learning Workflow Optimization in Cloud},\n  year = {2024},\n  publisher = {40th IEEE International Conference on Data Engineering},\n  howpublished = {\\url{https://arxiv.org/abs/2403.07608}}.\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcouler-proj%2Fcouler","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcouler-proj%2Fcouler","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcouler-proj%2Fcouler/lists"}