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
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
from collections.abc import Generator
|
|
2
|
+
from typing import Any
|
|
3
|
+
|
|
4
|
+
import orjson
|
|
5
|
+
from fastapi.encoders import jsonable_encoder
|
|
6
|
+
|
|
7
|
+
from lfx.base.io.chat import ChatComponent
|
|
8
|
+
from lfx.helpers.data import safe_convert
|
|
9
|
+
from lfx.inputs.inputs import BoolInput, DropdownInput, HandleInput, MessageTextInput
|
|
10
|
+
from lfx.schema.data import Data
|
|
11
|
+
from lfx.schema.dataframe import DataFrame
|
|
12
|
+
from lfx.schema.message import Message
|
|
13
|
+
from lfx.schema.properties import Source
|
|
14
|
+
from lfx.template.field.base import Output
|
|
15
|
+
from lfx.utils.constants import (
|
|
16
|
+
MESSAGE_SENDER_AI,
|
|
17
|
+
MESSAGE_SENDER_NAME_AI,
|
|
18
|
+
MESSAGE_SENDER_USER,
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class ChatOutput(ChatComponent):
|
|
23
|
+
display_name = "Chat Output"
|
|
24
|
+
description = "Display a chat message in the Playground."
|
|
25
|
+
documentation: str = "https://docs.langflow.org/chat-input-and-output"
|
|
26
|
+
icon = "MessagesSquare"
|
|
27
|
+
name = "ChatOutput"
|
|
28
|
+
minimized = True
|
|
29
|
+
|
|
30
|
+
inputs = [
|
|
31
|
+
HandleInput(
|
|
32
|
+
name="input_value",
|
|
33
|
+
display_name="Inputs",
|
|
34
|
+
info="Message to be passed as output.",
|
|
35
|
+
input_types=["Data", "DataFrame", "Message"],
|
|
36
|
+
required=True,
|
|
37
|
+
),
|
|
38
|
+
BoolInput(
|
|
39
|
+
name="should_store_message",
|
|
40
|
+
display_name="Store Messages",
|
|
41
|
+
info="Store the message in the history.",
|
|
42
|
+
value=True,
|
|
43
|
+
advanced=True,
|
|
44
|
+
),
|
|
45
|
+
DropdownInput(
|
|
46
|
+
name="sender",
|
|
47
|
+
display_name="Sender Type",
|
|
48
|
+
options=[MESSAGE_SENDER_AI, MESSAGE_SENDER_USER],
|
|
49
|
+
value=MESSAGE_SENDER_AI,
|
|
50
|
+
advanced=True,
|
|
51
|
+
info="Type of sender.",
|
|
52
|
+
),
|
|
53
|
+
MessageTextInput(
|
|
54
|
+
name="sender_name",
|
|
55
|
+
display_name="Sender Name",
|
|
56
|
+
info="Name of the sender.",
|
|
57
|
+
value=MESSAGE_SENDER_NAME_AI,
|
|
58
|
+
advanced=True,
|
|
59
|
+
),
|
|
60
|
+
MessageTextInput(
|
|
61
|
+
name="session_id",
|
|
62
|
+
display_name="Session ID",
|
|
63
|
+
info="The session ID of the chat. If empty, the current session ID parameter will be used.",
|
|
64
|
+
advanced=True,
|
|
65
|
+
),
|
|
66
|
+
MessageTextInput(
|
|
67
|
+
name="context_id",
|
|
68
|
+
display_name="Context ID",
|
|
69
|
+
info="The context ID of the chat. Adds an extra layer to the local memory.",
|
|
70
|
+
value="",
|
|
71
|
+
advanced=True,
|
|
72
|
+
),
|
|
73
|
+
MessageTextInput(
|
|
74
|
+
name="data_template",
|
|
75
|
+
display_name="Data Template",
|
|
76
|
+
value="{text}",
|
|
77
|
+
advanced=True,
|
|
78
|
+
info="Template to convert Data to Text. If left empty, it will be dynamically set to the Data's text key.",
|
|
79
|
+
),
|
|
80
|
+
BoolInput(
|
|
81
|
+
name="clean_data",
|
|
82
|
+
display_name="Basic Clean Data",
|
|
83
|
+
value=True,
|
|
84
|
+
advanced=True,
|
|
85
|
+
info="Whether to clean data before converting to string.",
|
|
86
|
+
),
|
|
87
|
+
]
|
|
88
|
+
outputs = [
|
|
89
|
+
Output(
|
|
90
|
+
display_name="Output Message",
|
|
91
|
+
name="message",
|
|
92
|
+
method="message_response",
|
|
93
|
+
),
|
|
94
|
+
]
|
|
95
|
+
|
|
96
|
+
def _build_source(self, id_: str | None, display_name: str | None, source: str | None) -> Source:
|
|
97
|
+
source_dict = {}
|
|
98
|
+
if id_:
|
|
99
|
+
source_dict["id"] = id_
|
|
100
|
+
if display_name:
|
|
101
|
+
source_dict["display_name"] = display_name
|
|
102
|
+
if source:
|
|
103
|
+
# Handle case where source is a ChatOpenAI object
|
|
104
|
+
if hasattr(source, "model_name"):
|
|
105
|
+
source_dict["source"] = source.model_name
|
|
106
|
+
elif hasattr(source, "model"):
|
|
107
|
+
source_dict["source"] = str(source.model)
|
|
108
|
+
else:
|
|
109
|
+
source_dict["source"] = str(source)
|
|
110
|
+
return Source(**source_dict)
|
|
111
|
+
|
|
112
|
+
async def message_response(self) -> Message:
|
|
113
|
+
# First convert the input to string if needed
|
|
114
|
+
text = self.convert_to_string()
|
|
115
|
+
|
|
116
|
+
# Get source properties
|
|
117
|
+
source, _, display_name, source_id = self.get_properties_from_source_component()
|
|
118
|
+
|
|
119
|
+
# Create or use existing Message object
|
|
120
|
+
if isinstance(self.input_value, Message) and not self.is_connected_to_chat_input():
|
|
121
|
+
message = self.input_value
|
|
122
|
+
# Update message properties
|
|
123
|
+
message.text = text
|
|
124
|
+
else:
|
|
125
|
+
message = Message(text=text)
|
|
126
|
+
|
|
127
|
+
# Set message properties
|
|
128
|
+
message.sender = self.sender
|
|
129
|
+
message.sender_name = self.sender_name
|
|
130
|
+
message.session_id = self.session_id or self.graph.session_id or ""
|
|
131
|
+
message.context_id = self.context_id
|
|
132
|
+
message.flow_id = self.graph.flow_id if hasattr(self, "graph") else None
|
|
133
|
+
message.properties.source = self._build_source(source_id, display_name, source)
|
|
134
|
+
|
|
135
|
+
# Store message if needed
|
|
136
|
+
if message.session_id and self.should_store_message:
|
|
137
|
+
stored_message = await self.send_message(message)
|
|
138
|
+
self.message.value = stored_message
|
|
139
|
+
message = stored_message
|
|
140
|
+
|
|
141
|
+
self.status = message
|
|
142
|
+
return message
|
|
143
|
+
|
|
144
|
+
def _serialize_data(self, data: Data) -> str:
|
|
145
|
+
"""Serialize Data object to JSON string."""
|
|
146
|
+
# Convert data.data to JSON-serializable format
|
|
147
|
+
serializable_data = jsonable_encoder(data.data)
|
|
148
|
+
# Serialize with orjson, enabling pretty printing with indentation
|
|
149
|
+
json_bytes = orjson.dumps(serializable_data, option=orjson.OPT_INDENT_2)
|
|
150
|
+
# Convert bytes to string and wrap in Markdown code blocks
|
|
151
|
+
return "```json\n" + json_bytes.decode("utf-8") + "\n```"
|
|
152
|
+
|
|
153
|
+
def _validate_input(self) -> None:
|
|
154
|
+
"""Validate the input data and raise ValueError if invalid."""
|
|
155
|
+
if self.input_value is None:
|
|
156
|
+
msg = "Input data cannot be None"
|
|
157
|
+
raise ValueError(msg)
|
|
158
|
+
if isinstance(self.input_value, list) and not all(
|
|
159
|
+
isinstance(item, Message | Data | DataFrame | str) for item in self.input_value
|
|
160
|
+
):
|
|
161
|
+
invalid_types = [
|
|
162
|
+
type(item).__name__
|
|
163
|
+
for item in self.input_value
|
|
164
|
+
if not isinstance(item, Message | Data | DataFrame | str)
|
|
165
|
+
]
|
|
166
|
+
msg = f"Expected Data or DataFrame or Message or str, got {invalid_types}"
|
|
167
|
+
raise TypeError(msg)
|
|
168
|
+
if not isinstance(
|
|
169
|
+
self.input_value,
|
|
170
|
+
Message | Data | DataFrame | str | list | Generator | type(None),
|
|
171
|
+
):
|
|
172
|
+
type_name = type(self.input_value).__name__
|
|
173
|
+
msg = f"Expected Data or DataFrame or Message or str, Generator or None, got {type_name}"
|
|
174
|
+
raise TypeError(msg)
|
|
175
|
+
|
|
176
|
+
def convert_to_string(self) -> str | Generator[Any, None, None]:
|
|
177
|
+
"""Convert input data to string with proper error handling."""
|
|
178
|
+
self._validate_input()
|
|
179
|
+
if isinstance(self.input_value, list):
|
|
180
|
+
clean_data: bool = getattr(self, "clean_data", False)
|
|
181
|
+
return "\n".join([safe_convert(item, clean_data=clean_data) for item in self.input_value])
|
|
182
|
+
if isinstance(self.input_value, Generator):
|
|
183
|
+
return self.input_value
|
|
184
|
+
return safe_convert(self.input_value)
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
from lfx.base.io.text import TextComponent
|
|
2
|
+
from lfx.io import MultilineInput, Output
|
|
3
|
+
from lfx.schema.message import Message
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class TextInputComponent(TextComponent):
|
|
7
|
+
display_name = "Text Input"
|
|
8
|
+
description = "Get user text inputs."
|
|
9
|
+
documentation: str = "https://docs.langflow.org/text-input-and-output"
|
|
10
|
+
icon = "type"
|
|
11
|
+
name = "TextInput"
|
|
12
|
+
|
|
13
|
+
inputs = [
|
|
14
|
+
MultilineInput(
|
|
15
|
+
name="input_value",
|
|
16
|
+
display_name="Text",
|
|
17
|
+
info="Text to be passed as input.",
|
|
18
|
+
),
|
|
19
|
+
]
|
|
20
|
+
outputs = [
|
|
21
|
+
Output(display_name="Output Text", name="text", method="text_response"),
|
|
22
|
+
]
|
|
23
|
+
|
|
24
|
+
def text_response(self) -> Message:
|
|
25
|
+
return Message(
|
|
26
|
+
text=self.input_value,
|
|
27
|
+
)
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
from lfx.base.io.text import TextComponent
|
|
2
|
+
from lfx.io import MultilineInput, Output
|
|
3
|
+
from lfx.schema.message import Message
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class TextOutputComponent(TextComponent):
|
|
7
|
+
display_name = "Text Output"
|
|
8
|
+
description = "Sends text output via API."
|
|
9
|
+
documentation: str = "https://docs.langflow.org/text-input-and-output"
|
|
10
|
+
icon = "type"
|
|
11
|
+
name = "TextOutput"
|
|
12
|
+
|
|
13
|
+
inputs = [
|
|
14
|
+
MultilineInput(
|
|
15
|
+
name="input_value",
|
|
16
|
+
display_name="Inputs",
|
|
17
|
+
info="Text to be passed as output.",
|
|
18
|
+
),
|
|
19
|
+
]
|
|
20
|
+
outputs = [
|
|
21
|
+
Output(display_name="Output Text", name="text", method="text_response"),
|
|
22
|
+
]
|
|
23
|
+
|
|
24
|
+
def text_response(self) -> Message:
|
|
25
|
+
message = Message(
|
|
26
|
+
text=self.input_value,
|
|
27
|
+
)
|
|
28
|
+
self.status = self.input_value
|
|
29
|
+
return message
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import json
|
|
2
|
+
|
|
3
|
+
from lfx.custom.custom_component.component import Component
|
|
4
|
+
from lfx.io import MultilineInput, Output
|
|
5
|
+
from lfx.schema.data import Data
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class WebhookComponent(Component):
|
|
9
|
+
display_name = "Webhook"
|
|
10
|
+
documentation: str = "https://docs.langflow.org/component-webhook"
|
|
11
|
+
name = "Webhook"
|
|
12
|
+
icon = "webhook"
|
|
13
|
+
|
|
14
|
+
inputs = [
|
|
15
|
+
MultilineInput(
|
|
16
|
+
name="data",
|
|
17
|
+
display_name="Payload",
|
|
18
|
+
info="Receives a payload from external systems via HTTP POST.",
|
|
19
|
+
advanced=True,
|
|
20
|
+
),
|
|
21
|
+
MultilineInput(
|
|
22
|
+
name="curl",
|
|
23
|
+
display_name="cURL",
|
|
24
|
+
value="CURL_WEBHOOK",
|
|
25
|
+
advanced=True,
|
|
26
|
+
input_types=[],
|
|
27
|
+
),
|
|
28
|
+
MultilineInput(
|
|
29
|
+
name="endpoint",
|
|
30
|
+
display_name="Endpoint",
|
|
31
|
+
value="BACKEND_URL",
|
|
32
|
+
advanced=False,
|
|
33
|
+
copy_field=True,
|
|
34
|
+
input_types=[],
|
|
35
|
+
),
|
|
36
|
+
]
|
|
37
|
+
outputs = [
|
|
38
|
+
Output(display_name="Data", name="output_data", method="build_data"),
|
|
39
|
+
]
|
|
40
|
+
|
|
41
|
+
def build_data(self) -> Data:
|
|
42
|
+
message: str | Data = ""
|
|
43
|
+
if not self.data:
|
|
44
|
+
self.status = "No data provided."
|
|
45
|
+
return Data(data={})
|
|
46
|
+
try:
|
|
47
|
+
my_data = self.data.replace('"\n"', '"\\n"')
|
|
48
|
+
body = json.loads(my_data or "{}")
|
|
49
|
+
except json.JSONDecodeError:
|
|
50
|
+
body = {"payload": self.data}
|
|
51
|
+
message = f"Invalid JSON payload. Please check the format.\n\n{self.data}"
|
|
52
|
+
data = Data(data=body)
|
|
53
|
+
if not message:
|
|
54
|
+
message = data
|
|
55
|
+
self.status = message
|
|
56
|
+
return data
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
from .ai_scrape import JigsawStackAIScraperComponent
|
|
2
|
+
from .ai_web_search import JigsawStackAIWebSearchComponent
|
|
3
|
+
from .file_read import JigsawStackFileReadComponent
|
|
4
|
+
from .file_upload import JigsawStackFileUploadComponent
|
|
5
|
+
from .image_generation import JigsawStackImageGenerationComponent
|
|
6
|
+
from .nsfw import JigsawStackNSFWComponent
|
|
7
|
+
from .object_detection import JigsawStackObjectDetectionComponent
|
|
8
|
+
from .sentiment import JigsawStackSentimentComponent
|
|
9
|
+
from .text_to_sql import JigsawStackTextToSQLComponent
|
|
10
|
+
from .vocr import JigsawStackVOCRComponent
|
|
11
|
+
|
|
12
|
+
__all__ = [
|
|
13
|
+
"JigsawStackAIScraperComponent",
|
|
14
|
+
"JigsawStackAIWebSearchComponent",
|
|
15
|
+
"JigsawStackFileReadComponent",
|
|
16
|
+
"JigsawStackFileUploadComponent",
|
|
17
|
+
"JigsawStackImageGenerationComponent",
|
|
18
|
+
"JigsawStackNSFWComponent",
|
|
19
|
+
"JigsawStackObjectDetectionComponent",
|
|
20
|
+
"JigsawStackSentimentComponent",
|
|
21
|
+
"JigsawStackTextToSQLComponent",
|
|
22
|
+
"JigsawStackVOCRComponent",
|
|
23
|
+
]
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
from lfx.custom.custom_component.component import Component
|
|
2
|
+
from lfx.io import MessageTextInput, Output, SecretStrInput
|
|
3
|
+
from lfx.schema.data import Data
|
|
4
|
+
|
|
5
|
+
MAX_ELEMENT_PROMPTS = 5
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class JigsawStackAIScraperComponent(Component):
|
|
9
|
+
display_name = "AI Scraper"
|
|
10
|
+
description = "Scrape any website instantly and get consistent structured data \
|
|
11
|
+
in seconds without writing any css selector code"
|
|
12
|
+
documentation = "https://jigsawstack.com/docs/api-reference/ai/scrape"
|
|
13
|
+
icon = "JigsawStack"
|
|
14
|
+
name = "JigsawStackAIScraper"
|
|
15
|
+
|
|
16
|
+
inputs = [
|
|
17
|
+
SecretStrInput(
|
|
18
|
+
name="api_key",
|
|
19
|
+
display_name="JigsawStack API Key",
|
|
20
|
+
info="Your JigsawStack API key for authentication",
|
|
21
|
+
required=True,
|
|
22
|
+
),
|
|
23
|
+
MessageTextInput(
|
|
24
|
+
name="url",
|
|
25
|
+
display_name="URL",
|
|
26
|
+
info="URL of the page to scrape. Either url or html is required, but not both.",
|
|
27
|
+
required=False,
|
|
28
|
+
tool_mode=True,
|
|
29
|
+
),
|
|
30
|
+
MessageTextInput(
|
|
31
|
+
name="html",
|
|
32
|
+
display_name="HTML",
|
|
33
|
+
info="HTML content to scrape. Either url or html is required, but not both.",
|
|
34
|
+
required=False,
|
|
35
|
+
tool_mode=True,
|
|
36
|
+
),
|
|
37
|
+
MessageTextInput(
|
|
38
|
+
name="element_prompts",
|
|
39
|
+
display_name="Element Prompts",
|
|
40
|
+
info="Items on the page to be scraped (maximum 5). E.g. 'Plan price', 'Plan title'",
|
|
41
|
+
required=True,
|
|
42
|
+
tool_mode=True,
|
|
43
|
+
),
|
|
44
|
+
MessageTextInput(
|
|
45
|
+
name="root_element_selector",
|
|
46
|
+
display_name="Root Element Selector",
|
|
47
|
+
info="CSS selector to limit the scope of scraping to a specific element and its children",
|
|
48
|
+
required=False,
|
|
49
|
+
value="main",
|
|
50
|
+
),
|
|
51
|
+
]
|
|
52
|
+
|
|
53
|
+
outputs = [
|
|
54
|
+
Output(display_name="AI Scraper Results", name="scrape_results", method="scrape"),
|
|
55
|
+
]
|
|
56
|
+
|
|
57
|
+
def scrape(self) -> Data:
|
|
58
|
+
try:
|
|
59
|
+
from jigsawstack import JigsawStack, JigsawStackError
|
|
60
|
+
except ImportError as e:
|
|
61
|
+
jigsawstack_import_error = (
|
|
62
|
+
"JigsawStack package not found. Please install it using: pip install jigsawstack>=0.2.7"
|
|
63
|
+
)
|
|
64
|
+
raise ImportError(jigsawstack_import_error) from e
|
|
65
|
+
|
|
66
|
+
try:
|
|
67
|
+
client = JigsawStack(api_key=self.api_key)
|
|
68
|
+
|
|
69
|
+
# Build request object
|
|
70
|
+
scrape_params: dict = {}
|
|
71
|
+
if self.url:
|
|
72
|
+
scrape_params["url"] = self.url
|
|
73
|
+
if self.html:
|
|
74
|
+
scrape_params["html"] = self.html
|
|
75
|
+
|
|
76
|
+
url_value = scrape_params.get("url", "")
|
|
77
|
+
html_value = scrape_params.get("html", "")
|
|
78
|
+
if (not url_value or not url_value.strip()) and (not html_value or not html_value.strip()):
|
|
79
|
+
url_or_html_error = "Either 'url' or 'html' must be provided for scraping"
|
|
80
|
+
raise ValueError(url_or_html_error)
|
|
81
|
+
|
|
82
|
+
# Process element_prompts with proper type handling
|
|
83
|
+
element_prompts_list: list[str] = []
|
|
84
|
+
if self.element_prompts:
|
|
85
|
+
element_prompts_value: str | list[str] = self.element_prompts
|
|
86
|
+
|
|
87
|
+
if isinstance(element_prompts_value, str):
|
|
88
|
+
if "," not in element_prompts_value:
|
|
89
|
+
element_prompts_list = [element_prompts_value]
|
|
90
|
+
else:
|
|
91
|
+
element_prompts_list = element_prompts_value.split(",")
|
|
92
|
+
elif isinstance(element_prompts_value, list):
|
|
93
|
+
element_prompts_list = element_prompts_value
|
|
94
|
+
else:
|
|
95
|
+
# Fallback for other types
|
|
96
|
+
element_prompts_list = str(element_prompts_value).split(",")
|
|
97
|
+
|
|
98
|
+
if len(element_prompts_list) > MAX_ELEMENT_PROMPTS:
|
|
99
|
+
max_elements_error = "Maximum of 5 element prompts allowed"
|
|
100
|
+
raise ValueError(max_elements_error)
|
|
101
|
+
if len(element_prompts_list) == 0:
|
|
102
|
+
invalid_elements_error = "Element prompts cannot be empty"
|
|
103
|
+
raise ValueError(invalid_elements_error)
|
|
104
|
+
|
|
105
|
+
scrape_params["element_prompts"] = element_prompts_list
|
|
106
|
+
|
|
107
|
+
if self.root_element_selector:
|
|
108
|
+
scrape_params["root_element_selector"] = self.root_element_selector
|
|
109
|
+
|
|
110
|
+
# Call web scraping
|
|
111
|
+
response = client.web.ai_scrape(scrape_params)
|
|
112
|
+
|
|
113
|
+
if not response.get("success", False):
|
|
114
|
+
fail_error = "JigsawStack API request failed."
|
|
115
|
+
raise ValueError(fail_error)
|
|
116
|
+
|
|
117
|
+
result_data = response
|
|
118
|
+
|
|
119
|
+
self.status = "AI scrape process is now complete."
|
|
120
|
+
|
|
121
|
+
return Data(data=result_data)
|
|
122
|
+
|
|
123
|
+
except JigsawStackError as e:
|
|
124
|
+
error_data = {"error": str(e), "success": False}
|
|
125
|
+
self.status = f"Error: {e!s}"
|
|
126
|
+
return Data(data=error_data)
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
from lfx.custom.custom_component.component import Component
|
|
2
|
+
from lfx.io import BoolInput, DropdownInput, Output, QueryInput, SecretStrInput
|
|
3
|
+
from lfx.schema.data import Data
|
|
4
|
+
from lfx.schema.message import Message
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class JigsawStackAIWebSearchComponent(Component):
|
|
8
|
+
display_name = "AI Web Search"
|
|
9
|
+
description = "Effortlessly search the Web and get access to high-quality results powered with AI."
|
|
10
|
+
documentation = "https://jigsawstack.com/docs/api-reference/web/ai-search"
|
|
11
|
+
icon = "JigsawStack"
|
|
12
|
+
name = "JigsawStackAISearch"
|
|
13
|
+
inputs = [
|
|
14
|
+
SecretStrInput(
|
|
15
|
+
name="api_key",
|
|
16
|
+
display_name="JigsawStack API Key",
|
|
17
|
+
info="Your JigsawStack API key for authentication",
|
|
18
|
+
required=True,
|
|
19
|
+
),
|
|
20
|
+
QueryInput(
|
|
21
|
+
name="query",
|
|
22
|
+
display_name="Query",
|
|
23
|
+
info="The search value. The maximum query character length is 400",
|
|
24
|
+
required=True,
|
|
25
|
+
tool_mode=True,
|
|
26
|
+
),
|
|
27
|
+
BoolInput(
|
|
28
|
+
name="ai_overview",
|
|
29
|
+
display_name="AI Overview",
|
|
30
|
+
info="Include AI powered overview in the search results",
|
|
31
|
+
required=False,
|
|
32
|
+
value=True,
|
|
33
|
+
),
|
|
34
|
+
DropdownInput(
|
|
35
|
+
name="safe_search",
|
|
36
|
+
display_name="Safe Search",
|
|
37
|
+
info="Enable safe search to filter out adult content",
|
|
38
|
+
required=False,
|
|
39
|
+
options=["moderate", "strict", "off"],
|
|
40
|
+
value="off",
|
|
41
|
+
),
|
|
42
|
+
BoolInput(
|
|
43
|
+
name="spell_check",
|
|
44
|
+
display_name="Spell Check",
|
|
45
|
+
info="Spell check the search query",
|
|
46
|
+
required=False,
|
|
47
|
+
value=True,
|
|
48
|
+
),
|
|
49
|
+
]
|
|
50
|
+
|
|
51
|
+
outputs = [
|
|
52
|
+
Output(display_name="AI Search Results", name="search_results", method="search"),
|
|
53
|
+
Output(display_name="Content Text", name="content_text", method="get_content_text"),
|
|
54
|
+
]
|
|
55
|
+
|
|
56
|
+
def search(self) -> Data:
|
|
57
|
+
try:
|
|
58
|
+
from jigsawstack import JigsawStack, JigsawStackError
|
|
59
|
+
except ImportError as e:
|
|
60
|
+
jigsawstack_import_error = (
|
|
61
|
+
"JigsawStack package not found. Please install it using: pip install jigsawstack>=0.2.7"
|
|
62
|
+
)
|
|
63
|
+
raise ImportError(jigsawstack_import_error) from e
|
|
64
|
+
|
|
65
|
+
try:
|
|
66
|
+
client = JigsawStack(api_key=self.api_key)
|
|
67
|
+
|
|
68
|
+
# build request object
|
|
69
|
+
search_params = {}
|
|
70
|
+
if self.query:
|
|
71
|
+
search_params["query"] = self.query
|
|
72
|
+
if self.ai_overview is not None:
|
|
73
|
+
search_params["ai_overview"] = self.ai_overview
|
|
74
|
+
if self.safe_search:
|
|
75
|
+
search_params["safe_search"] = self.safe_search
|
|
76
|
+
if self.spell_check is not None:
|
|
77
|
+
search_params["spell_check"] = self.spell_check
|
|
78
|
+
|
|
79
|
+
# Call web scraping
|
|
80
|
+
response = client.web.search(search_params)
|
|
81
|
+
|
|
82
|
+
api_error_msg = "JigsawStack API returned unsuccessful response"
|
|
83
|
+
if not response.get("success", False):
|
|
84
|
+
raise ValueError(api_error_msg)
|
|
85
|
+
|
|
86
|
+
# Create comprehensive data object
|
|
87
|
+
result_data = {
|
|
88
|
+
"query": self.query,
|
|
89
|
+
"ai_overview": response.get("ai_overview", ""),
|
|
90
|
+
"spell_fixed": response.get("spell_fixed", False),
|
|
91
|
+
"is_safe": response.get("is_safe", True),
|
|
92
|
+
"results": response.get("results", []),
|
|
93
|
+
"success": True,
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
self.status = f"Search complete for: {response.get('query', '')}"
|
|
97
|
+
|
|
98
|
+
return Data(data=result_data)
|
|
99
|
+
|
|
100
|
+
except JigsawStackError as e:
|
|
101
|
+
error_data = {"error": str(e), "success": False}
|
|
102
|
+
self.status = f"Error: {e!s}"
|
|
103
|
+
return Data(data=error_data)
|
|
104
|
+
|
|
105
|
+
def get_content_text(self) -> Message:
|
|
106
|
+
try:
|
|
107
|
+
from jigsawstack import JigsawStack, JigsawStackError
|
|
108
|
+
except ImportError:
|
|
109
|
+
return Message(text="Error: JigsawStack package not found.")
|
|
110
|
+
|
|
111
|
+
try:
|
|
112
|
+
# Initialize JigsawStack client
|
|
113
|
+
client = JigsawStack(api_key=self.api_key)
|
|
114
|
+
search_params = {}
|
|
115
|
+
if self.query:
|
|
116
|
+
search_params["query"] = self.query
|
|
117
|
+
if self.ai_overview is not None:
|
|
118
|
+
search_params["ai_overview"] = self.ai_overview
|
|
119
|
+
if self.safe_search:
|
|
120
|
+
search_params["safe_search"] = self.safe_search
|
|
121
|
+
if self.spell_check is not None:
|
|
122
|
+
search_params["spell_check"] = self.spell_check
|
|
123
|
+
|
|
124
|
+
# Call web scraping
|
|
125
|
+
response = client.web.search(search_params)
|
|
126
|
+
|
|
127
|
+
request_failed_msg = "Request Failed"
|
|
128
|
+
if not response.get("success", False):
|
|
129
|
+
raise JigsawStackError(request_failed_msg)
|
|
130
|
+
|
|
131
|
+
# Return the content as text
|
|
132
|
+
content = response.get("ai_overview", "")
|
|
133
|
+
return Message(text=content)
|
|
134
|
+
|
|
135
|
+
except JigsawStackError as e:
|
|
136
|
+
return Message(text=f"Error while using AI Search: {e!s}")
|