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,37 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
from typing import TYPE_CHECKING, Any
|
4
|
+
|
5
|
+
from lfx.components._importing import import_mod
|
6
|
+
|
7
|
+
if TYPE_CHECKING:
|
8
|
+
from .huggingface import HuggingFaceEndpointsComponent
|
9
|
+
from .huggingface_inference_api import HuggingFaceInferenceAPIEmbeddingsComponent
|
10
|
+
|
11
|
+
_dynamic_imports = {
|
12
|
+
"HuggingFaceEndpointsComponent": "huggingface",
|
13
|
+
"HuggingFaceInferenceAPIEmbeddingsComponent": "huggingface_inference_api",
|
14
|
+
}
|
15
|
+
|
16
|
+
__all__ = [
|
17
|
+
"HuggingFaceEndpointsComponent",
|
18
|
+
"HuggingFaceInferenceAPIEmbeddingsComponent",
|
19
|
+
]
|
20
|
+
|
21
|
+
|
22
|
+
def __getattr__(attr_name: str) -> Any:
|
23
|
+
"""Lazily import huggingface components on attribute access."""
|
24
|
+
if attr_name not in _dynamic_imports:
|
25
|
+
msg = f"module '{__name__}' has no attribute '{attr_name}'"
|
26
|
+
raise AttributeError(msg)
|
27
|
+
try:
|
28
|
+
result = import_mod(attr_name, _dynamic_imports[attr_name], __spec__.parent)
|
29
|
+
except (ModuleNotFoundError, ImportError, AttributeError) as e:
|
30
|
+
msg = f"Could not import '{attr_name}' from '{__name__}': {e}"
|
31
|
+
raise AttributeError(msg) from e
|
32
|
+
globals()[attr_name] = result
|
33
|
+
return result
|
34
|
+
|
35
|
+
|
36
|
+
def __dir__() -> list[str]:
|
37
|
+
return list(__all__)
|
@@ -0,0 +1,197 @@
|
|
1
|
+
from typing import Any
|
2
|
+
|
3
|
+
from langchain_community.llms.huggingface_endpoint import HuggingFaceEndpoint
|
4
|
+
from tenacity import retry, stop_after_attempt, wait_fixed
|
5
|
+
|
6
|
+
from lfx.base.models.model import LCModelComponent
|
7
|
+
from lfx.field_typing import LanguageModel
|
8
|
+
from lfx.field_typing.range_spec import RangeSpec
|
9
|
+
from lfx.io import DictInput, DropdownInput, FloatInput, IntInput, SecretStrInput, SliderInput, StrInput
|
10
|
+
|
11
|
+
# TODO: langchain_community.llms.huggingface_endpoint is depreciated.
|
12
|
+
# Need to update to langchain_huggingface, but have dependency with langchain_core 0.3.0
|
13
|
+
|
14
|
+
# Constants
|
15
|
+
DEFAULT_MODEL = "meta-llama/Llama-3.3-70B-Instruct"
|
16
|
+
|
17
|
+
|
18
|
+
class HuggingFaceEndpointsComponent(LCModelComponent):
|
19
|
+
display_name: str = "Hugging Face"
|
20
|
+
description: str = "Generate text using Hugging Face Inference APIs."
|
21
|
+
icon = "HuggingFace"
|
22
|
+
name = "HuggingFaceModel"
|
23
|
+
|
24
|
+
inputs = [
|
25
|
+
*LCModelComponent.get_base_inputs(),
|
26
|
+
DropdownInput(
|
27
|
+
name="model_id",
|
28
|
+
display_name="Model ID",
|
29
|
+
info="Select a model from Hugging Face Hub",
|
30
|
+
options=[
|
31
|
+
DEFAULT_MODEL,
|
32
|
+
"mistralai/Mixtral-8x7B-Instruct-v0.1",
|
33
|
+
"mistralai/Mistral-7B-Instruct-v0.3",
|
34
|
+
"meta-llama/Llama-3.1-8B-Instruct",
|
35
|
+
"Qwen/Qwen2.5-Coder-32B-Instruct",
|
36
|
+
"Qwen/QwQ-32B-Preview",
|
37
|
+
"openai-community/gpt2",
|
38
|
+
"custom",
|
39
|
+
],
|
40
|
+
value=DEFAULT_MODEL,
|
41
|
+
required=True,
|
42
|
+
real_time_refresh=True,
|
43
|
+
),
|
44
|
+
StrInput(
|
45
|
+
name="custom_model",
|
46
|
+
display_name="Custom Model ID",
|
47
|
+
info="Enter a custom model ID from Hugging Face Hub",
|
48
|
+
value="",
|
49
|
+
show=False,
|
50
|
+
required=True,
|
51
|
+
),
|
52
|
+
IntInput(
|
53
|
+
name="max_new_tokens", display_name="Max New Tokens", value=512, info="Maximum number of generated tokens"
|
54
|
+
),
|
55
|
+
IntInput(
|
56
|
+
name="top_k",
|
57
|
+
display_name="Top K",
|
58
|
+
advanced=True,
|
59
|
+
info="The number of highest probability vocabulary tokens to keep for top-k-filtering",
|
60
|
+
),
|
61
|
+
FloatInput(
|
62
|
+
name="top_p",
|
63
|
+
display_name="Top P",
|
64
|
+
value=0.95,
|
65
|
+
advanced=True,
|
66
|
+
info=(
|
67
|
+
"If set to < 1, only the smallest set of most probable tokens with "
|
68
|
+
"probabilities that add up to `top_p` or higher are kept for generation"
|
69
|
+
),
|
70
|
+
),
|
71
|
+
FloatInput(
|
72
|
+
name="typical_p",
|
73
|
+
display_name="Typical P",
|
74
|
+
value=0.95,
|
75
|
+
advanced=True,
|
76
|
+
info="Typical Decoding mass.",
|
77
|
+
),
|
78
|
+
SliderInput(
|
79
|
+
name="temperature",
|
80
|
+
display_name="Temperature",
|
81
|
+
value=0.8,
|
82
|
+
range_spec=RangeSpec(min=0, max=2, step=0.01),
|
83
|
+
info="The value used to module the logits distribution",
|
84
|
+
advanced=True,
|
85
|
+
),
|
86
|
+
FloatInput(
|
87
|
+
name="repetition_penalty",
|
88
|
+
display_name="Repetition Penalty",
|
89
|
+
info="The parameter for repetition penalty. 1.0 means no penalty.",
|
90
|
+
advanced=True,
|
91
|
+
),
|
92
|
+
StrInput(
|
93
|
+
name="inference_endpoint",
|
94
|
+
display_name="Inference Endpoint",
|
95
|
+
value="https://api-inference.huggingface.co/models/",
|
96
|
+
info="Custom inference endpoint URL.",
|
97
|
+
required=True,
|
98
|
+
),
|
99
|
+
DropdownInput(
|
100
|
+
name="task",
|
101
|
+
display_name="Task",
|
102
|
+
options=["text2text-generation", "text-generation", "summarization", "translation"],
|
103
|
+
value="text-generation",
|
104
|
+
advanced=True,
|
105
|
+
info="The task to call the model with. Should be a task that returns `generated_text` or `summary_text`.",
|
106
|
+
),
|
107
|
+
SecretStrInput(name="huggingfacehub_api_token", display_name="API Token", password=True, required=True),
|
108
|
+
DictInput(name="model_kwargs", display_name="Model Keyword Arguments", advanced=True),
|
109
|
+
IntInput(name="retry_attempts", display_name="Retry Attempts", value=1, advanced=True),
|
110
|
+
]
|
111
|
+
|
112
|
+
def get_api_url(self) -> str:
|
113
|
+
if "huggingface" in self.inference_endpoint.lower():
|
114
|
+
if self.model_id == "custom":
|
115
|
+
if not self.custom_model:
|
116
|
+
error_msg = "Custom model ID is required when 'custom' is selected"
|
117
|
+
raise ValueError(error_msg)
|
118
|
+
return f"{self.inference_endpoint}{self.custom_model}"
|
119
|
+
return f"{self.inference_endpoint}{self.model_id}"
|
120
|
+
return self.inference_endpoint
|
121
|
+
|
122
|
+
async def update_build_config(self, build_config: dict, field_value: Any, field_name: str | None = None) -> dict:
|
123
|
+
"""Update build configuration based on field updates."""
|
124
|
+
try:
|
125
|
+
if field_name is None or field_name == "model_id":
|
126
|
+
# If model_id is custom, show custom model field
|
127
|
+
if field_value == "custom":
|
128
|
+
build_config["custom_model"]["show"] = True
|
129
|
+
build_config["custom_model"]["required"] = True
|
130
|
+
else:
|
131
|
+
build_config["custom_model"]["show"] = False
|
132
|
+
build_config["custom_model"]["value"] = ""
|
133
|
+
|
134
|
+
except (KeyError, AttributeError) as e:
|
135
|
+
self.log(f"Error updating build config: {e!s}")
|
136
|
+
return build_config
|
137
|
+
|
138
|
+
def create_huggingface_endpoint(
|
139
|
+
self,
|
140
|
+
task: str | None,
|
141
|
+
huggingfacehub_api_token: str | None,
|
142
|
+
model_kwargs: dict[str, Any],
|
143
|
+
max_new_tokens: int,
|
144
|
+
top_k: int | None,
|
145
|
+
top_p: float,
|
146
|
+
typical_p: float | None,
|
147
|
+
temperature: float | None,
|
148
|
+
repetition_penalty: float | None,
|
149
|
+
) -> HuggingFaceEndpoint:
|
150
|
+
retry_attempts = self.retry_attempts
|
151
|
+
endpoint_url = self.get_api_url()
|
152
|
+
|
153
|
+
@retry(stop=stop_after_attempt(retry_attempts), wait=wait_fixed(2))
|
154
|
+
def _attempt_create():
|
155
|
+
return HuggingFaceEndpoint(
|
156
|
+
endpoint_url=endpoint_url,
|
157
|
+
task=task,
|
158
|
+
huggingfacehub_api_token=huggingfacehub_api_token,
|
159
|
+
model_kwargs=model_kwargs,
|
160
|
+
max_new_tokens=max_new_tokens,
|
161
|
+
top_k=top_k,
|
162
|
+
top_p=top_p,
|
163
|
+
typical_p=typical_p,
|
164
|
+
temperature=temperature,
|
165
|
+
repetition_penalty=repetition_penalty,
|
166
|
+
)
|
167
|
+
|
168
|
+
return _attempt_create()
|
169
|
+
|
170
|
+
def build_model(self) -> LanguageModel:
|
171
|
+
task = self.task or None
|
172
|
+
huggingfacehub_api_token = self.huggingfacehub_api_token
|
173
|
+
model_kwargs = self.model_kwargs or {}
|
174
|
+
max_new_tokens = self.max_new_tokens
|
175
|
+
top_k = self.top_k or None
|
176
|
+
top_p = self.top_p
|
177
|
+
typical_p = self.typical_p or None
|
178
|
+
temperature = self.temperature or 0.8
|
179
|
+
repetition_penalty = self.repetition_penalty or None
|
180
|
+
|
181
|
+
try:
|
182
|
+
llm = self.create_huggingface_endpoint(
|
183
|
+
task=task,
|
184
|
+
huggingfacehub_api_token=huggingfacehub_api_token,
|
185
|
+
model_kwargs=model_kwargs,
|
186
|
+
max_new_tokens=max_new_tokens,
|
187
|
+
top_k=top_k,
|
188
|
+
top_p=top_p,
|
189
|
+
typical_p=typical_p,
|
190
|
+
temperature=temperature,
|
191
|
+
repetition_penalty=repetition_penalty,
|
192
|
+
)
|
193
|
+
except Exception as e:
|
194
|
+
msg = "Could not connect to Hugging Face Endpoints API."
|
195
|
+
raise ValueError(msg) from e
|
196
|
+
|
197
|
+
return llm
|
@@ -0,0 +1,106 @@
|
|
1
|
+
from urllib.parse import urlparse
|
2
|
+
|
3
|
+
import requests
|
4
|
+
from langchain_community.embeddings.huggingface import HuggingFaceInferenceAPIEmbeddings
|
5
|
+
|
6
|
+
# Next update: use langchain_huggingface
|
7
|
+
from pydantic import SecretStr
|
8
|
+
from tenacity import retry, stop_after_attempt, wait_fixed
|
9
|
+
|
10
|
+
from lfx.base.embeddings.model import LCEmbeddingsModel
|
11
|
+
from lfx.field_typing import Embeddings
|
12
|
+
from lfx.io import MessageTextInput, Output, SecretStrInput
|
13
|
+
|
14
|
+
|
15
|
+
class HuggingFaceInferenceAPIEmbeddingsComponent(LCEmbeddingsModel):
|
16
|
+
display_name = "Hugging Face Embeddings Inference"
|
17
|
+
description = "Generate embeddings using Hugging Face Text Embeddings Inference (TEI)"
|
18
|
+
documentation = "https://huggingface.co/docs/text-embeddings-inference/index"
|
19
|
+
icon = "HuggingFace"
|
20
|
+
name = "HuggingFaceInferenceAPIEmbeddings"
|
21
|
+
|
22
|
+
inputs = [
|
23
|
+
SecretStrInput(
|
24
|
+
name="api_key",
|
25
|
+
display_name="API Key",
|
26
|
+
advanced=False,
|
27
|
+
info="Required for non-local inference endpoints. Local inference does not require an API Key.",
|
28
|
+
),
|
29
|
+
MessageTextInput(
|
30
|
+
name="inference_endpoint",
|
31
|
+
display_name="Inference Endpoint",
|
32
|
+
required=True,
|
33
|
+
value="https://api-inference.huggingface.co/models/",
|
34
|
+
info="Custom inference endpoint URL.",
|
35
|
+
),
|
36
|
+
MessageTextInput(
|
37
|
+
name="model_name",
|
38
|
+
display_name="Model Name",
|
39
|
+
value="BAAI/bge-large-en-v1.5",
|
40
|
+
info="The name of the model to use for text embeddings.",
|
41
|
+
required=True,
|
42
|
+
),
|
43
|
+
]
|
44
|
+
|
45
|
+
outputs = [
|
46
|
+
Output(display_name="Embeddings", name="embeddings", method="build_embeddings"),
|
47
|
+
]
|
48
|
+
|
49
|
+
def validate_inference_endpoint(self, inference_endpoint: str) -> bool:
|
50
|
+
parsed_url = urlparse(inference_endpoint)
|
51
|
+
if not all([parsed_url.scheme, parsed_url.netloc]):
|
52
|
+
msg = (
|
53
|
+
f"Invalid inference endpoint format: '{self.inference_endpoint}'. "
|
54
|
+
"Please ensure the URL includes both a scheme (e.g., 'http://' or 'https://') and a domain name. "
|
55
|
+
"Example: 'http://localhost:8080' or 'https://api.example.com'"
|
56
|
+
)
|
57
|
+
raise ValueError(msg)
|
58
|
+
|
59
|
+
try:
|
60
|
+
response = requests.get(f"{inference_endpoint}/health", timeout=5)
|
61
|
+
except requests.RequestException as e:
|
62
|
+
msg = (
|
63
|
+
f"Inference endpoint '{inference_endpoint}' is not responding. "
|
64
|
+
"Please ensure the URL is correct and the service is running."
|
65
|
+
)
|
66
|
+
raise ValueError(msg) from e
|
67
|
+
|
68
|
+
if response.status_code != requests.codes.ok:
|
69
|
+
msg = f"Hugging Face health check failed: {response.status_code}"
|
70
|
+
raise ValueError(msg)
|
71
|
+
# returning True to solve linting error
|
72
|
+
return True
|
73
|
+
|
74
|
+
def get_api_url(self) -> str:
|
75
|
+
if "huggingface" in self.inference_endpoint.lower():
|
76
|
+
return f"{self.inference_endpoint}"
|
77
|
+
return self.inference_endpoint
|
78
|
+
|
79
|
+
@retry(stop=stop_after_attempt(3), wait=wait_fixed(2))
|
80
|
+
def create_huggingface_embeddings(
|
81
|
+
self, api_key: SecretStr, api_url: str, model_name: str
|
82
|
+
) -> HuggingFaceInferenceAPIEmbeddings:
|
83
|
+
return HuggingFaceInferenceAPIEmbeddings(api_key=api_key, api_url=api_url, model_name=model_name)
|
84
|
+
|
85
|
+
def build_embeddings(self) -> Embeddings:
|
86
|
+
api_url = self.get_api_url()
|
87
|
+
|
88
|
+
is_local_url = (
|
89
|
+
api_url.startswith(("http://localhost", "http://127.0.0.1", "http://0.0.0.0", "http://docker"))
|
90
|
+
or "huggingface.co" not in api_url.lower()
|
91
|
+
)
|
92
|
+
|
93
|
+
if not self.api_key and is_local_url:
|
94
|
+
self.validate_inference_endpoint(api_url)
|
95
|
+
api_key = SecretStr("APIKeyForLocalDeployment")
|
96
|
+
elif not self.api_key:
|
97
|
+
msg = "API Key is required for non-local inference endpoints"
|
98
|
+
raise ValueError(msg)
|
99
|
+
else:
|
100
|
+
api_key = SecretStr(self.api_key).get_secret_value()
|
101
|
+
|
102
|
+
try:
|
103
|
+
return self.create_huggingface_embeddings(api_key, api_url, self.model_name)
|
104
|
+
except Exception as e:
|
105
|
+
msg = "Could not connect to Hugging Face Inference API."
|
106
|
+
raise ValueError(msg) from e
|
@@ -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 lfx.components.ibm.watsonx import WatsonxAIComponent
|
9
|
+
from lfx.components.ibm.watsonx_embeddings import WatsonxEmbeddingsComponent
|
10
|
+
|
11
|
+
_dynamic_imports = {
|
12
|
+
"WatsonxAIComponent": "watsonx",
|
13
|
+
"WatsonxEmbeddingsComponent": "watsonx_embeddings",
|
14
|
+
}
|
15
|
+
|
16
|
+
__all__ = ["WatsonxAIComponent", "WatsonxEmbeddingsComponent"]
|
17
|
+
|
18
|
+
|
19
|
+
def __getattr__(attr_name: str) -> Any:
|
20
|
+
"""Lazily import ibm 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,203 @@
|
|
1
|
+
import json
|
2
|
+
from typing import Any
|
3
|
+
|
4
|
+
import requests
|
5
|
+
from langchain_ibm import ChatWatsonx
|
6
|
+
from pydantic.v1 import SecretStr
|
7
|
+
|
8
|
+
from lfx.base.models.model import LCModelComponent
|
9
|
+
from lfx.field_typing import LanguageModel
|
10
|
+
from lfx.field_typing.range_spec import RangeSpec
|
11
|
+
from lfx.inputs.inputs import BoolInput, DropdownInput, IntInput, SecretStrInput, SliderInput, StrInput
|
12
|
+
from lfx.log.logger import logger
|
13
|
+
from lfx.schema.dotdict import dotdict
|
14
|
+
|
15
|
+
|
16
|
+
class WatsonxAIComponent(LCModelComponent):
|
17
|
+
display_name = "IBM watsonx.ai"
|
18
|
+
description = "Generate text using IBM watsonx.ai foundation models."
|
19
|
+
icon = "WatsonxAI"
|
20
|
+
name = "IBMwatsonxModel"
|
21
|
+
beta = False
|
22
|
+
|
23
|
+
_default_models = ["ibm/granite-3-2b-instruct", "ibm/granite-3-8b-instruct", "ibm/granite-13b-instruct-v2"]
|
24
|
+
|
25
|
+
inputs = [
|
26
|
+
*LCModelComponent.get_base_inputs(),
|
27
|
+
DropdownInput(
|
28
|
+
name="url",
|
29
|
+
display_name="watsonx API Endpoint",
|
30
|
+
info="The base URL of the API.",
|
31
|
+
value=None,
|
32
|
+
options=[
|
33
|
+
"https://us-south.ml.cloud.ibm.com",
|
34
|
+
"https://eu-de.ml.cloud.ibm.com",
|
35
|
+
"https://eu-gb.ml.cloud.ibm.com",
|
36
|
+
"https://au-syd.ml.cloud.ibm.com",
|
37
|
+
"https://jp-tok.ml.cloud.ibm.com",
|
38
|
+
"https://ca-tor.ml.cloud.ibm.com",
|
39
|
+
],
|
40
|
+
real_time_refresh=True,
|
41
|
+
),
|
42
|
+
StrInput(
|
43
|
+
name="project_id",
|
44
|
+
display_name="watsonx Project ID",
|
45
|
+
required=True,
|
46
|
+
info="The project ID or deployment space ID that is associated with the foundation model.",
|
47
|
+
),
|
48
|
+
SecretStrInput(
|
49
|
+
name="api_key",
|
50
|
+
display_name="API Key",
|
51
|
+
info="The API Key to use for the model.",
|
52
|
+
required=True,
|
53
|
+
),
|
54
|
+
DropdownInput(
|
55
|
+
name="model_name",
|
56
|
+
display_name="Model Name",
|
57
|
+
options=[],
|
58
|
+
value=None,
|
59
|
+
dynamic=True,
|
60
|
+
required=True,
|
61
|
+
),
|
62
|
+
IntInput(
|
63
|
+
name="max_tokens",
|
64
|
+
display_name="Max Tokens",
|
65
|
+
advanced=True,
|
66
|
+
info="The maximum number of tokens to generate.",
|
67
|
+
range_spec=RangeSpec(min=1, max=4096),
|
68
|
+
value=1000,
|
69
|
+
),
|
70
|
+
StrInput(
|
71
|
+
name="stop_sequence",
|
72
|
+
display_name="Stop Sequence",
|
73
|
+
advanced=True,
|
74
|
+
info="Sequence where generation should stop.",
|
75
|
+
field_type="str",
|
76
|
+
),
|
77
|
+
SliderInput(
|
78
|
+
name="temperature",
|
79
|
+
display_name="Temperature",
|
80
|
+
info="Controls randomness, higher values increase diversity.",
|
81
|
+
value=0.1,
|
82
|
+
range_spec=RangeSpec(min=0, max=2, step=0.01),
|
83
|
+
advanced=True,
|
84
|
+
),
|
85
|
+
SliderInput(
|
86
|
+
name="top_p",
|
87
|
+
display_name="Top P",
|
88
|
+
info="The cumulative probability cutoff for token selection. "
|
89
|
+
"Lower values mean sampling from a smaller, more top-weighted nucleus.",
|
90
|
+
value=0.9,
|
91
|
+
range_spec=RangeSpec(min=0, max=1, step=0.01),
|
92
|
+
advanced=True,
|
93
|
+
),
|
94
|
+
SliderInput(
|
95
|
+
name="frequency_penalty",
|
96
|
+
display_name="Frequency Penalty",
|
97
|
+
info="Penalty for frequency of token usage.",
|
98
|
+
value=0.5,
|
99
|
+
range_spec=RangeSpec(min=-2.0, max=2.0, step=0.01),
|
100
|
+
advanced=True,
|
101
|
+
),
|
102
|
+
SliderInput(
|
103
|
+
name="presence_penalty",
|
104
|
+
display_name="Presence Penalty",
|
105
|
+
info="Penalty for token presence in prior text.",
|
106
|
+
value=0.3,
|
107
|
+
range_spec=RangeSpec(min=-2.0, max=2.0, step=0.01),
|
108
|
+
advanced=True,
|
109
|
+
),
|
110
|
+
IntInput(
|
111
|
+
name="seed",
|
112
|
+
display_name="Random Seed",
|
113
|
+
advanced=True,
|
114
|
+
info="The random seed for the model.",
|
115
|
+
value=8,
|
116
|
+
),
|
117
|
+
BoolInput(
|
118
|
+
name="logprobs",
|
119
|
+
display_name="Log Probabilities",
|
120
|
+
advanced=True,
|
121
|
+
info="Whether to return log probabilities of the output tokens.",
|
122
|
+
value=True,
|
123
|
+
),
|
124
|
+
IntInput(
|
125
|
+
name="top_logprobs",
|
126
|
+
display_name="Top Log Probabilities",
|
127
|
+
advanced=True,
|
128
|
+
info="Number of most likely tokens to return at each position.",
|
129
|
+
value=3,
|
130
|
+
range_spec=RangeSpec(min=1, max=20),
|
131
|
+
),
|
132
|
+
StrInput(
|
133
|
+
name="logit_bias",
|
134
|
+
display_name="Logit Bias",
|
135
|
+
advanced=True,
|
136
|
+
info='JSON string of token IDs to bias or suppress (e.g., {"1003": -100, "1004": 100}).',
|
137
|
+
field_type="str",
|
138
|
+
),
|
139
|
+
]
|
140
|
+
|
141
|
+
@staticmethod
|
142
|
+
def fetch_models(base_url: str) -> list[str]:
|
143
|
+
"""Fetch available models from the watsonx.ai API."""
|
144
|
+
try:
|
145
|
+
endpoint = f"{base_url}/ml/v1/foundation_model_specs"
|
146
|
+
params = {"version": "2024-09-16", "filters": "function_text_chat,!lifecycle_withdrawn"}
|
147
|
+
response = requests.get(endpoint, params=params, timeout=10)
|
148
|
+
response.raise_for_status()
|
149
|
+
data = response.json()
|
150
|
+
models = [model["model_id"] for model in data.get("resources", [])]
|
151
|
+
return sorted(models)
|
152
|
+
except Exception: # noqa: BLE001
|
153
|
+
logger.exception("Error fetching models. Using default models.")
|
154
|
+
return WatsonxAIComponent._default_models
|
155
|
+
|
156
|
+
def update_build_config(self, build_config: dotdict, field_value: Any, field_name: str | None = None):
|
157
|
+
"""Update model options when URL or API key changes."""
|
158
|
+
logger.info("Updating build config. Field name: %s, Field value: %s", field_name, field_value)
|
159
|
+
|
160
|
+
if field_name == "url" and field_value:
|
161
|
+
try:
|
162
|
+
models = self.fetch_models(base_url=build_config.url.value)
|
163
|
+
build_config.model_name.options = models
|
164
|
+
if build_config.model_name.value:
|
165
|
+
build_config.model_name.value = models[0]
|
166
|
+
info_message = f"Updated model options: {len(models)} models found in {build_config.url.value}"
|
167
|
+
logger.info(info_message)
|
168
|
+
except Exception: # noqa: BLE001
|
169
|
+
logger.exception("Error updating model options.")
|
170
|
+
|
171
|
+
def build_model(self) -> LanguageModel:
|
172
|
+
# Parse logit_bias from JSON string if provided
|
173
|
+
logit_bias = None
|
174
|
+
if hasattr(self, "logit_bias") and self.logit_bias:
|
175
|
+
try:
|
176
|
+
logit_bias = json.loads(self.logit_bias)
|
177
|
+
except json.JSONDecodeError:
|
178
|
+
logger.warning("Invalid logit_bias JSON format. Using default instead.")
|
179
|
+
logit_bias = {"1003": -100, "1004": -100}
|
180
|
+
|
181
|
+
chat_params = {
|
182
|
+
"max_tokens": getattr(self, "max_tokens", None),
|
183
|
+
"temperature": getattr(self, "temperature", None),
|
184
|
+
"top_p": getattr(self, "top_p", None),
|
185
|
+
"frequency_penalty": getattr(self, "frequency_penalty", None),
|
186
|
+
"presence_penalty": getattr(self, "presence_penalty", None),
|
187
|
+
"seed": getattr(self, "seed", None),
|
188
|
+
"stop": [self.stop_sequence] if self.stop_sequence else [],
|
189
|
+
"n": 1,
|
190
|
+
"logprobs": getattr(self, "logprobs", True),
|
191
|
+
"top_logprobs": getattr(self, "top_logprobs", None),
|
192
|
+
"time_limit": 600000,
|
193
|
+
"logit_bias": logit_bias,
|
194
|
+
}
|
195
|
+
|
196
|
+
return ChatWatsonx(
|
197
|
+
apikey=SecretStr(self.api_key).get_secret_value(),
|
198
|
+
url=self.url,
|
199
|
+
project_id=self.project_id,
|
200
|
+
model_id=self.model_name,
|
201
|
+
params=chat_params,
|
202
|
+
streaming=self.stream,
|
203
|
+
)
|