From 6d6b2ed826125e160af08d27cf79cf577c2eaf3d Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Tue, 24 Oct 2023 16:10:33 -0300 Subject: [PATCH] =?UTF-8?q?=F0=9F=94=A7=20fix(base.py):=20add=20DOWNLOAD?= =?UTF-8?q?=5FWEBHOOK=5FURL=20setting=20to=20support=20webhook=20integrati?= =?UTF-8?q?on=20for=20component=20downloads=20=F0=9F=94=A7=20fix(service.p?= =?UTF-8?q?y):=20call=20webhook=20after=20downloading=20a=20component=20to?= =?UTF-8?q?=20trigger=20webhook=20integration?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../langflow/services/settings/base.py | 1 + .../langflow/services/store/service.py | 22 +++++++++++++++++-- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/backend/langflow/services/settings/base.py b/src/backend/langflow/services/settings/base.py index 713d7c31b..c666f48ce 100644 --- a/src/backend/langflow/services/settings/base.py +++ b/src/backend/langflow/services/settings/base.py @@ -53,6 +53,7 @@ class Settings(BaseSettings): LANGFUSE_HOST: Optional[str] = None STORE_URL: Optional[str] = None + DOWNLOAD_WEBHOOK_URL: Optional[str] = None @validator("CONFIG_DIR", pre=True, allow_reuse=True) def set_langflow_dir(cls, value): diff --git a/src/backend/langflow/services/store/service.py b/src/backend/langflow/services/store/service.py index 555d988fe..d16a6702f 100644 --- a/src/backend/langflow/services/store/service.py +++ b/src/backend/langflow/services/store/service.py @@ -1,7 +1,9 @@ from datetime import datetime +from uuid import UUID from langflow.services.base import Service from typing import TYPE_CHECKING, List, Dict, Any, Optional import httpx + from httpx import HTTPError from langflow.services.store.schema import ( ComponentResponse, @@ -24,6 +26,7 @@ class StoreService(Service): def __init__(self, settings_service: "SettingsService"): self.settings_service = settings_service self.base_url = self.settings_service.settings.STORE_URL + self.webhook_url = self.settings_service.settings.DOWNLOAD_WEBHOOK_URL self.components_url = f"{self.base_url}/items/components" def _get( @@ -43,6 +46,19 @@ class StoreService(Service): except Exception as exc: raise ValueError(f"GET failed: {exc}") + def call_webhook(self, api_key: str, webhook_url: str, component_id: UUID) -> None: + # The webhook is a POST request with the data in the body + # For now we are calling it just for testing + try: + headers = {"Authorization": f"Bearer {api_key}"} + response = httpx.post( + webhook_url, headers=headers, json={"component_id": str(component_id)} + ) + response.raise_for_status() + return response.json() + except HTTPError as exc: + raise exc + def search( self, api_key: Optional[str], @@ -108,12 +124,14 @@ class StoreService(Service): results = self._get(self.components_url, api_key, params) return [ListComponentResponse(**component) for component in results] - def download(self, api_key: str, id: str) -> DownloadComponentResponse: - url = f"{self.components_url}/{id}" + def download(self, api_key: str, component_id: str) -> DownloadComponentResponse: + url = f"{self.components_url}/{component_id}" params = { "fields": ",".join(["id", "name", "description", "data", "is_component"]) } component = self._get(url, api_key, params) + self.call_webhook(api_key, self.webhook_url, component_id) + return DownloadComponentResponse(**component) def upload(