lfx-nightly 0.1.11.dev0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- lfx/__init__.py +0 -0
- lfx/__main__.py +25 -0
- lfx/base/__init__.py +0 -0
- lfx/base/agents/__init__.py +0 -0
- lfx/base/agents/agent.py +268 -0
- lfx/base/agents/callback.py +130 -0
- lfx/base/agents/context.py +109 -0
- lfx/base/agents/crewai/__init__.py +0 -0
- lfx/base/agents/crewai/crew.py +231 -0
- lfx/base/agents/crewai/tasks.py +12 -0
- lfx/base/agents/default_prompts.py +23 -0
- lfx/base/agents/errors.py +15 -0
- lfx/base/agents/events.py +346 -0
- lfx/base/agents/utils.py +205 -0
- lfx/base/astra_assistants/__init__.py +0 -0
- lfx/base/astra_assistants/util.py +171 -0
- lfx/base/chains/__init__.py +0 -0
- lfx/base/chains/model.py +19 -0
- lfx/base/composio/__init__.py +0 -0
- lfx/base/composio/composio_base.py +1291 -0
- lfx/base/compressors/__init__.py +0 -0
- lfx/base/compressors/model.py +60 -0
- lfx/base/constants.py +46 -0
- lfx/base/curl/__init__.py +0 -0
- lfx/base/curl/parse.py +188 -0
- lfx/base/data/__init__.py +5 -0
- lfx/base/data/base_file.py +685 -0
- lfx/base/data/docling_utils.py +245 -0
- lfx/base/data/utils.py +198 -0
- lfx/base/document_transformers/__init__.py +0 -0
- lfx/base/document_transformers/model.py +43 -0
- lfx/base/embeddings/__init__.py +0 -0
- lfx/base/embeddings/aiml_embeddings.py +62 -0
- lfx/base/embeddings/model.py +26 -0
- lfx/base/flow_processing/__init__.py +0 -0
- lfx/base/flow_processing/utils.py +86 -0
- lfx/base/huggingface/__init__.py +0 -0
- lfx/base/huggingface/model_bridge.py +133 -0
- lfx/base/io/__init__.py +0 -0
- lfx/base/io/chat.py +20 -0
- lfx/base/io/text.py +22 -0
- lfx/base/langchain_utilities/__init__.py +0 -0
- lfx/base/langchain_utilities/model.py +35 -0
- lfx/base/langchain_utilities/spider_constants.py +1 -0
- lfx/base/langwatch/__init__.py +0 -0
- lfx/base/langwatch/utils.py +18 -0
- lfx/base/mcp/__init__.py +0 -0
- lfx/base/mcp/constants.py +2 -0
- lfx/base/mcp/util.py +1398 -0
- lfx/base/memory/__init__.py +0 -0
- lfx/base/memory/memory.py +49 -0
- lfx/base/memory/model.py +38 -0
- lfx/base/models/__init__.py +3 -0
- lfx/base/models/aiml_constants.py +51 -0
- lfx/base/models/anthropic_constants.py +47 -0
- lfx/base/models/aws_constants.py +151 -0
- lfx/base/models/chat_result.py +76 -0
- lfx/base/models/google_generative_ai_constants.py +70 -0
- lfx/base/models/groq_constants.py +134 -0
- lfx/base/models/model.py +375 -0
- lfx/base/models/model_input_constants.py +307 -0
- lfx/base/models/model_metadata.py +41 -0
- lfx/base/models/model_utils.py +8 -0
- lfx/base/models/novita_constants.py +35 -0
- lfx/base/models/ollama_constants.py +49 -0
- lfx/base/models/openai_constants.py +122 -0
- lfx/base/models/sambanova_constants.py +18 -0
- lfx/base/processing/__init__.py +0 -0
- lfx/base/prompts/__init__.py +0 -0
- lfx/base/prompts/api_utils.py +224 -0
- lfx/base/prompts/utils.py +61 -0
- lfx/base/textsplitters/__init__.py +0 -0
- lfx/base/textsplitters/model.py +28 -0
- lfx/base/tools/__init__.py +0 -0
- lfx/base/tools/base.py +26 -0
- lfx/base/tools/component_tool.py +325 -0
- lfx/base/tools/constants.py +49 -0
- lfx/base/tools/flow_tool.py +132 -0
- lfx/base/tools/run_flow.py +224 -0
- lfx/base/vectorstores/__init__.py +0 -0
- lfx/base/vectorstores/model.py +193 -0
- lfx/base/vectorstores/utils.py +22 -0
- lfx/base/vectorstores/vector_store_connection_decorator.py +52 -0
- lfx/cli/__init__.py +5 -0
- lfx/cli/commands.py +319 -0
- lfx/cli/common.py +650 -0
- lfx/cli/run.py +441 -0
- lfx/cli/script_loader.py +247 -0
- lfx/cli/serve_app.py +546 -0
- lfx/cli/validation.py +69 -0
- lfx/components/FAISS/__init__.py +34 -0
- lfx/components/FAISS/faiss.py +111 -0
- lfx/components/Notion/__init__.py +19 -0
- lfx/components/Notion/add_content_to_page.py +269 -0
- lfx/components/Notion/create_page.py +94 -0
- lfx/components/Notion/list_database_properties.py +68 -0
- lfx/components/Notion/list_pages.py +122 -0
- lfx/components/Notion/list_users.py +77 -0
- lfx/components/Notion/page_content_viewer.py +93 -0
- lfx/components/Notion/search.py +111 -0
- lfx/components/Notion/update_page_property.py +114 -0
- lfx/components/__init__.py +411 -0
- lfx/components/_importing.py +42 -0
- lfx/components/agentql/__init__.py +3 -0
- lfx/components/agentql/agentql_api.py +151 -0
- lfx/components/agents/__init__.py +34 -0
- lfx/components/agents/agent.py +558 -0
- lfx/components/agents/mcp_component.py +501 -0
- lfx/components/aiml/__init__.py +37 -0
- lfx/components/aiml/aiml.py +112 -0
- lfx/components/aiml/aiml_embeddings.py +37 -0
- lfx/components/amazon/__init__.py +36 -0
- lfx/components/amazon/amazon_bedrock_embedding.py +109 -0
- lfx/components/amazon/amazon_bedrock_model.py +124 -0
- lfx/components/amazon/s3_bucket_uploader.py +211 -0
- lfx/components/anthropic/__init__.py +34 -0
- lfx/components/anthropic/anthropic.py +187 -0
- lfx/components/apify/__init__.py +5 -0
- lfx/components/apify/apify_actor.py +325 -0
- lfx/components/arxiv/__init__.py +3 -0
- lfx/components/arxiv/arxiv.py +163 -0
- lfx/components/assemblyai/__init__.py +46 -0
- lfx/components/assemblyai/assemblyai_get_subtitles.py +83 -0
- lfx/components/assemblyai/assemblyai_lemur.py +183 -0
- lfx/components/assemblyai/assemblyai_list_transcripts.py +95 -0
- lfx/components/assemblyai/assemblyai_poll_transcript.py +72 -0
- lfx/components/assemblyai/assemblyai_start_transcript.py +188 -0
- lfx/components/azure/__init__.py +37 -0
- lfx/components/azure/azure_openai.py +95 -0
- lfx/components/azure/azure_openai_embeddings.py +83 -0
- lfx/components/baidu/__init__.py +32 -0
- lfx/components/baidu/baidu_qianfan_chat.py +113 -0
- lfx/components/bing/__init__.py +3 -0
- lfx/components/bing/bing_search_api.py +61 -0
- lfx/components/cassandra/__init__.py +40 -0
- lfx/components/cassandra/cassandra.py +264 -0
- lfx/components/cassandra/cassandra_chat.py +92 -0
- lfx/components/cassandra/cassandra_graph.py +238 -0
- lfx/components/chains/__init__.py +3 -0
- lfx/components/chroma/__init__.py +34 -0
- lfx/components/chroma/chroma.py +167 -0
- lfx/components/cleanlab/__init__.py +40 -0
- lfx/components/cleanlab/cleanlab_evaluator.py +155 -0
- lfx/components/cleanlab/cleanlab_rag_evaluator.py +254 -0
- lfx/components/cleanlab/cleanlab_remediator.py +131 -0
- lfx/components/clickhouse/__init__.py +34 -0
- lfx/components/clickhouse/clickhouse.py +135 -0
- lfx/components/cloudflare/__init__.py +32 -0
- lfx/components/cloudflare/cloudflare.py +81 -0
- lfx/components/cohere/__init__.py +40 -0
- lfx/components/cohere/cohere_embeddings.py +81 -0
- lfx/components/cohere/cohere_models.py +46 -0
- lfx/components/cohere/cohere_rerank.py +51 -0
- lfx/components/composio/__init__.py +74 -0
- lfx/components/composio/composio_api.py +268 -0
- lfx/components/composio/dropbox_compnent.py +11 -0
- lfx/components/composio/github_composio.py +11 -0
- lfx/components/composio/gmail_composio.py +38 -0
- lfx/components/composio/googlecalendar_composio.py +11 -0
- lfx/components/composio/googlemeet_composio.py +11 -0
- lfx/components/composio/googletasks_composio.py +8 -0
- lfx/components/composio/linear_composio.py +11 -0
- lfx/components/composio/outlook_composio.py +11 -0
- lfx/components/composio/reddit_composio.py +11 -0
- lfx/components/composio/slack_composio.py +582 -0
- lfx/components/composio/slackbot_composio.py +11 -0
- lfx/components/composio/supabase_composio.py +11 -0
- lfx/components/composio/todoist_composio.py +11 -0
- lfx/components/composio/youtube_composio.py +11 -0
- lfx/components/confluence/__init__.py +3 -0
- lfx/components/confluence/confluence.py +84 -0
- lfx/components/couchbase/__init__.py +34 -0
- lfx/components/couchbase/couchbase.py +102 -0
- lfx/components/crewai/__init__.py +49 -0
- lfx/components/crewai/crewai.py +107 -0
- lfx/components/crewai/hierarchical_crew.py +46 -0
- lfx/components/crewai/hierarchical_task.py +44 -0
- lfx/components/crewai/sequential_crew.py +52 -0
- lfx/components/crewai/sequential_task.py +73 -0
- lfx/components/crewai/sequential_task_agent.py +143 -0
- lfx/components/custom_component/__init__.py +34 -0
- lfx/components/custom_component/custom_component.py +31 -0
- lfx/components/data/__init__.py +64 -0
- lfx/components/data/api_request.py +544 -0
- lfx/components/data/csv_to_data.py +95 -0
- lfx/components/data/directory.py +113 -0
- lfx/components/data/file.py +577 -0
- lfx/components/data/json_to_data.py +98 -0
- lfx/components/data/news_search.py +164 -0
- lfx/components/data/rss.py +69 -0
- lfx/components/data/sql_executor.py +101 -0
- lfx/components/data/url.py +311 -0
- lfx/components/data/web_search.py +112 -0
- lfx/components/data/webhook.py +56 -0
- lfx/components/datastax/__init__.py +70 -0
- lfx/components/datastax/astra_assistant_manager.py +306 -0
- lfx/components/datastax/astra_db.py +75 -0
- lfx/components/datastax/astra_vectorize.py +124 -0
- lfx/components/datastax/astradb.py +1285 -0
- lfx/components/datastax/astradb_cql.py +314 -0
- lfx/components/datastax/astradb_graph.py +330 -0
- lfx/components/datastax/astradb_tool.py +414 -0
- lfx/components/datastax/astradb_vectorstore.py +1285 -0
- lfx/components/datastax/cassandra.py +92 -0
- lfx/components/datastax/create_assistant.py +58 -0
- lfx/components/datastax/create_thread.py +32 -0
- lfx/components/datastax/dotenv.py +35 -0
- lfx/components/datastax/get_assistant.py +37 -0
- lfx/components/datastax/getenvvar.py +30 -0
- lfx/components/datastax/graph_rag.py +141 -0
- lfx/components/datastax/hcd.py +314 -0
- lfx/components/datastax/list_assistants.py +25 -0
- lfx/components/datastax/run.py +89 -0
- lfx/components/deactivated/__init__.py +15 -0
- lfx/components/deactivated/amazon_kendra.py +66 -0
- lfx/components/deactivated/chat_litellm_model.py +158 -0
- lfx/components/deactivated/code_block_extractor.py +26 -0
- lfx/components/deactivated/documents_to_data.py +22 -0
- lfx/components/deactivated/embed.py +16 -0
- lfx/components/deactivated/extract_key_from_data.py +46 -0
- lfx/components/deactivated/json_document_builder.py +57 -0
- lfx/components/deactivated/list_flows.py +20 -0
- lfx/components/deactivated/mcp_sse.py +61 -0
- lfx/components/deactivated/mcp_stdio.py +62 -0
- lfx/components/deactivated/merge_data.py +93 -0
- lfx/components/deactivated/message.py +37 -0
- lfx/components/deactivated/metal.py +54 -0
- lfx/components/deactivated/multi_query.py +59 -0
- lfx/components/deactivated/retriever.py +43 -0
- lfx/components/deactivated/selective_passthrough.py +77 -0
- lfx/components/deactivated/should_run_next.py +40 -0
- lfx/components/deactivated/split_text.py +63 -0
- lfx/components/deactivated/store_message.py +24 -0
- lfx/components/deactivated/sub_flow.py +124 -0
- lfx/components/deactivated/vectara_self_query.py +76 -0
- lfx/components/deactivated/vector_store.py +24 -0
- lfx/components/deepseek/__init__.py +34 -0
- lfx/components/deepseek/deepseek.py +136 -0
- lfx/components/docling/__init__.py +43 -0
- lfx/components/docling/chunk_docling_document.py +186 -0
- lfx/components/docling/docling_inline.py +231 -0
- lfx/components/docling/docling_remote.py +193 -0
- lfx/components/docling/export_docling_document.py +117 -0
- lfx/components/documentloaders/__init__.py +3 -0
- lfx/components/duckduckgo/__init__.py +3 -0
- lfx/components/duckduckgo/duck_duck_go_search_run.py +92 -0
- lfx/components/elastic/__init__.py +37 -0
- lfx/components/elastic/elasticsearch.py +267 -0
- lfx/components/elastic/opensearch.py +243 -0
- lfx/components/embeddings/__init__.py +37 -0
- lfx/components/embeddings/similarity.py +76 -0
- lfx/components/embeddings/text_embedder.py +64 -0
- lfx/components/exa/__init__.py +3 -0
- lfx/components/exa/exa_search.py +68 -0
- lfx/components/firecrawl/__init__.py +43 -0
- lfx/components/firecrawl/firecrawl_crawl_api.py +88 -0
- lfx/components/firecrawl/firecrawl_extract_api.py +136 -0
- lfx/components/firecrawl/firecrawl_map_api.py +89 -0
- lfx/components/firecrawl/firecrawl_scrape_api.py +73 -0
- lfx/components/git/__init__.py +4 -0
- lfx/components/git/git.py +262 -0
- lfx/components/git/gitextractor.py +196 -0
- lfx/components/glean/__init__.py +3 -0
- lfx/components/glean/glean_search_api.py +173 -0
- lfx/components/google/__init__.py +17 -0
- lfx/components/google/gmail.py +192 -0
- lfx/components/google/google_bq_sql_executor.py +157 -0
- lfx/components/google/google_drive.py +92 -0
- lfx/components/google/google_drive_search.py +152 -0
- lfx/components/google/google_generative_ai.py +147 -0
- lfx/components/google/google_generative_ai_embeddings.py +141 -0
- lfx/components/google/google_oauth_token.py +89 -0
- lfx/components/google/google_search_api_core.py +68 -0
- lfx/components/google/google_serper_api_core.py +74 -0
- lfx/components/groq/__init__.py +34 -0
- lfx/components/groq/groq.py +136 -0
- lfx/components/helpers/__init__.py +52 -0
- lfx/components/helpers/calculator_core.py +89 -0
- lfx/components/helpers/create_list.py +40 -0
- lfx/components/helpers/current_date.py +42 -0
- lfx/components/helpers/id_generator.py +42 -0
- lfx/components/helpers/memory.py +251 -0
- lfx/components/helpers/output_parser.py +45 -0
- lfx/components/helpers/store_message.py +90 -0
- lfx/components/homeassistant/__init__.py +7 -0
- lfx/components/homeassistant/home_assistant_control.py +152 -0
- lfx/components/homeassistant/list_home_assistant_states.py +137 -0
- lfx/components/huggingface/__init__.py +37 -0
- lfx/components/huggingface/huggingface.py +197 -0
- lfx/components/huggingface/huggingface_inference_api.py +106 -0
- lfx/components/ibm/__init__.py +34 -0
- lfx/components/ibm/watsonx.py +203 -0
- lfx/components/ibm/watsonx_embeddings.py +135 -0
- lfx/components/icosacomputing/__init__.py +5 -0
- lfx/components/icosacomputing/combinatorial_reasoner.py +84 -0
- lfx/components/input_output/__init__.py +38 -0
- lfx/components/input_output/chat.py +120 -0
- lfx/components/input_output/chat_output.py +200 -0
- lfx/components/input_output/text.py +27 -0
- lfx/components/input_output/text_output.py +29 -0
- lfx/components/jigsawstack/__init__.py +23 -0
- lfx/components/jigsawstack/ai_scrape.py +126 -0
- lfx/components/jigsawstack/ai_web_search.py +136 -0
- lfx/components/jigsawstack/file_read.py +115 -0
- lfx/components/jigsawstack/file_upload.py +94 -0
- lfx/components/jigsawstack/image_generation.py +205 -0
- lfx/components/jigsawstack/nsfw.py +60 -0
- lfx/components/jigsawstack/object_detection.py +124 -0
- lfx/components/jigsawstack/sentiment.py +112 -0
- lfx/components/jigsawstack/text_to_sql.py +90 -0
- lfx/components/jigsawstack/text_translate.py +77 -0
- lfx/components/jigsawstack/vocr.py +107 -0
- lfx/components/langchain_utilities/__init__.py +109 -0
- lfx/components/langchain_utilities/character.py +53 -0
- lfx/components/langchain_utilities/conversation.py +59 -0
- lfx/components/langchain_utilities/csv_agent.py +107 -0
- lfx/components/langchain_utilities/fake_embeddings.py +26 -0
- lfx/components/langchain_utilities/html_link_extractor.py +35 -0
- lfx/components/langchain_utilities/json_agent.py +45 -0
- lfx/components/langchain_utilities/langchain_hub.py +126 -0
- lfx/components/langchain_utilities/language_recursive.py +49 -0
- lfx/components/langchain_utilities/language_semantic.py +138 -0
- lfx/components/langchain_utilities/llm_checker.py +39 -0
- lfx/components/langchain_utilities/llm_math.py +42 -0
- lfx/components/langchain_utilities/natural_language.py +61 -0
- lfx/components/langchain_utilities/openai_tools.py +53 -0
- lfx/components/langchain_utilities/openapi.py +48 -0
- lfx/components/langchain_utilities/recursive_character.py +60 -0
- lfx/components/langchain_utilities/retrieval_qa.py +83 -0
- lfx/components/langchain_utilities/runnable_executor.py +137 -0
- lfx/components/langchain_utilities/self_query.py +80 -0
- lfx/components/langchain_utilities/spider.py +142 -0
- lfx/components/langchain_utilities/sql.py +40 -0
- lfx/components/langchain_utilities/sql_database.py +35 -0
- lfx/components/langchain_utilities/sql_generator.py +78 -0
- lfx/components/langchain_utilities/tool_calling.py +59 -0
- lfx/components/langchain_utilities/vector_store_info.py +49 -0
- lfx/components/langchain_utilities/vector_store_router.py +33 -0
- lfx/components/langchain_utilities/xml_agent.py +71 -0
- lfx/components/langwatch/__init__.py +3 -0
- lfx/components/langwatch/langwatch.py +278 -0
- lfx/components/link_extractors/__init__.py +3 -0
- lfx/components/lmstudio/__init__.py +34 -0
- lfx/components/lmstudio/lmstudioembeddings.py +89 -0
- lfx/components/lmstudio/lmstudiomodel.py +129 -0
- lfx/components/logic/__init__.py +52 -0
- lfx/components/logic/conditional_router.py +171 -0
- lfx/components/logic/data_conditional_router.py +125 -0
- lfx/components/logic/flow_tool.py +110 -0
- lfx/components/logic/listen.py +29 -0
- lfx/components/logic/loop.py +125 -0
- lfx/components/logic/notify.py +88 -0
- lfx/components/logic/pass_message.py +35 -0
- lfx/components/logic/run_flow.py +71 -0
- lfx/components/logic/sub_flow.py +114 -0
- lfx/components/maritalk/__init__.py +32 -0
- lfx/components/maritalk/maritalk.py +52 -0
- lfx/components/mem0/__init__.py +3 -0
- lfx/components/mem0/mem0_chat_memory.py +136 -0
- lfx/components/milvus/__init__.py +34 -0
- lfx/components/milvus/milvus.py +115 -0
- lfx/components/mistral/__init__.py +37 -0
- lfx/components/mistral/mistral.py +114 -0
- lfx/components/mistral/mistral_embeddings.py +58 -0
- lfx/components/models/__init__.py +34 -0
- lfx/components/models/embedding_model.py +114 -0
- lfx/components/models/language_model.py +144 -0
- lfx/components/mongodb/__init__.py +34 -0
- lfx/components/mongodb/mongodb_atlas.py +213 -0
- lfx/components/needle/__init__.py +3 -0
- lfx/components/needle/needle.py +104 -0
- lfx/components/notdiamond/__init__.py +34 -0
- lfx/components/notdiamond/notdiamond.py +228 -0
- lfx/components/novita/__init__.py +32 -0
- lfx/components/novita/novita.py +130 -0
- lfx/components/nvidia/__init__.py +57 -0
- lfx/components/nvidia/nvidia.py +157 -0
- lfx/components/nvidia/nvidia_embedding.py +77 -0
- lfx/components/nvidia/nvidia_ingest.py +317 -0
- lfx/components/nvidia/nvidia_rerank.py +63 -0
- lfx/components/nvidia/system_assist.py +65 -0
- lfx/components/olivya/__init__.py +3 -0
- lfx/components/olivya/olivya.py +116 -0
- lfx/components/ollama/__init__.py +37 -0
- lfx/components/ollama/ollama.py +330 -0
- lfx/components/ollama/ollama_embeddings.py +106 -0
- lfx/components/openai/__init__.py +37 -0
- lfx/components/openai/openai.py +100 -0
- lfx/components/openai/openai_chat_model.py +176 -0
- lfx/components/openrouter/__init__.py +32 -0
- lfx/components/openrouter/openrouter.py +202 -0
- lfx/components/output_parsers/__init__.py +3 -0
- lfx/components/perplexity/__init__.py +34 -0
- lfx/components/perplexity/perplexity.py +75 -0
- lfx/components/pgvector/__init__.py +34 -0
- lfx/components/pgvector/pgvector.py +72 -0
- lfx/components/pinecone/__init__.py +34 -0
- lfx/components/pinecone/pinecone.py +134 -0
- lfx/components/processing/__init__.py +117 -0
- lfx/components/processing/alter_metadata.py +108 -0
- lfx/components/processing/batch_run.py +205 -0
- lfx/components/processing/combine_text.py +39 -0
- lfx/components/processing/converter.py +159 -0
- lfx/components/processing/create_data.py +110 -0
- lfx/components/processing/data_operations.py +438 -0
- lfx/components/processing/data_to_dataframe.py +70 -0
- lfx/components/processing/dataframe_operations.py +313 -0
- lfx/components/processing/extract_key.py +53 -0
- lfx/components/processing/filter_data.py +42 -0
- lfx/components/processing/filter_data_values.py +88 -0
- lfx/components/processing/json_cleaner.py +103 -0
- lfx/components/processing/lambda_filter.py +154 -0
- lfx/components/processing/llm_router.py +499 -0
- lfx/components/processing/merge_data.py +90 -0
- lfx/components/processing/message_to_data.py +36 -0
- lfx/components/processing/parse_data.py +70 -0
- lfx/components/processing/parse_dataframe.py +68 -0
- lfx/components/processing/parse_json_data.py +90 -0
- lfx/components/processing/parser.py +143 -0
- lfx/components/processing/prompt.py +67 -0
- lfx/components/processing/python_repl_core.py +98 -0
- lfx/components/processing/regex.py +82 -0
- lfx/components/processing/save_file.py +225 -0
- lfx/components/processing/select_data.py +48 -0
- lfx/components/processing/split_text.py +141 -0
- lfx/components/processing/structured_output.py +202 -0
- lfx/components/processing/update_data.py +160 -0
- lfx/components/prototypes/__init__.py +34 -0
- lfx/components/prototypes/python_function.py +73 -0
- lfx/components/qdrant/__init__.py +34 -0
- lfx/components/qdrant/qdrant.py +109 -0
- lfx/components/redis/__init__.py +37 -0
- lfx/components/redis/redis.py +89 -0
- lfx/components/redis/redis_chat.py +43 -0
- lfx/components/sambanova/__init__.py +32 -0
- lfx/components/sambanova/sambanova.py +84 -0
- lfx/components/scrapegraph/__init__.py +40 -0
- lfx/components/scrapegraph/scrapegraph_markdownify_api.py +64 -0
- lfx/components/scrapegraph/scrapegraph_search_api.py +64 -0
- lfx/components/scrapegraph/scrapegraph_smart_scraper_api.py +71 -0
- lfx/components/searchapi/__init__.py +34 -0
- lfx/components/searchapi/search.py +79 -0
- lfx/components/serpapi/__init__.py +3 -0
- lfx/components/serpapi/serp.py +115 -0
- lfx/components/supabase/__init__.py +34 -0
- lfx/components/supabase/supabase.py +76 -0
- lfx/components/tavily/__init__.py +4 -0
- lfx/components/tavily/tavily_extract.py +117 -0
- lfx/components/tavily/tavily_search.py +212 -0
- lfx/components/textsplitters/__init__.py +3 -0
- lfx/components/toolkits/__init__.py +3 -0
- lfx/components/tools/__init__.py +72 -0
- lfx/components/tools/calculator.py +108 -0
- lfx/components/tools/google_search_api.py +45 -0
- lfx/components/tools/google_serper_api.py +115 -0
- lfx/components/tools/python_code_structured_tool.py +327 -0
- lfx/components/tools/python_repl.py +97 -0
- lfx/components/tools/search_api.py +87 -0
- lfx/components/tools/searxng.py +145 -0
- lfx/components/tools/serp_api.py +119 -0
- lfx/components/tools/tavily_search_tool.py +344 -0
- lfx/components/tools/wikidata_api.py +102 -0
- lfx/components/tools/wikipedia_api.py +49 -0
- lfx/components/tools/yahoo_finance.py +129 -0
- lfx/components/twelvelabs/__init__.py +52 -0
- lfx/components/twelvelabs/convert_astra_results.py +84 -0
- lfx/components/twelvelabs/pegasus_index.py +311 -0
- lfx/components/twelvelabs/split_video.py +291 -0
- lfx/components/twelvelabs/text_embeddings.py +57 -0
- lfx/components/twelvelabs/twelvelabs_pegasus.py +408 -0
- lfx/components/twelvelabs/video_embeddings.py +100 -0
- lfx/components/twelvelabs/video_file.py +179 -0
- lfx/components/unstructured/__init__.py +3 -0
- lfx/components/unstructured/unstructured.py +121 -0
- lfx/components/upstash/__init__.py +34 -0
- lfx/components/upstash/upstash.py +124 -0
- lfx/components/vectara/__init__.py +37 -0
- lfx/components/vectara/vectara.py +97 -0
- lfx/components/vectara/vectara_rag.py +164 -0
- lfx/components/vectorstores/__init__.py +40 -0
- lfx/components/vectorstores/astradb.py +1285 -0
- lfx/components/vectorstores/astradb_graph.py +319 -0
- lfx/components/vectorstores/cassandra.py +264 -0
- lfx/components/vectorstores/cassandra_graph.py +238 -0
- lfx/components/vectorstores/chroma.py +167 -0
- lfx/components/vectorstores/clickhouse.py +135 -0
- lfx/components/vectorstores/couchbase.py +102 -0
- lfx/components/vectorstores/elasticsearch.py +267 -0
- lfx/components/vectorstores/faiss.py +111 -0
- lfx/components/vectorstores/graph_rag.py +141 -0
- lfx/components/vectorstores/hcd.py +314 -0
- lfx/components/vectorstores/local_db.py +261 -0
- lfx/components/vectorstores/milvus.py +115 -0
- lfx/components/vectorstores/mongodb_atlas.py +213 -0
- lfx/components/vectorstores/opensearch.py +243 -0
- lfx/components/vectorstores/pgvector.py +72 -0
- lfx/components/vectorstores/pinecone.py +134 -0
- lfx/components/vectorstores/qdrant.py +109 -0
- lfx/components/vectorstores/supabase.py +76 -0
- lfx/components/vectorstores/upstash.py +124 -0
- lfx/components/vectorstores/vectara.py +97 -0
- lfx/components/vectorstores/vectara_rag.py +164 -0
- lfx/components/vectorstores/weaviate.py +89 -0
- lfx/components/vertexai/__init__.py +37 -0
- lfx/components/vertexai/vertexai.py +71 -0
- lfx/components/vertexai/vertexai_embeddings.py +67 -0
- lfx/components/weaviate/__init__.py +34 -0
- lfx/components/weaviate/weaviate.py +89 -0
- lfx/components/wikipedia/__init__.py +4 -0
- lfx/components/wikipedia/wikidata.py +86 -0
- lfx/components/wikipedia/wikipedia.py +53 -0
- lfx/components/wolframalpha/__init__.py +3 -0
- lfx/components/wolframalpha/wolfram_alpha_api.py +54 -0
- lfx/components/xai/__init__.py +32 -0
- lfx/components/xai/xai.py +167 -0
- lfx/components/yahoosearch/__init__.py +3 -0
- lfx/components/yahoosearch/yahoo.py +137 -0
- lfx/components/youtube/__init__.py +52 -0
- lfx/components/youtube/channel.py +227 -0
- lfx/components/youtube/comments.py +231 -0
- lfx/components/youtube/playlist.py +33 -0
- lfx/components/youtube/search.py +120 -0
- lfx/components/youtube/trending.py +285 -0
- lfx/components/youtube/video_details.py +263 -0
- lfx/components/youtube/youtube_transcripts.py +118 -0
- lfx/components/zep/__init__.py +3 -0
- lfx/components/zep/zep.py +44 -0
- lfx/constants.py +6 -0
- lfx/custom/__init__.py +7 -0
- lfx/custom/attributes.py +86 -0
- lfx/custom/code_parser/__init__.py +3 -0
- lfx/custom/code_parser/code_parser.py +361 -0
- lfx/custom/custom_component/__init__.py +0 -0
- lfx/custom/custom_component/base_component.py +128 -0
- lfx/custom/custom_component/component.py +1808 -0
- lfx/custom/custom_component/component_with_cache.py +8 -0
- lfx/custom/custom_component/custom_component.py +588 -0
- lfx/custom/dependency_analyzer.py +165 -0
- lfx/custom/directory_reader/__init__.py +3 -0
- lfx/custom/directory_reader/directory_reader.py +359 -0
- lfx/custom/directory_reader/utils.py +171 -0
- lfx/custom/eval.py +12 -0
- lfx/custom/schema.py +32 -0
- lfx/custom/tree_visitor.py +21 -0
- lfx/custom/utils.py +877 -0
- lfx/custom/validate.py +488 -0
- lfx/events/__init__.py +1 -0
- lfx/events/event_manager.py +110 -0
- lfx/exceptions/__init__.py +0 -0
- lfx/exceptions/component.py +15 -0
- lfx/field_typing/__init__.py +91 -0
- lfx/field_typing/constants.py +215 -0
- lfx/field_typing/range_spec.py +35 -0
- lfx/graph/__init__.py +6 -0
- lfx/graph/edge/__init__.py +0 -0
- lfx/graph/edge/base.py +277 -0
- lfx/graph/edge/schema.py +119 -0
- lfx/graph/edge/utils.py +0 -0
- lfx/graph/graph/__init__.py +0 -0
- lfx/graph/graph/ascii.py +202 -0
- lfx/graph/graph/base.py +2238 -0
- lfx/graph/graph/constants.py +63 -0
- lfx/graph/graph/runnable_vertices_manager.py +133 -0
- lfx/graph/graph/schema.py +52 -0
- lfx/graph/graph/state_model.py +66 -0
- lfx/graph/graph/utils.py +1024 -0
- lfx/graph/schema.py +75 -0
- lfx/graph/state/__init__.py +0 -0
- lfx/graph/state/model.py +237 -0
- lfx/graph/utils.py +200 -0
- lfx/graph/vertex/__init__.py +0 -0
- lfx/graph/vertex/base.py +823 -0
- lfx/graph/vertex/constants.py +0 -0
- lfx/graph/vertex/exceptions.py +4 -0
- lfx/graph/vertex/param_handler.py +264 -0
- lfx/graph/vertex/schema.py +26 -0
- lfx/graph/vertex/utils.py +19 -0
- lfx/graph/vertex/vertex_types.py +489 -0
- lfx/helpers/__init__.py +1 -0
- lfx/helpers/base_model.py +71 -0
- lfx/helpers/custom.py +13 -0
- lfx/helpers/data.py +167 -0
- lfx/helpers/flow.py +194 -0
- lfx/inputs/__init__.py +68 -0
- lfx/inputs/constants.py +2 -0
- lfx/inputs/input_mixin.py +328 -0
- lfx/inputs/inputs.py +714 -0
- lfx/inputs/validators.py +19 -0
- lfx/interface/__init__.py +6 -0
- lfx/interface/components.py +489 -0
- lfx/interface/importing/__init__.py +5 -0
- lfx/interface/importing/utils.py +39 -0
- lfx/interface/initialize/__init__.py +3 -0
- lfx/interface/initialize/loading.py +224 -0
- lfx/interface/listing.py +26 -0
- lfx/interface/run.py +16 -0
- lfx/interface/utils.py +111 -0
- lfx/io/__init__.py +63 -0
- lfx/io/schema.py +289 -0
- lfx/load/__init__.py +8 -0
- lfx/load/load.py +256 -0
- lfx/load/utils.py +99 -0
- lfx/log/__init__.py +5 -0
- lfx/log/logger.py +385 -0
- lfx/memory/__init__.py +90 -0
- lfx/memory/stubs.py +283 -0
- lfx/processing/__init__.py +1 -0
- lfx/processing/process.py +238 -0
- lfx/processing/utils.py +25 -0
- lfx/py.typed +0 -0
- lfx/schema/__init__.py +66 -0
- lfx/schema/artifact.py +83 -0
- lfx/schema/content_block.py +62 -0
- lfx/schema/content_types.py +91 -0
- lfx/schema/data.py +308 -0
- lfx/schema/dataframe.py +210 -0
- lfx/schema/dotdict.py +74 -0
- lfx/schema/encoders.py +13 -0
- lfx/schema/graph.py +47 -0
- lfx/schema/image.py +131 -0
- lfx/schema/json_schema.py +141 -0
- lfx/schema/log.py +61 -0
- lfx/schema/message.py +473 -0
- lfx/schema/openai_responses_schemas.py +74 -0
- lfx/schema/properties.py +41 -0
- lfx/schema/schema.py +171 -0
- lfx/schema/serialize.py +13 -0
- lfx/schema/table.py +140 -0
- lfx/schema/validators.py +114 -0
- lfx/serialization/__init__.py +5 -0
- lfx/serialization/constants.py +2 -0
- lfx/serialization/serialization.py +314 -0
- lfx/services/__init__.py +23 -0
- lfx/services/base.py +28 -0
- lfx/services/cache/__init__.py +6 -0
- lfx/services/cache/base.py +183 -0
- lfx/services/cache/service.py +166 -0
- lfx/services/cache/utils.py +169 -0
- lfx/services/chat/__init__.py +1 -0
- lfx/services/chat/config.py +2 -0
- lfx/services/chat/schema.py +10 -0
- lfx/services/deps.py +129 -0
- lfx/services/factory.py +19 -0
- lfx/services/initialize.py +19 -0
- lfx/services/interfaces.py +103 -0
- lfx/services/manager.py +172 -0
- lfx/services/schema.py +20 -0
- lfx/services/session.py +82 -0
- lfx/services/settings/__init__.py +3 -0
- lfx/services/settings/auth.py +130 -0
- lfx/services/settings/base.py +539 -0
- lfx/services/settings/constants.py +31 -0
- lfx/services/settings/factory.py +23 -0
- lfx/services/settings/feature_flags.py +12 -0
- lfx/services/settings/service.py +35 -0
- lfx/services/settings/utils.py +40 -0
- lfx/services/shared_component_cache/__init__.py +1 -0
- lfx/services/shared_component_cache/factory.py +30 -0
- lfx/services/shared_component_cache/service.py +9 -0
- lfx/services/storage/__init__.py +5 -0
- lfx/services/storage/local.py +155 -0
- lfx/services/storage/service.py +54 -0
- lfx/services/tracing/__init__.py +1 -0
- lfx/services/tracing/service.py +21 -0
- lfx/settings.py +6 -0
- lfx/template/__init__.py +6 -0
- lfx/template/field/__init__.py +0 -0
- lfx/template/field/base.py +257 -0
- lfx/template/field/prompt.py +15 -0
- lfx/template/frontend_node/__init__.py +6 -0
- lfx/template/frontend_node/base.py +212 -0
- lfx/template/frontend_node/constants.py +65 -0
- lfx/template/frontend_node/custom_components.py +79 -0
- lfx/template/template/__init__.py +0 -0
- lfx/template/template/base.py +100 -0
- lfx/template/utils.py +217 -0
- lfx/type_extraction/__init__.py +19 -0
- lfx/type_extraction/type_extraction.py +75 -0
- lfx/type_extraction.py +80 -0
- lfx/utils/__init__.py +1 -0
- lfx/utils/async_helpers.py +42 -0
- lfx/utils/component_utils.py +154 -0
- lfx/utils/concurrency.py +60 -0
- lfx/utils/connection_string_parser.py +11 -0
- lfx/utils/constants.py +205 -0
- lfx/utils/data_structure.py +212 -0
- lfx/utils/exceptions.py +22 -0
- lfx/utils/helpers.py +28 -0
- lfx/utils/image.py +73 -0
- lfx/utils/lazy_load.py +15 -0
- lfx/utils/request_utils.py +18 -0
- lfx/utils/schemas.py +139 -0
- lfx/utils/util.py +481 -0
- lfx/utils/util_strings.py +56 -0
- lfx/utils/version.py +24 -0
- lfx_nightly-0.1.11.dev0.dist-info/METADATA +293 -0
- lfx_nightly-0.1.11.dev0.dist-info/RECORD +699 -0
- lfx_nightly-0.1.11.dev0.dist-info/WHEEL +4 -0
- lfx_nightly-0.1.11.dev0.dist-info/entry_points.txt +2 -0
@@ -0,0 +1,126 @@
|
|
1
|
+
from lfx.custom.custom_component.component import Component
|
2
|
+
from lfx.io import MessageTextInput, Output, SecretStrInput
|
3
|
+
from lfx.schema.data import Data
|
4
|
+
|
5
|
+
MAX_ELEMENT_PROMPTS = 5
|
6
|
+
|
7
|
+
|
8
|
+
class JigsawStackAIScraperComponent(Component):
|
9
|
+
display_name = "AI Scraper"
|
10
|
+
description = "Scrape any website instantly and get consistent structured data \
|
11
|
+
in seconds without writing any css selector code"
|
12
|
+
documentation = "https://jigsawstack.com/docs/api-reference/ai/scrape"
|
13
|
+
icon = "JigsawStack"
|
14
|
+
name = "JigsawStackAIScraper"
|
15
|
+
|
16
|
+
inputs = [
|
17
|
+
SecretStrInput(
|
18
|
+
name="api_key",
|
19
|
+
display_name="JigsawStack API Key",
|
20
|
+
info="Your JigsawStack API key for authentication",
|
21
|
+
required=True,
|
22
|
+
),
|
23
|
+
MessageTextInput(
|
24
|
+
name="url",
|
25
|
+
display_name="URL",
|
26
|
+
info="URL of the page to scrape. Either url or html is required, but not both.",
|
27
|
+
required=False,
|
28
|
+
tool_mode=True,
|
29
|
+
),
|
30
|
+
MessageTextInput(
|
31
|
+
name="html",
|
32
|
+
display_name="HTML",
|
33
|
+
info="HTML content to scrape. Either url or html is required, but not both.",
|
34
|
+
required=False,
|
35
|
+
tool_mode=True,
|
36
|
+
),
|
37
|
+
MessageTextInput(
|
38
|
+
name="element_prompts",
|
39
|
+
display_name="Element Prompts",
|
40
|
+
info="Items on the page to be scraped (maximum 5). E.g. 'Plan price', 'Plan title'",
|
41
|
+
required=True,
|
42
|
+
tool_mode=True,
|
43
|
+
),
|
44
|
+
MessageTextInput(
|
45
|
+
name="root_element_selector",
|
46
|
+
display_name="Root Element Selector",
|
47
|
+
info="CSS selector to limit the scope of scraping to a specific element and its children",
|
48
|
+
required=False,
|
49
|
+
value="main",
|
50
|
+
),
|
51
|
+
]
|
52
|
+
|
53
|
+
outputs = [
|
54
|
+
Output(display_name="AI Scraper Results", name="scrape_results", method="scrape"),
|
55
|
+
]
|
56
|
+
|
57
|
+
def scrape(self) -> Data:
|
58
|
+
try:
|
59
|
+
from jigsawstack import JigsawStack, JigsawStackError
|
60
|
+
except ImportError as e:
|
61
|
+
jigsawstack_import_error = (
|
62
|
+
"JigsawStack package not found. Please install it using: pip install jigsawstack>=0.2.7"
|
63
|
+
)
|
64
|
+
raise ImportError(jigsawstack_import_error) from e
|
65
|
+
|
66
|
+
try:
|
67
|
+
client = JigsawStack(api_key=self.api_key)
|
68
|
+
|
69
|
+
# Build request object
|
70
|
+
scrape_params: dict = {}
|
71
|
+
if self.url:
|
72
|
+
scrape_params["url"] = self.url
|
73
|
+
if self.html:
|
74
|
+
scrape_params["html"] = self.html
|
75
|
+
|
76
|
+
url_value = scrape_params.get("url", "")
|
77
|
+
html_value = scrape_params.get("html", "")
|
78
|
+
if (not url_value or not url_value.strip()) and (not html_value or not html_value.strip()):
|
79
|
+
url_or_html_error = "Either 'url' or 'html' must be provided for scraping"
|
80
|
+
raise ValueError(url_or_html_error)
|
81
|
+
|
82
|
+
# Process element_prompts with proper type handling
|
83
|
+
element_prompts_list: list[str] = []
|
84
|
+
if self.element_prompts:
|
85
|
+
element_prompts_value: str | list[str] = self.element_prompts
|
86
|
+
|
87
|
+
if isinstance(element_prompts_value, str):
|
88
|
+
if "," not in element_prompts_value:
|
89
|
+
element_prompts_list = [element_prompts_value]
|
90
|
+
else:
|
91
|
+
element_prompts_list = element_prompts_value.split(",")
|
92
|
+
elif isinstance(element_prompts_value, list):
|
93
|
+
element_prompts_list = element_prompts_value
|
94
|
+
else:
|
95
|
+
# Fallback for other types
|
96
|
+
element_prompts_list = str(element_prompts_value).split(",")
|
97
|
+
|
98
|
+
if len(element_prompts_list) > MAX_ELEMENT_PROMPTS:
|
99
|
+
max_elements_error = "Maximum of 5 element prompts allowed"
|
100
|
+
raise ValueError(max_elements_error)
|
101
|
+
if len(element_prompts_list) == 0:
|
102
|
+
invalid_elements_error = "Element prompts cannot be empty"
|
103
|
+
raise ValueError(invalid_elements_error)
|
104
|
+
|
105
|
+
scrape_params["element_prompts"] = element_prompts_list
|
106
|
+
|
107
|
+
if self.root_element_selector:
|
108
|
+
scrape_params["root_element_selector"] = self.root_element_selector
|
109
|
+
|
110
|
+
# Call web scraping
|
111
|
+
response = client.web.ai_scrape(scrape_params)
|
112
|
+
|
113
|
+
if not response.get("success", False):
|
114
|
+
fail_error = "JigsawStack API request failed."
|
115
|
+
raise ValueError(fail_error)
|
116
|
+
|
117
|
+
result_data = response
|
118
|
+
|
119
|
+
self.status = "AI scrape process is now complete."
|
120
|
+
|
121
|
+
return Data(data=result_data)
|
122
|
+
|
123
|
+
except JigsawStackError as e:
|
124
|
+
error_data = {"error": str(e), "success": False}
|
125
|
+
self.status = f"Error: {e!s}"
|
126
|
+
return Data(data=error_data)
|
@@ -0,0 +1,136 @@
|
|
1
|
+
from lfx.custom.custom_component.component import Component
|
2
|
+
from lfx.io import BoolInput, DropdownInput, Output, QueryInput, SecretStrInput
|
3
|
+
from lfx.schema.data import Data
|
4
|
+
from lfx.schema.message import Message
|
5
|
+
|
6
|
+
|
7
|
+
class JigsawStackAIWebSearchComponent(Component):
|
8
|
+
display_name = "AI Web Search"
|
9
|
+
description = "Effortlessly search the Web and get access to high-quality results powered with AI."
|
10
|
+
documentation = "https://jigsawstack.com/docs/api-reference/web/ai-search"
|
11
|
+
icon = "JigsawStack"
|
12
|
+
name = "JigsawStackAISearch"
|
13
|
+
inputs = [
|
14
|
+
SecretStrInput(
|
15
|
+
name="api_key",
|
16
|
+
display_name="JigsawStack API Key",
|
17
|
+
info="Your JigsawStack API key for authentication",
|
18
|
+
required=True,
|
19
|
+
),
|
20
|
+
QueryInput(
|
21
|
+
name="query",
|
22
|
+
display_name="Query",
|
23
|
+
info="The search value. The maximum query character length is 400",
|
24
|
+
required=True,
|
25
|
+
tool_mode=True,
|
26
|
+
),
|
27
|
+
BoolInput(
|
28
|
+
name="ai_overview",
|
29
|
+
display_name="AI Overview",
|
30
|
+
info="Include AI powered overview in the search results",
|
31
|
+
required=False,
|
32
|
+
value=True,
|
33
|
+
),
|
34
|
+
DropdownInput(
|
35
|
+
name="safe_search",
|
36
|
+
display_name="Safe Search",
|
37
|
+
info="Enable safe search to filter out adult content",
|
38
|
+
required=False,
|
39
|
+
options=["moderate", "strict", "off"],
|
40
|
+
value="off",
|
41
|
+
),
|
42
|
+
BoolInput(
|
43
|
+
name="spell_check",
|
44
|
+
display_name="Spell Check",
|
45
|
+
info="Spell check the search query",
|
46
|
+
required=False,
|
47
|
+
value=True,
|
48
|
+
),
|
49
|
+
]
|
50
|
+
|
51
|
+
outputs = [
|
52
|
+
Output(display_name="AI Search Results", name="search_results", method="search"),
|
53
|
+
Output(display_name="Content Text", name="content_text", method="get_content_text"),
|
54
|
+
]
|
55
|
+
|
56
|
+
def search(self) -> Data:
|
57
|
+
try:
|
58
|
+
from jigsawstack import JigsawStack, JigsawStackError
|
59
|
+
except ImportError as e:
|
60
|
+
jigsawstack_import_error = (
|
61
|
+
"JigsawStack package not found. Please install it using: pip install jigsawstack>=0.2.7"
|
62
|
+
)
|
63
|
+
raise ImportError(jigsawstack_import_error) from e
|
64
|
+
|
65
|
+
try:
|
66
|
+
client = JigsawStack(api_key=self.api_key)
|
67
|
+
|
68
|
+
# build request object
|
69
|
+
search_params = {}
|
70
|
+
if self.query:
|
71
|
+
search_params["query"] = self.query
|
72
|
+
if self.ai_overview is not None:
|
73
|
+
search_params["ai_overview"] = self.ai_overview
|
74
|
+
if self.safe_search:
|
75
|
+
search_params["safe_search"] = self.safe_search
|
76
|
+
if self.spell_check is not None:
|
77
|
+
search_params["spell_check"] = self.spell_check
|
78
|
+
|
79
|
+
# Call web scraping
|
80
|
+
response = client.web.search(search_params)
|
81
|
+
|
82
|
+
api_error_msg = "JigsawStack API returned unsuccessful response"
|
83
|
+
if not response.get("success", False):
|
84
|
+
raise ValueError(api_error_msg)
|
85
|
+
|
86
|
+
# Create comprehensive data object
|
87
|
+
result_data = {
|
88
|
+
"query": self.query,
|
89
|
+
"ai_overview": response.get("ai_overview", ""),
|
90
|
+
"spell_fixed": response.get("spell_fixed", False),
|
91
|
+
"is_safe": response.get("is_safe", True),
|
92
|
+
"results": response.get("results", []),
|
93
|
+
"success": True,
|
94
|
+
}
|
95
|
+
|
96
|
+
self.status = f"Search complete for: {response.get('query', '')}"
|
97
|
+
|
98
|
+
return Data(data=result_data)
|
99
|
+
|
100
|
+
except JigsawStackError as e:
|
101
|
+
error_data = {"error": str(e), "success": False}
|
102
|
+
self.status = f"Error: {e!s}"
|
103
|
+
return Data(data=error_data)
|
104
|
+
|
105
|
+
def get_content_text(self) -> Message:
|
106
|
+
try:
|
107
|
+
from jigsawstack import JigsawStack, JigsawStackError
|
108
|
+
except ImportError:
|
109
|
+
return Message(text="Error: JigsawStack package not found.")
|
110
|
+
|
111
|
+
try:
|
112
|
+
# Initialize JigsawStack client
|
113
|
+
client = JigsawStack(api_key=self.api_key)
|
114
|
+
search_params = {}
|
115
|
+
if self.query:
|
116
|
+
search_params["query"] = self.query
|
117
|
+
if self.ai_overview is not None:
|
118
|
+
search_params["ai_overview"] = self.ai_overview
|
119
|
+
if self.safe_search:
|
120
|
+
search_params["safe_search"] = self.safe_search
|
121
|
+
if self.spell_check is not None:
|
122
|
+
search_params["spell_check"] = self.spell_check
|
123
|
+
|
124
|
+
# Call web scraping
|
125
|
+
response = client.web.search(search_params)
|
126
|
+
|
127
|
+
request_failed_msg = "Request Failed"
|
128
|
+
if not response.get("success", False):
|
129
|
+
raise JigsawStackError(request_failed_msg)
|
130
|
+
|
131
|
+
# Return the content as text
|
132
|
+
content = response.get("ai_overview", "")
|
133
|
+
return Message(text=content)
|
134
|
+
|
135
|
+
except JigsawStackError as e:
|
136
|
+
return Message(text=f"Error while using AI Search: {e!s}")
|
@@ -0,0 +1,115 @@
|
|
1
|
+
import tempfile
|
2
|
+
|
3
|
+
from lfx.custom.custom_component.component import Component
|
4
|
+
from lfx.io import Output, SecretStrInput, StrInput
|
5
|
+
from lfx.schema.data import Data
|
6
|
+
|
7
|
+
|
8
|
+
class JigsawStackFileReadComponent(Component):
|
9
|
+
display_name = "File Read"
|
10
|
+
description = "Read any previously uploaded file seamlessly from \
|
11
|
+
JigsawStack File Storage and use it in your AI applications."
|
12
|
+
documentation = "https://jigsawstack.com/docs/api-reference/store/file/get"
|
13
|
+
icon = "JigsawStack"
|
14
|
+
name = "JigsawStackFileRead"
|
15
|
+
|
16
|
+
inputs = [
|
17
|
+
SecretStrInput(
|
18
|
+
name="api_key",
|
19
|
+
display_name="JigsawStack API Key",
|
20
|
+
info="Your JigsawStack API key for authentication",
|
21
|
+
required=True,
|
22
|
+
),
|
23
|
+
StrInput(
|
24
|
+
name="key",
|
25
|
+
display_name="Key",
|
26
|
+
info="The key used to retrieve the file from JigsawStack File Storage.",
|
27
|
+
required=True,
|
28
|
+
tool_mode=True,
|
29
|
+
),
|
30
|
+
]
|
31
|
+
|
32
|
+
outputs = [
|
33
|
+
Output(display_name="File Path", name="file_path", method="read_and_save_file"),
|
34
|
+
]
|
35
|
+
|
36
|
+
def read_and_save_file(self) -> Data:
|
37
|
+
"""Read file from JigsawStack and save to temp file, return file path."""
|
38
|
+
try:
|
39
|
+
from jigsawstack import JigsawStack, JigsawStackError
|
40
|
+
except ImportError as e:
|
41
|
+
jigsawstack_import_error = (
|
42
|
+
"JigsawStack package not found. Please install it using: pip install jigsawstack>=0.2.7"
|
43
|
+
)
|
44
|
+
raise ImportError(jigsawstack_import_error) from e
|
45
|
+
|
46
|
+
try:
|
47
|
+
client = JigsawStack(api_key=self.api_key)
|
48
|
+
if not self.key or self.key.strip() == "":
|
49
|
+
invalid_key_error = "Key is required to read a file from JigsawStack File Storage."
|
50
|
+
raise ValueError(invalid_key_error)
|
51
|
+
|
52
|
+
# Download file content
|
53
|
+
response = client.store.get(self.key)
|
54
|
+
|
55
|
+
# Determine file extension
|
56
|
+
file_extension = self._detect_file_extension(response)
|
57
|
+
|
58
|
+
# Create temporary file
|
59
|
+
with tempfile.NamedTemporaryFile(
|
60
|
+
delete=False, suffix=file_extension, prefix=f"jigsawstack_{self.key}_"
|
61
|
+
) as temp_file:
|
62
|
+
if isinstance(response, bytes):
|
63
|
+
temp_file.write(response)
|
64
|
+
else:
|
65
|
+
# Handle string content
|
66
|
+
temp_file.write(response.encode("utf-8"))
|
67
|
+
|
68
|
+
temp_path = temp_file.name
|
69
|
+
|
70
|
+
return Data(
|
71
|
+
data={
|
72
|
+
"file_path": temp_path,
|
73
|
+
"key": self.key,
|
74
|
+
"file_extension": file_extension,
|
75
|
+
"size": len(response) if isinstance(response, bytes) else len(str(response)),
|
76
|
+
"success": True,
|
77
|
+
}
|
78
|
+
)
|
79
|
+
|
80
|
+
except JigsawStackError as e:
|
81
|
+
error_data = {"error": str(e), "success": False}
|
82
|
+
self.status = f"Error: {e!s}"
|
83
|
+
return Data(data=error_data)
|
84
|
+
|
85
|
+
def _detect_file_extension(self, content) -> str:
|
86
|
+
"""Detect file extension based on content headers."""
|
87
|
+
if isinstance(content, bytes):
|
88
|
+
# Check magic numbers for common file types
|
89
|
+
if content.startswith(b"\xff\xd8\xff"):
|
90
|
+
return ".jpg"
|
91
|
+
if content.startswith(b"\x89PNG\r\n\x1a\n"):
|
92
|
+
return ".png"
|
93
|
+
if content.startswith((b"GIF87a", b"GIF89a")):
|
94
|
+
return ".gif"
|
95
|
+
if content.startswith(b"%PDF"):
|
96
|
+
return ".pdf"
|
97
|
+
if content.startswith(b"PK\x03\x04"): # ZIP/DOCX/XLSX
|
98
|
+
return ".zip"
|
99
|
+
if content.startswith(b"\x00\x00\x01\x00"): # ICO
|
100
|
+
return ".ico"
|
101
|
+
if content.startswith(b"RIFF") and b"WEBP" in content[:12]:
|
102
|
+
return ".webp"
|
103
|
+
if content.startswith((b"\xff\xfb", b"\xff\xf3", b"\xff\xf2")):
|
104
|
+
return ".mp3"
|
105
|
+
if content.startswith((b"ftypmp4", b"\x00\x00\x00\x20ftypmp4")):
|
106
|
+
return ".mp4"
|
107
|
+
# Try to decode as text
|
108
|
+
try:
|
109
|
+
content.decode("utf-8")
|
110
|
+
return ".txt" # noqa: TRY300
|
111
|
+
except UnicodeDecodeError:
|
112
|
+
return ".bin" # Binary file
|
113
|
+
else:
|
114
|
+
# String content
|
115
|
+
return ".txt"
|
@@ -0,0 +1,94 @@
|
|
1
|
+
from pathlib import Path
|
2
|
+
|
3
|
+
from lfx.custom.custom_component.component import Component
|
4
|
+
from lfx.io import BoolInput, FileInput, Output, SecretStrInput, StrInput
|
5
|
+
from lfx.schema.data import Data
|
6
|
+
|
7
|
+
|
8
|
+
class JigsawStackFileUploadComponent(Component):
|
9
|
+
display_name = "File Upload"
|
10
|
+
description = "Store any file seamlessly on JigsawStack File Storage and use it in your AI applications. \
|
11
|
+
Supports various file types including images, documents, and more."
|
12
|
+
documentation = "https://jigsawstack.com/docs/api-reference/store/file/add"
|
13
|
+
icon = "JigsawStack"
|
14
|
+
name = "JigsawStackFileUpload"
|
15
|
+
|
16
|
+
inputs = [
|
17
|
+
SecretStrInput(
|
18
|
+
name="api_key",
|
19
|
+
display_name="JigsawStack API Key",
|
20
|
+
info="Your JigsawStack API key for authentication",
|
21
|
+
required=True,
|
22
|
+
),
|
23
|
+
FileInput(
|
24
|
+
name="file",
|
25
|
+
display_name="File",
|
26
|
+
info="Upload file to be stored on JigsawStack File Storage.",
|
27
|
+
required=True,
|
28
|
+
file_types=["pdf", "png", "jpg", "jpeg", "mp4", "mp3", "txt", "docx", "xlsx"],
|
29
|
+
),
|
30
|
+
StrInput(
|
31
|
+
name="key",
|
32
|
+
display_name="Key",
|
33
|
+
info="The key used to store the file on JigsawStack File Storage. \
|
34
|
+
If not provided, a unique key will be generated.",
|
35
|
+
required=False,
|
36
|
+
tool_mode=True,
|
37
|
+
),
|
38
|
+
BoolInput(
|
39
|
+
name="overwrite",
|
40
|
+
display_name="Overwrite Existing File",
|
41
|
+
info="If true, will overwrite the existing file with the same key. \
|
42
|
+
If false, will return an error if the file already exists.",
|
43
|
+
required=False,
|
44
|
+
value=True,
|
45
|
+
),
|
46
|
+
BoolInput(
|
47
|
+
name="temp_public_url",
|
48
|
+
display_name="Return Temporary Public URL",
|
49
|
+
info="If true, will return a temporary public URL which lasts for a limited time. \
|
50
|
+
If false, will return the file store key which can only be accessed by the owner.",
|
51
|
+
required=False,
|
52
|
+
value=False,
|
53
|
+
tool_mode=True,
|
54
|
+
),
|
55
|
+
]
|
56
|
+
|
57
|
+
outputs = [
|
58
|
+
Output(display_name="File Store Result", name="file_upload_result", method="upload_file"),
|
59
|
+
]
|
60
|
+
|
61
|
+
def upload_file(self) -> Data:
|
62
|
+
try:
|
63
|
+
from jigsawstack import JigsawStack, JigsawStackError
|
64
|
+
except ImportError as e:
|
65
|
+
jigsawstack_import_error = (
|
66
|
+
"JigsawStack package not found. Please install it using: pip install jigsawstack>=0.2.7"
|
67
|
+
)
|
68
|
+
raise ImportError(jigsawstack_import_error) from e
|
69
|
+
|
70
|
+
try:
|
71
|
+
client = JigsawStack(api_key=self.api_key)
|
72
|
+
|
73
|
+
file_path = Path(self.file)
|
74
|
+
with Path.open(file_path, "rb") as f:
|
75
|
+
file_content = f.read()
|
76
|
+
params = {}
|
77
|
+
|
78
|
+
if self.key:
|
79
|
+
# if key is provided, use it as the file store key
|
80
|
+
params["key"] = self.key
|
81
|
+
if self.overwrite is not None:
|
82
|
+
# if overwrite is provided, use it to determine if the file should be overwritten
|
83
|
+
params["overwrite"] = self.overwrite
|
84
|
+
if self.temp_public_url is not None:
|
85
|
+
# if temp_public_url is provided, use it to determine if a temporary public URL should
|
86
|
+
params["temp_public_url"] = self.temp_public_url
|
87
|
+
|
88
|
+
response = client.store.upload(file_content, params)
|
89
|
+
return Data(data=response)
|
90
|
+
|
91
|
+
except JigsawStackError as e:
|
92
|
+
error_data = {"error": str(e), "success": False}
|
93
|
+
self.status = f"Error: {e!s}"
|
94
|
+
return Data(data=error_data)
|
@@ -0,0 +1,205 @@
|
|
1
|
+
from lfx.custom.custom_component.component import Component
|
2
|
+
from lfx.io import DropdownInput, IntInput, MessageTextInput, Output, SecretStrInput
|
3
|
+
from lfx.schema.data import Data
|
4
|
+
|
5
|
+
|
6
|
+
class JigsawStackImageGenerationComponent(Component):
|
7
|
+
display_name = "Image Generation"
|
8
|
+
description = "Generate an image based on the given text by employing AI models like Flux, \
|
9
|
+
Stable Diffusion, and other top models."
|
10
|
+
documentation = "https://jigsawstack.com/docs/api-reference/ai/image-generation"
|
11
|
+
icon = "JigsawStack"
|
12
|
+
name = "JigsawStackImageGeneration"
|
13
|
+
|
14
|
+
inputs = [
|
15
|
+
SecretStrInput(
|
16
|
+
name="api_key",
|
17
|
+
display_name="JigsawStack API Key",
|
18
|
+
info="Your JigsawStack API key for authentication",
|
19
|
+
required=True,
|
20
|
+
),
|
21
|
+
MessageTextInput(
|
22
|
+
name="prompt",
|
23
|
+
display_name="Prompt",
|
24
|
+
info="The text prompt to generate the image from. Must be between 1-5000 characters.",
|
25
|
+
required=True,
|
26
|
+
tool_mode=True,
|
27
|
+
),
|
28
|
+
MessageTextInput(
|
29
|
+
name="aspect_ratio",
|
30
|
+
display_name="Aspect Ratio",
|
31
|
+
info="The aspect ratio of the generated image. Must be one of the following:\
|
32
|
+
'1:1', '16:9', '21:9', '3:2', '2:3', '4:5', '5:4', '3:4', '4:3', '9:16', '9:21' \
|
33
|
+
Default is 1:1.",
|
34
|
+
required=False,
|
35
|
+
tool_mode=True,
|
36
|
+
),
|
37
|
+
MessageTextInput(
|
38
|
+
name="url",
|
39
|
+
display_name="URL",
|
40
|
+
info="A valid URL where the generated image will be sent.",
|
41
|
+
required=False,
|
42
|
+
),
|
43
|
+
MessageTextInput(
|
44
|
+
name="file_store_key",
|
45
|
+
display_name="File Store Key",
|
46
|
+
info="The key used to store the image on Jigsawstack File Storage. Not required if url is specified.",
|
47
|
+
required=False,
|
48
|
+
tool_mode=True,
|
49
|
+
),
|
50
|
+
IntInput(
|
51
|
+
name="width",
|
52
|
+
display_name="Width",
|
53
|
+
info="The width of the image. Must be between 256-1920 pixels.",
|
54
|
+
required=False,
|
55
|
+
),
|
56
|
+
IntInput(
|
57
|
+
name="height",
|
58
|
+
display_name="Height",
|
59
|
+
info="The height of the image. Must be between 256-1920 pixels.",
|
60
|
+
required=False,
|
61
|
+
),
|
62
|
+
IntInput(
|
63
|
+
name="steps",
|
64
|
+
display_name="Steps",
|
65
|
+
info="The number of denoising steps. Must be between 1-90. \
|
66
|
+
Higher values produce better quality images but take more time to generate.",
|
67
|
+
required=False,
|
68
|
+
),
|
69
|
+
DropdownInput(
|
70
|
+
name="output_format",
|
71
|
+
display_name="Output Format",
|
72
|
+
info="The output format of the generated image. Must be one of the following values:\
|
73
|
+
png or svg",
|
74
|
+
required=False,
|
75
|
+
options=["png", "svg"],
|
76
|
+
value="png",
|
77
|
+
),
|
78
|
+
MessageTextInput(
|
79
|
+
name="negative_prompt",
|
80
|
+
display_name="Negative Prompt",
|
81
|
+
info="The text prompt to avoid in the generated image. \
|
82
|
+
Must be between 1-5000 characters.",
|
83
|
+
required=False,
|
84
|
+
tool_mode=True,
|
85
|
+
advanced=True,
|
86
|
+
),
|
87
|
+
IntInput(
|
88
|
+
name="seed",
|
89
|
+
display_name="Seed",
|
90
|
+
info="Makes generation deterministic.\
|
91
|
+
Using the same seed and set of parameters will produce identical image each time.",
|
92
|
+
required=False,
|
93
|
+
tool_mode=True,
|
94
|
+
advanced=True,
|
95
|
+
),
|
96
|
+
IntInput(
|
97
|
+
name="guidance",
|
98
|
+
display_name="Guidance Scale",
|
99
|
+
info="Higher guidance forces the model to better follow the prompt, \
|
100
|
+
but may result in lower quality output. Must be between 1-28.",
|
101
|
+
required=False,
|
102
|
+
tool_mode=True,
|
103
|
+
advanced=True,
|
104
|
+
),
|
105
|
+
]
|
106
|
+
|
107
|
+
outputs = [
|
108
|
+
Output(display_name="Image Generation Results", name="image_generation_results", method="generate_image"),
|
109
|
+
]
|
110
|
+
|
111
|
+
def generate_image(self) -> Data:
|
112
|
+
try:
|
113
|
+
from jigsawstack import JigsawStack, JigsawStackError
|
114
|
+
except ImportError as e:
|
115
|
+
jigsawstack_import_error = (
|
116
|
+
"JigsawStack package not found. Please install it using: pip install jigsawstack>=0.2.7"
|
117
|
+
)
|
118
|
+
raise ImportError(jigsawstack_import_error) from e
|
119
|
+
|
120
|
+
try:
|
121
|
+
min_character_length = 1
|
122
|
+
max_character_length = 5000
|
123
|
+
min_width = 256
|
124
|
+
max_width = 1920
|
125
|
+
min_height = 256
|
126
|
+
max_height = 1920
|
127
|
+
min_steps = 1
|
128
|
+
max_steps = 90
|
129
|
+
client = JigsawStack(api_key=self.api_key)
|
130
|
+
|
131
|
+
if not self.prompt or len(self.prompt) < min_character_length or len(self.prompt) > max_character_length:
|
132
|
+
invalid_prompt_error = f"Prompts must be between \
|
133
|
+
{min_character_length}-{max_character_length} characters."
|
134
|
+
raise ValueError(invalid_prompt_error)
|
135
|
+
|
136
|
+
if self.aspect_ratio and self.aspect_ratio not in [
|
137
|
+
"1:1",
|
138
|
+
"16:9",
|
139
|
+
"21:9",
|
140
|
+
"3:2",
|
141
|
+
"2:3",
|
142
|
+
"4:5",
|
143
|
+
"5:4",
|
144
|
+
"3:4",
|
145
|
+
"4:3",
|
146
|
+
"9:16",
|
147
|
+
"9:21",
|
148
|
+
]:
|
149
|
+
invalid_aspect_ratio_error = (
|
150
|
+
"Aspect ratio must be one of the following: '1:1', '16:9', '21:9', '3:2', '2:3', "
|
151
|
+
"'4:5', '5:4', '3:4', '4:3', '9:16', '9:21'."
|
152
|
+
)
|
153
|
+
raise ValueError(invalid_aspect_ratio_error)
|
154
|
+
if self.width and (self.width < min_width or self.width > max_width):
|
155
|
+
invalid_width_error = f"Width must be between {min_width}-{max_width} pixels."
|
156
|
+
raise ValueError(invalid_width_error)
|
157
|
+
if self.height and (self.height < min_height or self.height > max_height):
|
158
|
+
invalid_height_error = f"Height must be between {min_height}-{max_height} pixels."
|
159
|
+
raise ValueError(invalid_height_error)
|
160
|
+
if self.steps and (self.steps < min_steps or self.steps > max_steps):
|
161
|
+
invalid_steps_error = f"Steps must be between {min_steps}-{max_steps}."
|
162
|
+
raise ValueError(invalid_steps_error)
|
163
|
+
|
164
|
+
params = {}
|
165
|
+
if self.prompt:
|
166
|
+
params["prompt"] = self.prompt.strip()
|
167
|
+
if self.aspect_ratio:
|
168
|
+
params["aspect_ratio"] = self.aspect_ratio.strip()
|
169
|
+
if self.url:
|
170
|
+
params["url"] = self.url.strip()
|
171
|
+
if self.file_store_key:
|
172
|
+
params["file_store_key"] = self.file_store_key.strip()
|
173
|
+
if self.width:
|
174
|
+
params["width"] = self.width
|
175
|
+
if self.height:
|
176
|
+
params["height"] = self.height
|
177
|
+
params["return_type"] = "url"
|
178
|
+
if self.output_format:
|
179
|
+
params["output_format"] = self.output_format.strip()
|
180
|
+
if self.steps:
|
181
|
+
params["steps"] = self.steps
|
182
|
+
|
183
|
+
# Initialize advance_config if any advanced parameters are provided
|
184
|
+
if self.negative_prompt or self.seed or self.guidance:
|
185
|
+
params["advance_config"] = {}
|
186
|
+
if self.negative_prompt:
|
187
|
+
params["advance_config"]["negative_prompt"] = self.negative_prompt
|
188
|
+
if self.seed:
|
189
|
+
params["advance_config"]["seed"] = self.seed
|
190
|
+
if self.guidance:
|
191
|
+
params["advance_config"]["guidance"] = self.guidance
|
192
|
+
|
193
|
+
# Call image generation
|
194
|
+
response = client.image_generation(params)
|
195
|
+
|
196
|
+
if response.get("url", None) is None or response.get("url", None).strip() == "":
|
197
|
+
failed_response_error = "JigsawStack API returned unsuccessful response"
|
198
|
+
raise ValueError(failed_response_error)
|
199
|
+
|
200
|
+
return Data(data=response)
|
201
|
+
|
202
|
+
except JigsawStackError as e:
|
203
|
+
error_data = {"error": str(e), "success": False}
|
204
|
+
self.status = f"Error: {e!s}"
|
205
|
+
return Data(data=error_data)
|