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,202 @@
|
|
1
|
+
from pydantic import BaseModel, Field, create_model
|
2
|
+
from trustcall import create_extractor
|
3
|
+
|
4
|
+
from lfx.base.models.chat_result import get_chat_result
|
5
|
+
from lfx.custom.custom_component.component import Component
|
6
|
+
from lfx.helpers.base_model import build_model_from_schema
|
7
|
+
from lfx.io import (
|
8
|
+
HandleInput,
|
9
|
+
MessageTextInput,
|
10
|
+
MultilineInput,
|
11
|
+
Output,
|
12
|
+
TableInput,
|
13
|
+
)
|
14
|
+
from lfx.schema.data import Data
|
15
|
+
from lfx.schema.dataframe import DataFrame
|
16
|
+
from lfx.schema.table import EditMode
|
17
|
+
|
18
|
+
|
19
|
+
class StructuredOutputComponent(Component):
|
20
|
+
display_name = "Structured Output"
|
21
|
+
description = "Uses an LLM to generate structured data. Ideal for extraction and consistency."
|
22
|
+
documentation: str = "https://docs.langflow.org/components-processing#structured-output"
|
23
|
+
name = "StructuredOutput"
|
24
|
+
icon = "braces"
|
25
|
+
|
26
|
+
inputs = [
|
27
|
+
HandleInput(
|
28
|
+
name="llm",
|
29
|
+
display_name="Language Model",
|
30
|
+
info="The language model to use to generate the structured output.",
|
31
|
+
input_types=["LanguageModel"],
|
32
|
+
required=True,
|
33
|
+
),
|
34
|
+
MultilineInput(
|
35
|
+
name="input_value",
|
36
|
+
display_name="Input Message",
|
37
|
+
info="The input message to the language model.",
|
38
|
+
tool_mode=True,
|
39
|
+
required=True,
|
40
|
+
),
|
41
|
+
MultilineInput(
|
42
|
+
name="system_prompt",
|
43
|
+
display_name="Format Instructions",
|
44
|
+
info="The instructions to the language model for formatting the output.",
|
45
|
+
value=(
|
46
|
+
"You are an AI that extracts structured JSON objects from unstructured text. "
|
47
|
+
"Use a predefined schema with expected types (str, int, float, bool, dict). "
|
48
|
+
"Extract ALL relevant instances that match the schema - if multiple patterns exist, capture them all. "
|
49
|
+
"Fill missing or ambiguous values with defaults: null for missing values. "
|
50
|
+
"Remove exact duplicates but keep variations that have different field values. "
|
51
|
+
"Always return valid JSON in the expected format, never throw errors. "
|
52
|
+
"If multiple objects can be extracted, return them all in the structured format."
|
53
|
+
),
|
54
|
+
required=True,
|
55
|
+
advanced=True,
|
56
|
+
),
|
57
|
+
MessageTextInput(
|
58
|
+
name="schema_name",
|
59
|
+
display_name="Schema Name",
|
60
|
+
info="Provide a name for the output data schema.",
|
61
|
+
advanced=True,
|
62
|
+
),
|
63
|
+
TableInput(
|
64
|
+
name="output_schema",
|
65
|
+
display_name="Output Schema",
|
66
|
+
info="Define the structure and data types for the model's output.",
|
67
|
+
required=True,
|
68
|
+
# TODO: remove deault value
|
69
|
+
table_schema=[
|
70
|
+
{
|
71
|
+
"name": "name",
|
72
|
+
"display_name": "Name",
|
73
|
+
"type": "str",
|
74
|
+
"description": "Specify the name of the output field.",
|
75
|
+
"default": "field",
|
76
|
+
"edit_mode": EditMode.INLINE,
|
77
|
+
},
|
78
|
+
{
|
79
|
+
"name": "description",
|
80
|
+
"display_name": "Description",
|
81
|
+
"type": "str",
|
82
|
+
"description": "Describe the purpose of the output field.",
|
83
|
+
"default": "description of field",
|
84
|
+
"edit_mode": EditMode.POPOVER,
|
85
|
+
},
|
86
|
+
{
|
87
|
+
"name": "type",
|
88
|
+
"display_name": "Type",
|
89
|
+
"type": "str",
|
90
|
+
"edit_mode": EditMode.INLINE,
|
91
|
+
"description": ("Indicate the data type of the output field (e.g., str, int, float, bool, dict)."),
|
92
|
+
"options": ["str", "int", "float", "bool", "dict"],
|
93
|
+
"default": "str",
|
94
|
+
},
|
95
|
+
{
|
96
|
+
"name": "multiple",
|
97
|
+
"display_name": "As List",
|
98
|
+
"type": "boolean",
|
99
|
+
"description": "Set to True if this output field should be a list of the specified type.",
|
100
|
+
"default": "False",
|
101
|
+
"edit_mode": EditMode.INLINE,
|
102
|
+
},
|
103
|
+
],
|
104
|
+
value=[
|
105
|
+
{
|
106
|
+
"name": "field",
|
107
|
+
"description": "description of field",
|
108
|
+
"type": "str",
|
109
|
+
"multiple": "False",
|
110
|
+
}
|
111
|
+
],
|
112
|
+
),
|
113
|
+
]
|
114
|
+
|
115
|
+
outputs = [
|
116
|
+
Output(
|
117
|
+
name="structured_output",
|
118
|
+
display_name="Structured Output",
|
119
|
+
method="build_structured_output",
|
120
|
+
),
|
121
|
+
Output(
|
122
|
+
name="dataframe_output",
|
123
|
+
display_name="Structured Output",
|
124
|
+
method="build_structured_dataframe",
|
125
|
+
),
|
126
|
+
]
|
127
|
+
|
128
|
+
def build_structured_output_base(self):
|
129
|
+
schema_name = self.schema_name or "OutputModel"
|
130
|
+
|
131
|
+
if not hasattr(self.llm, "with_structured_output"):
|
132
|
+
msg = "Language model does not support structured output."
|
133
|
+
raise TypeError(msg)
|
134
|
+
if not self.output_schema:
|
135
|
+
msg = "Output schema cannot be empty"
|
136
|
+
raise ValueError(msg)
|
137
|
+
|
138
|
+
output_model_ = build_model_from_schema(self.output_schema)
|
139
|
+
|
140
|
+
output_model = create_model(
|
141
|
+
schema_name,
|
142
|
+
__doc__=f"A list of {schema_name}.",
|
143
|
+
objects=(list[output_model_], Field(description=f"A list of {schema_name}.")), # type: ignore[valid-type]
|
144
|
+
)
|
145
|
+
|
146
|
+
try:
|
147
|
+
llm_with_structured_output = create_extractor(self.llm, tools=[output_model])
|
148
|
+
except NotImplementedError as exc:
|
149
|
+
msg = f"{self.llm.__class__.__name__} does not support structured output."
|
150
|
+
raise TypeError(msg) from exc
|
151
|
+
|
152
|
+
config_dict = {
|
153
|
+
"run_name": self.display_name,
|
154
|
+
"project_name": self.get_project_name(),
|
155
|
+
"callbacks": self.get_langchain_callbacks(),
|
156
|
+
}
|
157
|
+
result = get_chat_result(
|
158
|
+
runnable=llm_with_structured_output,
|
159
|
+
system_message=self.system_prompt,
|
160
|
+
input_value=self.input_value,
|
161
|
+
config=config_dict,
|
162
|
+
)
|
163
|
+
|
164
|
+
# OPTIMIZATION NOTE: Simplified processing based on trustcall response structure
|
165
|
+
# Handle non-dict responses (shouldn't happen with trustcall, but defensive)
|
166
|
+
if not isinstance(result, dict):
|
167
|
+
return result
|
168
|
+
|
169
|
+
# Extract first response and convert BaseModel to dict
|
170
|
+
responses = result.get("responses", [])
|
171
|
+
if not responses:
|
172
|
+
return result
|
173
|
+
|
174
|
+
# Convert BaseModel to dict (creates the "objects" key)
|
175
|
+
first_response = responses[0]
|
176
|
+
structured_data = first_response.model_dump() if isinstance(first_response, BaseModel) else first_response
|
177
|
+
|
178
|
+
# Extract the objects array (guaranteed to exist due to our Pydantic model structure)
|
179
|
+
return structured_data.get("objects", structured_data)
|
180
|
+
|
181
|
+
def build_structured_output(self) -> Data:
|
182
|
+
output = self.build_structured_output_base()
|
183
|
+
if not isinstance(output, list) or not output:
|
184
|
+
# handle empty or unexpected type case
|
185
|
+
msg = "No structured output returned"
|
186
|
+
raise ValueError(msg)
|
187
|
+
if len(output) == 1:
|
188
|
+
return Data(data=output[0])
|
189
|
+
if len(output) > 1:
|
190
|
+
# Multiple outputs - wrap them in a results container
|
191
|
+
return Data(data={"results": output})
|
192
|
+
return Data()
|
193
|
+
|
194
|
+
def build_structured_dataframe(self) -> DataFrame:
|
195
|
+
output = self.build_structured_output_base()
|
196
|
+
if not isinstance(output, list) or not output:
|
197
|
+
# handle empty or unexpected type case
|
198
|
+
msg = "No structured output returned"
|
199
|
+
raise ValueError(msg)
|
200
|
+
data_list = [Data(data=output[0])] if len(output) == 1 else [Data(data=item) for item in output]
|
201
|
+
|
202
|
+
return DataFrame(data_list)
|
@@ -0,0 +1,160 @@
|
|
1
|
+
from typing import Any
|
2
|
+
|
3
|
+
from lfx.custom.custom_component.component import Component
|
4
|
+
from lfx.field_typing.range_spec import RangeSpec
|
5
|
+
from lfx.inputs.inputs import (
|
6
|
+
BoolInput,
|
7
|
+
DataInput,
|
8
|
+
DictInput,
|
9
|
+
IntInput,
|
10
|
+
MessageTextInput,
|
11
|
+
)
|
12
|
+
from lfx.io import Output
|
13
|
+
from lfx.schema.data import Data
|
14
|
+
from lfx.schema.dotdict import dotdict
|
15
|
+
|
16
|
+
|
17
|
+
class UpdateDataComponent(Component):
|
18
|
+
display_name: str = "Update Data"
|
19
|
+
description: str = "Dynamically update or append data with the specified fields."
|
20
|
+
name: str = "UpdateData"
|
21
|
+
MAX_FIELDS = 15 # Define a constant for maximum number of fields
|
22
|
+
icon = "FolderSync"
|
23
|
+
legacy = True
|
24
|
+
|
25
|
+
inputs = [
|
26
|
+
DataInput(
|
27
|
+
name="old_data",
|
28
|
+
display_name="Data",
|
29
|
+
info="The record to update.",
|
30
|
+
is_list=True, # Changed to True to handle list of Data objects
|
31
|
+
required=True,
|
32
|
+
),
|
33
|
+
IntInput(
|
34
|
+
name="number_of_fields",
|
35
|
+
display_name="Number of Fields",
|
36
|
+
info="Number of fields to be added to the record.",
|
37
|
+
real_time_refresh=True,
|
38
|
+
value=0,
|
39
|
+
range_spec=RangeSpec(min=1, max=MAX_FIELDS, step=1, step_type="int"),
|
40
|
+
),
|
41
|
+
MessageTextInput(
|
42
|
+
name="text_key",
|
43
|
+
display_name="Text Key",
|
44
|
+
info="Key that identifies the field to be used as the text content.",
|
45
|
+
advanced=True,
|
46
|
+
),
|
47
|
+
BoolInput(
|
48
|
+
name="text_key_validator",
|
49
|
+
display_name="Text Key Validator",
|
50
|
+
advanced=True,
|
51
|
+
info="If enabled, checks if the given 'Text Key' is present in the given 'Data'.",
|
52
|
+
),
|
53
|
+
]
|
54
|
+
|
55
|
+
outputs = [
|
56
|
+
Output(display_name="Data", name="data", method="build_data"),
|
57
|
+
]
|
58
|
+
|
59
|
+
def update_build_config(self, build_config: dotdict, field_value: Any, field_name: str | None = None):
|
60
|
+
"""Update the build configuration when the number of fields changes.
|
61
|
+
|
62
|
+
Args:
|
63
|
+
build_config (dotdict): The current build configuration.
|
64
|
+
field_value (Any): The new value for the field.
|
65
|
+
field_name (Optional[str]): The name of the field being updated.
|
66
|
+
"""
|
67
|
+
if field_name == "number_of_fields":
|
68
|
+
default_keys = {
|
69
|
+
"code",
|
70
|
+
"_type",
|
71
|
+
"number_of_fields",
|
72
|
+
"text_key",
|
73
|
+
"old_data",
|
74
|
+
"text_key_validator",
|
75
|
+
}
|
76
|
+
try:
|
77
|
+
field_value_int = int(field_value)
|
78
|
+
except ValueError:
|
79
|
+
return build_config
|
80
|
+
|
81
|
+
if field_value_int > self.MAX_FIELDS:
|
82
|
+
build_config["number_of_fields"]["value"] = self.MAX_FIELDS
|
83
|
+
msg = f"Number of fields cannot exceed {self.MAX_FIELDS}. Try using a Component to combine two Data."
|
84
|
+
raise ValueError(msg)
|
85
|
+
|
86
|
+
existing_fields = {}
|
87
|
+
# Back up the existing template fields
|
88
|
+
for key in list(build_config.keys()):
|
89
|
+
if key not in default_keys:
|
90
|
+
existing_fields[key] = build_config.pop(key)
|
91
|
+
|
92
|
+
for i in range(1, field_value_int + 1):
|
93
|
+
key = f"field_{i}_key"
|
94
|
+
if key in existing_fields:
|
95
|
+
field = existing_fields[key]
|
96
|
+
build_config[key] = field
|
97
|
+
else:
|
98
|
+
field = DictInput(
|
99
|
+
display_name=f"Field {i}",
|
100
|
+
name=key,
|
101
|
+
info=f"Key for field {i}.",
|
102
|
+
input_types=["Message", "Data"],
|
103
|
+
)
|
104
|
+
build_config[field.name] = field.to_dict()
|
105
|
+
|
106
|
+
build_config["number_of_fields"]["value"] = field_value_int
|
107
|
+
return build_config
|
108
|
+
|
109
|
+
async def build_data(self) -> Data | list[Data]:
|
110
|
+
"""Build the updated data by combining the old data with new fields."""
|
111
|
+
new_data = self.get_data()
|
112
|
+
if isinstance(self.old_data, list):
|
113
|
+
for data_item in self.old_data:
|
114
|
+
if not isinstance(data_item, Data):
|
115
|
+
continue # Skip invalid items
|
116
|
+
data_item.data.update(new_data)
|
117
|
+
if self.text_key:
|
118
|
+
data_item.text_key = self.text_key
|
119
|
+
self.validate_text_key(data_item)
|
120
|
+
self.status = self.old_data
|
121
|
+
return self.old_data # Returns List[Data]
|
122
|
+
if isinstance(self.old_data, Data):
|
123
|
+
self.old_data.data.update(new_data)
|
124
|
+
if self.text_key:
|
125
|
+
self.old_data.text_key = self.text_key
|
126
|
+
self.status = self.old_data
|
127
|
+
self.validate_text_key(self.old_data)
|
128
|
+
return self.old_data # Returns Data
|
129
|
+
msg = "old_data is not a Data object or list of Data objects."
|
130
|
+
raise ValueError(msg)
|
131
|
+
|
132
|
+
def get_data(self):
|
133
|
+
"""Function to get the Data from the attributes."""
|
134
|
+
data = {}
|
135
|
+
default_keys = {
|
136
|
+
"code",
|
137
|
+
"_type",
|
138
|
+
"number_of_fields",
|
139
|
+
"text_key",
|
140
|
+
"old_data",
|
141
|
+
"text_key_validator",
|
142
|
+
}
|
143
|
+
for attr_name, attr_value in self._attributes.items():
|
144
|
+
if attr_name in default_keys:
|
145
|
+
continue # Skip default attributes
|
146
|
+
if isinstance(attr_value, dict):
|
147
|
+
for key, value in attr_value.items():
|
148
|
+
data[key] = value.get_text() if isinstance(value, Data) else value
|
149
|
+
elif isinstance(attr_value, Data):
|
150
|
+
data[attr_name] = attr_value.get_text()
|
151
|
+
else:
|
152
|
+
data[attr_name] = attr_value
|
153
|
+
return data
|
154
|
+
|
155
|
+
def validate_text_key(self, data: Data) -> None:
|
156
|
+
"""This function validates that the Text Key is one of the keys in the Data."""
|
157
|
+
data_keys = data.data.keys()
|
158
|
+
if self.text_key and self.text_key not in data_keys:
|
159
|
+
msg = f"Text Key: '{self.text_key}' not found in the Data keys: {', '.join(data_keys)}"
|
160
|
+
raise ValueError(msg)
|
@@ -0,0 +1,34 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
from typing import TYPE_CHECKING, Any
|
4
|
+
|
5
|
+
from lfx.components._importing import import_mod
|
6
|
+
|
7
|
+
if TYPE_CHECKING:
|
8
|
+
from .python_function import PythonFunctionComponent
|
9
|
+
|
10
|
+
_dynamic_imports = {
|
11
|
+
"PythonFunctionComponent": "python_function",
|
12
|
+
}
|
13
|
+
|
14
|
+
__all__ = [
|
15
|
+
"PythonFunctionComponent",
|
16
|
+
]
|
17
|
+
|
18
|
+
|
19
|
+
def __getattr__(attr_name: str) -> Any:
|
20
|
+
"""Lazily import prototype components on attribute access."""
|
21
|
+
if attr_name not in _dynamic_imports:
|
22
|
+
msg = f"module '{__name__}' has no attribute '{attr_name}'"
|
23
|
+
raise AttributeError(msg)
|
24
|
+
try:
|
25
|
+
result = import_mod(attr_name, _dynamic_imports[attr_name], __spec__.parent)
|
26
|
+
except (ModuleNotFoundError, ImportError, AttributeError) as e:
|
27
|
+
msg = f"Could not import '{attr_name}' from '{__name__}': {e}"
|
28
|
+
raise AttributeError(msg) from e
|
29
|
+
globals()[attr_name] = result
|
30
|
+
return result
|
31
|
+
|
32
|
+
|
33
|
+
def __dir__() -> list[str]:
|
34
|
+
return list(__all__)
|
@@ -0,0 +1,73 @@
|
|
1
|
+
from collections.abc import Callable
|
2
|
+
|
3
|
+
from lfx.custom.custom_component.component import Component
|
4
|
+
from lfx.custom.utils import get_function
|
5
|
+
from lfx.io import CodeInput, Output
|
6
|
+
from lfx.log.logger import logger
|
7
|
+
from lfx.schema.data import Data
|
8
|
+
from lfx.schema.dotdict import dotdict
|
9
|
+
from lfx.schema.message import Message
|
10
|
+
|
11
|
+
|
12
|
+
class PythonFunctionComponent(Component):
|
13
|
+
display_name = "Python Function"
|
14
|
+
description = "Define and execute a Python function that returns a Data object or a Message."
|
15
|
+
icon = "Python"
|
16
|
+
name = "PythonFunction"
|
17
|
+
legacy = True
|
18
|
+
|
19
|
+
inputs = [
|
20
|
+
CodeInput(
|
21
|
+
name="function_code",
|
22
|
+
display_name="Function Code",
|
23
|
+
info="The code for the function.",
|
24
|
+
),
|
25
|
+
]
|
26
|
+
|
27
|
+
outputs = [
|
28
|
+
Output(
|
29
|
+
name="function_output",
|
30
|
+
display_name="Function Callable",
|
31
|
+
method="get_function_callable",
|
32
|
+
),
|
33
|
+
Output(
|
34
|
+
name="function_output_data",
|
35
|
+
display_name="Function Output (Data)",
|
36
|
+
method="execute_function_data",
|
37
|
+
),
|
38
|
+
Output(
|
39
|
+
name="function_output_str",
|
40
|
+
display_name="Function Output (Message)",
|
41
|
+
method="execute_function_message",
|
42
|
+
),
|
43
|
+
]
|
44
|
+
|
45
|
+
def get_function_callable(self) -> Callable:
|
46
|
+
function_code = self.function_code
|
47
|
+
self.status = function_code
|
48
|
+
return get_function(function_code)
|
49
|
+
|
50
|
+
def execute_function(self) -> list[dotdict | str] | dotdict | str:
|
51
|
+
function_code = self.function_code
|
52
|
+
|
53
|
+
if not function_code:
|
54
|
+
return "No function code provided."
|
55
|
+
|
56
|
+
try:
|
57
|
+
func = get_function(function_code)
|
58
|
+
return func()
|
59
|
+
except Exception as e: # noqa: BLE001
|
60
|
+
logger.debug("Error executing function", exc_info=True)
|
61
|
+
return f"Error executing function: {e}"
|
62
|
+
|
63
|
+
def execute_function_data(self) -> list[Data]:
|
64
|
+
results = self.execute_function()
|
65
|
+
results = results if isinstance(results, list) else [results]
|
66
|
+
return [(Data(text=x) if isinstance(x, str) else Data(**x)) for x in results]
|
67
|
+
|
68
|
+
def execute_function_message(self) -> Message:
|
69
|
+
results = self.execute_function()
|
70
|
+
results = results if isinstance(results, list) else [results]
|
71
|
+
results_list = [str(x) for x in results]
|
72
|
+
results_str = "\n".join(results_list)
|
73
|
+
return Message(text=results_str)
|
@@ -0,0 +1,34 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
from typing import TYPE_CHECKING, Any
|
4
|
+
|
5
|
+
from lfx.components._importing import import_mod
|
6
|
+
|
7
|
+
if TYPE_CHECKING:
|
8
|
+
from .qdrant import QdrantVectorStoreComponent
|
9
|
+
|
10
|
+
_dynamic_imports = {
|
11
|
+
"QdrantVectorStoreComponent": "qdrant",
|
12
|
+
}
|
13
|
+
|
14
|
+
__all__ = [
|
15
|
+
"QdrantVectorStoreComponent",
|
16
|
+
]
|
17
|
+
|
18
|
+
|
19
|
+
def __getattr__(attr_name: str) -> Any:
|
20
|
+
"""Lazily import Qdrant components on attribute access."""
|
21
|
+
if attr_name not in _dynamic_imports:
|
22
|
+
msg = f"module '{__name__}' has no attribute '{attr_name}'"
|
23
|
+
raise AttributeError(msg)
|
24
|
+
try:
|
25
|
+
result = import_mod(attr_name, _dynamic_imports[attr_name], __spec__.parent)
|
26
|
+
except (ModuleNotFoundError, ImportError, AttributeError) as e:
|
27
|
+
msg = f"Could not import '{attr_name}' from '{__name__}': {e}"
|
28
|
+
raise AttributeError(msg) from e
|
29
|
+
globals()[attr_name] = result
|
30
|
+
return result
|
31
|
+
|
32
|
+
|
33
|
+
def __dir__() -> list[str]:
|
34
|
+
return list(__all__)
|
@@ -0,0 +1,109 @@
|
|
1
|
+
from langchain.embeddings.base import Embeddings
|
2
|
+
from langchain_community.vectorstores import Qdrant
|
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 (
|
7
|
+
DropdownInput,
|
8
|
+
HandleInput,
|
9
|
+
IntInput,
|
10
|
+
SecretStrInput,
|
11
|
+
StrInput,
|
12
|
+
)
|
13
|
+
from lfx.schema.data import Data
|
14
|
+
|
15
|
+
|
16
|
+
class QdrantVectorStoreComponent(LCVectorStoreComponent):
|
17
|
+
display_name = "Qdrant"
|
18
|
+
description = "Qdrant Vector Store with search capabilities"
|
19
|
+
icon = "Qdrant"
|
20
|
+
|
21
|
+
inputs = [
|
22
|
+
StrInput(name="collection_name", display_name="Collection Name", required=True),
|
23
|
+
StrInput(name="host", display_name="Host", value="localhost", advanced=True),
|
24
|
+
IntInput(name="port", display_name="Port", value=6333, advanced=True),
|
25
|
+
IntInput(name="grpc_port", display_name="gRPC Port", value=6334, advanced=True),
|
26
|
+
SecretStrInput(name="api_key", display_name="API Key", advanced=True),
|
27
|
+
StrInput(name="prefix", display_name="Prefix", advanced=True),
|
28
|
+
IntInput(name="timeout", display_name="Timeout", advanced=True),
|
29
|
+
StrInput(name="path", display_name="Path", advanced=True),
|
30
|
+
StrInput(name="url", display_name="URL", advanced=True),
|
31
|
+
DropdownInput(
|
32
|
+
name="distance_func",
|
33
|
+
display_name="Distance Function",
|
34
|
+
options=["Cosine", "Euclidean", "Dot Product"],
|
35
|
+
value="Cosine",
|
36
|
+
advanced=True,
|
37
|
+
),
|
38
|
+
StrInput(name="content_payload_key", display_name="Content Payload Key", value="page_content", advanced=True),
|
39
|
+
StrInput(name="metadata_payload_key", display_name="Metadata Payload Key", value="metadata", advanced=True),
|
40
|
+
*LCVectorStoreComponent.inputs,
|
41
|
+
HandleInput(name="embedding", display_name="Embedding", input_types=["Embeddings"]),
|
42
|
+
IntInput(
|
43
|
+
name="number_of_results",
|
44
|
+
display_name="Number of Results",
|
45
|
+
info="Number of results to return.",
|
46
|
+
value=4,
|
47
|
+
advanced=True,
|
48
|
+
),
|
49
|
+
]
|
50
|
+
|
51
|
+
@check_cached_vector_store
|
52
|
+
def build_vector_store(self) -> Qdrant:
|
53
|
+
qdrant_kwargs = {
|
54
|
+
"collection_name": self.collection_name,
|
55
|
+
"content_payload_key": self.content_payload_key,
|
56
|
+
"metadata_payload_key": self.metadata_payload_key,
|
57
|
+
}
|
58
|
+
|
59
|
+
server_kwargs = {
|
60
|
+
"host": self.host or None,
|
61
|
+
"port": int(self.port), # Ensure port is an integer
|
62
|
+
"grpc_port": int(self.grpc_port), # Ensure grpc_port is an integer
|
63
|
+
"api_key": self.api_key,
|
64
|
+
"prefix": self.prefix,
|
65
|
+
# Ensure timeout is an integer
|
66
|
+
"timeout": int(self.timeout) if self.timeout else None,
|
67
|
+
"path": self.path or None,
|
68
|
+
"url": self.url or None,
|
69
|
+
}
|
70
|
+
|
71
|
+
server_kwargs = {k: v for k, v in server_kwargs.items() if v is not None}
|
72
|
+
|
73
|
+
# Convert DataFrame to Data if needed using parent's method
|
74
|
+
self.ingest_data = self._prepare_ingest_data()
|
75
|
+
|
76
|
+
documents = []
|
77
|
+
for _input in self.ingest_data or []:
|
78
|
+
if isinstance(_input, Data):
|
79
|
+
documents.append(_input.to_lc_document())
|
80
|
+
else:
|
81
|
+
documents.append(_input)
|
82
|
+
|
83
|
+
if not isinstance(self.embedding, Embeddings):
|
84
|
+
msg = "Invalid embedding object"
|
85
|
+
raise TypeError(msg)
|
86
|
+
|
87
|
+
if documents:
|
88
|
+
qdrant = Qdrant.from_documents(documents, embedding=self.embedding, **qdrant_kwargs, **server_kwargs)
|
89
|
+
else:
|
90
|
+
from qdrant_client import QdrantClient
|
91
|
+
|
92
|
+
client = QdrantClient(**server_kwargs)
|
93
|
+
qdrant = Qdrant(embeddings=self.embedding, client=client, **qdrant_kwargs)
|
94
|
+
|
95
|
+
return qdrant
|
96
|
+
|
97
|
+
def search_documents(self) -> list[Data]:
|
98
|
+
vector_store = self.build_vector_store()
|
99
|
+
|
100
|
+
if self.search_query and isinstance(self.search_query, str) and self.search_query.strip():
|
101
|
+
docs = vector_store.similarity_search(
|
102
|
+
query=self.search_query,
|
103
|
+
k=self.number_of_results,
|
104
|
+
)
|
105
|
+
|
106
|
+
data = docs_to_data(docs)
|
107
|
+
self.status = data
|
108
|
+
return data
|
109
|
+
return []
|
@@ -0,0 +1,37 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
from typing import TYPE_CHECKING, Any
|
4
|
+
|
5
|
+
from lfx.components._importing import import_mod
|
6
|
+
|
7
|
+
if TYPE_CHECKING:
|
8
|
+
from .redis import RedisVectorStoreComponent
|
9
|
+
from .redis_chat import RedisIndexChatMemory
|
10
|
+
|
11
|
+
_dynamic_imports = {
|
12
|
+
"RedisVectorStoreComponent": "redis",
|
13
|
+
"RedisIndexChatMemory": "redis_chat",
|
14
|
+
}
|
15
|
+
|
16
|
+
__all__ = [
|
17
|
+
"RedisIndexChatMemory",
|
18
|
+
"RedisVectorStoreComponent",
|
19
|
+
]
|
20
|
+
|
21
|
+
|
22
|
+
def __getattr__(attr_name: str) -> Any:
|
23
|
+
"""Lazily import Redis components on attribute access."""
|
24
|
+
if attr_name not in _dynamic_imports:
|
25
|
+
msg = f"module '{__name__}' has no attribute '{attr_name}'"
|
26
|
+
raise AttributeError(msg)
|
27
|
+
try:
|
28
|
+
result = import_mod(attr_name, _dynamic_imports[attr_name], __spec__.parent)
|
29
|
+
except (ModuleNotFoundError, ImportError, AttributeError) as e:
|
30
|
+
msg = f"Could not import '{attr_name}' from '{__name__}': {e}"
|
31
|
+
raise AttributeError(msg) from e
|
32
|
+
globals()[attr_name] = result
|
33
|
+
return result
|
34
|
+
|
35
|
+
|
36
|
+
def __dir__() -> list[str]:
|
37
|
+
return list(__all__)
|