lfx-nightly 0.1.11.dev0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- lfx/__init__.py +0 -0
- lfx/__main__.py +25 -0
- lfx/base/__init__.py +0 -0
- lfx/base/agents/__init__.py +0 -0
- lfx/base/agents/agent.py +268 -0
- lfx/base/agents/callback.py +130 -0
- lfx/base/agents/context.py +109 -0
- lfx/base/agents/crewai/__init__.py +0 -0
- lfx/base/agents/crewai/crew.py +231 -0
- lfx/base/agents/crewai/tasks.py +12 -0
- lfx/base/agents/default_prompts.py +23 -0
- lfx/base/agents/errors.py +15 -0
- lfx/base/agents/events.py +346 -0
- lfx/base/agents/utils.py +205 -0
- lfx/base/astra_assistants/__init__.py +0 -0
- lfx/base/astra_assistants/util.py +171 -0
- lfx/base/chains/__init__.py +0 -0
- lfx/base/chains/model.py +19 -0
- lfx/base/composio/__init__.py +0 -0
- lfx/base/composio/composio_base.py +1291 -0
- lfx/base/compressors/__init__.py +0 -0
- lfx/base/compressors/model.py +60 -0
- lfx/base/constants.py +46 -0
- lfx/base/curl/__init__.py +0 -0
- lfx/base/curl/parse.py +188 -0
- lfx/base/data/__init__.py +5 -0
- lfx/base/data/base_file.py +685 -0
- lfx/base/data/docling_utils.py +245 -0
- lfx/base/data/utils.py +198 -0
- lfx/base/document_transformers/__init__.py +0 -0
- lfx/base/document_transformers/model.py +43 -0
- lfx/base/embeddings/__init__.py +0 -0
- lfx/base/embeddings/aiml_embeddings.py +62 -0
- lfx/base/embeddings/model.py +26 -0
- lfx/base/flow_processing/__init__.py +0 -0
- lfx/base/flow_processing/utils.py +86 -0
- lfx/base/huggingface/__init__.py +0 -0
- lfx/base/huggingface/model_bridge.py +133 -0
- lfx/base/io/__init__.py +0 -0
- lfx/base/io/chat.py +20 -0
- lfx/base/io/text.py +22 -0
- lfx/base/langchain_utilities/__init__.py +0 -0
- lfx/base/langchain_utilities/model.py +35 -0
- lfx/base/langchain_utilities/spider_constants.py +1 -0
- lfx/base/langwatch/__init__.py +0 -0
- lfx/base/langwatch/utils.py +18 -0
- lfx/base/mcp/__init__.py +0 -0
- lfx/base/mcp/constants.py +2 -0
- lfx/base/mcp/util.py +1398 -0
- lfx/base/memory/__init__.py +0 -0
- lfx/base/memory/memory.py +49 -0
- lfx/base/memory/model.py +38 -0
- lfx/base/models/__init__.py +3 -0
- lfx/base/models/aiml_constants.py +51 -0
- lfx/base/models/anthropic_constants.py +47 -0
- lfx/base/models/aws_constants.py +151 -0
- lfx/base/models/chat_result.py +76 -0
- lfx/base/models/google_generative_ai_constants.py +70 -0
- lfx/base/models/groq_constants.py +134 -0
- lfx/base/models/model.py +375 -0
- lfx/base/models/model_input_constants.py +307 -0
- lfx/base/models/model_metadata.py +41 -0
- lfx/base/models/model_utils.py +8 -0
- lfx/base/models/novita_constants.py +35 -0
- lfx/base/models/ollama_constants.py +49 -0
- lfx/base/models/openai_constants.py +122 -0
- lfx/base/models/sambanova_constants.py +18 -0
- lfx/base/processing/__init__.py +0 -0
- lfx/base/prompts/__init__.py +0 -0
- lfx/base/prompts/api_utils.py +224 -0
- lfx/base/prompts/utils.py +61 -0
- lfx/base/textsplitters/__init__.py +0 -0
- lfx/base/textsplitters/model.py +28 -0
- lfx/base/tools/__init__.py +0 -0
- lfx/base/tools/base.py +26 -0
- lfx/base/tools/component_tool.py +325 -0
- lfx/base/tools/constants.py +49 -0
- lfx/base/tools/flow_tool.py +132 -0
- lfx/base/tools/run_flow.py +224 -0
- lfx/base/vectorstores/__init__.py +0 -0
- lfx/base/vectorstores/model.py +193 -0
- lfx/base/vectorstores/utils.py +22 -0
- lfx/base/vectorstores/vector_store_connection_decorator.py +52 -0
- lfx/cli/__init__.py +5 -0
- lfx/cli/commands.py +319 -0
- lfx/cli/common.py +650 -0
- lfx/cli/run.py +441 -0
- lfx/cli/script_loader.py +247 -0
- lfx/cli/serve_app.py +546 -0
- lfx/cli/validation.py +69 -0
- lfx/components/FAISS/__init__.py +34 -0
- lfx/components/FAISS/faiss.py +111 -0
- lfx/components/Notion/__init__.py +19 -0
- lfx/components/Notion/add_content_to_page.py +269 -0
- lfx/components/Notion/create_page.py +94 -0
- lfx/components/Notion/list_database_properties.py +68 -0
- lfx/components/Notion/list_pages.py +122 -0
- lfx/components/Notion/list_users.py +77 -0
- lfx/components/Notion/page_content_viewer.py +93 -0
- lfx/components/Notion/search.py +111 -0
- lfx/components/Notion/update_page_property.py +114 -0
- lfx/components/__init__.py +411 -0
- lfx/components/_importing.py +42 -0
- lfx/components/agentql/__init__.py +3 -0
- lfx/components/agentql/agentql_api.py +151 -0
- lfx/components/agents/__init__.py +34 -0
- lfx/components/agents/agent.py +558 -0
- lfx/components/agents/mcp_component.py +501 -0
- lfx/components/aiml/__init__.py +37 -0
- lfx/components/aiml/aiml.py +112 -0
- lfx/components/aiml/aiml_embeddings.py +37 -0
- lfx/components/amazon/__init__.py +36 -0
- lfx/components/amazon/amazon_bedrock_embedding.py +109 -0
- lfx/components/amazon/amazon_bedrock_model.py +124 -0
- lfx/components/amazon/s3_bucket_uploader.py +211 -0
- lfx/components/anthropic/__init__.py +34 -0
- lfx/components/anthropic/anthropic.py +187 -0
- lfx/components/apify/__init__.py +5 -0
- lfx/components/apify/apify_actor.py +325 -0
- lfx/components/arxiv/__init__.py +3 -0
- lfx/components/arxiv/arxiv.py +163 -0
- lfx/components/assemblyai/__init__.py +46 -0
- lfx/components/assemblyai/assemblyai_get_subtitles.py +83 -0
- lfx/components/assemblyai/assemblyai_lemur.py +183 -0
- lfx/components/assemblyai/assemblyai_list_transcripts.py +95 -0
- lfx/components/assemblyai/assemblyai_poll_transcript.py +72 -0
- lfx/components/assemblyai/assemblyai_start_transcript.py +188 -0
- lfx/components/azure/__init__.py +37 -0
- lfx/components/azure/azure_openai.py +95 -0
- lfx/components/azure/azure_openai_embeddings.py +83 -0
- lfx/components/baidu/__init__.py +32 -0
- lfx/components/baidu/baidu_qianfan_chat.py +113 -0
- lfx/components/bing/__init__.py +3 -0
- lfx/components/bing/bing_search_api.py +61 -0
- lfx/components/cassandra/__init__.py +40 -0
- lfx/components/cassandra/cassandra.py +264 -0
- lfx/components/cassandra/cassandra_chat.py +92 -0
- lfx/components/cassandra/cassandra_graph.py +238 -0
- lfx/components/chains/__init__.py +3 -0
- lfx/components/chroma/__init__.py +34 -0
- lfx/components/chroma/chroma.py +167 -0
- lfx/components/cleanlab/__init__.py +40 -0
- lfx/components/cleanlab/cleanlab_evaluator.py +155 -0
- lfx/components/cleanlab/cleanlab_rag_evaluator.py +254 -0
- lfx/components/cleanlab/cleanlab_remediator.py +131 -0
- lfx/components/clickhouse/__init__.py +34 -0
- lfx/components/clickhouse/clickhouse.py +135 -0
- lfx/components/cloudflare/__init__.py +32 -0
- lfx/components/cloudflare/cloudflare.py +81 -0
- lfx/components/cohere/__init__.py +40 -0
- lfx/components/cohere/cohere_embeddings.py +81 -0
- lfx/components/cohere/cohere_models.py +46 -0
- lfx/components/cohere/cohere_rerank.py +51 -0
- lfx/components/composio/__init__.py +74 -0
- lfx/components/composio/composio_api.py +268 -0
- lfx/components/composio/dropbox_compnent.py +11 -0
- lfx/components/composio/github_composio.py +11 -0
- lfx/components/composio/gmail_composio.py +38 -0
- lfx/components/composio/googlecalendar_composio.py +11 -0
- lfx/components/composio/googlemeet_composio.py +11 -0
- lfx/components/composio/googletasks_composio.py +8 -0
- lfx/components/composio/linear_composio.py +11 -0
- lfx/components/composio/outlook_composio.py +11 -0
- lfx/components/composio/reddit_composio.py +11 -0
- lfx/components/composio/slack_composio.py +582 -0
- lfx/components/composio/slackbot_composio.py +11 -0
- lfx/components/composio/supabase_composio.py +11 -0
- lfx/components/composio/todoist_composio.py +11 -0
- lfx/components/composio/youtube_composio.py +11 -0
- lfx/components/confluence/__init__.py +3 -0
- lfx/components/confluence/confluence.py +84 -0
- lfx/components/couchbase/__init__.py +34 -0
- lfx/components/couchbase/couchbase.py +102 -0
- lfx/components/crewai/__init__.py +49 -0
- lfx/components/crewai/crewai.py +107 -0
- lfx/components/crewai/hierarchical_crew.py +46 -0
- lfx/components/crewai/hierarchical_task.py +44 -0
- lfx/components/crewai/sequential_crew.py +52 -0
- lfx/components/crewai/sequential_task.py +73 -0
- lfx/components/crewai/sequential_task_agent.py +143 -0
- lfx/components/custom_component/__init__.py +34 -0
- lfx/components/custom_component/custom_component.py +31 -0
- lfx/components/data/__init__.py +64 -0
- lfx/components/data/api_request.py +544 -0
- lfx/components/data/csv_to_data.py +95 -0
- lfx/components/data/directory.py +113 -0
- lfx/components/data/file.py +577 -0
- lfx/components/data/json_to_data.py +98 -0
- lfx/components/data/news_search.py +164 -0
- lfx/components/data/rss.py +69 -0
- lfx/components/data/sql_executor.py +101 -0
- lfx/components/data/url.py +311 -0
- lfx/components/data/web_search.py +112 -0
- lfx/components/data/webhook.py +56 -0
- lfx/components/datastax/__init__.py +70 -0
- lfx/components/datastax/astra_assistant_manager.py +306 -0
- lfx/components/datastax/astra_db.py +75 -0
- lfx/components/datastax/astra_vectorize.py +124 -0
- lfx/components/datastax/astradb.py +1285 -0
- lfx/components/datastax/astradb_cql.py +314 -0
- lfx/components/datastax/astradb_graph.py +330 -0
- lfx/components/datastax/astradb_tool.py +414 -0
- lfx/components/datastax/astradb_vectorstore.py +1285 -0
- lfx/components/datastax/cassandra.py +92 -0
- lfx/components/datastax/create_assistant.py +58 -0
- lfx/components/datastax/create_thread.py +32 -0
- lfx/components/datastax/dotenv.py +35 -0
- lfx/components/datastax/get_assistant.py +37 -0
- lfx/components/datastax/getenvvar.py +30 -0
- lfx/components/datastax/graph_rag.py +141 -0
- lfx/components/datastax/hcd.py +314 -0
- lfx/components/datastax/list_assistants.py +25 -0
- lfx/components/datastax/run.py +89 -0
- lfx/components/deactivated/__init__.py +15 -0
- lfx/components/deactivated/amazon_kendra.py +66 -0
- lfx/components/deactivated/chat_litellm_model.py +158 -0
- lfx/components/deactivated/code_block_extractor.py +26 -0
- lfx/components/deactivated/documents_to_data.py +22 -0
- lfx/components/deactivated/embed.py +16 -0
- lfx/components/deactivated/extract_key_from_data.py +46 -0
- lfx/components/deactivated/json_document_builder.py +57 -0
- lfx/components/deactivated/list_flows.py +20 -0
- lfx/components/deactivated/mcp_sse.py +61 -0
- lfx/components/deactivated/mcp_stdio.py +62 -0
- lfx/components/deactivated/merge_data.py +93 -0
- lfx/components/deactivated/message.py +37 -0
- lfx/components/deactivated/metal.py +54 -0
- lfx/components/deactivated/multi_query.py +59 -0
- lfx/components/deactivated/retriever.py +43 -0
- lfx/components/deactivated/selective_passthrough.py +77 -0
- lfx/components/deactivated/should_run_next.py +40 -0
- lfx/components/deactivated/split_text.py +63 -0
- lfx/components/deactivated/store_message.py +24 -0
- lfx/components/deactivated/sub_flow.py +124 -0
- lfx/components/deactivated/vectara_self_query.py +76 -0
- lfx/components/deactivated/vector_store.py +24 -0
- lfx/components/deepseek/__init__.py +34 -0
- lfx/components/deepseek/deepseek.py +136 -0
- lfx/components/docling/__init__.py +43 -0
- lfx/components/docling/chunk_docling_document.py +186 -0
- lfx/components/docling/docling_inline.py +231 -0
- lfx/components/docling/docling_remote.py +193 -0
- lfx/components/docling/export_docling_document.py +117 -0
- lfx/components/documentloaders/__init__.py +3 -0
- lfx/components/duckduckgo/__init__.py +3 -0
- lfx/components/duckduckgo/duck_duck_go_search_run.py +92 -0
- lfx/components/elastic/__init__.py +37 -0
- lfx/components/elastic/elasticsearch.py +267 -0
- lfx/components/elastic/opensearch.py +243 -0
- lfx/components/embeddings/__init__.py +37 -0
- lfx/components/embeddings/similarity.py +76 -0
- lfx/components/embeddings/text_embedder.py +64 -0
- lfx/components/exa/__init__.py +3 -0
- lfx/components/exa/exa_search.py +68 -0
- lfx/components/firecrawl/__init__.py +43 -0
- lfx/components/firecrawl/firecrawl_crawl_api.py +88 -0
- lfx/components/firecrawl/firecrawl_extract_api.py +136 -0
- lfx/components/firecrawl/firecrawl_map_api.py +89 -0
- lfx/components/firecrawl/firecrawl_scrape_api.py +73 -0
- lfx/components/git/__init__.py +4 -0
- lfx/components/git/git.py +262 -0
- lfx/components/git/gitextractor.py +196 -0
- lfx/components/glean/__init__.py +3 -0
- lfx/components/glean/glean_search_api.py +173 -0
- lfx/components/google/__init__.py +17 -0
- lfx/components/google/gmail.py +192 -0
- lfx/components/google/google_bq_sql_executor.py +157 -0
- lfx/components/google/google_drive.py +92 -0
- lfx/components/google/google_drive_search.py +152 -0
- lfx/components/google/google_generative_ai.py +147 -0
- lfx/components/google/google_generative_ai_embeddings.py +141 -0
- lfx/components/google/google_oauth_token.py +89 -0
- lfx/components/google/google_search_api_core.py +68 -0
- lfx/components/google/google_serper_api_core.py +74 -0
- lfx/components/groq/__init__.py +34 -0
- lfx/components/groq/groq.py +136 -0
- lfx/components/helpers/__init__.py +52 -0
- lfx/components/helpers/calculator_core.py +89 -0
- lfx/components/helpers/create_list.py +40 -0
- lfx/components/helpers/current_date.py +42 -0
- lfx/components/helpers/id_generator.py +42 -0
- lfx/components/helpers/memory.py +251 -0
- lfx/components/helpers/output_parser.py +45 -0
- lfx/components/helpers/store_message.py +90 -0
- lfx/components/homeassistant/__init__.py +7 -0
- lfx/components/homeassistant/home_assistant_control.py +152 -0
- lfx/components/homeassistant/list_home_assistant_states.py +137 -0
- lfx/components/huggingface/__init__.py +37 -0
- lfx/components/huggingface/huggingface.py +197 -0
- lfx/components/huggingface/huggingface_inference_api.py +106 -0
- lfx/components/ibm/__init__.py +34 -0
- lfx/components/ibm/watsonx.py +203 -0
- lfx/components/ibm/watsonx_embeddings.py +135 -0
- lfx/components/icosacomputing/__init__.py +5 -0
- lfx/components/icosacomputing/combinatorial_reasoner.py +84 -0
- lfx/components/input_output/__init__.py +38 -0
- lfx/components/input_output/chat.py +120 -0
- lfx/components/input_output/chat_output.py +200 -0
- lfx/components/input_output/text.py +27 -0
- lfx/components/input_output/text_output.py +29 -0
- lfx/components/jigsawstack/__init__.py +23 -0
- lfx/components/jigsawstack/ai_scrape.py +126 -0
- lfx/components/jigsawstack/ai_web_search.py +136 -0
- lfx/components/jigsawstack/file_read.py +115 -0
- lfx/components/jigsawstack/file_upload.py +94 -0
- lfx/components/jigsawstack/image_generation.py +205 -0
- lfx/components/jigsawstack/nsfw.py +60 -0
- lfx/components/jigsawstack/object_detection.py +124 -0
- lfx/components/jigsawstack/sentiment.py +112 -0
- lfx/components/jigsawstack/text_to_sql.py +90 -0
- lfx/components/jigsawstack/text_translate.py +77 -0
- lfx/components/jigsawstack/vocr.py +107 -0
- lfx/components/langchain_utilities/__init__.py +109 -0
- lfx/components/langchain_utilities/character.py +53 -0
- lfx/components/langchain_utilities/conversation.py +59 -0
- lfx/components/langchain_utilities/csv_agent.py +107 -0
- lfx/components/langchain_utilities/fake_embeddings.py +26 -0
- lfx/components/langchain_utilities/html_link_extractor.py +35 -0
- lfx/components/langchain_utilities/json_agent.py +45 -0
- lfx/components/langchain_utilities/langchain_hub.py +126 -0
- lfx/components/langchain_utilities/language_recursive.py +49 -0
- lfx/components/langchain_utilities/language_semantic.py +138 -0
- lfx/components/langchain_utilities/llm_checker.py +39 -0
- lfx/components/langchain_utilities/llm_math.py +42 -0
- lfx/components/langchain_utilities/natural_language.py +61 -0
- lfx/components/langchain_utilities/openai_tools.py +53 -0
- lfx/components/langchain_utilities/openapi.py +48 -0
- lfx/components/langchain_utilities/recursive_character.py +60 -0
- lfx/components/langchain_utilities/retrieval_qa.py +83 -0
- lfx/components/langchain_utilities/runnable_executor.py +137 -0
- lfx/components/langchain_utilities/self_query.py +80 -0
- lfx/components/langchain_utilities/spider.py +142 -0
- lfx/components/langchain_utilities/sql.py +40 -0
- lfx/components/langchain_utilities/sql_database.py +35 -0
- lfx/components/langchain_utilities/sql_generator.py +78 -0
- lfx/components/langchain_utilities/tool_calling.py +59 -0
- lfx/components/langchain_utilities/vector_store_info.py +49 -0
- lfx/components/langchain_utilities/vector_store_router.py +33 -0
- lfx/components/langchain_utilities/xml_agent.py +71 -0
- lfx/components/langwatch/__init__.py +3 -0
- lfx/components/langwatch/langwatch.py +278 -0
- lfx/components/link_extractors/__init__.py +3 -0
- lfx/components/lmstudio/__init__.py +34 -0
- lfx/components/lmstudio/lmstudioembeddings.py +89 -0
- lfx/components/lmstudio/lmstudiomodel.py +129 -0
- lfx/components/logic/__init__.py +52 -0
- lfx/components/logic/conditional_router.py +171 -0
- lfx/components/logic/data_conditional_router.py +125 -0
- lfx/components/logic/flow_tool.py +110 -0
- lfx/components/logic/listen.py +29 -0
- lfx/components/logic/loop.py +125 -0
- lfx/components/logic/notify.py +88 -0
- lfx/components/logic/pass_message.py +35 -0
- lfx/components/logic/run_flow.py +71 -0
- lfx/components/logic/sub_flow.py +114 -0
- lfx/components/maritalk/__init__.py +32 -0
- lfx/components/maritalk/maritalk.py +52 -0
- lfx/components/mem0/__init__.py +3 -0
- lfx/components/mem0/mem0_chat_memory.py +136 -0
- lfx/components/milvus/__init__.py +34 -0
- lfx/components/milvus/milvus.py +115 -0
- lfx/components/mistral/__init__.py +37 -0
- lfx/components/mistral/mistral.py +114 -0
- lfx/components/mistral/mistral_embeddings.py +58 -0
- lfx/components/models/__init__.py +34 -0
- lfx/components/models/embedding_model.py +114 -0
- lfx/components/models/language_model.py +144 -0
- lfx/components/mongodb/__init__.py +34 -0
- lfx/components/mongodb/mongodb_atlas.py +213 -0
- lfx/components/needle/__init__.py +3 -0
- lfx/components/needle/needle.py +104 -0
- lfx/components/notdiamond/__init__.py +34 -0
- lfx/components/notdiamond/notdiamond.py +228 -0
- lfx/components/novita/__init__.py +32 -0
- lfx/components/novita/novita.py +130 -0
- lfx/components/nvidia/__init__.py +57 -0
- lfx/components/nvidia/nvidia.py +157 -0
- lfx/components/nvidia/nvidia_embedding.py +77 -0
- lfx/components/nvidia/nvidia_ingest.py +317 -0
- lfx/components/nvidia/nvidia_rerank.py +63 -0
- lfx/components/nvidia/system_assist.py +65 -0
- lfx/components/olivya/__init__.py +3 -0
- lfx/components/olivya/olivya.py +116 -0
- lfx/components/ollama/__init__.py +37 -0
- lfx/components/ollama/ollama.py +330 -0
- lfx/components/ollama/ollama_embeddings.py +106 -0
- lfx/components/openai/__init__.py +37 -0
- lfx/components/openai/openai.py +100 -0
- lfx/components/openai/openai_chat_model.py +176 -0
- lfx/components/openrouter/__init__.py +32 -0
- lfx/components/openrouter/openrouter.py +202 -0
- lfx/components/output_parsers/__init__.py +3 -0
- lfx/components/perplexity/__init__.py +34 -0
- lfx/components/perplexity/perplexity.py +75 -0
- lfx/components/pgvector/__init__.py +34 -0
- lfx/components/pgvector/pgvector.py +72 -0
- lfx/components/pinecone/__init__.py +34 -0
- lfx/components/pinecone/pinecone.py +134 -0
- lfx/components/processing/__init__.py +117 -0
- lfx/components/processing/alter_metadata.py +108 -0
- lfx/components/processing/batch_run.py +205 -0
- lfx/components/processing/combine_text.py +39 -0
- lfx/components/processing/converter.py +159 -0
- lfx/components/processing/create_data.py +110 -0
- lfx/components/processing/data_operations.py +438 -0
- lfx/components/processing/data_to_dataframe.py +70 -0
- lfx/components/processing/dataframe_operations.py +313 -0
- lfx/components/processing/extract_key.py +53 -0
- lfx/components/processing/filter_data.py +42 -0
- lfx/components/processing/filter_data_values.py +88 -0
- lfx/components/processing/json_cleaner.py +103 -0
- lfx/components/processing/lambda_filter.py +154 -0
- lfx/components/processing/llm_router.py +499 -0
- lfx/components/processing/merge_data.py +90 -0
- lfx/components/processing/message_to_data.py +36 -0
- lfx/components/processing/parse_data.py +70 -0
- lfx/components/processing/parse_dataframe.py +68 -0
- lfx/components/processing/parse_json_data.py +90 -0
- lfx/components/processing/parser.py +143 -0
- lfx/components/processing/prompt.py +67 -0
- lfx/components/processing/python_repl_core.py +98 -0
- lfx/components/processing/regex.py +82 -0
- lfx/components/processing/save_file.py +225 -0
- lfx/components/processing/select_data.py +48 -0
- lfx/components/processing/split_text.py +141 -0
- lfx/components/processing/structured_output.py +202 -0
- lfx/components/processing/update_data.py +160 -0
- lfx/components/prototypes/__init__.py +34 -0
- lfx/components/prototypes/python_function.py +73 -0
- lfx/components/qdrant/__init__.py +34 -0
- lfx/components/qdrant/qdrant.py +109 -0
- lfx/components/redis/__init__.py +37 -0
- lfx/components/redis/redis.py +89 -0
- lfx/components/redis/redis_chat.py +43 -0
- lfx/components/sambanova/__init__.py +32 -0
- lfx/components/sambanova/sambanova.py +84 -0
- lfx/components/scrapegraph/__init__.py +40 -0
- lfx/components/scrapegraph/scrapegraph_markdownify_api.py +64 -0
- lfx/components/scrapegraph/scrapegraph_search_api.py +64 -0
- lfx/components/scrapegraph/scrapegraph_smart_scraper_api.py +71 -0
- lfx/components/searchapi/__init__.py +34 -0
- lfx/components/searchapi/search.py +79 -0
- lfx/components/serpapi/__init__.py +3 -0
- lfx/components/serpapi/serp.py +115 -0
- lfx/components/supabase/__init__.py +34 -0
- lfx/components/supabase/supabase.py +76 -0
- lfx/components/tavily/__init__.py +4 -0
- lfx/components/tavily/tavily_extract.py +117 -0
- lfx/components/tavily/tavily_search.py +212 -0
- lfx/components/textsplitters/__init__.py +3 -0
- lfx/components/toolkits/__init__.py +3 -0
- lfx/components/tools/__init__.py +72 -0
- lfx/components/tools/calculator.py +108 -0
- lfx/components/tools/google_search_api.py +45 -0
- lfx/components/tools/google_serper_api.py +115 -0
- lfx/components/tools/python_code_structured_tool.py +327 -0
- lfx/components/tools/python_repl.py +97 -0
- lfx/components/tools/search_api.py +87 -0
- lfx/components/tools/searxng.py +145 -0
- lfx/components/tools/serp_api.py +119 -0
- lfx/components/tools/tavily_search_tool.py +344 -0
- lfx/components/tools/wikidata_api.py +102 -0
- lfx/components/tools/wikipedia_api.py +49 -0
- lfx/components/tools/yahoo_finance.py +129 -0
- lfx/components/twelvelabs/__init__.py +52 -0
- lfx/components/twelvelabs/convert_astra_results.py +84 -0
- lfx/components/twelvelabs/pegasus_index.py +311 -0
- lfx/components/twelvelabs/split_video.py +291 -0
- lfx/components/twelvelabs/text_embeddings.py +57 -0
- lfx/components/twelvelabs/twelvelabs_pegasus.py +408 -0
- lfx/components/twelvelabs/video_embeddings.py +100 -0
- lfx/components/twelvelabs/video_file.py +179 -0
- lfx/components/unstructured/__init__.py +3 -0
- lfx/components/unstructured/unstructured.py +121 -0
- lfx/components/upstash/__init__.py +34 -0
- lfx/components/upstash/upstash.py +124 -0
- lfx/components/vectara/__init__.py +37 -0
- lfx/components/vectara/vectara.py +97 -0
- lfx/components/vectara/vectara_rag.py +164 -0
- lfx/components/vectorstores/__init__.py +40 -0
- lfx/components/vectorstores/astradb.py +1285 -0
- lfx/components/vectorstores/astradb_graph.py +319 -0
- lfx/components/vectorstores/cassandra.py +264 -0
- lfx/components/vectorstores/cassandra_graph.py +238 -0
- lfx/components/vectorstores/chroma.py +167 -0
- lfx/components/vectorstores/clickhouse.py +135 -0
- lfx/components/vectorstores/couchbase.py +102 -0
- lfx/components/vectorstores/elasticsearch.py +267 -0
- lfx/components/vectorstores/faiss.py +111 -0
- lfx/components/vectorstores/graph_rag.py +141 -0
- lfx/components/vectorstores/hcd.py +314 -0
- lfx/components/vectorstores/local_db.py +261 -0
- lfx/components/vectorstores/milvus.py +115 -0
- lfx/components/vectorstores/mongodb_atlas.py +213 -0
- lfx/components/vectorstores/opensearch.py +243 -0
- lfx/components/vectorstores/pgvector.py +72 -0
- lfx/components/vectorstores/pinecone.py +134 -0
- lfx/components/vectorstores/qdrant.py +109 -0
- lfx/components/vectorstores/supabase.py +76 -0
- lfx/components/vectorstores/upstash.py +124 -0
- lfx/components/vectorstores/vectara.py +97 -0
- lfx/components/vectorstores/vectara_rag.py +164 -0
- lfx/components/vectorstores/weaviate.py +89 -0
- lfx/components/vertexai/__init__.py +37 -0
- lfx/components/vertexai/vertexai.py +71 -0
- lfx/components/vertexai/vertexai_embeddings.py +67 -0
- lfx/components/weaviate/__init__.py +34 -0
- lfx/components/weaviate/weaviate.py +89 -0
- lfx/components/wikipedia/__init__.py +4 -0
- lfx/components/wikipedia/wikidata.py +86 -0
- lfx/components/wikipedia/wikipedia.py +53 -0
- lfx/components/wolframalpha/__init__.py +3 -0
- lfx/components/wolframalpha/wolfram_alpha_api.py +54 -0
- lfx/components/xai/__init__.py +32 -0
- lfx/components/xai/xai.py +167 -0
- lfx/components/yahoosearch/__init__.py +3 -0
- lfx/components/yahoosearch/yahoo.py +137 -0
- lfx/components/youtube/__init__.py +52 -0
- lfx/components/youtube/channel.py +227 -0
- lfx/components/youtube/comments.py +231 -0
- lfx/components/youtube/playlist.py +33 -0
- lfx/components/youtube/search.py +120 -0
- lfx/components/youtube/trending.py +285 -0
- lfx/components/youtube/video_details.py +263 -0
- lfx/components/youtube/youtube_transcripts.py +118 -0
- lfx/components/zep/__init__.py +3 -0
- lfx/components/zep/zep.py +44 -0
- lfx/constants.py +6 -0
- lfx/custom/__init__.py +7 -0
- lfx/custom/attributes.py +86 -0
- lfx/custom/code_parser/__init__.py +3 -0
- lfx/custom/code_parser/code_parser.py +361 -0
- lfx/custom/custom_component/__init__.py +0 -0
- lfx/custom/custom_component/base_component.py +128 -0
- lfx/custom/custom_component/component.py +1808 -0
- lfx/custom/custom_component/component_with_cache.py +8 -0
- lfx/custom/custom_component/custom_component.py +588 -0
- lfx/custom/dependency_analyzer.py +165 -0
- lfx/custom/directory_reader/__init__.py +3 -0
- lfx/custom/directory_reader/directory_reader.py +359 -0
- lfx/custom/directory_reader/utils.py +171 -0
- lfx/custom/eval.py +12 -0
- lfx/custom/schema.py +32 -0
- lfx/custom/tree_visitor.py +21 -0
- lfx/custom/utils.py +877 -0
- lfx/custom/validate.py +488 -0
- lfx/events/__init__.py +1 -0
- lfx/events/event_manager.py +110 -0
- lfx/exceptions/__init__.py +0 -0
- lfx/exceptions/component.py +15 -0
- lfx/field_typing/__init__.py +91 -0
- lfx/field_typing/constants.py +215 -0
- lfx/field_typing/range_spec.py +35 -0
- lfx/graph/__init__.py +6 -0
- lfx/graph/edge/__init__.py +0 -0
- lfx/graph/edge/base.py +277 -0
- lfx/graph/edge/schema.py +119 -0
- lfx/graph/edge/utils.py +0 -0
- lfx/graph/graph/__init__.py +0 -0
- lfx/graph/graph/ascii.py +202 -0
- lfx/graph/graph/base.py +2238 -0
- lfx/graph/graph/constants.py +63 -0
- lfx/graph/graph/runnable_vertices_manager.py +133 -0
- lfx/graph/graph/schema.py +52 -0
- lfx/graph/graph/state_model.py +66 -0
- lfx/graph/graph/utils.py +1024 -0
- lfx/graph/schema.py +75 -0
- lfx/graph/state/__init__.py +0 -0
- lfx/graph/state/model.py +237 -0
- lfx/graph/utils.py +200 -0
- lfx/graph/vertex/__init__.py +0 -0
- lfx/graph/vertex/base.py +823 -0
- lfx/graph/vertex/constants.py +0 -0
- lfx/graph/vertex/exceptions.py +4 -0
- lfx/graph/vertex/param_handler.py +264 -0
- lfx/graph/vertex/schema.py +26 -0
- lfx/graph/vertex/utils.py +19 -0
- lfx/graph/vertex/vertex_types.py +489 -0
- lfx/helpers/__init__.py +1 -0
- lfx/helpers/base_model.py +71 -0
- lfx/helpers/custom.py +13 -0
- lfx/helpers/data.py +167 -0
- lfx/helpers/flow.py +194 -0
- lfx/inputs/__init__.py +68 -0
- lfx/inputs/constants.py +2 -0
- lfx/inputs/input_mixin.py +328 -0
- lfx/inputs/inputs.py +714 -0
- lfx/inputs/validators.py +19 -0
- lfx/interface/__init__.py +6 -0
- lfx/interface/components.py +489 -0
- lfx/interface/importing/__init__.py +5 -0
- lfx/interface/importing/utils.py +39 -0
- lfx/interface/initialize/__init__.py +3 -0
- lfx/interface/initialize/loading.py +224 -0
- lfx/interface/listing.py +26 -0
- lfx/interface/run.py +16 -0
- lfx/interface/utils.py +111 -0
- lfx/io/__init__.py +63 -0
- lfx/io/schema.py +289 -0
- lfx/load/__init__.py +8 -0
- lfx/load/load.py +256 -0
- lfx/load/utils.py +99 -0
- lfx/log/__init__.py +5 -0
- lfx/log/logger.py +385 -0
- lfx/memory/__init__.py +90 -0
- lfx/memory/stubs.py +283 -0
- lfx/processing/__init__.py +1 -0
- lfx/processing/process.py +238 -0
- lfx/processing/utils.py +25 -0
- lfx/py.typed +0 -0
- lfx/schema/__init__.py +66 -0
- lfx/schema/artifact.py +83 -0
- lfx/schema/content_block.py +62 -0
- lfx/schema/content_types.py +91 -0
- lfx/schema/data.py +308 -0
- lfx/schema/dataframe.py +210 -0
- lfx/schema/dotdict.py +74 -0
- lfx/schema/encoders.py +13 -0
- lfx/schema/graph.py +47 -0
- lfx/schema/image.py +131 -0
- lfx/schema/json_schema.py +141 -0
- lfx/schema/log.py +61 -0
- lfx/schema/message.py +473 -0
- lfx/schema/openai_responses_schemas.py +74 -0
- lfx/schema/properties.py +41 -0
- lfx/schema/schema.py +171 -0
- lfx/schema/serialize.py +13 -0
- lfx/schema/table.py +140 -0
- lfx/schema/validators.py +114 -0
- lfx/serialization/__init__.py +5 -0
- lfx/serialization/constants.py +2 -0
- lfx/serialization/serialization.py +314 -0
- lfx/services/__init__.py +23 -0
- lfx/services/base.py +28 -0
- lfx/services/cache/__init__.py +6 -0
- lfx/services/cache/base.py +183 -0
- lfx/services/cache/service.py +166 -0
- lfx/services/cache/utils.py +169 -0
- lfx/services/chat/__init__.py +1 -0
- lfx/services/chat/config.py +2 -0
- lfx/services/chat/schema.py +10 -0
- lfx/services/deps.py +129 -0
- lfx/services/factory.py +19 -0
- lfx/services/initialize.py +19 -0
- lfx/services/interfaces.py +103 -0
- lfx/services/manager.py +172 -0
- lfx/services/schema.py +20 -0
- lfx/services/session.py +82 -0
- lfx/services/settings/__init__.py +3 -0
- lfx/services/settings/auth.py +130 -0
- lfx/services/settings/base.py +539 -0
- lfx/services/settings/constants.py +31 -0
- lfx/services/settings/factory.py +23 -0
- lfx/services/settings/feature_flags.py +12 -0
- lfx/services/settings/service.py +35 -0
- lfx/services/settings/utils.py +40 -0
- lfx/services/shared_component_cache/__init__.py +1 -0
- lfx/services/shared_component_cache/factory.py +30 -0
- lfx/services/shared_component_cache/service.py +9 -0
- lfx/services/storage/__init__.py +5 -0
- lfx/services/storage/local.py +155 -0
- lfx/services/storage/service.py +54 -0
- lfx/services/tracing/__init__.py +1 -0
- lfx/services/tracing/service.py +21 -0
- lfx/settings.py +6 -0
- lfx/template/__init__.py +6 -0
- lfx/template/field/__init__.py +0 -0
- lfx/template/field/base.py +257 -0
- lfx/template/field/prompt.py +15 -0
- lfx/template/frontend_node/__init__.py +6 -0
- lfx/template/frontend_node/base.py +212 -0
- lfx/template/frontend_node/constants.py +65 -0
- lfx/template/frontend_node/custom_components.py +79 -0
- lfx/template/template/__init__.py +0 -0
- lfx/template/template/base.py +100 -0
- lfx/template/utils.py +217 -0
- lfx/type_extraction/__init__.py +19 -0
- lfx/type_extraction/type_extraction.py +75 -0
- lfx/type_extraction.py +80 -0
- lfx/utils/__init__.py +1 -0
- lfx/utils/async_helpers.py +42 -0
- lfx/utils/component_utils.py +154 -0
- lfx/utils/concurrency.py +60 -0
- lfx/utils/connection_string_parser.py +11 -0
- lfx/utils/constants.py +205 -0
- lfx/utils/data_structure.py +212 -0
- lfx/utils/exceptions.py +22 -0
- lfx/utils/helpers.py +28 -0
- lfx/utils/image.py +73 -0
- lfx/utils/lazy_load.py +15 -0
- lfx/utils/request_utils.py +18 -0
- lfx/utils/schemas.py +139 -0
- lfx/utils/util.py +481 -0
- lfx/utils/util_strings.py +56 -0
- lfx/utils/version.py +24 -0
- lfx_nightly-0.1.11.dev0.dist-info/METADATA +293 -0
- lfx_nightly-0.1.11.dev0.dist-info/RECORD +699 -0
- lfx_nightly-0.1.11.dev0.dist-info/WHEEL +4 -0
- lfx_nightly-0.1.11.dev0.dist-info/entry_points.txt +2 -0
@@ -0,0 +1,135 @@
|
|
1
|
+
from typing import Any
|
2
|
+
|
3
|
+
import requests
|
4
|
+
from ibm_watsonx_ai import APIClient, Credentials
|
5
|
+
from ibm_watsonx_ai.metanames import EmbedTextParamsMetaNames
|
6
|
+
from langchain_ibm import WatsonxEmbeddings
|
7
|
+
from pydantic.v1 import SecretStr
|
8
|
+
|
9
|
+
from lfx.base.embeddings.model import LCEmbeddingsModel
|
10
|
+
from lfx.field_typing import Embeddings
|
11
|
+
from lfx.io import BoolInput, DropdownInput, IntInput, SecretStrInput, StrInput
|
12
|
+
from lfx.log.logger import logger
|
13
|
+
from lfx.schema.dotdict import dotdict
|
14
|
+
|
15
|
+
|
16
|
+
class WatsonxEmbeddingsComponent(LCEmbeddingsModel):
|
17
|
+
display_name = "IBM watsonx.ai Embeddings"
|
18
|
+
description = "Generate embeddings using IBM watsonx.ai models."
|
19
|
+
icon = "WatsonxAI"
|
20
|
+
name = "WatsonxEmbeddingsComponent"
|
21
|
+
|
22
|
+
# models present in all the regions
|
23
|
+
_default_models = [
|
24
|
+
"sentence-transformers/all-minilm-l12-v2",
|
25
|
+
"ibm/slate-125m-english-rtrvr-v2",
|
26
|
+
"ibm/slate-30m-english-rtrvr-v2",
|
27
|
+
"intfloat/multilingual-e5-large",
|
28
|
+
]
|
29
|
+
|
30
|
+
inputs = [
|
31
|
+
DropdownInput(
|
32
|
+
name="url",
|
33
|
+
display_name="watsonx API Endpoint",
|
34
|
+
info="The base URL of the API.",
|
35
|
+
value=None,
|
36
|
+
options=[
|
37
|
+
"https://us-south.ml.cloud.ibm.com",
|
38
|
+
"https://eu-de.ml.cloud.ibm.com",
|
39
|
+
"https://eu-gb.ml.cloud.ibm.com",
|
40
|
+
"https://au-syd.ml.cloud.ibm.com",
|
41
|
+
"https://jp-tok.ml.cloud.ibm.com",
|
42
|
+
"https://ca-tor.ml.cloud.ibm.com",
|
43
|
+
],
|
44
|
+
real_time_refresh=True,
|
45
|
+
),
|
46
|
+
StrInput(
|
47
|
+
name="project_id",
|
48
|
+
display_name="watsonx project id",
|
49
|
+
info="The project ID or deployment space ID that is associated with the foundation model.",
|
50
|
+
required=True,
|
51
|
+
),
|
52
|
+
SecretStrInput(
|
53
|
+
name="api_key",
|
54
|
+
display_name="API Key",
|
55
|
+
info="The API Key to use for the model.",
|
56
|
+
required=True,
|
57
|
+
),
|
58
|
+
DropdownInput(
|
59
|
+
name="model_name",
|
60
|
+
display_name="Model Name",
|
61
|
+
options=[],
|
62
|
+
value=None,
|
63
|
+
dynamic=True,
|
64
|
+
required=True,
|
65
|
+
),
|
66
|
+
IntInput(
|
67
|
+
name="truncate_input_tokens",
|
68
|
+
display_name="Truncate Input Tokens",
|
69
|
+
advanced=True,
|
70
|
+
value=200,
|
71
|
+
),
|
72
|
+
BoolInput(
|
73
|
+
name="input_text",
|
74
|
+
display_name="Include the original text in the output",
|
75
|
+
value=True,
|
76
|
+
advanced=True,
|
77
|
+
),
|
78
|
+
]
|
79
|
+
|
80
|
+
@staticmethod
|
81
|
+
def fetch_models(base_url: str) -> list[str]:
|
82
|
+
"""Fetch available models from the watsonx.ai API."""
|
83
|
+
try:
|
84
|
+
endpoint = f"{base_url}/ml/v1/foundation_model_specs"
|
85
|
+
params = {
|
86
|
+
"version": "2024-09-16",
|
87
|
+
"filters": "function_embedding,!lifecycle_withdrawn:and",
|
88
|
+
}
|
89
|
+
response = requests.get(endpoint, params=params, timeout=10)
|
90
|
+
response.raise_for_status()
|
91
|
+
data = response.json()
|
92
|
+
models = [model["model_id"] for model in data.get("resources", [])]
|
93
|
+
return sorted(models)
|
94
|
+
except Exception: # noqa: BLE001
|
95
|
+
logger.exception("Error fetching models")
|
96
|
+
return WatsonxEmbeddingsComponent._default_models
|
97
|
+
|
98
|
+
def update_build_config(self, build_config: dotdict, field_value: Any, field_name: str | None = None):
|
99
|
+
"""Update model options when URL or API key changes."""
|
100
|
+
logger.debug(
|
101
|
+
"Updating build config. Field name: %s, Field value: %s",
|
102
|
+
field_name,
|
103
|
+
field_value,
|
104
|
+
)
|
105
|
+
|
106
|
+
if field_name == "url" and field_value:
|
107
|
+
try:
|
108
|
+
models = self.fetch_models(base_url=build_config.url.value)
|
109
|
+
build_config.model_name.options = models
|
110
|
+
if build_config.model_name.value:
|
111
|
+
build_config.model_name.value = models[0]
|
112
|
+
info_message = f"Updated model options: {len(models)} models found in {build_config.url.value}"
|
113
|
+
logger.info(info_message)
|
114
|
+
except Exception: # noqa: BLE001
|
115
|
+
logger.exception("Error updating model options.")
|
116
|
+
|
117
|
+
def build_embeddings(self) -> Embeddings:
|
118
|
+
credentials = Credentials(
|
119
|
+
api_key=SecretStr(self.api_key).get_secret_value(),
|
120
|
+
url=self.url,
|
121
|
+
)
|
122
|
+
|
123
|
+
api_client = APIClient(credentials)
|
124
|
+
|
125
|
+
params = {
|
126
|
+
EmbedTextParamsMetaNames.TRUNCATE_INPUT_TOKENS: self.truncate_input_tokens,
|
127
|
+
EmbedTextParamsMetaNames.RETURN_OPTIONS: {"input_text": self.input_text},
|
128
|
+
}
|
129
|
+
|
130
|
+
return WatsonxEmbeddings(
|
131
|
+
model_id=self.model_name,
|
132
|
+
params=params,
|
133
|
+
watsonx_client=api_client,
|
134
|
+
project_id=self.project_id,
|
135
|
+
)
|
@@ -0,0 +1,84 @@
|
|
1
|
+
import requests
|
2
|
+
from requests.auth import HTTPBasicAuth
|
3
|
+
|
4
|
+
from lfx.base.models.openai_constants import OPENAI_CHAT_MODEL_NAMES
|
5
|
+
from lfx.custom.custom_component.component import Component
|
6
|
+
from lfx.inputs.inputs import DropdownInput, SecretStrInput, StrInput
|
7
|
+
from lfx.io import MessageTextInput, Output
|
8
|
+
from lfx.schema.data import Data
|
9
|
+
from lfx.schema.message import Message
|
10
|
+
|
11
|
+
|
12
|
+
class CombinatorialReasonerComponent(Component):
|
13
|
+
display_name = "Combinatorial Reasoner"
|
14
|
+
description = "Uses Combinatorial Optimization to construct an optimal prompt with embedded reasons. Sign up here:\nhttps://forms.gle/oWNv2NKjBNaqqvCx6"
|
15
|
+
icon = "Icosa"
|
16
|
+
name = "Combinatorial Reasoner"
|
17
|
+
|
18
|
+
inputs = [
|
19
|
+
MessageTextInput(name="prompt", display_name="Prompt", required=True),
|
20
|
+
SecretStrInput(
|
21
|
+
name="openai_api_key",
|
22
|
+
display_name="OpenAI API Key",
|
23
|
+
info="The OpenAI API Key to use for the OpenAI model.",
|
24
|
+
advanced=False,
|
25
|
+
value="OPENAI_API_KEY",
|
26
|
+
required=True,
|
27
|
+
),
|
28
|
+
StrInput(
|
29
|
+
name="username",
|
30
|
+
display_name="Username",
|
31
|
+
info="Username to authenticate access to Icosa CR API",
|
32
|
+
advanced=False,
|
33
|
+
required=True,
|
34
|
+
),
|
35
|
+
SecretStrInput(
|
36
|
+
name="password",
|
37
|
+
display_name="Password",
|
38
|
+
info="Password to authenticate access to Icosa CR API.",
|
39
|
+
advanced=False,
|
40
|
+
required=True,
|
41
|
+
),
|
42
|
+
DropdownInput(
|
43
|
+
name="model_name",
|
44
|
+
display_name="Model Name",
|
45
|
+
advanced=False,
|
46
|
+
options=OPENAI_CHAT_MODEL_NAMES,
|
47
|
+
value=OPENAI_CHAT_MODEL_NAMES[0],
|
48
|
+
),
|
49
|
+
]
|
50
|
+
|
51
|
+
outputs = [
|
52
|
+
Output(
|
53
|
+
display_name="Optimized Prompt",
|
54
|
+
name="optimized_prompt",
|
55
|
+
method="build_prompt",
|
56
|
+
),
|
57
|
+
Output(display_name="Selected Reasons", name="reasons", method="build_reasons"),
|
58
|
+
]
|
59
|
+
|
60
|
+
def build_prompt(self) -> Message:
|
61
|
+
params = {
|
62
|
+
"prompt": self.prompt,
|
63
|
+
"apiKey": self.openai_api_key,
|
64
|
+
"model": self.model_name,
|
65
|
+
}
|
66
|
+
|
67
|
+
creds = HTTPBasicAuth(self.username, password=self.password)
|
68
|
+
response = requests.post(
|
69
|
+
"https://cr-api.icosacomputing.com/cr/langflow",
|
70
|
+
json=params,
|
71
|
+
auth=creds,
|
72
|
+
timeout=100,
|
73
|
+
)
|
74
|
+
response.raise_for_status()
|
75
|
+
|
76
|
+
prompt = response.json()["prompt"]
|
77
|
+
|
78
|
+
self.reasons = response.json()["finalReasons"]
|
79
|
+
return prompt
|
80
|
+
|
81
|
+
def build_reasons(self) -> Data:
|
82
|
+
# list of selected reasons
|
83
|
+
final_reasons = [reason[0] for reason in self.reasons]
|
84
|
+
return Data(value=final_reasons)
|
@@ -0,0 +1,38 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
from typing import TYPE_CHECKING, Any
|
4
|
+
|
5
|
+
from lfx.components._importing import import_mod
|
6
|
+
|
7
|
+
if TYPE_CHECKING:
|
8
|
+
from lfx.components.input_output.chat import ChatInput
|
9
|
+
from lfx.components.input_output.chat_output import ChatOutput
|
10
|
+
from lfx.components.input_output.text import TextInputComponent
|
11
|
+
from lfx.components.input_output.text_output import TextOutputComponent
|
12
|
+
|
13
|
+
_dynamic_imports = {
|
14
|
+
"ChatInput": "chat",
|
15
|
+
"ChatOutput": "chat_output",
|
16
|
+
"TextInputComponent": "text",
|
17
|
+
"TextOutputComponent": "text_output",
|
18
|
+
}
|
19
|
+
|
20
|
+
__all__ = ["ChatInput", "ChatOutput", "TextInputComponent", "TextOutputComponent"]
|
21
|
+
|
22
|
+
|
23
|
+
def __getattr__(attr_name: str) -> Any:
|
24
|
+
"""Lazily import input/output components on attribute access."""
|
25
|
+
if attr_name not in _dynamic_imports:
|
26
|
+
msg = f"module '{__name__}' has no attribute '{attr_name}'"
|
27
|
+
raise AttributeError(msg)
|
28
|
+
try:
|
29
|
+
result = import_mod(attr_name, _dynamic_imports[attr_name], __spec__.parent)
|
30
|
+
except (ModuleNotFoundError, ImportError, AttributeError) as e:
|
31
|
+
msg = f"Could not import '{attr_name}' from '{__name__}': {e}"
|
32
|
+
raise AttributeError(msg) from e
|
33
|
+
globals()[attr_name] = result
|
34
|
+
return result
|
35
|
+
|
36
|
+
|
37
|
+
def __dir__() -> list[str]:
|
38
|
+
return list(__all__)
|
@@ -0,0 +1,120 @@
|
|
1
|
+
from lfx.base.data.utils import IMG_FILE_TYPES, TEXT_FILE_TYPES
|
2
|
+
from lfx.base.io.chat import ChatComponent
|
3
|
+
from lfx.inputs.inputs import BoolInput
|
4
|
+
from lfx.io import (
|
5
|
+
DropdownInput,
|
6
|
+
FileInput,
|
7
|
+
MessageTextInput,
|
8
|
+
MultilineInput,
|
9
|
+
Output,
|
10
|
+
)
|
11
|
+
from lfx.schema.message import Message
|
12
|
+
from lfx.utils.constants import (
|
13
|
+
MESSAGE_SENDER_AI,
|
14
|
+
MESSAGE_SENDER_NAME_USER,
|
15
|
+
MESSAGE_SENDER_USER,
|
16
|
+
)
|
17
|
+
|
18
|
+
|
19
|
+
class ChatInput(ChatComponent):
|
20
|
+
display_name = "Chat Input"
|
21
|
+
description = "Get chat inputs from the Playground."
|
22
|
+
documentation: str = "https://docs.langflow.org/components-io#chat-input"
|
23
|
+
icon = "MessagesSquare"
|
24
|
+
name = "ChatInput"
|
25
|
+
minimized = True
|
26
|
+
|
27
|
+
inputs = [
|
28
|
+
MultilineInput(
|
29
|
+
name="input_value",
|
30
|
+
display_name="Input Text",
|
31
|
+
value="",
|
32
|
+
info="Message to be passed as input.",
|
33
|
+
input_types=[],
|
34
|
+
),
|
35
|
+
BoolInput(
|
36
|
+
name="should_store_message",
|
37
|
+
display_name="Store Messages",
|
38
|
+
info="Store the message in the history.",
|
39
|
+
value=True,
|
40
|
+
advanced=True,
|
41
|
+
),
|
42
|
+
DropdownInput(
|
43
|
+
name="sender",
|
44
|
+
display_name="Sender Type",
|
45
|
+
options=[MESSAGE_SENDER_AI, MESSAGE_SENDER_USER],
|
46
|
+
value=MESSAGE_SENDER_USER,
|
47
|
+
info="Type of sender.",
|
48
|
+
advanced=True,
|
49
|
+
),
|
50
|
+
MessageTextInput(
|
51
|
+
name="sender_name",
|
52
|
+
display_name="Sender Name",
|
53
|
+
info="Name of the sender.",
|
54
|
+
value=MESSAGE_SENDER_NAME_USER,
|
55
|
+
advanced=True,
|
56
|
+
),
|
57
|
+
MessageTextInput(
|
58
|
+
name="session_id",
|
59
|
+
display_name="Session ID",
|
60
|
+
info="The session ID of the chat. If empty, the current session ID parameter will be used.",
|
61
|
+
advanced=True,
|
62
|
+
),
|
63
|
+
FileInput(
|
64
|
+
name="files",
|
65
|
+
display_name="Files",
|
66
|
+
file_types=TEXT_FILE_TYPES + IMG_FILE_TYPES,
|
67
|
+
info="Files to be sent with the message.",
|
68
|
+
advanced=True,
|
69
|
+
is_list=True,
|
70
|
+
temp_file=True,
|
71
|
+
),
|
72
|
+
MessageTextInput(
|
73
|
+
name="background_color",
|
74
|
+
display_name="Background Color",
|
75
|
+
info="The background color of the icon.",
|
76
|
+
advanced=True,
|
77
|
+
),
|
78
|
+
MessageTextInput(
|
79
|
+
name="chat_icon",
|
80
|
+
display_name="Icon",
|
81
|
+
info="The icon of the message.",
|
82
|
+
advanced=True,
|
83
|
+
),
|
84
|
+
MessageTextInput(
|
85
|
+
name="text_color",
|
86
|
+
display_name="Text Color",
|
87
|
+
info="The text color of the name",
|
88
|
+
advanced=True,
|
89
|
+
),
|
90
|
+
]
|
91
|
+
outputs = [
|
92
|
+
Output(display_name="Chat Message", name="message", method="message_response"),
|
93
|
+
]
|
94
|
+
|
95
|
+
async def message_response(self) -> Message:
|
96
|
+
background_color = self.background_color
|
97
|
+
text_color = self.text_color
|
98
|
+
icon = self.chat_icon
|
99
|
+
|
100
|
+
message = await Message.create(
|
101
|
+
text=self.input_value,
|
102
|
+
sender=self.sender,
|
103
|
+
sender_name=self.sender_name,
|
104
|
+
session_id=self.session_id,
|
105
|
+
files=self.files,
|
106
|
+
properties={
|
107
|
+
"background_color": background_color,
|
108
|
+
"text_color": text_color,
|
109
|
+
"icon": icon,
|
110
|
+
},
|
111
|
+
)
|
112
|
+
if self.session_id and isinstance(message, Message) and self.should_store_message:
|
113
|
+
stored_message = await self.send_message(
|
114
|
+
message,
|
115
|
+
)
|
116
|
+
self.message.value = stored_message
|
117
|
+
message = stored_message
|
118
|
+
|
119
|
+
self.status = message
|
120
|
+
return message
|
@@ -0,0 +1,200 @@
|
|
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/components-io#chat-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="data_template",
|
68
|
+
display_name="Data Template",
|
69
|
+
value="{text}",
|
70
|
+
advanced=True,
|
71
|
+
info="Template to convert Data to Text. If left empty, it will be dynamically set to the Data's text key.",
|
72
|
+
),
|
73
|
+
MessageTextInput(
|
74
|
+
name="background_color",
|
75
|
+
display_name="Background Color",
|
76
|
+
info="The background color of the icon.",
|
77
|
+
advanced=True,
|
78
|
+
),
|
79
|
+
MessageTextInput(
|
80
|
+
name="chat_icon",
|
81
|
+
display_name="Icon",
|
82
|
+
info="The icon of the message.",
|
83
|
+
advanced=True,
|
84
|
+
),
|
85
|
+
MessageTextInput(
|
86
|
+
name="text_color",
|
87
|
+
display_name="Text Color",
|
88
|
+
info="The text color of the name",
|
89
|
+
advanced=True,
|
90
|
+
),
|
91
|
+
BoolInput(
|
92
|
+
name="clean_data",
|
93
|
+
display_name="Basic Clean Data",
|
94
|
+
value=True,
|
95
|
+
info="Whether to clean the data",
|
96
|
+
advanced=True,
|
97
|
+
),
|
98
|
+
]
|
99
|
+
outputs = [
|
100
|
+
Output(
|
101
|
+
display_name="Output Message",
|
102
|
+
name="message",
|
103
|
+
method="message_response",
|
104
|
+
),
|
105
|
+
]
|
106
|
+
|
107
|
+
def _build_source(self, id_: str | None, display_name: str | None, source: str | None) -> Source:
|
108
|
+
source_dict = {}
|
109
|
+
if id_:
|
110
|
+
source_dict["id"] = id_
|
111
|
+
if display_name:
|
112
|
+
source_dict["display_name"] = display_name
|
113
|
+
if source:
|
114
|
+
# Handle case where source is a ChatOpenAI object
|
115
|
+
if hasattr(source, "model_name"):
|
116
|
+
source_dict["source"] = source.model_name
|
117
|
+
elif hasattr(source, "model"):
|
118
|
+
source_dict["source"] = str(source.model)
|
119
|
+
else:
|
120
|
+
source_dict["source"] = str(source)
|
121
|
+
return Source(**source_dict)
|
122
|
+
|
123
|
+
async def message_response(self) -> Message:
|
124
|
+
# First convert the input to string if needed
|
125
|
+
text = self.convert_to_string()
|
126
|
+
|
127
|
+
# Get source properties
|
128
|
+
source, icon, display_name, source_id = self.get_properties_from_source_component()
|
129
|
+
background_color = self.background_color
|
130
|
+
text_color = self.text_color
|
131
|
+
if self.chat_icon:
|
132
|
+
icon = self.chat_icon
|
133
|
+
|
134
|
+
# Create or use existing Message object
|
135
|
+
if isinstance(self.input_value, Message):
|
136
|
+
message = self.input_value
|
137
|
+
# Update message properties
|
138
|
+
message.text = text
|
139
|
+
else:
|
140
|
+
message = Message(text=text)
|
141
|
+
|
142
|
+
# Set message properties
|
143
|
+
message.sender = self.sender
|
144
|
+
message.sender_name = self.sender_name
|
145
|
+
message.session_id = self.session_id
|
146
|
+
message.flow_id = self.graph.flow_id if hasattr(self, "graph") else None
|
147
|
+
message.properties.source = self._build_source(source_id, display_name, source)
|
148
|
+
message.properties.icon = icon
|
149
|
+
message.properties.background_color = background_color
|
150
|
+
message.properties.text_color = text_color
|
151
|
+
|
152
|
+
# Store message if needed
|
153
|
+
if self.session_id and self.should_store_message:
|
154
|
+
stored_message = await self.send_message(message)
|
155
|
+
self.message.value = stored_message
|
156
|
+
message = stored_message
|
157
|
+
|
158
|
+
self.status = message
|
159
|
+
return message
|
160
|
+
|
161
|
+
def _serialize_data(self, data: Data) -> str:
|
162
|
+
"""Serialize Data object to JSON string."""
|
163
|
+
# Convert data.data to JSON-serializable format
|
164
|
+
serializable_data = jsonable_encoder(data.data)
|
165
|
+
# Serialize with orjson, enabling pretty printing with indentation
|
166
|
+
json_bytes = orjson.dumps(serializable_data, option=orjson.OPT_INDENT_2)
|
167
|
+
# Convert bytes to string and wrap in Markdown code blocks
|
168
|
+
return "```json\n" + json_bytes.decode("utf-8") + "\n```"
|
169
|
+
|
170
|
+
def _validate_input(self) -> None:
|
171
|
+
"""Validate the input data and raise ValueError if invalid."""
|
172
|
+
if self.input_value is None:
|
173
|
+
msg = "Input data cannot be None"
|
174
|
+
raise ValueError(msg)
|
175
|
+
if isinstance(self.input_value, list) and not all(
|
176
|
+
isinstance(item, Message | Data | DataFrame | str) for item in self.input_value
|
177
|
+
):
|
178
|
+
invalid_types = [
|
179
|
+
type(item).__name__
|
180
|
+
for item in self.input_value
|
181
|
+
if not isinstance(item, Message | Data | DataFrame | str)
|
182
|
+
]
|
183
|
+
msg = f"Expected Data or DataFrame or Message or str, got {invalid_types}"
|
184
|
+
raise TypeError(msg)
|
185
|
+
if not isinstance(
|
186
|
+
self.input_value,
|
187
|
+
Message | Data | DataFrame | str | list | Generator | type(None),
|
188
|
+
):
|
189
|
+
type_name = type(self.input_value).__name__
|
190
|
+
msg = f"Expected Data or DataFrame or Message or str, Generator or None, got {type_name}"
|
191
|
+
raise TypeError(msg)
|
192
|
+
|
193
|
+
def convert_to_string(self) -> str | Generator[Any, None, None]:
|
194
|
+
"""Convert input data to string with proper error handling."""
|
195
|
+
self._validate_input()
|
196
|
+
if isinstance(self.input_value, list):
|
197
|
+
return "\n".join([safe_convert(item, clean_data=self.clean_data) for item in self.input_value])
|
198
|
+
if isinstance(self.input_value, Generator):
|
199
|
+
return self.input_value
|
200
|
+
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/components-io#text-input"
|
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/components-io#text-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,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
|
+
]
|