lfx-nightly 0.2.0.dev25__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.
Potentially problematic release.
This version of lfx-nightly might be problematic. Click here for more details.
- lfx/__init__.py +0 -0
- lfx/__main__.py +25 -0
- lfx/_assets/component_index.json +1 -0
- lfx/base/__init__.py +0 -0
- lfx/base/agents/__init__.py +0 -0
- lfx/base/agents/agent.py +375 -0
- lfx/base/agents/altk_base_agent.py +380 -0
- lfx/base/agents/altk_tool_wrappers.py +565 -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 +430 -0
- lfx/base/agents/utils.py +237 -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 +2584 -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 +810 -0
- lfx/base/data/docling_utils.py +338 -0
- lfx/base/data/storage_utils.py +192 -0
- lfx/base/data/utils.py +362 -0
- lfx/base/datastax/__init__.py +5 -0
- lfx/base/datastax/astradb_base.py +896 -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/embeddings_class.py +113 -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 +21 -0
- lfx/base/io/text.py +22 -0
- lfx/base/knowledge_bases/__init__.py +3 -0
- lfx/base/knowledge_bases/knowledge_base_utils.py +137 -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 +1659 -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 +51 -0
- lfx/base/models/aws_constants.py +151 -0
- lfx/base/models/chat_result.py +76 -0
- lfx/base/models/cometapi_constants.py +54 -0
- lfx/base/models/google_generative_ai_constants.py +70 -0
- lfx/base/models/google_generative_ai_model.py +38 -0
- lfx/base/models/groq_constants.py +150 -0
- lfx/base/models/groq_model_discovery.py +265 -0
- lfx/base/models/model.py +375 -0
- lfx/base/models/model_input_constants.py +378 -0
- lfx/base/models/model_metadata.py +41 -0
- lfx/base/models/model_utils.py +108 -0
- lfx/base/models/novita_constants.py +35 -0
- lfx/base/models/ollama_constants.py +52 -0
- lfx/base/models/openai_constants.py +129 -0
- lfx/base/models/sambanova_constants.py +18 -0
- lfx/base/models/watsonx_constants.py +36 -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 +698 -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 +327 -0
- lfx/cli/common.py +650 -0
- lfx/cli/run.py +506 -0
- lfx/cli/script_loader.py +289 -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 +428 -0
- lfx/components/_importing.py +42 -0
- lfx/components/agentql/__init__.py +3 -0
- lfx/components/agentql/agentql_api.py +151 -0
- lfx/components/aiml/__init__.py +37 -0
- lfx/components/aiml/aiml.py +115 -0
- lfx/components/aiml/aiml_embeddings.py +37 -0
- lfx/components/altk/__init__.py +34 -0
- lfx/components/altk/altk_agent.py +193 -0
- lfx/components/amazon/__init__.py +36 -0
- lfx/components/amazon/amazon_bedrock_converse.py +195 -0
- lfx/components/amazon/amazon_bedrock_embedding.py +109 -0
- lfx/components/amazon/amazon_bedrock_model.py +130 -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 +169 -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 +169 -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/cometapi/__init__.py +32 -0
- lfx/components/cometapi/cometapi.py +166 -0
- lfx/components/composio/__init__.py +222 -0
- lfx/components/composio/agentql_composio.py +11 -0
- lfx/components/composio/agiled_composio.py +11 -0
- lfx/components/composio/airtable_composio.py +11 -0
- lfx/components/composio/apollo_composio.py +11 -0
- lfx/components/composio/asana_composio.py +11 -0
- lfx/components/composio/attio_composio.py +11 -0
- lfx/components/composio/bitbucket_composio.py +11 -0
- lfx/components/composio/bolna_composio.py +11 -0
- lfx/components/composio/brightdata_composio.py +11 -0
- lfx/components/composio/calendly_composio.py +11 -0
- lfx/components/composio/canva_composio.py +11 -0
- lfx/components/composio/canvas_composio.py +11 -0
- lfx/components/composio/coda_composio.py +11 -0
- lfx/components/composio/composio_api.py +278 -0
- lfx/components/composio/contentful_composio.py +11 -0
- lfx/components/composio/digicert_composio.py +11 -0
- lfx/components/composio/discord_composio.py +11 -0
- lfx/components/composio/dropbox_compnent.py +11 -0
- lfx/components/composio/elevenlabs_composio.py +11 -0
- lfx/components/composio/exa_composio.py +11 -0
- lfx/components/composio/figma_composio.py +11 -0
- lfx/components/composio/finage_composio.py +11 -0
- lfx/components/composio/firecrawl_composio.py +11 -0
- lfx/components/composio/fireflies_composio.py +11 -0
- lfx/components/composio/fixer_composio.py +11 -0
- lfx/components/composio/flexisign_composio.py +11 -0
- lfx/components/composio/freshdesk_composio.py +11 -0
- lfx/components/composio/github_composio.py +11 -0
- lfx/components/composio/gmail_composio.py +38 -0
- lfx/components/composio/googlebigquery_composio.py +11 -0
- lfx/components/composio/googlecalendar_composio.py +11 -0
- lfx/components/composio/googleclassroom_composio.py +11 -0
- lfx/components/composio/googledocs_composio.py +11 -0
- lfx/components/composio/googlemeet_composio.py +11 -0
- lfx/components/composio/googlesheets_composio.py +11 -0
- lfx/components/composio/googletasks_composio.py +8 -0
- lfx/components/composio/heygen_composio.py +11 -0
- lfx/components/composio/instagram_composio.py +11 -0
- lfx/components/composio/jira_composio.py +11 -0
- lfx/components/composio/jotform_composio.py +11 -0
- lfx/components/composio/klaviyo_composio.py +11 -0
- lfx/components/composio/linear_composio.py +11 -0
- lfx/components/composio/listennotes_composio.py +11 -0
- lfx/components/composio/mem0_composio.py +11 -0
- lfx/components/composio/miro_composio.py +11 -0
- lfx/components/composio/missive_composio.py +11 -0
- lfx/components/composio/notion_composio.py +11 -0
- lfx/components/composio/onedrive_composio.py +11 -0
- lfx/components/composio/outlook_composio.py +11 -0
- lfx/components/composio/pandadoc_composio.py +11 -0
- lfx/components/composio/peopledatalabs_composio.py +11 -0
- lfx/components/composio/perplexityai_composio.py +11 -0
- lfx/components/composio/reddit_composio.py +11 -0
- lfx/components/composio/serpapi_composio.py +11 -0
- lfx/components/composio/slack_composio.py +11 -0
- lfx/components/composio/slackbot_composio.py +11 -0
- lfx/components/composio/snowflake_composio.py +11 -0
- lfx/components/composio/supabase_composio.py +11 -0
- lfx/components/composio/tavily_composio.py +11 -0
- lfx/components/composio/timelinesai_composio.py +11 -0
- lfx/components/composio/todoist_composio.py +11 -0
- lfx/components/composio/wrike_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 +108 -0
- lfx/components/crewai/hierarchical_crew.py +47 -0
- lfx/components/crewai/hierarchical_task.py +45 -0
- lfx/components/crewai/sequential_crew.py +53 -0
- lfx/components/crewai/sequential_task.py +74 -0
- lfx/components/crewai/sequential_task_agent.py +144 -0
- lfx/components/cuga/__init__.py +34 -0
- lfx/components/cuga/cuga_agent.py +730 -0
- lfx/components/custom_component/__init__.py +34 -0
- lfx/components/custom_component/custom_component.py +31 -0
- lfx/components/data/__init__.py +114 -0
- lfx/components/data_source/__init__.py +58 -0
- lfx/components/data_source/api_request.py +577 -0
- lfx/components/data_source/csv_to_data.py +101 -0
- lfx/components/data_source/json_to_data.py +106 -0
- lfx/components/data_source/mock_data.py +398 -0
- lfx/components/data_source/news_search.py +166 -0
- lfx/components/data_source/rss.py +71 -0
- lfx/components/data_source/sql_executor.py +101 -0
- lfx/components/data_source/url.py +311 -0
- lfx/components/data_source/web_search.py +326 -0
- lfx/components/datastax/__init__.py +76 -0
- lfx/components/datastax/astradb_assistant_manager.py +307 -0
- lfx/components/datastax/astradb_chatmemory.py +40 -0
- lfx/components/datastax/astradb_cql.py +288 -0
- lfx/components/datastax/astradb_graph.py +217 -0
- lfx/components/datastax/astradb_tool.py +378 -0
- lfx/components/datastax/astradb_vectorize.py +122 -0
- lfx/components/datastax/astradb_vectorstore.py +449 -0
- lfx/components/datastax/create_assistant.py +59 -0
- lfx/components/datastax/create_thread.py +33 -0
- lfx/components/datastax/dotenv.py +36 -0
- lfx/components/datastax/get_assistant.py +38 -0
- lfx/components/datastax/getenvvar.py +31 -0
- lfx/components/datastax/graph_rag.py +141 -0
- lfx/components/datastax/hcd.py +315 -0
- lfx/components/datastax/list_assistants.py +26 -0
- lfx/components/datastax/run.py +90 -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 +238 -0
- lfx/components/docling/docling_remote.py +195 -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 +789 -0
- lfx/components/elastic/opensearch_multimodal.py +1575 -0
- lfx/components/embeddings/__init__.py +37 -0
- lfx/components/embeddings/similarity.py +77 -0
- lfx/components/embeddings/text_embedder.py +65 -0
- lfx/components/exa/__init__.py +3 -0
- lfx/components/exa/exa_search.py +68 -0
- lfx/components/files_and_knowledge/__init__.py +47 -0
- lfx/components/files_and_knowledge/directory.py +113 -0
- lfx/components/files_and_knowledge/file.py +841 -0
- lfx/components/files_and_knowledge/ingestion.py +694 -0
- lfx/components/files_and_knowledge/retrieval.py +264 -0
- lfx/components/files_and_knowledge/save_file.py +746 -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/flow_controls/__init__.py +58 -0
- lfx/components/flow_controls/conditional_router.py +208 -0
- lfx/components/flow_controls/data_conditional_router.py +126 -0
- lfx/components/flow_controls/flow_tool.py +111 -0
- lfx/components/flow_controls/listen.py +29 -0
- lfx/components/flow_controls/loop.py +163 -0
- lfx/components/flow_controls/notify.py +88 -0
- lfx/components/flow_controls/pass_message.py +36 -0
- lfx/components/flow_controls/run_flow.py +108 -0
- lfx/components/flow_controls/sub_flow.py +115 -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 +193 -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 +144 -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 +143 -0
- lfx/components/helpers/__init__.py +154 -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 +199 -0
- lfx/components/huggingface/huggingface_inference_api.py +106 -0
- lfx/components/ibm/__init__.py +34 -0
- lfx/components/ibm/watsonx.py +207 -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 +40 -0
- lfx/components/input_output/chat.py +109 -0
- lfx/components/input_output/chat_output.py +184 -0
- lfx/components/input_output/text.py +27 -0
- lfx/components/input_output/text_output.py +29 -0
- lfx/components/input_output/webhook.py +56 -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/knowledge_bases/__init__.py +89 -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 +175 -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 +100 -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/llm_operations/__init__.py +46 -0
- lfx/components/llm_operations/batch_run.py +205 -0
- lfx/components/llm_operations/lambda_filter.py +218 -0
- lfx/components/llm_operations/llm_conditional_router.py +421 -0
- lfx/components/llm_operations/llm_selector.py +499 -0
- lfx/components/llm_operations/structured_output.py +244 -0
- lfx/components/lmstudio/__init__.py +34 -0
- lfx/components/lmstudio/lmstudioembeddings.py +89 -0
- lfx/components/lmstudio/lmstudiomodel.py +133 -0
- lfx/components/logic/__init__.py +181 -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 +147 -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 +89 -0
- lfx/components/models_and_agents/__init__.py +49 -0
- lfx/components/models_and_agents/agent.py +644 -0
- lfx/components/models_and_agents/embedding_model.py +423 -0
- lfx/components/models_and_agents/language_model.py +398 -0
- lfx/components/models_and_agents/mcp_component.py +594 -0
- lfx/components/models_and_agents/memory.py +268 -0
- lfx/components/models_and_agents/prompt.py +67 -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 +151 -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 +548 -0
- lfx/components/ollama/ollama_embeddings.py +103 -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 +104 -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 +72 -0
- lfx/components/processing/alter_metadata.py +109 -0
- lfx/components/processing/combine_text.py +40 -0
- lfx/components/processing/converter.py +248 -0
- lfx/components/processing/create_data.py +111 -0
- lfx/components/processing/create_list.py +40 -0
- lfx/components/processing/data_operations.py +528 -0
- lfx/components/processing/data_to_dataframe.py +71 -0
- lfx/components/processing/dataframe_operations.py +313 -0
- lfx/components/processing/dataframe_to_toolset.py +259 -0
- lfx/components/processing/dynamic_create_data.py +357 -0
- lfx/components/processing/extract_key.py +54 -0
- lfx/components/processing/filter_data.py +43 -0
- lfx/components/processing/filter_data_values.py +89 -0
- lfx/components/processing/json_cleaner.py +104 -0
- lfx/components/processing/merge_data.py +91 -0
- lfx/components/processing/message_to_data.py +37 -0
- lfx/components/processing/output_parser.py +46 -0
- lfx/components/processing/parse_data.py +71 -0
- lfx/components/processing/parse_dataframe.py +69 -0
- lfx/components/processing/parse_json_data.py +91 -0
- lfx/components/processing/parser.py +148 -0
- lfx/components/processing/regex.py +83 -0
- lfx/components/processing/select_data.py +49 -0
- lfx/components/processing/split_text.py +141 -0
- lfx/components/processing/store_message.py +91 -0
- lfx/components/processing/update_data.py +161 -0
- lfx/components/prototypes/__init__.py +35 -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 +66 -0
- lfx/components/tools/calculator.py +109 -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 +328 -0
- lfx/components/tools/python_repl.py +98 -0
- lfx/components/tools/search_api.py +88 -0
- lfx/components/tools/searxng.py +145 -0
- lfx/components/tools/serp_api.py +120 -0
- lfx/components/tools/tavily_search_tool.py +345 -0
- lfx/components/tools/wikidata_api.py +103 -0
- lfx/components/tools/wikipedia_api.py +50 -0
- lfx/components/tools/yahoo_finance.py +130 -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 +301 -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 +191 -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/utilities/__init__.py +43 -0
- lfx/components/utilities/calculator_core.py +89 -0
- lfx/components/utilities/current_date.py +42 -0
- lfx/components/utilities/id_generator.py +42 -0
- lfx/components/utilities/python_repl_core.py +98 -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 +34 -0
- lfx/components/vectorstores/local_db.py +270 -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/vlmrun/__init__.py +34 -0
- lfx/components/vlmrun/vlmrun_transcription.py +224 -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 +206 -0
- lfx/components/zep/__init__.py +3 -0
- lfx/components/zep/zep.py +45 -0
- lfx/constants.py +6 -0
- lfx/custom/__init__.py +7 -0
- lfx/custom/attributes.py +87 -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 +1890 -0
- lfx/custom/custom_component/component_with_cache.py +8 -0
- lfx/custom/custom_component/custom_component.py +650 -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 +523 -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 +216 -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 +300 -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 +2298 -0
- lfx/graph/graph/constants.py +63 -0
- lfx/graph/graph/runnable_vertices_manager.py +133 -0
- lfx/graph/graph/schema.py +53 -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 +250 -0
- lfx/graph/utils.py +206 -0
- lfx/graph/vertex/__init__.py +0 -0
- lfx/graph/vertex/base.py +826 -0
- lfx/graph/vertex/constants.py +0 -0
- lfx/graph/vertex/exceptions.py +4 -0
- lfx/graph/vertex/param_handler.py +316 -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 +141 -0
- lfx/helpers/base_model.py +71 -0
- lfx/helpers/custom.py +13 -0
- lfx/helpers/data.py +167 -0
- lfx/helpers/flow.py +308 -0
- lfx/inputs/__init__.py +68 -0
- lfx/inputs/constants.py +2 -0
- lfx/inputs/input_mixin.py +352 -0
- lfx/inputs/inputs.py +718 -0
- lfx/inputs/validators.py +19 -0
- lfx/interface/__init__.py +6 -0
- lfx/interface/components.py +897 -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 +317 -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 +295 -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 +411 -0
- lfx/logging/__init__.py +11 -0
- lfx/logging/logger.py +24 -0
- lfx/memory/__init__.py +70 -0
- lfx/memory/stubs.py +302 -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/cross_module.py +80 -0
- lfx/schema/data.py +309 -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 +184 -0
- lfx/schema/json_schema.py +186 -0
- lfx/schema/log.py +62 -0
- lfx/schema/message.py +493 -0
- lfx/schema/openai_responses_schemas.py +74 -0
- lfx/schema/properties.py +41 -0
- lfx/schema/schema.py +180 -0
- lfx/schema/serialize.py +13 -0
- lfx/schema/table.py +142 -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 +26 -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/database/__init__.py +5 -0
- lfx/services/database/service.py +25 -0
- lfx/services/deps.py +194 -0
- lfx/services/factory.py +19 -0
- lfx/services/initialize.py +19 -0
- lfx/services/interfaces.py +103 -0
- lfx/services/manager.py +185 -0
- lfx/services/mcp_composer/__init__.py +6 -0
- lfx/services/mcp_composer/factory.py +16 -0
- lfx/services/mcp_composer/service.py +1441 -0
- lfx/services/schema.py +21 -0
- lfx/services/session.py +87 -0
- lfx/services/settings/__init__.py +3 -0
- lfx/services/settings/auth.py +133 -0
- lfx/services/settings/base.py +668 -0
- lfx/services/settings/constants.py +43 -0
- lfx/services/settings/factory.py +23 -0
- lfx/services/settings/feature_flags.py +11 -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 +185 -0
- lfx/services/storage/service.py +177 -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 +260 -0
- lfx/template/field/prompt.py +15 -0
- lfx/template/frontend_node/__init__.py +6 -0
- lfx/template/frontend_node/base.py +214 -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 +233 -0
- lfx/utils/data_structure.py +212 -0
- lfx/utils/exceptions.py +22 -0
- lfx/utils/helpers.py +34 -0
- lfx/utils/image.py +79 -0
- lfx/utils/langflow_utils.py +52 -0
- lfx/utils/lazy_load.py +15 -0
- lfx/utils/request_utils.py +18 -0
- lfx/utils/schemas.py +139 -0
- lfx/utils/ssrf_protection.py +384 -0
- lfx/utils/util.py +626 -0
- lfx/utils/util_strings.py +56 -0
- lfx/utils/validate_cloud.py +26 -0
- lfx/utils/version.py +24 -0
- lfx_nightly-0.2.0.dev25.dist-info/METADATA +312 -0
- lfx_nightly-0.2.0.dev25.dist-info/RECORD +769 -0
- lfx_nightly-0.2.0.dev25.dist-info/WHEEL +4 -0
- lfx_nightly-0.2.0.dev25.dist-info/entry_points.txt +2 -0
lfx/schema/dataframe.py
ADDED
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
from typing import TYPE_CHECKING, cast
|
|
2
|
+
|
|
3
|
+
import pandas as pd
|
|
4
|
+
from langchain_core.documents import Document
|
|
5
|
+
from pandas import DataFrame as pandas_DataFrame
|
|
6
|
+
|
|
7
|
+
from lfx.schema.data import Data
|
|
8
|
+
|
|
9
|
+
if TYPE_CHECKING:
|
|
10
|
+
from lfx.schema.message import Message
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class DataFrame(pandas_DataFrame):
|
|
14
|
+
"""A pandas DataFrame subclass specialized for handling collections of Data objects.
|
|
15
|
+
|
|
16
|
+
This class extends pandas.DataFrame to provide seamless integration between
|
|
17
|
+
Langflow's Data objects and pandas' powerful data manipulation capabilities.
|
|
18
|
+
|
|
19
|
+
Args:
|
|
20
|
+
data: Input data in various formats:
|
|
21
|
+
- List[Data]: List of Data objects
|
|
22
|
+
- List[Dict]: List of dictionaries
|
|
23
|
+
- Dict: Dictionary of arrays/lists
|
|
24
|
+
- pandas.DataFrame: Existing DataFrame
|
|
25
|
+
- Any format supported by pandas.DataFrame
|
|
26
|
+
**kwargs: Additional arguments passed to pandas.DataFrame constructor
|
|
27
|
+
|
|
28
|
+
Examples:
|
|
29
|
+
>>> # From Data objects
|
|
30
|
+
>>> dataset = DataFrame([Data(data={"name": "John"}), Data(data={"name": "Jane"})])
|
|
31
|
+
|
|
32
|
+
>>> # From dictionaries
|
|
33
|
+
>>> dataset = DataFrame([{"name": "John"}, {"name": "Jane"}])
|
|
34
|
+
|
|
35
|
+
>>> # From dictionary of lists
|
|
36
|
+
>>> dataset = DataFrame({"name": ["John", "Jane"], "age": [30, 25]})
|
|
37
|
+
"""
|
|
38
|
+
|
|
39
|
+
def __init__(
|
|
40
|
+
self,
|
|
41
|
+
data: list[dict] | list[Data] | pd.DataFrame | None = None,
|
|
42
|
+
text_key: str = "text",
|
|
43
|
+
default_value: str = "",
|
|
44
|
+
**kwargs,
|
|
45
|
+
):
|
|
46
|
+
# Initialize pandas DataFrame first without data
|
|
47
|
+
super().__init__(**kwargs) # Removed data parameter
|
|
48
|
+
|
|
49
|
+
# Store attributes as private members to avoid conflicts with pandas
|
|
50
|
+
self._text_key = text_key
|
|
51
|
+
self._default_value = default_value
|
|
52
|
+
|
|
53
|
+
if data is None:
|
|
54
|
+
return
|
|
55
|
+
|
|
56
|
+
if isinstance(data, list):
|
|
57
|
+
if all(isinstance(x, Data) for x in data):
|
|
58
|
+
data = [d.data for d in data if hasattr(d, "data")]
|
|
59
|
+
elif not all(isinstance(x, dict) for x in data):
|
|
60
|
+
msg = "List items must be either all Data objects or all dictionaries"
|
|
61
|
+
raise ValueError(msg)
|
|
62
|
+
self._update(data, **kwargs)
|
|
63
|
+
elif isinstance(data, dict | pd.DataFrame): # Fixed type check syntax
|
|
64
|
+
self._update(data, **kwargs)
|
|
65
|
+
|
|
66
|
+
def _update(self, data, **kwargs):
|
|
67
|
+
"""Helper method to update DataFrame with new data."""
|
|
68
|
+
new_df = pd.DataFrame(data, **kwargs)
|
|
69
|
+
self._update_inplace(new_df)
|
|
70
|
+
|
|
71
|
+
# Update property accessors
|
|
72
|
+
@property
|
|
73
|
+
def text_key(self) -> str:
|
|
74
|
+
return self._text_key
|
|
75
|
+
|
|
76
|
+
@text_key.setter
|
|
77
|
+
def text_key(self, value: str) -> None:
|
|
78
|
+
if value not in self.columns:
|
|
79
|
+
msg = f"Text key '{value}' not found in DataFrame columns"
|
|
80
|
+
raise ValueError(msg)
|
|
81
|
+
self._text_key = value
|
|
82
|
+
|
|
83
|
+
@property
|
|
84
|
+
def default_value(self) -> str:
|
|
85
|
+
return self._default_value
|
|
86
|
+
|
|
87
|
+
@default_value.setter
|
|
88
|
+
def default_value(self, value: str) -> None:
|
|
89
|
+
self._default_value = value
|
|
90
|
+
|
|
91
|
+
def to_data_list(self) -> list[Data]:
|
|
92
|
+
"""Converts the DataFrame back to a list of Data objects."""
|
|
93
|
+
list_of_dicts = self.to_dict(orient="records")
|
|
94
|
+
# suggested change: [Data(**row) for row in list_of_dicts]
|
|
95
|
+
return [Data(data=row) for row in list_of_dicts]
|
|
96
|
+
|
|
97
|
+
def add_row(self, data: dict | Data) -> "DataFrame":
|
|
98
|
+
"""Adds a single row to the dataset.
|
|
99
|
+
|
|
100
|
+
Args:
|
|
101
|
+
data: Either a Data object or a dictionary to add as a new row
|
|
102
|
+
|
|
103
|
+
Returns:
|
|
104
|
+
DataFrame: A new DataFrame with the added row
|
|
105
|
+
|
|
106
|
+
Example:
|
|
107
|
+
>>> dataset = DataFrame([{"name": "John"}])
|
|
108
|
+
>>> dataset = dataset.add_row({"name": "Jane"})
|
|
109
|
+
"""
|
|
110
|
+
if isinstance(data, Data):
|
|
111
|
+
data = data.data
|
|
112
|
+
new_df = self._constructor([data])
|
|
113
|
+
return cast("DataFrame", pd.concat([self, new_df], ignore_index=True))
|
|
114
|
+
|
|
115
|
+
def add_rows(self, data: list[dict | Data]) -> "DataFrame":
|
|
116
|
+
"""Adds multiple rows to the dataset.
|
|
117
|
+
|
|
118
|
+
Args:
|
|
119
|
+
data: List of Data objects or dictionaries to add as new rows
|
|
120
|
+
|
|
121
|
+
Returns:
|
|
122
|
+
DataFrame: A new DataFrame with the added rows
|
|
123
|
+
"""
|
|
124
|
+
processed_data = []
|
|
125
|
+
for item in data:
|
|
126
|
+
if isinstance(item, Data):
|
|
127
|
+
processed_data.append(item.data)
|
|
128
|
+
else:
|
|
129
|
+
processed_data.append(item)
|
|
130
|
+
new_df = self._constructor(processed_data)
|
|
131
|
+
return cast("DataFrame", pd.concat([self, new_df], ignore_index=True))
|
|
132
|
+
|
|
133
|
+
@property
|
|
134
|
+
def _constructor(self):
|
|
135
|
+
def _c(*args, **kwargs):
|
|
136
|
+
return DataFrame(*args, **kwargs).__finalize__(self)
|
|
137
|
+
|
|
138
|
+
return _c
|
|
139
|
+
|
|
140
|
+
def __bool__(self):
|
|
141
|
+
"""Truth value testing for the DataFrame.
|
|
142
|
+
|
|
143
|
+
Returns True if the DataFrame has at least one row, False otherwise.
|
|
144
|
+
"""
|
|
145
|
+
return not self.empty
|
|
146
|
+
|
|
147
|
+
__hash__ = None # DataFrames are mutable and shouldn't be hashable
|
|
148
|
+
|
|
149
|
+
def to_lc_documents(self) -> list[Document]:
|
|
150
|
+
"""Converts the DataFrame to a list of Documents.
|
|
151
|
+
|
|
152
|
+
Returns:
|
|
153
|
+
list[Document]: The converted list of Documents.
|
|
154
|
+
"""
|
|
155
|
+
list_of_dicts = self.to_dict(orient="records")
|
|
156
|
+
documents = []
|
|
157
|
+
for row in list_of_dicts:
|
|
158
|
+
data_copy = row.copy()
|
|
159
|
+
text = data_copy.pop(self._text_key, self._default_value)
|
|
160
|
+
if isinstance(text, str):
|
|
161
|
+
documents.append(Document(page_content=text, metadata=data_copy))
|
|
162
|
+
else:
|
|
163
|
+
documents.append(Document(page_content=str(text), metadata=data_copy))
|
|
164
|
+
return documents
|
|
165
|
+
|
|
166
|
+
def _docs_to_dataframe(self, docs):
|
|
167
|
+
"""Converts a list of Documents to a DataFrame.
|
|
168
|
+
|
|
169
|
+
Args:
|
|
170
|
+
docs: List of Document objects
|
|
171
|
+
|
|
172
|
+
Returns:
|
|
173
|
+
DataFrame: A new DataFrame with the converted Documents
|
|
174
|
+
"""
|
|
175
|
+
return DataFrame(docs)
|
|
176
|
+
|
|
177
|
+
def __eq__(self, other):
|
|
178
|
+
"""Override equality to handle comparison with empty DataFrames and non-DataFrame objects."""
|
|
179
|
+
if self.empty:
|
|
180
|
+
return False
|
|
181
|
+
if isinstance(other, list) and not other: # Empty list case
|
|
182
|
+
return False
|
|
183
|
+
if not isinstance(other, DataFrame | pd.DataFrame): # Non-DataFrame case
|
|
184
|
+
return False
|
|
185
|
+
return super().__eq__(other)
|
|
186
|
+
|
|
187
|
+
def to_data(self) -> Data:
|
|
188
|
+
"""Convert this DataFrame to a Data object.
|
|
189
|
+
|
|
190
|
+
Returns:
|
|
191
|
+
Data: A Data object containing the DataFrame records under 'results' key.
|
|
192
|
+
"""
|
|
193
|
+
dict_list = self.to_dict(orient="records")
|
|
194
|
+
return Data(data={"results": dict_list})
|
|
195
|
+
|
|
196
|
+
def to_message(self) -> "Message":
|
|
197
|
+
from lfx.schema.message import Message
|
|
198
|
+
|
|
199
|
+
# Process DataFrame similar to the _safe_convert method
|
|
200
|
+
# Remove empty rows
|
|
201
|
+
processed_df = self.dropna(how="all")
|
|
202
|
+
# Remove empty lines in each cell
|
|
203
|
+
processed_df = processed_df.replace(r"^\s*$", "", regex=True)
|
|
204
|
+
# Replace multiple newlines with a single newline
|
|
205
|
+
processed_df = processed_df.replace(r"\n+", "\n", regex=True)
|
|
206
|
+
# Replace pipe characters to avoid markdown table issues
|
|
207
|
+
processed_df = processed_df.replace(r"\|", r"\\|", regex=True)
|
|
208
|
+
processed_df = processed_df.map(lambda x: str(x).replace("\n", "<br/>") if isinstance(x, str) else x)
|
|
209
|
+
# Convert to markdown and wrap in a Message
|
|
210
|
+
return Message(text=processed_df.to_markdown(index=False))
|
lfx/schema/dotdict.py
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"""Dot-notation dictionary implementation copied from langflow for lfx package."""
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class dotdict(dict): # noqa: N801
|
|
5
|
+
"""dotdict allows accessing dictionary elements using dot notation (e.g., dict.key instead of dict['key']).
|
|
6
|
+
|
|
7
|
+
It automatically converts nested dictionaries into dotdict instances, enabling dot notation on them as well.
|
|
8
|
+
|
|
9
|
+
Note:
|
|
10
|
+
- Only keys that are valid attribute names (e.g., strings that could be variable names) are accessible via dot
|
|
11
|
+
notation.
|
|
12
|
+
- Keys which are not valid Python attribute names or collide with the dict method names (like 'items', 'keys')
|
|
13
|
+
should be accessed using the traditional dict['key'] notation.
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
def __getattr__(self, attr):
|
|
17
|
+
"""Override dot access to behave like dictionary lookup. Automatically convert nested dicts to dotdicts.
|
|
18
|
+
|
|
19
|
+
Args:
|
|
20
|
+
attr (str): Attribute to access.
|
|
21
|
+
|
|
22
|
+
Returns:
|
|
23
|
+
The value associated with 'attr' in the dictionary, converted to dotdict if it is a dict.
|
|
24
|
+
|
|
25
|
+
Raises:
|
|
26
|
+
AttributeError: If the attribute is not found in the dictionary.
|
|
27
|
+
"""
|
|
28
|
+
try:
|
|
29
|
+
value = self[attr]
|
|
30
|
+
if isinstance(value, dict) and not isinstance(value, dotdict):
|
|
31
|
+
value = dotdict(value)
|
|
32
|
+
self[attr] = value # Update self to nest dotdict for future accesses
|
|
33
|
+
except KeyError as e:
|
|
34
|
+
msg = f"'dotdict' object has no attribute '{attr}'"
|
|
35
|
+
raise AttributeError(msg) from e
|
|
36
|
+
else:
|
|
37
|
+
return value
|
|
38
|
+
|
|
39
|
+
def __setattr__(self, key, value) -> None:
|
|
40
|
+
"""Override attribute setting to work as dictionary item assignment.
|
|
41
|
+
|
|
42
|
+
Args:
|
|
43
|
+
key (str): The key under which to store the value.
|
|
44
|
+
value: The value to store in the dictionary.
|
|
45
|
+
"""
|
|
46
|
+
if isinstance(value, dict) and not isinstance(value, dotdict):
|
|
47
|
+
value = dotdict(value)
|
|
48
|
+
self[key] = value
|
|
49
|
+
|
|
50
|
+
def __delattr__(self, key) -> None:
|
|
51
|
+
"""Override attribute deletion to work as dictionary item deletion.
|
|
52
|
+
|
|
53
|
+
Args:
|
|
54
|
+
key (str): The key of the item to delete from the dictionary.
|
|
55
|
+
|
|
56
|
+
Raises:
|
|
57
|
+
AttributeError: If the key is not found in the dictionary.
|
|
58
|
+
"""
|
|
59
|
+
try:
|
|
60
|
+
del self[key]
|
|
61
|
+
except KeyError as e:
|
|
62
|
+
msg = f"'dotdict' object has no attribute '{key}'"
|
|
63
|
+
raise AttributeError(msg) from e
|
|
64
|
+
|
|
65
|
+
def __missing__(self, key):
|
|
66
|
+
"""Handle missing keys by returning an empty dotdict. This allows chaining access without raising KeyError.
|
|
67
|
+
|
|
68
|
+
Args:
|
|
69
|
+
key: The missing key.
|
|
70
|
+
|
|
71
|
+
Returns:
|
|
72
|
+
An empty dotdict instance for the given missing key.
|
|
73
|
+
"""
|
|
74
|
+
return dotdict()
|
lfx/schema/encoders.py
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
from collections.abc import Callable
|
|
2
|
+
from datetime import datetime
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
def encode_callable(obj: Callable):
|
|
6
|
+
return obj.__name__ if hasattr(obj, "__name__") else str(obj)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def encode_datetime(obj: datetime):
|
|
10
|
+
return obj.strftime("%Y-%m-%d %H:%M:%S %Z")
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
CUSTOM_ENCODERS = {Callable: encode_callable, datetime: encode_datetime}
|
lfx/schema/graph.py
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
from typing import Any
|
|
2
|
+
|
|
3
|
+
from pydantic import BaseModel, Field, RootModel
|
|
4
|
+
|
|
5
|
+
from lfx.schema.schema import InputType
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class InputValue(BaseModel):
|
|
9
|
+
components: list[str] | None = []
|
|
10
|
+
input_value: str | None = None
|
|
11
|
+
type: InputType | None = Field(
|
|
12
|
+
"any",
|
|
13
|
+
description="Defines on which components the input value should be applied. "
|
|
14
|
+
"'any' applies to all input components.",
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class Tweaks(RootModel):
|
|
19
|
+
root: dict[str, str | dict[str, Any]] = Field(
|
|
20
|
+
description="A dictionary of tweaks to adjust the flow's execution. "
|
|
21
|
+
"Allows customizing flow behavior dynamically. "
|
|
22
|
+
"All tweaks are overridden by the input values.",
|
|
23
|
+
)
|
|
24
|
+
model_config = {
|
|
25
|
+
"json_schema_extra": {
|
|
26
|
+
"examples": [
|
|
27
|
+
{
|
|
28
|
+
"parameter_name": "value",
|
|
29
|
+
"Component Name": {"parameter_name": "value"},
|
|
30
|
+
"component_id": {"parameter_name": "value"},
|
|
31
|
+
}
|
|
32
|
+
]
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
# This should behave like a dict
|
|
37
|
+
def __getitem__(self, key):
|
|
38
|
+
return self.root[key]
|
|
39
|
+
|
|
40
|
+
def __setitem__(self, key, value) -> None:
|
|
41
|
+
self.root[key] = value
|
|
42
|
+
|
|
43
|
+
def __delitem__(self, key) -> None:
|
|
44
|
+
del self.root[key]
|
|
45
|
+
|
|
46
|
+
def items(self):
|
|
47
|
+
return self.root.items()
|
lfx/schema/image.py
ADDED
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import base64
|
|
2
|
+
from pathlib import Path
|
|
3
|
+
|
|
4
|
+
import aiofiles
|
|
5
|
+
from PIL import Image as PILImage
|
|
6
|
+
from platformdirs import user_cache_dir
|
|
7
|
+
from pydantic import BaseModel
|
|
8
|
+
|
|
9
|
+
from lfx.services.deps import get_storage_service
|
|
10
|
+
|
|
11
|
+
IMAGE_ENDPOINT = "/files/images/"
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def is_image_file(file_path) -> bool:
|
|
15
|
+
"""Check if a file is a valid image."""
|
|
16
|
+
try:
|
|
17
|
+
with PILImage.open(file_path) as img:
|
|
18
|
+
img.verify() # Verify that it is, in fact, an image
|
|
19
|
+
except (OSError, SyntaxError):
|
|
20
|
+
return False
|
|
21
|
+
return True
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def get_file_paths(files: list[str | dict]):
|
|
25
|
+
"""Get file paths for a list of files."""
|
|
26
|
+
if not files:
|
|
27
|
+
return []
|
|
28
|
+
|
|
29
|
+
storage_service = get_storage_service()
|
|
30
|
+
if not storage_service:
|
|
31
|
+
# Extract paths from dicts if present
|
|
32
|
+
|
|
33
|
+
extracted_files = []
|
|
34
|
+
cache_dir = Path(user_cache_dir("langflow"))
|
|
35
|
+
|
|
36
|
+
for file in files:
|
|
37
|
+
if not file: # Skip empty/None files
|
|
38
|
+
continue
|
|
39
|
+
|
|
40
|
+
file_path = file["path"] if isinstance(file, dict) and "path" in file else file
|
|
41
|
+
if not file_path: # Skip empty paths
|
|
42
|
+
continue
|
|
43
|
+
|
|
44
|
+
# If it's a relative path like "flow_id/filename", resolve it to cache dir
|
|
45
|
+
path = Path(file_path)
|
|
46
|
+
if not path.is_absolute() and not path.exists():
|
|
47
|
+
# Check if it exists in the cache directory
|
|
48
|
+
cache_path = cache_dir / file_path
|
|
49
|
+
if cache_path.exists():
|
|
50
|
+
extracted_files.append(str(cache_path))
|
|
51
|
+
else:
|
|
52
|
+
# Keep the original path if not found
|
|
53
|
+
extracted_files.append(file_path)
|
|
54
|
+
else:
|
|
55
|
+
extracted_files.append(file_path)
|
|
56
|
+
return extracted_files
|
|
57
|
+
|
|
58
|
+
file_paths = []
|
|
59
|
+
for file in files:
|
|
60
|
+
# Handle dict case
|
|
61
|
+
if storage_service is None:
|
|
62
|
+
continue
|
|
63
|
+
|
|
64
|
+
if not file: # Skip empty/None files
|
|
65
|
+
continue
|
|
66
|
+
|
|
67
|
+
if isinstance(file, dict) and "path" in file:
|
|
68
|
+
file_path_str = file["path"]
|
|
69
|
+
elif hasattr(file, "path") and file.path:
|
|
70
|
+
file_path_str = file.path
|
|
71
|
+
else:
|
|
72
|
+
file_path_str = file
|
|
73
|
+
|
|
74
|
+
if not file_path_str: # Skip empty paths
|
|
75
|
+
continue
|
|
76
|
+
|
|
77
|
+
file_path = Path(file_path_str)
|
|
78
|
+
# Handle edge case where path might be just a filename without parent
|
|
79
|
+
if file_path.parent == Path():
|
|
80
|
+
flow_id, file_name = "", file_path.name
|
|
81
|
+
else:
|
|
82
|
+
flow_id, file_name = str(file_path.parent), file_path.name
|
|
83
|
+
|
|
84
|
+
if not file_name: # Skip if no filename
|
|
85
|
+
continue
|
|
86
|
+
|
|
87
|
+
file_paths.append(storage_service.build_full_path(flow_id=flow_id, file_name=file_name))
|
|
88
|
+
return file_paths
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
async def get_files(
|
|
92
|
+
file_paths: list[str],
|
|
93
|
+
*,
|
|
94
|
+
convert_to_base64: bool = False,
|
|
95
|
+
):
|
|
96
|
+
"""Get files from storage service."""
|
|
97
|
+
if not file_paths:
|
|
98
|
+
return []
|
|
99
|
+
|
|
100
|
+
storage_service = get_storage_service()
|
|
101
|
+
if not storage_service:
|
|
102
|
+
# For testing purposes, read files directly when no storage service
|
|
103
|
+
file_objects: list[str | bytes] = []
|
|
104
|
+
for file_path_str in file_paths:
|
|
105
|
+
if not file_path_str: # Skip empty paths
|
|
106
|
+
continue
|
|
107
|
+
|
|
108
|
+
file_path = Path(file_path_str)
|
|
109
|
+
if file_path.exists():
|
|
110
|
+
# Use async read for compatibility
|
|
111
|
+
try:
|
|
112
|
+
async with aiofiles.open(file_path, "rb") as f:
|
|
113
|
+
file_content = await f.read()
|
|
114
|
+
if convert_to_base64:
|
|
115
|
+
file_base64 = base64.b64encode(file_content).decode("utf-8")
|
|
116
|
+
file_objects.append(file_base64)
|
|
117
|
+
else:
|
|
118
|
+
file_objects.append(file_content)
|
|
119
|
+
except Exception as e:
|
|
120
|
+
msg = f"Error reading file {file_path}: {e}"
|
|
121
|
+
raise FileNotFoundError(msg) from e
|
|
122
|
+
else:
|
|
123
|
+
msg = f"File not found: {file_path}"
|
|
124
|
+
raise FileNotFoundError(msg)
|
|
125
|
+
return file_objects
|
|
126
|
+
|
|
127
|
+
file_objects: list[str | bytes] = []
|
|
128
|
+
for file in file_paths:
|
|
129
|
+
if not file: # Skip empty file paths
|
|
130
|
+
continue
|
|
131
|
+
|
|
132
|
+
file_path = Path(file)
|
|
133
|
+
# Handle edge case where path might be just a filename without parent
|
|
134
|
+
if file_path.parent == Path():
|
|
135
|
+
flow_id, file_name = "", file_path.name
|
|
136
|
+
else:
|
|
137
|
+
flow_id, file_name = str(file_path.parent), file_path.name
|
|
138
|
+
|
|
139
|
+
if not file_name: # Skip if no filename
|
|
140
|
+
continue
|
|
141
|
+
|
|
142
|
+
if not storage_service:
|
|
143
|
+
continue
|
|
144
|
+
|
|
145
|
+
try:
|
|
146
|
+
file_object = await storage_service.get_file(flow_id=flow_id, file_name=file_name)
|
|
147
|
+
if convert_to_base64:
|
|
148
|
+
file_base64 = base64.b64encode(file_object).decode("utf-8")
|
|
149
|
+
file_objects.append(file_base64)
|
|
150
|
+
else:
|
|
151
|
+
file_objects.append(file_object)
|
|
152
|
+
except Exception as e:
|
|
153
|
+
msg = f"Error getting file {file} from storage: {e}"
|
|
154
|
+
raise FileNotFoundError(msg) from e
|
|
155
|
+
return file_objects
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
class Image(BaseModel):
|
|
159
|
+
"""Image model for lfx package."""
|
|
160
|
+
|
|
161
|
+
path: str | None = None
|
|
162
|
+
url: str | None = None
|
|
163
|
+
|
|
164
|
+
def to_base64(self):
|
|
165
|
+
"""Convert image to base64 string."""
|
|
166
|
+
if self.path:
|
|
167
|
+
files = get_files([self.path], convert_to_base64=True)
|
|
168
|
+
if not files:
|
|
169
|
+
msg = f"No files found or file could not be converted to base64: {self.path}"
|
|
170
|
+
raise ValueError(msg)
|
|
171
|
+
return files[0]
|
|
172
|
+
msg = "Image path is not set."
|
|
173
|
+
raise ValueError(msg)
|
|
174
|
+
|
|
175
|
+
def to_content_dict(self):
|
|
176
|
+
"""Convert image to content dictionary."""
|
|
177
|
+
return {
|
|
178
|
+
"type": "image_url",
|
|
179
|
+
"image_url": self.to_base64(),
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
def get_url(self) -> str:
|
|
183
|
+
"""Get the URL for the image."""
|
|
184
|
+
return f"{IMAGE_ENDPOINT}{self.path}"
|