diff --git a/src/backend/base/langflow/components/data/api_request.py b/src/backend/base/langflow/components/data/api_request.py index 50326df83..5772c7ab5 100644 --- a/src/backend/base/langflow/components/data/api_request.py +++ b/src/backend/base/langflow/components/data/api_request.py @@ -26,7 +26,9 @@ from langflow.io import ( StrInput, TableInput, ) -from langflow.schema import Data, DataFrame, Message, dotdict +from langflow.schema import Data +from langflow.schema.dataframe import DataFrame +from langflow.schema.dotdict import dotdict class APIRequestComponent(Component): @@ -154,9 +156,8 @@ class APIRequestComponent(Component): ] outputs = [ - Output(display_name="Data", name="data", method="as_data"), + Output(display_name="Data", name="data", method="make_requests"), Output(display_name="DataFrame", name="dataframe", method="as_dataframe"), - Output(display_name="Message", name="message", method="as_message"), ] def _parse_json_value(self, value: Any) -> Any: @@ -224,30 +225,6 @@ class APIRequestComponent(Component): """Check if an item is a valid key-value dictionary.""" return isinstance(item, dict) and "key" in item and "value" in item - def _unescape_curl(self, curl: str) -> str: - """Unescape a cURL command that might have escaped characters. - - This method handles various forms of escaped cURL commands: - 1. JSON string encoded curl commands - 2. Double escaped quotes - 3. Single escaped quotes - """ - if not curl: - return curl - - try: - # Handle escaped quotes if present - if '\\"' in curl or "\\'" in curl: - curl = curl.replace('\\"', '"').replace("\\'", "'") - try: - return json.loads(curl) - except json.JSONDecodeError: - # If JSON decoding fails, try to handle escaped quotes - return curl.strip('"') - except (ValueError, AttributeError) as e: - self.log(f"Error unescaping curl command: {e}") - return curl # Return original if unescaping fails - def parse_curl(self, curl: str, build_config: dotdict) -> dotdict: """Parse a cURL command and update build configuration. @@ -258,9 +235,6 @@ class APIRequestComponent(Component): Updated build configuration """ try: - # Unescape the curl command if it contains escaped characters - curl = self._unescape_curl(curl) - self.log(f"Unescaped curl command: {curl}") # Log for debugging parsed = parse_context(curl) # Update basic configuration @@ -480,12 +454,7 @@ class APIRequestComponent(Component): self.log("Failed to decode JSON response") result = response.text.encode("utf-8") - # If result is a dictionary, merge it with metadata - if isinstance(result, dict): - metadata.update(result) - else: - # If result is not a dict, store it as 'data' - metadata["data"] = result + metadata.update({"result": result}) if include_httpx_metadata: metadata.update( @@ -559,7 +528,7 @@ class APIRequestComponent(Component): urls = [self.add_query_params(url, query_params) for url in urls] async with httpx.AsyncClient() as client: - return await asyncio.gather( + results = await asyncio.gather( *[ self.make_request( client, @@ -575,6 +544,8 @@ class APIRequestComponent(Component): for u, rec in zip(urls, bodies, strict=False) ] ) + self.status = results + return results async def _response_info( self, response: httpx.Response, *, with_file_path: bool = False @@ -673,16 +644,6 @@ class APIRequestComponent(Component): return processed_headers return {} - async def as_data(self) -> Data: - """Convert the API response data into a DataFrame. - - Returns: - DataFrame: A DataFrame containing the API response data. - """ - data = await self.make_requests() - dicts = {"output": [d.data for d in data]} - return Data(**dicts) - async def as_dataframe(self) -> DataFrame: """Convert the API response data into a DataFrame. @@ -691,12 +652,3 @@ class APIRequestComponent(Component): """ data = await self.make_requests() return DataFrame(data) - - async def as_message(self) -> Message: - """Convert the API response data into a DataFrame. - - Returns: - DataFrame: A DataFrame containing the API response data. - """ - data = await self.as_data() - return Message(text=str(data)) diff --git a/src/frontend/tests/core/features/freeze.spec.ts b/src/frontend/tests/core/features/freeze.spec.ts index 7f9e8fe38..ddc70bc1c 100644 --- a/src/frontend/tests/core/features/freeze.spec.ts +++ b/src/frontend/tests/core/features/freeze.spec.ts @@ -219,6 +219,8 @@ test( await page.getByTestId("icon-FreezeAll").last().click(); + await page.waitForTimeout(3000); + await page.keyboard.press("Escape"); await page.locator('//*[@id="react-flow-id"]').click(); @@ -232,6 +234,8 @@ test( timeout: 1000, }); + await page.waitForTimeout(2000); + await page.getByTestId("button_run_chat output").click(); await page.waitForSelector("text=built successfully", { timeout: 30000 }); @@ -270,12 +274,10 @@ test( await page.getByText("Freeze", { exact: true }).click(); + await page.waitForTimeout(3000); + await page.keyboard.press("Escape"); - await page.locator('//*[@id="react-flow-id"]').click(); - - await page.waitForTimeout(1000); - await page.getByTestId("button_run_chat output").click(); await page.waitForTimeout(1000); @@ -304,15 +306,11 @@ test( .getByPlaceholder("Empty") .textContent(); - expect(firstTextFreezed).toContain("Lorem Ipsum"); - expect(secondRunWithoutFreezing).not.toBe(firstTextFreezed); + expect(firstTextFreezed).toBe(secondRunWithoutFreezing); + + expect(firstTextFreezed).not.toBe(firstRunWithoutFreezing); + expect(firstTextFreezed).not.toBe(thirdTextWithoutFreezing); expect(firstRunWithoutFreezing).not.toBe(secondRunWithoutFreezing); - - expect(thirdTextWithoutFreezing).toContain("Lorem Ipsum"); - - const lengthDifference = Math.abs( - thirdTextWithoutFreezing?.length! - firstTextFreezed?.length!, - ); - expect(lengthDifference).toBeLessThan(100); + expect(thirdTextWithoutFreezing).not.toBe(secondRunWithoutFreezing); }, ); diff --git a/src/frontend/tests/core/integrations/Vector Store.spec.ts b/src/frontend/tests/core/integrations/Vector Store.spec.ts index 8a4ad4289..1aa5cedae 100644 --- a/src/frontend/tests/core/integrations/Vector Store.spec.ts +++ b/src/frontend/tests/core/integrations/Vector Store.spec.ts @@ -11,7 +11,7 @@ declare const __dirname: string; withEventDeliveryModes( "Vector Store RAG", - { tag: ["@release", "@starter-projects", "@development"] }, + { tag: ["@release", "@starter-projects"] }, async ({ page }) => { test.skip( !process?.env?.OPENAI_API_KEY,