base on Rill Flow is a high-performance, scalable workflow orchestration engine for distributed workloads and LLMs # Rill Flow [![License](https://img.shields.io/badge/license-Apache%202-4EB1BA.svg)](https://www.apache.org/licenses/LICENSE-2.0.html) ![codecov](https://codecov.io/gh/weibocom/rill-flow/branch/main/graph/badge.svg) [![CN doc](https://img.shields.io/badge/document-中文-blue.svg)](README_zh_CN.md) ## Overview Rill Flow is a high-performance, scalable distributed workflow orchestration service with the following core features: - High performance: Supports the execution of tens of millions of tasks per day, with task execution latency less than 100ms - Distributed: Supports the orchestration and scheduling of heterogeneous distributed systems - Ease to use: supports visual process orchestration and plug-in access - Cloud native: Supports cloud native container deployment and cloud native function orchestration - AIGC: supports rapid integration of LLM model services ## Demo [Live Demo](https://rill-flow.cloud) (sandbox/sandbox) ## QuickStart ### Environment Preparation Before you begin, ensure that the following tools are installed: - Environment suitable for OSX/Linux - [Docker](https://docs.docker.com/engine/install/) - [Docker-Compose](https://docs.docker.com/compose/install/) ### Service Deployment Install Rill Flow services on your local environment using Docker-Compose: #### Download the Rill-Flow source code. ```shell git clone https://github.com/weibocom/rill-flow.git ``` #### Start the service. Enter the Docker directory of the Rill-Flow source code and execute the one-click start command: ```shell cd rill-flow/docker docker-compose up -d ``` > If your system has Docker Compose V2 installed instead of V1, please use docker compose instead of docker-compose. Check if this is the case by running docker compose version. Read more information [here](https://docs.docker.com/compose/#compose-v2-and-the-new-docker-compose-command). ### Verify the installation. To check the status of Rill Flow, please execute the following command: ```shell docker-compose ps ``` Here is the expected output: ```txt Name Command State Ports ------------------------------------------------------------------------------------------------------------------------------------------------------------ rill-flow-mysql docker-entrypoint.sh --bin ... Up 0.0.0.0:3306->3306/tcp, 33060/tcp rillflow_cache_1 docker-entrypoint.sh redis ... Up 6379/tcp rillflow_jaeger_1 /go/bin/all-in-one-linux Up 14250/tcp, 14268/tcp, 0.0.0.0:16686->16686/tcp, 5775/udp, 5778/tcp, 6831/udp, 6832/udp rillflow_rill-flow_1 catalina.sh run Up 0.0.0.0:8080->8080/tcp rillflow_sample-executor_1 uvicorn main:app --host 0. ... Up rillflow_ui_1 /docker-entrypoint.sh /bin ... Up 0.0.0.0:80->80/tcp ``` If your actual output matches the expected output, it means that Rill Flow has been successfully installed. ### Access the Rill Flow administration background After the command is successfully executed, you can access the Rill Flow management background at http://localhost (admin/admin). If the server is deployed, use the server IP address for access (port 80 by default). ### Execution Example - Step 1: Open the Rill Flow management background, click the 'Flow Definition' menu, enter the 'Flow Definition List' page, click the 'Create' button - Step 2: After entering the 'Flow Graph Edit' page, open the 'one-click import' switch, copy the following yaml file content into the text box, click the 'Submit' button, you can submit a simple flowchart. ```yaml version: 1.0.0 workspace: rillFlowSimple dagName: greet alias: release type: flow inputSchema: >- [{"required":true,"name":"Bob","type":"String"},{"required":true,"name":"Alice","type":"String"}] tasks: - category: function name: Bob resourceName: http://sample-executor:8000/greet.json?user=Bob pattern: task_sync tolerance: false next: Alice inputMappings: - source: "$.context.Bob" target: "$.input.Bob" - category: function name: Alice resourceName: http://sample-executor:8000/greet.json?user=Alice pattern: task_sync tolerance: false inputMappings: - source: "$.context.Alice" target: "$.input.Alice" ``` - Step 3: Submit the flow graph to execute the task Click the 'Test' button, fill in the required parameters, and click the 'Submit' button. - Step 4: Viewing the execution Result Click the 'Submit' button in the previous step and you will automatically jump to the execution details page. You can view the execution status and details by clicking the 'Execution Records' button. > More instructions on viewing results can be found in [Execution Status](../user-guide/04-execution/03-status.md) ![preview](https://rill-flow.github.io/img/flow_sample.jpg) ## Document - [Document](https://rill-flow.github.io/en/docs/intro) - [中文文档](https://rill-flow.github.io/docs/intro) ## Contributors The following are contributors to the project along with their GitHub links: - axb ([@qdaxb](https://github.com/qdaxb)) *Maintainer* - techlog ([@techloghub](https://github.com/techloghub)) *Maintainer* - ch15084 ([@ch15084](https://github.com/ch15084)) *Maintainer* - Ocean ([@hhh041](https://github.com/hhh041)) - xilong-t ([@xilong-t](https://github.com/xilong-t)) - qfl ([@qiaofenlin](https://github.com/qiaofenlin)) - Kylen ([@Kylen](https://github.com/Kylen0714)) - zzfzzf ([@zzfzzf](https://github.com/zzfzzf)) - feifei ([@feifei325](https://github.com/feifei325)) - moqimoqidea ([@moqimoqidea](https://github.com/moqimoqidea)) - Guo, Jiansheng ([@guojiansheng0925](https://github.com/guojiansheng0925)) ## License Rill Flow is an open-source project under the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ", Assign "at most 3 tags" to the expected json: {"id":"5512","tags":[]} "only from the tags list I provide: [{"id":77,"name":"3d"},{"id":89,"name":"agent"},{"id":17,"name":"ai"},{"id":54,"name":"algorithm"},{"id":24,"name":"api"},{"id":44,"name":"authentication"},{"id":3,"name":"aws"},{"id":27,"name":"backend"},{"id":60,"name":"benchmark"},{"id":72,"name":"best-practices"},{"id":39,"name":"bitcoin"},{"id":37,"name":"blockchain"},{"id":1,"name":"blog"},{"id":45,"name":"bundler"},{"id":58,"name":"cache"},{"id":21,"name":"chat"},{"id":49,"name":"cicd"},{"id":4,"name":"cli"},{"id":64,"name":"cloud-native"},{"id":48,"name":"cms"},{"id":61,"name":"compiler"},{"id":68,"name":"containerization"},{"id":92,"name":"crm"},{"id":34,"name":"data"},{"id":47,"name":"database"},{"id":8,"name":"declarative-gui "},{"id":9,"name":"deploy-tool"},{"id":53,"name":"desktop-app"},{"id":6,"name":"dev-exp-lib"},{"id":59,"name":"dev-tool"},{"id":13,"name":"ecommerce"},{"id":26,"name":"editor"},{"id":66,"name":"emulator"},{"id":62,"name":"filesystem"},{"id":80,"name":"finance"},{"id":15,"name":"firmware"},{"id":73,"name":"for-fun"},{"id":2,"name":"framework"},{"id":11,"name":"frontend"},{"id":22,"name":"game"},{"id":81,"name":"game-engine "},{"id":23,"name":"graphql"},{"id":84,"name":"gui"},{"id":91,"name":"http"},{"id":5,"name":"http-client"},{"id":51,"name":"iac"},{"id":30,"name":"ide"},{"id":78,"name":"iot"},{"id":40,"name":"json"},{"id":83,"name":"julian"},{"id":38,"name":"k8s"},{"id":31,"name":"language"},{"id":10,"name":"learning-resource"},{"id":33,"name":"lib"},{"id":41,"name":"linter"},{"id":28,"name":"lms"},{"id":16,"name":"logging"},{"id":76,"name":"low-code"},{"id":90,"name":"message-queue"},{"id":42,"name":"mobile-app"},{"id":18,"name":"monitoring"},{"id":36,"name":"networking"},{"id":7,"name":"node-version"},{"id":55,"name":"nosql"},{"id":57,"name":"observability"},{"id":46,"name":"orm"},{"id":52,"name":"os"},{"id":14,"name":"parser"},{"id":74,"name":"react"},{"id":82,"name":"real-time"},{"id":56,"name":"robot"},{"id":65,"name":"runtime"},{"id":32,"name":"sdk"},{"id":71,"name":"search"},{"id":63,"name":"secrets"},{"id":25,"name":"security"},{"id":85,"name":"server"},{"id":86,"name":"serverless"},{"id":70,"name":"storage"},{"id":75,"name":"system-design"},{"id":79,"name":"terminal"},{"id":29,"name":"testing"},{"id":12,"name":"ui"},{"id":50,"name":"ux"},{"id":88,"name":"video"},{"id":20,"name":"web-app"},{"id":35,"name":"web-server"},{"id":43,"name":"webassembly"},{"id":69,"name":"workflow"},{"id":87,"name":"yaml"}]" returns me the "expected json"