From 0f97d359f88f7121b0db479a4d42f7d3376c13fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Est=C3=A9vez?= Date: Tue, 24 Sep 2024 08:27:15 -0400 Subject: [PATCH] fix: update assistants components and add integrations tests (#3887) * fixes and integrations tests * [autofix.ci] apply automated fixes --------- Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> --- .../components/astra_assistants/__init__.py | 4 ++ .../astra_assistants/create_assistant.py | 4 +- .../astra_assistants/create_thread.py | 5 +- .../astra_assistants/get_assistant.py | 2 +- .../astra_assistants/list_assistants.py | 4 +- .../components/astra_assistants/run.py | 1 + .../base/langflow/template/template/base.py | 3 + .../assistants/test_assistants_components.py | 72 +++++++++++++++++++ 8 files changed, 87 insertions(+), 8 deletions(-) create mode 100644 src/backend/tests/integration/components/assistants/test_assistants_components.py diff --git a/src/backend/base/langflow/components/astra_assistants/__init__.py b/src/backend/base/langflow/components/astra_assistants/__init__.py index 515aff38a..1a90e5ea2 100644 --- a/src/backend/base/langflow/components/astra_assistants/__init__.py +++ b/src/backend/base/langflow/components/astra_assistants/__init__.py @@ -1,4 +1,6 @@ from .create_assistant import AssistantsCreateAssistant +from .create_thread import AssistantsCreateThread +from .dotenv import Dotenv from .get_assistant import AssistantsGetAssistantName from .list_assistants import AssistantsListAssistants from .run import AssistantsRun @@ -8,6 +10,8 @@ __all__ = [ "AssistantsCreateAssistant", "AssistantsGetAssistantName", "AssistantsListAssistants", + "AssistantsCreateThread", "AssistantsRun", "GetEnvVar", + "Dotenv", ] diff --git a/src/backend/base/langflow/components/astra_assistants/create_assistant.py b/src/backend/base/langflow/components/astra_assistants/create_assistant.py index 03b877437..43e241f62 100644 --- a/src/backend/base/langflow/components/astra_assistants/create_assistant.py +++ b/src/backend/base/langflow/components/astra_assistants/create_assistant.py @@ -10,6 +10,7 @@ class AssistantsCreateAssistant(Component): icon = "bot" display_name = "Create Assistant" description = "Creates an Assistant and returns it's id" + client = patch(OpenAI()) inputs = [ StrInput( @@ -45,8 +46,7 @@ class AssistantsCreateAssistant(Component): def process_inputs(self) -> Message: print(f"env_set is {self.env_set}") - client = patch(OpenAI()) - assistant = client.beta.assistants.create( + assistant = self.client.beta.assistants.create( name=self.assistant_name, instructions=self.instructions, model=self.model, diff --git a/src/backend/base/langflow/components/astra_assistants/create_thread.py b/src/backend/base/langflow/components/astra_assistants/create_thread.py index d225a1c28..76cfebbae 100644 --- a/src/backend/base/langflow/components/astra_assistants/create_thread.py +++ b/src/backend/base/langflow/components/astra_assistants/create_thread.py @@ -9,6 +9,7 @@ from langflow.template import Output class AssistantsCreateThread(Component): display_name = "Create Assistant Thread" description = "Creates a thread and returns the thread id" + client = patch(OpenAI()) inputs = [ MultilineInput( @@ -23,9 +24,7 @@ class AssistantsCreateThread(Component): ] def process_inputs(self) -> Message: - client = patch(OpenAI()) - - thread = client.beta.threads.create() + thread = self.client.beta.threads.create() thread_id = thread.id message = Message(text=thread_id) diff --git a/src/backend/base/langflow/components/astra_assistants/get_assistant.py b/src/backend/base/langflow/components/astra_assistants/get_assistant.py index cae81515d..fa4d6693a 100644 --- a/src/backend/base/langflow/components/astra_assistants/get_assistant.py +++ b/src/backend/base/langflow/components/astra_assistants/get_assistant.py @@ -10,6 +10,7 @@ from langflow.template import Output class AssistantsGetAssistantName(Component): display_name = "Get Assistant name" description = "Assistant by id" + client = patch(OpenAI()) inputs = [ StrInput( @@ -29,7 +30,6 @@ class AssistantsGetAssistantName(Component): ] def process_inputs(self) -> Message: - patch(OpenAI()) assistant = self.client.beta.assistants.retrieve( assistant_id=self.assistant_id, ) diff --git a/src/backend/base/langflow/components/astra_assistants/list_assistants.py b/src/backend/base/langflow/components/astra_assistants/list_assistants.py index e70417c5b..998f6a8ee 100644 --- a/src/backend/base/langflow/components/astra_assistants/list_assistants.py +++ b/src/backend/base/langflow/components/astra_assistants/list_assistants.py @@ -9,14 +9,14 @@ from langflow.template.field.base import Output class AssistantsListAssistants(Component): display_name = "List Assistants" description = "Returns a list of assistant id's" + client = patch(OpenAI()) outputs = [ Output(display_name="Assistants", name="assistants", method="process_inputs"), ] def process_inputs(self) -> Message: - patch(OpenAI()) - assistants = self.client.beta.assistants.list() + assistants = self.client.beta.assistants.list().data id_list = [assistant.id for assistant in assistants] message = Message( # get text from list diff --git a/src/backend/base/langflow/components/astra_assistants/run.py b/src/backend/base/langflow/components/astra_assistants/run.py index dfde8464e..1ae37ce8a 100644 --- a/src/backend/base/langflow/components/astra_assistants/run.py +++ b/src/backend/base/langflow/components/astra_assistants/run.py @@ -13,6 +13,7 @@ from langflow.template import Output class AssistantsRun(Component): display_name = "Run Assistant" description = "Executes an Assistant Run against a thread" + client = patch(OpenAI()) def update_build_config( self, diff --git a/src/backend/base/langflow/template/template/base.py b/src/backend/base/langflow/template/template/base.py index 273b66079..8ffc72463 100644 --- a/src/backend/base/langflow/template/template/base.py +++ b/src/backend/base/langflow/template/template/base.py @@ -56,6 +56,9 @@ class Template(BaseModel): _input = Input(**value) data["fields"].append(_input) + # Handles components with no inputs + if "fields" not in data: + data["fields"] = [] return cls(**data) # For backwards compatibility diff --git a/src/backend/tests/integration/components/assistants/test_assistants_components.py b/src/backend/tests/integration/components/assistants/test_assistants_components.py new file mode 100644 index 000000000..90e36d4e8 --- /dev/null +++ b/src/backend/tests/integration/components/assistants/test_assistants_components.py @@ -0,0 +1,72 @@ +import pytest + +from tests.integration.utils import run_single_component + + +async def test_list_assistants(): + from langflow.components.astra_assistants import AssistantsListAssistants + + results = await run_single_component( + AssistantsListAssistants, + inputs={}, + ) + assert results["assistants"].text is not None + + +@pytest.mark.api_key_required +@pytest.mark.asyncio +async def test_create_assistants(): + from langflow.components.astra_assistants import AssistantsCreateAssistant + + results = await run_single_component( + AssistantsCreateAssistant, + inputs={ + "assistant_name": "artist-bot", + "instructions": "reply only with ascii art", + "model": "gpt-4o-mini", + }, + ) + assistant_id = results["assistant_id"].text + assert assistant_id is not None + await test_list_assistants() + await get_assistant_name(assistant_id) + thread_id = await test_create_thread() + await run_assistant(assistant_id, thread_id) + + +async def test_create_thread(): + from langflow.components.astra_assistants import AssistantsCreateThread + + results = await run_single_component( + AssistantsCreateThread, + inputs={}, + ) + thread_id = results["thread_id"].text + assert thread_id is not None + return thread_id + + +async def get_assistant_name(assistant_id): + from langflow.components.astra_assistants import AssistantsGetAssistantName + + results = await run_single_component( + AssistantsGetAssistantName, + inputs={ + "assistant_id": assistant_id, + }, + ) + assert results["assistant_name"].text is not None + + +async def run_assistant(assistant_id, thread_id): + from langflow.components.astra_assistants import AssistantsRun + + results = await run_single_component( + AssistantsRun, + inputs={ + "assistant_id": assistant_id, + "user_message": "hello", + "thread_id": thread_id, + }, + ) + assert results["assistant_response"].text is not None