diff --git a/docs/deployment/gradio_app.mdx b/docs/deployment/gradio_app.mdx new file mode 100644 index 00000000..6c79aa20 --- /dev/null +++ b/docs/deployment/gradio_app.mdx @@ -0,0 +1,59 @@ +--- +title: 'Gradio.app' +description: 'Deploy your RAG application to gradio.app platform' +--- + +Embedchain offers a Streamlit template to facilitate the development of RAG chatbot applications in just three easy steps. + +Follow the instructions given below to deploy your first application quickly: + +## Step-1: Create RAG app + +We provide a command line utility called `ec` in embedchain that inherits the template for `gradio.app` platform and help you deploy the app. Follow the instructions to create a gradio.app app using the template provided: + +```bash Install embedchain +pip install embedchain +``` + +```bash Create application +mkdir my-rag-app +ec create --template=gradio.app +``` + +This will generate a directory structure like this: + +```bash +├── app.py +├── embedchain.json +└── requirements.txt +``` + +Feel free to edit the files as required. +- `app.py`: Contains API app code +- `embedchain.json`: Contains embedchain specific configuration for deployment (you don't need to configure this) +- `requirements.txt`: Contains python dependencies for your application + +## Step-2: Test app locally + +You can run the app locally by simply doing: + +```bash Run locally +pip install -r requirements.txt +ec dev +``` + +## Step-3: Deploy to gradio.app + +```bash Deploy to gradio.app +ec deploy +``` + +This will run `gradio deploy` which will prompt you questions and deploy your app directly to huggingface spaces. + +gradio app + +## Seeking help? + +If you run into issues with deployment, please feel free to reach out to us via any of the following methods: + + diff --git a/docs/deployment/huggingface_spaces.mdx b/docs/deployment/huggingface_spaces.mdx new file mode 100644 index 00000000..5b8811e4 --- /dev/null +++ b/docs/deployment/huggingface_spaces.mdx @@ -0,0 +1,103 @@ +--- +title: 'Huggingface.co' +description: 'Deploy your RAG application to huggingface.co platform' +--- + +With Embedchain, you can directly host your apps in just three steps to huggingface spaces where you can view and deploy your app to the world. + +We support two types of deployment to huggingface spaces: + + + + Streamlit.io + + + Gradio.app + + + +## Using streamlit.io + +### Step 1: Create a new RAG app + +Create a new RAG app using the following command: + +```bash +mkdir my-rag-app +ec create --template=hf/streamlit.io # inside my-rag-app directory +``` + +When you run this for the first time, you'll be asked to login to huggingface.co. Once you login, you'll need to create a **write** token. You can create a write token by going to [huggingface.co settings](https://huggingface.co/settings/token). Once you create a token, you'll be asked to enter the token in the terminal. + +This will also create an `embedchain.json` file in your app directory. Add a `name` key into the `embedchain.json` file. This will be the "repo-name" of your app in huggingface spaces. + +```json embedchain.json +{ + "name": "my-rag-app", + "provider": "hf/streamlit.io" +} +``` + +### Step-2: Test app locally + +You can run the app locally by simply doing: + +```bash Run locally +pip install -r requirements.txt +ec dev +``` + +### Step-3: Deploy to huggingface spaces + +```bash Deploy to huggingface spaces +ec deploy +``` + +This will deploy your app to huggingface spaces. You can view your app at `https://huggingface.co/spaces//my-rag-app`. This will get prompted in the terminal once the app is deployed. + +## Using gradio.app + +Similar to streamlit.io, you can deploy your app to gradio.app in just three steps. + +### Step 1: Create a new RAG app + +Create a new RAG app using the following command: + +```bash +mkdir my-rag-app +ec create --template=hf/gradio.app # inside my-rag-app directory +``` + +When you run this for the first time, you'll be asked to login to huggingface.co. Once you login, you'll need to create a **write** token. You can create a write token by going to [huggingface.co settings](https://huggingface.co/settings/token). Once you create a token, you'll be asked to enter the token in the terminal. + +This will also create an `embedchain.json` file in your app directory. Add a `name` key into the `embedchain.json` file. This will be the "repo-name" of your app in huggingface spaces. + +```json embedchain.json +{ + "name": "my-rag-app", + "provider": "hf/gradio.app" +} +``` + +### Step-2: Test app locally + +You can run the app locally by simply doing: + +```bash Run locally +pip install -r requirements.txt +ec dev +``` + +### Step-3: Deploy to huggingface spaces + +```bash Deploy to huggingface spaces +ec deploy +``` + +This will deploy your app to huggingface spaces. You can view your app at `https://huggingface.co/spaces//my-rag-app`. This will get prompted in the terminal once the app is deployed. + +## Seeking help? + +If you run into issues with deployment, please feel free to reach out to us via any of the following methods: + + diff --git a/docs/images/gradio_app.png b/docs/images/gradio_app.png new file mode 100644 index 00000000..c5ed3cf4 Binary files /dev/null and b/docs/images/gradio_app.png differ diff --git a/docs/mint.json b/docs/mint.json index 9dadd39b..8edb6a3e 100644 --- a/docs/mint.json +++ b/docs/mint.json @@ -91,7 +91,9 @@ "deployment/modal_com", "deployment/render_com", "deployment/streamlit_io", - "deployment/embedchain_ai" + "deployment/embedchain_ai", + "deployment/gradio_app", + "deployment/huggingface_spaces" ] }, { diff --git a/embedchain/cli.py b/embedchain/cli.py index 511244dc..7063b81e 100644 --- a/embedchain/cli.py +++ b/embedchain/cli.py @@ -103,12 +103,39 @@ def setup_streamlit_io_app(): console.print("Great! Now you can install the dependencies by doing `pip install -r requirements.txt`") +def setup_gradio_app(): + # nothing needs to be done here + console.print("Great! Now you can install the dependencies by doing `pip install -r requirements.txt`") + + +def setup_hf_app(): + subprocess.run(["pip", "install", "huggingface_hub[cli]"], check=True) + hf_setup_file = os.path.join(os.path.expanduser("~"), ".cache/huggingface/token") + if os.path.exists(hf_setup_file): + console.print( + """✅ [bold green]HuggingFace setup already done. You can now install the dependencies by doing \n + `pip install -r requirements.txt`[/bold green]""" + ) + else: + console.print( + """🚀 [cyan]Running: huggingface-cli login \n + Please provide a [bold]WRITE[/bold] token so that we can directly deploy\n + your apps from the terminal.[/cyan] + """ + ) + subprocess.run(["huggingface-cli", "login"], check=True) + console.print("Great! Now you can install the dependencies by doing `pip install -r requirements.txt`") + + @cli.command() @click.option("--template", default="fly.io", help="The template to use.") @click.argument("extra_args", nargs=-1, type=click.UNPROCESSED) def create(template, extra_args): anonymous_telemetry.capture(event_name="ec_create", properties={"template_used": template}) - src_path = get_pkg_path_from_name(template) + template_dir = template + if "/" in template_dir: + template_dir = template.split("/")[1] + src_path = get_pkg_path_from_name(template_dir) shutil.copytree(src_path, os.getcwd(), dirs_exist_ok=True) console.print(f"✅ [bold green]Successfully created app from template '{template}'.[/bold green]") @@ -120,6 +147,10 @@ def create(template, extra_args): setup_render_com_app() elif template == "streamlit.io": setup_streamlit_io_app() + elif template == "gradio.app": + setup_gradio_app() + elif template == "hf/gradio.app" or template == "hf/streamlit.app": + setup_hf_app() else: raise ValueError(f"Unknown template '{template}'.") @@ -187,6 +218,17 @@ def run_dev_render_com(debug, host, port): console.print("\n🛑 [bold yellow]FastAPI server stopped[/bold yellow]") +def run_dev_gradio(): + gradio_run_cmd = ["gradio", "app.py"] + try: + console.print(f"🚀 [bold cyan]Running Gradio app with command: {' '.join(gradio_run_cmd)}[/bold cyan]") + subprocess.run(gradio_run_cmd, check=True) + except subprocess.CalledProcessError as e: + console.print(f"❌ [bold red]An error occurred: {e}[/bold red]") + except KeyboardInterrupt: + console.print("\n🛑 [bold yellow]Gradio server stopped[/bold yellow]") + + @cli.command() @click.option("--debug", is_flag=True, help="Enable or disable debug mode.") @click.option("--host", default="127.0.0.1", help="The host address to run the FastAPI app on.") @@ -204,8 +246,10 @@ def dev(debug, host, port): run_dev_modal_com() elif template == "render.com": run_dev_render_com(debug, host, port) - elif template == "streamlit.io": + elif template == "streamlit.io" or template == "hf/streamlit.app": run_dev_streamlit_io() + elif template == "gradio.app" or template == "hf/gradio.app": + run_dev_gradio() else: raise ValueError(f"Unknown template '{template}'.") @@ -316,12 +360,43 @@ def deploy_render(): ) +def deploy_gradio_app(): + gradio_deploy_cmd = ["gradio", "deploy"] + + try: + console.print(f"🚀 [bold cyan]Running: {' '.join(gradio_deploy_cmd)}[/bold cyan]") + subprocess.run(gradio_deploy_cmd, check=True) + console.print("✅ [bold green]'gradio deploy' executed successfully.[/bold green]") + except subprocess.CalledProcessError as e: + console.print(f"❌ [bold red]An error occurred: {e}[/bold red]") + except FileNotFoundError: + console.print( + "❌ [bold red]'gradio' command not found. Please ensure Gradio CLI is installed and in your PATH.[/bold red]" + ) + + +def deploy_hf_spaces(ec_app_name): + if not ec_app_name: + console.print("❌ [bold red]'name' not found in embedchain.json[/bold red]") + return + hf_spaces_deploy_cmd = ["huggingface-cli", "upload", ec_app_name, ".", ".", "--repo-type=space"] + + try: + console.print(f"🚀 [bold cyan]Running: {' '.join(hf_spaces_deploy_cmd)}[/bold cyan]") + subprocess.run(hf_spaces_deploy_cmd, check=True) + console.print("✅ [bold green]'huggingface-cli upload' executed successfully.[/bold green]") + except subprocess.CalledProcessError as e: + console.print(f"❌ [bold red]An error occurred: {e}[/bold red]") + + @cli.command() def deploy(): # Check for platform-specific files template = "" + ec_app_name = "" with open("embedchain.json", "r") as file: embedchain_config = json.load(file) + ec_app_name = embedchain_config["name"] if "name" in embedchain_config else None template = embedchain_config["provider"] anonymous_telemetry.capture(event_name="ec_deploy", properties={"template_used": template}) @@ -333,5 +408,9 @@ def deploy(): deploy_render() elif template == "streamlit.io": deploy_streamlit() + elif template == "gradio.app": + deploy_gradio_app() + elif template.startswith("hf/"): + deploy_hf_spaces(ec_app_name) else: console.print("❌ [bold red]No recognized deployment platform found.[/bold red]") diff --git a/embedchain/deployment/gradio.app/app.py b/embedchain/deployment/gradio.app/app.py new file mode 100644 index 00000000..33b33f10 --- /dev/null +++ b/embedchain/deployment/gradio.app/app.py @@ -0,0 +1,18 @@ +import os + +import gradio as gr + +from embedchain import Pipeline as App + +os.environ["OPENAI_API_KEY"] = "sk-xxx" + +app = App() + + +def query(message, history): + return app.chat(message) + + +demo = gr.ChatInterface(query) + +demo.launch() diff --git a/embedchain/deployment/gradio.app/requirements.txt b/embedchain/deployment/gradio.app/requirements.txt new file mode 100644 index 00000000..82497726 --- /dev/null +++ b/embedchain/deployment/gradio.app/requirements.txt @@ -0,0 +1,2 @@ +gradio==4.11.0 +embedchain diff --git a/pyproject.toml b/pyproject.toml index 86a18de2..5dce5f04 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "embedchain" -version = "0.1.39" +version = "0.1.40" description = "Data platform for LLMs - Load, index, retrieve and sync any unstructured data" authors = [ "Taranjeet Singh ",