From c315abcde23d7b7ea875fdc457d44fbd51928f47 Mon Sep 17 00:00:00 2001 From: Robert Wilkins III <1147229+genome21@users.noreply.github.com> Date: Tue, 18 Apr 2023 03:07:05 +0000 Subject: [PATCH 01/50] Add steps to provision GCP VM serving langflow --- GCP-SETUP.md | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 GCP-SETUP.md diff --git a/GCP-SETUP.md b/GCP-SETUP.md new file mode 100644 index 000000000..ba6d61404 --- /dev/null +++ b/GCP-SETUP.md @@ -0,0 +1,90 @@ +# Running Langflow from a new GCP project +## Run the following in your GCP cloudshell: + +```bash + +VM_NAME="langflow-dev" +IMAGE_FAMILY="debian-11" +IMAGE_PROJECT="debian-cloud" +BOOT_DISK_SIZE="100GB" +ZONE="us-central1-a" +REGION="us-central1" +VPC_NAME="default" +SUBNET_NAME="default" +NAT_GATEWAY_NAME="nat-gateway" +CLOUD_ROUTER_NAME="nat-client" + +gcloud config set compute/region $REGION + +# Verify the VPC and subnet exist +vpc_exists=$(gcloud compute networks list --filter="name=$VPC_NAME" --format="value(name)") +subnet_exists=$(gcloud compute networks subnets list --filter="name=$SUBNET_NAME AND region=$REGION" --format="value(name)") + +if [[ -z "$vpc_exists" || -z "$subnet_exists" ]]; then + echo "Error: VPC '$VPC_NAME' and/or subnet '$SUBNET_NAME' do not exist in region '$REGION'." + exit 1 +fi + +# Create the Cloud Router and NAT Gateway +gcloud compute routers create $CLOUD_ROUTER_NAME \ + --network $VPC_NAME \ + --region $REGION + +gcloud compute routers nats create $NAT_GATEWAY_NAME \ + --router $CLOUD_ROUTER_NAME \ + --auto-allocate-nat-external-ips \ + --nat-all-subnet-ip-ranges \ + --enable-logging \ + --region $REGION + +# Define the startup script as a multiline Bash here-doc +STARTUP_SCRIPT=$(cat <<'EOF' +#!/bin/bash + +apt update +apt upgrade +apt install python3-pip +pip install langflow +apt-get install nginx +touch /etc/nginx/sites-available/langflow-app +echo "server { + listen 0.0.0.0:7860; + + location / { + proxy_pass http://127.0.0.1:7860; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } +}" >> /etc/nginx/sites-available/langflow-app +ln -s /etc/nginx/sites-available/my-app /etc/nginx/sites-enabled/ +sudo nginx -t +sudo systemctl restart nginx +langflow +EOF +) + +# Create a temporary file to store the startup script +tempfile=$(mktemp) +echo "$STARTUP_SCRIPT" > $tempfile + +gcloud compute instances create $VM_NAME \ + --image-family $IMAGE_FAMILY \ + --image-project $IMAGE_PROJECT \ + --boot-disk-size $BOOT_DISK_SIZE \ + --metadata-from-file startup-script=$tempfile \ + --zone $ZONE \ + --network $VPC_NAME \ + --subnet $SUBNET_NAME + +# Remove the temporary file after the VM is created +rm $tempfile + +``` + +## Connecting to your new Langflow VM +1. Navigate to the [VM instances](https://console.cloud.google.com/compute/instances) page +2. Click on the external IP for your VM +3. Add port 8080 (assuming your VM external IP is 192.168.0.1): +http://192.168.0.1:8080 +4. You will be greeted by the Langflow Dev environment \ No newline at end of file From c7bf4f80dfc1a1d118e8440c301da8641896c09b Mon Sep 17 00:00:00 2001 From: Robert Wilkins III <1147229+genome21@users.noreply.github.com> Date: Tue, 18 Apr 2023 03:14:45 +0000 Subject: [PATCH 02/50] Adjust firewall to allow port 8080 --- GCP-SETUP.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/GCP-SETUP.md b/GCP-SETUP.md index ba6d61404..53646d4b0 100644 --- a/GCP-SETUP.md +++ b/GCP-SETUP.md @@ -25,6 +25,13 @@ if [[ -z "$vpc_exists" || -z "$subnet_exists" ]]; then exit 1 fi +gcloud compute firewall-rules create allow-tcp-8080 \ + --network $VPC_NAME \ + --allow tcp:8080 \ + --source-ranges 0.0.0.0/0 \ + --direction INGRESS + + # Create the Cloud Router and NAT Gateway gcloud compute routers create $CLOUD_ROUTER_NAME \ --network $VPC_NAME \ From f2a587191b86d27528852eae81b92381df2aa500 Mon Sep 17 00:00:00 2001 From: Robert Wilkins III <1147229+genome21@users.noreply.github.com> Date: Tue, 18 Apr 2023 03:42:01 +0000 Subject: [PATCH 03/50] Add comments to clarify code --- GCP-SETUP.md | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/GCP-SETUP.md b/GCP-SETUP.md index 53646d4b0..1f4eb6b4e 100644 --- a/GCP-SETUP.md +++ b/GCP-SETUP.md @@ -1,8 +1,11 @@ # Running Langflow from a new GCP project +This guide will help you set up a Langflow Dev VM in a Google Cloud Platform project using Google Cloud Shell. + + ## Run the following in your GCP cloudshell: ```bash - +# Set the VM, image, and networking configuration VM_NAME="langflow-dev" IMAGE_FAMILY="debian-11" IMAGE_PROJECT="debian-cloud" @@ -14,17 +17,20 @@ SUBNET_NAME="default" NAT_GATEWAY_NAME="nat-gateway" CLOUD_ROUTER_NAME="nat-client" +# Set the GCP project's compute region gcloud config set compute/region $REGION # Verify the VPC and subnet exist vpc_exists=$(gcloud compute networks list --filter="name=$VPC_NAME" --format="value(name)") subnet_exists=$(gcloud compute networks subnets list --filter="name=$SUBNET_NAME AND region=$REGION" --format="value(name)") +# Exit with an error message if the VPC or subnet does not exist if [[ -z "$vpc_exists" || -z "$subnet_exists" ]]; then echo "Error: VPC '$VPC_NAME' and/or subnet '$SUBNET_NAME' do not exist in region '$REGION'." exit 1 fi +# Create a firewall rule to allow TCP port 8080 for all instances in the VPC gcloud compute firewall-rules create allow-tcp-8080 \ --network $VPC_NAME \ --allow tcp:8080 \ @@ -48,11 +54,16 @@ gcloud compute routers nats create $NAT_GATEWAY_NAME \ STARTUP_SCRIPT=$(cat <<'EOF' #!/bin/bash +# Update and upgrade the system apt update apt upgrade + +# Install Python 3 pip, Langflow, and Nginx apt install python3-pip pip install langflow apt-get install nginx + +# Configure Nginx for Langflow touch /etc/nginx/sites-available/langflow-app echo "server { listen 0.0.0.0:7860; @@ -75,6 +86,7 @@ EOF tempfile=$(mktemp) echo "$STARTUP_SCRIPT" > $tempfile +# Create the VM instance with the specified configuration and startup script gcloud compute instances create $VM_NAME \ --image-family $IMAGE_FAMILY \ --image-project $IMAGE_PROJECT \ @@ -88,6 +100,9 @@ gcloud compute instances create $VM_NAME \ rm $tempfile ``` +> This script sets up a Debian-based VM with the Langflow package, Nginx, and the necessary configurations to run the Langflow Dev environment. The VM will be accessible on TCP port 8080 from any IP address. + +
## Connecting to your new Langflow VM 1. Navigate to the [VM instances](https://console.cloud.google.com/compute/instances) page From 7195278f2c7c2ce39412db7b677a584237b5b403 Mon Sep 17 00:00:00 2001 From: Robert Wilkins III <1147229+genome21@users.noreply.github.com> Date: Tue, 18 Apr 2023 04:29:42 +0000 Subject: [PATCH 04/50] check and create VPC and subnet --- GCP-SETUP.md | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/GCP-SETUP.md b/GCP-SETUP.md index 1f4eb6b4e..de0ec836d 100644 --- a/GCP-SETUP.md +++ b/GCP-SETUP.md @@ -14,20 +14,23 @@ ZONE="us-central1-a" REGION="us-central1" VPC_NAME="default" SUBNET_NAME="default" +SUBNET_RANGE="10.128.0.0/20" NAT_GATEWAY_NAME="nat-gateway" CLOUD_ROUTER_NAME="nat-client" # Set the GCP project's compute region gcloud config set compute/region $REGION -# Verify the VPC and subnet exist +# Check if the VPC exists, and create it if not vpc_exists=$(gcloud compute networks list --filter="name=$VPC_NAME" --format="value(name)") -subnet_exists=$(gcloud compute networks subnets list --filter="name=$SUBNET_NAME AND region=$REGION" --format="value(name)") +if [[ -z "$vpc_exists" ]]; then + gcloud compute networks create $VPC_NAME --subnet-mode=custom +fi -# Exit with an error message if the VPC or subnet does not exist -if [[ -z "$vpc_exists" || -z "$subnet_exists" ]]; then - echo "Error: VPC '$VPC_NAME' and/or subnet '$SUBNET_NAME' do not exist in region '$REGION'." - exit 1 +# Check if the subnet exists, and create it if not +subnet_exists=$(gcloud compute networks subnets list --filter="name=$SUBNET_NAME AND region=$REGION" --format="value(name)") +if [[ -z "$subnet_exists" ]]; then + gcloud compute networks subnets create $SUBNET_NAME --network=$VPC_NAME --region=$REGION --range=$SUBNET_RANGE fi # Create a firewall rule to allow TCP port 8080 for all instances in the VPC From d19d3f4de03e68e003df984084a4742b9d60ba64 Mon Sep 17 00:00:00 2001 From: Robert Wilkins III <1147229+genome21@users.noreply.github.com> Date: Tue, 18 Apr 2023 04:32:41 +0000 Subject: [PATCH 05/50] Allow IAP --- GCP-SETUP.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/GCP-SETUP.md b/GCP-SETUP.md index de0ec836d..9261b8219 100644 --- a/GCP-SETUP.md +++ b/GCP-SETUP.md @@ -40,6 +40,12 @@ gcloud compute firewall-rules create allow-tcp-8080 \ --source-ranges 0.0.0.0/0 \ --direction INGRESS +# Create a firewall rule to allow IAP traffic +gcloud compute firewall-rules create allow-iap \ + --network $VPC_NAME \ + --allow tcp:80,tcp:443 \ + --source-ranges 35.235.240.0/20 \ + --direction INGRESS # Create the Cloud Router and NAT Gateway gcloud compute routers create $CLOUD_ROUTER_NAME \ From 5c4743db36f1b7d0c58797fcef26d5f2cd117931 Mon Sep 17 00:00:00 2001 From: Robert Wilkins III <1147229+genome21@users.noreply.github.com> Date: Tue, 18 Apr 2023 17:31:50 +0000 Subject: [PATCH 06/50] adding machine type to VM create --- GCP-SETUP.md | 1 + 1 file changed, 1 insertion(+) diff --git a/GCP-SETUP.md b/GCP-SETUP.md index 9261b8219..3a4750bc5 100644 --- a/GCP-SETUP.md +++ b/GCP-SETUP.md @@ -100,6 +100,7 @@ gcloud compute instances create $VM_NAME \ --image-family $IMAGE_FAMILY \ --image-project $IMAGE_PROJECT \ --boot-disk-size $BOOT_DISK_SIZE \ + --machine-type=n1-standard-4 \ --metadata-from-file startup-script=$tempfile \ --zone $ZONE \ --network $VPC_NAME \ From 1e6a40adee2cb6784d9c22a199fd9348c024e895 Mon Sep 17 00:00:00 2001 From: Robert Wilkins III <1147229+genome21@users.noreply.github.com> Date: Wed, 19 Apr 2023 16:44:55 +0000 Subject: [PATCH 07/50] fix apt confirms, heredoc vars, add if statements --- GCP-SETUP.md | 53 +++++++++++++++++++++++++--------------------------- 1 file changed, 25 insertions(+), 28 deletions(-) diff --git a/GCP-SETUP.md b/GCP-SETUP.md index 3a4750bc5..3a0908ff2 100644 --- a/GCP-SETUP.md +++ b/GCP-SETUP.md @@ -34,57 +34,54 @@ if [[ -z "$subnet_exists" ]]; then fi # Create a firewall rule to allow TCP port 8080 for all instances in the VPC -gcloud compute firewall-rules create allow-tcp-8080 \ - --network $VPC_NAME \ - --allow tcp:8080 \ - --source-ranges 0.0.0.0/0 \ - --direction INGRESS +firewall_8080_exists=$(gcloud compute firewall-rules list --filter="name=allow-tcp-8080" --format="value(name)") +if [[ -z "$firewall_8080_exists" ]]; then + gcloud compute firewall-rules create allow-tcp-8080 --network $VPC_NAME --allow tcp:8080 --source-ranges 0.0.0.0/0 --direction INGRESS +fi # Create a firewall rule to allow IAP traffic -gcloud compute firewall-rules create allow-iap \ - --network $VPC_NAME \ - --allow tcp:80,tcp:443 \ - --source-ranges 35.235.240.0/20 \ - --direction INGRESS +firewall_iap_exists=$(gcloud compute firewall-rules list --filter="name=allow-iap" --format="value(name)") +if [[ -z "$firewall_iap_exists" ]]; then + gcloud compute firewall-rules create allow-iap --network $VPC_NAME --allow tcp:80,tcp:443 --source-ranges 35.235.240.0/20 --direction INGRESS +fi # Create the Cloud Router and NAT Gateway -gcloud compute routers create $CLOUD_ROUTER_NAME \ - --network $VPC_NAME \ - --region $REGION +cloud_router_exists=$(gcloud compute routers list --filter="name=$CLOUD_ROUTER_NAME" --format="value(name)") +if [[ -z "$cloud_router_exists" ]]; then + gcloud compute routers create $CLOUD_ROUTER_NAME --network $VPC_NAME --region $REGION +fi -gcloud compute routers nats create $NAT_GATEWAY_NAME \ - --router $CLOUD_ROUTER_NAME \ - --auto-allocate-nat-external-ips \ - --nat-all-subnet-ip-ranges \ - --enable-logging \ - --region $REGION +nat_exists=$(gcloud compute routers list --filter="name=$CLOUD_ROUTER_NAME" --format="value(nats.name)") +if [[ -z "$nat_exists" ]]; then + gcloud compute routers nats create $NAT_GATEWAY_NAME --router $CLOUD_ROUTER_NAME --auto-allocate-nat-external-ips --nat-all-subnet-ip-ranges --enable-logging --region $REGION +fi # Define the startup script as a multiline Bash here-doc STARTUP_SCRIPT=$(cat <<'EOF' #!/bin/bash # Update and upgrade the system -apt update -apt upgrade +apt -y update +apt -y upgrade # Install Python 3 pip, Langflow, and Nginx -apt install python3-pip +apt -y install python3-pip pip install langflow -apt-get install nginx +apt-get -y install nginx # Configure Nginx for Langflow touch /etc/nginx/sites-available/langflow-app echo "server { - listen 0.0.0.0:7860; + listen 0.0.0.0:8080; location / { proxy_pass http://127.0.0.1:7860; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header Host "\$host"; + proxy_set_header X-Real-IP "\$remote_addr"; + proxy_set_header X-Forwarded-For "\$proxy_add_x_forwarded_for"; } }" >> /etc/nginx/sites-available/langflow-app -ln -s /etc/nginx/sites-available/my-app /etc/nginx/sites-enabled/ +ln -s /etc/nginx/sites-available/langflow-app /etc/nginx/sites-enabled/ sudo nginx -t sudo systemctl restart nginx langflow From a200ddc4fdf309bb214970f0bc2e75b0cf205311 Mon Sep 17 00:00:00 2001 From: Robert Wilkins III <1147229+genome21@users.noreply.github.com> Date: Wed, 19 Apr 2023 22:59:56 +0000 Subject: [PATCH 08/50] create setup files and GCP tutorial --- GCP-SETUP.md => GCP_DEPLOYMENT.md | 4 +++- scripts/gcp_setup.sh | 0 scripts/gcp_setup_tutorial.yaml | 10 ++++++++++ 3 files changed, 13 insertions(+), 1 deletion(-) rename GCP-SETUP.md => GCP_DEPLOYMENT.md (93%) create mode 100644 scripts/gcp_setup.sh create mode 100644 scripts/gcp_setup_tutorial.yaml diff --git a/GCP-SETUP.md b/GCP_DEPLOYMENT.md similarity index 93% rename from GCP-SETUP.md rename to GCP_DEPLOYMENT.md index 3a0908ff2..015d02d6f 100644 --- a/GCP-SETUP.md +++ b/GCP_DEPLOYMENT.md @@ -1,6 +1,8 @@ -# Running Langflow from a new GCP project +# Running Langflow from a new Google Cloud project This guide will help you set up a Langflow Dev VM in a Google Cloud Platform project using Google Cloud Shell. +[![Open in Cloud Shell](https://gstatic.com/cloudssh/images/open-btn.svg)](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/genome21/langflow&working_dir=scripts&shellonly=true&tutorial=gcp_setup_tutorial.yaml) + ## Run the following in your GCP cloudshell: diff --git a/scripts/gcp_setup.sh b/scripts/gcp_setup.sh new file mode 100644 index 000000000..e69de29bb diff --git a/scripts/gcp_setup_tutorial.yaml b/scripts/gcp_setup_tutorial.yaml new file mode 100644 index 000000000..b45c56c30 --- /dev/null +++ b/scripts/gcp_setup_tutorial.yaml @@ -0,0 +1,10 @@ +title: Setting up Langflow on GCP +description: This tutorial guides you through setting up Langflow on GCP +steps: +- title: Running setup script + content: | + Running the setup script to create resources and deploy Langflow on GCP. + + ```bash + source gcp_setup.sh + ``` From 5c57701e38c43817d6224c7e643460c43c458578 Mon Sep 17 00:00:00 2001 From: Robert Wilkins III <1147229+genome21@users.noreply.github.com> Date: Thu, 20 Apr 2023 01:21:21 +0000 Subject: [PATCH 09/50] configure cloudshell to run walkthrough --- GCP_DEPLOYMENT.md | 2 +- README.md | 10 +++- scripts/gcp_setup.sh | 100 ++++++++++++++++++++++++++++++++ scripts/gcp_setup_tutorial.yaml | 86 ++++++++++++++++++++++++--- scripts/walkthroughtutorial.md | 78 +++++++++++++++++++++++++ 5 files changed, 266 insertions(+), 10 deletions(-) create mode 100644 scripts/walkthroughtutorial.md diff --git a/GCP_DEPLOYMENT.md b/GCP_DEPLOYMENT.md index 015d02d6f..3cf10df27 100644 --- a/GCP_DEPLOYMENT.md +++ b/GCP_DEPLOYMENT.md @@ -1,7 +1,7 @@ # Running Langflow from a new Google Cloud project This guide will help you set up a Langflow Dev VM in a Google Cloud Platform project using Google Cloud Shell. -[![Open in Cloud Shell](https://gstatic.com/cloudssh/images/open-btn.svg)](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/genome21/langflow&working_dir=scripts&shellonly=true&tutorial=gcp_setup_tutorial.yaml) +[![Open in Cloud Shell](https://gstatic.com/cloudssh/images/open-btn.svg)](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/genome21/langflow&working_dir=scripts&shellonly=true&tutorial=walkthroughtutorial.md) ## Run the following in your GCP cloudshell: diff --git a/README.md b/README.md index 970496349..eaaf84331 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ LangFlow is a GUI for [LangChain](https://github.com/hwchase17/langchain), designed with [react-flow](https://github.com/wbkd/react-flow) to provide an effortless way to experiment and prototype flows with drag-and-drop components and a chat box. ## 📦 Installation - +### Locally You can install LangFlow from pip: `pip install langflow` @@ -28,6 +28,14 @@ Next, run: `langflow` +### Deploy Langflow on Google Cloud Platform + +Follow our step-by-step guide to deploy Langflow on Google Cloud Platform (GCP) using Google Cloud Shell. The guide is available in the [Langflow in Google Cloud Platform](GCP_DEPLOYMENT.md) document. + +Alternatively, click the "Open in Cloud Shell" button below to launch Google Cloud Shell, clone the Langflow repository, and start an interactive tutorial that will guide you through the process of setting up the necessary resources and deploying Langflow on your GCP project. + +[![Open in Cloud Shell](https://gstatic.com/cloudssh/images/open-btn.svg)](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/genome21/langflow&working_dir=scripts&shellonly=true&tutorial=GCP_SETUP_TUTORIAL.md) + ## 🎨 Creating Flows Creating flows with LangFlow is easy. Simply drag sidebar components onto the canvas and connect them together to create your pipeline. LangFlow provides a range of [LangChain components](https://langchain.readthedocs.io/en/latest/reference.html) to choose from, including LLMs, prompt serializers, agents, and chains. diff --git a/scripts/gcp_setup.sh b/scripts/gcp_setup.sh index e69de29bb..3e20e9589 100644 --- a/scripts/gcp_setup.sh +++ b/scripts/gcp_setup.sh @@ -0,0 +1,100 @@ +# Set the VM, image, and networking configuration +VM_NAME="langflow-dev" +IMAGE_FAMILY="debian-11" +IMAGE_PROJECT="debian-cloud" +BOOT_DISK_SIZE="100GB" +ZONE="us-central1-a" +REGION="us-central1" +VPC_NAME="default" +SUBNET_NAME="default" +SUBNET_RANGE="10.128.0.0/20" +NAT_GATEWAY_NAME="nat-gateway" +CLOUD_ROUTER_NAME="nat-client" + +# Set the GCP project's compute region +gcloud config set compute/region $REGION + +# Check if the VPC exists, and create it if not +vpc_exists=$(gcloud compute networks list --filter="name=$VPC_NAME" --format="value(name)") +if [[ -z "$vpc_exists" ]]; then + gcloud compute networks create $VPC_NAME --subnet-mode=custom +fi + +# Check if the subnet exists, and create it if not +subnet_exists=$(gcloud compute networks subnets list --filter="name=$SUBNET_NAME AND region=$REGION" --format="value(name)") +if [[ -z "$subnet_exists" ]]; then + gcloud compute networks subnets create $SUBNET_NAME --network=$VPC_NAME --region=$REGION --range=$SUBNET_RANGE +fi + +# Create a firewall rule to allow TCP port 8080 for all instances in the VPC +firewall_8080_exists=$(gcloud compute firewall-rules list --filter="name=allow-tcp-8080" --format="value(name)") +if [[ -z "$firewall_8080_exists" ]]; then + gcloud compute firewall-rules create allow-tcp-8080 --network $VPC_NAME --allow tcp:8080 --source-ranges 0.0.0.0/0 --direction INGRESS +fi + +# Create a firewall rule to allow IAP traffic +firewall_iap_exists=$(gcloud compute firewall-rules list --filter="name=allow-iap" --format="value(name)") +if [[ -z "$firewall_iap_exists" ]]; then + gcloud compute firewall-rules create allow-iap --network $VPC_NAME --allow tcp:80,tcp:443 --source-ranges 35.235.240.0/20 --direction INGRESS +fi + +# Create the Cloud Router and NAT Gateway +cloud_router_exists=$(gcloud compute routers list --filter="name=$CLOUD_ROUTER_NAME" --format="value(name)") +if [[ -z "$cloud_router_exists" ]]; then + gcloud compute routers create $CLOUD_ROUTER_NAME --network $VPC_NAME --region $REGION +fi + +nat_exists=$(gcloud compute routers list --filter="name=$CLOUD_ROUTER_NAME" --format="value(nats.name)") +if [[ -z "$nat_exists" ]]; then + gcloud compute routers nats create $NAT_GATEWAY_NAME --router $CLOUD_ROUTER_NAME --auto-allocate-nat-external-ips --nat-all-subnet-ip-ranges --enable-logging --region $REGION +fi + +# Define the startup script as a multiline Bash here-doc +STARTUP_SCRIPT=$(cat <<'EOF' +#!/bin/bash + +# Update and upgrade the system +apt -y update +apt -y upgrade + +# Install Python 3 pip, Langflow, and Nginx +apt -y install python3-pip +pip install langflow +apt-get -y install nginx + +# Configure Nginx for Langflow +touch /etc/nginx/sites-available/langflow-app +echo "server { + listen 0.0.0.0:8080; + + location / { + proxy_pass http://127.0.0.1:7860; + proxy_set_header Host "\$host"; + proxy_set_header X-Real-IP "\$remote_addr"; + proxy_set_header X-Forwarded-For "\$proxy_add_x_forwarded_for"; + } +}" >> /etc/nginx/sites-available/langflow-app +ln -s /etc/nginx/sites-available/langflow-app /etc/nginx/sites-enabled/ +sudo nginx -t +sudo systemctl restart nginx +langflow +EOF +) + +# Create a temporary file to store the startup script +tempfile=$(mktemp) +echo "$STARTUP_SCRIPT" > $tempfile + +# Create the VM instance with the specified configuration and startup script +gcloud compute instances create $VM_NAME \ + --image-family $IMAGE_FAMILY \ + --image-project $IMAGE_PROJECT \ + --boot-disk-size $BOOT_DISK_SIZE \ + --machine-type=n1-standard-4 \ + --metadata-from-file startup-script=$tempfile \ + --zone $ZONE \ + --network $VPC_NAME \ + --subnet $SUBNET_NAME + +# Remove the temporary file after the VM is created +rm $tempfile diff --git a/scripts/gcp_setup_tutorial.yaml b/scripts/gcp_setup_tutorial.yaml index b45c56c30..f8c5b401c 100644 --- a/scripts/gcp_setup_tutorial.yaml +++ b/scripts/gcp_setup_tutorial.yaml @@ -1,10 +1,80 @@ -title: Setting up Langflow on GCP -description: This tutorial guides you through setting up Langflow on GCP -steps: -- title: Running setup script - content: | - Running the setup script to create resources and deploy Langflow on GCP. +title: Deploy Langflow on Google Cloud Platform +duration: 45m +author: Your Name +environment: + cwd: working_dir + repo: + url: https://github.com/genome21/langflow + working_dir: scripts + +steps: +- title: Introduction + content: | + In this tutorial, you will learn how to deploy Langflow on Google Cloud Platform (GCP) using Google Cloud Shell. + + This tutorial assumes you have a GCP account and basic knowledge of Google Cloud Shell. If you're not familiar with Cloud Shell, you can review the [Cloud Shell documentation](https://cloud.google.com/shell/docs). + +- title: Set up your environment + content: | + Before you start, make sure you have the following prerequisites: + + - A GCP account with the necessary permissions to create resources + - A project on GCP where you want to deploy Langflow + + + + In the next step, you'll clone the Langflow repository and navigate to the `scripts` directory. + +- title: Clone the repository and navigate to the scripts directory + content: | + Run the following commands to clone the Langflow repository and navigate to the `scripts` directory: - ```bash - source gcp_setup.sh ``` + git clone https://github.com/genome21/langflow + cd langflow/scripts + ``` + + In the next step, you'll configure the GCP environment and deploy Langflow. + +- title: Configure the GCP environment and deploy Langflow + content: | + Run the `deploy_langflow_gcp.sh` script to configure the GCP environment and deploy Langflow: + + ``` + ./deploy_langflow_gcp.sh + ``` + + The script will: + + 1. Check if the required resources (VPC, subnet, firewall rules, and Cloud Router) exist and create them if needed + 2. Create a startup script to install Python, Langflow, and Nginx + 3. Create a Compute Engine VM instance with the specified configuration and startup script + 4. Configure Nginx to serve Langflow on TCP port 8080 + + In the next step, you'll learn how to connect to the Langflow VM. + +- title: Connect to the Langflow VM + content: | + To connect to your new Langflow VM, follow these steps: + + 1. Navigate to the [VM instances](https://console.cloud.google.com/compute/instances) page + 2. Click on the external IP for your VM + 3. Add port 8080 (assuming your VM external IP is 192.168.0.1): + http://192.168.0.1:8080 + 4. You will be greeted by the Langflow Dev environment + + Congratulations! You have successfully deployed Langflow on Google Cloud Platform. + +- title: Cleanup + content: | + If you want to remove the resources created during this tutorial, you can use the following commands: + + ``` + gcloud compute instances delete langflow-dev --zone us-central1-a --quiet + gcloud compute routers nats delete nat-gateway --router nat-client --region us-central1 --quiet + gcloud compute routers delete nat-client --region us-central1 --quiet + gcloud compute firewall-rules delete allow-tcp-8080 --quiet + gcloud compute firewall-rules delete allow-iap --quiet + gcloud compute networks subnets delete default --region us-central1 --quiet + gcloud compute networks delete default --quiet + `` diff --git a/scripts/walkthroughtutorial.md b/scripts/walkthroughtutorial.md new file mode 100644 index 000000000..ebc9a4b95 --- /dev/null +++ b/scripts/walkthroughtutorial.md @@ -0,0 +1,78 @@ +# Deploy Langflow on Google Cloud Platform + +**Duration**: 45 minutes +**Author**: [Robert Wilkins III](https://www.linkedin.com/in/robertwilkinsiii) + +## Introduction + +In this tutorial, you will learn how to deploy Langflow on [Google Cloud Platform](https://cloud.google.com/) (GCP) using Google Cloud Shell. + +This tutorial assumes you have a GCP account and basic knowledge of Google Cloud Shell. If you're not familiar with Cloud Shell, you can review the [Cloud Shell documentation](https://cloud.google.com/shell/docs). + +## Set up your environment + +Before you start, make sure you have the following prerequisites: + +- A GCP account with the necessary permissions to create resources +- A project on GCP where you want to deploy Langflow + +[**Select your GCP project**] + +In the next step, you'll clone the Langflow repository and navigate to the `scripts` directory. + +## Clone the repository and navigate to the scripts directory + +Run the following commands to clone the Langflow repository and navigate to the `scripts` directory: + +```bash +git clone https://github.com/genome21/langflow +cd langflow/scripts +``` + +In the next step, you'll configure the GCP environment and deploy Langflow. + +## Configure the GCP environment and deploy Langflow +Run the deploy_langflow_gcp.sh script to configure the GCP environment and deploy Langflow: + +```bash +./deploy_langflow_gcp.sh +``` + +The script will: + +1. Check if the required resources (VPC, subnet, firewall rules, and Cloud Router) exist and create them if needed +2. Create a startup script to install Python, Langflow, and Nginx +3. Create a Compute Engine VM instance with the specified configuration and startup script +4. Configure Nginx to serve Langflow on TCP port 8080 + +In the next step, you'll learn how to connect to the Langflow VM. + +## Connect to the Langflow VM +To connect to your new Langflow VM, follow these steps: + +1. Navigate to the [VM instances](https://console.cloud.google.com/compute/instances) page +2. Click on the external IP for your VM +3. Add port 8080 (assuming your VM external IP is 192.168.0.1): +http://192.168.0.1:8080 +4. You will be greeted by the Langflow Dev environment + +Congratulations! You have successfully deployed Langflow on Google Cloud Platform. + +## Cleanup +If you want to remove the resources created during this tutorial, you can use the following commands: + +```sql +gcloud compute instances delete langflow-dev --zone us-central1-a --quiet + +gcloud compute routers nats delete nat-gateway --router nat-client --region us-central1 --quiet + +gcloud compute routers delete nat-client --region us-central1 --quiet + +gcloud compute firewall-rules delete allow-tcp-8080 --quiet + +gcloud compute firewall-rules delete allow-iap --quiet + +gcloud compute networks subnets delete default --region us-central1 --quiet + +gcloud compute networks delete default --quiet +``` From 12a1f3ac7a71dad43e4035af64271d443dc40669 Mon Sep 17 00:00:00 2001 From: Robert Wilkins III <1147229+genome21@users.noreply.github.com> Date: Thu, 20 Apr 2023 01:30:44 +0000 Subject: [PATCH 10/50] remove scripted steps from walkthrough --- scripts/walkthroughtutorial.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/scripts/walkthroughtutorial.md b/scripts/walkthroughtutorial.md index ebc9a4b95..641cce1e8 100644 --- a/scripts/walkthroughtutorial.md +++ b/scripts/walkthroughtutorial.md @@ -18,16 +18,16 @@ Before you start, make sure you have the following prerequisites: [**Select your GCP project**] -In the next step, you'll clone the Langflow repository and navigate to the `scripts` directory. +[comment]: <> (In the next step, you'll clone the Langflow repository and navigate to the `scripts` directory.) -## Clone the repository and navigate to the scripts directory +[comment]: <> (## Clone the repository and navigate to the scripts directory) -Run the following commands to clone the Langflow repository and navigate to the `scripts` directory: +[comment]: <> (Run the following commands to clone the Langflow repository and navigate to the `scripts` directory:) -```bash -git clone https://github.com/genome21/langflow -cd langflow/scripts -``` +[comment]: <> (```bash) +[comment]: <> (git clone https://github.com/genome21/langflow) +[comment]: <> (cd langflow/scripts) +[comment]: <> (```) In the next step, you'll configure the GCP environment and deploy Langflow. From c458f0f222071c4249468a5384c1e1eaaaaa2c13 Mon Sep 17 00:00:00 2001 From: Robert Wilkins III <1147229+genome21@users.noreply.github.com> Date: Thu, 20 Apr 2023 01:32:45 +0000 Subject: [PATCH 11/50] remove comments that show up in walkthrough --- scripts/walkthroughtutorial.md | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/scripts/walkthroughtutorial.md b/scripts/walkthroughtutorial.md index 641cce1e8..d21dbd31a 100644 --- a/scripts/walkthroughtutorial.md +++ b/scripts/walkthroughtutorial.md @@ -18,17 +18,6 @@ Before you start, make sure you have the following prerequisites: [**Select your GCP project**] -[comment]: <> (In the next step, you'll clone the Langflow repository and navigate to the `scripts` directory.) - -[comment]: <> (## Clone the repository and navigate to the scripts directory) - -[comment]: <> (Run the following commands to clone the Langflow repository and navigate to the `scripts` directory:) - -[comment]: <> (```bash) -[comment]: <> (git clone https://github.com/genome21/langflow) -[comment]: <> (cd langflow/scripts) -[comment]: <> (```) - In the next step, you'll configure the GCP environment and deploy Langflow. ## Configure the GCP environment and deploy Langflow From 98fc23dfe8b5bc993fcc58f3512630437a71a2d2 Mon Sep 17 00:00:00 2001 From: Robert Wilkins III <1147229+genome21@users.noreply.github.com> Date: Thu, 20 Apr 2023 01:35:20 +0000 Subject: [PATCH 12/50] fix bash command launch --- scripts/walkthroughtutorial.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/walkthroughtutorial.md b/scripts/walkthroughtutorial.md index d21dbd31a..153a5a0c2 100644 --- a/scripts/walkthroughtutorial.md +++ b/scripts/walkthroughtutorial.md @@ -24,7 +24,7 @@ In the next step, you'll configure the GCP environment and deploy Langflow. Run the deploy_langflow_gcp.sh script to configure the GCP environment and deploy Langflow: ```bash -./deploy_langflow_gcp.sh +bash ./deploy_langflow_gcp.sh ``` The script will: From a13be7f1dd237b0002ec14b5f7ef0000e9911d02 Mon Sep 17 00:00:00 2001 From: Robert Wilkins III <1147229+genome21@users.noreply.github.com> Date: Thu, 20 Apr 2023 01:37:52 +0000 Subject: [PATCH 13/50] match bash script to walkthrough --- scripts/{gcp_setup.sh => deploy_langflow_gcp.sh} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename scripts/{gcp_setup.sh => deploy_langflow_gcp.sh} (100%) diff --git a/scripts/gcp_setup.sh b/scripts/deploy_langflow_gcp.sh similarity index 100% rename from scripts/gcp_setup.sh rename to scripts/deploy_langflow_gcp.sh From 413285f7eccc251bca83c557ec144021d600aa4f Mon Sep 17 00:00:00 2001 From: Robert Wilkins III <1147229+genome21@users.noreply.github.com> Date: Thu, 20 Apr 2023 01:55:34 +0000 Subject: [PATCH 14/50] force gcp login in ephemeral cloudshell --- scripts/walkthroughtutorial.md | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/walkthroughtutorial.md b/scripts/walkthroughtutorial.md index 153a5a0c2..99599010f 100644 --- a/scripts/walkthroughtutorial.md +++ b/scripts/walkthroughtutorial.md @@ -24,6 +24,7 @@ In the next step, you'll configure the GCP environment and deploy Langflow. Run the deploy_langflow_gcp.sh script to configure the GCP environment and deploy Langflow: ```bash +gcloud auth login --brief --quiet bash ./deploy_langflow_gcp.sh ``` From 7314a3fc81026a06b3d5dda9b42a36dc439f5543 Mon Sep 17 00:00:00 2001 From: Robert Wilkins III <1147229+genome21@users.noreply.github.com> Date: Thu, 20 Apr 2023 02:05:34 +0000 Subject: [PATCH 15/50] add cloudshell repo trust advisory --- GCP_DEPLOYMENT.md | 1 + 1 file changed, 1 insertion(+) diff --git a/GCP_DEPLOYMENT.md b/GCP_DEPLOYMENT.md index 3cf10df27..6bbd54097 100644 --- a/GCP_DEPLOYMENT.md +++ b/GCP_DEPLOYMENT.md @@ -1,5 +1,6 @@ # Running Langflow from a new Google Cloud project This guide will help you set up a Langflow Dev VM in a Google Cloud Platform project using Google Cloud Shell. +> When cloudshell opens, select **Trust this repo**. Some gcloud commands do not run in ephemeral cloudshell. [![Open in Cloud Shell](https://gstatic.com/cloudssh/images/open-btn.svg)](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/genome21/langflow&working_dir=scripts&shellonly=true&tutorial=walkthroughtutorial.md) From a8b2460b91dfc3410323b88367796bcc04336cc4 Mon Sep 17 00:00:00 2001 From: Robert Wilkins III <1147229+genome21@users.noreply.github.com> Date: Thu, 20 Apr 2023 02:07:10 +0000 Subject: [PATCH 16/50] remove login prompt for ephemeral cloudshell --- scripts/walkthroughtutorial.md | 1 - 1 file changed, 1 deletion(-) diff --git a/scripts/walkthroughtutorial.md b/scripts/walkthroughtutorial.md index 99599010f..153a5a0c2 100644 --- a/scripts/walkthroughtutorial.md +++ b/scripts/walkthroughtutorial.md @@ -24,7 +24,6 @@ In the next step, you'll configure the GCP environment and deploy Langflow. Run the deploy_langflow_gcp.sh script to configure the GCP environment and deploy Langflow: ```bash -gcloud auth login --brief --quiet bash ./deploy_langflow_gcp.sh ``` From 060a0cfbeb9f980dba8d6443a43a5de081040d76 Mon Sep 17 00:00:00 2001 From: Robert Wilkins III <1147229+genome21@users.noreply.github.com> Date: Thu, 20 Apr 2023 02:10:45 +0000 Subject: [PATCH 17/50] set project config --- scripts/walkthroughtutorial.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/walkthroughtutorial.md b/scripts/walkthroughtutorial.md index 153a5a0c2..f908bce3b 100644 --- a/scripts/walkthroughtutorial.md +++ b/scripts/walkthroughtutorial.md @@ -23,7 +23,8 @@ In the next step, you'll configure the GCP environment and deploy Langflow. ## Configure the GCP environment and deploy Langflow Run the deploy_langflow_gcp.sh script to configure the GCP environment and deploy Langflow: -```bash +```sh +gcloud config set project {{project-id}} bash ./deploy_langflow_gcp.sh ``` From 11fea7a7a86f37a0bbccf3c8111f3e9bd20ee3f1 Mon Sep 17 00:00:00 2001 From: Robert Wilkins III <1147229+genome21@users.noreply.github.com> Date: Thu, 20 Apr 2023 02:18:27 +0000 Subject: [PATCH 18/50] testing var expansion --- scripts/walkthroughtutorial.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/walkthroughtutorial.md b/scripts/walkthroughtutorial.md index f908bce3b..d30c3b702 100644 --- a/scripts/walkthroughtutorial.md +++ b/scripts/walkthroughtutorial.md @@ -16,7 +16,7 @@ Before you start, make sure you have the following prerequisites: - A GCP account with the necessary permissions to create resources - A project on GCP where you want to deploy Langflow -[**Select your GCP project**] +[**Select your GCP project**] In the next step, you'll configure the GCP environment and deploy Langflow. @@ -24,7 +24,7 @@ In the next step, you'll configure the GCP environment and deploy Langflow. Run the deploy_langflow_gcp.sh script to configure the GCP environment and deploy Langflow: ```sh -gcloud config set project {{project-id}} +gcloud config set project {{project_id}} bash ./deploy_langflow_gcp.sh ``` From e0aba3223fd7017b71fa9262c30d1b6948b05851 Mon Sep 17 00:00:00 2001 From: Robert Wilkins III <1147229+genome21@users.noreply.github.com> Date: Thu, 20 Apr 2023 02:19:36 +0000 Subject: [PATCH 19/50] revert var expansion test --- scripts/walkthroughtutorial.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/walkthroughtutorial.md b/scripts/walkthroughtutorial.md index d30c3b702..3b7e3a76e 100644 --- a/scripts/walkthroughtutorial.md +++ b/scripts/walkthroughtutorial.md @@ -24,7 +24,7 @@ In the next step, you'll configure the GCP environment and deploy Langflow. Run the deploy_langflow_gcp.sh script to configure the GCP environment and deploy Langflow: ```sh -gcloud config set project {{project_id}} +gcloud config set project {{project-id}} bash ./deploy_langflow_gcp.sh ``` From 72d6cb060ae5604ad5c4bde7d5adfff35d8606fc Mon Sep 17 00:00:00 2001 From: Robert Wilkins III <1147229+genome21@users.noreply.github.com> Date: Thu, 20 Apr 2023 02:23:34 +0000 Subject: [PATCH 20/50] var expansion again --- scripts/walkthroughtutorial.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/walkthroughtutorial.md b/scripts/walkthroughtutorial.md index 3b7e3a76e..d30c3b702 100644 --- a/scripts/walkthroughtutorial.md +++ b/scripts/walkthroughtutorial.md @@ -24,7 +24,7 @@ In the next step, you'll configure the GCP environment and deploy Langflow. Run the deploy_langflow_gcp.sh script to configure the GCP environment and deploy Langflow: ```sh -gcloud config set project {{project-id}} +gcloud config set project {{project_id}} bash ./deploy_langflow_gcp.sh ``` From 0527bf3291c2137bdaecbcb80bf77ab4221a984d Mon Sep 17 00:00:00 2001 From: Robert Wilkins III <1147229+genome21@users.noreply.github.com> Date: Thu, 20 Apr 2023 02:33:47 +0000 Subject: [PATCH 21/50] var expansion alt test --- scripts/walkthroughtutorial.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/scripts/walkthroughtutorial.md b/scripts/walkthroughtutorial.md index d30c3b702..66efe5e74 100644 --- a/scripts/walkthroughtutorial.md +++ b/scripts/walkthroughtutorial.md @@ -16,7 +16,11 @@ Before you start, make sure you have the following prerequisites: - A GCP account with the necessary permissions to create resources - A project on GCP where you want to deploy Langflow -[**Select your GCP project**] +[**Select your GCP project**] + + In the next step, you'll configure the GCP environment and deploy Langflow. @@ -24,7 +28,7 @@ In the next step, you'll configure the GCP environment and deploy Langflow. Run the deploy_langflow_gcp.sh script to configure the GCP environment and deploy Langflow: ```sh -gcloud config set project {{project_id}} +gcloud config set project bash ./deploy_langflow_gcp.sh ``` From e38d7b6f24e6830203cb04bbe8e02fa0bbf8ece4 Mon Sep 17 00:00:00 2001 From: Robert Wilkins III <1147229+genome21@users.noreply.github.com> Date: Thu, 20 Apr 2023 02:57:37 +0000 Subject: [PATCH 22/50] provide user with link to langflow server --- scripts/walkthroughtutorial.md | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/scripts/walkthroughtutorial.md b/scripts/walkthroughtutorial.md index 66efe5e74..0f65dbadf 100644 --- a/scripts/walkthroughtutorial.md +++ b/scripts/walkthroughtutorial.md @@ -46,8 +46,16 @@ To connect to your new Langflow VM, follow these steps: 1. Navigate to the [VM instances](https://console.cloud.google.com/compute/instances) page 2. Click on the external IP for your VM -3. Add port 8080 (assuming your VM external IP is 192.168.0.1): -http://192.168.0.1:8080 +
or +3. Run the following command to store the VM's IP in a variable called `LANGFLOW-IP`: +```bash +export LANGFLOW-IP=$(gcloud compute instances list --filter="NAME=langflow-dev" --format="value(EXTERNAL_IP)") + +echo http://$LANGFLOW-IP:8080 +``` + + + 4. You will be greeted by the Langflow Dev environment Congratulations! You have successfully deployed Langflow on Google Cloud Platform. From df062edd9127576c87b317056336f3af3a6a74ba Mon Sep 17 00:00:00 2001 From: Robert Wilkins III <1147229+genome21@users.noreply.github.com> Date: Thu, 20 Apr 2023 03:08:50 +0000 Subject: [PATCH 23/50] vars and trophies --- scripts/walkthroughtutorial.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/walkthroughtutorial.md b/scripts/walkthroughtutorial.md index 0f65dbadf..5398617c3 100644 --- a/scripts/walkthroughtutorial.md +++ b/scripts/walkthroughtutorial.md @@ -42,6 +42,7 @@ The script will: In the next step, you'll learn how to connect to the Langflow VM. ## Connect to the Langflow VM + To connect to your new Langflow VM, follow these steps: 1. Navigate to the [VM instances](https://console.cloud.google.com/compute/instances) page @@ -54,7 +55,7 @@ export LANGFLOW-IP=$(gcloud compute instances list --filter="NAME=langflow-dev" echo http://$LANGFLOW-IP:8080 ``` - + 4. You will be greeted by the Langflow Dev environment From c4f41a7da9f88917a4ee2fa86c79987fc8a16f8b Mon Sep 17 00:00:00 2001 From: Robert Wilkins III <1147229+genome21@users.noreply.github.com> Date: Thu, 20 Apr 2023 03:11:30 +0000 Subject: [PATCH 24/50] remove input tag --- scripts/walkthroughtutorial.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/scripts/walkthroughtutorial.md b/scripts/walkthroughtutorial.md index 5398617c3..2711ccd93 100644 --- a/scripts/walkthroughtutorial.md +++ b/scripts/walkthroughtutorial.md @@ -50,13 +50,11 @@ To connect to your new Langflow VM, follow these steps:
or 3. Run the following command to store the VM's IP in a variable called `LANGFLOW-IP`: ```bash -export LANGFLOW-IP=$(gcloud compute instances list --filter="NAME=langflow-dev" --format="value(EXTERNAL_IP)") +export LANGFLOW_IP=$(gcloud compute instances list --filter="NAME=langflow-dev" --format="value(EXTERNAL_IP)") -echo http://$LANGFLOW-IP:8080 +echo http://$LANGFLOW_IP:8080 ``` - - 4. You will be greeted by the Langflow Dev environment Congratulations! You have successfully deployed Langflow on Google Cloud Platform. From d46c1e5a81ebc7918578094175633e4d4ae8b64c Mon Sep 17 00:00:00 2001 From: Robert Wilkins III <1147229+genome21@users.noreply.github.com> Date: Thu, 20 Apr 2023 03:17:40 +0000 Subject: [PATCH 25/50] clarify notes to connect to vm --- scripts/walkthroughtutorial.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/scripts/walkthroughtutorial.md b/scripts/walkthroughtutorial.md index 2711ccd93..dd107a770 100644 --- a/scripts/walkthroughtutorial.md +++ b/scripts/walkthroughtutorial.md @@ -45,17 +45,16 @@ In the next step, you'll learn how to connect to the Langflow VM. To connect to your new Langflow VM, follow these steps: -1. Navigate to the [VM instances](https://console.cloud.google.com/compute/instances) page -2. Click on the external IP for your VM -
or -3. Run the following command to store the VM's IP in a variable called `LANGFLOW-IP`: +1. Navigate to the [VM instances](https://console.cloud.google.com/compute/instances) page and click on the external IP for your VM. Make sure to use HTTP and set the port to 8080 +
**or** +3. Run the following command to display the URL for your Langflow environment: ```bash export LANGFLOW_IP=$(gcloud compute instances list --filter="NAME=langflow-dev" --format="value(EXTERNAL_IP)") echo http://$LANGFLOW_IP:8080 ``` -4. You will be greeted by the Langflow Dev environment +4. Click on the Langflow URL in cloudshell to be greeted by the Langflow Dev environment Congratulations! You have successfully deployed Langflow on Google Cloud Platform. From 6c61926261ac6168d1dd2c8525b359f01dcc1c2c Mon Sep 17 00:00:00 2001 From: Robert Wilkins III <1147229+genome21@users.noreply.github.com> Date: Thu, 20 Apr 2023 03:20:09 +0000 Subject: [PATCH 26/50] move trophy toward end of walkthrough --- scripts/walkthroughtutorial.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/walkthroughtutorial.md b/scripts/walkthroughtutorial.md index dd107a770..7742f3453 100644 --- a/scripts/walkthroughtutorial.md +++ b/scripts/walkthroughtutorial.md @@ -42,7 +42,6 @@ The script will: In the next step, you'll learn how to connect to the Langflow VM. ## Connect to the Langflow VM - To connect to your new Langflow VM, follow these steps: 1. Navigate to the [VM instances](https://console.cloud.google.com/compute/instances) page and click on the external IP for your VM. Make sure to use HTTP and set the port to 8080 @@ -58,6 +57,8 @@ echo http://$LANGFLOW_IP:8080 Congratulations! You have successfully deployed Langflow on Google Cloud Platform. + + ## Cleanup If you want to remove the resources created during this tutorial, you can use the following commands: From 1c7776508fbbdc65f7e3ff708a9c15835646fc63 Mon Sep 17 00:00:00 2001 From: Robert Wilkins III <1147229+genome21@users.noreply.github.com> Date: Thu, 20 Apr 2023 03:29:03 +0000 Subject: [PATCH 27/50] improve readability --- scripts/walkthroughtutorial.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/scripts/walkthroughtutorial.md b/scripts/walkthroughtutorial.md index 7742f3453..3d9401f2e 100644 --- a/scripts/walkthroughtutorial.md +++ b/scripts/walkthroughtutorial.md @@ -69,6 +69,13 @@ gcloud compute routers nats delete nat-gateway --router nat-client --region us-c gcloud compute routers delete nat-client --region us-central1 --quiet +``` +The following network settings and services are used during this walkthrough. If you plan to continue using the project after the walkthrough, you may keep these configurations in place. + +However, if you decide to remove them after completing the walkthrough, you can use the following gcloud commands: +> These commands will delete the firewall rules and network configurations created during the walkthrough. Make sure to run them only if you no longer need these settings. + +``` gcloud compute firewall-rules delete allow-tcp-8080 --quiet gcloud compute firewall-rules delete allow-iap --quiet From dcf1f0c35ed4eda752161526b83ebf88a8ba1432 Mon Sep 17 00:00:00 2001 From: Robert Wilkins III <1147229+genome21@users.noreply.github.com> Date: Thu, 20 Apr 2023 03:35:10 +0000 Subject: [PATCH 28/50] add styling --- scripts/walkthroughtutorial.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/scripts/walkthroughtutorial.md b/scripts/walkthroughtutorial.md index 3d9401f2e..3731533c1 100644 --- a/scripts/walkthroughtutorial.md +++ b/scripts/walkthroughtutorial.md @@ -39,6 +39,8 @@ The script will: 3. Create a Compute Engine VM instance with the specified configuration and startup script 4. Configure Nginx to serve Langflow on TCP port 8080 +> The process may take approximately 30 minutes to complete. Rest assured that progress is being made, and you'll be able to proceed once the process is finished. + In the next step, you'll learn how to connect to the Langflow VM. ## Connect to the Langflow VM From d427fa9972d4642160338e983e1298d5b8434c4b Mon Sep 17 00:00:00 2001 From: Robert Wilkins III <1147229+genome21@users.noreply.github.com> Date: Thu, 20 Apr 2023 03:36:27 +0000 Subject: [PATCH 29/50] more styling --- scripts/walkthroughtutorial.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/walkthroughtutorial.md b/scripts/walkthroughtutorial.md index 3731533c1..b53d3c6d2 100644 --- a/scripts/walkthroughtutorial.md +++ b/scripts/walkthroughtutorial.md @@ -39,7 +39,7 @@ The script will: 3. Create a Compute Engine VM instance with the specified configuration and startup script 4. Configure Nginx to serve Langflow on TCP port 8080 -> The process may take approximately 30 minutes to complete. Rest assured that progress is being made, and you'll be able to proceed once the process is finished. +> The process may take approximately 30 minutes to complete. Rest assured that progress is being made, and you'll be able to proceed once the process is finished. In the next step, you'll learn how to connect to the Langflow VM. @@ -75,7 +75,7 @@ gcloud compute routers delete nat-client --region us-central1 --quiet The following network settings and services are used during this walkthrough. If you plan to continue using the project after the walkthrough, you may keep these configurations in place. However, if you decide to remove them after completing the walkthrough, you can use the following gcloud commands: -> These commands will delete the firewall rules and network configurations created during the walkthrough. Make sure to run them only if you no longer need these settings. +> These commands will delete the firewall rules and network configurations created during the walkthrough. Make sure to run them only if you no longer need these settings. ``` gcloud compute firewall-rules delete allow-tcp-8080 --quiet From 573f0d6ee796910a051030a73e857b3610db270b Mon Sep 17 00:00:00 2001 From: Robert Wilkins III <1147229+genome21@users.noreply.github.com> Date: Thu, 20 Apr 2023 03:54:58 +0000 Subject: [PATCH 30/50] remove redundant wording --- GCP_DEPLOYMENT.md | 119 +------------------------------- scripts/gcp_setup_tutorial.yaml | 80 --------------------- 2 files changed, 2 insertions(+), 197 deletions(-) delete mode 100644 scripts/gcp_setup_tutorial.yaml diff --git a/GCP_DEPLOYMENT.md b/GCP_DEPLOYMENT.md index 6bbd54097..01686e4ed 100644 --- a/GCP_DEPLOYMENT.md +++ b/GCP_DEPLOYMENT.md @@ -1,122 +1,7 @@ # Running Langflow from a new Google Cloud project This guide will help you set up a Langflow Dev VM in a Google Cloud Platform project using Google Cloud Shell. -> When cloudshell opens, select **Trust this repo**. Some gcloud commands do not run in ephemeral cloudshell. +> When cloudshell opens, select **Trust repo**. Some gcloud commands do not run in ephemeral cloudshell. [![Open in Cloud Shell](https://gstatic.com/cloudssh/images/open-btn.svg)](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/genome21/langflow&working_dir=scripts&shellonly=true&tutorial=walkthroughtutorial.md) - -## Run the following in your GCP cloudshell: - -```bash -# Set the VM, image, and networking configuration -VM_NAME="langflow-dev" -IMAGE_FAMILY="debian-11" -IMAGE_PROJECT="debian-cloud" -BOOT_DISK_SIZE="100GB" -ZONE="us-central1-a" -REGION="us-central1" -VPC_NAME="default" -SUBNET_NAME="default" -SUBNET_RANGE="10.128.0.0/20" -NAT_GATEWAY_NAME="nat-gateway" -CLOUD_ROUTER_NAME="nat-client" - -# Set the GCP project's compute region -gcloud config set compute/region $REGION - -# Check if the VPC exists, and create it if not -vpc_exists=$(gcloud compute networks list --filter="name=$VPC_NAME" --format="value(name)") -if [[ -z "$vpc_exists" ]]; then - gcloud compute networks create $VPC_NAME --subnet-mode=custom -fi - -# Check if the subnet exists, and create it if not -subnet_exists=$(gcloud compute networks subnets list --filter="name=$SUBNET_NAME AND region=$REGION" --format="value(name)") -if [[ -z "$subnet_exists" ]]; then - gcloud compute networks subnets create $SUBNET_NAME --network=$VPC_NAME --region=$REGION --range=$SUBNET_RANGE -fi - -# Create a firewall rule to allow TCP port 8080 for all instances in the VPC -firewall_8080_exists=$(gcloud compute firewall-rules list --filter="name=allow-tcp-8080" --format="value(name)") -if [[ -z "$firewall_8080_exists" ]]; then - gcloud compute firewall-rules create allow-tcp-8080 --network $VPC_NAME --allow tcp:8080 --source-ranges 0.0.0.0/0 --direction INGRESS -fi - -# Create a firewall rule to allow IAP traffic -firewall_iap_exists=$(gcloud compute firewall-rules list --filter="name=allow-iap" --format="value(name)") -if [[ -z "$firewall_iap_exists" ]]; then - gcloud compute firewall-rules create allow-iap --network $VPC_NAME --allow tcp:80,tcp:443 --source-ranges 35.235.240.0/20 --direction INGRESS -fi - -# Create the Cloud Router and NAT Gateway -cloud_router_exists=$(gcloud compute routers list --filter="name=$CLOUD_ROUTER_NAME" --format="value(name)") -if [[ -z "$cloud_router_exists" ]]; then - gcloud compute routers create $CLOUD_ROUTER_NAME --network $VPC_NAME --region $REGION -fi - -nat_exists=$(gcloud compute routers list --filter="name=$CLOUD_ROUTER_NAME" --format="value(nats.name)") -if [[ -z "$nat_exists" ]]; then - gcloud compute routers nats create $NAT_GATEWAY_NAME --router $CLOUD_ROUTER_NAME --auto-allocate-nat-external-ips --nat-all-subnet-ip-ranges --enable-logging --region $REGION -fi - -# Define the startup script as a multiline Bash here-doc -STARTUP_SCRIPT=$(cat <<'EOF' -#!/bin/bash - -# Update and upgrade the system -apt -y update -apt -y upgrade - -# Install Python 3 pip, Langflow, and Nginx -apt -y install python3-pip -pip install langflow -apt-get -y install nginx - -# Configure Nginx for Langflow -touch /etc/nginx/sites-available/langflow-app -echo "server { - listen 0.0.0.0:8080; - - location / { - proxy_pass http://127.0.0.1:7860; - proxy_set_header Host "\$host"; - proxy_set_header X-Real-IP "\$remote_addr"; - proxy_set_header X-Forwarded-For "\$proxy_add_x_forwarded_for"; - } -}" >> /etc/nginx/sites-available/langflow-app -ln -s /etc/nginx/sites-available/langflow-app /etc/nginx/sites-enabled/ -sudo nginx -t -sudo systemctl restart nginx -langflow -EOF -) - -# Create a temporary file to store the startup script -tempfile=$(mktemp) -echo "$STARTUP_SCRIPT" > $tempfile - -# Create the VM instance with the specified configuration and startup script -gcloud compute instances create $VM_NAME \ - --image-family $IMAGE_FAMILY \ - --image-project $IMAGE_PROJECT \ - --boot-disk-size $BOOT_DISK_SIZE \ - --machine-type=n1-standard-4 \ - --metadata-from-file startup-script=$tempfile \ - --zone $ZONE \ - --network $VPC_NAME \ - --subnet $SUBNET_NAME - -# Remove the temporary file after the VM is created -rm $tempfile - -``` -> This script sets up a Debian-based VM with the Langflow package, Nginx, and the necessary configurations to run the Langflow Dev environment. The VM will be accessible on TCP port 8080 from any IP address. - -
- -## Connecting to your new Langflow VM -1. Navigate to the [VM instances](https://console.cloud.google.com/compute/instances) page -2. Click on the external IP for your VM -3. Add port 8080 (assuming your VM external IP is 192.168.0.1): -http://192.168.0.1:8080 -4. You will be greeted by the Langflow Dev environment \ No newline at end of file +This script sets up a Debian-based VM with the Langflow package, Nginx, and the necessary configurations to run the Langflow Dev environment. \ No newline at end of file diff --git a/scripts/gcp_setup_tutorial.yaml b/scripts/gcp_setup_tutorial.yaml deleted file mode 100644 index f8c5b401c..000000000 --- a/scripts/gcp_setup_tutorial.yaml +++ /dev/null @@ -1,80 +0,0 @@ -title: Deploy Langflow on Google Cloud Platform -duration: 45m -author: Your Name -environment: - cwd: working_dir - repo: - url: https://github.com/genome21/langflow - working_dir: scripts - -steps: -- title: Introduction - content: | - In this tutorial, you will learn how to deploy Langflow on Google Cloud Platform (GCP) using Google Cloud Shell. - - This tutorial assumes you have a GCP account and basic knowledge of Google Cloud Shell. If you're not familiar with Cloud Shell, you can review the [Cloud Shell documentation](https://cloud.google.com/shell/docs). - -- title: Set up your environment - content: | - Before you start, make sure you have the following prerequisites: - - - A GCP account with the necessary permissions to create resources - - A project on GCP where you want to deploy Langflow - - - - In the next step, you'll clone the Langflow repository and navigate to the `scripts` directory. - -- title: Clone the repository and navigate to the scripts directory - content: | - Run the following commands to clone the Langflow repository and navigate to the `scripts` directory: - - ``` - git clone https://github.com/genome21/langflow - cd langflow/scripts - ``` - - In the next step, you'll configure the GCP environment and deploy Langflow. - -- title: Configure the GCP environment and deploy Langflow - content: | - Run the `deploy_langflow_gcp.sh` script to configure the GCP environment and deploy Langflow: - - ``` - ./deploy_langflow_gcp.sh - ``` - - The script will: - - 1. Check if the required resources (VPC, subnet, firewall rules, and Cloud Router) exist and create them if needed - 2. Create a startup script to install Python, Langflow, and Nginx - 3. Create a Compute Engine VM instance with the specified configuration and startup script - 4. Configure Nginx to serve Langflow on TCP port 8080 - - In the next step, you'll learn how to connect to the Langflow VM. - -- title: Connect to the Langflow VM - content: | - To connect to your new Langflow VM, follow these steps: - - 1. Navigate to the [VM instances](https://console.cloud.google.com/compute/instances) page - 2. Click on the external IP for your VM - 3. Add port 8080 (assuming your VM external IP is 192.168.0.1): - http://192.168.0.1:8080 - 4. You will be greeted by the Langflow Dev environment - - Congratulations! You have successfully deployed Langflow on Google Cloud Platform. - -- title: Cleanup - content: | - If you want to remove the resources created during this tutorial, you can use the following commands: - - ``` - gcloud compute instances delete langflow-dev --zone us-central1-a --quiet - gcloud compute routers nats delete nat-gateway --router nat-client --region us-central1 --quiet - gcloud compute routers delete nat-client --region us-central1 --quiet - gcloud compute firewall-rules delete allow-tcp-8080 --quiet - gcloud compute firewall-rules delete allow-iap --quiet - gcloud compute networks subnets delete default --region us-central1 --quiet - gcloud compute networks delete default --quiet - `` From 207f1b03994bd129068c125228ec27e0b19b5181 Mon Sep 17 00:00:00 2001 From: Robert Wilkins III <1147229+genome21@users.noreply.github.com> Date: Thu, 20 Apr 2023 04:43:26 +0000 Subject: [PATCH 31/50] add spot instance support and pricing --- GCP_DEPLOYMENT.md | 31 +++++++-- scripts/deploy_langflow_gcp_spot.sh | 101 ++++++++++++++++++++++++++++ scripts/walkthroughtutorial.md | 7 +- scripts/walkthroughtutorial_spot.md | 88 ++++++++++++++++++++++++ 4 files changed, 221 insertions(+), 6 deletions(-) create mode 100644 scripts/deploy_langflow_gcp_spot.sh create mode 100644 scripts/walkthroughtutorial_spot.md diff --git a/GCP_DEPLOYMENT.md b/GCP_DEPLOYMENT.md index 01686e4ed..0491dabb0 100644 --- a/GCP_DEPLOYMENT.md +++ b/GCP_DEPLOYMENT.md @@ -1,7 +1,30 @@ -# Running Langflow from a new Google Cloud project -This guide will help you set up a Langflow Dev VM in a Google Cloud Platform project using Google Cloud Shell. -> When cloudshell opens, select **Trust repo**. Some gcloud commands do not run in ephemeral cloudshell. +# Run Langflow from a New Google Cloud Project +This guide will help you set up a Langflow development VM in a Google Cloud Platform project using Google Cloud Shell. + +> **Note**: When Cloud Shell opens, be sure to select **Trust repo**. Some `gcloud` commands might not run in an ephemeral Cloud Shell environment. + + +## Standard VM [![Open in Cloud Shell](https://gstatic.com/cloudssh/images/open-btn.svg)](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/genome21/langflow&working_dir=scripts&shellonly=true&tutorial=walkthroughtutorial.md) -This script sets up a Debian-based VM with the Langflow package, Nginx, and the necessary configurations to run the Langflow Dev environment. \ No newline at end of file +This script sets up a Debian-based VM with the Langflow package, Nginx, and the necessary configurations to run the Langflow Dev environment. +
+ +## Spot/Preemptible Instance + +[![Open in Cloud Shell - Spot Instance](https://gstatic.com/cloudssh/images/open-btn.svg)](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/genome21/langflow&working_dir=scripts&shellonly=true&tutorial=walkthroughtutorial.md) + +When running as a [spot (preemptible) instance](https://cloud.google.com/compute/docs/instances/preemptible), the code and VM will behave the same way as in a regular instance, executing the startup script to configure the environment, install necessary dependencies, and run the Langflow application. However, **due to the nature of spot instances, the VM may be terminated at any time if Google Cloud needs to reclaim the resources**. This makes spot instances suitable for fault-tolerant, stateless, or interruptible workloads that can handle unexpected terminations and restarts. + +## Pricing +
+ +| Component | Regular Cost (Hourly) | Regular Cost (Monthly) | Spot/Preemptible Cost (Hourly) | Spot/Preemptible Cost (Monthly) | Notes | +| -------------- | --------------------- | ---------------------- | ------------------------------ | ------------------------------- | ----- | +| 100 GB Disk | - | $10/month | - | $10/month | Disk cost remains the same for both regular and Spot/Preemptible VMs | +| VM (n1-standard-4) | $0.15/hr | ~$108/month | ~$0.04/hr | ~$29/month | The VM cost can be significantly reduced using a Spot/Preemptible instance | +| **Total** | **$0.15/hr** | **~$118/month** | **~$0.04/hr** | **~$39/month** | Total costs for running the VM and disk 24/7 for an entire month | + +> For a more accurate breakdown of costs, please use the [**GCP Pricing Calculator**](https://cloud.google.com/products/calculator) + diff --git a/scripts/deploy_langflow_gcp_spot.sh b/scripts/deploy_langflow_gcp_spot.sh new file mode 100644 index 000000000..7ddc93b96 --- /dev/null +++ b/scripts/deploy_langflow_gcp_spot.sh @@ -0,0 +1,101 @@ +# Set the VM, image, and networking configuration +VM_NAME="langflow-dev" +IMAGE_FAMILY="debian-11" +IMAGE_PROJECT="debian-cloud" +BOOT_DISK_SIZE="100GB" +ZONE="us-central1-a" +REGION="us-central1" +VPC_NAME="default" +SUBNET_NAME="default" +SUBNET_RANGE="10.128.0.0/20" +NAT_GATEWAY_NAME="nat-gateway" +CLOUD_ROUTER_NAME="nat-client" + +# Set the GCP project's compute region +gcloud config set compute/region $REGION + +# Check if the VPC exists, and create it if not +vpc_exists=$(gcloud compute networks list --filter="name=$VPC_NAME" --format="value(name)") +if [[ -z "$vpc_exists" ]]; then + gcloud compute networks create $VPC_NAME --subnet-mode=custom +fi + +# Check if the subnet exists, and create it if not +subnet_exists=$(gcloud compute networks subnets list --filter="name=$SUBNET_NAME AND region=$REGION" --format="value(name)") +if [[ -z "$subnet_exists" ]]; then + gcloud compute networks subnets create $SUBNET_NAME --network=$VPC_NAME --region=$REGION --range=$SUBNET_RANGE +fi + +# Create a firewall rule to allow TCP port 8080 for all instances in the VPC +firewall_8080_exists=$(gcloud compute firewall-rules list --filter="name=allow-tcp-8080" --format="value(name)") +if [[ -z "$firewall_8080_exists" ]]; then + gcloud compute firewall-rules create allow-tcp-8080 --network $VPC_NAME --allow tcp:8080 --source-ranges 0.0.0.0/0 --direction INGRESS +fi + +# Create a firewall rule to allow IAP traffic +firewall_iap_exists=$(gcloud compute firewall-rules list --filter="name=allow-iap" --format="value(name)") +if [[ -z "$firewall_iap_exists" ]]; then + gcloud compute firewall-rules create allow-iap --network $VPC_NAME --allow tcp:80,tcp:443 --source-ranges 35.235.240.0/20 --direction INGRESS +fi + +# Create the Cloud Router and NAT Gateway +cloud_router_exists=$(gcloud compute routers list --filter="name=$CLOUD_ROUTER_NAME" --format="value(name)") +if [[ -z "$cloud_router_exists" ]]; then + gcloud compute routers create $CLOUD_ROUTER_NAME --network $VPC_NAME --region $REGION +fi + +nat_exists=$(gcloud compute routers list --filter="name=$CLOUD_ROUTER_NAME" --format="value(nats.name)") +if [[ -z "$nat_exists" ]]; then + gcloud compute routers nats create $NAT_GATEWAY_NAME --router $CLOUD_ROUTER_NAME --auto-allocate-nat-external-ips --nat-all-subnet-ip-ranges --enable-logging --region $REGION +fi + +# Define the startup script as a multiline Bash here-doc +STARTUP_SCRIPT=$(cat <<'EOF' +#!/bin/bash + +# Update and upgrade the system +apt -y update +apt -y upgrade + +# Install Python 3 pip, Langflow, and Nginx +apt -y install python3-pip +pip install langflow +apt-get -y install nginx + +# Configure Nginx for Langflow +touch /etc/nginx/sites-available/langflow-app +echo "server { + listen 0.0.0.0:8080; + + location / { + proxy_pass http://127.0.0.1:7860; + proxy_set_header Host "\$host"; + proxy_set_header X-Real-IP "\$remote_addr"; + proxy_set_header X-Forwarded-For "\$proxy_add_x_forwarded_for"; + } +}" >> /etc/nginx/sites-available/langflow-app +ln -s /etc/nginx/sites-available/langflow-app /etc/nginx/sites-enabled/ +sudo nginx -t +sudo systemctl restart nginx +langflow +EOF +) + +# Create a temporary file to store the startup script +tempfile=$(mktemp) +echo "$STARTUP_SCRIPT" > $tempfile + +# Create the VM instance with the specified configuration and startup script +gcloud compute instances create $VM_NAME \ + --image-family $IMAGE_FAMILY \ + --image-project $IMAGE_PROJECT \ + --boot-disk-size $BOOT_DISK_SIZE \ + --machine-type=n1-standard-4 \ + --metadata-from-file startup-script=$tempfile \ + --zone $ZONE \ + --network $VPC_NAME \ + --subnet $SUBNET_NAME \ + -preemptible + +# Remove the temporary file after the VM is created +rm $tempfile diff --git a/scripts/walkthroughtutorial.md b/scripts/walkthroughtutorial.md index b53d3c6d2..0d619090f 100644 --- a/scripts/walkthroughtutorial.md +++ b/scripts/walkthroughtutorial.md @@ -39,7 +39,8 @@ The script will: 3. Create a Compute Engine VM instance with the specified configuration and startup script 4. Configure Nginx to serve Langflow on TCP port 8080 -> The process may take approximately 30 minutes to complete. Rest assured that progress is being made, and you'll be able to proceed once the process is finished. + +> The process may take approximately 30 minutes to complete. Rest assured that progress is being made, and you'll be able to proceed once the process is finished. In the next step, you'll learn how to connect to the Langflow VM. @@ -75,7 +76,9 @@ gcloud compute routers delete nat-client --region us-central1 --quiet The following network settings and services are used during this walkthrough. If you plan to continue using the project after the walkthrough, you may keep these configurations in place. However, if you decide to remove them after completing the walkthrough, you can use the following gcloud commands: -> These commands will delete the firewall rules and network configurations created during the walkthrough. Make sure to run them only if you no longer need these settings. + + +> These commands will delete the firewall rules and network configurations created during the walkthrough. Make sure to run them only if you no longer need these settings. ``` gcloud compute firewall-rules delete allow-tcp-8080 --quiet diff --git a/scripts/walkthroughtutorial_spot.md b/scripts/walkthroughtutorial_spot.md new file mode 100644 index 000000000..168a67046 --- /dev/null +++ b/scripts/walkthroughtutorial_spot.md @@ -0,0 +1,88 @@ +# Deploy Langflow on Google Cloud Platform + +**Duration**: 45 minutes +**Author**: [Robert Wilkins III](https://www.linkedin.com/in/robertwilkinsiii) + +## Introduction + +In this tutorial, you will learn how to deploy Langflow on [Google Cloud Platform](https://cloud.google.com/) (GCP) using Google Cloud Shell. + +This tutorial assumes you have a GCP account and basic knowledge of Google Cloud Shell. If you're not familiar with Cloud Shell, you can review the [Cloud Shell documentation](https://cloud.google.com/shell/docs). + +## Set up your environment + +Before you start, make sure you have the following prerequisites: + +- A GCP account with the necessary permissions to create resources +- A project on GCP where you want to deploy Langflow + +[**Select your GCP project**] + + + +In the next step, you'll configure the GCP environment and deploy Langflow. + +## Configure the GCP environment and deploy Langflow +Run the deploy_langflow_gcp_spot.sh script to configure the GCP environment and deploy Langflow: + +```sh +gcloud config set project +bash ./deploy_langflow_gcp.sh +``` + +The script will: + +1. Check if the required resources (VPC, subnet, firewall rules, and Cloud Router) exist and create them if needed +2. Create a startup script to install Python, Langflow, and Nginx +3. Create a Compute Engine VM instance with the specified configuration and startup script +4. Configure Nginx to serve Langflow on TCP port 8080 + +> The process may take approximately 30 minutes to complete. Rest assured that progress is being made, and you'll be able to proceed once the process is finished. + +In the next step, you'll learn how to connect to the Langflow VM. + +## Connect to the Langflow VM +To connect to your new Langflow VM, follow these steps: + +1. Navigate to the [VM instances](https://console.cloud.google.com/compute/instances) page and click on the external IP for your VM. Make sure to use HTTP and set the port to 8080 +
**or** +3. Run the following command to display the URL for your Langflow environment: +```bash +export LANGFLOW_IP=$(gcloud compute instances list --filter="NAME=langflow-dev" --format="value(EXTERNAL_IP)") + +echo http://$LANGFLOW_IP:8080 +``` + +4. Click on the Langflow URL in cloudshell to be greeted by the Langflow Dev environment + +Congratulations! You have successfully deployed Langflow on Google Cloud Platform. + + + +## Cleanup +If you want to remove the resources created during this tutorial, you can use the following commands: + +```sql +gcloud compute instances delete langflow-dev --zone us-central1-a --quiet + +gcloud compute routers nats delete nat-gateway --router nat-client --region us-central1 --quiet + +gcloud compute routers delete nat-client --region us-central1 --quiet + +``` +The following network settings and services are used during this walkthrough. If you plan to continue using the project after the walkthrough, you may keep these configurations in place. + +However, if you decide to remove them after completing the walkthrough, you can use the following gcloud commands: +> These commands will delete the firewall rules and network configurations created during the walkthrough. Make sure to run them only if you no longer need these settings. + +``` +gcloud compute firewall-rules delete allow-tcp-8080 --quiet + +gcloud compute firewall-rules delete allow-iap --quiet + +gcloud compute networks subnets delete default --region us-central1 --quiet + +gcloud compute networks delete default --quiet +``` From de5ed466d71471631ecb60d68b2ba0bc5325b10c Mon Sep 17 00:00:00 2001 From: Robert Wilkins III <1147229+genome21@users.noreply.github.com> Date: Thu, 20 Apr 2023 05:10:38 +0000 Subject: [PATCH 32/50] improve grammer and remove nat --- README.md | 7 ++++--- scripts/deploy_langflow_gcp.sh | 11 ----------- scripts/deploy_langflow_gcp_spot.sh | 11 ----------- scripts/walkthroughtutorial.md | 5 ----- 4 files changed, 4 insertions(+), 30 deletions(-) diff --git a/README.md b/README.md index eaaf84331..3be5d99a9 100644 --- a/README.md +++ b/README.md @@ -30,11 +30,12 @@ Next, run: ### Deploy Langflow on Google Cloud Platform -Follow our step-by-step guide to deploy Langflow on Google Cloud Platform (GCP) using Google Cloud Shell. The guide is available in the [Langflow in Google Cloud Platform](GCP_DEPLOYMENT.md) document. +Follow our step-by-step guide to deploy Langflow on Google Cloud Platform (GCP) using Google Cloud Shell. The guide is available in the [**Langflow in Google Cloud Platform**](GCP_DEPLOYMENT.md) document. -Alternatively, click the "Open in Cloud Shell" button below to launch Google Cloud Shell, clone the Langflow repository, and start an interactive tutorial that will guide you through the process of setting up the necessary resources and deploying Langflow on your GCP project. +Alternatively, click the **"Open in Cloud Shell"** button below to launch Google Cloud Shell, clone the Langflow repository, and start an **interactive tutorial** that will guide you through the process of setting up the necessary resources and deploying Langflow on your GCP project. + +[![Open in Cloud Shell](https://gstatic.com/cloudssh/images/open-btn.svg)](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/genome21/langflow&working_dir=scripts&shellonly=true&tutorial=walkthroughtutorial_spot.md) -[![Open in Cloud Shell](https://gstatic.com/cloudssh/images/open-btn.svg)](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/genome21/langflow&working_dir=scripts&shellonly=true&tutorial=GCP_SETUP_TUTORIAL.md) ## 🎨 Creating Flows diff --git a/scripts/deploy_langflow_gcp.sh b/scripts/deploy_langflow_gcp.sh index 3e20e9589..2c3dc0420 100644 --- a/scripts/deploy_langflow_gcp.sh +++ b/scripts/deploy_langflow_gcp.sh @@ -38,17 +38,6 @@ if [[ -z "$firewall_iap_exists" ]]; then gcloud compute firewall-rules create allow-iap --network $VPC_NAME --allow tcp:80,tcp:443 --source-ranges 35.235.240.0/20 --direction INGRESS fi -# Create the Cloud Router and NAT Gateway -cloud_router_exists=$(gcloud compute routers list --filter="name=$CLOUD_ROUTER_NAME" --format="value(name)") -if [[ -z "$cloud_router_exists" ]]; then - gcloud compute routers create $CLOUD_ROUTER_NAME --network $VPC_NAME --region $REGION -fi - -nat_exists=$(gcloud compute routers list --filter="name=$CLOUD_ROUTER_NAME" --format="value(nats.name)") -if [[ -z "$nat_exists" ]]; then - gcloud compute routers nats create $NAT_GATEWAY_NAME --router $CLOUD_ROUTER_NAME --auto-allocate-nat-external-ips --nat-all-subnet-ip-ranges --enable-logging --region $REGION -fi - # Define the startup script as a multiline Bash here-doc STARTUP_SCRIPT=$(cat <<'EOF' #!/bin/bash diff --git a/scripts/deploy_langflow_gcp_spot.sh b/scripts/deploy_langflow_gcp_spot.sh index 7ddc93b96..065b6013f 100644 --- a/scripts/deploy_langflow_gcp_spot.sh +++ b/scripts/deploy_langflow_gcp_spot.sh @@ -38,17 +38,6 @@ if [[ -z "$firewall_iap_exists" ]]; then gcloud compute firewall-rules create allow-iap --network $VPC_NAME --allow tcp:80,tcp:443 --source-ranges 35.235.240.0/20 --direction INGRESS fi -# Create the Cloud Router and NAT Gateway -cloud_router_exists=$(gcloud compute routers list --filter="name=$CLOUD_ROUTER_NAME" --format="value(name)") -if [[ -z "$cloud_router_exists" ]]; then - gcloud compute routers create $CLOUD_ROUTER_NAME --network $VPC_NAME --region $REGION -fi - -nat_exists=$(gcloud compute routers list --filter="name=$CLOUD_ROUTER_NAME" --format="value(nats.name)") -if [[ -z "$nat_exists" ]]; then - gcloud compute routers nats create $NAT_GATEWAY_NAME --router $CLOUD_ROUTER_NAME --auto-allocate-nat-external-ips --nat-all-subnet-ip-ranges --enable-logging --region $REGION -fi - # Define the startup script as a multiline Bash here-doc STARTUP_SCRIPT=$(cat <<'EOF' #!/bin/bash diff --git a/scripts/walkthroughtutorial.md b/scripts/walkthroughtutorial.md index 0d619090f..fa6e3c11d 100644 --- a/scripts/walkthroughtutorial.md +++ b/scripts/walkthroughtutorial.md @@ -67,11 +67,6 @@ If you want to remove the resources created during this tutorial, you can use th ```sql gcloud compute instances delete langflow-dev --zone us-central1-a --quiet - -gcloud compute routers nats delete nat-gateway --router nat-client --region us-central1 --quiet - -gcloud compute routers delete nat-client --region us-central1 --quiet - ``` The following network settings and services are used during this walkthrough. If you plan to continue using the project after the walkthrough, you may keep these configurations in place. From 7e3ea1071922093ec06a4e8ce99540cac1621e82 Mon Sep 17 00:00:00 2001 From: Robert Wilkins III <1147229+genome21@users.noreply.github.com> Date: Thu, 20 Apr 2023 05:11:28 +0000 Subject: [PATCH 33/50] remove the nats --- scripts/walkthroughtutorial_spot.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/scripts/walkthroughtutorial_spot.md b/scripts/walkthroughtutorial_spot.md index 168a67046..751f03d78 100644 --- a/scripts/walkthroughtutorial_spot.md +++ b/scripts/walkthroughtutorial_spot.md @@ -66,11 +66,6 @@ If you want to remove the resources created during this tutorial, you can use th ```sql gcloud compute instances delete langflow-dev --zone us-central1-a --quiet - -gcloud compute routers nats delete nat-gateway --router nat-client --region us-central1 --quiet - -gcloud compute routers delete nat-client --region us-central1 --quiet - ``` The following network settings and services are used during this walkthrough. If you plan to continue using the project after the walkthrough, you may keep these configurations in place. From 9869c59e6d851ee88efe2d175e8afeca089a902b Mon Sep 17 00:00:00 2001 From: Robert Wilkins III <1147229+genome21@users.noreply.github.com> Date: Thu, 20 Apr 2023 05:14:37 +0000 Subject: [PATCH 34/50] layout changes --- GCP_DEPLOYMENT.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/GCP_DEPLOYMENT.md b/GCP_DEPLOYMENT.md index 0491dabb0..edb7e043c 100644 --- a/GCP_DEPLOYMENT.md +++ b/GCP_DEPLOYMENT.md @@ -17,7 +17,8 @@ This script sets up a Debian-based VM with the Langflow package, Nginx, and the When running as a [spot (preemptible) instance](https://cloud.google.com/compute/docs/instances/preemptible), the code and VM will behave the same way as in a regular instance, executing the startup script to configure the environment, install necessary dependencies, and run the Langflow application. However, **due to the nature of spot instances, the VM may be terminated at any time if Google Cloud needs to reclaim the resources**. This makes spot instances suitable for fault-tolerant, stateless, or interruptible workloads that can handle unexpected terminations and restarts. -## Pricing +## Pricing (approximate) +> For a more accurate breakdown of costs, please use the [**GCP Pricing Calculator**](https://cloud.google.com/products/calculator)
| Component | Regular Cost (Hourly) | Regular Cost (Monthly) | Spot/Preemptible Cost (Hourly) | Spot/Preemptible Cost (Monthly) | Notes | @@ -25,6 +26,3 @@ When running as a [spot (preemptible) instance](https://cloud.google.com/compute | 100 GB Disk | - | $10/month | - | $10/month | Disk cost remains the same for both regular and Spot/Preemptible VMs | | VM (n1-standard-4) | $0.15/hr | ~$108/month | ~$0.04/hr | ~$29/month | The VM cost can be significantly reduced using a Spot/Preemptible instance | | **Total** | **$0.15/hr** | **~$118/month** | **~$0.04/hr** | **~$39/month** | Total costs for running the VM and disk 24/7 for an entire month | - -> For a more accurate breakdown of costs, please use the [**GCP Pricing Calculator**](https://cloud.google.com/products/calculator) - From edea1fcbf405e510111557a053a214dd21b01ebf Mon Sep 17 00:00:00 2001 From: PHYYOU <34825352+phyyou@users.noreply.github.com> Date: Sun, 14 May 2023 19:22:59 +0900 Subject: [PATCH 35/50] Update llama-cpp-python version in pyproject.toml Ref: https://github.com/abetlen/llama-cpp-python/issues/45 llama-cpp-python version 0.1.23 has issue at installing package --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 1e819234a..7283ed76b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -37,7 +37,7 @@ pandas = "^1.5.3" chromadb = "^0.3.21" huggingface-hub = "^0.13.3" rich = "^13.3.3" -llama-cpp-python = "0.1.23" +llama-cpp-python = "0.1.50" networkx = "^3.1" unstructured = "^0.5.11" pypdf = "^3.7.1" From 5445f509284a0575a1f6a17715f4158f8b2be9a7 Mon Sep 17 00:00:00 2001 From: Robert Wilkins III <1147229+genome21@users.noreply.github.com> Date: Sun, 14 May 2023 21:10:08 +0000 Subject: [PATCH 36/50] fix GCP walkthrough location --- GCP_DEPLOYMENT.md | 4 ++-- README.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/GCP_DEPLOYMENT.md b/GCP_DEPLOYMENT.md index edb7e043c..36c81e19f 100644 --- a/GCP_DEPLOYMENT.md +++ b/GCP_DEPLOYMENT.md @@ -6,14 +6,14 @@ This guide will help you set up a Langflow development VM in a Google Cloud Plat ## Standard VM -[![Open in Cloud Shell](https://gstatic.com/cloudssh/images/open-btn.svg)](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/genome21/langflow&working_dir=scripts&shellonly=true&tutorial=walkthroughtutorial.md) +[![Open in Cloud Shell](https://gstatic.com/cloudssh/images/open-btn.svg)](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/logspace-ai/langflow&working_dir=scripts&shellonly=true&tutorial=walkthroughtutorial.md) This script sets up a Debian-based VM with the Langflow package, Nginx, and the necessary configurations to run the Langflow Dev environment.
## Spot/Preemptible Instance -[![Open in Cloud Shell - Spot Instance](https://gstatic.com/cloudssh/images/open-btn.svg)](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/genome21/langflow&working_dir=scripts&shellonly=true&tutorial=walkthroughtutorial.md) +[![Open in Cloud Shell - Spot Instance](https://gstatic.com/cloudssh/images/open-btn.svg)](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/genome21/langflow&working_dir=scripts&shellonly=true&tutorial=walkthroughtutorial_spot.md) When running as a [spot (preemptible) instance](https://cloud.google.com/compute/docs/instances/preemptible), the code and VM will behave the same way as in a regular instance, executing the startup script to configure the environment, install necessary dependencies, and run the Langflow application. However, **due to the nature of spot instances, the VM may be terminated at any time if Google Cloud needs to reclaim the resources**. This makes spot instances suitable for fault-tolerant, stateless, or interruptible workloads that can handle unexpected terminations and restarts. diff --git a/README.md b/README.md index a4e1c8868..de98f87a1 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,7 @@ Follow our step-by-step guide to deploy Langflow on Google Cloud Platform (GCP) Alternatively, click the **"Open in Cloud Shell"** button below to launch Google Cloud Shell, clone the Langflow repository, and start an **interactive tutorial** that will guide you through the process of setting up the necessary resources and deploying Langflow on your GCP project. -[![Open in Cloud Shell](https://gstatic.com/cloudssh/images/open-btn.svg)](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/genome21/langflow&working_dir=scripts&shellonly=true&tutorial=walkthroughtutorial_spot.md) +[![Open in Cloud Shell](https://gstatic.com/cloudssh/images/open-btn.svg)](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/logspace-ai/langflow&working_dir=scripts&shellonly=true&tutorial=walkthroughtutorial_spot.md) ### Deploy Langflow on Google Cloud Platform From 2fdce4b14653c85e6b8c7bf70a76d843a39a419b Mon Sep 17 00:00:00 2001 From: Robert Wilkins III <1147229+genome21@users.noreply.github.com> Date: Sun, 14 May 2023 21:24:23 +0000 Subject: [PATCH 37/50] update gcp script for spot instance --- scripts/deploy_langflow_gcp_spot.sh | 2 +- scripts/walkthroughtutorial_spot.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/deploy_langflow_gcp_spot.sh b/scripts/deploy_langflow_gcp_spot.sh index 065b6013f..317540a58 100644 --- a/scripts/deploy_langflow_gcp_spot.sh +++ b/scripts/deploy_langflow_gcp_spot.sh @@ -84,7 +84,7 @@ gcloud compute instances create $VM_NAME \ --zone $ZONE \ --network $VPC_NAME \ --subnet $SUBNET_NAME \ - -preemptible + --preemptible # Remove the temporary file after the VM is created rm $tempfile diff --git a/scripts/walkthroughtutorial_spot.md b/scripts/walkthroughtutorial_spot.md index 751f03d78..a08d95770 100644 --- a/scripts/walkthroughtutorial_spot.md +++ b/scripts/walkthroughtutorial_spot.md @@ -29,7 +29,7 @@ Run the deploy_langflow_gcp_spot.sh script to configure the GCP environment and ```sh gcloud config set project -bash ./deploy_langflow_gcp.sh +bash ./deploy_langflow_gcp_spot.sh ``` The script will: From 51ef093628cda3fcaf2e9c6cb9dcc8de6d7e9249 Mon Sep 17 00:00:00 2001 From: Robert Wilkins III <1147229+genome21@users.noreply.github.com> Date: Sun, 14 May 2023 21:48:22 +0000 Subject: [PATCH 38/50] test without nginx --- scripts/deploy_langflow_gcp_spot.sh | 32 ++++++++++++++--------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/scripts/deploy_langflow_gcp_spot.sh b/scripts/deploy_langflow_gcp_spot.sh index 317540a58..1b3e5c92c 100644 --- a/scripts/deploy_langflow_gcp_spot.sh +++ b/scripts/deploy_langflow_gcp_spot.sh @@ -49,24 +49,24 @@ apt -y upgrade # Install Python 3 pip, Langflow, and Nginx apt -y install python3-pip pip install langflow -apt-get -y install nginx +# apt-get -y install nginx -# Configure Nginx for Langflow -touch /etc/nginx/sites-available/langflow-app -echo "server { - listen 0.0.0.0:8080; +# # Configure Nginx for Langflow +# touch /etc/nginx/sites-available/langflow-app +# echo "server { +# listen 0.0.0.0:8080; - location / { - proxy_pass http://127.0.0.1:7860; - proxy_set_header Host "\$host"; - proxy_set_header X-Real-IP "\$remote_addr"; - proxy_set_header X-Forwarded-For "\$proxy_add_x_forwarded_for"; - } -}" >> /etc/nginx/sites-available/langflow-app -ln -s /etc/nginx/sites-available/langflow-app /etc/nginx/sites-enabled/ -sudo nginx -t -sudo systemctl restart nginx -langflow +# location / { +# proxy_pass http://127.0.0.1:7860; +# proxy_set_header Host "\$host"; +# proxy_set_header X-Real-IP "\$remote_addr"; +# proxy_set_header X-Forwarded-For "\$proxy_add_x_forwarded_for"; +# } +# }" >> /etc/nginx/sites-available/langflow-app +# ln -s /etc/nginx/sites-available/langflow-app /etc/nginx/sites-enabled/ +# sudo nginx -t +# sudo systemctl restart nginx +langflow --host 0.0.0.0 --port 7860 EOF ) From 0803416870e9575ea408ca38c67a6bccbe4d0625 Mon Sep 17 00:00:00 2001 From: Robert Wilkins III <1147229+genome21@users.noreply.github.com> Date: Sun, 14 May 2023 21:50:12 +0000 Subject: [PATCH 39/50] adjust firewall rules for native port --- scripts/deploy_langflow_gcp_spot.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/deploy_langflow_gcp_spot.sh b/scripts/deploy_langflow_gcp_spot.sh index 1b3e5c92c..f43b54c21 100644 --- a/scripts/deploy_langflow_gcp_spot.sh +++ b/scripts/deploy_langflow_gcp_spot.sh @@ -27,9 +27,9 @@ if [[ -z "$subnet_exists" ]]; then fi # Create a firewall rule to allow TCP port 8080 for all instances in the VPC -firewall_8080_exists=$(gcloud compute firewall-rules list --filter="name=allow-tcp-8080" --format="value(name)") -if [[ -z "$firewall_8080_exists" ]]; then - gcloud compute firewall-rules create allow-tcp-8080 --network $VPC_NAME --allow tcp:8080 --source-ranges 0.0.0.0/0 --direction INGRESS +firewall_7860_exists=$(gcloud compute firewall-rules list --filter="name=allow-tcp-7860" --format="value(name)") +if [[ -z "$firewall_7860_exists" ]]; then + gcloud compute firewall-rules create allow-tcp-7860 --network $VPC_NAME --allow tcp:7860 --source-ranges 0.0.0.0/0 --direction INGRESS fi # Create a firewall rule to allow IAP traffic From 4aaa2c280dab5b07f5b234b2bb7d052c5c6c88e9 Mon Sep 17 00:00:00 2001 From: Robert Wilkins III <1147229+genome21@users.noreply.github.com> Date: Sun, 14 May 2023 22:08:13 +0000 Subject: [PATCH 40/50] GPC Shell Script - Websocket Connection Failure #300 --- scripts/deploy_langflow_gcp.sh | 29 ++++++----------------------- scripts/deploy_langflow_gcp_spot.sh | 21 ++------------------- scripts/walkthroughtutorial.md | 8 ++++---- scripts/walkthroughtutorial_spot.md | 8 ++++---- 4 files changed, 16 insertions(+), 50 deletions(-) diff --git a/scripts/deploy_langflow_gcp.sh b/scripts/deploy_langflow_gcp.sh index 2c3dc0420..fbf87099a 100644 --- a/scripts/deploy_langflow_gcp.sh +++ b/scripts/deploy_langflow_gcp.sh @@ -26,16 +26,16 @@ if [[ -z "$subnet_exists" ]]; then gcloud compute networks subnets create $SUBNET_NAME --network=$VPC_NAME --region=$REGION --range=$SUBNET_RANGE fi -# Create a firewall rule to allow TCP port 8080 for all instances in the VPC -firewall_8080_exists=$(gcloud compute firewall-rules list --filter="name=allow-tcp-8080" --format="value(name)") -if [[ -z "$firewall_8080_exists" ]]; then - gcloud compute firewall-rules create allow-tcp-8080 --network $VPC_NAME --allow tcp:8080 --source-ranges 0.0.0.0/0 --direction INGRESS +# Create a firewall rule to allow TCP port 7860 for all instances in the VPC +firewall_7860_exists=$(gcloud compute firewall-rules list --filter="name=allow-tcp-7860" --format="value(name)") +if [[ -z "$firewall_7860_exists" ]]; then + gcloud compute firewall-rules create allow-tcp-7860 --network $VPC_NAME --allow tcp:7860 --source-ranges 0.0.0.0/0 --direction INGRESS fi # Create a firewall rule to allow IAP traffic firewall_iap_exists=$(gcloud compute firewall-rules list --filter="name=allow-iap" --format="value(name)") if [[ -z "$firewall_iap_exists" ]]; then - gcloud compute firewall-rules create allow-iap --network $VPC_NAME --allow tcp:80,tcp:443 --source-ranges 35.235.240.0/20 --direction INGRESS + gcloud compute firewall-rules create allow-iap --network $VPC_NAME --allow tcp:80,tcp:443,tcp:22,:tcp:3389 --source-ranges 35.235.240.0/20 --direction INGRESS fi # Define the startup script as a multiline Bash here-doc @@ -49,24 +49,7 @@ apt -y upgrade # Install Python 3 pip, Langflow, and Nginx apt -y install python3-pip pip install langflow -apt-get -y install nginx - -# Configure Nginx for Langflow -touch /etc/nginx/sites-available/langflow-app -echo "server { - listen 0.0.0.0:8080; - - location / { - proxy_pass http://127.0.0.1:7860; - proxy_set_header Host "\$host"; - proxy_set_header X-Real-IP "\$remote_addr"; - proxy_set_header X-Forwarded-For "\$proxy_add_x_forwarded_for"; - } -}" >> /etc/nginx/sites-available/langflow-app -ln -s /etc/nginx/sites-available/langflow-app /etc/nginx/sites-enabled/ -sudo nginx -t -sudo systemctl restart nginx -langflow +langflow --host 0.0.0.0 --port 7860 EOF ) diff --git a/scripts/deploy_langflow_gcp_spot.sh b/scripts/deploy_langflow_gcp_spot.sh index f43b54c21..9291ddcc3 100644 --- a/scripts/deploy_langflow_gcp_spot.sh +++ b/scripts/deploy_langflow_gcp_spot.sh @@ -26,7 +26,7 @@ if [[ -z "$subnet_exists" ]]; then gcloud compute networks subnets create $SUBNET_NAME --network=$VPC_NAME --region=$REGION --range=$SUBNET_RANGE fi -# Create a firewall rule to allow TCP port 8080 for all instances in the VPC +# Create a firewall rule to allow TCP port 7860 for all instances in the VPC firewall_7860_exists=$(gcloud compute firewall-rules list --filter="name=allow-tcp-7860" --format="value(name)") if [[ -z "$firewall_7860_exists" ]]; then gcloud compute firewall-rules create allow-tcp-7860 --network $VPC_NAME --allow tcp:7860 --source-ranges 0.0.0.0/0 --direction INGRESS @@ -35,7 +35,7 @@ fi # Create a firewall rule to allow IAP traffic firewall_iap_exists=$(gcloud compute firewall-rules list --filter="name=allow-iap" --format="value(name)") if [[ -z "$firewall_iap_exists" ]]; then - gcloud compute firewall-rules create allow-iap --network $VPC_NAME --allow tcp:80,tcp:443 --source-ranges 35.235.240.0/20 --direction INGRESS + gcloud compute firewall-rules create allow-iap --network $VPC_NAME --allow tcp:80,tcp:443,tcp:22,:tcp:3389 --source-ranges 35.235.240.0/20 --direction INGRESS fi # Define the startup script as a multiline Bash here-doc @@ -49,23 +49,6 @@ apt -y upgrade # Install Python 3 pip, Langflow, and Nginx apt -y install python3-pip pip install langflow -# apt-get -y install nginx - -# # Configure Nginx for Langflow -# touch /etc/nginx/sites-available/langflow-app -# echo "server { -# listen 0.0.0.0:8080; - -# location / { -# proxy_pass http://127.0.0.1:7860; -# proxy_set_header Host "\$host"; -# proxy_set_header X-Real-IP "\$remote_addr"; -# proxy_set_header X-Forwarded-For "\$proxy_add_x_forwarded_for"; -# } -# }" >> /etc/nginx/sites-available/langflow-app -# ln -s /etc/nginx/sites-available/langflow-app /etc/nginx/sites-enabled/ -# sudo nginx -t -# sudo systemctl restart nginx langflow --host 0.0.0.0 --port 7860 EOF ) diff --git a/scripts/walkthroughtutorial.md b/scripts/walkthroughtutorial.md index fa6e3c11d..83ea3086a 100644 --- a/scripts/walkthroughtutorial.md +++ b/scripts/walkthroughtutorial.md @@ -37,7 +37,7 @@ The script will: 1. Check if the required resources (VPC, subnet, firewall rules, and Cloud Router) exist and create them if needed 2. Create a startup script to install Python, Langflow, and Nginx 3. Create a Compute Engine VM instance with the specified configuration and startup script -4. Configure Nginx to serve Langflow on TCP port 8080 +4. Run Langflow to serve content on TCP port 7860 > The process may take approximately 30 minutes to complete. Rest assured that progress is being made, and you'll be able to proceed once the process is finished. @@ -47,13 +47,13 @@ In the next step, you'll learn how to connect to the Langflow VM. ## Connect to the Langflow VM To connect to your new Langflow VM, follow these steps: -1. Navigate to the [VM instances](https://console.cloud.google.com/compute/instances) page and click on the external IP for your VM. Make sure to use HTTP and set the port to 8080 +1. Navigate to the [VM instances](https://console.cloud.google.com/compute/instances) page and click on the external IP for your VM. Make sure to use HTTP and set the port to 7860
**or** 3. Run the following command to display the URL for your Langflow environment: ```bash export LANGFLOW_IP=$(gcloud compute instances list --filter="NAME=langflow-dev" --format="value(EXTERNAL_IP)") -echo http://$LANGFLOW_IP:8080 +echo http://$LANGFLOW_IP:7860 ``` 4. Click on the Langflow URL in cloudshell to be greeted by the Langflow Dev environment @@ -76,7 +76,7 @@ However, if you decide to remove them after completing the walkthrough, you can > These commands will delete the firewall rules and network configurations created during the walkthrough. Make sure to run them only if you no longer need these settings. ``` -gcloud compute firewall-rules delete allow-tcp-8080 --quiet +gcloud compute firewall-rules delete allow-tcp-7860 --quiet gcloud compute firewall-rules delete allow-iap --quiet diff --git a/scripts/walkthroughtutorial_spot.md b/scripts/walkthroughtutorial_spot.md index a08d95770..3792bc1ca 100644 --- a/scripts/walkthroughtutorial_spot.md +++ b/scripts/walkthroughtutorial_spot.md @@ -37,7 +37,7 @@ The script will: 1. Check if the required resources (VPC, subnet, firewall rules, and Cloud Router) exist and create them if needed 2. Create a startup script to install Python, Langflow, and Nginx 3. Create a Compute Engine VM instance with the specified configuration and startup script -4. Configure Nginx to serve Langflow on TCP port 8080 +4. Run Langflow to serve content on TCP port 7860 > The process may take approximately 30 minutes to complete. Rest assured that progress is being made, and you'll be able to proceed once the process is finished. @@ -46,13 +46,13 @@ In the next step, you'll learn how to connect to the Langflow VM. ## Connect to the Langflow VM To connect to your new Langflow VM, follow these steps: -1. Navigate to the [VM instances](https://console.cloud.google.com/compute/instances) page and click on the external IP for your VM. Make sure to use HTTP and set the port to 8080 +1. Navigate to the [VM instances](https://console.cloud.google.com/compute/instances) page and click on the external IP for your VM. Make sure to use HTTP and set the port to 7860
**or** 3. Run the following command to display the URL for your Langflow environment: ```bash export LANGFLOW_IP=$(gcloud compute instances list --filter="NAME=langflow-dev" --format="value(EXTERNAL_IP)") -echo http://$LANGFLOW_IP:8080 +echo http://$LANGFLOW_IP:7860 ``` 4. Click on the Langflow URL in cloudshell to be greeted by the Langflow Dev environment @@ -73,7 +73,7 @@ However, if you decide to remove them after completing the walkthrough, you can > These commands will delete the firewall rules and network configurations created during the walkthrough. Make sure to run them only if you no longer need these settings. ``` -gcloud compute firewall-rules delete allow-tcp-8080 --quiet +gcloud compute firewall-rules delete allow-tcp-7860 --quiet gcloud compute firewall-rules delete allow-iap --quiet From 5049e59530719d5d6928c7192066976d7407f592 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Mon, 15 May 2023 08:00:24 -0300 Subject: [PATCH 41/50] Update Dockerfile Update Dockerfile to help with deployment --- Dockerfile | 65 +++++++++--------------------------------------------- 1 file changed, 10 insertions(+), 55 deletions(-) diff --git a/Dockerfile b/Dockerfile index afda829b8..1b713c3a0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,59 +1,14 @@ -# FROM logspace/backend_build as backend_build -FROM logspace/frontend_build as frontend_build +FROM python:3.10-slim -# `python-base` sets up all our shared environment variables -FROM python:3.10-slim as langflow_build +RUN apt-get update && apt-get install gcc g++ git make -y +RUN useradd -m -u 1000 user +USER user +ENV HOME=/home/user \ + PATH=/home/user/.local/bin:$PATH -# python -ENV PYTHONUNBUFFERED=1 \ - # prevents python creating .pyc files - PYTHONDONTWRITEBYTECODE=1 \ - \ - # pip - PIP_NO_CACHE_DIR=off \ - PIP_DISABLE_PIP_VERSION_CHECK=on \ - PIP_DEFAULT_TIMEOUT=100 \ - \ - # poetry - # https://python-poetry.org/docs/configuration/#using-environment-variables - POETRY_VERSION=1.4.0 \ - # make poetry install to this location - POETRY_HOME="/opt/poetry" \ - # make poetry create the virtual environment in the project's root - # it gets named `.venv` - POETRY_VIRTUALENVS_IN_PROJECT=true \ - # do not ask any interactive question - POETRY_NO_INTERACTION=1 \ - \ - # paths - # this is where our requirements + virtual environment will live - PYSETUP_PATH="/opt/pysetup" \ - VENV_PATH="/opt/pysetup/.venv" +WORKDIR $HOME/app -# prepend poetry and venv to path -ENV PATH="$POETRY_HOME/bin:$VENV_PATH/bin:$PATH" +COPY --chown=user . $HOME/app -RUN apt-get update \ - && apt-get install --no-install-recommends -y \ - # deps for installing poetry - curl \ - # deps for building python deps - build-essential libpq-dev git - -# install poetry - respects $POETRY_VERSION & $POETRY_HOME -# RUN curl -sSL https://install.python-poetry.org | python3 - - -# copy project requirement files here to ensure they will be cached. -WORKDIR /app -COPY pyproject.toml ./ -# copy langflow -COPY ./langflow ./langflow - -# Copy files from frontend -COPY --from=frontend_build /app/build /app/src/frontend/build/ - -RUN pip install . - -EXPOSE 5003 - -CMD [ "langflow" ] +RUN pip install langflow>==0.0.71 -U --user +CMD ["langflow", "--host", "0.0.0.0", "--port", "7860"] From aac72b894a0abfddba7f05309ffc960e73b6d613 Mon Sep 17 00:00:00 2001 From: Gabriel Almeida Date: Mon, 15 May 2023 10:10:00 -0300 Subject: [PATCH 42/50] style(ApiModal): fix indentation in SyntaxHighlighter className prop refactor(ApiModal): add json import to pythonApiCode to fix json.loads error --- src/frontend/src/modals/ApiModal/index.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/frontend/src/modals/ApiModal/index.tsx b/src/frontend/src/modals/ApiModal/index.tsx index f64bf9951..c2c273f5b 100644 --- a/src/frontend/src/modals/ApiModal/index.tsx +++ b/src/frontend/src/modals/ApiModal/index.tsx @@ -45,6 +45,7 @@ export default function ApiModal({ flowName }) { } const pythonApiCode = `import requests +import json API_URL = "${window.location.protocol}//${window.location.host}/predict" @@ -57,7 +58,7 @@ def predict(message): print(predict("Your message"))`; -const pythonCode = `from langflow import load_flow_from_json + const pythonCode = `from langflow import load_flow_from_json flow = load_flow_from_json("${flowName}.json") # Now you can use it like any chain @@ -165,7 +166,7 @@ flow("Hey, have you heard of LangFlow?")`; Date: Mon, 15 May 2023 10:11:06 -0300 Subject: [PATCH 43/50] chore(pyproject.toml): update package version from 0.0.71 to 0.0.72 --- poetry.lock | 24 ++++++++++++------------ pyproject.toml | 2 +- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/poetry.lock b/poetry.lock index 2f42ef3ff..7aff75b41 100644 --- a/poetry.lock +++ b/poetry.lock @@ -4143,23 +4143,23 @@ scipy = ["scipy"] [[package]] name = "tornado" -version = "6.3.1" +version = "6.3.2" description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." category = "dev" optional = false python-versions = ">= 3.8" files = [ - {file = "tornado-6.3.1-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:db181eb3df8738613ff0a26f49e1b394aade05034b01200a63e9662f347d4415"}, - {file = "tornado-6.3.1-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:b4e7b956f9b5e6f9feb643ea04f07e7c6b49301e03e0023eedb01fa8cf52f579"}, - {file = "tornado-6.3.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9661aa8bc0e9d83d757cd95b6f6d1ece8ca9fd1ccdd34db2de381e25bf818233"}, - {file = "tornado-6.3.1-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:81c17e0cc396908a5e25dc8e9c5e4936e6dfd544c9290be48bd054c79bcad51e"}, - {file = "tornado-6.3.1-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a27a1cfa9997923f80bdd962b3aab048ac486ad8cfb2f237964f8ab7f7eb824b"}, - {file = "tornado-6.3.1-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:d7117f3c7ba5d05813b17a1f04efc8e108a1b811ccfddd9134cc68553c414864"}, - {file = "tornado-6.3.1-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:ffdce65a281fd708da5a9def3bfb8f364766847fa7ed806821a69094c9629e8a"}, - {file = "tornado-6.3.1-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:90f569a35a8ec19bde53aa596952071f445da678ec8596af763b9b9ce07605e6"}, - {file = "tornado-6.3.1-cp38-abi3-win32.whl", hash = "sha256:3455133b9ff262fd0a75630af0a8ee13564f25fb4fd3d9ce239b8a7d3d027bf8"}, - {file = "tornado-6.3.1-cp38-abi3-win_amd64.whl", hash = "sha256:1285f0691143f7ab97150831455d4db17a267b59649f7bd9700282cba3d5e771"}, - {file = "tornado-6.3.1.tar.gz", hash = "sha256:5e2f49ad371595957c50e42dd7e5c14d64a6843a3cf27352b69c706d1b5918af"}, + {file = "tornado-6.3.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:c367ab6c0393d71171123ca5515c61ff62fe09024fa6bf299cd1339dc9456829"}, + {file = "tornado-6.3.2-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:b46a6ab20f5c7c1cb949c72c1994a4585d2eaa0be4853f50a03b5031e964fc7c"}, + {file = "tornado-6.3.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c2de14066c4a38b4ecbbcd55c5cc4b5340eb04f1c5e81da7451ef555859c833f"}, + {file = "tornado-6.3.2-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:05615096845cf50a895026f749195bf0b10b8909f9be672f50b0fe69cba368e4"}, + {file = "tornado-6.3.2-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b17b1cf5f8354efa3d37c6e28fdfd9c1c1e5122f2cb56dac121ac61baa47cbe"}, + {file = "tornado-6.3.2-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:29e71c847a35f6e10ca3b5c2990a52ce38b233019d8e858b755ea6ce4dcdd19d"}, + {file = "tornado-6.3.2-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:834ae7540ad3a83199a8da8f9f2d383e3c3d5130a328889e4cc991acc81e87a0"}, + {file = "tornado-6.3.2-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:6a0848f1aea0d196a7c4f6772197cbe2abc4266f836b0aac76947872cd29b411"}, + {file = "tornado-6.3.2-cp38-abi3-win32.whl", hash = "sha256:7efcbcc30b7c654eb6a8c9c9da787a851c18f8ccd4a5a3a95b05c7accfa068d2"}, + {file = "tornado-6.3.2-cp38-abi3-win_amd64.whl", hash = "sha256:0c325e66c8123c606eea33084976c832aa4e766b7dff8aedd7587ea44a604cdf"}, + {file = "tornado-6.3.2.tar.gz", hash = "sha256:4b927c4f19b71e627b13f3db2324e4ae660527143f9e1f2e2fb404f3a187e2ba"}, ] [[package]] diff --git a/pyproject.toml b/pyproject.toml index 0cc181617..73240a0c8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "langflow" -version = "0.0.71" +version = "0.0.72" description = "A Python package with a built-in web application" authors = ["Logspace "] maintainers = [ From 3b12a76a651fae7e835da3eb3138c548f3ab7318 Mon Sep 17 00:00:00 2001 From: anovazzi1 Date: Mon, 15 May 2023 10:25:27 -0300 Subject: [PATCH 44/50] removed save on browser application state to prevent bugs and fixed error on star for websockets --- src/frontend/src/contexts/tabsContext.tsx | 68 +++++++++++---------- src/frontend/src/modals/chatModal/index.tsx | 43 ++++++++----- 2 files changed, 65 insertions(+), 46 deletions(-) diff --git a/src/frontend/src/contexts/tabsContext.tsx b/src/frontend/src/contexts/tabsContext.tsx index db122ebb2..51f754902 100644 --- a/src/frontend/src/contexts/tabsContext.tsx +++ b/src/frontend/src/contexts/tabsContext.tsx @@ -38,7 +38,7 @@ export function TabsProvider({ children }: { children: ReactNode }) { const { setNoticeData } = useContext(alertContext); const [tabIndex, setTabIndex] = useState(0); const [flows, setFlows] = useState>([]); - const [id, setId] = useState(""); + const [id, setId] = useState(uuidv4()); const { templates } = useContext(typesContext); const newNodeId = useRef(0); @@ -47,46 +47,50 @@ export function TabsProvider({ children }: { children: ReactNode }) { return newNodeId.current; } function save() { - if (flows.length !== 0) - window.localStorage.setItem( - "tabsData", - JSON.stringify({ tabIndex, flows, id, nodeId: newNodeId.current }) - ); + //disabled until flows can be saved on local storage again without bugs + // if (flows.length !== 0) + // window.localStorage.setItem( + // "tabsData", + // JSON.stringify({ tabIndex, flows, id, nodeId: newNodeId.current }) + // ); } useEffect(() => { + //disabled until flows can be saved on local storage again without bugs //save tabs locally - save(); + // save(); + }, [flows, id, tabIndex, newNodeId]); - useEffect(() => { - //get tabs locally saved - let cookie = window.localStorage.getItem("tabsData"); - if (cookie && Object.keys(templates).length > 0) { - let cookieObject: LangFlowState = JSON.parse(cookie); - cookieObject.flows.forEach((flow) => { - flow.data.nodes.forEach((node) => { - if (Object.keys(templates[node.data.type]["template"]).length > 0) { - node.data.node.template = updateTemplate( - templates[node.data.type][ - "template" - ] as unknown as APITemplateType, + // useEffect(() => { + // //get tabs locally saved + // let cookie = window.localStorage.getItem("tabsData"); + // if (cookie && Object.keys(templates).length > 0) { + // let cookieObject: LangFlowState = JSON.parse(cookie); + // cookieObject.flows.forEach((flow) => { + // flow.data.nodes.forEach((node) => { + // if (Object.keys(templates[node.data.type]["template"]).length > 0) { + // node.data.node.template = updateTemplate( + // templates[node.data.type][ + // "template" + // ] as unknown as APITemplateType, + + // node.data.node.template as APITemplateType + // ); + // } + // }); + // }); + // setTabIndex(cookieObject.tabIndex); + // setFlows(cookieObject.flows); + // setId(cookieObject.id); + // newNodeId.current = cookieObject.nodeId; + // } + // }, [templates]); - node.data.node.template as APITemplateType - ); - } - }); - }); - setTabIndex(cookieObject.tabIndex); - setFlows(cookieObject.flows); - setId(cookieObject.id); - newNodeId.current = cookieObject.nodeId; - } - }, [templates]); function hardReset() { newNodeId.current = 0; setTabIndex(0); setFlows([]); - setId(""); + setId(uuidv4()); } /** @@ -182,7 +186,7 @@ export function TabsProvider({ children }: { children: ReactNode }) { let newFlow: FlowType = { description, name: flow?.name ?? "New Flow", - id: id.toString(), + id: uuidv4(), data, }; diff --git a/src/frontend/src/modals/chatModal/index.tsx b/src/frontend/src/modals/chatModal/index.tsx index 51fd054ec..379a42f88 100644 --- a/src/frontend/src/modals/chatModal/index.tsx +++ b/src/frontend/src/modals/chatModal/index.tsx @@ -30,10 +30,16 @@ export default function ChatModal({ const ws = useRef(null); const [lockChat, setLockChat] = useState(false); const isOpen = useRef(open); + const id = useRef(flow.id); useEffect(() => { isOpen.current = open; }, [open]); + useEffect(() => { + id.current = flow.id; + },[flow.id]) + + var isStream = false; const addChatHistory = ( @@ -164,10 +170,9 @@ export default function ChatModal({ try { const urlWs = process.env.NODE_ENV === "development" - ? `ws://localhost:7860/chat/${flow.id}` + ? `ws://localhost:7860/chat/${id.current}` : `${window.location.protocol === "https:" ? "wss" : "ws"}://${window.location.host - }/chat/${flow.id}`; - + }/chat/${id.current}`; const newWs = new WebSocket(urlWs); newWs.onopen = () => { console.log("WebSocket connection established!"); @@ -184,6 +189,26 @@ export default function ChatModal({ }; newWs.onerror = (ev) => { console.log(ev, "error"); + if(flow.id===""){ + connectWS(); + } + else{ + setErrorData({ + title: "There was an error on web connection, please: ", + list: [ + "Refresh the page", + "Use a new flow tab", + "Check if the backend is up", + ], + }); + } + }; + ws.current = newWs; + } catch { + if(flow.id===""){ + connectWS(); + } + else{ setErrorData({ title: "There was an error on web connection, please: ", list: [ @@ -192,17 +217,7 @@ export default function ChatModal({ "Check if the backend is up", ], }); - }; - ws.current = newWs; - } catch { - setErrorData({ - title: "There was an error on web connection, please: ", - list: [ - "Refresh the page", - "Use a new flow tab", - "Check if the backend is up", - ], - }); + } } } From f109b733339eba2ad7497fe18f79dc162d05e1aa Mon Sep 17 00:00:00 2001 From: anovazzi1 Date: Mon, 15 May 2023 11:13:53 -0300 Subject: [PATCH 45/50] updated pyproject --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 0cc181617..12ba07ebb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "langflow" -version = "0.0.71" +version = "0.0.73" description = "A Python package with a built-in web application" authors = ["Logspace "] maintainers = [ From eb86c8be64d7d384bdfd2b1257c525e5cb99865d Mon Sep 17 00:00:00 2001 From: Gabriel Almeida Date: Mon, 15 May 2023 14:12:12 -0300 Subject: [PATCH 46/50] refactor(loading.py): swap parameters order in instantiate_prompt function to match other functions --- src/backend/langflow/interface/loading.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/backend/langflow/interface/loading.py b/src/backend/langflow/interface/loading.py index 148efd5b7..6cd9246b8 100644 --- a/src/backend/langflow/interface/loading.py +++ b/src/backend/langflow/interface/loading.py @@ -54,7 +54,7 @@ def instantiate_based_on_type(class_object, base_type, node_type, params): if base_type == "agents": return instantiate_agent(class_object, params) elif base_type == "prompts": - return instantiate_prompt(class_object, node_type, params) + return instantiate_prompt(node_type, class_object, params) elif base_type == "tools": return instantiate_tool(node_type, class_object, params) elif base_type == "toolkits": @@ -77,7 +77,7 @@ def instantiate_agent(class_object, params): return load_agent_executor(class_object, params) -def instantiate_prompt(class_object, node_type, params): +def instantiate_prompt(node_type, class_object, params): if node_type == "ZeroShotPrompt": if "tools" not in params: params["tools"] = [] @@ -96,7 +96,7 @@ def instantiate_tool(node_type, class_object, params): raise ValueError("Function should be a string") elif node_type.lower() == "tool": return class_object(**params) - return None # Or some other default action + return class_object(**params) def instantiate_toolkit(node_type, class_object, params): From 50165ce789e8818d069c97e6c5ba1c40b7089075 Mon Sep 17 00:00:00 2001 From: Gabriel Almeida Date: Mon, 15 May 2023 14:58:16 -0300 Subject: [PATCH 47/50] style(chatMessage): fix formatting and add const keyword to convert variable in both files feat(chatMessage): add newline option to ansi-to-html Convert constructor in both files --- .../src/components/chatComponent/chatMessage/index.tsx | 2 +- src/frontend/src/modals/chatModal/chatMessage/index.tsx | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/frontend/src/components/chatComponent/chatMessage/index.tsx b/src/frontend/src/components/chatComponent/chatMessage/index.tsx index 6c9e24407..9e3586d23 100644 --- a/src/frontend/src/components/chatComponent/chatMessage/index.tsx +++ b/src/frontend/src/components/chatComponent/chatMessage/index.tsx @@ -7,7 +7,7 @@ import { useState } from "react"; import { ChatMessageType } from "../../../types/chat"; import { nodeColors } from "../../../utils"; import Convert from "ansi-to-html"; -var convert = new Convert({newline:true}); +const convert = new Convert({ newline: true }); export default function ChatMessage({ chat }: { chat: ChatMessageType }) { const [hidden, setHidden] = useState(true); diff --git a/src/frontend/src/modals/chatModal/chatMessage/index.tsx b/src/frontend/src/modals/chatModal/chatMessage/index.tsx index 8f18e2f3b..f7131e1e5 100644 --- a/src/frontend/src/modals/chatModal/chatMessage/index.tsx +++ b/src/frontend/src/modals/chatModal/chatMessage/index.tsx @@ -14,6 +14,7 @@ import { CodeBlock } from "./codeBlock"; import Convert from "ansi-to-html"; export default function ChatMessage({ chat, lockChat }: { chat: ChatMessageType, lockChat: boolean }) { + const convert = new Convert({ newline: true }); const [message, setMessage] = useState(""); const imgRef = useRef(null); useEffect(() => { @@ -35,9 +36,9 @@ export default function ChatMessage({ chat, lockChat }: { chat: ChatMessageType, )} > {!chat.isSend &&
- - -
} + + + } {chat.isSend && } {!chat.isSend ? ( From b0ded58d1e21d12ec6e3fa9dcd470c08ad8a662e Mon Sep 17 00:00:00 2001 From: Gabriel Almeida Date: Mon, 15 May 2023 19:08:49 -0300 Subject: [PATCH 48/50] feat(docker-compose.yml): add VITE_PROXY_TARGET environment variable to frontend service feat(frontend/dev.Dockerfile): change npm start command to npm run dev:docker feat(frontend/package.json): add dev:docker script to run vite with host 0.0.0.0 feat(frontend/vite.config.ts): use environment variable to determine the target for proxying requests --- docker-compose.yml | 2 ++ src/frontend/dev.Dockerfile | 2 +- src/frontend/package.json | 3 ++- src/frontend/vite.config.ts | 54 ++++++++++++++++++------------------- 4 files changed, 31 insertions(+), 30 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index d9ba84030..755d0794d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -17,6 +17,8 @@ services: dockerfile: ./dev.Dockerfile args: - BACKEND_URL=http://backend:7860 + environment: + - VITE_PROXY_TARGET=http://backend:7860 ports: - "3000:3000" volumes: diff --git a/src/frontend/dev.Dockerfile b/src/frontend/dev.Dockerfile index 4773fc2b9..8678b02dd 100644 --- a/src/frontend/dev.Dockerfile +++ b/src/frontend/dev.Dockerfile @@ -23,4 +23,4 @@ RUN chmod +x set_proxy.sh && \ USER node RUN npm install --loglevel warn -CMD ["npm", "start"] \ No newline at end of file +CMD ["npm", "run", "dev:docker"] \ No newline at end of file diff --git a/src/frontend/package.json b/src/frontend/package.json index fd8cc02db..6315deb05 100644 --- a/src/frontend/package.json +++ b/src/frontend/package.json @@ -35,6 +35,7 @@ "web-vitals": "^2.1.4" }, "scripts": { + "dev:docker": "vite --host 0.0.0.0", "start": "vite", "build": "vite build", "serve": "vite preview" @@ -76,4 +77,4 @@ "typescript": "^5.0.2", "vite": "^4.3.5" } -} +} \ No newline at end of file diff --git a/src/frontend/vite.config.ts b/src/frontend/vite.config.ts index 1eec534d6..f715e4e5b 100644 --- a/src/frontend/vite.config.ts +++ b/src/frontend/vite.config.ts @@ -1,34 +1,32 @@ -import { defineConfig } from 'vite'; -import react from '@vitejs/plugin-react-swc'; +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react-swc"; -const apiRoutes = [ - '/all', - '/predict', - '^/validate/*', - '^/chat/*', -]; +const apiRoutes = ["/all", "/predict", "^/validate/*", "^/chat/*"]; + +// Use environment variable to determine the target. +const target = process.env.VITE_PROXY_TARGET || "http://127.0.0.1:7860"; const proxyTargets = apiRoutes.reduce((proxyObj, route) => { - proxyObj[route] = { - target: 'http://127.0.0.1:7860', - changeOrigin: true, - secure: false, - ws: true, - }; - return proxyObj; + proxyObj[route] = { + target: target, + changeOrigin: true, + secure: false, + ws: true, + }; + return proxyObj; }, {}); export default defineConfig(() => { - return { - build: { - outDir: 'build', - }, - plugins: [react()], - server: { - port: 3000, - proxy: { - ...proxyTargets - } - }, - }; -}); \ No newline at end of file + return { + build: { + outDir: "build", + }, + plugins: [react()], + server: { + port: 3000, + proxy: { + ...proxyTargets, + }, + }, + }; +}); From 65d32ffdfbdc55987f85eb683ef934fefdab35d9 Mon Sep 17 00:00:00 2001 From: Gabriel Almeida Date: Mon, 15 May 2023 22:06:55 -0300 Subject: [PATCH 49/50] chore(poetry.lock): update package versions for chromadb, gptcache, ipykernel, and tornado --- poetry.lock | 43 +++++++++++++++++++++---------------------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/poetry.lock b/poetry.lock index 2f42ef3ff..273e37db6 100644 --- a/poetry.lock +++ b/poetry.lock @@ -511,14 +511,14 @@ files = [ [[package]] name = "chromadb" -version = "0.3.22" +version = "0.3.23" description = "Chroma." category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "chromadb-0.3.22-py3-none-any.whl", hash = "sha256:54b58e562ab8a63194ce3b453633ce351475193de2184845f0577db969f1cf49"}, - {file = "chromadb-0.3.22.tar.gz", hash = "sha256:41acb262c2c7bb41afecd50737f440dce3fdaa3d3fe1749d0e4be1ffc8699e63"}, + {file = "chromadb-0.3.23-py3-none-any.whl", hash = "sha256:c1e04fddff0916243895bedeffc1977745328f62404d70981eb1a0cb9dcdfaf3"}, + {file = "chromadb-0.3.23.tar.gz", hash = "sha256:87fa922c92e2e90fb48234b435e9d4f0c61646fbd1526062f53f63326fc21228"}, ] [package.dependencies] @@ -1180,20 +1180,19 @@ grpc = ["grpcio (>=1.44.0,<2.0.0dev)"] [[package]] name = "gptcache" -version = "0.1.23" +version = "0.1.24" description = "GPTCache, a powerful caching library that can be used to speed up and lower the cost of chat applications that rely on the LLM service. GPTCache works as a memcache for AIGC applications, similar to how Redis works for traditional applications." category = "main" optional = false python-versions = ">=3.8.1" files = [ - {file = "gptcache-0.1.23-py3-none-any.whl", hash = "sha256:8bcd366e1dd5de432e113831afdea97493f090372a752a42b9ff16cb8c818635"}, - {file = "gptcache-0.1.23.tar.gz", hash = "sha256:5b5e3ef6f5df35f948bd203d1e33f3985459e60be436547529ff8b31f245238d"}, + {file = "gptcache-0.1.24-py3-none-any.whl", hash = "sha256:070aad4867ab915a7b5db3a886e9f0289e52d1cb92a407c984b0241298079750"}, + {file = "gptcache-0.1.24.tar.gz", hash = "sha256:aa591cb00898d457a50a5e0cd137d0119e86819c110ce6c7bce2adafeae0a467"}, ] [package.dependencies] cachetools = "*" numpy = "*" -openai = "*" requests = "*" [[package]] @@ -1528,14 +1527,14 @@ files = [ [[package]] name = "ipykernel" -version = "6.23.0" +version = "6.23.1" description = "IPython Kernel for Jupyter" category = "dev" optional = false python-versions = ">=3.8" files = [ - {file = "ipykernel-6.23.0-py3-none-any.whl", hash = "sha256:fc886f1dcdc0ec17f277e4d21fd071c857d381adcb04f3f3735d25325ca323c6"}, - {file = "ipykernel-6.23.0.tar.gz", hash = "sha256:bd6f487d9e2744c84f6e667d46462d7647a4c862e70e08282f05a52b9d4b705f"}, + {file = "ipykernel-6.23.1-py3-none-any.whl", hash = "sha256:77aeffab056c21d16f1edccdc9e5ccbf7d96eb401bd6703610a21be8b068aadc"}, + {file = "ipykernel-6.23.1.tar.gz", hash = "sha256:1aba0ae8453e15e9bc6b24e497ef6840114afcdb832ae597f32137fa19d42a6f"}, ] [package.dependencies] @@ -4143,23 +4142,23 @@ scipy = ["scipy"] [[package]] name = "tornado" -version = "6.3.1" +version = "6.3.2" description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." category = "dev" optional = false python-versions = ">= 3.8" files = [ - {file = "tornado-6.3.1-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:db181eb3df8738613ff0a26f49e1b394aade05034b01200a63e9662f347d4415"}, - {file = "tornado-6.3.1-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:b4e7b956f9b5e6f9feb643ea04f07e7c6b49301e03e0023eedb01fa8cf52f579"}, - {file = "tornado-6.3.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9661aa8bc0e9d83d757cd95b6f6d1ece8ca9fd1ccdd34db2de381e25bf818233"}, - {file = "tornado-6.3.1-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:81c17e0cc396908a5e25dc8e9c5e4936e6dfd544c9290be48bd054c79bcad51e"}, - {file = "tornado-6.3.1-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a27a1cfa9997923f80bdd962b3aab048ac486ad8cfb2f237964f8ab7f7eb824b"}, - {file = "tornado-6.3.1-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:d7117f3c7ba5d05813b17a1f04efc8e108a1b811ccfddd9134cc68553c414864"}, - {file = "tornado-6.3.1-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:ffdce65a281fd708da5a9def3bfb8f364766847fa7ed806821a69094c9629e8a"}, - {file = "tornado-6.3.1-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:90f569a35a8ec19bde53aa596952071f445da678ec8596af763b9b9ce07605e6"}, - {file = "tornado-6.3.1-cp38-abi3-win32.whl", hash = "sha256:3455133b9ff262fd0a75630af0a8ee13564f25fb4fd3d9ce239b8a7d3d027bf8"}, - {file = "tornado-6.3.1-cp38-abi3-win_amd64.whl", hash = "sha256:1285f0691143f7ab97150831455d4db17a267b59649f7bd9700282cba3d5e771"}, - {file = "tornado-6.3.1.tar.gz", hash = "sha256:5e2f49ad371595957c50e42dd7e5c14d64a6843a3cf27352b69c706d1b5918af"}, + {file = "tornado-6.3.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:c367ab6c0393d71171123ca5515c61ff62fe09024fa6bf299cd1339dc9456829"}, + {file = "tornado-6.3.2-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:b46a6ab20f5c7c1cb949c72c1994a4585d2eaa0be4853f50a03b5031e964fc7c"}, + {file = "tornado-6.3.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c2de14066c4a38b4ecbbcd55c5cc4b5340eb04f1c5e81da7451ef555859c833f"}, + {file = "tornado-6.3.2-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:05615096845cf50a895026f749195bf0b10b8909f9be672f50b0fe69cba368e4"}, + {file = "tornado-6.3.2-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b17b1cf5f8354efa3d37c6e28fdfd9c1c1e5122f2cb56dac121ac61baa47cbe"}, + {file = "tornado-6.3.2-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:29e71c847a35f6e10ca3b5c2990a52ce38b233019d8e858b755ea6ce4dcdd19d"}, + {file = "tornado-6.3.2-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:834ae7540ad3a83199a8da8f9f2d383e3c3d5130a328889e4cc991acc81e87a0"}, + {file = "tornado-6.3.2-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:6a0848f1aea0d196a7c4f6772197cbe2abc4266f836b0aac76947872cd29b411"}, + {file = "tornado-6.3.2-cp38-abi3-win32.whl", hash = "sha256:7efcbcc30b7c654eb6a8c9c9da787a851c18f8ccd4a5a3a95b05c7accfa068d2"}, + {file = "tornado-6.3.2-cp38-abi3-win_amd64.whl", hash = "sha256:0c325e66c8123c606eea33084976c832aa4e766b7dff8aedd7587ea44a604cdf"}, + {file = "tornado-6.3.2.tar.gz", hash = "sha256:4b927c4f19b71e627b13f3db2324e4ae660527143f9e1f2e2fb404f3a187e2ba"}, ] [[package]] From d9bccd27c83d57a89ae84150fcbcfb83f5b367ce Mon Sep 17 00:00:00 2001 From: Gabriel Almeida Date: Mon, 15 May 2023 22:09:18 -0300 Subject: [PATCH 50/50] chore(poetry.lock): update llama-cpp-python package version from 0.1.23 to 0.1.50 --- poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/poetry.lock b/poetry.lock index 273e37db6..be596cd0a 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1734,13 +1734,13 @@ qdrant = ["qdrant-client (>=1.1.2,<2.0.0)"] [[package]] name = "llama-cpp-python" -version = "0.1.23" +version = "0.1.50" description = "A Python wrapper for llama.cpp" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "llama_cpp_python-0.1.23.tar.gz", hash = "sha256:323a937e68e04251b5ad1804922e05d15c8b6bfbcf7c3e683a7b39a20e165ebf"}, + {file = "llama_cpp_python-0.1.50.tar.gz", hash = "sha256:e305ae1b9f135f94afd8dd227701e6a1cd36db9c28f736b830ec364127c00bb9"}, ] [package.dependencies] @@ -4839,4 +4839,4 @@ cffi = ["cffi (>=1.11)"] [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "d914f734f4ff1bcbe8e678d46b20b73c3565b3af6f5dd0ac0359fae800c6bf2e" +content-hash = "be5c3e25247d4a0c313de54d07f4a027253877a5b8fbbf7830030a43a02c2911"