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,134 @@
|
|
1
|
+
import numpy as np
|
2
|
+
from langchain_core.vectorstores import VectorStore
|
3
|
+
|
4
|
+
from lfx.base.vectorstores.model import LCVectorStoreComponent, check_cached_vector_store
|
5
|
+
from lfx.helpers.data import docs_to_data
|
6
|
+
from lfx.io import DropdownInput, HandleInput, IntInput, SecretStrInput, StrInput
|
7
|
+
from lfx.schema.data import Data
|
8
|
+
|
9
|
+
|
10
|
+
class PineconeVectorStoreComponent(LCVectorStoreComponent):
|
11
|
+
display_name = "Pinecone"
|
12
|
+
description = "Pinecone Vector Store with search capabilities"
|
13
|
+
name = "Pinecone"
|
14
|
+
icon = "Pinecone"
|
15
|
+
inputs = [
|
16
|
+
StrInput(name="index_name", display_name="Index Name", required=True),
|
17
|
+
StrInput(name="namespace", display_name="Namespace", info="Namespace for the index."),
|
18
|
+
DropdownInput(
|
19
|
+
name="distance_strategy",
|
20
|
+
display_name="Distance Strategy",
|
21
|
+
options=["Cosine", "Euclidean", "Dot Product"],
|
22
|
+
value="Cosine",
|
23
|
+
advanced=True,
|
24
|
+
),
|
25
|
+
SecretStrInput(name="pinecone_api_key", display_name="Pinecone API Key", required=True),
|
26
|
+
StrInput(
|
27
|
+
name="text_key",
|
28
|
+
display_name="Text Key",
|
29
|
+
info="Key in the record to use as text.",
|
30
|
+
value="text",
|
31
|
+
advanced=True,
|
32
|
+
),
|
33
|
+
*LCVectorStoreComponent.inputs,
|
34
|
+
HandleInput(name="embedding", display_name="Embedding", input_types=["Embeddings"]),
|
35
|
+
IntInput(
|
36
|
+
name="number_of_results",
|
37
|
+
display_name="Number of Results",
|
38
|
+
info="Number of results to return.",
|
39
|
+
value=4,
|
40
|
+
advanced=True,
|
41
|
+
),
|
42
|
+
]
|
43
|
+
|
44
|
+
@check_cached_vector_store
|
45
|
+
def build_vector_store(self) -> VectorStore:
|
46
|
+
"""Build and return a Pinecone vector store instance."""
|
47
|
+
try:
|
48
|
+
from langchain_pinecone import PineconeVectorStore
|
49
|
+
except ImportError as e:
|
50
|
+
msg = "langchain-pinecone is not installed. Please install it with `pip install langchain-pinecone`."
|
51
|
+
raise ValueError(msg) from e
|
52
|
+
|
53
|
+
try:
|
54
|
+
from langchain_pinecone._utilities import DistanceStrategy
|
55
|
+
|
56
|
+
# Wrap the embedding model to ensure float32 output
|
57
|
+
wrapped_embeddings = Float32Embeddings(self.embedding)
|
58
|
+
|
59
|
+
# Convert distance strategy
|
60
|
+
distance_strategy = self.distance_strategy.replace(" ", "_").upper()
|
61
|
+
distance_strategy = DistanceStrategy[distance_strategy]
|
62
|
+
|
63
|
+
# Initialize Pinecone instance with wrapped embeddings
|
64
|
+
pinecone = PineconeVectorStore(
|
65
|
+
index_name=self.index_name,
|
66
|
+
embedding=wrapped_embeddings, # Use wrapped embeddings
|
67
|
+
text_key=self.text_key,
|
68
|
+
namespace=self.namespace,
|
69
|
+
distance_strategy=distance_strategy,
|
70
|
+
pinecone_api_key=self.pinecone_api_key,
|
71
|
+
)
|
72
|
+
except Exception as e:
|
73
|
+
error_msg = "Error building Pinecone vector store"
|
74
|
+
raise ValueError(error_msg) from e
|
75
|
+
else:
|
76
|
+
self.ingest_data = self._prepare_ingest_data()
|
77
|
+
|
78
|
+
# Process documents if any
|
79
|
+
documents = []
|
80
|
+
if self.ingest_data:
|
81
|
+
# Convert DataFrame to Data if needed using parent's method
|
82
|
+
|
83
|
+
for doc in self.ingest_data:
|
84
|
+
if isinstance(doc, Data):
|
85
|
+
documents.append(doc.to_lc_document())
|
86
|
+
else:
|
87
|
+
documents.append(doc)
|
88
|
+
|
89
|
+
if documents:
|
90
|
+
pinecone.add_documents(documents)
|
91
|
+
|
92
|
+
return pinecone
|
93
|
+
|
94
|
+
def search_documents(self) -> list[Data]:
|
95
|
+
"""Search documents in the vector store."""
|
96
|
+
try:
|
97
|
+
if not self.search_query or not isinstance(self.search_query, str) or not self.search_query.strip():
|
98
|
+
return []
|
99
|
+
|
100
|
+
vector_store = self.build_vector_store()
|
101
|
+
docs = vector_store.similarity_search(
|
102
|
+
query=self.search_query,
|
103
|
+
k=self.number_of_results,
|
104
|
+
)
|
105
|
+
except Exception as e:
|
106
|
+
error_msg = "Error searching documents"
|
107
|
+
raise ValueError(error_msg) from e
|
108
|
+
else:
|
109
|
+
data = docs_to_data(docs)
|
110
|
+
self.status = data
|
111
|
+
return data
|
112
|
+
|
113
|
+
|
114
|
+
class Float32Embeddings:
|
115
|
+
"""Wrapper class to ensure float32 embeddings."""
|
116
|
+
|
117
|
+
def __init__(self, base_embeddings):
|
118
|
+
self.base_embeddings = base_embeddings
|
119
|
+
|
120
|
+
def embed_documents(self, texts):
|
121
|
+
embeddings = self.base_embeddings.embed_documents(texts)
|
122
|
+
if isinstance(embeddings, np.ndarray):
|
123
|
+
return [[self._force_float32(x) for x in vec] for vec in embeddings]
|
124
|
+
return [[self._force_float32(x) for x in vec] for vec in embeddings]
|
125
|
+
|
126
|
+
def embed_query(self, text):
|
127
|
+
embedding = self.base_embeddings.embed_query(text)
|
128
|
+
if isinstance(embedding, np.ndarray):
|
129
|
+
return [self._force_float32(x) for x in embedding]
|
130
|
+
return [self._force_float32(x) for x in embedding]
|
131
|
+
|
132
|
+
def _force_float32(self, value):
|
133
|
+
"""Convert any numeric type to Python float."""
|
134
|
+
return float(np.float32(value))
|
@@ -0,0 +1,117 @@
|
|
1
|
+
"""Processing components for LangFlow."""
|
2
|
+
|
3
|
+
from __future__ import annotations
|
4
|
+
|
5
|
+
from typing import TYPE_CHECKING, Any
|
6
|
+
|
7
|
+
from lfx.components._importing import import_mod
|
8
|
+
|
9
|
+
if TYPE_CHECKING:
|
10
|
+
from lfx.components.processing.alter_metadata import AlterMetadataComponent
|
11
|
+
from lfx.components.processing.batch_run import BatchRunComponent
|
12
|
+
from lfx.components.processing.combine_text import CombineTextComponent
|
13
|
+
from lfx.components.processing.converter import TypeConverterComponent
|
14
|
+
from lfx.components.processing.create_data import CreateDataComponent
|
15
|
+
from lfx.components.processing.data_operations import DataOperationsComponent
|
16
|
+
from lfx.components.processing.data_to_dataframe import DataToDataFrameComponent
|
17
|
+
from lfx.components.processing.dataframe_operations import DataFrameOperationsComponent
|
18
|
+
from lfx.components.processing.extract_key import ExtractDataKeyComponent
|
19
|
+
from lfx.components.processing.filter_data import FilterDataComponent
|
20
|
+
from lfx.components.processing.filter_data_values import DataFilterComponent
|
21
|
+
from lfx.components.processing.json_cleaner import JSONCleaner
|
22
|
+
from lfx.components.processing.lambda_filter import LambdaFilterComponent
|
23
|
+
from lfx.components.processing.llm_router import LLMRouterComponent
|
24
|
+
from lfx.components.processing.merge_data import MergeDataComponent
|
25
|
+
from lfx.components.processing.message_to_data import MessageToDataComponent
|
26
|
+
from lfx.components.processing.parse_data import ParseDataComponent
|
27
|
+
from lfx.components.processing.parse_dataframe import ParseDataFrameComponent
|
28
|
+
from lfx.components.processing.parse_json_data import ParseJSONDataComponent
|
29
|
+
from lfx.components.processing.parser import ParserComponent
|
30
|
+
from lfx.components.processing.prompt import PromptComponent
|
31
|
+
from lfx.components.processing.python_repl_core import PythonREPLComponent
|
32
|
+
from lfx.components.processing.regex import RegexExtractorComponent
|
33
|
+
from lfx.components.processing.save_file import SaveToFileComponent
|
34
|
+
from lfx.components.processing.select_data import SelectDataComponent
|
35
|
+
from lfx.components.processing.split_text import SplitTextComponent
|
36
|
+
from lfx.components.processing.structured_output import StructuredOutputComponent
|
37
|
+
from lfx.components.processing.update_data import UpdateDataComponent
|
38
|
+
|
39
|
+
_dynamic_imports = {
|
40
|
+
"AlterMetadataComponent": "alter_metadata",
|
41
|
+
"BatchRunComponent": "batch_run",
|
42
|
+
"CombineTextComponent": "combine_text",
|
43
|
+
"TypeConverterComponent": "converter",
|
44
|
+
"CreateDataComponent": "create_data",
|
45
|
+
"DataOperationsComponent": "data_operations",
|
46
|
+
"DataToDataFrameComponent": "data_to_dataframe",
|
47
|
+
"DataFrameOperationsComponent": "dataframe_operations",
|
48
|
+
"ExtractDataKeyComponent": "extract_key",
|
49
|
+
"FilterDataComponent": "filter_data",
|
50
|
+
"DataFilterComponent": "filter_data_values",
|
51
|
+
"JSONCleaner": "json_cleaner",
|
52
|
+
"LambdaFilterComponent": "lambda_filter",
|
53
|
+
"LLMRouterComponent": "llm_router",
|
54
|
+
"MergeDataComponent": "merge_data",
|
55
|
+
"MessageToDataComponent": "message_to_data",
|
56
|
+
"ParseDataComponent": "parse_data",
|
57
|
+
"ParseDataFrameComponent": "parse_dataframe",
|
58
|
+
"ParseJSONDataComponent": "parse_json_data",
|
59
|
+
"ParserComponent": "parser",
|
60
|
+
"PromptComponent": "prompt",
|
61
|
+
"PythonREPLComponent": "python_repl_core",
|
62
|
+
"RegexExtractorComponent": "regex",
|
63
|
+
"SaveToFileComponent": "save_file",
|
64
|
+
"SelectDataComponent": "select_data",
|
65
|
+
"SplitTextComponent": "split_text",
|
66
|
+
"StructuredOutputComponent": "structured_output",
|
67
|
+
"UpdateDataComponent": "update_data",
|
68
|
+
}
|
69
|
+
|
70
|
+
__all__ = [
|
71
|
+
"AlterMetadataComponent",
|
72
|
+
"BatchRunComponent",
|
73
|
+
"CombineTextComponent",
|
74
|
+
"CreateDataComponent",
|
75
|
+
"DataFilterComponent",
|
76
|
+
"DataFrameOperationsComponent",
|
77
|
+
"DataOperationsComponent",
|
78
|
+
"DataToDataFrameComponent",
|
79
|
+
"ExtractDataKeyComponent",
|
80
|
+
"FilterDataComponent",
|
81
|
+
"JSONCleaner",
|
82
|
+
"LLMRouterComponent",
|
83
|
+
"LambdaFilterComponent",
|
84
|
+
"MergeDataComponent",
|
85
|
+
"MessageToDataComponent",
|
86
|
+
"ParseDataComponent",
|
87
|
+
"ParseDataFrameComponent",
|
88
|
+
"ParseJSONDataComponent",
|
89
|
+
"ParserComponent",
|
90
|
+
"PromptComponent",
|
91
|
+
"PythonREPLComponent",
|
92
|
+
"RegexExtractorComponent",
|
93
|
+
"SaveToFileComponent",
|
94
|
+
"SelectDataComponent",
|
95
|
+
"SplitTextComponent",
|
96
|
+
"StructuredOutputComponent",
|
97
|
+
"TypeConverterComponent",
|
98
|
+
"UpdateDataComponent",
|
99
|
+
]
|
100
|
+
|
101
|
+
|
102
|
+
def __getattr__(attr_name: str) -> Any:
|
103
|
+
"""Lazily import processing components on attribute access."""
|
104
|
+
if attr_name not in _dynamic_imports:
|
105
|
+
msg = f"module '{__name__}' has no attribute '{attr_name}'"
|
106
|
+
raise AttributeError(msg)
|
107
|
+
try:
|
108
|
+
result = import_mod(attr_name, _dynamic_imports[attr_name], __spec__.parent)
|
109
|
+
except (ModuleNotFoundError, ImportError, AttributeError) as e:
|
110
|
+
msg = f"Could not import '{attr_name}' from '{__name__}': {e}"
|
111
|
+
raise AttributeError(msg) from e
|
112
|
+
globals()[attr_name] = result
|
113
|
+
return result
|
114
|
+
|
115
|
+
|
116
|
+
def __dir__() -> list[str]:
|
117
|
+
return list(__all__)
|
@@ -0,0 +1,108 @@
|
|
1
|
+
from lfx.custom.custom_component.component import Component
|
2
|
+
from lfx.inputs.inputs import MessageTextInput
|
3
|
+
from lfx.io import HandleInput, NestedDictInput, Output, StrInput
|
4
|
+
from lfx.schema.data import Data
|
5
|
+
from lfx.schema.dataframe import DataFrame
|
6
|
+
|
7
|
+
|
8
|
+
class AlterMetadataComponent(Component):
|
9
|
+
display_name = "Alter Metadata"
|
10
|
+
description = "Adds/Removes Metadata Dictionary on inputs"
|
11
|
+
icon = "merge"
|
12
|
+
name = "AlterMetadata"
|
13
|
+
legacy = True
|
14
|
+
|
15
|
+
inputs = [
|
16
|
+
HandleInput(
|
17
|
+
name="input_value",
|
18
|
+
display_name="Input",
|
19
|
+
info="Object(s) to which Metadata should be added",
|
20
|
+
required=False,
|
21
|
+
input_types=["Message", "Data"],
|
22
|
+
is_list=True,
|
23
|
+
),
|
24
|
+
StrInput(
|
25
|
+
name="text_in",
|
26
|
+
display_name="User Text",
|
27
|
+
info="Text input; value will be in 'text' attribute of Data object. Empty text entries are ignored.",
|
28
|
+
required=False,
|
29
|
+
),
|
30
|
+
NestedDictInput(
|
31
|
+
name="metadata",
|
32
|
+
display_name="Metadata",
|
33
|
+
info="Metadata to add to each object",
|
34
|
+
input_types=["Data"],
|
35
|
+
required=True,
|
36
|
+
),
|
37
|
+
MessageTextInput(
|
38
|
+
name="remove_fields",
|
39
|
+
display_name="Fields to Remove",
|
40
|
+
info="Metadata Fields to Remove",
|
41
|
+
required=False,
|
42
|
+
is_list=True,
|
43
|
+
),
|
44
|
+
]
|
45
|
+
|
46
|
+
outputs = [
|
47
|
+
Output(
|
48
|
+
name="data",
|
49
|
+
display_name="Data",
|
50
|
+
info="List of Input objects each with added Metadata",
|
51
|
+
method="process_output",
|
52
|
+
),
|
53
|
+
Output(
|
54
|
+
display_name="DataFrame",
|
55
|
+
name="dataframe",
|
56
|
+
info="Data objects as a DataFrame, with metadata as columns",
|
57
|
+
method="as_dataframe",
|
58
|
+
),
|
59
|
+
]
|
60
|
+
|
61
|
+
def _as_clean_dict(self, obj):
|
62
|
+
"""Convert a Data object or a standard dictionary to a standard dictionary."""
|
63
|
+
if isinstance(obj, dict):
|
64
|
+
as_dict = obj
|
65
|
+
elif isinstance(obj, Data):
|
66
|
+
as_dict = obj.data
|
67
|
+
else:
|
68
|
+
msg = f"Expected a Data object or a dictionary but got {type(obj)}."
|
69
|
+
raise TypeError(msg)
|
70
|
+
|
71
|
+
return {k: v for k, v in (as_dict or {}).items() if k and k.strip()}
|
72
|
+
|
73
|
+
def process_output(self) -> list[Data]:
|
74
|
+
# Ensure metadata is a dictionary, filtering out any empty keys
|
75
|
+
metadata = self._as_clean_dict(self.metadata)
|
76
|
+
|
77
|
+
# Convert text_in to a Data object if it exists, and initialize our list of Data objects
|
78
|
+
data_objects = [Data(text=self.text_in)] if self.text_in else []
|
79
|
+
|
80
|
+
# Append existing Data objects from input_value, if any
|
81
|
+
if self.input_value:
|
82
|
+
data_objects.extend(self.input_value)
|
83
|
+
|
84
|
+
# Update each Data object with the new metadata, preserving existing fields
|
85
|
+
for data in data_objects:
|
86
|
+
data.data.update(metadata)
|
87
|
+
|
88
|
+
# Handle removal of fields specified in remove_fields
|
89
|
+
if self.remove_fields:
|
90
|
+
fields_to_remove = {field.strip() for field in self.remove_fields if field.strip()}
|
91
|
+
|
92
|
+
# Remove specified fields from each Data object's metadata
|
93
|
+
for data in data_objects:
|
94
|
+
data.data = {k: v for k, v in data.data.items() if k not in fields_to_remove}
|
95
|
+
|
96
|
+
# Set the status for tracking/debugging purposes
|
97
|
+
self.status = data_objects
|
98
|
+
return data_objects
|
99
|
+
|
100
|
+
def as_dataframe(self) -> DataFrame:
|
101
|
+
"""Convert the processed data objects into a DataFrame.
|
102
|
+
|
103
|
+
Returns:
|
104
|
+
DataFrame: A DataFrame where each row corresponds to a Data object,
|
105
|
+
with metadata fields as columns.
|
106
|
+
"""
|
107
|
+
data_list = self.process_output()
|
108
|
+
return DataFrame(data_list)
|
@@ -0,0 +1,205 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
from typing import TYPE_CHECKING, Any, cast
|
4
|
+
|
5
|
+
import toml # type: ignore[import-untyped]
|
6
|
+
|
7
|
+
from lfx.custom.custom_component.component import Component
|
8
|
+
from lfx.io import BoolInput, DataFrameInput, HandleInput, MessageTextInput, MultilineInput, Output
|
9
|
+
from lfx.log.logger import logger
|
10
|
+
from lfx.schema.dataframe import DataFrame
|
11
|
+
|
12
|
+
if TYPE_CHECKING:
|
13
|
+
from langchain_core.runnables import Runnable
|
14
|
+
|
15
|
+
|
16
|
+
class BatchRunComponent(Component):
|
17
|
+
display_name = "Batch Run"
|
18
|
+
description = "Runs an LLM on each row of a DataFrame column. If no column is specified, all columns are used."
|
19
|
+
documentation: str = "https://docs.langflow.org/components-processing#batch-run"
|
20
|
+
icon = "List"
|
21
|
+
|
22
|
+
inputs = [
|
23
|
+
HandleInput(
|
24
|
+
name="model",
|
25
|
+
display_name="Language Model",
|
26
|
+
info="Connect the 'Language Model' output from your LLM component here.",
|
27
|
+
input_types=["LanguageModel"],
|
28
|
+
required=True,
|
29
|
+
),
|
30
|
+
MultilineInput(
|
31
|
+
name="system_message",
|
32
|
+
display_name="Instructions",
|
33
|
+
info="Multi-line system instruction for all rows in the DataFrame.",
|
34
|
+
required=False,
|
35
|
+
),
|
36
|
+
DataFrameInput(
|
37
|
+
name="df",
|
38
|
+
display_name="DataFrame",
|
39
|
+
info="The DataFrame whose column (specified by 'column_name') we'll treat as text messages.",
|
40
|
+
required=True,
|
41
|
+
),
|
42
|
+
MessageTextInput(
|
43
|
+
name="column_name",
|
44
|
+
display_name="Column Name",
|
45
|
+
info=(
|
46
|
+
"The name of the DataFrame column to treat as text messages. "
|
47
|
+
"If empty, all columns will be formatted in TOML."
|
48
|
+
),
|
49
|
+
required=False,
|
50
|
+
advanced=False,
|
51
|
+
),
|
52
|
+
MessageTextInput(
|
53
|
+
name="output_column_name",
|
54
|
+
display_name="Output Column Name",
|
55
|
+
info="Name of the column where the model's response will be stored.",
|
56
|
+
value="model_response",
|
57
|
+
required=False,
|
58
|
+
advanced=True,
|
59
|
+
),
|
60
|
+
BoolInput(
|
61
|
+
name="enable_metadata",
|
62
|
+
display_name="Enable Metadata",
|
63
|
+
info="If True, add metadata to the output DataFrame.",
|
64
|
+
value=False,
|
65
|
+
required=False,
|
66
|
+
advanced=True,
|
67
|
+
),
|
68
|
+
]
|
69
|
+
|
70
|
+
outputs = [
|
71
|
+
Output(
|
72
|
+
display_name="LLM Results",
|
73
|
+
name="batch_results",
|
74
|
+
method="run_batch",
|
75
|
+
info="A DataFrame with all original columns plus the model's response column.",
|
76
|
+
),
|
77
|
+
]
|
78
|
+
|
79
|
+
def _format_row_as_toml(self, row: dict[str, Any]) -> str:
|
80
|
+
"""Convert a dictionary (row) into a TOML-formatted string."""
|
81
|
+
formatted_dict = {str(col): {"value": str(val)} for col, val in row.items()}
|
82
|
+
return toml.dumps(formatted_dict)
|
83
|
+
|
84
|
+
def _create_base_row(
|
85
|
+
self, original_row: dict[str, Any], model_response: str = "", batch_index: int = -1
|
86
|
+
) -> dict[str, Any]:
|
87
|
+
"""Create a base row with original columns and additional metadata."""
|
88
|
+
row = original_row.copy()
|
89
|
+
row[self.output_column_name] = model_response
|
90
|
+
row["batch_index"] = batch_index
|
91
|
+
return row
|
92
|
+
|
93
|
+
def _add_metadata(
|
94
|
+
self, row: dict[str, Any], *, success: bool = True, system_msg: str = "", error: str | None = None
|
95
|
+
) -> None:
|
96
|
+
"""Add metadata to a row if enabled."""
|
97
|
+
if not self.enable_metadata:
|
98
|
+
return
|
99
|
+
|
100
|
+
if success:
|
101
|
+
row["metadata"] = {
|
102
|
+
"has_system_message": bool(system_msg),
|
103
|
+
"input_length": len(row.get("text_input", "")),
|
104
|
+
"response_length": len(row[self.output_column_name]),
|
105
|
+
"processing_status": "success",
|
106
|
+
}
|
107
|
+
else:
|
108
|
+
row["metadata"] = {
|
109
|
+
"error": error,
|
110
|
+
"processing_status": "failed",
|
111
|
+
}
|
112
|
+
|
113
|
+
async def run_batch(self) -> DataFrame:
|
114
|
+
"""Process each row in df[column_name] with the language model asynchronously.
|
115
|
+
|
116
|
+
Returns:
|
117
|
+
DataFrame: A new DataFrame containing:
|
118
|
+
- All original columns
|
119
|
+
- The model's response column (customizable name)
|
120
|
+
- 'batch_index' column for processing order
|
121
|
+
- 'metadata' (optional)
|
122
|
+
|
123
|
+
Raises:
|
124
|
+
ValueError: If the specified column is not found in the DataFrame
|
125
|
+
TypeError: If the model is not compatible or input types are wrong
|
126
|
+
"""
|
127
|
+
model: Runnable = self.model
|
128
|
+
system_msg = self.system_message or ""
|
129
|
+
df: DataFrame = self.df
|
130
|
+
col_name = self.column_name or ""
|
131
|
+
|
132
|
+
# Validate inputs first
|
133
|
+
if not isinstance(df, DataFrame):
|
134
|
+
msg = f"Expected DataFrame input, got {type(df)}"
|
135
|
+
raise TypeError(msg)
|
136
|
+
|
137
|
+
if col_name and col_name not in df.columns:
|
138
|
+
msg = f"Column '{col_name}' not found in the DataFrame. Available columns: {', '.join(df.columns)}"
|
139
|
+
raise ValueError(msg)
|
140
|
+
|
141
|
+
try:
|
142
|
+
# Determine text input for each row
|
143
|
+
if col_name:
|
144
|
+
user_texts = df[col_name].astype(str).tolist()
|
145
|
+
else:
|
146
|
+
user_texts = [
|
147
|
+
self._format_row_as_toml(cast("dict[str, Any]", row)) for row in df.to_dict(orient="records")
|
148
|
+
]
|
149
|
+
|
150
|
+
total_rows = len(user_texts)
|
151
|
+
await logger.ainfo(f"Processing {total_rows} rows with batch run")
|
152
|
+
|
153
|
+
# Prepare the batch of conversations
|
154
|
+
conversations = [
|
155
|
+
[{"role": "system", "content": system_msg}, {"role": "user", "content": text}]
|
156
|
+
if system_msg
|
157
|
+
else [{"role": "user", "content": text}]
|
158
|
+
for text in user_texts
|
159
|
+
]
|
160
|
+
|
161
|
+
# Configure the model with project info and callbacks
|
162
|
+
model = model.with_config(
|
163
|
+
{
|
164
|
+
"run_name": self.display_name,
|
165
|
+
"project_name": self.get_project_name(),
|
166
|
+
"callbacks": self.get_langchain_callbacks(),
|
167
|
+
}
|
168
|
+
)
|
169
|
+
# Process batches and track progress
|
170
|
+
responses_with_idx = list(
|
171
|
+
zip(
|
172
|
+
range(len(conversations)),
|
173
|
+
await model.abatch(list(conversations)),
|
174
|
+
strict=True,
|
175
|
+
)
|
176
|
+
)
|
177
|
+
|
178
|
+
# Sort by index to maintain order
|
179
|
+
responses_with_idx.sort(key=lambda x: x[0])
|
180
|
+
|
181
|
+
# Build the final data with enhanced metadata
|
182
|
+
rows: list[dict[str, Any]] = []
|
183
|
+
for idx, (original_row, response) in enumerate(
|
184
|
+
zip(df.to_dict(orient="records"), responses_with_idx, strict=False)
|
185
|
+
):
|
186
|
+
response_text = response[1].content if hasattr(response[1], "content") else str(response[1])
|
187
|
+
row = self._create_base_row(
|
188
|
+
cast("dict[str, Any]", original_row), model_response=response_text, batch_index=idx
|
189
|
+
)
|
190
|
+
self._add_metadata(row, success=True, system_msg=system_msg)
|
191
|
+
rows.append(row)
|
192
|
+
|
193
|
+
# Log progress
|
194
|
+
if (idx + 1) % max(1, total_rows // 10) == 0:
|
195
|
+
await logger.ainfo(f"Processed {idx + 1}/{total_rows} rows")
|
196
|
+
|
197
|
+
await logger.ainfo("Batch processing completed successfully")
|
198
|
+
return DataFrame(rows)
|
199
|
+
|
200
|
+
except (KeyError, AttributeError) as e:
|
201
|
+
# Handle data structure and attribute access errors
|
202
|
+
await logger.aerror(f"Data processing error: {e!s}")
|
203
|
+
error_row = self._create_base_row(dict.fromkeys(df.columns, ""), model_response="", batch_index=-1)
|
204
|
+
self._add_metadata(error_row, success=False, error=str(e))
|
205
|
+
return DataFrame([error_row])
|
@@ -0,0 +1,39 @@
|
|
1
|
+
from lfx.custom.custom_component.component import Component
|
2
|
+
from lfx.io import MessageTextInput, Output
|
3
|
+
from lfx.schema.message import Message
|
4
|
+
|
5
|
+
|
6
|
+
class CombineTextComponent(Component):
|
7
|
+
display_name = "Combine Text"
|
8
|
+
description = "Concatenate two text sources into a single text chunk using a specified delimiter."
|
9
|
+
icon = "merge"
|
10
|
+
name = "CombineText"
|
11
|
+
legacy: bool = True
|
12
|
+
|
13
|
+
inputs = [
|
14
|
+
MessageTextInput(
|
15
|
+
name="text1",
|
16
|
+
display_name="First Text",
|
17
|
+
info="The first text input to concatenate.",
|
18
|
+
),
|
19
|
+
MessageTextInput(
|
20
|
+
name="text2",
|
21
|
+
display_name="Second Text",
|
22
|
+
info="The second text input to concatenate.",
|
23
|
+
),
|
24
|
+
MessageTextInput(
|
25
|
+
name="delimiter",
|
26
|
+
display_name="Delimiter",
|
27
|
+
info="A string used to separate the two text inputs. Defaults to a whitespace.",
|
28
|
+
value=" ",
|
29
|
+
),
|
30
|
+
]
|
31
|
+
|
32
|
+
outputs = [
|
33
|
+
Output(display_name="Combined Text", name="combined_text", method="combine_texts"),
|
34
|
+
]
|
35
|
+
|
36
|
+
def combine_texts(self) -> Message:
|
37
|
+
combined = self.delimiter.join([self.text1, self.text2])
|
38
|
+
self.status = combined
|
39
|
+
return Message(text=combined)
|