Skip to content

unionai-oss/flyte-attendant

Repository files navigation

Flyte Attendant

A helpful steward on your Flyte

flyte-attendant is a tool that you can deploy to help answer your questions about Flyte, an open source workflow orchestrator for data, machine learning, and analytics.

Setup

Create a virtual environment using virtualenv:

python -m venv ~/venvs/flyte-attendant
source ~/venvs/flyte-attendant/bin/activate

Install dependencies

pip install -r requirements.txt

Get an OpenAI API key here and add it to a secrets.txt file in the root of this repo:

OPENAI_API_KEY="..."

Then, export it with:

export $(grep -v '^#' secrets.txt | xargs)

Usage

Plain Python

Call the script:

python flyte_attendant/run.py "Can you explain what a Flyte workflow is at a high level?"

Running Locally with Flyte

pyflyte run flyte_attendant/workflows/chat_support.py ask \
    --question "Can you explain what a Flyte workflow is at a high level?"

Deploying on Flyte

Docker build and push:

./docker_build.sh
docker login ghcr.io
docker push <tag>

Set the config you're using to access the Union Cloud cluster:

export FLYTECTL_CONFIG=<config-file>

Create a new project (do this once):

flytectl --config $FLYTECTL_CONFIG create project \
    --id "flyte-attendant" \
    --labels "my-label=flyte-attendant" \
    --description "Flyte Attendant Chat Bot" \
    --name "flyte-attendant"

Register to a Flyte cluster:

pyflyte --config $FLYTECTL_CONFIG \
    register flyte_attendant \
    --project flytesnacks \
    --domain development \
    --image ghcr.io/unionai-oss/flyte-attendant:latest

Define a secret on the Flyte cluster:

kubectl create secret \
    -n flytesnacks-development \
    generic openai-api-key \
    --from-literal=OPENAI_API_SECRET='<SECRET>'

Run the workflow:

python scripts/ask_remote.py \
    --config-file $FLYTECTL_CONFIG \
    --project flyte-attendant \
    "Can you explain what a Flyte workflow is at a high level?"

Deploying on Union Cloud

Install uctl in your $HOME directory:

cd $HOME
curl -sL https://raw.githubusercontent.com/unionai/uctl/main/install.sh | bash

Initialize the config file:

cd <path/to/flyte-attendant/repo>
~/bin/uctl config init --host <host_url>

Set the config you're using to access the Union Cloud cluster:

export UCTL_CONFIG=<config-file>

Create a new project (do this once):

~/bin/uctl --config $UCTL_CONFIG create project \
    --id "flyte-attendant" \
    --labels "my-label=flyte-attendant" \
    --description "Flyte Attendant Chat Bot" \
    --name "flyte-attendant"

Define a secret on AWS via the AWS Secrets Manager. Make sure to use plaintext secrets with only the secret value itself. This will create a secret ARN in the following format:

arn:aws:secretsmanager:<region>:<account_number>:secret:<secret_name>-<six_random_characters>

In the flyte_attendant/workflows/chat_support.py script, replace the SECRET_GROUP and SECRET_KEY global variables with the following:

SECRET_GROUP = "arn:aws:secretsmanager:<region>:<account_number>:secret:"
SECRET_KEY = "<secret_name>-<six_random_characters>"

Register the workflow:

pyflyte --config $UCTL_CONFIG \
    register flyte_attendant \
    --project flyte-attendant \
    --domain development \
    --image ghcr.io/unionai-oss/flyte-attendant:latest

Then, run:

python scripts/ask_remote.py \
    --config-file $UCTL_CONFIG \
    --project flyte-attendant \
    "Can you explain what a Flyte workflow is at a high level?"

Creating an App

In Union Cloud, an app allows you to authenticate to the cluster with a secret key. We'll use the app.yaml file defined in the root of this repo to create an app:

~/bin/uctl create app --config $UCTL_CONFIG --appSpecFile app.yaml

You should see a client NAME and SECRET associated with the app. Store the SECRET value somewhere secure: this will be the last time you'll have access to it.

export UNIONAI_APP_CLIENT_SECRET='<SECRET_VALUE>'

Run the streamlit app:

streamlit run app/ask_app.py