From 829c14e706fb0a7ded659c39ecbc1c77d441487a Mon Sep 17 00:00:00 2001 From: Mendon Kissling <59585235+mendonk@users.noreply.github.com> Date: Wed, 5 Jun 2024 17:14:44 -0400 Subject: [PATCH] backend-only mode --- docs/docs/deployment/backend-only.md | 113 ++++++++++++++++++++++++++- 1 file changed, 112 insertions(+), 1 deletion(-) diff --git a/docs/docs/deployment/backend-only.md b/docs/docs/deployment/backend-only.md index 7ad2754d2..7e361addd 100644 --- a/docs/docs/deployment/backend-only.md +++ b/docs/docs/deployment/backend-only.md @@ -1,3 +1,114 @@ # Backend-only Deployment -You can run a flow in `--backend-only` mode to \ No newline at end of file +You can run Langflow in `--backend-only` mode to expose your Langflow app as an API, without running the frontend UI. + +Start langflow in backend-only mode with `python3 -m langflow run --backend-only`. + +The terminal prints ` Welcome to ⛓ Langflow `, and a blank window opens at `http://127.0.0.1:7864/all`. +Langflow will now serve requests to its API without the frontend running. + +## Prerequisites + +* [Langflow installed](../getting-started/install-langflow.mdx) + +* [OpenAI API key](https://platform.openai.com) + +* [A Langflow flow created](../starter-projects/basic-prompting.mdx) + +## Download your flow's curl call + +1. Click API. +2. Click **curl** > **Copy code** and save the code to your local machine. +It will look something like this: +```curl +curl -X POST \ + "http://127.0.0.1:7864/api/v1/run/ef7e0554-69e5-4e3e-ab29-ee83bcd8d9ef?stream=false" \ + -H 'Content-Type: application/json'\ + -d '{"input_value": "message", + "output_type": "chat", + "input_type": "chat", + "tweaks": { + "Prompt-kvo86": {}, + "OpenAIModel-MilkD": {}, + "ChatOutput-ktwdw": {}, + "ChatInput-xXC4F": {} +}}' +``` +Note the flow ID of `ef7e0554-69e5-4e3e-ab29-ee83bcd8d9ef`. You can find this ID in the UI as well to ensure you're querying the right flow. + +## Start Langflow in backend-only mode + +3. Stop Langflow with Ctrl+C. +4. Start langflow in backend-only mode with `python3 -m langflow run --backend-only`. +The terminal prints ` Welcome to ⛓ Langflow `, and a blank window opens at `http://127.0.0.1:7864/all`. +Langflow will now serve requests to its API. +5. Run the curl code you copied from the UI. +You should get a result like this: +```bash +{"session_id":"ef7e0554-69e5-4e3e-ab29-ee83bcd8d9ef:bf81d898868ac87e1b4edbd96c131c5dee801ea2971122cc91352d144a45b880","outputs":[{"inputs":{"input_value":"hi, are you there?"},"outputs":[{"results":{"result":"Arrr, ahoy matey! Aye, I be here. What be ye needin', me hearty?"},"artifacts":{"message":"Arrr, ahoy matey! Aye, I be here. What be ye needin', me hearty?","sender":"Machine","sender_name":"AI"},"messages":[{"message":"Arrr, ahoy matey! Aye, I be here. What be ye needin', me hearty?","sender":"Machine","sender_name":"AI","component_id":"ChatOutput-ktwdw"}],"component_display_name":"Chat Output","component_id":"ChatOutput-ktwdw","used_frozen_result":false}]}]}% +``` +Again, note that the flow ID matches. +Langflow is receiving your POST request, running the flow, and returning the result, all without running the frontend. Cool! + +## Download your flow's Python API call + +Instead of using curl, you can download your flow as a Python API call instead. + +1. Click API. +2. Click **Python API** > **Copy code** and save the code to your local machine. +The code will look something like this: +```python +import requests +from typing import Optional + +BASE_API_URL = "http://127.0.0.1:7864/api/v1/run" +FLOW_ID = "ef7e0554-69e5-4e3e-ab29-ee83bcd8d9ef" +# You can tweak the flow by adding a tweaks dictionary +# e.g {"OpenAI-XXXXX": {"model_name": "gpt-4"}} + +def run_flow(message: str, + flow_id: str, + output_type: str = "chat", + input_type: str = "chat", + tweaks: Optional[dict] = None, + api_key: Optional[str] = None) -> dict: + """ + Run a flow with a given message and optional tweaks. + + :param message: The message to send to the flow + :param flow_id: The ID of the flow to run + :param tweaks: Optional tweaks to customize the flow + :return: The JSON response from the flow + """ + api_url = f"{BASE_API_URL}/{flow_id}" + + payload = { + "input_value": message, + "output_type": output_type, + "input_type": input_type, + } + headers = None + if tweaks: + payload["tweaks"] = tweaks + if api_key: + headers = {"x-api-key": api_key} + response = requests.post(api_url, json=payload, headers=headers) + return response.json() + +# Setup any tweaks you want to apply to the flow +message = "message" + +print(run_flow(message=message, flow_id=FLOW_ID)) +``` +3. Run your Python app: +```python +python3 app.py +``` + +The result is similar to the curl call: +```bash +{'session_id': 'ef7e0554-69e5-4e3e-ab29-ee83bcd8d9ef:bf81d898868ac87e1b4edbd96c131c5dee801ea2971122cc91352d144a45b880', 'outputs': [{'inputs': {'input_value': 'message'}, 'outputs': [{'results': {'result': "Arrr matey! What be yer message for this ol' pirate? Speak up or walk the plank!"}, 'artifacts': {'message': "Arrr matey! What be yer message for this ol' pirate? Speak up or walk the plank!", 'sender': 'Machine', 'sender_name': 'AI'}, 'messages': [{'message': "Arrr matey! What be yer message for this ol' pirate? Speak up or walk the plank!", 'sender': 'Machine', 'sender_name': 'AI', 'component_id': 'ChatOutput-ktwdw'}], 'component_display_name': 'Chat Output', 'component_id': 'ChatOutput-ktwdw', 'used_frozen_result': False}]}]} +``` +Your Python app POSTs to your Langflow server, and the server runs the flow and returns the result. + +See [API](../administration/api.mdx) for more ways to interact with your headless Langflow server. \ No newline at end of file