From 3b6eb2fac8a2ca36f2e567233de576e958de1e56 Mon Sep 17 00:00:00 2001 From: rafaelsideguide <150964962+rafaelsideguide@users.noreply.github.com> Date: Mon, 10 Jun 2024 14:58:08 -0300 Subject: [PATCH 1/2] Create Firecrawl Example Flow.json --- examples/Firecrawl Example Flow.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 examples/Firecrawl Example Flow.json diff --git a/examples/Firecrawl Example Flow.json b/examples/Firecrawl Example Flow.json new file mode 100644 index 0000000..66c2f91 --- /dev/null +++ b/examples/Firecrawl Example Flow.json @@ -0,0 +1 @@ +{"id":"e9abe229-9f44-4d73-8378-9e6eb865e0c4","data":{"nodes":[{"id":"RecordsOutput-5DXON","type":"genericNode","position":{"x":539.379336965962,"y":1372.1945692127044},"data":{"type":"RecordsOutput","node":{"template":{"input_value":{"type":"Record","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"file_path":"","password":false,"name":"input_value","advanced":false,"dynamic":false,"info":"","load_from_db":false,"title_case":false},"code":{"type":"code","required":true,"placeholder":"","list":false,"show":true,"multiline":true,"value":"from langflow.custom import CustomComponent\nfrom langflow.schema import Record\n\n\nclass RecordsOutput(CustomComponent):\n display_name = \"Records Output\"\n description = \"Display Records as a Table\"\n\n def build(self, input_value: Record) -> Record:\n return input_value\n","fileTypes":[],"file_path":"","password":false,"name":"code","advanced":true,"dynamic":true,"info":"","load_from_db":false,"title_case":false},"_type":"CustomComponent"},"description":"Display Records as a Table","base_classes":["Record"],"display_name":"Records Output","documentation":"","custom_fields":{"input_value":null},"output_types":["Record"],"field_formatters":{},"frozen":false,"field_order":[],"beta":false},"id":"RecordsOutput-5DXON"},"selected":false,"width":384,"height":243,"positionAbsolute":{"x":539.379336965962,"y":1372.1945692127044},"dragging":false},{"id":"JsonToolkit-GWGWb","type":"genericNode","position":{"x":-434.80284717494123,"y":1341.5441567903106},"data":{"type":"JsonToolkit","node":{"template":{"path":{"type":"file","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[".json",".yaml",".yml"],"file_path":"e9abe229-9f44-4d73-8378-9e6eb865e0c4/extractorOptions.json","password":false,"name":"path","display_name":"Path","advanced":false,"dynamic":false,"info":"","load_from_db":false,"title_case":false,"value":""},"code":{"type":"code","required":true,"placeholder":"","list":false,"show":true,"multiline":true,"value":"from pathlib import Path\n\nimport yaml\nfrom langchain_community.agent_toolkits.json.toolkit import JsonToolkit\nfrom langchain_community.tools.json.tool import JsonSpec\n\nfrom langflow.custom import CustomComponent\n\n\nclass JsonToolkitComponent(CustomComponent):\n display_name = \"JsonToolkit\"\n description = \"Toolkit for interacting with a JSON spec.\"\n\n def build_config(self):\n return {\n \"path\": {\n \"display_name\": \"Path\",\n \"field_type\": \"file\",\n \"file_types\": [\"json\", \"yaml\", \"yml\"],\n },\n }\n\n def build(self, path: str) -> JsonToolkit:\n if path.endswith(\"yaml\") or path.endswith(\"yml\"):\n yaml_dict = yaml.load(open(path, \"r\"), Loader=yaml.FullLoader)\n spec = JsonSpec(dict_=yaml_dict)\n else:\n spec = JsonSpec.from_file(Path(path))\n return JsonToolkit(spec=spec)\n","fileTypes":[],"file_path":"","password":false,"name":"code","advanced":true,"dynamic":true,"info":"","load_from_db":false,"title_case":false},"_type":"CustomComponent"},"description":"Toolkit for interacting with a JSON spec.","base_classes":["BaseToolkit","JsonToolkit"],"display_name":"JsonToolkit","documentation":"","custom_fields":{"path":null},"output_types":["JsonToolkit"],"field_formatters":{},"frozen":false,"field_order":[],"beta":false},"id":"JsonToolkit-GWGWb"},"selected":false,"width":384,"height":281,"positionAbsolute":{"x":-434.80284717494123,"y":1341.5441567903106},"dragging":false},{"id":"JsonToolkit-Dk8lh","type":"genericNode","position":{"x":-436.2343823282514,"y":1660.1903164420155},"data":{"type":"JsonToolkit","node":{"template":{"path":{"type":"file","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[".json",".yaml",".yml"],"file_path":"e9abe229-9f44-4d73-8378-9e6eb865e0c4/pageOptions.json","password":false,"name":"path","display_name":"Path","advanced":false,"dynamic":false,"info":"","load_from_db":false,"title_case":false,"value":""},"code":{"type":"code","required":true,"placeholder":"","list":false,"show":true,"multiline":true,"value":"from pathlib import Path\n\nimport yaml\nfrom langchain_community.agent_toolkits.json.toolkit import JsonToolkit\nfrom langchain_community.tools.json.tool import JsonSpec\n\nfrom langflow.custom import CustomComponent\n\n\nclass JsonToolkitComponent(CustomComponent):\n display_name = \"JsonToolkit\"\n description = \"Toolkit for interacting with a JSON spec.\"\n\n def build_config(self):\n return {\n \"path\": {\n \"display_name\": \"Path\",\n \"field_type\": \"file\",\n \"file_types\": [\"json\", \"yaml\", \"yml\"],\n },\n }\n\n def build(self, path: str) -> JsonToolkit:\n if path.endswith(\"yaml\") or path.endswith(\"yml\"):\n yaml_dict = yaml.load(open(path, \"r\"), Loader=yaml.FullLoader)\n spec = JsonSpec(dict_=yaml_dict)\n else:\n spec = JsonSpec.from_file(Path(path))\n return JsonToolkit(spec=spec)\n","fileTypes":[],"file_path":"","password":false,"name":"code","advanced":true,"dynamic":true,"info":"","load_from_db":false,"title_case":false},"_type":"CustomComponent"},"description":"Toolkit for interacting with a JSON spec.","base_classes":["BaseToolkit","JsonToolkit"],"display_name":"JsonToolkit","documentation":"","custom_fields":{"path":null},"output_types":["JsonToolkit"],"field_formatters":{},"frozen":false,"field_order":[],"beta":false},"id":"JsonToolkit-Dk8lh"},"selected":false,"width":384,"height":281,"positionAbsolute":{"x":-436.2343823282514,"y":1660.1903164420155},"dragging":false},{"id":"FirecrawlScrapeApi-OCccl","type":"genericNode","position":{"x":69.80985454831102,"y":1370.031579604784},"data":{"type":"FirecrawlScrapeApi","node":{"template":{"extractorOptions":{"type":"JsonToolkit","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"file_path":"","password":false,"name":"extractorOptions","display_name":"Extractor Options","advanced":false,"dynamic":false,"info":"The extractor options to send with the request.","load_from_db":false,"title_case":false},"pageOptions":{"type":"JsonToolkit","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"file_path":"","password":false,"name":"pageOptions","display_name":"Page Options","advanced":false,"dynamic":false,"info":"The page options to send with the request.","load_from_db":false,"title_case":false},"api_key":{"type":"str","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"file_path":"","password":true,"name":"api_key","display_name":"API Key","advanced":false,"dynamic":false,"info":"The API key to use Firecrawl API.","load_from_db":false,"title_case":false,"input_types":["Text"],"value":""},"code":{"type":"code","required":true,"placeholder":"","list":false,"show":true,"multiline":true,"value":"from typing import Optional\n\nfrom firecrawl.firecrawl import FirecrawlApp\nfrom langflow.custom import CustomComponent\nfrom langflow.schema.schema import Record\nfrom langchain_community.agent_toolkits.json.toolkit import JsonToolkit, JsonGetValueTool\nimport json\n\nclass FirecrawlScrapeApi(CustomComponent):\n display_name: str = \"FirecrawlScrapeApi\"\n description: str = \"Firecrawl Scrape API.\"\n output_types: list[str] = [\"Document\"]\n documentation: str = \"https://docs.firecrawl.dev/api-reference/endpoint/scrape\"\n field_config = {\n \"api_key\": {\n \"display_name\": \"API Key\",\n \"field_type\": \"str\",\n \"required\": True,\n \"password\": True,\n \"info\": \"The API key to use Firecrawl API.\",\n },\n \"url\": {\n \"display_name\": \"URL\",\n \"field_type\": \"str\",\n \"required\": True,\n \"info\": \"The URL to scrape.\",\n },\n \"timeout\": {\n \"display_name\": \"Timeout\",\n \"info\": \"Timeout in milliseconds for the request.\",\n \"field_type\": \"int\",\n \"default_value\": 10000,\n },\n \"pageOptions\": {\n \"display_name\": \"Page Options\",\n \"info\": \"The page options to send with the request.\",\n },\n \"extractorOptions\": {\n \"display_name\": \"Extractor Options\",\n \"info\": \"The extractor options to send with the request.\",\n }\n }\n\n def build(\n self,\n api_key: str,\n url: str,\n timeout: Optional[int] = 10000,\n pageOptions: Optional[JsonToolkit] = None,\n extractorOptions: Optional[JsonToolkit] = None,\n ) -> Record:\n if extractorOptions:\n extractor_options_dict = extractorOptions.spec.dict_\n else:\n extractor_options_dict = {}\n\n if pageOptions:\n page_options_dict = pageOptions.spec.dict_\n else:\n page_options_dict = {}\n\n app = FirecrawlApp(api_key=api_key)\n result = app.scrape_url(url,\n {\n \"timeout\": timeout,\n \"extractorOptions\": json.loads(json.dumps(extractor_options_dict)),\n \"pageOptions\": json.loads(json.dumps(page_options_dict))\n })\n\n record = Record(data=result)\n return record\n","fileTypes":[],"file_path":"","password":false,"name":"code","advanced":true,"dynamic":true,"info":"","load_from_db":false,"title_case":false},"timeout":{"type":"int","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"value":"15000","fileTypes":[],"file_path":"","password":false,"name":"timeout","display_name":"Timeout","advanced":false,"dynamic":false,"info":"Timeout in milliseconds for the request.","load_from_db":false,"title_case":false},"url":{"type":"str","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"file_path":"","password":false,"name":"url","display_name":"URL","advanced":false,"dynamic":false,"info":"The URL to scrape.","load_from_db":false,"title_case":false,"input_types":["Text"],"value":"firecrawl.dev"},"_type":"CustomComponent"},"description":"Firecrawl Scrape API.","base_classes":["Record"],"display_name":"FirecrawlScrapeApi","documentation":"https://docs.firecrawl.dev/api-reference/endpoint/scrape","custom_fields":{"api_key":null,"url":null,"timeout":null,"pageOptions":null,"extractorOptions":null},"output_types":["Record"],"field_formatters":{},"frozen":false,"field_order":["api_key","url","timeout","pageOptions","extractorOptions"],"beta":false},"id":"FirecrawlScrapeApi-OCccl"},"selected":false,"width":384,"height":561,"positionAbsolute":{"x":69.80985454831102,"y":1370.031579604784},"dragging":false},{"id":"JsonToolkit-0NL0m","type":"genericNode","position":{"x":-440.29895336550237,"y":1981.5933616561451},"data":{"type":"JsonToolkit","node":{"template":{"path":{"type":"file","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[".json",".yaml",".yml"],"file_path":"e9abe229-9f44-4d73-8378-9e6eb865e0c4/crawl-crawlerOptions.json","password":false,"name":"path","display_name":"Path","advanced":false,"dynamic":false,"info":"","load_from_db":false,"title_case":false,"value":""},"code":{"type":"code","required":true,"placeholder":"","list":false,"show":true,"multiline":true,"value":"from pathlib import Path\n\nimport yaml\nfrom langchain_community.agent_toolkits.json.toolkit import JsonToolkit\nfrom langchain_community.tools.json.tool import JsonSpec\n\nfrom langflow.custom import CustomComponent\n\n\nclass JsonToolkitComponent(CustomComponent):\n display_name = \"JsonToolkit\"\n description = \"Toolkit for interacting with a JSON spec.\"\n\n def build_config(self):\n return {\n \"path\": {\n \"display_name\": \"Path\",\n \"field_type\": \"file\",\n \"file_types\": [\"json\", \"yaml\", \"yml\"],\n },\n }\n\n def build(self, path: str) -> JsonToolkit:\n if path.endswith(\"yaml\") or path.endswith(\"yml\"):\n yaml_dict = yaml.load(open(path, \"r\"), Loader=yaml.FullLoader)\n spec = JsonSpec(dict_=yaml_dict)\n else:\n spec = JsonSpec.from_file(Path(path))\n return JsonToolkit(spec=spec)\n","fileTypes":[],"file_path":"","password":false,"name":"code","advanced":true,"dynamic":true,"info":"","load_from_db":false,"title_case":false},"_type":"CustomComponent"},"description":"Toolkit for interacting with a JSON spec.","base_classes":["BaseToolkit","JsonToolkit"],"display_name":"JsonToolkit","documentation":"","custom_fields":{"path":null},"output_types":["JsonToolkit"],"field_formatters":{},"frozen":false,"field_order":[],"beta":false},"id":"JsonToolkit-0NL0m"},"selected":false,"width":384,"height":281,"positionAbsolute":{"x":-440.29895336550237,"y":1981.5933616561451},"dragging":false},{"id":"JsonToolkit-0makM","type":"genericNode","position":{"x":-441.75065495104815,"y":2281.0343730743857},"data":{"type":"JsonToolkit","node":{"template":{"path":{"type":"file","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[".json",".yaml",".yml"],"file_path":"e9abe229-9f44-4d73-8378-9e6eb865e0c4/crawl-pageOptions.json","password":false,"name":"path","display_name":"Path","advanced":false,"dynamic":false,"info":"","load_from_db":false,"title_case":false,"value":""},"code":{"type":"code","required":true,"placeholder":"","list":false,"show":true,"multiline":true,"value":"from pathlib import Path\n\nimport yaml\nfrom langchain_community.agent_toolkits.json.toolkit import JsonToolkit\nfrom langchain_community.tools.json.tool import JsonSpec\n\nfrom langflow.custom import CustomComponent\n\n\nclass JsonToolkitComponent(CustomComponent):\n display_name = \"JsonToolkit\"\n description = \"Toolkit for interacting with a JSON spec.\"\n\n def build_config(self):\n return {\n \"path\": {\n \"display_name\": \"Path\",\n \"field_type\": \"file\",\n \"file_types\": [\"json\", \"yaml\", \"yml\"],\n },\n }\n\n def build(self, path: str) -> JsonToolkit:\n if path.endswith(\"yaml\") or path.endswith(\"yml\"):\n yaml_dict = yaml.load(open(path, \"r\"), Loader=yaml.FullLoader)\n spec = JsonSpec(dict_=yaml_dict)\n else:\n spec = JsonSpec.from_file(Path(path))\n return JsonToolkit(spec=spec)\n","fileTypes":[],"file_path":"","password":false,"name":"code","advanced":true,"dynamic":true,"info":"","load_from_db":false,"title_case":false},"_type":"CustomComponent"},"description":"Toolkit for interacting with a JSON spec.","base_classes":["BaseToolkit","JsonToolkit"],"display_name":"JsonToolkit","documentation":"","custom_fields":{"path":null},"output_types":["JsonToolkit"],"field_formatters":{},"frozen":false,"field_order":[],"beta":false},"id":"JsonToolkit-0makM"},"selected":false,"width":384,"height":281,"positionAbsolute":{"x":-441.75065495104815,"y":2281.0343730743857},"dragging":false},{"id":"RecordsOutput-nhViQ","type":"genericNode","position":{"x":552.9895398196198,"y":1986.5088660131942},"data":{"type":"RecordsOutput","node":{"template":{"input_value":{"type":"Record","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"file_path":"","password":false,"name":"input_value","advanced":false,"dynamic":false,"info":"","load_from_db":false,"title_case":false},"code":{"type":"code","required":true,"placeholder":"","list":false,"show":true,"multiline":true,"value":"from langflow.custom import CustomComponent\nfrom langflow.schema import Record\n\n\nclass RecordsOutput(CustomComponent):\n display_name = \"Records Output\"\n description = \"Display Records as a Table\"\n\n def build(self, input_value: Record) -> Record:\n return input_value\n","fileTypes":[],"file_path":"","password":false,"name":"code","advanced":true,"dynamic":true,"info":"","load_from_db":false,"title_case":false},"_type":"CustomComponent"},"description":"Display Records as a Table","base_classes":["Record"],"display_name":"Records Output","documentation":"","custom_fields":{"input_value":null},"output_types":["Record"],"field_formatters":{},"frozen":false,"field_order":[],"beta":false},"id":"RecordsOutput-nhViQ"},"selected":false,"width":384,"height":243,"positionAbsolute":{"x":552.9895398196198,"y":1986.5088660131942},"dragging":false},{"id":"FirecrawlCrawlApi-qSGls","type":"genericNode","position":{"x":67.08952881687424,"y":1975.3035587101715},"data":{"type":"FirecrawlCrawlApi","node":{"template":{"crawlerOptions":{"type":"JsonToolkit","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"file_path":"","password":false,"name":"crawlerOptions","display_name":"Crawler Options","advanced":false,"dynamic":false,"info":"Options for the crawler behavior.","load_from_db":false,"title_case":false},"pageOptions":{"type":"JsonToolkit","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"file_path":"","password":false,"name":"pageOptions","display_name":"Page Options","advanced":false,"dynamic":false,"info":"The page options to send with the request.","load_from_db":false,"title_case":false},"api_key":{"type":"str","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"file_path":"","password":true,"name":"api_key","display_name":"API Key","advanced":false,"dynamic":false,"info":"The API key to use Firecrawl API.","load_from_db":false,"title_case":false,"input_types":["Text"],"value":""},"code":{"type":"code","required":true,"placeholder":"","list":false,"show":true,"multiline":true,"value":"from typing import Optional, Dict, List\nfrom firecrawl.firecrawl import FirecrawlApp\nfrom langflow.custom import CustomComponent\nfrom langflow.schema.schema import Record\nfrom langchain_community.agent_toolkits.json.toolkit import JsonToolkit\nimport json\nimport uuid\n\nclass FirecrawlCrawlApi(CustomComponent):\n display_name: str = \"FirecrawlCrawlApi\"\n description: str = \"Firecrawl Crawl API.\"\n output_types: list[str] = [\"Document\"]\n documentation: str = \"https://docs.firecrawl.dev/api-reference/endpoint/crawl\"\n field_config = {\n \"api_key\": {\n \"display_name\": \"API Key\",\n \"field_type\": \"str\",\n \"required\": True,\n \"password\": True,\n \"info\": \"The API key to use Firecrawl API.\",\n },\n \"url\": {\n \"display_name\": \"URL\",\n \"field_type\": \"str\",\n \"required\": True,\n \"info\": \"The base URL to start crawling from.\",\n },\n \"crawlerOptions\": {\n \"display_name\": \"Crawler Options\",\n \"info\": \"Options for the crawler behavior.\",\n },\n \"pageOptions\": {\n \"display_name\": \"Page Options\",\n \"info\": \"The page options to send with the request.\",\n },\n \"idempotency_key\": {\n \"display_name\": \"Idempotency Key\",\n \"field_type\": \"str\",\n \"info\": \"Optional idempotency key to ensure unique requests.\",\n }\n }\n\n def build(\n self,\n api_key: str,\n url: str,\n crawlerOptions: Optional[JsonToolkit] = None,\n pageOptions: Optional[JsonToolkit] = None,\n idempotency_key: Optional[str] = None,\n ) -> Record:\n if crawlerOptions:\n crawler_options_dict = crawlerOptions.spec.dict_\n else:\n crawler_options_dict = {}\n\n if pageOptions:\n page_options_dict = pageOptions.spec.dict_\n else:\n page_options_dict = {}\n\n if not idempotency_key:\n idempotency_key = str(uuid.uuid4())\n\n app = FirecrawlApp(api_key=api_key)\n crawl_result = app.crawl_url(url, {\n \"crawlerOptions\": json.loads(json.dumps(crawler_options_dict)),\n \"pageOptions\": json.loads(json.dumps(page_options_dict))\n }, True, 2, idempotency_key)\n\n records = [Record(data=item) for item in crawl_result]\n\n return records\n\n","fileTypes":[],"file_path":"","password":false,"name":"code","advanced":true,"dynamic":true,"info":"","load_from_db":false,"title_case":false},"idempotency_key":{"type":"str","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"file_path":"","password":false,"name":"idempotency_key","display_name":"Idempotency Key","advanced":false,"dynamic":false,"info":"Optional idempotency key to ensure unique requests.","load_from_db":false,"title_case":false,"input_types":["Text"]},"url":{"type":"str","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"file_path":"","password":false,"name":"url","display_name":"URL","advanced":false,"dynamic":false,"info":"The base URL to start crawling from.","load_from_db":false,"title_case":false,"input_types":["Text"],"value":"mendable.ai"},"_type":"CustomComponent"},"description":"Firecrawl Crawl API.","base_classes":["Record"],"display_name":"FirecrawlCrawlApi","documentation":"https://docs.firecrawl.dev/api-reference/endpoint/crawl","custom_fields":{"api_key":null,"url":null,"crawlerOptions":null,"pageOptions":null,"idempotency_key":null},"output_types":["Record"],"field_formatters":{},"frozen":false,"field_order":["api_key","url","crawlerOptions","pageOptions","idempotency_key"],"beta":false},"id":"FirecrawlCrawlApi-qSGls"},"selected":false,"width":384,"height":569,"positionAbsolute":{"x":67.08952881687424,"y":1975.3035587101715},"dragging":false},{"id":"RecordsOutput-vHkTG","type":"genericNode","position":{"x":567.4942926953071,"y":2587.4667988961455},"data":{"type":"RecordsOutput","node":{"template":{"input_value":{"type":"Record","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"file_path":"","password":false,"name":"input_value","advanced":false,"dynamic":false,"info":"","load_from_db":false,"title_case":false},"code":{"type":"code","required":true,"placeholder":"","list":false,"show":true,"multiline":true,"value":"from langflow.custom import CustomComponent\nfrom langflow.schema import Record\n\n\nclass RecordsOutput(CustomComponent):\n display_name = \"Records Output\"\n description = \"Display Records as a Table\"\n\n def build(self, input_value: Record) -> Record:\n return input_value\n","fileTypes":[],"file_path":"","password":false,"name":"code","advanced":true,"dynamic":true,"info":"","load_from_db":false,"title_case":false},"_type":"CustomComponent"},"description":"Display Records as a Table","base_classes":["Record"],"display_name":"Records Output","documentation":"","custom_fields":{"input_value":null},"output_types":["Record"],"field_formatters":{},"frozen":false,"field_order":[],"beta":false},"id":"RecordsOutput-vHkTG"},"selected":false,"width":384,"height":243,"positionAbsolute":{"x":567.4942926953071,"y":2587.4667988961455},"dragging":false},{"id":"FirecrawlSearchApi-V3hSr","type":"genericNode","position":{"x":61.86192100906817,"y":2588.7475107364617},"data":{"type":"FirecrawlSearchApi","node":{"template":{"pageOptions":{"type":"JsonToolkit","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"file_path":"","password":false,"name":"pageOptions","display_name":"Page Options","advanced":false,"dynamic":false,"info":"Options to control the page content returned.","load_from_db":false,"title_case":false},"searchOptions":{"type":"JsonToolkit","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"file_path":"","password":false,"name":"searchOptions","display_name":"Search Options","advanced":false,"dynamic":false,"info":"Options to refine search results.","load_from_db":false,"title_case":false},"api_key":{"type":"str","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"file_path":"","password":true,"name":"api_key","display_name":"API Key","advanced":false,"dynamic":false,"info":"The API key to use Firecrawl API.","load_from_db":false,"title_case":false,"input_types":["Text"],"value":""},"code":{"type":"code","required":true,"placeholder":"","list":false,"show":true,"multiline":true,"value":"from typing import Optional, Dict, List\nfrom firecrawl.firecrawl import FirecrawlApp\nfrom langflow.custom import CustomComponent\nfrom langflow.schema.schema import Record\nfrom langchain_community.agent_toolkits.json.toolkit import JsonToolkit\nimport json\nimport uuid\n\nclass FirecrawlSearchApi(CustomComponent):\n display_name: str = \"FirecrawlSearchApi\"\n description: str = \"Firecrawl Search API.\"\n output_types: list[str] = [\"Document\"]\n documentation: str = \"https://docs.firecrawl.dev/api-reference/endpoint/search\"\n field_config = {\n \"api_key\": {\n \"display_name\": \"API Key\",\n \"field_type\": \"str\",\n \"required\": True,\n \"password\": True,\n \"info\": \"The API key to use Firecrawl API.\",\n },\n \"query\": {\n \"display_name\": \"Query\",\n \"field_type\": \"str\",\n \"required\": True,\n \"info\": \"The query string to search for.\",\n },\n \"searchOptions\": {\n \"display_name\": \"Search Options\",\n \"info\": \"Options to refine search results.\",\n },\n \"pageOptions\": {\n \"display_name\": \"Page Options\",\n \"info\": \"Options to control the page content returned.\",\n }\n }\n\n def build(\n self,\n api_key: str,\n query: str,\n searchOptions: Optional[JsonToolkit] = None,\n pageOptions: Optional[JsonToolkit] = None,\n ) -> List[Record]:\n if searchOptions:\n search_options_dict = searchOptions.spec.dict_\n else:\n search_options_dict = {}\n\n if pageOptions:\n page_options_dict = pageOptions.spec.dict_\n else:\n page_options_dict = {}\n\n app = FirecrawlApp(api_key=api_key)\n search_result = app.search(query, {\n \"searchOptions\": json.loads(json.dumps(search_options_dict)),\n \"pageOptions\": json.loads(json.dumps(page_options_dict))\n })\n\n records = [Record(data=item) for item in search_result]\n\n return records","fileTypes":[],"file_path":"","password":false,"name":"code","advanced":true,"dynamic":true,"info":"","load_from_db":false,"title_case":false},"query":{"type":"str","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"file_path":"","password":false,"name":"query","display_name":"Query","advanced":false,"dynamic":false,"info":"The query string to search for.","load_from_db":false,"title_case":false,"input_types":["Text"],"value":"what is firecrawl?"},"_type":"CustomComponent"},"description":"Firecrawl Search API.","base_classes":["Record"],"display_name":"FirecrawlSearchApi","documentation":"https://docs.firecrawl.dev/api-reference/endpoint/search","custom_fields":{"api_key":null,"query":null,"searchOptions":null,"pageOptions":null},"output_types":["Record"],"field_formatters":{},"frozen":false,"field_order":["api_key","query","searchOptions","pageOptions"],"beta":false},"id":"FirecrawlSearchApi-V3hSr"},"selected":false,"width":384,"height":475,"positionAbsolute":{"x":61.86192100906817,"y":2588.7475107364617},"dragging":false},{"id":"JsonToolkit-gIRv9","type":"genericNode","position":{"x":-435.23804503786255,"y":2594.9101012563156},"data":{"type":"JsonToolkit","node":{"template":{"path":{"type":"file","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[".json",".yaml",".yml"],"file_path":"e9abe229-9f44-4d73-8378-9e6eb865e0c4/search-pageOptions.json","password":false,"name":"path","display_name":"Path","advanced":false,"dynamic":false,"info":"","load_from_db":false,"title_case":false,"value":""},"code":{"type":"code","required":true,"placeholder":"","list":false,"show":true,"multiline":true,"value":"from pathlib import Path\n\nimport yaml\nfrom langchain_community.agent_toolkits.json.toolkit import JsonToolkit\nfrom langchain_community.tools.json.tool import JsonSpec\n\nfrom langflow.custom import CustomComponent\n\n\nclass JsonToolkitComponent(CustomComponent):\n display_name = \"JsonToolkit\"\n description = \"Toolkit for interacting with a JSON spec.\"\n\n def build_config(self):\n return {\n \"path\": {\n \"display_name\": \"Path\",\n \"field_type\": \"file\",\n \"file_types\": [\"json\", \"yaml\", \"yml\"],\n },\n }\n\n def build(self, path: str) -> JsonToolkit:\n if path.endswith(\"yaml\") or path.endswith(\"yml\"):\n yaml_dict = yaml.load(open(path, \"r\"), Loader=yaml.FullLoader)\n spec = JsonSpec(dict_=yaml_dict)\n else:\n spec = JsonSpec.from_file(Path(path))\n return JsonToolkit(spec=spec)\n","fileTypes":[],"file_path":"","password":false,"name":"code","advanced":true,"dynamic":true,"info":"","load_from_db":false,"title_case":false},"_type":"CustomComponent"},"description":"Toolkit for interacting with a JSON spec.","base_classes":["BaseToolkit","JsonToolkit"],"display_name":"JsonToolkit","documentation":"","custom_fields":{"path":null},"output_types":["JsonToolkit"],"field_formatters":{},"frozen":false,"field_order":[],"beta":false},"id":"JsonToolkit-gIRv9"},"selected":false,"width":384,"height":281,"positionAbsolute":{"x":-435.23804503786255,"y":2594.9101012563156},"dragging":false},{"id":"JsonToolkit-f1X1W","type":"genericNode","position":{"x":-434.27860941616603,"y":2913.3688078123396},"data":{"type":"JsonToolkit","node":{"template":{"path":{"type":"file","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[".json",".yaml",".yml"],"file_path":"e9abe229-9f44-4d73-8378-9e6eb865e0c4/search-searchOptions.json","password":false,"name":"path","display_name":"Path","advanced":false,"dynamic":false,"info":"","load_from_db":false,"title_case":false,"value":""},"code":{"type":"code","required":true,"placeholder":"","list":false,"show":true,"multiline":true,"value":"from pathlib import Path\n\nimport yaml\nfrom langchain_community.agent_toolkits.json.toolkit import JsonToolkit\nfrom langchain_community.tools.json.tool import JsonSpec\n\nfrom langflow.custom import CustomComponent\n\n\nclass JsonToolkitComponent(CustomComponent):\n display_name = \"JsonToolkit\"\n description = \"Toolkit for interacting with a JSON spec.\"\n\n def build_config(self):\n return {\n \"path\": {\n \"display_name\": \"Path\",\n \"field_type\": \"file\",\n \"file_types\": [\"json\", \"yaml\", \"yml\"],\n },\n }\n\n def build(self, path: str) -> JsonToolkit:\n if path.endswith(\"yaml\") or path.endswith(\"yml\"):\n yaml_dict = yaml.load(open(path, \"r\"), Loader=yaml.FullLoader)\n spec = JsonSpec(dict_=yaml_dict)\n else:\n spec = JsonSpec.from_file(Path(path))\n return JsonToolkit(spec=spec)\n","fileTypes":[],"file_path":"","password":false,"name":"code","advanced":true,"dynamic":true,"info":"","load_from_db":false,"title_case":false},"_type":"CustomComponent"},"description":"Toolkit for interacting with a JSON spec.","base_classes":["BaseToolkit","JsonToolkit"],"display_name":"JsonToolkit","documentation":"","custom_fields":{"path":null},"output_types":["JsonToolkit"],"field_formatters":{},"frozen":false,"field_order":[],"beta":false},"id":"JsonToolkit-f1X1W"},"selected":false,"width":384,"height":281,"positionAbsolute":{"x":-434.27860941616603,"y":2913.3688078123396},"dragging":false}],"edges":[{"source":"FirecrawlScrapeApi-OCccl","sourceHandle":"{œbaseClassesœ:[œRecordœ],œdataTypeœ:œFirecrawlScrapeApiœ,œidœ:œFirecrawlScrapeApi-OCcclœ}","target":"RecordsOutput-5DXON","targetHandle":"{œfieldNameœ:œinput_valueœ,œidœ:œRecordsOutput-5DXONœ,œinputTypesœ:null,œtypeœ:œRecordœ}","data":{"targetHandle":{"fieldName":"input_value","id":"RecordsOutput-5DXON","inputTypes":null,"type":"Record"},"sourceHandle":{"baseClasses":["Record"],"dataType":"FirecrawlScrapeApi","id":"FirecrawlScrapeApi-OCccl"}},"style":{"stroke":"#555"},"className":"stroke-gray-900 stroke-connection","id":"reactflow__edge-FirecrawlScrapeApi-OCccl{œbaseClassesœ:[œRecordœ],œdataTypeœ:œFirecrawlScrapeApiœ,œidœ:œFirecrawlScrapeApi-OCcclœ}-RecordsOutput-5DXON{œfieldNameœ:œinput_valueœ,œidœ:œRecordsOutput-5DXONœ,œinputTypesœ:null,œtypeœ:œRecordœ}"},{"source":"JsonToolkit-Dk8lh","sourceHandle":"{œbaseClassesœ:[œBaseToolkitœ,œJsonToolkitœ],œdataTypeœ:œJsonToolkitœ,œidœ:œJsonToolkit-Dk8lhœ}","target":"FirecrawlScrapeApi-OCccl","targetHandle":"{œfieldNameœ:œpageOptionsœ,œidœ:œFirecrawlScrapeApi-OCcclœ,œinputTypesœ:null,œtypeœ:œJsonToolkitœ}","data":{"targetHandle":{"fieldName":"pageOptions","id":"FirecrawlScrapeApi-OCccl","inputTypes":null,"type":"JsonToolkit"},"sourceHandle":{"baseClasses":["BaseToolkit","JsonToolkit"],"dataType":"JsonToolkit","id":"JsonToolkit-Dk8lh"}},"style":{"stroke":"#555"},"className":"stroke-gray-900 stroke-connection","id":"reactflow__edge-JsonToolkit-Dk8lh{œbaseClassesœ:[œBaseToolkitœ,œJsonToolkitœ],œdataTypeœ:œJsonToolkitœ,œidœ:œJsonToolkit-Dk8lhœ}-FirecrawlScrapeApi-OCccl{œfieldNameœ:œpageOptionsœ,œidœ:œFirecrawlScrapeApi-OCcclœ,œinputTypesœ:null,œtypeœ:œJsonToolkitœ}"},{"source":"JsonToolkit-GWGWb","sourceHandle":"{œbaseClassesœ:[œBaseToolkitœ,œJsonToolkitœ],œdataTypeœ:œJsonToolkitœ,œidœ:œJsonToolkit-GWGWbœ}","target":"FirecrawlScrapeApi-OCccl","targetHandle":"{œfieldNameœ:œextractorOptionsœ,œidœ:œFirecrawlScrapeApi-OCcclœ,œinputTypesœ:null,œtypeœ:œJsonToolkitœ}","data":{"targetHandle":{"fieldName":"extractorOptions","id":"FirecrawlScrapeApi-OCccl","inputTypes":null,"type":"JsonToolkit"},"sourceHandle":{"baseClasses":["BaseToolkit","JsonToolkit"],"dataType":"JsonToolkit","id":"JsonToolkit-GWGWb"}},"style":{"stroke":"#555"},"className":"stroke-gray-900 stroke-connection","id":"reactflow__edge-JsonToolkit-GWGWb{œbaseClassesœ:[œBaseToolkitœ,œJsonToolkitœ],œdataTypeœ:œJsonToolkitœ,œidœ:œJsonToolkit-GWGWbœ}-FirecrawlScrapeApi-OCccl{œfieldNameœ:œextractorOptionsœ,œidœ:œFirecrawlScrapeApi-OCcclœ,œinputTypesœ:null,œtypeœ:œJsonToolkitœ}"},{"source":"JsonToolkit-0NL0m","sourceHandle":"{œbaseClassesœ:[œBaseToolkitœ,œJsonToolkitœ],œdataTypeœ:œJsonToolkitœ,œidœ:œJsonToolkit-0NL0mœ}","target":"FirecrawlCrawlApi-qSGls","targetHandle":"{œfieldNameœ:œcrawlerOptionsœ,œidœ:œFirecrawlCrawlApi-qSGlsœ,œinputTypesœ:null,œtypeœ:œJsonToolkitœ}","data":{"targetHandle":{"fieldName":"crawlerOptions","id":"FirecrawlCrawlApi-qSGls","inputTypes":null,"type":"JsonToolkit"},"sourceHandle":{"baseClasses":["BaseToolkit","JsonToolkit"],"dataType":"JsonToolkit","id":"JsonToolkit-0NL0m"}},"style":{"stroke":"#555"},"className":"stroke-gray-900 stroke-connection","id":"reactflow__edge-JsonToolkit-0NL0m{œbaseClassesœ:[œBaseToolkitœ,œJsonToolkitœ],œdataTypeœ:œJsonToolkitœ,œidœ:œJsonToolkit-0NL0mœ}-FirecrawlCrawlApi-qSGls{œfieldNameœ:œcrawlerOptionsœ,œidœ:œFirecrawlCrawlApi-qSGlsœ,œinputTypesœ:null,œtypeœ:œJsonToolkitœ}"},{"source":"JsonToolkit-0makM","sourceHandle":"{œbaseClassesœ:[œBaseToolkitœ,œJsonToolkitœ],œdataTypeœ:œJsonToolkitœ,œidœ:œJsonToolkit-0makMœ}","target":"FirecrawlCrawlApi-qSGls","targetHandle":"{œfieldNameœ:œpageOptionsœ,œidœ:œFirecrawlCrawlApi-qSGlsœ,œinputTypesœ:null,œtypeœ:œJsonToolkitœ}","data":{"targetHandle":{"fieldName":"pageOptions","id":"FirecrawlCrawlApi-qSGls","inputTypes":null,"type":"JsonToolkit"},"sourceHandle":{"baseClasses":["BaseToolkit","JsonToolkit"],"dataType":"JsonToolkit","id":"JsonToolkit-0makM"}},"style":{"stroke":"#555"},"className":"stroke-gray-900 stroke-connection","id":"reactflow__edge-JsonToolkit-0makM{œbaseClassesœ:[œBaseToolkitœ,œJsonToolkitœ],œdataTypeœ:œJsonToolkitœ,œidœ:œJsonToolkit-0makMœ}-FirecrawlCrawlApi-qSGls{œfieldNameœ:œpageOptionsœ,œidœ:œFirecrawlCrawlApi-qSGlsœ,œinputTypesœ:null,œtypeœ:œJsonToolkitœ}"},{"source":"FirecrawlCrawlApi-qSGls","sourceHandle":"{œbaseClassesœ:[œRecordœ],œdataTypeœ:œFirecrawlCrawlApiœ,œidœ:œFirecrawlCrawlApi-qSGlsœ}","target":"RecordsOutput-nhViQ","targetHandle":"{œfieldNameœ:œinput_valueœ,œidœ:œRecordsOutput-nhViQœ,œinputTypesœ:null,œtypeœ:œRecordœ}","data":{"targetHandle":{"fieldName":"input_value","id":"RecordsOutput-nhViQ","inputTypes":null,"type":"Record"},"sourceHandle":{"baseClasses":["Record"],"dataType":"FirecrawlCrawlApi","id":"FirecrawlCrawlApi-qSGls"}},"style":{"stroke":"#555"},"className":"stroke-gray-900 stroke-connection","id":"reactflow__edge-FirecrawlCrawlApi-qSGls{œbaseClassesœ:[œRecordœ],œdataTypeœ:œFirecrawlCrawlApiœ,œidœ:œFirecrawlCrawlApi-qSGlsœ}-RecordsOutput-nhViQ{œfieldNameœ:œinput_valueœ,œidœ:œRecordsOutput-nhViQœ,œinputTypesœ:null,œtypeœ:œRecordœ}"},{"source":"FirecrawlSearchApi-V3hSr","sourceHandle":"{œbaseClassesœ:[œRecordœ],œdataTypeœ:œFirecrawlSearchApiœ,œidœ:œFirecrawlSearchApi-V3hSrœ}","target":"RecordsOutput-vHkTG","targetHandle":"{œfieldNameœ:œinput_valueœ,œidœ:œRecordsOutput-vHkTGœ,œinputTypesœ:null,œtypeœ:œRecordœ}","data":{"targetHandle":{"fieldName":"input_value","id":"RecordsOutput-vHkTG","inputTypes":null,"type":"Record"},"sourceHandle":{"baseClasses":["Record"],"dataType":"FirecrawlSearchApi","id":"FirecrawlSearchApi-V3hSr"}},"style":{"stroke":"#555"},"className":"stroke-gray-900 stroke-connection","id":"reactflow__edge-FirecrawlSearchApi-V3hSr{œbaseClassesœ:[œRecordœ],œdataTypeœ:œFirecrawlSearchApiœ,œidœ:œFirecrawlSearchApi-V3hSrœ}-RecordsOutput-vHkTG{œfieldNameœ:œinput_valueœ,œidœ:œRecordsOutput-vHkTGœ,œinputTypesœ:null,œtypeœ:œRecordœ}"},{"source":"JsonToolkit-gIRv9","sourceHandle":"{œbaseClassesœ:[œBaseToolkitœ,œJsonToolkitœ],œdataTypeœ:œJsonToolkitœ,œidœ:œJsonToolkit-gIRv9œ}","target":"FirecrawlSearchApi-V3hSr","targetHandle":"{œfieldNameœ:œpageOptionsœ,œidœ:œFirecrawlSearchApi-V3hSrœ,œinputTypesœ:null,œtypeœ:œJsonToolkitœ}","data":{"targetHandle":{"fieldName":"pageOptions","id":"FirecrawlSearchApi-V3hSr","inputTypes":null,"type":"JsonToolkit"},"sourceHandle":{"baseClasses":["BaseToolkit","JsonToolkit"],"dataType":"JsonToolkit","id":"JsonToolkit-gIRv9"}},"style":{"stroke":"#555"},"className":"stroke-gray-900 stroke-connection","id":"reactflow__edge-JsonToolkit-gIRv9{œbaseClassesœ:[œBaseToolkitœ,œJsonToolkitœ],œdataTypeœ:œJsonToolkitœ,œidœ:œJsonToolkit-gIRv9œ}-FirecrawlSearchApi-V3hSr{œfieldNameœ:œpageOptionsœ,œidœ:œFirecrawlSearchApi-V3hSrœ,œinputTypesœ:null,œtypeœ:œJsonToolkitœ}"},{"source":"JsonToolkit-f1X1W","sourceHandle":"{œbaseClassesœ:[œBaseToolkitœ,œJsonToolkitœ],œdataTypeœ:œJsonToolkitœ,œidœ:œJsonToolkit-f1X1Wœ}","target":"FirecrawlSearchApi-V3hSr","targetHandle":"{œfieldNameœ:œsearchOptionsœ,œidœ:œFirecrawlSearchApi-V3hSrœ,œinputTypesœ:null,œtypeœ:œJsonToolkitœ}","data":{"targetHandle":{"fieldName":"searchOptions","id":"FirecrawlSearchApi-V3hSr","inputTypes":null,"type":"JsonToolkit"},"sourceHandle":{"baseClasses":["BaseToolkit","JsonToolkit"],"dataType":"JsonToolkit","id":"JsonToolkit-f1X1W"}},"style":{"stroke":"#555"},"className":"stroke-gray-900 stroke-connection","id":"reactflow__edge-JsonToolkit-f1X1W{œbaseClassesœ:[œBaseToolkitœ,œJsonToolkitœ],œdataTypeœ:œJsonToolkitœ,œidœ:œJsonToolkit-f1X1Wœ}-FirecrawlSearchApi-V3hSr{œfieldNameœ:œsearchOptionsœ,œidœ:œFirecrawlSearchApi-V3hSrœ,œinputTypesœ:null,œtypeœ:œJsonToolkitœ}"}],"viewport":{"x":487.23774423746426,"y":-345.8165841381664,"zoom":0.3255992766184716}},"description":"Firecrawl example flow with Crawl, Search and Scrape components.","name":"Firecrawl Flow Example","last_tested_version":"1.0.0a49","is_component":false} \ No newline at end of file From 6aeff97167e3f0eb32adc740a24491a4d39ece1a Mon Sep 17 00:00:00 2001 From: Rafael Miller <150964962+rafaelsideguide@users.noreply.github.com> Date: Tue, 25 Jun 2024 17:43:57 -0300 Subject: [PATCH 2/2] Update Firecrawl Example Flow.json --- examples/Firecrawl Example Flow.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/Firecrawl Example Flow.json b/examples/Firecrawl Example Flow.json index 66c2f91..9899aa7 100644 --- a/examples/Firecrawl Example Flow.json +++ b/examples/Firecrawl Example Flow.json @@ -1 +1 @@ -{"id":"e9abe229-9f44-4d73-8378-9e6eb865e0c4","data":{"nodes":[{"id":"RecordsOutput-5DXON","type":"genericNode","position":{"x":539.379336965962,"y":1372.1945692127044},"data":{"type":"RecordsOutput","node":{"template":{"input_value":{"type":"Record","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"file_path":"","password":false,"name":"input_value","advanced":false,"dynamic":false,"info":"","load_from_db":false,"title_case":false},"code":{"type":"code","required":true,"placeholder":"","list":false,"show":true,"multiline":true,"value":"from langflow.custom import CustomComponent\nfrom langflow.schema import Record\n\n\nclass RecordsOutput(CustomComponent):\n display_name = \"Records Output\"\n description = \"Display Records as a Table\"\n\n def build(self, input_value: Record) -> Record:\n return input_value\n","fileTypes":[],"file_path":"","password":false,"name":"code","advanced":true,"dynamic":true,"info":"","load_from_db":false,"title_case":false},"_type":"CustomComponent"},"description":"Display Records as a Table","base_classes":["Record"],"display_name":"Records Output","documentation":"","custom_fields":{"input_value":null},"output_types":["Record"],"field_formatters":{},"frozen":false,"field_order":[],"beta":false},"id":"RecordsOutput-5DXON"},"selected":false,"width":384,"height":243,"positionAbsolute":{"x":539.379336965962,"y":1372.1945692127044},"dragging":false},{"id":"JsonToolkit-GWGWb","type":"genericNode","position":{"x":-434.80284717494123,"y":1341.5441567903106},"data":{"type":"JsonToolkit","node":{"template":{"path":{"type":"file","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[".json",".yaml",".yml"],"file_path":"e9abe229-9f44-4d73-8378-9e6eb865e0c4/extractorOptions.json","password":false,"name":"path","display_name":"Path","advanced":false,"dynamic":false,"info":"","load_from_db":false,"title_case":false,"value":""},"code":{"type":"code","required":true,"placeholder":"","list":false,"show":true,"multiline":true,"value":"from pathlib import Path\n\nimport yaml\nfrom langchain_community.agent_toolkits.json.toolkit import JsonToolkit\nfrom langchain_community.tools.json.tool import JsonSpec\n\nfrom langflow.custom import CustomComponent\n\n\nclass JsonToolkitComponent(CustomComponent):\n display_name = \"JsonToolkit\"\n description = \"Toolkit for interacting with a JSON spec.\"\n\n def build_config(self):\n return {\n \"path\": {\n \"display_name\": \"Path\",\n \"field_type\": \"file\",\n \"file_types\": [\"json\", \"yaml\", \"yml\"],\n },\n }\n\n def build(self, path: str) -> JsonToolkit:\n if path.endswith(\"yaml\") or path.endswith(\"yml\"):\n yaml_dict = yaml.load(open(path, \"r\"), Loader=yaml.FullLoader)\n spec = JsonSpec(dict_=yaml_dict)\n else:\n spec = JsonSpec.from_file(Path(path))\n return JsonToolkit(spec=spec)\n","fileTypes":[],"file_path":"","password":false,"name":"code","advanced":true,"dynamic":true,"info":"","load_from_db":false,"title_case":false},"_type":"CustomComponent"},"description":"Toolkit for interacting with a JSON spec.","base_classes":["BaseToolkit","JsonToolkit"],"display_name":"JsonToolkit","documentation":"","custom_fields":{"path":null},"output_types":["JsonToolkit"],"field_formatters":{},"frozen":false,"field_order":[],"beta":false},"id":"JsonToolkit-GWGWb"},"selected":false,"width":384,"height":281,"positionAbsolute":{"x":-434.80284717494123,"y":1341.5441567903106},"dragging":false},{"id":"JsonToolkit-Dk8lh","type":"genericNode","position":{"x":-436.2343823282514,"y":1660.1903164420155},"data":{"type":"JsonToolkit","node":{"template":{"path":{"type":"file","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[".json",".yaml",".yml"],"file_path":"e9abe229-9f44-4d73-8378-9e6eb865e0c4/pageOptions.json","password":false,"name":"path","display_name":"Path","advanced":false,"dynamic":false,"info":"","load_from_db":false,"title_case":false,"value":""},"code":{"type":"code","required":true,"placeholder":"","list":false,"show":true,"multiline":true,"value":"from pathlib import Path\n\nimport yaml\nfrom langchain_community.agent_toolkits.json.toolkit import JsonToolkit\nfrom langchain_community.tools.json.tool import JsonSpec\n\nfrom langflow.custom import CustomComponent\n\n\nclass JsonToolkitComponent(CustomComponent):\n display_name = \"JsonToolkit\"\n description = \"Toolkit for interacting with a JSON spec.\"\n\n def build_config(self):\n return {\n \"path\": {\n \"display_name\": \"Path\",\n \"field_type\": \"file\",\n \"file_types\": [\"json\", \"yaml\", \"yml\"],\n },\n }\n\n def build(self, path: str) -> JsonToolkit:\n if path.endswith(\"yaml\") or path.endswith(\"yml\"):\n yaml_dict = yaml.load(open(path, \"r\"), Loader=yaml.FullLoader)\n spec = JsonSpec(dict_=yaml_dict)\n else:\n spec = JsonSpec.from_file(Path(path))\n return JsonToolkit(spec=spec)\n","fileTypes":[],"file_path":"","password":false,"name":"code","advanced":true,"dynamic":true,"info":"","load_from_db":false,"title_case":false},"_type":"CustomComponent"},"description":"Toolkit for interacting with a JSON spec.","base_classes":["BaseToolkit","JsonToolkit"],"display_name":"JsonToolkit","documentation":"","custom_fields":{"path":null},"output_types":["JsonToolkit"],"field_formatters":{},"frozen":false,"field_order":[],"beta":false},"id":"JsonToolkit-Dk8lh"},"selected":false,"width":384,"height":281,"positionAbsolute":{"x":-436.2343823282514,"y":1660.1903164420155},"dragging":false},{"id":"FirecrawlScrapeApi-OCccl","type":"genericNode","position":{"x":69.80985454831102,"y":1370.031579604784},"data":{"type":"FirecrawlScrapeApi","node":{"template":{"extractorOptions":{"type":"JsonToolkit","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"file_path":"","password":false,"name":"extractorOptions","display_name":"Extractor Options","advanced":false,"dynamic":false,"info":"The extractor options to send with the request.","load_from_db":false,"title_case":false},"pageOptions":{"type":"JsonToolkit","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"file_path":"","password":false,"name":"pageOptions","display_name":"Page Options","advanced":false,"dynamic":false,"info":"The page options to send with the request.","load_from_db":false,"title_case":false},"api_key":{"type":"str","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"file_path":"","password":true,"name":"api_key","display_name":"API Key","advanced":false,"dynamic":false,"info":"The API key to use Firecrawl API.","load_from_db":false,"title_case":false,"input_types":["Text"],"value":""},"code":{"type":"code","required":true,"placeholder":"","list":false,"show":true,"multiline":true,"value":"from typing import Optional\n\nfrom firecrawl.firecrawl import FirecrawlApp\nfrom langflow.custom import CustomComponent\nfrom langflow.schema.schema import Record\nfrom langchain_community.agent_toolkits.json.toolkit import JsonToolkit, JsonGetValueTool\nimport json\n\nclass FirecrawlScrapeApi(CustomComponent):\n display_name: str = \"FirecrawlScrapeApi\"\n description: str = \"Firecrawl Scrape API.\"\n output_types: list[str] = [\"Document\"]\n documentation: str = \"https://docs.firecrawl.dev/api-reference/endpoint/scrape\"\n field_config = {\n \"api_key\": {\n \"display_name\": \"API Key\",\n \"field_type\": \"str\",\n \"required\": True,\n \"password\": True,\n \"info\": \"The API key to use Firecrawl API.\",\n },\n \"url\": {\n \"display_name\": \"URL\",\n \"field_type\": \"str\",\n \"required\": True,\n \"info\": \"The URL to scrape.\",\n },\n \"timeout\": {\n \"display_name\": \"Timeout\",\n \"info\": \"Timeout in milliseconds for the request.\",\n \"field_type\": \"int\",\n \"default_value\": 10000,\n },\n \"pageOptions\": {\n \"display_name\": \"Page Options\",\n \"info\": \"The page options to send with the request.\",\n },\n \"extractorOptions\": {\n \"display_name\": \"Extractor Options\",\n \"info\": \"The extractor options to send with the request.\",\n }\n }\n\n def build(\n self,\n api_key: str,\n url: str,\n timeout: Optional[int] = 10000,\n pageOptions: Optional[JsonToolkit] = None,\n extractorOptions: Optional[JsonToolkit] = None,\n ) -> Record:\n if extractorOptions:\n extractor_options_dict = extractorOptions.spec.dict_\n else:\n extractor_options_dict = {}\n\n if pageOptions:\n page_options_dict = pageOptions.spec.dict_\n else:\n page_options_dict = {}\n\n app = FirecrawlApp(api_key=api_key)\n result = app.scrape_url(url,\n {\n \"timeout\": timeout,\n \"extractorOptions\": json.loads(json.dumps(extractor_options_dict)),\n \"pageOptions\": json.loads(json.dumps(page_options_dict))\n })\n\n record = Record(data=result)\n return record\n","fileTypes":[],"file_path":"","password":false,"name":"code","advanced":true,"dynamic":true,"info":"","load_from_db":false,"title_case":false},"timeout":{"type":"int","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"value":"15000","fileTypes":[],"file_path":"","password":false,"name":"timeout","display_name":"Timeout","advanced":false,"dynamic":false,"info":"Timeout in milliseconds for the request.","load_from_db":false,"title_case":false},"url":{"type":"str","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"file_path":"","password":false,"name":"url","display_name":"URL","advanced":false,"dynamic":false,"info":"The URL to scrape.","load_from_db":false,"title_case":false,"input_types":["Text"],"value":"firecrawl.dev"},"_type":"CustomComponent"},"description":"Firecrawl Scrape API.","base_classes":["Record"],"display_name":"FirecrawlScrapeApi","documentation":"https://docs.firecrawl.dev/api-reference/endpoint/scrape","custom_fields":{"api_key":null,"url":null,"timeout":null,"pageOptions":null,"extractorOptions":null},"output_types":["Record"],"field_formatters":{},"frozen":false,"field_order":["api_key","url","timeout","pageOptions","extractorOptions"],"beta":false},"id":"FirecrawlScrapeApi-OCccl"},"selected":false,"width":384,"height":561,"positionAbsolute":{"x":69.80985454831102,"y":1370.031579604784},"dragging":false},{"id":"JsonToolkit-0NL0m","type":"genericNode","position":{"x":-440.29895336550237,"y":1981.5933616561451},"data":{"type":"JsonToolkit","node":{"template":{"path":{"type":"file","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[".json",".yaml",".yml"],"file_path":"e9abe229-9f44-4d73-8378-9e6eb865e0c4/crawl-crawlerOptions.json","password":false,"name":"path","display_name":"Path","advanced":false,"dynamic":false,"info":"","load_from_db":false,"title_case":false,"value":""},"code":{"type":"code","required":true,"placeholder":"","list":false,"show":true,"multiline":true,"value":"from pathlib import Path\n\nimport yaml\nfrom langchain_community.agent_toolkits.json.toolkit import JsonToolkit\nfrom langchain_community.tools.json.tool import JsonSpec\n\nfrom langflow.custom import CustomComponent\n\n\nclass JsonToolkitComponent(CustomComponent):\n display_name = \"JsonToolkit\"\n description = \"Toolkit for interacting with a JSON spec.\"\n\n def build_config(self):\n return {\n \"path\": {\n \"display_name\": \"Path\",\n \"field_type\": \"file\",\n \"file_types\": [\"json\", \"yaml\", \"yml\"],\n },\n }\n\n def build(self, path: str) -> JsonToolkit:\n if path.endswith(\"yaml\") or path.endswith(\"yml\"):\n yaml_dict = yaml.load(open(path, \"r\"), Loader=yaml.FullLoader)\n spec = JsonSpec(dict_=yaml_dict)\n else:\n spec = JsonSpec.from_file(Path(path))\n return JsonToolkit(spec=spec)\n","fileTypes":[],"file_path":"","password":false,"name":"code","advanced":true,"dynamic":true,"info":"","load_from_db":false,"title_case":false},"_type":"CustomComponent"},"description":"Toolkit for interacting with a JSON spec.","base_classes":["BaseToolkit","JsonToolkit"],"display_name":"JsonToolkit","documentation":"","custom_fields":{"path":null},"output_types":["JsonToolkit"],"field_formatters":{},"frozen":false,"field_order":[],"beta":false},"id":"JsonToolkit-0NL0m"},"selected":false,"width":384,"height":281,"positionAbsolute":{"x":-440.29895336550237,"y":1981.5933616561451},"dragging":false},{"id":"JsonToolkit-0makM","type":"genericNode","position":{"x":-441.75065495104815,"y":2281.0343730743857},"data":{"type":"JsonToolkit","node":{"template":{"path":{"type":"file","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[".json",".yaml",".yml"],"file_path":"e9abe229-9f44-4d73-8378-9e6eb865e0c4/crawl-pageOptions.json","password":false,"name":"path","display_name":"Path","advanced":false,"dynamic":false,"info":"","load_from_db":false,"title_case":false,"value":""},"code":{"type":"code","required":true,"placeholder":"","list":false,"show":true,"multiline":true,"value":"from pathlib import Path\n\nimport yaml\nfrom langchain_community.agent_toolkits.json.toolkit import JsonToolkit\nfrom langchain_community.tools.json.tool import JsonSpec\n\nfrom langflow.custom import CustomComponent\n\n\nclass JsonToolkitComponent(CustomComponent):\n display_name = \"JsonToolkit\"\n description = \"Toolkit for interacting with a JSON spec.\"\n\n def build_config(self):\n return {\n \"path\": {\n \"display_name\": \"Path\",\n \"field_type\": \"file\",\n \"file_types\": [\"json\", \"yaml\", \"yml\"],\n },\n }\n\n def build(self, path: str) -> JsonToolkit:\n if path.endswith(\"yaml\") or path.endswith(\"yml\"):\n yaml_dict = yaml.load(open(path, \"r\"), Loader=yaml.FullLoader)\n spec = JsonSpec(dict_=yaml_dict)\n else:\n spec = JsonSpec.from_file(Path(path))\n return JsonToolkit(spec=spec)\n","fileTypes":[],"file_path":"","password":false,"name":"code","advanced":true,"dynamic":true,"info":"","load_from_db":false,"title_case":false},"_type":"CustomComponent"},"description":"Toolkit for interacting with a JSON spec.","base_classes":["BaseToolkit","JsonToolkit"],"display_name":"JsonToolkit","documentation":"","custom_fields":{"path":null},"output_types":["JsonToolkit"],"field_formatters":{},"frozen":false,"field_order":[],"beta":false},"id":"JsonToolkit-0makM"},"selected":false,"width":384,"height":281,"positionAbsolute":{"x":-441.75065495104815,"y":2281.0343730743857},"dragging":false},{"id":"RecordsOutput-nhViQ","type":"genericNode","position":{"x":552.9895398196198,"y":1986.5088660131942},"data":{"type":"RecordsOutput","node":{"template":{"input_value":{"type":"Record","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"file_path":"","password":false,"name":"input_value","advanced":false,"dynamic":false,"info":"","load_from_db":false,"title_case":false},"code":{"type":"code","required":true,"placeholder":"","list":false,"show":true,"multiline":true,"value":"from langflow.custom import CustomComponent\nfrom langflow.schema import Record\n\n\nclass RecordsOutput(CustomComponent):\n display_name = \"Records Output\"\n description = \"Display Records as a Table\"\n\n def build(self, input_value: Record) -> Record:\n return input_value\n","fileTypes":[],"file_path":"","password":false,"name":"code","advanced":true,"dynamic":true,"info":"","load_from_db":false,"title_case":false},"_type":"CustomComponent"},"description":"Display Records as a Table","base_classes":["Record"],"display_name":"Records Output","documentation":"","custom_fields":{"input_value":null},"output_types":["Record"],"field_formatters":{},"frozen":false,"field_order":[],"beta":false},"id":"RecordsOutput-nhViQ"},"selected":false,"width":384,"height":243,"positionAbsolute":{"x":552.9895398196198,"y":1986.5088660131942},"dragging":false},{"id":"FirecrawlCrawlApi-qSGls","type":"genericNode","position":{"x":67.08952881687424,"y":1975.3035587101715},"data":{"type":"FirecrawlCrawlApi","node":{"template":{"crawlerOptions":{"type":"JsonToolkit","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"file_path":"","password":false,"name":"crawlerOptions","display_name":"Crawler Options","advanced":false,"dynamic":false,"info":"Options for the crawler behavior.","load_from_db":false,"title_case":false},"pageOptions":{"type":"JsonToolkit","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"file_path":"","password":false,"name":"pageOptions","display_name":"Page Options","advanced":false,"dynamic":false,"info":"The page options to send with the request.","load_from_db":false,"title_case":false},"api_key":{"type":"str","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"file_path":"","password":true,"name":"api_key","display_name":"API Key","advanced":false,"dynamic":false,"info":"The API key to use Firecrawl API.","load_from_db":false,"title_case":false,"input_types":["Text"],"value":""},"code":{"type":"code","required":true,"placeholder":"","list":false,"show":true,"multiline":true,"value":"from typing import Optional, Dict, List\nfrom firecrawl.firecrawl import FirecrawlApp\nfrom langflow.custom import CustomComponent\nfrom langflow.schema.schema import Record\nfrom langchain_community.agent_toolkits.json.toolkit import JsonToolkit\nimport json\nimport uuid\n\nclass FirecrawlCrawlApi(CustomComponent):\n display_name: str = \"FirecrawlCrawlApi\"\n description: str = \"Firecrawl Crawl API.\"\n output_types: list[str] = [\"Document\"]\n documentation: str = \"https://docs.firecrawl.dev/api-reference/endpoint/crawl\"\n field_config = {\n \"api_key\": {\n \"display_name\": \"API Key\",\n \"field_type\": \"str\",\n \"required\": True,\n \"password\": True,\n \"info\": \"The API key to use Firecrawl API.\",\n },\n \"url\": {\n \"display_name\": \"URL\",\n \"field_type\": \"str\",\n \"required\": True,\n \"info\": \"The base URL to start crawling from.\",\n },\n \"crawlerOptions\": {\n \"display_name\": \"Crawler Options\",\n \"info\": \"Options for the crawler behavior.\",\n },\n \"pageOptions\": {\n \"display_name\": \"Page Options\",\n \"info\": \"The page options to send with the request.\",\n },\n \"idempotency_key\": {\n \"display_name\": \"Idempotency Key\",\n \"field_type\": \"str\",\n \"info\": \"Optional idempotency key to ensure unique requests.\",\n }\n }\n\n def build(\n self,\n api_key: str,\n url: str,\n crawlerOptions: Optional[JsonToolkit] = None,\n pageOptions: Optional[JsonToolkit] = None,\n idempotency_key: Optional[str] = None,\n ) -> Record:\n if crawlerOptions:\n crawler_options_dict = crawlerOptions.spec.dict_\n else:\n crawler_options_dict = {}\n\n if pageOptions:\n page_options_dict = pageOptions.spec.dict_\n else:\n page_options_dict = {}\n\n if not idempotency_key:\n idempotency_key = str(uuid.uuid4())\n\n app = FirecrawlApp(api_key=api_key)\n crawl_result = app.crawl_url(url, {\n \"crawlerOptions\": json.loads(json.dumps(crawler_options_dict)),\n \"pageOptions\": json.loads(json.dumps(page_options_dict))\n }, True, 2, idempotency_key)\n\n records = [Record(data=item) for item in crawl_result]\n\n return records\n\n","fileTypes":[],"file_path":"","password":false,"name":"code","advanced":true,"dynamic":true,"info":"","load_from_db":false,"title_case":false},"idempotency_key":{"type":"str","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"file_path":"","password":false,"name":"idempotency_key","display_name":"Idempotency Key","advanced":false,"dynamic":false,"info":"Optional idempotency key to ensure unique requests.","load_from_db":false,"title_case":false,"input_types":["Text"]},"url":{"type":"str","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"file_path":"","password":false,"name":"url","display_name":"URL","advanced":false,"dynamic":false,"info":"The base URL to start crawling from.","load_from_db":false,"title_case":false,"input_types":["Text"],"value":"mendable.ai"},"_type":"CustomComponent"},"description":"Firecrawl Crawl API.","base_classes":["Record"],"display_name":"FirecrawlCrawlApi","documentation":"https://docs.firecrawl.dev/api-reference/endpoint/crawl","custom_fields":{"api_key":null,"url":null,"crawlerOptions":null,"pageOptions":null,"idempotency_key":null},"output_types":["Record"],"field_formatters":{},"frozen":false,"field_order":["api_key","url","crawlerOptions","pageOptions","idempotency_key"],"beta":false},"id":"FirecrawlCrawlApi-qSGls"},"selected":false,"width":384,"height":569,"positionAbsolute":{"x":67.08952881687424,"y":1975.3035587101715},"dragging":false},{"id":"RecordsOutput-vHkTG","type":"genericNode","position":{"x":567.4942926953071,"y":2587.4667988961455},"data":{"type":"RecordsOutput","node":{"template":{"input_value":{"type":"Record","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"file_path":"","password":false,"name":"input_value","advanced":false,"dynamic":false,"info":"","load_from_db":false,"title_case":false},"code":{"type":"code","required":true,"placeholder":"","list":false,"show":true,"multiline":true,"value":"from langflow.custom import CustomComponent\nfrom langflow.schema import Record\n\n\nclass RecordsOutput(CustomComponent):\n display_name = \"Records Output\"\n description = \"Display Records as a Table\"\n\n def build(self, input_value: Record) -> Record:\n return input_value\n","fileTypes":[],"file_path":"","password":false,"name":"code","advanced":true,"dynamic":true,"info":"","load_from_db":false,"title_case":false},"_type":"CustomComponent"},"description":"Display Records as a Table","base_classes":["Record"],"display_name":"Records Output","documentation":"","custom_fields":{"input_value":null},"output_types":["Record"],"field_formatters":{},"frozen":false,"field_order":[],"beta":false},"id":"RecordsOutput-vHkTG"},"selected":false,"width":384,"height":243,"positionAbsolute":{"x":567.4942926953071,"y":2587.4667988961455},"dragging":false},{"id":"FirecrawlSearchApi-V3hSr","type":"genericNode","position":{"x":61.86192100906817,"y":2588.7475107364617},"data":{"type":"FirecrawlSearchApi","node":{"template":{"pageOptions":{"type":"JsonToolkit","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"file_path":"","password":false,"name":"pageOptions","display_name":"Page Options","advanced":false,"dynamic":false,"info":"Options to control the page content returned.","load_from_db":false,"title_case":false},"searchOptions":{"type":"JsonToolkit","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"file_path":"","password":false,"name":"searchOptions","display_name":"Search Options","advanced":false,"dynamic":false,"info":"Options to refine search results.","load_from_db":false,"title_case":false},"api_key":{"type":"str","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"file_path":"","password":true,"name":"api_key","display_name":"API Key","advanced":false,"dynamic":false,"info":"The API key to use Firecrawl API.","load_from_db":false,"title_case":false,"input_types":["Text"],"value":""},"code":{"type":"code","required":true,"placeholder":"","list":false,"show":true,"multiline":true,"value":"from typing import Optional, Dict, List\nfrom firecrawl.firecrawl import FirecrawlApp\nfrom langflow.custom import CustomComponent\nfrom langflow.schema.schema import Record\nfrom langchain_community.agent_toolkits.json.toolkit import JsonToolkit\nimport json\nimport uuid\n\nclass FirecrawlSearchApi(CustomComponent):\n display_name: str = \"FirecrawlSearchApi\"\n description: str = \"Firecrawl Search API.\"\n output_types: list[str] = [\"Document\"]\n documentation: str = \"https://docs.firecrawl.dev/api-reference/endpoint/search\"\n field_config = {\n \"api_key\": {\n \"display_name\": \"API Key\",\n \"field_type\": \"str\",\n \"required\": True,\n \"password\": True,\n \"info\": \"The API key to use Firecrawl API.\",\n },\n \"query\": {\n \"display_name\": \"Query\",\n \"field_type\": \"str\",\n \"required\": True,\n \"info\": \"The query string to search for.\",\n },\n \"searchOptions\": {\n \"display_name\": \"Search Options\",\n \"info\": \"Options to refine search results.\",\n },\n \"pageOptions\": {\n \"display_name\": \"Page Options\",\n \"info\": \"Options to control the page content returned.\",\n }\n }\n\n def build(\n self,\n api_key: str,\n query: str,\n searchOptions: Optional[JsonToolkit] = None,\n pageOptions: Optional[JsonToolkit] = None,\n ) -> List[Record]:\n if searchOptions:\n search_options_dict = searchOptions.spec.dict_\n else:\n search_options_dict = {}\n\n if pageOptions:\n page_options_dict = pageOptions.spec.dict_\n else:\n page_options_dict = {}\n\n app = FirecrawlApp(api_key=api_key)\n search_result = app.search(query, {\n \"searchOptions\": json.loads(json.dumps(search_options_dict)),\n \"pageOptions\": json.loads(json.dumps(page_options_dict))\n })\n\n records = [Record(data=item) for item in search_result]\n\n return records","fileTypes":[],"file_path":"","password":false,"name":"code","advanced":true,"dynamic":true,"info":"","load_from_db":false,"title_case":false},"query":{"type":"str","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"file_path":"","password":false,"name":"query","display_name":"Query","advanced":false,"dynamic":false,"info":"The query string to search for.","load_from_db":false,"title_case":false,"input_types":["Text"],"value":"what is firecrawl?"},"_type":"CustomComponent"},"description":"Firecrawl Search API.","base_classes":["Record"],"display_name":"FirecrawlSearchApi","documentation":"https://docs.firecrawl.dev/api-reference/endpoint/search","custom_fields":{"api_key":null,"query":null,"searchOptions":null,"pageOptions":null},"output_types":["Record"],"field_formatters":{},"frozen":false,"field_order":["api_key","query","searchOptions","pageOptions"],"beta":false},"id":"FirecrawlSearchApi-V3hSr"},"selected":false,"width":384,"height":475,"positionAbsolute":{"x":61.86192100906817,"y":2588.7475107364617},"dragging":false},{"id":"JsonToolkit-gIRv9","type":"genericNode","position":{"x":-435.23804503786255,"y":2594.9101012563156},"data":{"type":"JsonToolkit","node":{"template":{"path":{"type":"file","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[".json",".yaml",".yml"],"file_path":"e9abe229-9f44-4d73-8378-9e6eb865e0c4/search-pageOptions.json","password":false,"name":"path","display_name":"Path","advanced":false,"dynamic":false,"info":"","load_from_db":false,"title_case":false,"value":""},"code":{"type":"code","required":true,"placeholder":"","list":false,"show":true,"multiline":true,"value":"from pathlib import Path\n\nimport yaml\nfrom langchain_community.agent_toolkits.json.toolkit import JsonToolkit\nfrom langchain_community.tools.json.tool import JsonSpec\n\nfrom langflow.custom import CustomComponent\n\n\nclass JsonToolkitComponent(CustomComponent):\n display_name = \"JsonToolkit\"\n description = \"Toolkit for interacting with a JSON spec.\"\n\n def build_config(self):\n return {\n \"path\": {\n \"display_name\": \"Path\",\n \"field_type\": \"file\",\n \"file_types\": [\"json\", \"yaml\", \"yml\"],\n },\n }\n\n def build(self, path: str) -> JsonToolkit:\n if path.endswith(\"yaml\") or path.endswith(\"yml\"):\n yaml_dict = yaml.load(open(path, \"r\"), Loader=yaml.FullLoader)\n spec = JsonSpec(dict_=yaml_dict)\n else:\n spec = JsonSpec.from_file(Path(path))\n return JsonToolkit(spec=spec)\n","fileTypes":[],"file_path":"","password":false,"name":"code","advanced":true,"dynamic":true,"info":"","load_from_db":false,"title_case":false},"_type":"CustomComponent"},"description":"Toolkit for interacting with a JSON spec.","base_classes":["BaseToolkit","JsonToolkit"],"display_name":"JsonToolkit","documentation":"","custom_fields":{"path":null},"output_types":["JsonToolkit"],"field_formatters":{},"frozen":false,"field_order":[],"beta":false},"id":"JsonToolkit-gIRv9"},"selected":false,"width":384,"height":281,"positionAbsolute":{"x":-435.23804503786255,"y":2594.9101012563156},"dragging":false},{"id":"JsonToolkit-f1X1W","type":"genericNode","position":{"x":-434.27860941616603,"y":2913.3688078123396},"data":{"type":"JsonToolkit","node":{"template":{"path":{"type":"file","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[".json",".yaml",".yml"],"file_path":"e9abe229-9f44-4d73-8378-9e6eb865e0c4/search-searchOptions.json","password":false,"name":"path","display_name":"Path","advanced":false,"dynamic":false,"info":"","load_from_db":false,"title_case":false,"value":""},"code":{"type":"code","required":true,"placeholder":"","list":false,"show":true,"multiline":true,"value":"from pathlib import Path\n\nimport yaml\nfrom langchain_community.agent_toolkits.json.toolkit import JsonToolkit\nfrom langchain_community.tools.json.tool import JsonSpec\n\nfrom langflow.custom import CustomComponent\n\n\nclass JsonToolkitComponent(CustomComponent):\n display_name = \"JsonToolkit\"\n description = \"Toolkit for interacting with a JSON spec.\"\n\n def build_config(self):\n return {\n \"path\": {\n \"display_name\": \"Path\",\n \"field_type\": \"file\",\n \"file_types\": [\"json\", \"yaml\", \"yml\"],\n },\n }\n\n def build(self, path: str) -> JsonToolkit:\n if path.endswith(\"yaml\") or path.endswith(\"yml\"):\n yaml_dict = yaml.load(open(path, \"r\"), Loader=yaml.FullLoader)\n spec = JsonSpec(dict_=yaml_dict)\n else:\n spec = JsonSpec.from_file(Path(path))\n return JsonToolkit(spec=spec)\n","fileTypes":[],"file_path":"","password":false,"name":"code","advanced":true,"dynamic":true,"info":"","load_from_db":false,"title_case":false},"_type":"CustomComponent"},"description":"Toolkit for interacting with a JSON spec.","base_classes":["BaseToolkit","JsonToolkit"],"display_name":"JsonToolkit","documentation":"","custom_fields":{"path":null},"output_types":["JsonToolkit"],"field_formatters":{},"frozen":false,"field_order":[],"beta":false},"id":"JsonToolkit-f1X1W"},"selected":false,"width":384,"height":281,"positionAbsolute":{"x":-434.27860941616603,"y":2913.3688078123396},"dragging":false}],"edges":[{"source":"FirecrawlScrapeApi-OCccl","sourceHandle":"{œbaseClassesœ:[œRecordœ],œdataTypeœ:œFirecrawlScrapeApiœ,œidœ:œFirecrawlScrapeApi-OCcclœ}","target":"RecordsOutput-5DXON","targetHandle":"{œfieldNameœ:œinput_valueœ,œidœ:œRecordsOutput-5DXONœ,œinputTypesœ:null,œtypeœ:œRecordœ}","data":{"targetHandle":{"fieldName":"input_value","id":"RecordsOutput-5DXON","inputTypes":null,"type":"Record"},"sourceHandle":{"baseClasses":["Record"],"dataType":"FirecrawlScrapeApi","id":"FirecrawlScrapeApi-OCccl"}},"style":{"stroke":"#555"},"className":"stroke-gray-900 stroke-connection","id":"reactflow__edge-FirecrawlScrapeApi-OCccl{œbaseClassesœ:[œRecordœ],œdataTypeœ:œFirecrawlScrapeApiœ,œidœ:œFirecrawlScrapeApi-OCcclœ}-RecordsOutput-5DXON{œfieldNameœ:œinput_valueœ,œidœ:œRecordsOutput-5DXONœ,œinputTypesœ:null,œtypeœ:œRecordœ}"},{"source":"JsonToolkit-Dk8lh","sourceHandle":"{œbaseClassesœ:[œBaseToolkitœ,œJsonToolkitœ],œdataTypeœ:œJsonToolkitœ,œidœ:œJsonToolkit-Dk8lhœ}","target":"FirecrawlScrapeApi-OCccl","targetHandle":"{œfieldNameœ:œpageOptionsœ,œidœ:œFirecrawlScrapeApi-OCcclœ,œinputTypesœ:null,œtypeœ:œJsonToolkitœ}","data":{"targetHandle":{"fieldName":"pageOptions","id":"FirecrawlScrapeApi-OCccl","inputTypes":null,"type":"JsonToolkit"},"sourceHandle":{"baseClasses":["BaseToolkit","JsonToolkit"],"dataType":"JsonToolkit","id":"JsonToolkit-Dk8lh"}},"style":{"stroke":"#555"},"className":"stroke-gray-900 stroke-connection","id":"reactflow__edge-JsonToolkit-Dk8lh{œbaseClassesœ:[œBaseToolkitœ,œJsonToolkitœ],œdataTypeœ:œJsonToolkitœ,œidœ:œJsonToolkit-Dk8lhœ}-FirecrawlScrapeApi-OCccl{œfieldNameœ:œpageOptionsœ,œidœ:œFirecrawlScrapeApi-OCcclœ,œinputTypesœ:null,œtypeœ:œJsonToolkitœ}"},{"source":"JsonToolkit-GWGWb","sourceHandle":"{œbaseClassesœ:[œBaseToolkitœ,œJsonToolkitœ],œdataTypeœ:œJsonToolkitœ,œidœ:œJsonToolkit-GWGWbœ}","target":"FirecrawlScrapeApi-OCccl","targetHandle":"{œfieldNameœ:œextractorOptionsœ,œidœ:œFirecrawlScrapeApi-OCcclœ,œinputTypesœ:null,œtypeœ:œJsonToolkitœ}","data":{"targetHandle":{"fieldName":"extractorOptions","id":"FirecrawlScrapeApi-OCccl","inputTypes":null,"type":"JsonToolkit"},"sourceHandle":{"baseClasses":["BaseToolkit","JsonToolkit"],"dataType":"JsonToolkit","id":"JsonToolkit-GWGWb"}},"style":{"stroke":"#555"},"className":"stroke-gray-900 stroke-connection","id":"reactflow__edge-JsonToolkit-GWGWb{œbaseClassesœ:[œBaseToolkitœ,œJsonToolkitœ],œdataTypeœ:œJsonToolkitœ,œidœ:œJsonToolkit-GWGWbœ}-FirecrawlScrapeApi-OCccl{œfieldNameœ:œextractorOptionsœ,œidœ:œFirecrawlScrapeApi-OCcclœ,œinputTypesœ:null,œtypeœ:œJsonToolkitœ}"},{"source":"JsonToolkit-0NL0m","sourceHandle":"{œbaseClassesœ:[œBaseToolkitœ,œJsonToolkitœ],œdataTypeœ:œJsonToolkitœ,œidœ:œJsonToolkit-0NL0mœ}","target":"FirecrawlCrawlApi-qSGls","targetHandle":"{œfieldNameœ:œcrawlerOptionsœ,œidœ:œFirecrawlCrawlApi-qSGlsœ,œinputTypesœ:null,œtypeœ:œJsonToolkitœ}","data":{"targetHandle":{"fieldName":"crawlerOptions","id":"FirecrawlCrawlApi-qSGls","inputTypes":null,"type":"JsonToolkit"},"sourceHandle":{"baseClasses":["BaseToolkit","JsonToolkit"],"dataType":"JsonToolkit","id":"JsonToolkit-0NL0m"}},"style":{"stroke":"#555"},"className":"stroke-gray-900 stroke-connection","id":"reactflow__edge-JsonToolkit-0NL0m{œbaseClassesœ:[œBaseToolkitœ,œJsonToolkitœ],œdataTypeœ:œJsonToolkitœ,œidœ:œJsonToolkit-0NL0mœ}-FirecrawlCrawlApi-qSGls{œfieldNameœ:œcrawlerOptionsœ,œidœ:œFirecrawlCrawlApi-qSGlsœ,œinputTypesœ:null,œtypeœ:œJsonToolkitœ}"},{"source":"JsonToolkit-0makM","sourceHandle":"{œbaseClassesœ:[œBaseToolkitœ,œJsonToolkitœ],œdataTypeœ:œJsonToolkitœ,œidœ:œJsonToolkit-0makMœ}","target":"FirecrawlCrawlApi-qSGls","targetHandle":"{œfieldNameœ:œpageOptionsœ,œidœ:œFirecrawlCrawlApi-qSGlsœ,œinputTypesœ:null,œtypeœ:œJsonToolkitœ}","data":{"targetHandle":{"fieldName":"pageOptions","id":"FirecrawlCrawlApi-qSGls","inputTypes":null,"type":"JsonToolkit"},"sourceHandle":{"baseClasses":["BaseToolkit","JsonToolkit"],"dataType":"JsonToolkit","id":"JsonToolkit-0makM"}},"style":{"stroke":"#555"},"className":"stroke-gray-900 stroke-connection","id":"reactflow__edge-JsonToolkit-0makM{œbaseClassesœ:[œBaseToolkitœ,œJsonToolkitœ],œdataTypeœ:œJsonToolkitœ,œidœ:œJsonToolkit-0makMœ}-FirecrawlCrawlApi-qSGls{œfieldNameœ:œpageOptionsœ,œidœ:œFirecrawlCrawlApi-qSGlsœ,œinputTypesœ:null,œtypeœ:œJsonToolkitœ}"},{"source":"FirecrawlCrawlApi-qSGls","sourceHandle":"{œbaseClassesœ:[œRecordœ],œdataTypeœ:œFirecrawlCrawlApiœ,œidœ:œFirecrawlCrawlApi-qSGlsœ}","target":"RecordsOutput-nhViQ","targetHandle":"{œfieldNameœ:œinput_valueœ,œidœ:œRecordsOutput-nhViQœ,œinputTypesœ:null,œtypeœ:œRecordœ}","data":{"targetHandle":{"fieldName":"input_value","id":"RecordsOutput-nhViQ","inputTypes":null,"type":"Record"},"sourceHandle":{"baseClasses":["Record"],"dataType":"FirecrawlCrawlApi","id":"FirecrawlCrawlApi-qSGls"}},"style":{"stroke":"#555"},"className":"stroke-gray-900 stroke-connection","id":"reactflow__edge-FirecrawlCrawlApi-qSGls{œbaseClassesœ:[œRecordœ],œdataTypeœ:œFirecrawlCrawlApiœ,œidœ:œFirecrawlCrawlApi-qSGlsœ}-RecordsOutput-nhViQ{œfieldNameœ:œinput_valueœ,œidœ:œRecordsOutput-nhViQœ,œinputTypesœ:null,œtypeœ:œRecordœ}"},{"source":"FirecrawlSearchApi-V3hSr","sourceHandle":"{œbaseClassesœ:[œRecordœ],œdataTypeœ:œFirecrawlSearchApiœ,œidœ:œFirecrawlSearchApi-V3hSrœ}","target":"RecordsOutput-vHkTG","targetHandle":"{œfieldNameœ:œinput_valueœ,œidœ:œRecordsOutput-vHkTGœ,œinputTypesœ:null,œtypeœ:œRecordœ}","data":{"targetHandle":{"fieldName":"input_value","id":"RecordsOutput-vHkTG","inputTypes":null,"type":"Record"},"sourceHandle":{"baseClasses":["Record"],"dataType":"FirecrawlSearchApi","id":"FirecrawlSearchApi-V3hSr"}},"style":{"stroke":"#555"},"className":"stroke-gray-900 stroke-connection","id":"reactflow__edge-FirecrawlSearchApi-V3hSr{œbaseClassesœ:[œRecordœ],œdataTypeœ:œFirecrawlSearchApiœ,œidœ:œFirecrawlSearchApi-V3hSrœ}-RecordsOutput-vHkTG{œfieldNameœ:œinput_valueœ,œidœ:œRecordsOutput-vHkTGœ,œinputTypesœ:null,œtypeœ:œRecordœ}"},{"source":"JsonToolkit-gIRv9","sourceHandle":"{œbaseClassesœ:[œBaseToolkitœ,œJsonToolkitœ],œdataTypeœ:œJsonToolkitœ,œidœ:œJsonToolkit-gIRv9œ}","target":"FirecrawlSearchApi-V3hSr","targetHandle":"{œfieldNameœ:œpageOptionsœ,œidœ:œFirecrawlSearchApi-V3hSrœ,œinputTypesœ:null,œtypeœ:œJsonToolkitœ}","data":{"targetHandle":{"fieldName":"pageOptions","id":"FirecrawlSearchApi-V3hSr","inputTypes":null,"type":"JsonToolkit"},"sourceHandle":{"baseClasses":["BaseToolkit","JsonToolkit"],"dataType":"JsonToolkit","id":"JsonToolkit-gIRv9"}},"style":{"stroke":"#555"},"className":"stroke-gray-900 stroke-connection","id":"reactflow__edge-JsonToolkit-gIRv9{œbaseClassesœ:[œBaseToolkitœ,œJsonToolkitœ],œdataTypeœ:œJsonToolkitœ,œidœ:œJsonToolkit-gIRv9œ}-FirecrawlSearchApi-V3hSr{œfieldNameœ:œpageOptionsœ,œidœ:œFirecrawlSearchApi-V3hSrœ,œinputTypesœ:null,œtypeœ:œJsonToolkitœ}"},{"source":"JsonToolkit-f1X1W","sourceHandle":"{œbaseClassesœ:[œBaseToolkitœ,œJsonToolkitœ],œdataTypeœ:œJsonToolkitœ,œidœ:œJsonToolkit-f1X1Wœ}","target":"FirecrawlSearchApi-V3hSr","targetHandle":"{œfieldNameœ:œsearchOptionsœ,œidœ:œFirecrawlSearchApi-V3hSrœ,œinputTypesœ:null,œtypeœ:œJsonToolkitœ}","data":{"targetHandle":{"fieldName":"searchOptions","id":"FirecrawlSearchApi-V3hSr","inputTypes":null,"type":"JsonToolkit"},"sourceHandle":{"baseClasses":["BaseToolkit","JsonToolkit"],"dataType":"JsonToolkit","id":"JsonToolkit-f1X1W"}},"style":{"stroke":"#555"},"className":"stroke-gray-900 stroke-connection","id":"reactflow__edge-JsonToolkit-f1X1W{œbaseClassesœ:[œBaseToolkitœ,œJsonToolkitœ],œdataTypeœ:œJsonToolkitœ,œidœ:œJsonToolkit-f1X1Wœ}-FirecrawlSearchApi-V3hSr{œfieldNameœ:œsearchOptionsœ,œidœ:œFirecrawlSearchApi-V3hSrœ,œinputTypesœ:null,œtypeœ:œJsonToolkitœ}"}],"viewport":{"x":487.23774423746426,"y":-345.8165841381664,"zoom":0.3255992766184716}},"description":"Firecrawl example flow with Crawl, Search and Scrape components.","name":"Firecrawl Flow Example","last_tested_version":"1.0.0a49","is_component":false} \ No newline at end of file +{"id":"c427e888-97ec-461e-89e0-949e3199c815","data":{"nodes":[{"id":"File-SX5Zi","type":"genericNode","position":{"x":243.04974018776431,"y":-419.3520777543521},"data":{"type":"File","node":{"template":{"_type":"Component","path":{"trace_as_metadata":true,"file_path":"c427e888-97ec-461e-89e0-949e3199c815/pageOptions.json","fileTypes":["txt","md","mdx","csv","json","yaml","yml","xml","html","htm","pdf","docx","py","sh","sql","js","ts","tsx"],"list":false,"required":false,"placeholder":"","show":true,"value":"","name":"path","display_name":"Path","advanced":false,"dynamic":false,"info":"Supported file types: txt, md, mdx, csv, json, yaml, yml, xml, html, htm, pdf, docx, py, sh, sql, js, ts, tsx","title_case":false,"type":"file"},"code":{"type":"code","required":true,"placeholder":"","list":false,"show":true,"multiline":true,"value":"from pathlib import Path\n\nfrom langflow.base.data.utils import TEXT_FILE_TYPES, parse_text_file_to_data\nfrom langflow.custom import Component\nfrom langflow.io import BoolInput, FileInput, Output\nfrom langflow.schema import Data\n\n\nclass FileComponent(Component):\n display_name = \"File\"\n description = \"A generic file loader.\"\n icon = \"file-text\"\n\n inputs = [\n FileInput(\n name=\"path\",\n display_name=\"Path\",\n file_types=TEXT_FILE_TYPES,\n info=f\"Supported file types: {', '.join(TEXT_FILE_TYPES)}\",\n ),\n BoolInput(\n name=\"silent_errors\",\n display_name=\"Silent Errors\",\n advanced=True,\n info=\"If true, errors will not raise an exception.\",\n ),\n ]\n\n outputs = [\n Output(display_name=\"Data\", name=\"data\", method=\"load_file\"),\n ]\n\n def load_file(self) -> Data:\n if not self.path:\n raise ValueError(\"Please, upload a file to use this component.\")\n resolved_path = self.resolve_path(self.path)\n silent_errors = self.silent_errors\n\n extension = Path(resolved_path).suffix[1:].lower()\n\n if extension == \"doc\":\n raise ValueError(\"doc files are not supported. Please save as .docx\")\n if extension not in TEXT_FILE_TYPES:\n raise ValueError(f\"Unsupported file type: {extension}\")\n\n data = parse_text_file_to_data(resolved_path, silent_errors)\n self.status = data if data else \"No data\"\n return data or Data()\n","fileTypes":[],"file_path":"","password":false,"name":"code","advanced":true,"dynamic":true,"info":"","load_from_db":false,"title_case":false},"silent_errors":{"trace_as_metadata":true,"list":false,"required":false,"placeholder":"","show":true,"value":false,"name":"silent_errors","display_name":"Silent Errors","advanced":true,"dynamic":false,"info":"If true, errors will not raise an exception.","title_case":false,"type":"bool"}},"description":"A generic file loader.","icon":"file-text","base_classes":["Data"],"display_name":"File","documentation":"","custom_fields":{},"output_types":[],"pinned":false,"conditional_paths":[],"frozen":false,"outputs":[{"types":["Data"],"selected":"Data","name":"data","display_name":"Data","method":"load_file","value":"__UNDEFINED__","cache":true,"hidden":false}],"field_order":["path","silent_errors"],"beta":false,"edited":false},"id":"File-SX5Zi"},"selected":false,"width":384,"height":301,"positionAbsolute":{"x":243.04974018776431,"y":-419.3520777543521},"dragging":false},{"id":"ParseData-McOEp","type":"genericNode","position":{"x":1084.5020622168036,"y":-494.5559384566343},"data":{"type":"ParseData","node":{"template":{"_type":"Component","data":{"trace_as_input":true,"trace_as_metadata":true,"list":false,"required":false,"placeholder":"","show":true,"value":"","name":"data","display_name":"Data","advanced":false,"input_types":["Data"],"dynamic":false,"info":"The data to convert to text.","title_case":false,"type":"other"},"code":{"type":"code","required":true,"placeholder":"","list":false,"show":true,"multiline":true,"value":"from langflow.custom import Component\nfrom langflow.helpers.data import data_to_text\nfrom langflow.io import DataInput, MultilineInput, Output, StrInput\nfrom langflow.schema.message import Message\n\n\nclass ParseDataComponent(Component):\n display_name = \"Parse Data\"\n description = \"Convert Data into plain text following a specified template.\"\n icon = \"braces\"\n\n inputs = [\n DataInput(name=\"data\", display_name=\"Data\", info=\"The data to convert to text.\"),\n MultilineInput(\n name=\"template\",\n display_name=\"Template\",\n info=\"The template to use for formatting the data. It can contain the keys {text}, {data} or any other key in the Data.\",\n value=\"{text}\",\n ),\n StrInput(name=\"sep\", display_name=\"Separator\", advanced=True, value=\"\\n\"),\n ]\n\n outputs = [\n Output(display_name=\"Text\", name=\"text\", method=\"parse_data\"),\n ]\n\n def parse_data(self) -> Message:\n data = self.data if isinstance(self.data, list) else [self.data]\n template = self.template\n\n result_string = data_to_text(template, data, sep=self.sep)\n self.status = result_string\n return Message(text=result_string)\n","fileTypes":[],"file_path":"","password":false,"name":"code","advanced":true,"dynamic":true,"info":"","load_from_db":false,"title_case":false},"sep":{"trace_as_metadata":true,"load_from_db":false,"list":false,"required":false,"placeholder":"","show":true,"value":"\n","name":"sep","display_name":"Separator","advanced":true,"dynamic":false,"info":"","title_case":false,"type":"str"},"template":{"trace_as_input":true,"multiline":true,"trace_as_metadata":true,"load_from_db":false,"list":false,"required":false,"placeholder":"","show":true,"value":"{data}","name":"template","display_name":"Template","advanced":false,"input_types":["Message"],"dynamic":false,"info":"The template to use for formatting the data. It can contain the keys {text}, {data} or any other key in the Data.","title_case":false,"type":"str"}},"description":"Convert Data into plain text following a specified template.","icon":"braces","base_classes":["Message"],"display_name":"Parse Data","documentation":"","custom_fields":{},"output_types":[],"pinned":false,"conditional_paths":[],"frozen":false,"outputs":[{"types":["Message"],"selected":"Message","name":"text","display_name":"Text","method":"parse_data","value":"__UNDEFINED__","cache":true,"hidden":false}],"field_order":["data","template","sep"],"beta":false,"edited":false},"id":"ParseData-McOEp"},"selected":false,"width":384,"height":385,"positionAbsolute":{"x":1084.5020622168036,"y":-494.5559384566343},"dragging":false},{"id":"TextOutput-Ngxnj","type":"genericNode","position":{"x":1505.800647501932,"y":-415.3394124672299},"data":{"type":"TextOutput","node":{"template":{"_type":"Component","code":{"type":"code","required":true,"placeholder":"","list":false,"show":true,"multiline":true,"value":"from langflow.base.io.text import TextComponent\nfrom langflow.io import MessageTextInput, Output\nfrom langflow.schema.message import Message\n\n\nclass TextOutputComponent(TextComponent):\n display_name = \"Text Output\"\n description = \"Display a text output in the Playground.\"\n icon = \"type\"\n\n inputs = [\n MessageTextInput(\n name=\"input_value\",\n display_name=\"Text\",\n info=\"Text to be passed as output.\",\n ),\n ]\n outputs = [\n Output(display_name=\"Text\", name=\"text\", method=\"text_response\"),\n ]\n\n def text_response(self) -> Message:\n message = Message(\n text=self.input_value,\n )\n self.status = self.input_value\n return message\n","fileTypes":[],"file_path":"","password":false,"name":"code","advanced":true,"dynamic":true,"info":"","load_from_db":false,"title_case":false},"input_value":{"trace_as_input":true,"trace_as_metadata":true,"load_from_db":false,"list":false,"required":false,"placeholder":"","show":true,"value":"","name":"input_value","display_name":"Text","advanced":false,"input_types":["Message"],"dynamic":false,"info":"Text to be passed as output.","title_case":false,"type":"str"}},"description":"Display a text output in the Playground.","icon":"type","base_classes":["Message"],"display_name":"Text Output","documentation":"","custom_fields":{},"output_types":[],"pinned":false,"conditional_paths":[],"frozen":false,"outputs":[{"types":["Message"],"selected":"Message","name":"text","display_name":"Text","method":"text_response","value":"__UNDEFINED__","cache":true}],"field_order":["input_value"],"beta":false,"edited":false},"id":"TextOutput-Ngxnj"},"selected":false,"width":384,"height":309,"positionAbsolute":{"x":1505.800647501932,"y":-415.3394124672299},"dragging":false},{"id":"File-JLESg","type":"genericNode","position":{"x":238.4366870991455,"y":289.24705740316784},"data":{"type":"File","node":{"template":{"_type":"Component","path":{"trace_as_metadata":true,"file_path":"c427e888-97ec-461e-89e0-949e3199c815/search-pageOptions.json","fileTypes":["txt","md","mdx","csv","json","yaml","yml","xml","html","htm","pdf","docx","py","sh","sql","js","ts","tsx"],"list":false,"required":false,"placeholder":"","show":true,"value":"","name":"path","display_name":"Path","advanced":false,"dynamic":false,"info":"Supported file types: txt, md, mdx, csv, json, yaml, yml, xml, html, htm, pdf, docx, py, sh, sql, js, ts, tsx","title_case":false,"type":"file"},"code":{"type":"code","required":true,"placeholder":"","list":false,"show":true,"multiline":true,"value":"from pathlib import Path\n\nfrom langflow.base.data.utils import TEXT_FILE_TYPES, parse_text_file_to_data\nfrom langflow.custom import Component\nfrom langflow.io import BoolInput, FileInput, Output\nfrom langflow.schema import Data\n\n\nclass FileComponent(Component):\n display_name = \"File\"\n description = \"A generic file loader.\"\n icon = \"file-text\"\n\n inputs = [\n FileInput(\n name=\"path\",\n display_name=\"Path\",\n file_types=TEXT_FILE_TYPES,\n info=f\"Supported file types: {', '.join(TEXT_FILE_TYPES)}\",\n ),\n BoolInput(\n name=\"silent_errors\",\n display_name=\"Silent Errors\",\n advanced=True,\n info=\"If true, errors will not raise an exception.\",\n ),\n ]\n\n outputs = [\n Output(display_name=\"Data\", name=\"data\", method=\"load_file\"),\n ]\n\n def load_file(self) -> Data:\n if not self.path:\n raise ValueError(\"Please, upload a file to use this component.\")\n resolved_path = self.resolve_path(self.path)\n silent_errors = self.silent_errors\n\n extension = Path(resolved_path).suffix[1:].lower()\n\n if extension == \"doc\":\n raise ValueError(\"doc files are not supported. Please save as .docx\")\n if extension not in TEXT_FILE_TYPES:\n raise ValueError(f\"Unsupported file type: {extension}\")\n\n data = parse_text_file_to_data(resolved_path, silent_errors)\n self.status = data if data else \"No data\"\n return data or Data()\n","fileTypes":[],"file_path":"","password":false,"name":"code","advanced":true,"dynamic":true,"info":"","load_from_db":false,"title_case":false},"silent_errors":{"trace_as_metadata":true,"list":false,"required":false,"placeholder":"","show":true,"value":false,"name":"silent_errors","display_name":"Silent Errors","advanced":true,"dynamic":false,"info":"If true, errors will not raise an exception.","title_case":false,"type":"bool"}},"description":"A generic file loader.","icon":"file-text","base_classes":["Data"],"display_name":"File","documentation":"","custom_fields":{},"output_types":[],"pinned":false,"conditional_paths":[],"frozen":false,"outputs":[{"types":["Data"],"selected":"Data","name":"data","display_name":"Data","method":"load_file","value":"__UNDEFINED__","cache":true,"hidden":false}],"field_order":["path","silent_errors"],"beta":false,"edited":false},"id":"File-JLESg"},"selected":false,"width":384,"height":301,"positionAbsolute":{"x":238.4366870991455,"y":289.24705740316784},"dragging":false},{"id":"ParseData-TEdlQ","type":"genericNode","position":{"x":1090.754096139909,"y":201.60504494634858},"data":{"type":"ParseData","node":{"template":{"_type":"Component","data":{"trace_as_input":true,"trace_as_metadata":true,"list":false,"required":false,"placeholder":"","show":true,"value":"","name":"data","display_name":"Data","advanced":false,"input_types":["Data"],"dynamic":false,"info":"The data to convert to text.","title_case":false,"type":"other"},"code":{"type":"code","required":true,"placeholder":"","list":false,"show":true,"multiline":true,"value":"from langflow.custom import Component\nfrom langflow.helpers.data import data_to_text\nfrom langflow.io import DataInput, MultilineInput, Output, StrInput\nfrom langflow.schema.message import Message\n\n\nclass ParseDataComponent(Component):\n display_name = \"Parse Data\"\n description = \"Convert Data into plain text following a specified template.\"\n icon = \"braces\"\n\n inputs = [\n DataInput(name=\"data\", display_name=\"Data\", info=\"The data to convert to text.\"),\n MultilineInput(\n name=\"template\",\n display_name=\"Template\",\n info=\"The template to use for formatting the data. It can contain the keys {text}, {data} or any other key in the Data.\",\n value=\"{text}\",\n ),\n StrInput(name=\"sep\", display_name=\"Separator\", advanced=True, value=\"\\n\"),\n ]\n\n outputs = [\n Output(display_name=\"Text\", name=\"text\", method=\"parse_data\"),\n ]\n\n def parse_data(self) -> Message:\n data = self.data if isinstance(self.data, list) else [self.data]\n template = self.template\n\n result_string = data_to_text(template, data, sep=self.sep)\n self.status = result_string\n return Message(text=result_string)\n","fileTypes":[],"file_path":"","password":false,"name":"code","advanced":true,"dynamic":true,"info":"","load_from_db":false,"title_case":false},"sep":{"trace_as_metadata":true,"load_from_db":false,"list":false,"required":false,"placeholder":"","show":true,"value":"\n","name":"sep","display_name":"Separator","advanced":true,"dynamic":false,"info":"","title_case":false,"type":"str"},"template":{"trace_as_input":true,"multiline":true,"trace_as_metadata":true,"load_from_db":false,"list":false,"required":false,"placeholder":"","show":true,"value":"{data}","name":"template","display_name":"Template","advanced":false,"input_types":["Message"],"dynamic":false,"info":"The template to use for formatting the data. It can contain the keys {text}, {data} or any other key in the Data.","title_case":false,"type":"str"}},"description":"Convert Data into plain text following a specified template.","icon":"braces","base_classes":["Message"],"display_name":"Parse Data","documentation":"","custom_fields":{},"output_types":[],"pinned":false,"conditional_paths":[],"frozen":false,"outputs":[{"types":["Message"],"selected":"Message","name":"text","display_name":"Text","method":"parse_data","value":"__UNDEFINED__","cache":true,"hidden":false}],"field_order":["data","template","sep"],"beta":false,"edited":false},"id":"ParseData-TEdlQ"},"selected":false,"width":384,"height":385,"dragging":false,"positionAbsolute":{"x":1090.754096139909,"y":201.60504494634858}},{"id":"TextOutput-R1OfL","type":"genericNode","position":{"x":1509.5816961086375,"y":272.15901325169693},"data":{"type":"TextOutput","node":{"template":{"_type":"Component","code":{"type":"code","required":true,"placeholder":"","list":false,"show":true,"multiline":true,"value":"from langflow.base.io.text import TextComponent\nfrom langflow.io import MessageTextInput, Output\nfrom langflow.schema.message import Message\n\n\nclass TextOutputComponent(TextComponent):\n display_name = \"Text Output\"\n description = \"Display a text output in the Playground.\"\n icon = \"type\"\n\n inputs = [\n MessageTextInput(\n name=\"input_value\",\n display_name=\"Text\",\n info=\"Text to be passed as output.\",\n ),\n ]\n outputs = [\n Output(display_name=\"Text\", name=\"text\", method=\"text_response\"),\n ]\n\n def text_response(self) -> Message:\n message = Message(\n text=self.input_value,\n )\n self.status = self.input_value\n return message\n","fileTypes":[],"file_path":"","password":false,"name":"code","advanced":true,"dynamic":true,"info":"","load_from_db":false,"title_case":false},"input_value":{"trace_as_input":true,"trace_as_metadata":true,"load_from_db":false,"list":false,"required":false,"placeholder":"","show":true,"value":"","name":"input_value","display_name":"Text","advanced":false,"input_types":["Message"],"dynamic":false,"info":"Text to be passed as output.","title_case":false,"type":"str"}},"description":"Display a text output in the Playground.","icon":"type","base_classes":["Message"],"display_name":"Text Output","documentation":"","custom_fields":{},"output_types":[],"pinned":false,"conditional_paths":[],"frozen":false,"outputs":[{"types":["Message"],"selected":"Message","name":"text","display_name":"Text","method":"text_response","value":"__UNDEFINED__","cache":true}],"field_order":["input_value"],"beta":false,"edited":false},"id":"TextOutput-R1OfL"},"selected":false,"width":384,"height":309,"positionAbsolute":{"x":1509.5816961086375,"y":272.15901325169693},"dragging":false},{"id":"FirecrawlScrapeApi-T7J1L","type":"genericNode","position":{"x":662.4544848030141,"y":-696.8447460781325},"data":{"type":"FirecrawlScrapeApi","node":{"template":{"_type":"CustomComponent","extractorOptions":{"type":"Data","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"file_path":"","password":false,"name":"extractorOptions","display_name":"Extractor Options","advanced":false,"dynamic":false,"info":"The extractor options to send with the request.","load_from_db":false,"title_case":false},"pageOptions":{"type":"Data","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"file_path":"","password":false,"name":"pageOptions","display_name":"Page Options","advanced":false,"dynamic":false,"info":"The page options to send with the request.","load_from_db":false,"title_case":false},"api_key":{"type":"str","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"file_path":"","password":true,"name":"api_key","display_name":"API Key","advanced":false,"dynamic":false,"info":"The API key to use Firecrawl API.","load_from_db":false,"title_case":false,"input_types":["Text"],"value":""},"code":{"type":"code","required":true,"placeholder":"","list":false,"show":true,"multiline":true,"value":"from typing import Optional\nfrom firecrawl.firecrawl import FirecrawlApp\nfrom langflow.custom import CustomComponent\nfrom langflow.schema import Data\nfrom langflow.services.database.models.base import orjson_dumps\nimport json\n\nclass FirecrawlScrapeApi(CustomComponent):\n display_name: str = \"FirecrawlScrapeApi\"\n description: str = \"Firecrawl Scrape API.\"\n output_types: list[str] = [\"Document\"]\n documentation: str = \"https://docs.firecrawl.dev/api-reference/endpoint/scrape\"\n field_config = {\n \"api_key\": {\n \"display_name\": \"API Key\",\n \"field_type\": \"str\",\n \"required\": True,\n \"password\": True,\n \"info\": \"The API key to use Firecrawl API.\",\n },\n \"url\": {\n \"display_name\": \"URL\",\n \"field_type\": \"str\",\n \"required\": True,\n \"info\": \"The URL to scrape.\",\n },\n \"timeout\": {\n \"display_name\": \"Timeout\",\n \"info\": \"Timeout in milliseconds for the request.\",\n \"field_type\": \"int\",\n \"default_value\": 10000,\n },\n \"pageOptions\": {\n \"display_name\": \"Page Options\",\n \"info\": \"The page options to send with the request.\",\n },\n \"extractorOptions\": {\n \"display_name\": \"Extractor Options\",\n \"info\": \"The extractor options to send with the request.\",\n },\n }\n\n def build(\n self,\n api_key: str,\n url: str,\n timeout: Optional[int] = 10000,\n pageOptions: Optional[Data] = None,\n extractorOptions: Optional[Data] = None,\n ) -> Data:\n if extractorOptions:\n extractor_options_dict = extractorOptions.__dict__['data']['text']\n else:\n extractor_options_dict = {}\n\n if pageOptions:\n page_options_dict = pageOptions.__dict__['data']['text']\n else:\n page_options_dict = {}\n\n app = FirecrawlApp(api_key=api_key)\n results = app.scrape_url(\n url,\n {\n \"timeout\": str(timeout),\n \"extractorOptions\": extractor_options_dict,\n \"pageOptions\": page_options_dict,\n },\n )\n\n record = Data(data=results)\n return record\n","fileTypes":[],"file_path":"","password":false,"name":"code","advanced":true,"dynamic":true,"info":"","load_from_db":false,"title_case":false},"timeout":{"type":"int","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"value":10000,"fileTypes":[],"file_path":"","password":false,"name":"timeout","display_name":"Timeout","advanced":false,"dynamic":false,"info":"Timeout in milliseconds for the request.","load_from_db":false,"title_case":false},"url":{"type":"str","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"file_path":"","password":false,"name":"url","display_name":"URL","advanced":false,"dynamic":false,"info":"The URL to scrape.","load_from_db":false,"title_case":false,"input_types":["Text"],"value":"firecrawl.dev"}},"description":"Firecrawl Scrape API.","base_classes":["Data"],"display_name":"FirecrawlScrapeApi","documentation":"https://docs.firecrawl.dev/api-reference/endpoint/scrape","custom_fields":{"api_key":null,"url":null,"timeout":null,"pageOptions":null,"extractorOptions":null},"output_types":["Data"],"pinned":false,"conditional_paths":[],"frozen":false,"outputs":[{"types":["Data"],"selected":"Data","name":"data","hidden":false,"display_name":"Data","method":null,"value":"__UNDEFINED__","cache":true}],"field_order":["api_key","url","timeout","pageOptions","extractorOptions"],"beta":false,"edited":true},"id":"FirecrawlScrapeApi-T7J1L","description":"Firecrawl Scrape API.","display_name":"FirecrawlScrapeApi"},"selected":false,"width":384,"height":581,"positionAbsolute":{"x":662.4544848030141,"y":-696.8447460781325},"dragging":false},{"id":"FirecrawlCrawlApi-zklFP","type":"genericNode","position":{"x":663.8060779623452,"y":-87.86502220070001},"data":{"type":"FirecrawlCrawlApi","node":{"template":{"_type":"CustomComponent","crawlerOptions":{"type":"Data","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"file_path":"","password":false,"name":"crawlerOptions","display_name":"Crawler Options","advanced":false,"dynamic":false,"info":"Options for the crawler behavior.","load_from_db":false,"title_case":false},"pageOptions":{"type":"Data","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"file_path":"","password":false,"name":"pageOptions","display_name":"Page Options","advanced":false,"dynamic":false,"info":"The page options to send with the request.","load_from_db":false,"title_case":false},"api_key":{"type":"str","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"file_path":"","password":true,"name":"api_key","display_name":"API Key","advanced":false,"dynamic":false,"info":"The API key to use Firecrawl API.","load_from_db":false,"title_case":false,"input_types":["Text"],"value":""},"code":{"type":"code","required":true,"placeholder":"","list":false,"show":true,"multiline":true,"value":"from typing import Optional\nfrom firecrawl.firecrawl import FirecrawlApp\nfrom langflow.custom import CustomComponent\nfrom langflow.schema import Data\nimport json\nimport uuid\n\nclass FirecrawlCrawlApi(CustomComponent):\n display_name: str = \"FirecrawlCrawlApi\"\n description: str = \"Firecrawl Crawl API.\"\n output_types: list[str] = [\"Document\"]\n documentation: str = \"https://docs.firecrawl.dev/api-reference/endpoint/crawl\"\n field_config = {\n \"api_key\": {\n \"display_name\": \"API Key\",\n \"field_type\": \"str\",\n \"required\": True,\n \"password\": True,\n \"info\": \"The API key to use Firecrawl API.\",\n },\n \"url\": {\n \"display_name\": \"URL\",\n \"field_type\": \"str\",\n \"required\": True,\n \"info\": \"The base URL to start crawling from.\",\n },\n \"timeout\": {\n \"display_name\": \"Timeout\",\n \"field_type\": \"int\",\n \"info\": \"The timeout in milliseconds.\",\n },\n \"crawlerOptions\": {\n \"display_name\": \"Crawler Options\",\n \"info\": \"Options for the crawler behavior.\",\n },\n \"pageOptions\": {\n \"display_name\": \"Page Options\",\n \"info\": \"The page options to send with the request.\",\n },\n \"idempotency_key\": {\n \"display_name\": \"Idempotency Key\",\n \"field_type\": \"str\",\n \"info\": \"Optional idempotency key to ensure unique requests.\",\n },\n }\n\n def build(\n self,\n api_key: str,\n url: str,\n timeout: Optional[int] = 30000,\n crawlerOptions: Optional[Data] = None,\n pageOptions: Optional[Data] = None,\n idempotency_key: Optional[str] = None,\n ) -> Data:\n if crawlerOptions:\n crawler_options_dict = crawlerOptions.__dict__['data']['text']\n else:\n crawler_options_dict = {}\n\n if pageOptions:\n page_options_dict = pageOptions.__dict__['data']['text']\n else:\n page_options_dict = {}\n\n if not idempotency_key:\n idempotency_key = str(uuid.uuid4())\n\n app = FirecrawlApp(api_key=api_key)\n crawl_result = app.crawl_url(\n url,\n {\n \"crawlerOptions\": crawler_options_dict,\n \"pageOptions\": page_options_dict,\n },\n True,\n int(timeout / 1000),\n idempotency_key\n )\n\n records = Data(data={\"results\": crawl_result})\n return records\n","fileTypes":[],"file_path":"","password":false,"name":"code","advanced":true,"dynamic":true,"info":"","load_from_db":false,"title_case":false},"idempotency_key":{"type":"str","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"file_path":"","password":false,"name":"idempotency_key","display_name":"Idempotency Key","advanced":false,"dynamic":false,"info":"Optional idempotency key to ensure unique requests.","load_from_db":false,"title_case":false,"input_types":["Text"]},"timeout":{"type":"int","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"value":30000,"fileTypes":[],"file_path":"","password":false,"name":"timeout","display_name":"Timeout","advanced":false,"dynamic":false,"info":"The timeout in milliseconds.","load_from_db":false,"title_case":false},"url":{"type":"str","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"file_path":"","password":false,"name":"url","display_name":"URL","advanced":false,"dynamic":false,"info":"The base URL to start crawling from.","load_from_db":false,"title_case":false,"input_types":["Text"],"value":"firecrawl.dev"}},"description":"Firecrawl Crawl API.","base_classes":["Data"],"display_name":"FirecrawlCrawlApi","documentation":"https://docs.firecrawl.dev/api-reference/endpoint/crawl","custom_fields":{"api_key":null,"url":null,"timeout":null,"crawlerOptions":null,"pageOptions":null,"idempotency_key":null},"output_types":["Data"],"pinned":false,"conditional_paths":[],"frozen":false,"outputs":[{"types":["Data"],"selected":"Data","name":"data","hidden":false,"display_name":"Data","method":null,"value":"__UNDEFINED__","cache":true}],"field_order":["api_key","url","timeout","crawlerOptions","pageOptions","idempotency_key"],"beta":false,"edited":false},"id":"FirecrawlCrawlApi-zklFP"},"selected":false,"width":384,"height":675,"positionAbsolute":{"x":663.8060779623452,"y":-87.86502220070001},"dragging":false}],"edges":[{"source":"ParseData-McOEp","sourceHandle":"{œdataTypeœ:œParseDataœ,œidœ:œParseData-McOEpœ,œnameœ:œtextœ,œoutput_typesœ:[œMessageœ]}","target":"TextOutput-Ngxnj","targetHandle":"{œfieldNameœ:œinput_valueœ,œidœ:œTextOutput-Ngxnjœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}","data":{"targetHandle":{"fieldName":"input_value","id":"TextOutput-Ngxnj","inputTypes":["Message"],"type":"str"},"sourceHandle":{"dataType":"ParseData","id":"ParseData-McOEp","name":"text","output_types":["Message"]}},"id":"reactflow__edge-ParseData-McOEp{œdataTypeœ:œParseDataœ,œidœ:œParseData-McOEpœ,œnameœ:œtextœ,œoutput_typesœ:[œMessageœ]}-TextOutput-Ngxnj{œfieldNameœ:œinput_valueœ,œidœ:œTextOutput-Ngxnjœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}","className":""},{"source":"ParseData-TEdlQ","sourceHandle":"{œdataTypeœ:œParseDataœ,œidœ:œParseData-TEdlQœ,œnameœ:œtextœ,œoutput_typesœ:[œMessageœ]}","target":"TextOutput-R1OfL","targetHandle":"{œfieldNameœ:œinput_valueœ,œidœ:œTextOutput-R1OfLœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}","data":{"targetHandle":{"fieldName":"input_value","id":"TextOutput-R1OfL","inputTypes":["Message"],"type":"str"},"sourceHandle":{"dataType":"ParseData","id":"ParseData-TEdlQ","name":"text","output_types":["Message"]}},"id":"reactflow__edge-ParseData-TEdlQ{œdataTypeœ:œParseDataœ,œidœ:œParseData-TEdlQœ,œnameœ:œtextœ,œoutput_typesœ:[œMessageœ]}-TextOutput-R1OfL{œfieldNameœ:œinput_valueœ,œidœ:œTextOutput-R1OfLœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}","className":""},{"source":"File-SX5Zi","sourceHandle":"{œdataTypeœ:œFileœ,œidœ:œFile-SX5Ziœ,œnameœ:œdataœ,œoutput_typesœ:[œDataœ]}","target":"FirecrawlScrapeApi-T7J1L","targetHandle":"{œfieldNameœ:œpageOptionsœ,œidœ:œFirecrawlScrapeApi-T7J1Lœ,œinputTypesœ:null,œtypeœ:œDataœ}","data":{"targetHandle":{"fieldName":"pageOptions","id":"FirecrawlScrapeApi-T7J1L","inputTypes":null,"type":"Data"},"sourceHandle":{"dataType":"File","id":"File-SX5Zi","name":"data","output_types":["Data"]}},"id":"reactflow__edge-File-SX5Zi{œdataTypeœ:œFileœ,œidœ:œFile-SX5Ziœ,œnameœ:œdataœ,œoutput_typesœ:[œDataœ]}-FirecrawlScrapeApi-T7J1L{œfieldNameœ:œpageOptionsœ,œidœ:œFirecrawlScrapeApi-T7J1Lœ,œinputTypesœ:null,œtypeœ:œDataœ}","className":""},{"source":"FirecrawlScrapeApi-T7J1L","sourceHandle":"{œdataTypeœ:œFirecrawlScrapeApiœ,œidœ:œFirecrawlScrapeApi-T7J1Lœ,œnameœ:œdataœ,œoutput_typesœ:[œDataœ]}","target":"ParseData-McOEp","targetHandle":"{œfieldNameœ:œdataœ,œidœ:œParseData-McOEpœ,œinputTypesœ:[œDataœ],œtypeœ:œotherœ}","data":{"targetHandle":{"fieldName":"data","id":"ParseData-McOEp","inputTypes":["Data"],"type":"other"},"sourceHandle":{"dataType":"FirecrawlScrapeApi","id":"FirecrawlScrapeApi-T7J1L","name":"data","output_types":["Data"]}},"id":"reactflow__edge-FirecrawlScrapeApi-T7J1L{œdataTypeœ:œFirecrawlScrapeApiœ,œidœ:œFirecrawlScrapeApi-T7J1Lœ,œnameœ:œdataœ,œoutput_typesœ:[œDataœ]}-ParseData-McOEp{œfieldNameœ:œdataœ,œidœ:œParseData-McOEpœ,œinputTypesœ:[œDataœ],œtypeœ:œotherœ}","className":""},{"source":"File-JLESg","sourceHandle":"{œdataTypeœ:œFileœ,œidœ:œFile-JLESgœ,œnameœ:œdataœ,œoutput_typesœ:[œDataœ]}","target":"FirecrawlCrawlApi-zklFP","targetHandle":"{œfieldNameœ:œpageOptionsœ,œidœ:œFirecrawlCrawlApi-zklFPœ,œinputTypesœ:null,œtypeœ:œDataœ}","data":{"targetHandle":{"fieldName":"pageOptions","id":"FirecrawlCrawlApi-zklFP","inputTypes":null,"type":"Data"},"sourceHandle":{"dataType":"File","id":"File-JLESg","name":"data","output_types":["Data"]}},"id":"reactflow__edge-File-JLESg{œdataTypeœ:œFileœ,œidœ:œFile-JLESgœ,œnameœ:œdataœ,œoutput_typesœ:[œDataœ]}-FirecrawlCrawlApi-zklFP{œfieldNameœ:œpageOptionsœ,œidœ:œFirecrawlCrawlApi-zklFPœ,œinputTypesœ:null,œtypeœ:œDataœ}","className":""},{"source":"FirecrawlCrawlApi-zklFP","sourceHandle":"{œdataTypeœ:œFirecrawlCrawlApiœ,œidœ:œFirecrawlCrawlApi-zklFPœ,œnameœ:œdataœ,œoutput_typesœ:[œDataœ]}","target":"ParseData-TEdlQ","targetHandle":"{œfieldNameœ:œdataœ,œidœ:œParseData-TEdlQœ,œinputTypesœ:[œDataœ],œtypeœ:œotherœ}","data":{"targetHandle":{"fieldName":"data","id":"ParseData-TEdlQ","inputTypes":["Data"],"type":"other"},"sourceHandle":{"dataType":"FirecrawlCrawlApi","id":"FirecrawlCrawlApi-zklFP","name":"data","output_types":["Data"]}},"id":"reactflow__edge-FirecrawlCrawlApi-zklFP{œdataTypeœ:œFirecrawlCrawlApiœ,œidœ:œFirecrawlCrawlApi-zklFPœ,œnameœ:œdataœ,œoutput_typesœ:[œDataœ]}-ParseData-TEdlQ{œfieldNameœ:œdataœ,œidœ:œParseData-TEdlQœ,œinputTypesœ:[œDataœ],œtypeœ:œotherœ}","className":""}],"viewport":{"x":56.55720248973125,"y":386.38105360596376,"zoom":0.4115593875913944}},"description":"Firecrawl example flow with Crawl and Scrape components.","name":"Firecrawl API Example","last_tested_version":"1.0.3","endpoint_name":null,"is_component":false}