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,40 @@
|
|
1
|
+
from langchain_core.messages import BaseMessage
|
2
|
+
from langchain_core.prompts import PromptTemplate
|
3
|
+
|
4
|
+
from lfx.custom.custom_component.custom_component import CustomComponent
|
5
|
+
from lfx.field_typing import LanguageModel, Text
|
6
|
+
|
7
|
+
|
8
|
+
class ShouldRunNextComponent(CustomComponent):
|
9
|
+
display_name = "Should Run Next"
|
10
|
+
description = "Determines if a vertex is runnable."
|
11
|
+
name = "ShouldRunNext"
|
12
|
+
|
13
|
+
def build(self, llm: LanguageModel, question: str, context: str, retries: int = 3) -> Text:
|
14
|
+
template = (
|
15
|
+
"Given the following question and the context below, answer with a yes or no.\n\n"
|
16
|
+
"{error_message}\n\n"
|
17
|
+
"Question: {question}\n\n" # noqa: RUF100, RUF027
|
18
|
+
"Context: {context}\n\n" # noqa: RUF100, RUF027
|
19
|
+
"Answer:"
|
20
|
+
)
|
21
|
+
|
22
|
+
prompt = PromptTemplate.from_template(template)
|
23
|
+
chain = prompt | llm
|
24
|
+
error_message = ""
|
25
|
+
for _i in range(retries):
|
26
|
+
result = chain.invoke(
|
27
|
+
{"question": question, "context": context, "error_message": error_message},
|
28
|
+
config={"callbacks": self.get_langchain_callbacks()},
|
29
|
+
)
|
30
|
+
if isinstance(result, BaseMessage):
|
31
|
+
content = result.content
|
32
|
+
elif isinstance(result, str):
|
33
|
+
content = result
|
34
|
+
if isinstance(content, str) and content.lower().strip() in {"yes", "no"}:
|
35
|
+
break
|
36
|
+
condition = str(content).lower().strip() == "yes"
|
37
|
+
self.status = f"Should Run Next: {condition}"
|
38
|
+
if condition is False:
|
39
|
+
self.stop()
|
40
|
+
return context
|
@@ -0,0 +1,63 @@
|
|
1
|
+
from langchain_text_splitters import CharacterTextSplitter
|
2
|
+
|
3
|
+
from lfx.custom.custom_component.component import Component
|
4
|
+
from lfx.io import HandleInput, IntInput, MessageTextInput, Output
|
5
|
+
from lfx.schema.data import Data
|
6
|
+
from lfx.utils.util import unescape_string
|
7
|
+
|
8
|
+
|
9
|
+
class SplitTextComponent(Component):
|
10
|
+
display_name: str = "Split Text"
|
11
|
+
description: str = "Split text into chunks based on specified criteria."
|
12
|
+
icon = "scissors-line-dashed"
|
13
|
+
name = "SplitText"
|
14
|
+
|
15
|
+
inputs = [
|
16
|
+
HandleInput(
|
17
|
+
name="data_inputs",
|
18
|
+
display_name="Data Inputs",
|
19
|
+
info="The data to split.",
|
20
|
+
input_types=["Data"],
|
21
|
+
is_list=True,
|
22
|
+
),
|
23
|
+
IntInput(
|
24
|
+
name="chunk_overlap",
|
25
|
+
display_name="Chunk Overlap",
|
26
|
+
info="Number of characters to overlap between chunks.",
|
27
|
+
value=200,
|
28
|
+
),
|
29
|
+
IntInput(
|
30
|
+
name="chunk_size",
|
31
|
+
display_name="Chunk Size",
|
32
|
+
info="The maximum number of characters in each chunk.",
|
33
|
+
value=1000,
|
34
|
+
),
|
35
|
+
MessageTextInput(
|
36
|
+
name="separator",
|
37
|
+
display_name="Separator",
|
38
|
+
info="The character to split on. Defaults to newline.",
|
39
|
+
value="\n",
|
40
|
+
),
|
41
|
+
]
|
42
|
+
|
43
|
+
outputs = [
|
44
|
+
Output(display_name="Chunks", name="chunks", method="split_text"),
|
45
|
+
]
|
46
|
+
|
47
|
+
def _docs_to_data(self, docs):
|
48
|
+
return [Data(text=doc.page_content, data=doc.metadata) for doc in docs]
|
49
|
+
|
50
|
+
def split_text(self) -> list[Data]:
|
51
|
+
separator = unescape_string(self.separator)
|
52
|
+
|
53
|
+
documents = [_input.to_lc_document() for _input in self.data_inputs if isinstance(_input, Data)]
|
54
|
+
|
55
|
+
splitter = CharacterTextSplitter(
|
56
|
+
chunk_overlap=self.chunk_overlap,
|
57
|
+
chunk_size=self.chunk_size,
|
58
|
+
separator=separator,
|
59
|
+
)
|
60
|
+
docs = splitter.split_documents(documents)
|
61
|
+
data = self._docs_to_data(docs)
|
62
|
+
self.status = data
|
63
|
+
return data
|
@@ -0,0 +1,24 @@
|
|
1
|
+
from lfx.custom.custom_component.custom_component import CustomComponent
|
2
|
+
from lfx.memory import aget_messages, astore_message
|
3
|
+
from lfx.schema.message import Message
|
4
|
+
|
5
|
+
|
6
|
+
class StoreMessageComponent(CustomComponent):
|
7
|
+
display_name = "Store Message"
|
8
|
+
description = "Stores a chat message."
|
9
|
+
name = "StoreMessage"
|
10
|
+
|
11
|
+
def build_config(self):
|
12
|
+
return {
|
13
|
+
"message": {"display_name": "Message"},
|
14
|
+
}
|
15
|
+
|
16
|
+
async def build(
|
17
|
+
self,
|
18
|
+
message: Message,
|
19
|
+
) -> Message:
|
20
|
+
flow_id = self.graph.flow_id if hasattr(self, "graph") else None
|
21
|
+
await astore_message(message, flow_id=flow_id)
|
22
|
+
self.status = await aget_messages()
|
23
|
+
|
24
|
+
return message
|
@@ -0,0 +1,124 @@
|
|
1
|
+
from typing import TYPE_CHECKING, Any
|
2
|
+
|
3
|
+
from lfx.base.flow_processing.utils import build_data_from_result_data
|
4
|
+
from lfx.custom.custom_component.custom_component import CustomComponent
|
5
|
+
from lfx.graph.graph.base import Graph
|
6
|
+
from lfx.graph.vertex.base import Vertex
|
7
|
+
from lfx.helpers.flow import get_flow_inputs
|
8
|
+
from lfx.log.logger import logger
|
9
|
+
from lfx.schema.data import Data
|
10
|
+
from lfx.schema.dotdict import dotdict
|
11
|
+
from lfx.template.field.base import Input
|
12
|
+
|
13
|
+
if TYPE_CHECKING:
|
14
|
+
from lfx.graph.schema import RunOutputs
|
15
|
+
|
16
|
+
|
17
|
+
class SubFlowComponent(CustomComponent):
|
18
|
+
display_name = "Sub Flow"
|
19
|
+
description = (
|
20
|
+
"Dynamically Generates a Component from a Flow. The output is a list of data with keys 'result' and 'message'."
|
21
|
+
)
|
22
|
+
beta: bool = True
|
23
|
+
field_order = ["flow_name"]
|
24
|
+
name = "SubFlow"
|
25
|
+
|
26
|
+
async def get_flow_names(self) -> list[str]:
|
27
|
+
flow_datas = await self.alist_flows()
|
28
|
+
return [flow_data.data["name"] for flow_data in flow_datas]
|
29
|
+
|
30
|
+
async def get_flow(self, flow_name: str) -> Data | None:
|
31
|
+
flow_datas = await self.alist_flows()
|
32
|
+
for flow_data in flow_datas:
|
33
|
+
if flow_data.data["name"] == flow_name:
|
34
|
+
return flow_data
|
35
|
+
return None
|
36
|
+
|
37
|
+
async def update_build_config(self, build_config: dotdict, field_value: Any, field_name: str | None = None):
|
38
|
+
await logger.adebug(f"Updating build config with field value {field_value} and field name {field_name}")
|
39
|
+
if field_name == "flow_name":
|
40
|
+
build_config["flow_name"]["options"] = await self.get_flow_names()
|
41
|
+
# Clean up the build config
|
42
|
+
for key in list(build_config.keys()):
|
43
|
+
if key not in {*self.field_order, "code", "_type", "get_final_results_only"}:
|
44
|
+
del build_config[key]
|
45
|
+
if field_value is not None and field_name == "flow_name":
|
46
|
+
try:
|
47
|
+
flow_data = await self.get_flow(field_value)
|
48
|
+
except Exception: # noqa: BLE001
|
49
|
+
await logger.aexception(f"Error getting flow {field_value}")
|
50
|
+
else:
|
51
|
+
if not flow_data:
|
52
|
+
msg = f"Flow {field_value} not found."
|
53
|
+
await logger.aerror(msg)
|
54
|
+
else:
|
55
|
+
try:
|
56
|
+
graph = Graph.from_payload(flow_data.data["data"])
|
57
|
+
# Get all inputs from the graph
|
58
|
+
inputs = get_flow_inputs(graph)
|
59
|
+
# Add inputs to the build config
|
60
|
+
build_config = self.add_inputs_to_build_config(inputs, build_config)
|
61
|
+
except Exception: # noqa: BLE001
|
62
|
+
await logger.aexception(f"Error building graph for flow {field_value}")
|
63
|
+
|
64
|
+
return build_config
|
65
|
+
|
66
|
+
def add_inputs_to_build_config(self, inputs: list[Vertex], build_config: dotdict):
|
67
|
+
new_fields: list[Input] = []
|
68
|
+
for vertex in inputs:
|
69
|
+
field = Input(
|
70
|
+
display_name=vertex.display_name,
|
71
|
+
name=vertex.id,
|
72
|
+
info=vertex.description,
|
73
|
+
field_type="str",
|
74
|
+
value=None,
|
75
|
+
)
|
76
|
+
new_fields.append(field)
|
77
|
+
logger.debug(new_fields)
|
78
|
+
for field in new_fields:
|
79
|
+
build_config[field.name] = field.to_dict()
|
80
|
+
return build_config
|
81
|
+
|
82
|
+
def build_config(self):
|
83
|
+
return {
|
84
|
+
"input_value": {
|
85
|
+
"display_name": "Input Value",
|
86
|
+
"multiline": True,
|
87
|
+
},
|
88
|
+
"flow_name": {
|
89
|
+
"display_name": "Flow Name",
|
90
|
+
"info": "The name of the flow to run.",
|
91
|
+
"options": [],
|
92
|
+
"real_time_refresh": True,
|
93
|
+
"refresh_button": True,
|
94
|
+
},
|
95
|
+
"tweaks": {
|
96
|
+
"display_name": "Tweaks",
|
97
|
+
"info": "Tweaks to apply to the flow.",
|
98
|
+
},
|
99
|
+
"get_final_results_only": {
|
100
|
+
"display_name": "Get Final Results Only",
|
101
|
+
"info": "If False, the output will contain all outputs from the flow.",
|
102
|
+
"advanced": True,
|
103
|
+
},
|
104
|
+
}
|
105
|
+
|
106
|
+
async def build(self, flow_name: str, **kwargs) -> list[Data]:
|
107
|
+
tweaks = {key: {"input_value": value} for key, value in kwargs.items()}
|
108
|
+
run_outputs: list[RunOutputs | None] = await self.run_flow(
|
109
|
+
tweaks=tweaks,
|
110
|
+
flow_name=flow_name,
|
111
|
+
)
|
112
|
+
if not run_outputs:
|
113
|
+
return []
|
114
|
+
run_output = run_outputs[0]
|
115
|
+
|
116
|
+
data = []
|
117
|
+
if run_output is not None:
|
118
|
+
for output in run_output.outputs:
|
119
|
+
if output:
|
120
|
+
data.extend(build_data_from_result_data(output))
|
121
|
+
|
122
|
+
self.status = data
|
123
|
+
await logger.adebug(data)
|
124
|
+
return data
|
@@ -0,0 +1,76 @@
|
|
1
|
+
# mypy: disable-error-code="attr-defined"
|
2
|
+
import json
|
3
|
+
|
4
|
+
from langchain.chains.query_constructor.base import AttributeInfo
|
5
|
+
from langchain.retrievers.self_query.base import SelfQueryRetriever
|
6
|
+
|
7
|
+
from lfx.base.vectorstores.model import check_cached_vector_store
|
8
|
+
from lfx.custom.custom_component.custom_component import CustomComponent
|
9
|
+
from lfx.io import HandleInput, StrInput
|
10
|
+
|
11
|
+
|
12
|
+
class VectaraSelfQueryRetriverComponent(CustomComponent):
|
13
|
+
"""A custom component for implementing Vectara Self Query Retriever using a vector store."""
|
14
|
+
|
15
|
+
display_name: str = "Vectara Self Query Retriever"
|
16
|
+
description: str = "Implementation of Vectara Self Query Retriever"
|
17
|
+
name = "VectaraSelfQueryRetriver"
|
18
|
+
icon = "Vectara"
|
19
|
+
legacy = True
|
20
|
+
|
21
|
+
inputs = [
|
22
|
+
HandleInput(
|
23
|
+
name="vectorstore",
|
24
|
+
display_name="Vector Store",
|
25
|
+
info="Input Vectara Vector Store",
|
26
|
+
),
|
27
|
+
HandleInput(
|
28
|
+
name="llm",
|
29
|
+
display_name="LLM",
|
30
|
+
info="For self query retriever",
|
31
|
+
),
|
32
|
+
StrInput(
|
33
|
+
name="document_content_description",
|
34
|
+
display_name="Document Content Description",
|
35
|
+
info="For self query retriever",
|
36
|
+
),
|
37
|
+
StrInput(
|
38
|
+
name="metadata_field_info",
|
39
|
+
display_name="Metadata Field Info",
|
40
|
+
info="Each metadata field info is a string in the form of key value pair dictionary containing "
|
41
|
+
"additional search metadata.\n"
|
42
|
+
'Example input: {"name":"speech","description":"what name of the speech","type":'
|
43
|
+
'"string or list[string]"}.\n'
|
44
|
+
"The keys should remain constant(name, description, type)",
|
45
|
+
),
|
46
|
+
]
|
47
|
+
|
48
|
+
@check_cached_vector_store
|
49
|
+
def build_vector_store(self):
|
50
|
+
"""Builds the Vectara Self Query Retriever."""
|
51
|
+
try:
|
52
|
+
from langchain_community.vectorstores import Vectara # noqa: F401
|
53
|
+
except ImportError as e:
|
54
|
+
msg = "Could not import Vectara. Please install it with `pip install langchain-community`."
|
55
|
+
raise ImportError(msg) from e
|
56
|
+
|
57
|
+
metadata_field_obj = []
|
58
|
+
for meta in self.metadata_field_info:
|
59
|
+
meta_obj = json.loads(meta)
|
60
|
+
if "name" not in meta_obj or "description" not in meta_obj or "type" not in meta_obj:
|
61
|
+
msg = "Incorrect metadata field info format."
|
62
|
+
raise ValueError(msg)
|
63
|
+
attribute_info = AttributeInfo(
|
64
|
+
name=meta_obj["name"],
|
65
|
+
description=meta_obj["description"],
|
66
|
+
type=meta_obj["type"],
|
67
|
+
)
|
68
|
+
metadata_field_obj.append(attribute_info)
|
69
|
+
|
70
|
+
return SelfQueryRetriever.from_llm(
|
71
|
+
self.llm, # type: ignore[attr-defined]
|
72
|
+
self.vectorstore, # type: ignore[attr-defined]
|
73
|
+
self.document_content_description, # type: ignore[attr-defined]
|
74
|
+
metadata_field_obj,
|
75
|
+
verbose=True,
|
76
|
+
)
|
@@ -0,0 +1,24 @@
|
|
1
|
+
from langchain_core.vectorstores import VectorStoreRetriever
|
2
|
+
|
3
|
+
from lfx.custom.custom_component.custom_component import CustomComponent
|
4
|
+
from lfx.field_typing import VectorStore
|
5
|
+
from lfx.inputs.inputs import HandleInput
|
6
|
+
|
7
|
+
|
8
|
+
class VectorStoreRetrieverComponent(CustomComponent):
|
9
|
+
display_name = "VectorStore Retriever"
|
10
|
+
description = "A vector store retriever"
|
11
|
+
name = "VectorStoreRetriever"
|
12
|
+
icon = "LangChain"
|
13
|
+
|
14
|
+
inputs = [
|
15
|
+
HandleInput(
|
16
|
+
name="vectorstore",
|
17
|
+
display_name="Vector Store",
|
18
|
+
input_types=["VectorStore"],
|
19
|
+
required=True,
|
20
|
+
),
|
21
|
+
]
|
22
|
+
|
23
|
+
def build(self, vectorstore: VectorStore) -> VectorStoreRetriever:
|
24
|
+
return vectorstore.as_retriever()
|
@@ -0,0 +1,34 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
from typing import TYPE_CHECKING, Any
|
4
|
+
|
5
|
+
from lfx.components._importing import import_mod
|
6
|
+
|
7
|
+
if TYPE_CHECKING:
|
8
|
+
from .deepseek import DeepSeekModelComponent
|
9
|
+
|
10
|
+
_dynamic_imports = {
|
11
|
+
"DeepSeekModelComponent": "deepseek",
|
12
|
+
}
|
13
|
+
|
14
|
+
__all__ = [
|
15
|
+
"DeepSeekModelComponent",
|
16
|
+
]
|
17
|
+
|
18
|
+
|
19
|
+
def __getattr__(attr_name: str) -> Any:
|
20
|
+
"""Lazily import deepseek components on attribute access."""
|
21
|
+
if attr_name not in _dynamic_imports:
|
22
|
+
msg = f"module '{__name__}' has no attribute '{attr_name}'"
|
23
|
+
raise AttributeError(msg)
|
24
|
+
try:
|
25
|
+
result = import_mod(attr_name, _dynamic_imports[attr_name], __spec__.parent)
|
26
|
+
except (ModuleNotFoundError, ImportError, AttributeError) as e:
|
27
|
+
msg = f"Could not import '{attr_name}' from '{__name__}': {e}"
|
28
|
+
raise AttributeError(msg) from e
|
29
|
+
globals()[attr_name] = result
|
30
|
+
return result
|
31
|
+
|
32
|
+
|
33
|
+
def __dir__() -> list[str]:
|
34
|
+
return list(__all__)
|
@@ -0,0 +1,136 @@
|
|
1
|
+
import requests
|
2
|
+
from pydantic.v1 import SecretStr
|
3
|
+
from typing_extensions import override
|
4
|
+
|
5
|
+
from lfx.base.models.model import LCModelComponent
|
6
|
+
from lfx.field_typing import LanguageModel
|
7
|
+
from lfx.field_typing.range_spec import RangeSpec
|
8
|
+
from lfx.inputs.inputs import BoolInput, DictInput, DropdownInput, IntInput, SecretStrInput, SliderInput, StrInput
|
9
|
+
|
10
|
+
DEEPSEEK_MODELS = ["deepseek-chat"]
|
11
|
+
|
12
|
+
|
13
|
+
class DeepSeekModelComponent(LCModelComponent):
|
14
|
+
display_name = "DeepSeek"
|
15
|
+
description = "Generate text using DeepSeek LLMs."
|
16
|
+
icon = "DeepSeek"
|
17
|
+
|
18
|
+
inputs = [
|
19
|
+
*LCModelComponent.get_base_inputs(),
|
20
|
+
IntInput(
|
21
|
+
name="max_tokens",
|
22
|
+
display_name="Max Tokens",
|
23
|
+
advanced=True,
|
24
|
+
info="Maximum number of tokens to generate. Set to 0 for unlimited.",
|
25
|
+
range_spec=RangeSpec(min=0, max=128000),
|
26
|
+
),
|
27
|
+
DictInput(
|
28
|
+
name="model_kwargs",
|
29
|
+
display_name="Model Kwargs",
|
30
|
+
advanced=True,
|
31
|
+
info="Additional keyword arguments to pass to the model.",
|
32
|
+
),
|
33
|
+
BoolInput(
|
34
|
+
name="json_mode",
|
35
|
+
display_name="JSON Mode",
|
36
|
+
advanced=True,
|
37
|
+
info="If True, it will output JSON regardless of passing a schema.",
|
38
|
+
),
|
39
|
+
DropdownInput(
|
40
|
+
name="model_name",
|
41
|
+
display_name="Model Name",
|
42
|
+
info="DeepSeek model to use",
|
43
|
+
options=DEEPSEEK_MODELS,
|
44
|
+
value="deepseek-chat",
|
45
|
+
refresh_button=True,
|
46
|
+
),
|
47
|
+
StrInput(
|
48
|
+
name="api_base",
|
49
|
+
display_name="DeepSeek API Base",
|
50
|
+
advanced=True,
|
51
|
+
info="Base URL for API requests. Defaults to https://api.deepseek.com",
|
52
|
+
value="https://api.deepseek.com",
|
53
|
+
),
|
54
|
+
SecretStrInput(
|
55
|
+
name="api_key",
|
56
|
+
display_name="DeepSeek API Key",
|
57
|
+
info="The DeepSeek API Key",
|
58
|
+
advanced=False,
|
59
|
+
required=True,
|
60
|
+
),
|
61
|
+
SliderInput(
|
62
|
+
name="temperature",
|
63
|
+
display_name="Temperature",
|
64
|
+
info="Controls randomness in responses",
|
65
|
+
value=1.0,
|
66
|
+
range_spec=RangeSpec(min=0, max=2, step=0.01),
|
67
|
+
advanced=True,
|
68
|
+
),
|
69
|
+
IntInput(
|
70
|
+
name="seed",
|
71
|
+
display_name="Seed",
|
72
|
+
info="The seed controls the reproducibility of the job.",
|
73
|
+
advanced=True,
|
74
|
+
value=1,
|
75
|
+
),
|
76
|
+
]
|
77
|
+
|
78
|
+
def get_models(self) -> list[str]:
|
79
|
+
if not self.api_key:
|
80
|
+
return DEEPSEEK_MODELS
|
81
|
+
|
82
|
+
url = f"{self.api_base}/models"
|
83
|
+
headers = {"Authorization": f"Bearer {self.api_key}", "Accept": "application/json"}
|
84
|
+
|
85
|
+
try:
|
86
|
+
response = requests.get(url, headers=headers, timeout=10)
|
87
|
+
response.raise_for_status()
|
88
|
+
model_list = response.json()
|
89
|
+
return [model["id"] for model in model_list.get("data", [])]
|
90
|
+
except requests.RequestException as e:
|
91
|
+
self.status = f"Error fetching models: {e}"
|
92
|
+
return DEEPSEEK_MODELS
|
93
|
+
|
94
|
+
@override
|
95
|
+
def update_build_config(self, build_config: dict, field_value: str, field_name: str | None = None):
|
96
|
+
if field_name in {"api_key", "api_base", "model_name"}:
|
97
|
+
models = self.get_models()
|
98
|
+
build_config["model_name"]["options"] = models
|
99
|
+
return build_config
|
100
|
+
|
101
|
+
def build_model(self) -> LanguageModel:
|
102
|
+
try:
|
103
|
+
from langchain_openai import ChatOpenAI
|
104
|
+
except ImportError as e:
|
105
|
+
msg = "langchain-openai not installed. Please install with `pip install langchain-openai`"
|
106
|
+
raise ImportError(msg) from e
|
107
|
+
|
108
|
+
api_key = SecretStr(self.api_key).get_secret_value() if self.api_key else None
|
109
|
+
output = ChatOpenAI(
|
110
|
+
model=self.model_name,
|
111
|
+
temperature=self.temperature if self.temperature is not None else 0.1,
|
112
|
+
max_tokens=self.max_tokens or None,
|
113
|
+
model_kwargs=self.model_kwargs or {},
|
114
|
+
base_url=self.api_base,
|
115
|
+
api_key=api_key,
|
116
|
+
streaming=self.stream if hasattr(self, "stream") else False,
|
117
|
+
seed=self.seed,
|
118
|
+
)
|
119
|
+
|
120
|
+
if self.json_mode:
|
121
|
+
output = output.bind(response_format={"type": "json_object"})
|
122
|
+
|
123
|
+
return output
|
124
|
+
|
125
|
+
def _get_exception_message(self, e: Exception):
|
126
|
+
"""Get message from DeepSeek API exception."""
|
127
|
+
try:
|
128
|
+
from openai import BadRequestError
|
129
|
+
|
130
|
+
if isinstance(e, BadRequestError):
|
131
|
+
message = e.body.get("message")
|
132
|
+
if message:
|
133
|
+
return message
|
134
|
+
except ImportError:
|
135
|
+
pass
|
136
|
+
return None
|
@@ -0,0 +1,43 @@
|
|
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 .chunk_docling_document import ChunkDoclingDocumentComponent
|
9
|
+
from .docling_inline import DoclingInlineComponent
|
10
|
+
from .docling_remote import DoclingRemoteComponent
|
11
|
+
from .export_docling_document import ExportDoclingDocumentComponent
|
12
|
+
|
13
|
+
_dynamic_imports = {
|
14
|
+
"ChunkDoclingDocumentComponent": "chunk_docling_document",
|
15
|
+
"DoclingInlineComponent": "docling_inline",
|
16
|
+
"DoclingRemoteComponent": "docling_remote",
|
17
|
+
"ExportDoclingDocumentComponent": "export_docling_document",
|
18
|
+
}
|
19
|
+
|
20
|
+
__all__ = [
|
21
|
+
"ChunkDoclingDocumentComponent",
|
22
|
+
"DoclingInlineComponent",
|
23
|
+
"DoclingRemoteComponent",
|
24
|
+
"ExportDoclingDocumentComponent",
|
25
|
+
]
|
26
|
+
|
27
|
+
|
28
|
+
def __getattr__(attr_name: str) -> Any:
|
29
|
+
"""Lazily import docling components on attribute access."""
|
30
|
+
if attr_name not in _dynamic_imports:
|
31
|
+
msg = f"module '{__name__}' has no attribute '{attr_name}'"
|
32
|
+
raise AttributeError(msg)
|
33
|
+
try:
|
34
|
+
result = import_mod(attr_name, _dynamic_imports[attr_name], __spec__.parent)
|
35
|
+
except (ModuleNotFoundError, ImportError, AttributeError) as e:
|
36
|
+
msg = f"Could not import '{attr_name}' from '{__name__}': {e}"
|
37
|
+
raise AttributeError(msg) from e
|
38
|
+
globals()[attr_name] = result
|
39
|
+
return result
|
40
|
+
|
41
|
+
|
42
|
+
def __dir__() -> list[str]:
|
43
|
+
return list(__all__)
|