lfx-nightly 0.2.0.dev25__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of lfx-nightly might be problematic. Click here for more details.
- lfx/__init__.py +0 -0
- lfx/__main__.py +25 -0
- lfx/_assets/component_index.json +1 -0
- lfx/base/__init__.py +0 -0
- lfx/base/agents/__init__.py +0 -0
- lfx/base/agents/agent.py +375 -0
- lfx/base/agents/altk_base_agent.py +380 -0
- lfx/base/agents/altk_tool_wrappers.py +565 -0
- lfx/base/agents/callback.py +130 -0
- lfx/base/agents/context.py +109 -0
- lfx/base/agents/crewai/__init__.py +0 -0
- lfx/base/agents/crewai/crew.py +231 -0
- lfx/base/agents/crewai/tasks.py +12 -0
- lfx/base/agents/default_prompts.py +23 -0
- lfx/base/agents/errors.py +15 -0
- lfx/base/agents/events.py +430 -0
- lfx/base/agents/utils.py +237 -0
- lfx/base/astra_assistants/__init__.py +0 -0
- lfx/base/astra_assistants/util.py +171 -0
- lfx/base/chains/__init__.py +0 -0
- lfx/base/chains/model.py +19 -0
- lfx/base/composio/__init__.py +0 -0
- lfx/base/composio/composio_base.py +2584 -0
- lfx/base/compressors/__init__.py +0 -0
- lfx/base/compressors/model.py +60 -0
- lfx/base/constants.py +46 -0
- lfx/base/curl/__init__.py +0 -0
- lfx/base/curl/parse.py +188 -0
- lfx/base/data/__init__.py +5 -0
- lfx/base/data/base_file.py +810 -0
- lfx/base/data/docling_utils.py +338 -0
- lfx/base/data/storage_utils.py +192 -0
- lfx/base/data/utils.py +362 -0
- lfx/base/datastax/__init__.py +5 -0
- lfx/base/datastax/astradb_base.py +896 -0
- lfx/base/document_transformers/__init__.py +0 -0
- lfx/base/document_transformers/model.py +43 -0
- lfx/base/embeddings/__init__.py +0 -0
- lfx/base/embeddings/aiml_embeddings.py +62 -0
- lfx/base/embeddings/embeddings_class.py +113 -0
- lfx/base/embeddings/model.py +26 -0
- lfx/base/flow_processing/__init__.py +0 -0
- lfx/base/flow_processing/utils.py +86 -0
- lfx/base/huggingface/__init__.py +0 -0
- lfx/base/huggingface/model_bridge.py +133 -0
- lfx/base/io/__init__.py +0 -0
- lfx/base/io/chat.py +21 -0
- lfx/base/io/text.py +22 -0
- lfx/base/knowledge_bases/__init__.py +3 -0
- lfx/base/knowledge_bases/knowledge_base_utils.py +137 -0
- lfx/base/langchain_utilities/__init__.py +0 -0
- lfx/base/langchain_utilities/model.py +35 -0
- lfx/base/langchain_utilities/spider_constants.py +1 -0
- lfx/base/langwatch/__init__.py +0 -0
- lfx/base/langwatch/utils.py +18 -0
- lfx/base/mcp/__init__.py +0 -0
- lfx/base/mcp/constants.py +2 -0
- lfx/base/mcp/util.py +1659 -0
- lfx/base/memory/__init__.py +0 -0
- lfx/base/memory/memory.py +49 -0
- lfx/base/memory/model.py +38 -0
- lfx/base/models/__init__.py +3 -0
- lfx/base/models/aiml_constants.py +51 -0
- lfx/base/models/anthropic_constants.py +51 -0
- lfx/base/models/aws_constants.py +151 -0
- lfx/base/models/chat_result.py +76 -0
- lfx/base/models/cometapi_constants.py +54 -0
- lfx/base/models/google_generative_ai_constants.py +70 -0
- lfx/base/models/google_generative_ai_model.py +38 -0
- lfx/base/models/groq_constants.py +150 -0
- lfx/base/models/groq_model_discovery.py +265 -0
- lfx/base/models/model.py +375 -0
- lfx/base/models/model_input_constants.py +378 -0
- lfx/base/models/model_metadata.py +41 -0
- lfx/base/models/model_utils.py +108 -0
- lfx/base/models/novita_constants.py +35 -0
- lfx/base/models/ollama_constants.py +52 -0
- lfx/base/models/openai_constants.py +129 -0
- lfx/base/models/sambanova_constants.py +18 -0
- lfx/base/models/watsonx_constants.py +36 -0
- lfx/base/processing/__init__.py +0 -0
- lfx/base/prompts/__init__.py +0 -0
- lfx/base/prompts/api_utils.py +224 -0
- lfx/base/prompts/utils.py +61 -0
- lfx/base/textsplitters/__init__.py +0 -0
- lfx/base/textsplitters/model.py +28 -0
- lfx/base/tools/__init__.py +0 -0
- lfx/base/tools/base.py +26 -0
- lfx/base/tools/component_tool.py +325 -0
- lfx/base/tools/constants.py +49 -0
- lfx/base/tools/flow_tool.py +132 -0
- lfx/base/tools/run_flow.py +698 -0
- lfx/base/vectorstores/__init__.py +0 -0
- lfx/base/vectorstores/model.py +193 -0
- lfx/base/vectorstores/utils.py +22 -0
- lfx/base/vectorstores/vector_store_connection_decorator.py +52 -0
- lfx/cli/__init__.py +5 -0
- lfx/cli/commands.py +327 -0
- lfx/cli/common.py +650 -0
- lfx/cli/run.py +506 -0
- lfx/cli/script_loader.py +289 -0
- lfx/cli/serve_app.py +546 -0
- lfx/cli/validation.py +69 -0
- lfx/components/FAISS/__init__.py +34 -0
- lfx/components/FAISS/faiss.py +111 -0
- lfx/components/Notion/__init__.py +19 -0
- lfx/components/Notion/add_content_to_page.py +269 -0
- lfx/components/Notion/create_page.py +94 -0
- lfx/components/Notion/list_database_properties.py +68 -0
- lfx/components/Notion/list_pages.py +122 -0
- lfx/components/Notion/list_users.py +77 -0
- lfx/components/Notion/page_content_viewer.py +93 -0
- lfx/components/Notion/search.py +111 -0
- lfx/components/Notion/update_page_property.py +114 -0
- lfx/components/__init__.py +428 -0
- lfx/components/_importing.py +42 -0
- lfx/components/agentql/__init__.py +3 -0
- lfx/components/agentql/agentql_api.py +151 -0
- lfx/components/aiml/__init__.py +37 -0
- lfx/components/aiml/aiml.py +115 -0
- lfx/components/aiml/aiml_embeddings.py +37 -0
- lfx/components/altk/__init__.py +34 -0
- lfx/components/altk/altk_agent.py +193 -0
- lfx/components/amazon/__init__.py +36 -0
- lfx/components/amazon/amazon_bedrock_converse.py +195 -0
- lfx/components/amazon/amazon_bedrock_embedding.py +109 -0
- lfx/components/amazon/amazon_bedrock_model.py +130 -0
- lfx/components/amazon/s3_bucket_uploader.py +211 -0
- lfx/components/anthropic/__init__.py +34 -0
- lfx/components/anthropic/anthropic.py +187 -0
- lfx/components/apify/__init__.py +5 -0
- lfx/components/apify/apify_actor.py +325 -0
- lfx/components/arxiv/__init__.py +3 -0
- lfx/components/arxiv/arxiv.py +169 -0
- lfx/components/assemblyai/__init__.py +46 -0
- lfx/components/assemblyai/assemblyai_get_subtitles.py +83 -0
- lfx/components/assemblyai/assemblyai_lemur.py +183 -0
- lfx/components/assemblyai/assemblyai_list_transcripts.py +95 -0
- lfx/components/assemblyai/assemblyai_poll_transcript.py +72 -0
- lfx/components/assemblyai/assemblyai_start_transcript.py +188 -0
- lfx/components/azure/__init__.py +37 -0
- lfx/components/azure/azure_openai.py +95 -0
- lfx/components/azure/azure_openai_embeddings.py +83 -0
- lfx/components/baidu/__init__.py +32 -0
- lfx/components/baidu/baidu_qianfan_chat.py +113 -0
- lfx/components/bing/__init__.py +3 -0
- lfx/components/bing/bing_search_api.py +61 -0
- lfx/components/cassandra/__init__.py +40 -0
- lfx/components/cassandra/cassandra.py +264 -0
- lfx/components/cassandra/cassandra_chat.py +92 -0
- lfx/components/cassandra/cassandra_graph.py +238 -0
- lfx/components/chains/__init__.py +3 -0
- lfx/components/chroma/__init__.py +34 -0
- lfx/components/chroma/chroma.py +169 -0
- lfx/components/cleanlab/__init__.py +40 -0
- lfx/components/cleanlab/cleanlab_evaluator.py +155 -0
- lfx/components/cleanlab/cleanlab_rag_evaluator.py +254 -0
- lfx/components/cleanlab/cleanlab_remediator.py +131 -0
- lfx/components/clickhouse/__init__.py +34 -0
- lfx/components/clickhouse/clickhouse.py +135 -0
- lfx/components/cloudflare/__init__.py +32 -0
- lfx/components/cloudflare/cloudflare.py +81 -0
- lfx/components/cohere/__init__.py +40 -0
- lfx/components/cohere/cohere_embeddings.py +81 -0
- lfx/components/cohere/cohere_models.py +46 -0
- lfx/components/cohere/cohere_rerank.py +51 -0
- lfx/components/cometapi/__init__.py +32 -0
- lfx/components/cometapi/cometapi.py +166 -0
- lfx/components/composio/__init__.py +222 -0
- lfx/components/composio/agentql_composio.py +11 -0
- lfx/components/composio/agiled_composio.py +11 -0
- lfx/components/composio/airtable_composio.py +11 -0
- lfx/components/composio/apollo_composio.py +11 -0
- lfx/components/composio/asana_composio.py +11 -0
- lfx/components/composio/attio_composio.py +11 -0
- lfx/components/composio/bitbucket_composio.py +11 -0
- lfx/components/composio/bolna_composio.py +11 -0
- lfx/components/composio/brightdata_composio.py +11 -0
- lfx/components/composio/calendly_composio.py +11 -0
- lfx/components/composio/canva_composio.py +11 -0
- lfx/components/composio/canvas_composio.py +11 -0
- lfx/components/composio/coda_composio.py +11 -0
- lfx/components/composio/composio_api.py +278 -0
- lfx/components/composio/contentful_composio.py +11 -0
- lfx/components/composio/digicert_composio.py +11 -0
- lfx/components/composio/discord_composio.py +11 -0
- lfx/components/composio/dropbox_compnent.py +11 -0
- lfx/components/composio/elevenlabs_composio.py +11 -0
- lfx/components/composio/exa_composio.py +11 -0
- lfx/components/composio/figma_composio.py +11 -0
- lfx/components/composio/finage_composio.py +11 -0
- lfx/components/composio/firecrawl_composio.py +11 -0
- lfx/components/composio/fireflies_composio.py +11 -0
- lfx/components/composio/fixer_composio.py +11 -0
- lfx/components/composio/flexisign_composio.py +11 -0
- lfx/components/composio/freshdesk_composio.py +11 -0
- lfx/components/composio/github_composio.py +11 -0
- lfx/components/composio/gmail_composio.py +38 -0
- lfx/components/composio/googlebigquery_composio.py +11 -0
- lfx/components/composio/googlecalendar_composio.py +11 -0
- lfx/components/composio/googleclassroom_composio.py +11 -0
- lfx/components/composio/googledocs_composio.py +11 -0
- lfx/components/composio/googlemeet_composio.py +11 -0
- lfx/components/composio/googlesheets_composio.py +11 -0
- lfx/components/composio/googletasks_composio.py +8 -0
- lfx/components/composio/heygen_composio.py +11 -0
- lfx/components/composio/instagram_composio.py +11 -0
- lfx/components/composio/jira_composio.py +11 -0
- lfx/components/composio/jotform_composio.py +11 -0
- lfx/components/composio/klaviyo_composio.py +11 -0
- lfx/components/composio/linear_composio.py +11 -0
- lfx/components/composio/listennotes_composio.py +11 -0
- lfx/components/composio/mem0_composio.py +11 -0
- lfx/components/composio/miro_composio.py +11 -0
- lfx/components/composio/missive_composio.py +11 -0
- lfx/components/composio/notion_composio.py +11 -0
- lfx/components/composio/onedrive_composio.py +11 -0
- lfx/components/composio/outlook_composio.py +11 -0
- lfx/components/composio/pandadoc_composio.py +11 -0
- lfx/components/composio/peopledatalabs_composio.py +11 -0
- lfx/components/composio/perplexityai_composio.py +11 -0
- lfx/components/composio/reddit_composio.py +11 -0
- lfx/components/composio/serpapi_composio.py +11 -0
- lfx/components/composio/slack_composio.py +11 -0
- lfx/components/composio/slackbot_composio.py +11 -0
- lfx/components/composio/snowflake_composio.py +11 -0
- lfx/components/composio/supabase_composio.py +11 -0
- lfx/components/composio/tavily_composio.py +11 -0
- lfx/components/composio/timelinesai_composio.py +11 -0
- lfx/components/composio/todoist_composio.py +11 -0
- lfx/components/composio/wrike_composio.py +11 -0
- lfx/components/composio/youtube_composio.py +11 -0
- lfx/components/confluence/__init__.py +3 -0
- lfx/components/confluence/confluence.py +84 -0
- lfx/components/couchbase/__init__.py +34 -0
- lfx/components/couchbase/couchbase.py +102 -0
- lfx/components/crewai/__init__.py +49 -0
- lfx/components/crewai/crewai.py +108 -0
- lfx/components/crewai/hierarchical_crew.py +47 -0
- lfx/components/crewai/hierarchical_task.py +45 -0
- lfx/components/crewai/sequential_crew.py +53 -0
- lfx/components/crewai/sequential_task.py +74 -0
- lfx/components/crewai/sequential_task_agent.py +144 -0
- lfx/components/cuga/__init__.py +34 -0
- lfx/components/cuga/cuga_agent.py +730 -0
- lfx/components/custom_component/__init__.py +34 -0
- lfx/components/custom_component/custom_component.py +31 -0
- lfx/components/data/__init__.py +114 -0
- lfx/components/data_source/__init__.py +58 -0
- lfx/components/data_source/api_request.py +577 -0
- lfx/components/data_source/csv_to_data.py +101 -0
- lfx/components/data_source/json_to_data.py +106 -0
- lfx/components/data_source/mock_data.py +398 -0
- lfx/components/data_source/news_search.py +166 -0
- lfx/components/data_source/rss.py +71 -0
- lfx/components/data_source/sql_executor.py +101 -0
- lfx/components/data_source/url.py +311 -0
- lfx/components/data_source/web_search.py +326 -0
- lfx/components/datastax/__init__.py +76 -0
- lfx/components/datastax/astradb_assistant_manager.py +307 -0
- lfx/components/datastax/astradb_chatmemory.py +40 -0
- lfx/components/datastax/astradb_cql.py +288 -0
- lfx/components/datastax/astradb_graph.py +217 -0
- lfx/components/datastax/astradb_tool.py +378 -0
- lfx/components/datastax/astradb_vectorize.py +122 -0
- lfx/components/datastax/astradb_vectorstore.py +449 -0
- lfx/components/datastax/create_assistant.py +59 -0
- lfx/components/datastax/create_thread.py +33 -0
- lfx/components/datastax/dotenv.py +36 -0
- lfx/components/datastax/get_assistant.py +38 -0
- lfx/components/datastax/getenvvar.py +31 -0
- lfx/components/datastax/graph_rag.py +141 -0
- lfx/components/datastax/hcd.py +315 -0
- lfx/components/datastax/list_assistants.py +26 -0
- lfx/components/datastax/run.py +90 -0
- lfx/components/deactivated/__init__.py +15 -0
- lfx/components/deactivated/amazon_kendra.py +66 -0
- lfx/components/deactivated/chat_litellm_model.py +158 -0
- lfx/components/deactivated/code_block_extractor.py +26 -0
- lfx/components/deactivated/documents_to_data.py +22 -0
- lfx/components/deactivated/embed.py +16 -0
- lfx/components/deactivated/extract_key_from_data.py +46 -0
- lfx/components/deactivated/json_document_builder.py +57 -0
- lfx/components/deactivated/list_flows.py +20 -0
- lfx/components/deactivated/mcp_sse.py +61 -0
- lfx/components/deactivated/mcp_stdio.py +62 -0
- lfx/components/deactivated/merge_data.py +93 -0
- lfx/components/deactivated/message.py +37 -0
- lfx/components/deactivated/metal.py +54 -0
- lfx/components/deactivated/multi_query.py +59 -0
- lfx/components/deactivated/retriever.py +43 -0
- lfx/components/deactivated/selective_passthrough.py +77 -0
- lfx/components/deactivated/should_run_next.py +40 -0
- lfx/components/deactivated/split_text.py +63 -0
- lfx/components/deactivated/store_message.py +24 -0
- lfx/components/deactivated/sub_flow.py +124 -0
- lfx/components/deactivated/vectara_self_query.py +76 -0
- lfx/components/deactivated/vector_store.py +24 -0
- lfx/components/deepseek/__init__.py +34 -0
- lfx/components/deepseek/deepseek.py +136 -0
- lfx/components/docling/__init__.py +43 -0
- lfx/components/docling/chunk_docling_document.py +186 -0
- lfx/components/docling/docling_inline.py +238 -0
- lfx/components/docling/docling_remote.py +195 -0
- lfx/components/docling/export_docling_document.py +117 -0
- lfx/components/documentloaders/__init__.py +3 -0
- lfx/components/duckduckgo/__init__.py +3 -0
- lfx/components/duckduckgo/duck_duck_go_search_run.py +92 -0
- lfx/components/elastic/__init__.py +37 -0
- lfx/components/elastic/elasticsearch.py +267 -0
- lfx/components/elastic/opensearch.py +789 -0
- lfx/components/elastic/opensearch_multimodal.py +1575 -0
- lfx/components/embeddings/__init__.py +37 -0
- lfx/components/embeddings/similarity.py +77 -0
- lfx/components/embeddings/text_embedder.py +65 -0
- lfx/components/exa/__init__.py +3 -0
- lfx/components/exa/exa_search.py +68 -0
- lfx/components/files_and_knowledge/__init__.py +47 -0
- lfx/components/files_and_knowledge/directory.py +113 -0
- lfx/components/files_and_knowledge/file.py +841 -0
- lfx/components/files_and_knowledge/ingestion.py +694 -0
- lfx/components/files_and_knowledge/retrieval.py +264 -0
- lfx/components/files_and_knowledge/save_file.py +746 -0
- lfx/components/firecrawl/__init__.py +43 -0
- lfx/components/firecrawl/firecrawl_crawl_api.py +88 -0
- lfx/components/firecrawl/firecrawl_extract_api.py +136 -0
- lfx/components/firecrawl/firecrawl_map_api.py +89 -0
- lfx/components/firecrawl/firecrawl_scrape_api.py +73 -0
- lfx/components/flow_controls/__init__.py +58 -0
- lfx/components/flow_controls/conditional_router.py +208 -0
- lfx/components/flow_controls/data_conditional_router.py +126 -0
- lfx/components/flow_controls/flow_tool.py +111 -0
- lfx/components/flow_controls/listen.py +29 -0
- lfx/components/flow_controls/loop.py +163 -0
- lfx/components/flow_controls/notify.py +88 -0
- lfx/components/flow_controls/pass_message.py +36 -0
- lfx/components/flow_controls/run_flow.py +108 -0
- lfx/components/flow_controls/sub_flow.py +115 -0
- lfx/components/git/__init__.py +4 -0
- lfx/components/git/git.py +262 -0
- lfx/components/git/gitextractor.py +196 -0
- lfx/components/glean/__init__.py +3 -0
- lfx/components/glean/glean_search_api.py +173 -0
- lfx/components/google/__init__.py +17 -0
- lfx/components/google/gmail.py +193 -0
- lfx/components/google/google_bq_sql_executor.py +157 -0
- lfx/components/google/google_drive.py +92 -0
- lfx/components/google/google_drive_search.py +152 -0
- lfx/components/google/google_generative_ai.py +144 -0
- lfx/components/google/google_generative_ai_embeddings.py +141 -0
- lfx/components/google/google_oauth_token.py +89 -0
- lfx/components/google/google_search_api_core.py +68 -0
- lfx/components/google/google_serper_api_core.py +74 -0
- lfx/components/groq/__init__.py +34 -0
- lfx/components/groq/groq.py +143 -0
- lfx/components/helpers/__init__.py +154 -0
- lfx/components/homeassistant/__init__.py +7 -0
- lfx/components/homeassistant/home_assistant_control.py +152 -0
- lfx/components/homeassistant/list_home_assistant_states.py +137 -0
- lfx/components/huggingface/__init__.py +37 -0
- lfx/components/huggingface/huggingface.py +199 -0
- lfx/components/huggingface/huggingface_inference_api.py +106 -0
- lfx/components/ibm/__init__.py +34 -0
- lfx/components/ibm/watsonx.py +207 -0
- lfx/components/ibm/watsonx_embeddings.py +135 -0
- lfx/components/icosacomputing/__init__.py +5 -0
- lfx/components/icosacomputing/combinatorial_reasoner.py +84 -0
- lfx/components/input_output/__init__.py +40 -0
- lfx/components/input_output/chat.py +109 -0
- lfx/components/input_output/chat_output.py +184 -0
- lfx/components/input_output/text.py +27 -0
- lfx/components/input_output/text_output.py +29 -0
- lfx/components/input_output/webhook.py +56 -0
- lfx/components/jigsawstack/__init__.py +23 -0
- lfx/components/jigsawstack/ai_scrape.py +126 -0
- lfx/components/jigsawstack/ai_web_search.py +136 -0
- lfx/components/jigsawstack/file_read.py +115 -0
- lfx/components/jigsawstack/file_upload.py +94 -0
- lfx/components/jigsawstack/image_generation.py +205 -0
- lfx/components/jigsawstack/nsfw.py +60 -0
- lfx/components/jigsawstack/object_detection.py +124 -0
- lfx/components/jigsawstack/sentiment.py +112 -0
- lfx/components/jigsawstack/text_to_sql.py +90 -0
- lfx/components/jigsawstack/text_translate.py +77 -0
- lfx/components/jigsawstack/vocr.py +107 -0
- lfx/components/knowledge_bases/__init__.py +89 -0
- lfx/components/langchain_utilities/__init__.py +109 -0
- lfx/components/langchain_utilities/character.py +53 -0
- lfx/components/langchain_utilities/conversation.py +59 -0
- lfx/components/langchain_utilities/csv_agent.py +175 -0
- lfx/components/langchain_utilities/fake_embeddings.py +26 -0
- lfx/components/langchain_utilities/html_link_extractor.py +35 -0
- lfx/components/langchain_utilities/json_agent.py +100 -0
- lfx/components/langchain_utilities/langchain_hub.py +126 -0
- lfx/components/langchain_utilities/language_recursive.py +49 -0
- lfx/components/langchain_utilities/language_semantic.py +138 -0
- lfx/components/langchain_utilities/llm_checker.py +39 -0
- lfx/components/langchain_utilities/llm_math.py +42 -0
- lfx/components/langchain_utilities/natural_language.py +61 -0
- lfx/components/langchain_utilities/openai_tools.py +53 -0
- lfx/components/langchain_utilities/openapi.py +48 -0
- lfx/components/langchain_utilities/recursive_character.py +60 -0
- lfx/components/langchain_utilities/retrieval_qa.py +83 -0
- lfx/components/langchain_utilities/runnable_executor.py +137 -0
- lfx/components/langchain_utilities/self_query.py +80 -0
- lfx/components/langchain_utilities/spider.py +142 -0
- lfx/components/langchain_utilities/sql.py +40 -0
- lfx/components/langchain_utilities/sql_database.py +35 -0
- lfx/components/langchain_utilities/sql_generator.py +78 -0
- lfx/components/langchain_utilities/tool_calling.py +59 -0
- lfx/components/langchain_utilities/vector_store_info.py +49 -0
- lfx/components/langchain_utilities/vector_store_router.py +33 -0
- lfx/components/langchain_utilities/xml_agent.py +71 -0
- lfx/components/langwatch/__init__.py +3 -0
- lfx/components/langwatch/langwatch.py +278 -0
- lfx/components/link_extractors/__init__.py +3 -0
- lfx/components/llm_operations/__init__.py +46 -0
- lfx/components/llm_operations/batch_run.py +205 -0
- lfx/components/llm_operations/lambda_filter.py +218 -0
- lfx/components/llm_operations/llm_conditional_router.py +421 -0
- lfx/components/llm_operations/llm_selector.py +499 -0
- lfx/components/llm_operations/structured_output.py +244 -0
- lfx/components/lmstudio/__init__.py +34 -0
- lfx/components/lmstudio/lmstudioembeddings.py +89 -0
- lfx/components/lmstudio/lmstudiomodel.py +133 -0
- lfx/components/logic/__init__.py +181 -0
- lfx/components/maritalk/__init__.py +32 -0
- lfx/components/maritalk/maritalk.py +52 -0
- lfx/components/mem0/__init__.py +3 -0
- lfx/components/mem0/mem0_chat_memory.py +147 -0
- lfx/components/milvus/__init__.py +34 -0
- lfx/components/milvus/milvus.py +115 -0
- lfx/components/mistral/__init__.py +37 -0
- lfx/components/mistral/mistral.py +114 -0
- lfx/components/mistral/mistral_embeddings.py +58 -0
- lfx/components/models/__init__.py +89 -0
- lfx/components/models_and_agents/__init__.py +49 -0
- lfx/components/models_and_agents/agent.py +644 -0
- lfx/components/models_and_agents/embedding_model.py +423 -0
- lfx/components/models_and_agents/language_model.py +398 -0
- lfx/components/models_and_agents/mcp_component.py +594 -0
- lfx/components/models_and_agents/memory.py +268 -0
- lfx/components/models_and_agents/prompt.py +67 -0
- lfx/components/mongodb/__init__.py +34 -0
- lfx/components/mongodb/mongodb_atlas.py +213 -0
- lfx/components/needle/__init__.py +3 -0
- lfx/components/needle/needle.py +104 -0
- lfx/components/notdiamond/__init__.py +34 -0
- lfx/components/notdiamond/notdiamond.py +228 -0
- lfx/components/novita/__init__.py +32 -0
- lfx/components/novita/novita.py +130 -0
- lfx/components/nvidia/__init__.py +57 -0
- lfx/components/nvidia/nvidia.py +151 -0
- lfx/components/nvidia/nvidia_embedding.py +77 -0
- lfx/components/nvidia/nvidia_ingest.py +317 -0
- lfx/components/nvidia/nvidia_rerank.py +63 -0
- lfx/components/nvidia/system_assist.py +65 -0
- lfx/components/olivya/__init__.py +3 -0
- lfx/components/olivya/olivya.py +116 -0
- lfx/components/ollama/__init__.py +37 -0
- lfx/components/ollama/ollama.py +548 -0
- lfx/components/ollama/ollama_embeddings.py +103 -0
- lfx/components/openai/__init__.py +37 -0
- lfx/components/openai/openai.py +100 -0
- lfx/components/openai/openai_chat_model.py +176 -0
- lfx/components/openrouter/__init__.py +32 -0
- lfx/components/openrouter/openrouter.py +104 -0
- lfx/components/output_parsers/__init__.py +3 -0
- lfx/components/perplexity/__init__.py +34 -0
- lfx/components/perplexity/perplexity.py +75 -0
- lfx/components/pgvector/__init__.py +34 -0
- lfx/components/pgvector/pgvector.py +72 -0
- lfx/components/pinecone/__init__.py +34 -0
- lfx/components/pinecone/pinecone.py +134 -0
- lfx/components/processing/__init__.py +72 -0
- lfx/components/processing/alter_metadata.py +109 -0
- lfx/components/processing/combine_text.py +40 -0
- lfx/components/processing/converter.py +248 -0
- lfx/components/processing/create_data.py +111 -0
- lfx/components/processing/create_list.py +40 -0
- lfx/components/processing/data_operations.py +528 -0
- lfx/components/processing/data_to_dataframe.py +71 -0
- lfx/components/processing/dataframe_operations.py +313 -0
- lfx/components/processing/dataframe_to_toolset.py +259 -0
- lfx/components/processing/dynamic_create_data.py +357 -0
- lfx/components/processing/extract_key.py +54 -0
- lfx/components/processing/filter_data.py +43 -0
- lfx/components/processing/filter_data_values.py +89 -0
- lfx/components/processing/json_cleaner.py +104 -0
- lfx/components/processing/merge_data.py +91 -0
- lfx/components/processing/message_to_data.py +37 -0
- lfx/components/processing/output_parser.py +46 -0
- lfx/components/processing/parse_data.py +71 -0
- lfx/components/processing/parse_dataframe.py +69 -0
- lfx/components/processing/parse_json_data.py +91 -0
- lfx/components/processing/parser.py +148 -0
- lfx/components/processing/regex.py +83 -0
- lfx/components/processing/select_data.py +49 -0
- lfx/components/processing/split_text.py +141 -0
- lfx/components/processing/store_message.py +91 -0
- lfx/components/processing/update_data.py +161 -0
- lfx/components/prototypes/__init__.py +35 -0
- lfx/components/prototypes/python_function.py +73 -0
- lfx/components/qdrant/__init__.py +34 -0
- lfx/components/qdrant/qdrant.py +109 -0
- lfx/components/redis/__init__.py +37 -0
- lfx/components/redis/redis.py +89 -0
- lfx/components/redis/redis_chat.py +43 -0
- lfx/components/sambanova/__init__.py +32 -0
- lfx/components/sambanova/sambanova.py +84 -0
- lfx/components/scrapegraph/__init__.py +40 -0
- lfx/components/scrapegraph/scrapegraph_markdownify_api.py +64 -0
- lfx/components/scrapegraph/scrapegraph_search_api.py +64 -0
- lfx/components/scrapegraph/scrapegraph_smart_scraper_api.py +71 -0
- lfx/components/searchapi/__init__.py +34 -0
- lfx/components/searchapi/search.py +79 -0
- lfx/components/serpapi/__init__.py +3 -0
- lfx/components/serpapi/serp.py +115 -0
- lfx/components/supabase/__init__.py +34 -0
- lfx/components/supabase/supabase.py +76 -0
- lfx/components/tavily/__init__.py +4 -0
- lfx/components/tavily/tavily_extract.py +117 -0
- lfx/components/tavily/tavily_search.py +212 -0
- lfx/components/textsplitters/__init__.py +3 -0
- lfx/components/toolkits/__init__.py +3 -0
- lfx/components/tools/__init__.py +66 -0
- lfx/components/tools/calculator.py +109 -0
- lfx/components/tools/google_search_api.py +45 -0
- lfx/components/tools/google_serper_api.py +115 -0
- lfx/components/tools/python_code_structured_tool.py +328 -0
- lfx/components/tools/python_repl.py +98 -0
- lfx/components/tools/search_api.py +88 -0
- lfx/components/tools/searxng.py +145 -0
- lfx/components/tools/serp_api.py +120 -0
- lfx/components/tools/tavily_search_tool.py +345 -0
- lfx/components/tools/wikidata_api.py +103 -0
- lfx/components/tools/wikipedia_api.py +50 -0
- lfx/components/tools/yahoo_finance.py +130 -0
- lfx/components/twelvelabs/__init__.py +52 -0
- lfx/components/twelvelabs/convert_astra_results.py +84 -0
- lfx/components/twelvelabs/pegasus_index.py +311 -0
- lfx/components/twelvelabs/split_video.py +301 -0
- lfx/components/twelvelabs/text_embeddings.py +57 -0
- lfx/components/twelvelabs/twelvelabs_pegasus.py +408 -0
- lfx/components/twelvelabs/video_embeddings.py +100 -0
- lfx/components/twelvelabs/video_file.py +191 -0
- lfx/components/unstructured/__init__.py +3 -0
- lfx/components/unstructured/unstructured.py +121 -0
- lfx/components/upstash/__init__.py +34 -0
- lfx/components/upstash/upstash.py +124 -0
- lfx/components/utilities/__init__.py +43 -0
- lfx/components/utilities/calculator_core.py +89 -0
- lfx/components/utilities/current_date.py +42 -0
- lfx/components/utilities/id_generator.py +42 -0
- lfx/components/utilities/python_repl_core.py +98 -0
- lfx/components/vectara/__init__.py +37 -0
- lfx/components/vectara/vectara.py +97 -0
- lfx/components/vectara/vectara_rag.py +164 -0
- lfx/components/vectorstores/__init__.py +34 -0
- lfx/components/vectorstores/local_db.py +270 -0
- lfx/components/vertexai/__init__.py +37 -0
- lfx/components/vertexai/vertexai.py +71 -0
- lfx/components/vertexai/vertexai_embeddings.py +67 -0
- lfx/components/vlmrun/__init__.py +34 -0
- lfx/components/vlmrun/vlmrun_transcription.py +224 -0
- lfx/components/weaviate/__init__.py +34 -0
- lfx/components/weaviate/weaviate.py +89 -0
- lfx/components/wikipedia/__init__.py +4 -0
- lfx/components/wikipedia/wikidata.py +86 -0
- lfx/components/wikipedia/wikipedia.py +53 -0
- lfx/components/wolframalpha/__init__.py +3 -0
- lfx/components/wolframalpha/wolfram_alpha_api.py +54 -0
- lfx/components/xai/__init__.py +32 -0
- lfx/components/xai/xai.py +167 -0
- lfx/components/yahoosearch/__init__.py +3 -0
- lfx/components/yahoosearch/yahoo.py +137 -0
- lfx/components/youtube/__init__.py +52 -0
- lfx/components/youtube/channel.py +227 -0
- lfx/components/youtube/comments.py +231 -0
- lfx/components/youtube/playlist.py +33 -0
- lfx/components/youtube/search.py +120 -0
- lfx/components/youtube/trending.py +285 -0
- lfx/components/youtube/video_details.py +263 -0
- lfx/components/youtube/youtube_transcripts.py +206 -0
- lfx/components/zep/__init__.py +3 -0
- lfx/components/zep/zep.py +45 -0
- lfx/constants.py +6 -0
- lfx/custom/__init__.py +7 -0
- lfx/custom/attributes.py +87 -0
- lfx/custom/code_parser/__init__.py +3 -0
- lfx/custom/code_parser/code_parser.py +361 -0
- lfx/custom/custom_component/__init__.py +0 -0
- lfx/custom/custom_component/base_component.py +128 -0
- lfx/custom/custom_component/component.py +1890 -0
- lfx/custom/custom_component/component_with_cache.py +8 -0
- lfx/custom/custom_component/custom_component.py +650 -0
- lfx/custom/dependency_analyzer.py +165 -0
- lfx/custom/directory_reader/__init__.py +3 -0
- lfx/custom/directory_reader/directory_reader.py +359 -0
- lfx/custom/directory_reader/utils.py +171 -0
- lfx/custom/eval.py +12 -0
- lfx/custom/schema.py +32 -0
- lfx/custom/tree_visitor.py +21 -0
- lfx/custom/utils.py +877 -0
- lfx/custom/validate.py +523 -0
- lfx/events/__init__.py +1 -0
- lfx/events/event_manager.py +110 -0
- lfx/exceptions/__init__.py +0 -0
- lfx/exceptions/component.py +15 -0
- lfx/field_typing/__init__.py +91 -0
- lfx/field_typing/constants.py +216 -0
- lfx/field_typing/range_spec.py +35 -0
- lfx/graph/__init__.py +6 -0
- lfx/graph/edge/__init__.py +0 -0
- lfx/graph/edge/base.py +300 -0
- lfx/graph/edge/schema.py +119 -0
- lfx/graph/edge/utils.py +0 -0
- lfx/graph/graph/__init__.py +0 -0
- lfx/graph/graph/ascii.py +202 -0
- lfx/graph/graph/base.py +2298 -0
- lfx/graph/graph/constants.py +63 -0
- lfx/graph/graph/runnable_vertices_manager.py +133 -0
- lfx/graph/graph/schema.py +53 -0
- lfx/graph/graph/state_model.py +66 -0
- lfx/graph/graph/utils.py +1024 -0
- lfx/graph/schema.py +75 -0
- lfx/graph/state/__init__.py +0 -0
- lfx/graph/state/model.py +250 -0
- lfx/graph/utils.py +206 -0
- lfx/graph/vertex/__init__.py +0 -0
- lfx/graph/vertex/base.py +826 -0
- lfx/graph/vertex/constants.py +0 -0
- lfx/graph/vertex/exceptions.py +4 -0
- lfx/graph/vertex/param_handler.py +316 -0
- lfx/graph/vertex/schema.py +26 -0
- lfx/graph/vertex/utils.py +19 -0
- lfx/graph/vertex/vertex_types.py +489 -0
- lfx/helpers/__init__.py +141 -0
- lfx/helpers/base_model.py +71 -0
- lfx/helpers/custom.py +13 -0
- lfx/helpers/data.py +167 -0
- lfx/helpers/flow.py +308 -0
- lfx/inputs/__init__.py +68 -0
- lfx/inputs/constants.py +2 -0
- lfx/inputs/input_mixin.py +352 -0
- lfx/inputs/inputs.py +718 -0
- lfx/inputs/validators.py +19 -0
- lfx/interface/__init__.py +6 -0
- lfx/interface/components.py +897 -0
- lfx/interface/importing/__init__.py +5 -0
- lfx/interface/importing/utils.py +39 -0
- lfx/interface/initialize/__init__.py +3 -0
- lfx/interface/initialize/loading.py +317 -0
- lfx/interface/listing.py +26 -0
- lfx/interface/run.py +16 -0
- lfx/interface/utils.py +111 -0
- lfx/io/__init__.py +63 -0
- lfx/io/schema.py +295 -0
- lfx/load/__init__.py +8 -0
- lfx/load/load.py +256 -0
- lfx/load/utils.py +99 -0
- lfx/log/__init__.py +5 -0
- lfx/log/logger.py +411 -0
- lfx/logging/__init__.py +11 -0
- lfx/logging/logger.py +24 -0
- lfx/memory/__init__.py +70 -0
- lfx/memory/stubs.py +302 -0
- lfx/processing/__init__.py +1 -0
- lfx/processing/process.py +238 -0
- lfx/processing/utils.py +25 -0
- lfx/py.typed +0 -0
- lfx/schema/__init__.py +66 -0
- lfx/schema/artifact.py +83 -0
- lfx/schema/content_block.py +62 -0
- lfx/schema/content_types.py +91 -0
- lfx/schema/cross_module.py +80 -0
- lfx/schema/data.py +309 -0
- lfx/schema/dataframe.py +210 -0
- lfx/schema/dotdict.py +74 -0
- lfx/schema/encoders.py +13 -0
- lfx/schema/graph.py +47 -0
- lfx/schema/image.py +184 -0
- lfx/schema/json_schema.py +186 -0
- lfx/schema/log.py +62 -0
- lfx/schema/message.py +493 -0
- lfx/schema/openai_responses_schemas.py +74 -0
- lfx/schema/properties.py +41 -0
- lfx/schema/schema.py +180 -0
- lfx/schema/serialize.py +13 -0
- lfx/schema/table.py +142 -0
- lfx/schema/validators.py +114 -0
- lfx/serialization/__init__.py +5 -0
- lfx/serialization/constants.py +2 -0
- lfx/serialization/serialization.py +314 -0
- lfx/services/__init__.py +26 -0
- lfx/services/base.py +28 -0
- lfx/services/cache/__init__.py +6 -0
- lfx/services/cache/base.py +183 -0
- lfx/services/cache/service.py +166 -0
- lfx/services/cache/utils.py +169 -0
- lfx/services/chat/__init__.py +1 -0
- lfx/services/chat/config.py +2 -0
- lfx/services/chat/schema.py +10 -0
- lfx/services/database/__init__.py +5 -0
- lfx/services/database/service.py +25 -0
- lfx/services/deps.py +194 -0
- lfx/services/factory.py +19 -0
- lfx/services/initialize.py +19 -0
- lfx/services/interfaces.py +103 -0
- lfx/services/manager.py +185 -0
- lfx/services/mcp_composer/__init__.py +6 -0
- lfx/services/mcp_composer/factory.py +16 -0
- lfx/services/mcp_composer/service.py +1441 -0
- lfx/services/schema.py +21 -0
- lfx/services/session.py +87 -0
- lfx/services/settings/__init__.py +3 -0
- lfx/services/settings/auth.py +133 -0
- lfx/services/settings/base.py +668 -0
- lfx/services/settings/constants.py +43 -0
- lfx/services/settings/factory.py +23 -0
- lfx/services/settings/feature_flags.py +11 -0
- lfx/services/settings/service.py +35 -0
- lfx/services/settings/utils.py +40 -0
- lfx/services/shared_component_cache/__init__.py +1 -0
- lfx/services/shared_component_cache/factory.py +30 -0
- lfx/services/shared_component_cache/service.py +9 -0
- lfx/services/storage/__init__.py +5 -0
- lfx/services/storage/local.py +185 -0
- lfx/services/storage/service.py +177 -0
- lfx/services/tracing/__init__.py +1 -0
- lfx/services/tracing/service.py +21 -0
- lfx/settings.py +6 -0
- lfx/template/__init__.py +6 -0
- lfx/template/field/__init__.py +0 -0
- lfx/template/field/base.py +260 -0
- lfx/template/field/prompt.py +15 -0
- lfx/template/frontend_node/__init__.py +6 -0
- lfx/template/frontend_node/base.py +214 -0
- lfx/template/frontend_node/constants.py +65 -0
- lfx/template/frontend_node/custom_components.py +79 -0
- lfx/template/template/__init__.py +0 -0
- lfx/template/template/base.py +100 -0
- lfx/template/utils.py +217 -0
- lfx/type_extraction/__init__.py +19 -0
- lfx/type_extraction/type_extraction.py +75 -0
- lfx/type_extraction.py +80 -0
- lfx/utils/__init__.py +1 -0
- lfx/utils/async_helpers.py +42 -0
- lfx/utils/component_utils.py +154 -0
- lfx/utils/concurrency.py +60 -0
- lfx/utils/connection_string_parser.py +11 -0
- lfx/utils/constants.py +233 -0
- lfx/utils/data_structure.py +212 -0
- lfx/utils/exceptions.py +22 -0
- lfx/utils/helpers.py +34 -0
- lfx/utils/image.py +79 -0
- lfx/utils/langflow_utils.py +52 -0
- lfx/utils/lazy_load.py +15 -0
- lfx/utils/request_utils.py +18 -0
- lfx/utils/schemas.py +139 -0
- lfx/utils/ssrf_protection.py +384 -0
- lfx/utils/util.py +626 -0
- lfx/utils/util_strings.py +56 -0
- lfx/utils/validate_cloud.py +26 -0
- lfx/utils/version.py +24 -0
- lfx_nightly-0.2.0.dev25.dist-info/METADATA +312 -0
- lfx_nightly-0.2.0.dev25.dist-info/RECORD +769 -0
- lfx_nightly-0.2.0.dev25.dist-info/WHEEL +4 -0
- lfx_nightly-0.2.0.dev25.dist-info/entry_points.txt +2 -0
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
from cleanlab_tlm import TrustworthyRAG, get_default_evals
|
|
2
|
+
|
|
3
|
+
from lfx.custom import Component
|
|
4
|
+
from lfx.io import (
|
|
5
|
+
BoolInput,
|
|
6
|
+
DropdownInput,
|
|
7
|
+
MessageTextInput,
|
|
8
|
+
Output,
|
|
9
|
+
SecretStrInput,
|
|
10
|
+
)
|
|
11
|
+
from lfx.schema.message import Message
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class CleanlabRAGEvaluator(Component):
|
|
15
|
+
"""A component that evaluates the quality of RAG (Retrieval-Augmented Generation) outputs using Cleanlab.
|
|
16
|
+
|
|
17
|
+
This component takes a query, retrieved context, and generated response from a RAG pipeline,
|
|
18
|
+
and uses Cleanlab's evaluation algorithms to assess various aspects of the RAG system's performance.
|
|
19
|
+
|
|
20
|
+
The component can evaluate:
|
|
21
|
+
- Overall trustworthiness of the LLM generated response
|
|
22
|
+
- Context sufficiency (whether the retrieved context contains information needed to answer the query)
|
|
23
|
+
- Response groundedness (whether the response is supported directly by the context)
|
|
24
|
+
- Response helpfulness (whether the response effectively addresses the user's query)
|
|
25
|
+
- Query ease (whether the user query seems easy for an AI system to properly handle, useful to diagnose
|
|
26
|
+
queries that are: complex, vague, tricky, or disgruntled-sounding)
|
|
27
|
+
|
|
28
|
+
Outputs:
|
|
29
|
+
- Trust Score: A score between 0-1 corresponding to the trustworthiness of the response. A higher score
|
|
30
|
+
indicates a higher confidence that the response is correct/good.
|
|
31
|
+
- Explanation: An LLM generated explanation of the trustworthiness assessment
|
|
32
|
+
- Other Evals: Additional evaluation metrics for selected evaluation types in the "Controls" tab
|
|
33
|
+
- Evaluation Summary: A comprehensive summary of context, query, response, and selected evaluation results
|
|
34
|
+
|
|
35
|
+
This component works well in conjunction with the CleanlabRemediator to create a complete trust evaluation
|
|
36
|
+
and remediation pipeline.
|
|
37
|
+
|
|
38
|
+
More details on the evaluation metrics can be found here: https://help.cleanlab.ai/tlm/use-cases/tlm_rag/
|
|
39
|
+
"""
|
|
40
|
+
|
|
41
|
+
display_name = "Cleanlab RAG Evaluator"
|
|
42
|
+
description = "Evaluates context, query, and response from a RAG pipeline using Cleanlab and outputs trust metrics."
|
|
43
|
+
icon = "Cleanlab"
|
|
44
|
+
name = "CleanlabRAGEvaluator"
|
|
45
|
+
|
|
46
|
+
inputs = [
|
|
47
|
+
SecretStrInput(
|
|
48
|
+
name="api_key",
|
|
49
|
+
display_name="Cleanlab API Key",
|
|
50
|
+
info="Your Cleanlab API key.",
|
|
51
|
+
required=True,
|
|
52
|
+
),
|
|
53
|
+
DropdownInput(
|
|
54
|
+
name="model",
|
|
55
|
+
display_name="Cleanlab Evaluation Model",
|
|
56
|
+
options=[
|
|
57
|
+
"gpt-4.1",
|
|
58
|
+
"gpt-4.1-mini",
|
|
59
|
+
"gpt-4.1-nano",
|
|
60
|
+
"o4-mini",
|
|
61
|
+
"o3",
|
|
62
|
+
"gpt-4.5-preview",
|
|
63
|
+
"gpt-4o-mini",
|
|
64
|
+
"gpt-4o",
|
|
65
|
+
"o3-mini",
|
|
66
|
+
"o1",
|
|
67
|
+
"o1-mini",
|
|
68
|
+
"gpt-4",
|
|
69
|
+
"gpt-3.5-turbo-16k",
|
|
70
|
+
"claude-3.7-sonnet",
|
|
71
|
+
"claude-3.5-sonnet-v2",
|
|
72
|
+
"claude-3.5-sonnet",
|
|
73
|
+
"claude-3.5-haiku",
|
|
74
|
+
"claude-3-haiku",
|
|
75
|
+
"nova-micro",
|
|
76
|
+
"nova-lite",
|
|
77
|
+
"nova-pro",
|
|
78
|
+
],
|
|
79
|
+
info="The model Cleanlab uses to evaluate the context, query, and response. This does NOT need to be "
|
|
80
|
+
"the same model that generated the response.",
|
|
81
|
+
value="gpt-4o-mini",
|
|
82
|
+
required=True,
|
|
83
|
+
advanced=True,
|
|
84
|
+
),
|
|
85
|
+
DropdownInput(
|
|
86
|
+
name="quality_preset",
|
|
87
|
+
display_name="Quality Preset",
|
|
88
|
+
options=["base", "low", "medium"],
|
|
89
|
+
value="medium",
|
|
90
|
+
info="This determines the accuracy, latency, and cost of the evaluation. Higher quality is generally "
|
|
91
|
+
"slower but more accurate.",
|
|
92
|
+
required=True,
|
|
93
|
+
advanced=True,
|
|
94
|
+
),
|
|
95
|
+
MessageTextInput(
|
|
96
|
+
name="context",
|
|
97
|
+
display_name="Context",
|
|
98
|
+
info="The context retrieved for the given query.",
|
|
99
|
+
required=True,
|
|
100
|
+
),
|
|
101
|
+
MessageTextInput(
|
|
102
|
+
name="query",
|
|
103
|
+
display_name="Query",
|
|
104
|
+
info="The user's query.",
|
|
105
|
+
required=True,
|
|
106
|
+
),
|
|
107
|
+
MessageTextInput(
|
|
108
|
+
name="response",
|
|
109
|
+
display_name="Response",
|
|
110
|
+
info="The response generated by the LLM.",
|
|
111
|
+
required=True,
|
|
112
|
+
),
|
|
113
|
+
BoolInput(
|
|
114
|
+
name="run_context_sufficiency",
|
|
115
|
+
display_name="Run Context Sufficiency",
|
|
116
|
+
value=False,
|
|
117
|
+
advanced=True,
|
|
118
|
+
),
|
|
119
|
+
BoolInput(
|
|
120
|
+
name="run_response_groundedness",
|
|
121
|
+
display_name="Run Response Groundedness",
|
|
122
|
+
value=False,
|
|
123
|
+
advanced=True,
|
|
124
|
+
),
|
|
125
|
+
BoolInput(
|
|
126
|
+
name="run_response_helpfulness",
|
|
127
|
+
display_name="Run Response Helpfulness",
|
|
128
|
+
value=False,
|
|
129
|
+
advanced=True,
|
|
130
|
+
),
|
|
131
|
+
BoolInput(
|
|
132
|
+
name="run_query_ease",
|
|
133
|
+
display_name="Run Query Ease",
|
|
134
|
+
value=False,
|
|
135
|
+
advanced=True,
|
|
136
|
+
),
|
|
137
|
+
]
|
|
138
|
+
|
|
139
|
+
outputs = [
|
|
140
|
+
Output(display_name="Response", name="response_passthrough", method="pass_response", types=["Message"]),
|
|
141
|
+
Output(display_name="Trust Score", name="trust_score", method="get_trust_score", types=["number"]),
|
|
142
|
+
Output(display_name="Explanation", name="trust_explanation", method="get_trust_explanation", types=["Message"]),
|
|
143
|
+
Output(display_name="Other Evals", name="other_scores", method="get_other_scores", types=["Data"]),
|
|
144
|
+
Output(
|
|
145
|
+
display_name="Evaluation Summary",
|
|
146
|
+
name="evaluation_summary",
|
|
147
|
+
method="get_evaluation_summary",
|
|
148
|
+
types=["Message"],
|
|
149
|
+
),
|
|
150
|
+
]
|
|
151
|
+
|
|
152
|
+
def _evaluate_once(self):
|
|
153
|
+
if not hasattr(self, "_cached_result"):
|
|
154
|
+
try:
|
|
155
|
+
self.status = "Configuring selected evals..."
|
|
156
|
+
default_evals = get_default_evals()
|
|
157
|
+
enabled_names = []
|
|
158
|
+
if self.run_context_sufficiency:
|
|
159
|
+
enabled_names.append("context_sufficiency")
|
|
160
|
+
if self.run_response_groundedness:
|
|
161
|
+
enabled_names.append("response_groundedness")
|
|
162
|
+
if self.run_response_helpfulness:
|
|
163
|
+
enabled_names.append("response_helpfulness")
|
|
164
|
+
if self.run_query_ease:
|
|
165
|
+
enabled_names.append("query_ease")
|
|
166
|
+
|
|
167
|
+
selected_evals = [e for e in default_evals if e.name in enabled_names]
|
|
168
|
+
|
|
169
|
+
validator = TrustworthyRAG(
|
|
170
|
+
api_key=self.api_key,
|
|
171
|
+
quality_preset=self.quality_preset,
|
|
172
|
+
options={"log": ["explanation"], "model": self.model},
|
|
173
|
+
evals=selected_evals,
|
|
174
|
+
)
|
|
175
|
+
|
|
176
|
+
self.status = f"Running evals: {[e.name for e in selected_evals]}"
|
|
177
|
+
self._cached_result = validator.score(
|
|
178
|
+
query=self.query,
|
|
179
|
+
context=self.context,
|
|
180
|
+
response=self.response,
|
|
181
|
+
)
|
|
182
|
+
self.status = "Evaluation complete."
|
|
183
|
+
|
|
184
|
+
except Exception as e: # noqa: BLE001
|
|
185
|
+
self.status = f"Evaluation failed: {e!s}"
|
|
186
|
+
self._cached_result = {}
|
|
187
|
+
return self._cached_result
|
|
188
|
+
|
|
189
|
+
def pass_response(self) -> Message:
|
|
190
|
+
self.status = "Passing through response."
|
|
191
|
+
return Message(text=self.response)
|
|
192
|
+
|
|
193
|
+
def get_trust_score(self) -> float:
|
|
194
|
+
score = self._evaluate_once().get("trustworthiness", {}).get("score", 0.0)
|
|
195
|
+
self.status = f"Trust Score: {score:.3f}"
|
|
196
|
+
return score
|
|
197
|
+
|
|
198
|
+
def get_trust_explanation(self) -> Message:
|
|
199
|
+
explanation = self._evaluate_once().get("trustworthiness", {}).get("log", {}).get("explanation", "")
|
|
200
|
+
self.status = "Trust explanation extracted."
|
|
201
|
+
return Message(text=explanation)
|
|
202
|
+
|
|
203
|
+
def get_other_scores(self) -> dict:
|
|
204
|
+
result = self._evaluate_once()
|
|
205
|
+
|
|
206
|
+
selected = {
|
|
207
|
+
"context_sufficiency": self.run_context_sufficiency,
|
|
208
|
+
"response_groundedness": self.run_response_groundedness,
|
|
209
|
+
"response_helpfulness": self.run_response_helpfulness,
|
|
210
|
+
"query_ease": self.run_query_ease,
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
filtered_scores = {key: result[key]["score"] for key, include in selected.items() if include and key in result}
|
|
214
|
+
|
|
215
|
+
self.status = f"{len(filtered_scores)} other evals returned."
|
|
216
|
+
return filtered_scores
|
|
217
|
+
|
|
218
|
+
def get_evaluation_summary(self) -> Message:
|
|
219
|
+
result = self._evaluate_once()
|
|
220
|
+
|
|
221
|
+
query_text = self.query.strip()
|
|
222
|
+
context_text = self.context.strip()
|
|
223
|
+
response_text = self.response.strip()
|
|
224
|
+
|
|
225
|
+
trust = result.get("trustworthiness", {}).get("score", 0.0)
|
|
226
|
+
trust_exp = result.get("trustworthiness", {}).get("log", {}).get("explanation", "")
|
|
227
|
+
|
|
228
|
+
selected = {
|
|
229
|
+
"context_sufficiency": self.run_context_sufficiency,
|
|
230
|
+
"response_groundedness": self.run_response_groundedness,
|
|
231
|
+
"response_helpfulness": self.run_response_helpfulness,
|
|
232
|
+
"query_ease": self.run_query_ease,
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
other_scores = {key: result[key]["score"] for key, include in selected.items() if include and key in result}
|
|
236
|
+
|
|
237
|
+
metrics = f"Trustworthiness: {trust:.3f}"
|
|
238
|
+
if trust_exp:
|
|
239
|
+
metrics += f"\nExplanation: {trust_exp}"
|
|
240
|
+
if other_scores:
|
|
241
|
+
metrics += "\n" + "\n".join(f"{k.replace('_', ' ').title()}: {v:.3f}" for k, v in other_scores.items())
|
|
242
|
+
|
|
243
|
+
summary = (
|
|
244
|
+
f"Query:\n{query_text}\n"
|
|
245
|
+
"-----\n"
|
|
246
|
+
f"Context:\n{context_text}\n"
|
|
247
|
+
"-----\n"
|
|
248
|
+
f"Response:\n{response_text}\n"
|
|
249
|
+
"------------------------------\n"
|
|
250
|
+
f"{metrics}"
|
|
251
|
+
)
|
|
252
|
+
|
|
253
|
+
self.status = "Evaluation summary built."
|
|
254
|
+
return Message(text=summary)
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
from lfx.custom import Component
|
|
2
|
+
from lfx.field_typing.range_spec import RangeSpec
|
|
3
|
+
from lfx.io import BoolInput, FloatInput, HandleInput, MessageTextInput, Output, PromptInput
|
|
4
|
+
from lfx.schema.message import Message
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class CleanlabRemediator(Component):
|
|
8
|
+
"""Remediates potentially untrustworthy LLM responses based on trust scores computed by the Cleanlab Evaluator.
|
|
9
|
+
|
|
10
|
+
This component takes a response and its associated trust score,
|
|
11
|
+
and applies remediation strategies based on configurable thresholds and settings.
|
|
12
|
+
|
|
13
|
+
Inputs:
|
|
14
|
+
- response (MessageTextInput): The original LLM-generated response to be evaluated and possibly remediated.
|
|
15
|
+
The CleanlabEvaluator passes this response through.
|
|
16
|
+
- score (HandleInput): The trust score output from CleanlabEvaluator (expected to be a float between 0 and 1).
|
|
17
|
+
- explanation (MessageTextInput): Optional textual explanation for the trust score, to be included in the
|
|
18
|
+
output.
|
|
19
|
+
- threshold (Input[float]): Minimum trust score required to accept the response. If the score is lower, the
|
|
20
|
+
response is remediated.
|
|
21
|
+
- show_untrustworthy_response (BoolInput): If true, returns the original response with a warning; if false,
|
|
22
|
+
returns fallback text.
|
|
23
|
+
- untrustworthy_warning_text (PromptInput): Text warning to append to responses deemed untrustworthy (when
|
|
24
|
+
showing them).
|
|
25
|
+
- fallback_text (PromptInput): Replacement message returned if the response is untrustworthy and should be
|
|
26
|
+
hidden.
|
|
27
|
+
|
|
28
|
+
Outputs:
|
|
29
|
+
- remediated_response (Message): Either:
|
|
30
|
+
• the original response,
|
|
31
|
+
• the original response with appended warning, or
|
|
32
|
+
• the fallback response,
|
|
33
|
+
depending on the trust score and configuration.
|
|
34
|
+
|
|
35
|
+
This component is typically used downstream of CleanlabEvaluator or CleanlabRagValidator
|
|
36
|
+
to take appropriate action on low-trust responses and inform users accordingly.
|
|
37
|
+
"""
|
|
38
|
+
|
|
39
|
+
display_name = "Cleanlab Remediator"
|
|
40
|
+
description = (
|
|
41
|
+
"Remediates an untrustworthy response based on trust score from the Cleanlab Evaluator, "
|
|
42
|
+
"score threshold, and message handling settings."
|
|
43
|
+
)
|
|
44
|
+
icon = "Cleanlab"
|
|
45
|
+
name = "CleanlabRemediator"
|
|
46
|
+
|
|
47
|
+
inputs = [
|
|
48
|
+
MessageTextInput(
|
|
49
|
+
name="response",
|
|
50
|
+
display_name="Response",
|
|
51
|
+
info="The response to the user's query.",
|
|
52
|
+
required=True,
|
|
53
|
+
),
|
|
54
|
+
HandleInput(
|
|
55
|
+
name="score",
|
|
56
|
+
display_name="Trust Score",
|
|
57
|
+
info="The trustworthiness score output from the Cleanlab Evaluator.",
|
|
58
|
+
input_types=["number"],
|
|
59
|
+
required=True,
|
|
60
|
+
),
|
|
61
|
+
MessageTextInput(
|
|
62
|
+
name="explanation",
|
|
63
|
+
display_name="Explanation",
|
|
64
|
+
info="The explanation from the Cleanlab Evaluator.",
|
|
65
|
+
required=False,
|
|
66
|
+
),
|
|
67
|
+
FloatInput(
|
|
68
|
+
name="threshold",
|
|
69
|
+
display_name="Threshold",
|
|
70
|
+
field_type="float",
|
|
71
|
+
value=0.7,
|
|
72
|
+
range_spec=RangeSpec(min=0.0, max=1.0, step=0.05),
|
|
73
|
+
info="Minimum score required to show the response unmodified. Reponses with scores above this threshold "
|
|
74
|
+
"are considered trustworthy. Reponses with scores below this threshold are considered untrustworthy and "
|
|
75
|
+
"will be remediated based on the settings below.",
|
|
76
|
+
required=True,
|
|
77
|
+
show=True,
|
|
78
|
+
),
|
|
79
|
+
BoolInput(
|
|
80
|
+
name="show_untrustworthy_response",
|
|
81
|
+
display_name="Show Untrustworthy Response",
|
|
82
|
+
info="If enabled, and the trust score is below the threshold, the original response is shown with the "
|
|
83
|
+
"added warning. If disabled, and the trust score is below the threshold, the fallback answer is returned.",
|
|
84
|
+
value=True,
|
|
85
|
+
),
|
|
86
|
+
PromptInput(
|
|
87
|
+
name="untrustworthy_warning_text",
|
|
88
|
+
display_name="Warning for Untrustworthy Response",
|
|
89
|
+
info="Warning to append to the response if Show Untrustworthy Response is enabled and trust score is "
|
|
90
|
+
"below the threshold.",
|
|
91
|
+
value="⚠️ WARNING: The following response is potentially untrustworthy.",
|
|
92
|
+
),
|
|
93
|
+
PromptInput(
|
|
94
|
+
name="fallback_text",
|
|
95
|
+
display_name="Fallback Answer",
|
|
96
|
+
info="Response returned if the trust score is below the threshold and 'Show Untrustworthy Response' is "
|
|
97
|
+
"disabled.",
|
|
98
|
+
value="Based on the available information, I cannot provide a complete answer to this question.",
|
|
99
|
+
),
|
|
100
|
+
]
|
|
101
|
+
|
|
102
|
+
outputs = [
|
|
103
|
+
Output(
|
|
104
|
+
display_name="Remediated Message",
|
|
105
|
+
name="remediated_response",
|
|
106
|
+
method="remediate_response",
|
|
107
|
+
types=["Message"],
|
|
108
|
+
),
|
|
109
|
+
]
|
|
110
|
+
|
|
111
|
+
def remediate_response(self) -> Message:
|
|
112
|
+
if self.score >= self.threshold:
|
|
113
|
+
self.status = f"Score {self.score:.2f} ≥ threshold {self.threshold:.2f} → accepted"
|
|
114
|
+
return Message(
|
|
115
|
+
text=f"{self.response}\n\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n**Trust Score:** {self.score:.2f}"
|
|
116
|
+
)
|
|
117
|
+
|
|
118
|
+
self.status = f"Score {self.score:.2f} < threshold {self.threshold:.2f} → flagged"
|
|
119
|
+
|
|
120
|
+
if self.show_untrustworthy_response:
|
|
121
|
+
parts = [
|
|
122
|
+
self.response,
|
|
123
|
+
"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━",
|
|
124
|
+
f"**{self.untrustworthy_warning_text.strip()}**",
|
|
125
|
+
f"**Trust Score:** {self.score:.2f}",
|
|
126
|
+
]
|
|
127
|
+
if self.explanation:
|
|
128
|
+
parts.append(f"**Explanation:** {self.explanation}")
|
|
129
|
+
return Message(text="\n\n".join(parts))
|
|
130
|
+
|
|
131
|
+
return Message(text=self.fallback_text)
|
|
@@ -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 .clickhouse import ClickhouseVectorStoreComponent
|
|
9
|
+
|
|
10
|
+
_dynamic_imports = {
|
|
11
|
+
"ClickhouseVectorStoreComponent": "clickhouse",
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
__all__ = [
|
|
15
|
+
"ClickhouseVectorStoreComponent",
|
|
16
|
+
]
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def __getattr__(attr_name: str) -> Any:
|
|
20
|
+
"""Lazily import ClickHouse 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,135 @@
|
|
|
1
|
+
from langchain_community.vectorstores import Clickhouse, ClickhouseSettings
|
|
2
|
+
|
|
3
|
+
from lfx.base.vectorstores.model import LCVectorStoreComponent, check_cached_vector_store
|
|
4
|
+
from lfx.helpers.data import docs_to_data
|
|
5
|
+
from lfx.inputs.inputs import BoolInput, FloatInput
|
|
6
|
+
from lfx.io import (
|
|
7
|
+
DictInput,
|
|
8
|
+
DropdownInput,
|
|
9
|
+
HandleInput,
|
|
10
|
+
IntInput,
|
|
11
|
+
SecretStrInput,
|
|
12
|
+
StrInput,
|
|
13
|
+
)
|
|
14
|
+
from lfx.schema.data import Data
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class ClickhouseVectorStoreComponent(LCVectorStoreComponent):
|
|
18
|
+
display_name = "ClickHouse"
|
|
19
|
+
description = "ClickHouse Vector Store with search capabilities"
|
|
20
|
+
name = "Clickhouse"
|
|
21
|
+
icon = "Clickhouse"
|
|
22
|
+
|
|
23
|
+
inputs = [
|
|
24
|
+
StrInput(name="host", display_name="hostname", required=True, value="localhost"),
|
|
25
|
+
IntInput(name="port", display_name="port", required=True, value=8123),
|
|
26
|
+
StrInput(name="database", display_name="database", required=True),
|
|
27
|
+
StrInput(name="table", display_name="Table name", required=True),
|
|
28
|
+
StrInput(name="username", display_name="The ClickHouse user name.", required=True),
|
|
29
|
+
SecretStrInput(name="password", display_name="Clickhouse Password", required=True),
|
|
30
|
+
DropdownInput(
|
|
31
|
+
name="index_type",
|
|
32
|
+
display_name="index_type",
|
|
33
|
+
options=["annoy", "vector_similarity"],
|
|
34
|
+
info="Type of the index.",
|
|
35
|
+
value="annoy",
|
|
36
|
+
advanced=True,
|
|
37
|
+
),
|
|
38
|
+
DropdownInput(
|
|
39
|
+
name="metric",
|
|
40
|
+
display_name="metric",
|
|
41
|
+
options=["angular", "euclidean", "manhattan", "hamming", "dot"],
|
|
42
|
+
info="Metric to compute distance.",
|
|
43
|
+
value="angular",
|
|
44
|
+
advanced=True,
|
|
45
|
+
),
|
|
46
|
+
BoolInput(
|
|
47
|
+
name="secure",
|
|
48
|
+
display_name="Use https/TLS. This overrides inferred values from the interface or port arguments.",
|
|
49
|
+
value=False,
|
|
50
|
+
advanced=True,
|
|
51
|
+
),
|
|
52
|
+
StrInput(name="index_param", display_name="Param of the index", value="100,'L2Distance'", advanced=True),
|
|
53
|
+
DictInput(name="index_query_params", display_name="index query params", advanced=True),
|
|
54
|
+
*LCVectorStoreComponent.inputs,
|
|
55
|
+
HandleInput(name="embedding", display_name="Embedding", input_types=["Embeddings"]),
|
|
56
|
+
IntInput(
|
|
57
|
+
name="number_of_results",
|
|
58
|
+
display_name="Number of Results",
|
|
59
|
+
info="Number of results to return.",
|
|
60
|
+
value=4,
|
|
61
|
+
advanced=True,
|
|
62
|
+
),
|
|
63
|
+
FloatInput(name="score_threshold", display_name="Score threshold", advanced=True),
|
|
64
|
+
]
|
|
65
|
+
|
|
66
|
+
@check_cached_vector_store
|
|
67
|
+
def build_vector_store(self) -> Clickhouse:
|
|
68
|
+
try:
|
|
69
|
+
import clickhouse_connect
|
|
70
|
+
except ImportError as e:
|
|
71
|
+
msg = (
|
|
72
|
+
"Failed to import ClickHouse dependencies. "
|
|
73
|
+
"Install it using `uv pip install langflow[clickhouse-connect] --pre`"
|
|
74
|
+
)
|
|
75
|
+
raise ImportError(msg) from e
|
|
76
|
+
|
|
77
|
+
try:
|
|
78
|
+
client = clickhouse_connect.get_client(
|
|
79
|
+
host=self.host, port=self.port, username=self.username, password=self.password
|
|
80
|
+
)
|
|
81
|
+
client.command("SELECT 1")
|
|
82
|
+
except Exception as e:
|
|
83
|
+
msg = f"Failed to connect to Clickhouse: {e}"
|
|
84
|
+
raise ValueError(msg) from e
|
|
85
|
+
|
|
86
|
+
# Convert DataFrame to Data if needed using parent's method
|
|
87
|
+
self.ingest_data = self._prepare_ingest_data()
|
|
88
|
+
|
|
89
|
+
documents = []
|
|
90
|
+
for _input in self.ingest_data or []:
|
|
91
|
+
if isinstance(_input, Data):
|
|
92
|
+
documents.append(_input.to_lc_document())
|
|
93
|
+
else:
|
|
94
|
+
documents.append(_input)
|
|
95
|
+
|
|
96
|
+
kwargs = {}
|
|
97
|
+
if self.index_param:
|
|
98
|
+
kwargs["index_param"] = self.index_param.split(",")
|
|
99
|
+
if self.index_query_params:
|
|
100
|
+
kwargs["index_query_params"] = self.index_query_params
|
|
101
|
+
|
|
102
|
+
settings = ClickhouseSettings(
|
|
103
|
+
table=self.table,
|
|
104
|
+
database=self.database,
|
|
105
|
+
host=self.host,
|
|
106
|
+
index_type=self.index_type,
|
|
107
|
+
metric=self.metric,
|
|
108
|
+
password=self.password,
|
|
109
|
+
port=self.port,
|
|
110
|
+
secure=self.secure,
|
|
111
|
+
username=self.username,
|
|
112
|
+
**kwargs,
|
|
113
|
+
)
|
|
114
|
+
if documents:
|
|
115
|
+
clickhouse_vs = Clickhouse.from_documents(documents=documents, embedding=self.embedding, config=settings)
|
|
116
|
+
|
|
117
|
+
else:
|
|
118
|
+
clickhouse_vs = Clickhouse(embedding=self.embedding, config=settings)
|
|
119
|
+
|
|
120
|
+
return clickhouse_vs
|
|
121
|
+
|
|
122
|
+
def search_documents(self) -> list[Data]:
|
|
123
|
+
vector_store = self.build_vector_store()
|
|
124
|
+
|
|
125
|
+
if self.search_query and isinstance(self.search_query, str) and self.search_query.strip():
|
|
126
|
+
kwargs = {}
|
|
127
|
+
if self.score_threshold:
|
|
128
|
+
kwargs["score_threshold"] = self.score_threshold
|
|
129
|
+
|
|
130
|
+
docs = vector_store.similarity_search(query=self.search_query, k=self.number_of_results, **kwargs)
|
|
131
|
+
|
|
132
|
+
data = docs_to_data(docs)
|
|
133
|
+
self.status = data
|
|
134
|
+
return data
|
|
135
|
+
return []
|
|
@@ -0,0 +1,32 @@
|
|
|
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.cloudflare.cloudflare import CloudflareWorkersAIEmbeddingsComponent
|
|
9
|
+
|
|
10
|
+
_dynamic_imports = {
|
|
11
|
+
"CloudflareWorkersAIEmbeddingsComponent": "cloudflare",
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
__all__ = ["CloudflareWorkersAIEmbeddingsComponent"]
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def __getattr__(attr_name: str) -> Any:
|
|
18
|
+
"""Lazily import cloudflare components on attribute access."""
|
|
19
|
+
if attr_name not in _dynamic_imports:
|
|
20
|
+
msg = f"module '{__name__}' has no attribute '{attr_name}'"
|
|
21
|
+
raise AttributeError(msg)
|
|
22
|
+
try:
|
|
23
|
+
result = import_mod(attr_name, _dynamic_imports[attr_name], __spec__.parent)
|
|
24
|
+
except (ModuleNotFoundError, ImportError, AttributeError) as e:
|
|
25
|
+
msg = f"Could not import '{attr_name}' from '{__name__}': {e}"
|
|
26
|
+
raise AttributeError(msg) from e
|
|
27
|
+
globals()[attr_name] = result
|
|
28
|
+
return result
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def __dir__() -> list[str]:
|
|
32
|
+
return list(__all__)
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
from langchain_community.embeddings.cloudflare_workersai import CloudflareWorkersAIEmbeddings
|
|
2
|
+
|
|
3
|
+
from lfx.base.models.model import LCModelComponent
|
|
4
|
+
from lfx.field_typing import Embeddings
|
|
5
|
+
from lfx.io import BoolInput, DictInput, IntInput, MessageTextInput, Output, SecretStrInput
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class CloudflareWorkersAIEmbeddingsComponent(LCModelComponent):
|
|
9
|
+
display_name: str = "Cloudflare Workers AI Embeddings"
|
|
10
|
+
description: str = "Generate embeddings using Cloudflare Workers AI models."
|
|
11
|
+
documentation: str = "https://python.langchain.com/docs/integrations/text_embedding/cloudflare_workersai/"
|
|
12
|
+
icon = "Cloudflare"
|
|
13
|
+
name = "CloudflareWorkersAIEmbeddings"
|
|
14
|
+
|
|
15
|
+
inputs = [
|
|
16
|
+
MessageTextInput(
|
|
17
|
+
name="account_id",
|
|
18
|
+
display_name="Cloudflare account ID",
|
|
19
|
+
info="Find your account ID https://developers.cloudflare.com/fundamentals/setup/find-account-and-zone-ids/#find-account-id-workers-and-pages",
|
|
20
|
+
required=True,
|
|
21
|
+
),
|
|
22
|
+
SecretStrInput(
|
|
23
|
+
name="api_token",
|
|
24
|
+
display_name="Cloudflare API token",
|
|
25
|
+
info="Create an API token https://developers.cloudflare.com/fundamentals/api/get-started/create-token/",
|
|
26
|
+
required=True,
|
|
27
|
+
),
|
|
28
|
+
MessageTextInput(
|
|
29
|
+
name="model_name",
|
|
30
|
+
display_name="Model Name",
|
|
31
|
+
info="List of supported models https://developers.cloudflare.com/workers-ai/models/#text-embeddings",
|
|
32
|
+
required=True,
|
|
33
|
+
value="@cf/baai/bge-base-en-v1.5",
|
|
34
|
+
),
|
|
35
|
+
BoolInput(
|
|
36
|
+
name="strip_new_lines",
|
|
37
|
+
display_name="Strip New Lines",
|
|
38
|
+
advanced=True,
|
|
39
|
+
value=True,
|
|
40
|
+
),
|
|
41
|
+
IntInput(
|
|
42
|
+
name="batch_size",
|
|
43
|
+
display_name="Batch Size",
|
|
44
|
+
advanced=True,
|
|
45
|
+
value=50,
|
|
46
|
+
),
|
|
47
|
+
MessageTextInput(
|
|
48
|
+
name="api_base_url",
|
|
49
|
+
display_name="Cloudflare API base URL",
|
|
50
|
+
advanced=True,
|
|
51
|
+
value="https://api.cloudflare.com/client/v4/accounts",
|
|
52
|
+
),
|
|
53
|
+
DictInput(
|
|
54
|
+
name="headers",
|
|
55
|
+
display_name="Headers",
|
|
56
|
+
info="Additional request headers",
|
|
57
|
+
is_list=True,
|
|
58
|
+
advanced=True,
|
|
59
|
+
),
|
|
60
|
+
]
|
|
61
|
+
|
|
62
|
+
outputs = [
|
|
63
|
+
Output(display_name="Embeddings", name="embeddings", method="build_embeddings"),
|
|
64
|
+
]
|
|
65
|
+
|
|
66
|
+
def build_embeddings(self) -> Embeddings:
|
|
67
|
+
try:
|
|
68
|
+
embeddings = CloudflareWorkersAIEmbeddings(
|
|
69
|
+
account_id=self.account_id,
|
|
70
|
+
api_base_url=self.api_base_url,
|
|
71
|
+
api_token=self.api_token,
|
|
72
|
+
batch_size=self.batch_size,
|
|
73
|
+
headers=self.headers,
|
|
74
|
+
model_name=self.model_name,
|
|
75
|
+
strip_new_lines=self.strip_new_lines,
|
|
76
|
+
)
|
|
77
|
+
except Exception as e:
|
|
78
|
+
msg = f"Could not connect to CloudflareWorkersAIEmbeddings API: {e!s}"
|
|
79
|
+
raise ValueError(msg) from e
|
|
80
|
+
|
|
81
|
+
return embeddings
|