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,238 @@
|
|
|
1
|
+
from uuid import UUID
|
|
2
|
+
|
|
3
|
+
from langchain_community.graph_vectorstores import CassandraGraphVectorStore
|
|
4
|
+
|
|
5
|
+
from lfx.base.vectorstores.model import LCVectorStoreComponent, check_cached_vector_store
|
|
6
|
+
from lfx.helpers.data import docs_to_data
|
|
7
|
+
from lfx.inputs.inputs import DictInput, FloatInput
|
|
8
|
+
from lfx.io import (
|
|
9
|
+
DropdownInput,
|
|
10
|
+
HandleInput,
|
|
11
|
+
IntInput,
|
|
12
|
+
MessageTextInput,
|
|
13
|
+
SecretStrInput,
|
|
14
|
+
)
|
|
15
|
+
from lfx.schema.data import Data
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class CassandraGraphVectorStoreComponent(LCVectorStoreComponent):
|
|
19
|
+
display_name = "Cassandra Graph"
|
|
20
|
+
description = "Cassandra Graph Vector Store"
|
|
21
|
+
name = "CassandraGraph"
|
|
22
|
+
icon = "Cassandra"
|
|
23
|
+
|
|
24
|
+
inputs = [
|
|
25
|
+
MessageTextInput(
|
|
26
|
+
name="database_ref",
|
|
27
|
+
display_name="Contact Points / Astra Database ID",
|
|
28
|
+
info="Contact points for the database (or Astra DB database ID)",
|
|
29
|
+
required=True,
|
|
30
|
+
),
|
|
31
|
+
MessageTextInput(
|
|
32
|
+
name="username", display_name="Username", info="Username for the database (leave empty for Astra DB)."
|
|
33
|
+
),
|
|
34
|
+
SecretStrInput(
|
|
35
|
+
name="token",
|
|
36
|
+
display_name="Password / Astra DB Token",
|
|
37
|
+
info="User password for the database (or Astra DB token).",
|
|
38
|
+
required=True,
|
|
39
|
+
),
|
|
40
|
+
MessageTextInput(
|
|
41
|
+
name="keyspace",
|
|
42
|
+
display_name="Keyspace",
|
|
43
|
+
info="Table Keyspace (or Astra DB namespace).",
|
|
44
|
+
required=True,
|
|
45
|
+
),
|
|
46
|
+
MessageTextInput(
|
|
47
|
+
name="table_name",
|
|
48
|
+
display_name="Table Name",
|
|
49
|
+
info="The name of the table (or Astra DB collection) where vectors will be stored.",
|
|
50
|
+
required=True,
|
|
51
|
+
),
|
|
52
|
+
DropdownInput(
|
|
53
|
+
name="setup_mode",
|
|
54
|
+
display_name="Setup Mode",
|
|
55
|
+
info="Configuration mode for setting up the Cassandra table, with options like 'Sync' or 'Off'.",
|
|
56
|
+
options=["Sync", "Off"],
|
|
57
|
+
value="Sync",
|
|
58
|
+
advanced=True,
|
|
59
|
+
),
|
|
60
|
+
DictInput(
|
|
61
|
+
name="cluster_kwargs",
|
|
62
|
+
display_name="Cluster arguments",
|
|
63
|
+
info="Optional dictionary of additional keyword arguments for the Cassandra cluster.",
|
|
64
|
+
advanced=True,
|
|
65
|
+
list=True,
|
|
66
|
+
),
|
|
67
|
+
*LCVectorStoreComponent.inputs,
|
|
68
|
+
HandleInput(name="embedding", display_name="Embedding", input_types=["Embeddings"]),
|
|
69
|
+
IntInput(
|
|
70
|
+
name="number_of_results",
|
|
71
|
+
display_name="Number of Results",
|
|
72
|
+
info="Number of results to return.",
|
|
73
|
+
value=4,
|
|
74
|
+
advanced=True,
|
|
75
|
+
),
|
|
76
|
+
DropdownInput(
|
|
77
|
+
name="search_type",
|
|
78
|
+
display_name="Search Type",
|
|
79
|
+
info="Search type to use",
|
|
80
|
+
options=[
|
|
81
|
+
"Traversal",
|
|
82
|
+
"MMR traversal",
|
|
83
|
+
"Similarity",
|
|
84
|
+
"Similarity with score threshold",
|
|
85
|
+
"MMR (Max Marginal Relevance)",
|
|
86
|
+
],
|
|
87
|
+
value="Traversal",
|
|
88
|
+
advanced=True,
|
|
89
|
+
),
|
|
90
|
+
IntInput(
|
|
91
|
+
name="depth",
|
|
92
|
+
display_name="Depth of traversal",
|
|
93
|
+
info="The maximum depth of edges to traverse. (when using 'Traversal' or 'MMR traversal')",
|
|
94
|
+
value=1,
|
|
95
|
+
advanced=True,
|
|
96
|
+
),
|
|
97
|
+
FloatInput(
|
|
98
|
+
name="search_score_threshold",
|
|
99
|
+
display_name="Search Score Threshold",
|
|
100
|
+
info="Minimum similarity score threshold for search results. "
|
|
101
|
+
"(when using 'Similarity with score threshold')",
|
|
102
|
+
value=0,
|
|
103
|
+
advanced=True,
|
|
104
|
+
),
|
|
105
|
+
DictInput(
|
|
106
|
+
name="search_filter",
|
|
107
|
+
display_name="Search Metadata Filter",
|
|
108
|
+
info="Optional dictionary of filters to apply to the search query.",
|
|
109
|
+
advanced=True,
|
|
110
|
+
list=True,
|
|
111
|
+
),
|
|
112
|
+
]
|
|
113
|
+
|
|
114
|
+
@check_cached_vector_store
|
|
115
|
+
def build_vector_store(self) -> CassandraGraphVectorStore:
|
|
116
|
+
try:
|
|
117
|
+
import cassio
|
|
118
|
+
from langchain_community.utilities.cassandra import SetupMode
|
|
119
|
+
except ImportError as e:
|
|
120
|
+
msg = "Could not import cassio integration package. Please install it with `pip install cassio`."
|
|
121
|
+
raise ImportError(msg) from e
|
|
122
|
+
|
|
123
|
+
database_ref = self.database_ref
|
|
124
|
+
|
|
125
|
+
try:
|
|
126
|
+
UUID(self.database_ref)
|
|
127
|
+
is_astra = True
|
|
128
|
+
except ValueError:
|
|
129
|
+
is_astra = False
|
|
130
|
+
if "," in self.database_ref:
|
|
131
|
+
# use a copy because we can't change the type of the parameter
|
|
132
|
+
database_ref = self.database_ref.split(",")
|
|
133
|
+
|
|
134
|
+
if is_astra:
|
|
135
|
+
cassio.init(
|
|
136
|
+
database_id=database_ref,
|
|
137
|
+
token=self.token,
|
|
138
|
+
cluster_kwargs=self.cluster_kwargs,
|
|
139
|
+
)
|
|
140
|
+
else:
|
|
141
|
+
cassio.init(
|
|
142
|
+
contact_points=database_ref,
|
|
143
|
+
username=self.username,
|
|
144
|
+
password=self.token,
|
|
145
|
+
cluster_kwargs=self.cluster_kwargs,
|
|
146
|
+
)
|
|
147
|
+
|
|
148
|
+
self.ingest_data = self._prepare_ingest_data()
|
|
149
|
+
|
|
150
|
+
documents = []
|
|
151
|
+
|
|
152
|
+
for _input in self.ingest_data or []:
|
|
153
|
+
if isinstance(_input, Data):
|
|
154
|
+
documents.append(_input.to_lc_document())
|
|
155
|
+
else:
|
|
156
|
+
documents.append(_input)
|
|
157
|
+
|
|
158
|
+
setup_mode = SetupMode.OFF if self.setup_mode == "Off" else SetupMode.SYNC
|
|
159
|
+
|
|
160
|
+
if documents:
|
|
161
|
+
self.log(f"Adding {len(documents)} documents to the Vector Store.")
|
|
162
|
+
store = CassandraGraphVectorStore.from_documents(
|
|
163
|
+
documents=documents,
|
|
164
|
+
embedding=self.embedding,
|
|
165
|
+
node_table=self.table_name,
|
|
166
|
+
keyspace=self.keyspace,
|
|
167
|
+
)
|
|
168
|
+
else:
|
|
169
|
+
self.log("No documents to add to the Vector Store.")
|
|
170
|
+
store = CassandraGraphVectorStore(
|
|
171
|
+
embedding=self.embedding,
|
|
172
|
+
node_table=self.table_name,
|
|
173
|
+
keyspace=self.keyspace,
|
|
174
|
+
setup_mode=setup_mode,
|
|
175
|
+
)
|
|
176
|
+
return store
|
|
177
|
+
|
|
178
|
+
def _map_search_type(self) -> str:
|
|
179
|
+
if self.search_type == "Similarity":
|
|
180
|
+
return "similarity"
|
|
181
|
+
if self.search_type == "Similarity with score threshold":
|
|
182
|
+
return "similarity_score_threshold"
|
|
183
|
+
if self.search_type == "MMR (Max Marginal Relevance)":
|
|
184
|
+
return "mmr"
|
|
185
|
+
if self.search_type == "MMR Traversal":
|
|
186
|
+
return "mmr_traversal"
|
|
187
|
+
return "traversal"
|
|
188
|
+
|
|
189
|
+
def search_documents(self) -> list[Data]:
|
|
190
|
+
vector_store = self.build_vector_store()
|
|
191
|
+
|
|
192
|
+
self.log(f"Search input: {self.search_query}")
|
|
193
|
+
self.log(f"Search type: {self.search_type}")
|
|
194
|
+
self.log(f"Number of results: {self.number_of_results}")
|
|
195
|
+
|
|
196
|
+
if self.search_query and isinstance(self.search_query, str) and self.search_query.strip():
|
|
197
|
+
try:
|
|
198
|
+
search_type = self._map_search_type()
|
|
199
|
+
search_args = self._build_search_args()
|
|
200
|
+
|
|
201
|
+
self.log(f"Search args: {search_args}")
|
|
202
|
+
|
|
203
|
+
docs = vector_store.search(query=self.search_query, search_type=search_type, **search_args)
|
|
204
|
+
except KeyError as e:
|
|
205
|
+
if "content" in str(e):
|
|
206
|
+
msg = (
|
|
207
|
+
"You should ingest data through Langflow (or LangChain) to query it in Langflow. "
|
|
208
|
+
"Your collection does not contain a field name 'content'."
|
|
209
|
+
)
|
|
210
|
+
raise ValueError(msg) from e
|
|
211
|
+
raise
|
|
212
|
+
|
|
213
|
+
self.log(f"Retrieved documents: {len(docs)}")
|
|
214
|
+
|
|
215
|
+
data = docs_to_data(docs)
|
|
216
|
+
self.status = data
|
|
217
|
+
return data
|
|
218
|
+
return []
|
|
219
|
+
|
|
220
|
+
def _build_search_args(self):
|
|
221
|
+
args = {
|
|
222
|
+
"k": self.number_of_results,
|
|
223
|
+
"score_threshold": self.search_score_threshold,
|
|
224
|
+
"depth": self.depth,
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
if self.search_filter:
|
|
228
|
+
clean_filter = {k: v for k, v in self.search_filter.items() if k and v}
|
|
229
|
+
if len(clean_filter) > 0:
|
|
230
|
+
args["filter"] = clean_filter
|
|
231
|
+
return args
|
|
232
|
+
|
|
233
|
+
def get_retriever_kwargs(self):
|
|
234
|
+
search_args = self._build_search_args()
|
|
235
|
+
return {
|
|
236
|
+
"search_type": self._map_search_type(),
|
|
237
|
+
"search_kwargs": search_args,
|
|
238
|
+
}
|
|
@@ -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 .chroma import ChromaVectorStoreComponent
|
|
9
|
+
|
|
10
|
+
_dynamic_imports = {
|
|
11
|
+
"ChromaVectorStoreComponent": "chroma",
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
__all__ = [
|
|
15
|
+
"ChromaVectorStoreComponent",
|
|
16
|
+
]
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def __getattr__(attr_name: str) -> Any:
|
|
20
|
+
"""Lazily import Chroma 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,169 @@
|
|
|
1
|
+
from copy import deepcopy
|
|
2
|
+
from typing import TYPE_CHECKING
|
|
3
|
+
|
|
4
|
+
from chromadb.config import Settings
|
|
5
|
+
from langchain_chroma import Chroma
|
|
6
|
+
from typing_extensions import override
|
|
7
|
+
|
|
8
|
+
from lfx.base.vectorstores.model import LCVectorStoreComponent, check_cached_vector_store
|
|
9
|
+
from lfx.base.vectorstores.utils import chroma_collection_to_data
|
|
10
|
+
from lfx.inputs.inputs import BoolInput, DropdownInput, HandleInput, IntInput, StrInput
|
|
11
|
+
from lfx.schema.data import Data
|
|
12
|
+
|
|
13
|
+
if TYPE_CHECKING:
|
|
14
|
+
from lfx.schema.dataframe import DataFrame
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class ChromaVectorStoreComponent(LCVectorStoreComponent):
|
|
18
|
+
"""Chroma Vector Store with search capabilities."""
|
|
19
|
+
|
|
20
|
+
display_name: str = "Chroma DB"
|
|
21
|
+
description: str = "Chroma Vector Store with search capabilities"
|
|
22
|
+
name = "Chroma"
|
|
23
|
+
icon = "Chroma"
|
|
24
|
+
|
|
25
|
+
inputs = [
|
|
26
|
+
StrInput(
|
|
27
|
+
name="collection_name",
|
|
28
|
+
display_name="Collection Name",
|
|
29
|
+
value="langflow",
|
|
30
|
+
),
|
|
31
|
+
StrInput(
|
|
32
|
+
name="persist_directory",
|
|
33
|
+
display_name="Persist Directory",
|
|
34
|
+
),
|
|
35
|
+
*LCVectorStoreComponent.inputs,
|
|
36
|
+
HandleInput(name="embedding", display_name="Embedding", input_types=["Embeddings"]),
|
|
37
|
+
StrInput(
|
|
38
|
+
name="chroma_server_cors_allow_origins",
|
|
39
|
+
display_name="Server CORS Allow Origins",
|
|
40
|
+
advanced=True,
|
|
41
|
+
),
|
|
42
|
+
StrInput(
|
|
43
|
+
name="chroma_server_host",
|
|
44
|
+
display_name="Server Host",
|
|
45
|
+
advanced=True,
|
|
46
|
+
),
|
|
47
|
+
IntInput(
|
|
48
|
+
name="chroma_server_http_port",
|
|
49
|
+
display_name="Server HTTP Port",
|
|
50
|
+
advanced=True,
|
|
51
|
+
),
|
|
52
|
+
IntInput(
|
|
53
|
+
name="chroma_server_grpc_port",
|
|
54
|
+
display_name="Server gRPC Port",
|
|
55
|
+
advanced=True,
|
|
56
|
+
),
|
|
57
|
+
BoolInput(
|
|
58
|
+
name="chroma_server_ssl_enabled",
|
|
59
|
+
display_name="Server SSL Enabled",
|
|
60
|
+
advanced=True,
|
|
61
|
+
),
|
|
62
|
+
BoolInput(
|
|
63
|
+
name="allow_duplicates",
|
|
64
|
+
display_name="Allow Duplicates",
|
|
65
|
+
advanced=True,
|
|
66
|
+
info="If false, will not add documents that are already in the Vector Store.",
|
|
67
|
+
),
|
|
68
|
+
DropdownInput(
|
|
69
|
+
name="search_type",
|
|
70
|
+
display_name="Search Type",
|
|
71
|
+
options=["Similarity", "MMR"],
|
|
72
|
+
value="Similarity",
|
|
73
|
+
advanced=True,
|
|
74
|
+
),
|
|
75
|
+
IntInput(
|
|
76
|
+
name="number_of_results",
|
|
77
|
+
display_name="Number of Results",
|
|
78
|
+
info="Number of results to return.",
|
|
79
|
+
advanced=True,
|
|
80
|
+
value=10,
|
|
81
|
+
),
|
|
82
|
+
IntInput(
|
|
83
|
+
name="limit",
|
|
84
|
+
display_name="Limit",
|
|
85
|
+
advanced=True,
|
|
86
|
+
info="Limit the number of records to compare when Allow Duplicates is False.",
|
|
87
|
+
),
|
|
88
|
+
]
|
|
89
|
+
|
|
90
|
+
@override
|
|
91
|
+
@check_cached_vector_store
|
|
92
|
+
def build_vector_store(self) -> Chroma:
|
|
93
|
+
"""Builds the Chroma object."""
|
|
94
|
+
try:
|
|
95
|
+
from chromadb import Client
|
|
96
|
+
from langchain_chroma import Chroma
|
|
97
|
+
except ImportError as e:
|
|
98
|
+
msg = "Could not import Chroma integration package. Please install it with `pip install langchain-chroma`."
|
|
99
|
+
raise ImportError(msg) from e
|
|
100
|
+
# Chroma settings
|
|
101
|
+
chroma_settings = None
|
|
102
|
+
client = None
|
|
103
|
+
if self.chroma_server_host:
|
|
104
|
+
chroma_settings = Settings(
|
|
105
|
+
chroma_server_cors_allow_origins=self.chroma_server_cors_allow_origins or [],
|
|
106
|
+
chroma_server_host=self.chroma_server_host,
|
|
107
|
+
chroma_server_http_port=self.chroma_server_http_port or None,
|
|
108
|
+
chroma_server_grpc_port=self.chroma_server_grpc_port or None,
|
|
109
|
+
chroma_server_ssl_enabled=self.chroma_server_ssl_enabled,
|
|
110
|
+
)
|
|
111
|
+
client = Client(settings=chroma_settings)
|
|
112
|
+
|
|
113
|
+
# Check persist_directory and expand it if it is a relative path
|
|
114
|
+
persist_directory = self.resolve_path(self.persist_directory) if self.persist_directory is not None else None
|
|
115
|
+
|
|
116
|
+
chroma = Chroma(
|
|
117
|
+
persist_directory=persist_directory,
|
|
118
|
+
client=client,
|
|
119
|
+
embedding_function=self.embedding,
|
|
120
|
+
collection_name=self.collection_name,
|
|
121
|
+
)
|
|
122
|
+
|
|
123
|
+
self._add_documents_to_vector_store(chroma)
|
|
124
|
+
limit = int(self.limit) if self.limit is not None and str(self.limit).strip() else None
|
|
125
|
+
self.status = chroma_collection_to_data(chroma.get(limit=limit))
|
|
126
|
+
return chroma
|
|
127
|
+
|
|
128
|
+
def _add_documents_to_vector_store(self, vector_store: "Chroma") -> None:
|
|
129
|
+
"""Adds documents to the Vector Store."""
|
|
130
|
+
ingest_data: list | Data | DataFrame = self.ingest_data
|
|
131
|
+
if not ingest_data:
|
|
132
|
+
self.status = ""
|
|
133
|
+
return
|
|
134
|
+
|
|
135
|
+
# Convert DataFrame to Data if needed using parent's method
|
|
136
|
+
ingest_data = self._prepare_ingest_data()
|
|
137
|
+
|
|
138
|
+
stored_documents_without_id = []
|
|
139
|
+
if self.allow_duplicates:
|
|
140
|
+
stored_data = []
|
|
141
|
+
else:
|
|
142
|
+
limit = int(self.limit) if self.limit is not None and str(self.limit).strip() else None
|
|
143
|
+
stored_data = chroma_collection_to_data(vector_store.get(limit=limit))
|
|
144
|
+
for value in deepcopy(stored_data):
|
|
145
|
+
del value.id
|
|
146
|
+
stored_documents_without_id.append(value)
|
|
147
|
+
|
|
148
|
+
documents = []
|
|
149
|
+
for _input in ingest_data or []:
|
|
150
|
+
if isinstance(_input, Data):
|
|
151
|
+
if _input not in stored_documents_without_id:
|
|
152
|
+
documents.append(_input.to_lc_document())
|
|
153
|
+
else:
|
|
154
|
+
msg = "Vector Store Inputs must be Data objects."
|
|
155
|
+
raise TypeError(msg)
|
|
156
|
+
|
|
157
|
+
if documents and self.embedding is not None:
|
|
158
|
+
self.log(f"Adding {len(documents)} documents to the Vector Store.")
|
|
159
|
+
# Filter complex metadata to prevent ChromaDB errors
|
|
160
|
+
try:
|
|
161
|
+
from langchain_community.vectorstores.utils import filter_complex_metadata
|
|
162
|
+
|
|
163
|
+
filtered_documents = filter_complex_metadata(documents)
|
|
164
|
+
vector_store.add_documents(filtered_documents)
|
|
165
|
+
except ImportError:
|
|
166
|
+
self.log("Warning: Could not import filter_complex_metadata. Adding documents without filtering.")
|
|
167
|
+
vector_store.add_documents(documents)
|
|
168
|
+
else:
|
|
169
|
+
self.log("No documents to add to the Vector Store.")
|
|
@@ -0,0 +1,40 @@
|
|
|
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 .cleanlab_evaluator import CleanlabEvaluator
|
|
9
|
+
from .cleanlab_rag_evaluator import CleanlabRAGEvaluator
|
|
10
|
+
from .cleanlab_remediator import CleanlabRemediator
|
|
11
|
+
|
|
12
|
+
_dynamic_imports = {
|
|
13
|
+
"CleanlabEvaluator": "cleanlab_evaluator",
|
|
14
|
+
"CleanlabRAGEvaluator": "cleanlab_rag_evaluator",
|
|
15
|
+
"CleanlabRemediator": "cleanlab_remediator",
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
__all__ = [
|
|
19
|
+
"CleanlabEvaluator",
|
|
20
|
+
"CleanlabRAGEvaluator",
|
|
21
|
+
"CleanlabRemediator",
|
|
22
|
+
]
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def __getattr__(attr_name: str) -> Any:
|
|
26
|
+
"""Lazily import cleanlab components on attribute access."""
|
|
27
|
+
if attr_name not in _dynamic_imports:
|
|
28
|
+
msg = f"module '{__name__}' has no attribute '{attr_name}'"
|
|
29
|
+
raise AttributeError(msg)
|
|
30
|
+
try:
|
|
31
|
+
result = import_mod(attr_name, _dynamic_imports[attr_name], __spec__.parent)
|
|
32
|
+
except (ModuleNotFoundError, ImportError, AttributeError) as e:
|
|
33
|
+
msg = f"Could not import '{attr_name}' from '{__name__}': {e}"
|
|
34
|
+
raise AttributeError(msg) from e
|
|
35
|
+
globals()[attr_name] = result
|
|
36
|
+
return result
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def __dir__() -> list[str]:
|
|
40
|
+
return list(__all__)
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
from cleanlab_tlm import TLM
|
|
2
|
+
|
|
3
|
+
from lfx.custom import Component
|
|
4
|
+
from lfx.io import (
|
|
5
|
+
DropdownInput,
|
|
6
|
+
MessageTextInput,
|
|
7
|
+
Output,
|
|
8
|
+
SecretStrInput,
|
|
9
|
+
)
|
|
10
|
+
from lfx.schema.message import Message
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class CleanlabEvaluator(Component):
|
|
14
|
+
"""A component that evaluates the trustworthiness of LLM responses using Cleanlab.
|
|
15
|
+
|
|
16
|
+
This component takes a prompt and response pair, along with optional system instructions,
|
|
17
|
+
and uses Cleanlab's evaluation algorithms to generate a trust score and explanation.
|
|
18
|
+
|
|
19
|
+
Inputs:
|
|
20
|
+
- system_prompt (MessageTextInput): Optional system-level instructions prepended to the user prompt.
|
|
21
|
+
- prompt (MessageTextInput): The user's prompt or query sent to the LLM.
|
|
22
|
+
- response (MessageTextInput): The response generated by the LLM to be evaluated. This should come from the
|
|
23
|
+
LLM component, i.e. OpenAI, Gemini, etc.
|
|
24
|
+
- api_key (SecretStrInput): Your Cleanlab API key.
|
|
25
|
+
- model (DropdownInput): The model used by Cleanlab to evaluate the response (can differ from the
|
|
26
|
+
generation model).
|
|
27
|
+
- quality_preset (DropdownInput): Tradeoff setting for accuracy vs. speed and cost. Higher presets are
|
|
28
|
+
slower but more accurate.
|
|
29
|
+
|
|
30
|
+
Outputs:
|
|
31
|
+
- response_passthrough (Message): The original response, passed through for downstream use.
|
|
32
|
+
- score (number): A float between 0 and 1 indicating Cleanlab's trustworthiness score for the response.
|
|
33
|
+
- explanation (Message): A textual explanation of why the response received its score.
|
|
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/tutorials/tlm/
|
|
39
|
+
"""
|
|
40
|
+
|
|
41
|
+
display_name = "Cleanlab Evaluator"
|
|
42
|
+
description = "Evaluates any LLM response using Cleanlab and outputs trust score and explanation."
|
|
43
|
+
icon = "Cleanlab"
|
|
44
|
+
name = "CleanlabEvaluator"
|
|
45
|
+
|
|
46
|
+
inputs = [
|
|
47
|
+
MessageTextInput(
|
|
48
|
+
name="system_prompt",
|
|
49
|
+
display_name="System Message",
|
|
50
|
+
info="System-level instructions prepended to the user query.",
|
|
51
|
+
value="",
|
|
52
|
+
),
|
|
53
|
+
MessageTextInput(
|
|
54
|
+
name="prompt",
|
|
55
|
+
display_name="Prompt",
|
|
56
|
+
info="The user's query to the model.",
|
|
57
|
+
required=True,
|
|
58
|
+
),
|
|
59
|
+
MessageTextInput(
|
|
60
|
+
name="response",
|
|
61
|
+
display_name="Response",
|
|
62
|
+
info="The response to the user's query.",
|
|
63
|
+
required=True,
|
|
64
|
+
),
|
|
65
|
+
SecretStrInput(
|
|
66
|
+
name="api_key",
|
|
67
|
+
display_name="Cleanlab API Key",
|
|
68
|
+
info="Your Cleanlab API key.",
|
|
69
|
+
required=True,
|
|
70
|
+
),
|
|
71
|
+
DropdownInput(
|
|
72
|
+
name="model",
|
|
73
|
+
display_name="Cleanlab Evaluation Model",
|
|
74
|
+
options=[
|
|
75
|
+
"gpt-4.1",
|
|
76
|
+
"gpt-4.1-mini",
|
|
77
|
+
"gpt-4.1-nano",
|
|
78
|
+
"o4-mini",
|
|
79
|
+
"o3",
|
|
80
|
+
"gpt-4.5-preview",
|
|
81
|
+
"gpt-4o-mini",
|
|
82
|
+
"gpt-4o",
|
|
83
|
+
"o3-mini",
|
|
84
|
+
"o1",
|
|
85
|
+
"o1-mini",
|
|
86
|
+
"gpt-4",
|
|
87
|
+
"gpt-3.5-turbo-16k",
|
|
88
|
+
"claude-3.7-sonnet",
|
|
89
|
+
"claude-3.5-sonnet-v2",
|
|
90
|
+
"claude-3.5-sonnet",
|
|
91
|
+
"claude-3.5-haiku",
|
|
92
|
+
"claude-3-haiku",
|
|
93
|
+
"nova-micro",
|
|
94
|
+
"nova-lite",
|
|
95
|
+
"nova-pro",
|
|
96
|
+
],
|
|
97
|
+
info="The model Cleanlab uses to evaluate the response. This does NOT need to be the same model that "
|
|
98
|
+
"generated the response.",
|
|
99
|
+
value="gpt-4o-mini",
|
|
100
|
+
required=True,
|
|
101
|
+
advanced=True,
|
|
102
|
+
),
|
|
103
|
+
DropdownInput(
|
|
104
|
+
name="quality_preset",
|
|
105
|
+
display_name="Quality Preset",
|
|
106
|
+
options=["base", "low", "medium", "high", "best"],
|
|
107
|
+
value="medium",
|
|
108
|
+
info="This determines the accuracy, latency, and cost of the evaluation. Higher quality is generally "
|
|
109
|
+
"slower but more accurate.",
|
|
110
|
+
required=True,
|
|
111
|
+
advanced=True,
|
|
112
|
+
),
|
|
113
|
+
]
|
|
114
|
+
|
|
115
|
+
outputs = [
|
|
116
|
+
Output(
|
|
117
|
+
display_name="Response",
|
|
118
|
+
name="response_passthrough",
|
|
119
|
+
method="pass_response",
|
|
120
|
+
types=["Message"],
|
|
121
|
+
),
|
|
122
|
+
Output(display_name="Trust Score", name="score", method="get_score", types=["number"]),
|
|
123
|
+
Output(
|
|
124
|
+
display_name="Explanation",
|
|
125
|
+
name="explanation",
|
|
126
|
+
method="get_explanation",
|
|
127
|
+
types=["Message"],
|
|
128
|
+
),
|
|
129
|
+
]
|
|
130
|
+
|
|
131
|
+
def _evaluate_once(self):
|
|
132
|
+
if not hasattr(self, "_cached_result"):
|
|
133
|
+
full_prompt = f"{self.system_prompt}\n\n{self.prompt}" if self.system_prompt else self.prompt
|
|
134
|
+
tlm = TLM(
|
|
135
|
+
api_key=self.api_key,
|
|
136
|
+
options={"log": ["explanation"], "model": self.model},
|
|
137
|
+
quality_preset=self.quality_preset,
|
|
138
|
+
)
|
|
139
|
+
self._cached_result = tlm.get_trustworthiness_score(full_prompt, self.response)
|
|
140
|
+
return self._cached_result
|
|
141
|
+
|
|
142
|
+
def get_score(self) -> float:
|
|
143
|
+
result = self._evaluate_once()
|
|
144
|
+
score = result.get("trustworthiness_score", 0.0)
|
|
145
|
+
self.status = f"Trust score: {score:.2f}"
|
|
146
|
+
return score
|
|
147
|
+
|
|
148
|
+
def get_explanation(self) -> Message:
|
|
149
|
+
result = self._evaluate_once()
|
|
150
|
+
explanation = result.get("log", {}).get("explanation", "No explanation returned.")
|
|
151
|
+
return Message(text=explanation)
|
|
152
|
+
|
|
153
|
+
def pass_response(self) -> Message:
|
|
154
|
+
self.status = "Passing through response."
|
|
155
|
+
return Message(text=self.response)
|