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
|
File without changes
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
from abc import abstractmethod
|
|
2
|
+
from typing import Any
|
|
3
|
+
|
|
4
|
+
from langchain_core.documents import BaseDocumentTransformer
|
|
5
|
+
|
|
6
|
+
from lfx.custom.custom_component.component import Component
|
|
7
|
+
from lfx.io import Output
|
|
8
|
+
from lfx.schema.data import Data
|
|
9
|
+
from lfx.utils.util import build_loader_repr_from_data
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class LCDocumentTransformerComponent(Component):
|
|
13
|
+
trace_type = "document_transformer"
|
|
14
|
+
outputs = [
|
|
15
|
+
Output(display_name="Data", name="data", method="transform_data"),
|
|
16
|
+
]
|
|
17
|
+
|
|
18
|
+
def transform_data(self) -> list[Data]:
|
|
19
|
+
data_input = self.get_data_input()
|
|
20
|
+
documents = []
|
|
21
|
+
|
|
22
|
+
if not isinstance(data_input, list):
|
|
23
|
+
data_input = [data_input]
|
|
24
|
+
|
|
25
|
+
for _input in data_input:
|
|
26
|
+
if isinstance(_input, Data):
|
|
27
|
+
documents.append(_input.to_lc_document())
|
|
28
|
+
else:
|
|
29
|
+
documents.append(_input)
|
|
30
|
+
|
|
31
|
+
transformer = self.build_document_transformer()
|
|
32
|
+
docs = transformer.transform_documents(documents)
|
|
33
|
+
data = self.to_data(docs)
|
|
34
|
+
self.repr_value = build_loader_repr_from_data(data)
|
|
35
|
+
return data
|
|
36
|
+
|
|
37
|
+
@abstractmethod
|
|
38
|
+
def get_data_input(self) -> Any:
|
|
39
|
+
"""Get the data input."""
|
|
40
|
+
|
|
41
|
+
@abstractmethod
|
|
42
|
+
def build_document_transformer(self) -> BaseDocumentTransformer:
|
|
43
|
+
"""Build the text splitter."""
|
|
File without changes
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import concurrent.futures
|
|
2
|
+
import json
|
|
3
|
+
|
|
4
|
+
import httpx
|
|
5
|
+
from pydantic import BaseModel, SecretStr
|
|
6
|
+
|
|
7
|
+
from lfx.field_typing import Embeddings
|
|
8
|
+
from lfx.log.logger import logger
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class AIMLEmbeddingsImpl(BaseModel, Embeddings):
|
|
12
|
+
embeddings_completion_url: str = "https://api.aimlapi.com/v1/embeddings"
|
|
13
|
+
|
|
14
|
+
api_key: SecretStr
|
|
15
|
+
model: str
|
|
16
|
+
|
|
17
|
+
def embed_documents(self, texts: list[str]) -> list[list[float]]:
|
|
18
|
+
embeddings = [None] * len(texts)
|
|
19
|
+
headers = {
|
|
20
|
+
"Content-Type": "application/json",
|
|
21
|
+
"Authorization": f"Bearer {self.api_key.get_secret_value()}",
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
with httpx.Client() as client, concurrent.futures.ThreadPoolExecutor() as executor:
|
|
25
|
+
futures = []
|
|
26
|
+
for i, text in enumerate(texts):
|
|
27
|
+
futures.append((i, executor.submit(self._embed_text, client, headers, text)))
|
|
28
|
+
|
|
29
|
+
for index, future in futures:
|
|
30
|
+
try:
|
|
31
|
+
result_data = future.result()
|
|
32
|
+
if len(result_data["data"]) != 1:
|
|
33
|
+
msg = f"Expected one embedding, got {len(result_data['data'])}"
|
|
34
|
+
raise ValueError(msg)
|
|
35
|
+
embeddings[index] = result_data["data"][0]["embedding"]
|
|
36
|
+
except (
|
|
37
|
+
httpx.HTTPStatusError,
|
|
38
|
+
httpx.RequestError,
|
|
39
|
+
json.JSONDecodeError,
|
|
40
|
+
KeyError,
|
|
41
|
+
ValueError,
|
|
42
|
+
):
|
|
43
|
+
logger.exception("Error occurred")
|
|
44
|
+
raise
|
|
45
|
+
|
|
46
|
+
return embeddings # type: ignore[return-value]
|
|
47
|
+
|
|
48
|
+
def _embed_text(self, client: httpx.Client, headers: dict, text: str) -> dict:
|
|
49
|
+
payload = {
|
|
50
|
+
"model": self.model,
|
|
51
|
+
"input": text,
|
|
52
|
+
}
|
|
53
|
+
response = client.post(
|
|
54
|
+
self.embeddings_completion_url,
|
|
55
|
+
headers=headers,
|
|
56
|
+
json=payload,
|
|
57
|
+
)
|
|
58
|
+
response.raise_for_status()
|
|
59
|
+
return response.json()
|
|
60
|
+
|
|
61
|
+
def embed_query(self, text: str) -> list[float]:
|
|
62
|
+
return self.embed_documents([text])[0]
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"""Extended embeddings class with available models metadata."""
|
|
2
|
+
|
|
3
|
+
from langchain_core.embeddings import Embeddings
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class EmbeddingsWithModels(Embeddings):
|
|
7
|
+
"""Extended Embeddings class that includes available models with dedicated instances.
|
|
8
|
+
|
|
9
|
+
This class inherits from LangChain Embeddings and provides a mapping of model names
|
|
10
|
+
to their dedicated embedding instances, enabling multi-model support without the need
|
|
11
|
+
for dynamic model switching.
|
|
12
|
+
|
|
13
|
+
Attributes:
|
|
14
|
+
embeddings: The primary LangChain Embeddings instance (used as fallback).
|
|
15
|
+
available_models: Dict mapping model names to their dedicated Embeddings instances.
|
|
16
|
+
Each model has its own pre-configured instance with specific parameters.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
def __init__(
|
|
20
|
+
self,
|
|
21
|
+
embeddings: Embeddings,
|
|
22
|
+
available_models: dict[str, Embeddings] | None = None,
|
|
23
|
+
):
|
|
24
|
+
"""Initialize the EmbeddingsWithModels wrapper.
|
|
25
|
+
|
|
26
|
+
Args:
|
|
27
|
+
embeddings: The primary LangChain Embeddings instance (used as default/fallback).
|
|
28
|
+
available_models: Dict mapping model names to dedicated Embeddings instances.
|
|
29
|
+
Each value should be a fully configured Embeddings object ready to use.
|
|
30
|
+
Defaults to empty dict if not provided.
|
|
31
|
+
"""
|
|
32
|
+
super().__init__()
|
|
33
|
+
self.embeddings = embeddings
|
|
34
|
+
self.available_models = available_models if available_models is not None else {}
|
|
35
|
+
|
|
36
|
+
def embed_documents(self, texts: list[str]) -> list[list[float]]:
|
|
37
|
+
"""Embed search docs by delegating to the underlying embeddings instance.
|
|
38
|
+
|
|
39
|
+
Args:
|
|
40
|
+
texts: List of text to embed.
|
|
41
|
+
|
|
42
|
+
Returns:
|
|
43
|
+
List of embeddings.
|
|
44
|
+
"""
|
|
45
|
+
return self.embeddings.embed_documents(texts)
|
|
46
|
+
|
|
47
|
+
def embed_query(self, text: str) -> list[float]:
|
|
48
|
+
"""Embed query text by delegating to the underlying embeddings instance.
|
|
49
|
+
|
|
50
|
+
Args:
|
|
51
|
+
text: Text to embed.
|
|
52
|
+
|
|
53
|
+
Returns:
|
|
54
|
+
Embedding.
|
|
55
|
+
"""
|
|
56
|
+
return self.embeddings.embed_query(text)
|
|
57
|
+
|
|
58
|
+
async def aembed_documents(self, texts: list[str]) -> list[list[float]]:
|
|
59
|
+
"""Asynchronously embed search docs.
|
|
60
|
+
|
|
61
|
+
Args:
|
|
62
|
+
texts: List of text to embed.
|
|
63
|
+
|
|
64
|
+
Returns:
|
|
65
|
+
List of embeddings.
|
|
66
|
+
"""
|
|
67
|
+
return await self.embeddings.aembed_documents(texts)
|
|
68
|
+
|
|
69
|
+
async def aembed_query(self, text: str) -> list[float]:
|
|
70
|
+
"""Asynchronously embed query text.
|
|
71
|
+
|
|
72
|
+
Args:
|
|
73
|
+
text: Text to embed.
|
|
74
|
+
|
|
75
|
+
Returns:
|
|
76
|
+
Embedding.
|
|
77
|
+
"""
|
|
78
|
+
return await self.embeddings.aembed_query(text)
|
|
79
|
+
|
|
80
|
+
def __call__(self, *args, **kwargs):
|
|
81
|
+
"""Make the class callable by delegating to the underlying embeddings instance.
|
|
82
|
+
|
|
83
|
+
This handles cases where the embeddings object is used as a callable.
|
|
84
|
+
|
|
85
|
+
Args:
|
|
86
|
+
*args: Positional arguments to pass to the underlying embeddings instance.
|
|
87
|
+
**kwargs: Keyword arguments to pass to the underlying embeddings instance.
|
|
88
|
+
|
|
89
|
+
Returns:
|
|
90
|
+
The result of calling the underlying embeddings instance.
|
|
91
|
+
"""
|
|
92
|
+
if callable(self.embeddings):
|
|
93
|
+
return self.embeddings(*args, **kwargs)
|
|
94
|
+
msg = f"'{type(self.embeddings).__name__}' object is not callable"
|
|
95
|
+
raise TypeError(msg)
|
|
96
|
+
|
|
97
|
+
def __getattr__(self, name: str):
|
|
98
|
+
"""Delegate attribute access to the underlying embeddings instance.
|
|
99
|
+
|
|
100
|
+
This ensures full compatibility with any additional methods or attributes
|
|
101
|
+
that the underlying embeddings instance might have.
|
|
102
|
+
|
|
103
|
+
Args:
|
|
104
|
+
name: The attribute name to access.
|
|
105
|
+
|
|
106
|
+
Returns:
|
|
107
|
+
The attribute from the underlying embeddings instance.
|
|
108
|
+
"""
|
|
109
|
+
return getattr(self.embeddings, name)
|
|
110
|
+
|
|
111
|
+
def __repr__(self) -> str:
|
|
112
|
+
"""Return string representation of the wrapper."""
|
|
113
|
+
return f"EmbeddingsWithModels(embeddings={self.embeddings!r}, available_models={self.available_models!r})"
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
from lfx.custom.custom_component.component import Component
|
|
2
|
+
from lfx.field_typing import Embeddings
|
|
3
|
+
from lfx.io import Output
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class LCEmbeddingsModel(Component):
|
|
7
|
+
trace_type = "embedding"
|
|
8
|
+
|
|
9
|
+
outputs = [
|
|
10
|
+
Output(display_name="Embedding Model", name="embeddings", method="build_embeddings"),
|
|
11
|
+
]
|
|
12
|
+
|
|
13
|
+
def _validate_outputs(self) -> None:
|
|
14
|
+
required_output_methods = ["build_embeddings"]
|
|
15
|
+
output_names = [output.name for output in self.outputs]
|
|
16
|
+
for method_name in required_output_methods:
|
|
17
|
+
if method_name not in output_names:
|
|
18
|
+
msg = f"Output with name '{method_name}' must be defined."
|
|
19
|
+
raise ValueError(msg)
|
|
20
|
+
if not hasattr(self, method_name):
|
|
21
|
+
msg = f"Method '{method_name}' must be defined."
|
|
22
|
+
raise ValueError(msg)
|
|
23
|
+
|
|
24
|
+
def build_embeddings(self) -> Embeddings:
|
|
25
|
+
msg = "You must implement the build_embeddings method in your class."
|
|
26
|
+
raise NotImplementedError(msg)
|
|
File without changes
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
from lfx.graph.schema import ResultData, RunOutputs
|
|
2
|
+
from lfx.log.logger import logger
|
|
3
|
+
from lfx.schema.data import Data
|
|
4
|
+
from lfx.schema.message import Message
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def build_data_from_run_outputs(run_outputs: RunOutputs) -> list[Data]:
|
|
8
|
+
"""Build a list of data from the given RunOutputs.
|
|
9
|
+
|
|
10
|
+
Args:
|
|
11
|
+
run_outputs (RunOutputs): The RunOutputs object containing the output data.
|
|
12
|
+
|
|
13
|
+
Returns:
|
|
14
|
+
List[Data]: A list of data built from the RunOutputs.
|
|
15
|
+
|
|
16
|
+
"""
|
|
17
|
+
if not run_outputs:
|
|
18
|
+
return []
|
|
19
|
+
data = []
|
|
20
|
+
for result_data in run_outputs.outputs:
|
|
21
|
+
if result_data:
|
|
22
|
+
data.extend(build_data_from_result_data(result_data))
|
|
23
|
+
return data
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def build_data_from_result_data(result_data: ResultData) -> list[Data]:
|
|
27
|
+
"""Build a list of data from the given ResultData.
|
|
28
|
+
|
|
29
|
+
Args:
|
|
30
|
+
result_data (ResultData): The ResultData object containing the result data.
|
|
31
|
+
|
|
32
|
+
Returns:
|
|
33
|
+
List[Data]: A list of data built from the ResultData.
|
|
34
|
+
|
|
35
|
+
"""
|
|
36
|
+
messages = result_data.messages
|
|
37
|
+
|
|
38
|
+
if not messages:
|
|
39
|
+
return []
|
|
40
|
+
data = []
|
|
41
|
+
|
|
42
|
+
# Handle results without chat messages (calling flow)
|
|
43
|
+
if not messages:
|
|
44
|
+
# Result with a single record
|
|
45
|
+
if isinstance(result_data.artifacts, dict):
|
|
46
|
+
data.append(Data(data=result_data.artifacts))
|
|
47
|
+
# List of artifacts
|
|
48
|
+
elif isinstance(result_data.artifacts, list):
|
|
49
|
+
for artifact in result_data.artifacts:
|
|
50
|
+
# If multiple records are found as artifacts, return as-is
|
|
51
|
+
if isinstance(artifact, Data):
|
|
52
|
+
data.append(artifact)
|
|
53
|
+
else:
|
|
54
|
+
# Warn about unknown output type
|
|
55
|
+
logger.warning(f"Unable to build record output from unknown ResultData.artifact: {artifact}")
|
|
56
|
+
# Chat or text output
|
|
57
|
+
elif result_data.results:
|
|
58
|
+
data.append(Data(data={"result": result_data.results}, text_key="result"))
|
|
59
|
+
return data
|
|
60
|
+
else:
|
|
61
|
+
return []
|
|
62
|
+
|
|
63
|
+
if isinstance(result_data.results, dict):
|
|
64
|
+
for name, result in result_data.results.items():
|
|
65
|
+
dataobj: Data | Message | None
|
|
66
|
+
dataobj = result if isinstance(result, Message) else Data(data=result, text_key=name)
|
|
67
|
+
|
|
68
|
+
data.append(dataobj)
|
|
69
|
+
else:
|
|
70
|
+
data.append(Data(data=result_data.results))
|
|
71
|
+
return data
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def format_flow_output_data(data: list[Data]) -> str:
|
|
75
|
+
"""Format the flow output data into a string.
|
|
76
|
+
|
|
77
|
+
Args:
|
|
78
|
+
data (List[Data]): The list of data to format.
|
|
79
|
+
|
|
80
|
+
Returns:
|
|
81
|
+
str: The formatted flow output data.
|
|
82
|
+
|
|
83
|
+
"""
|
|
84
|
+
result = "Flow run output:\n"
|
|
85
|
+
results = "\n".join([value.get_text() if hasattr(value, "get_text") else str(value) for value in data])
|
|
86
|
+
return result + results
|
|
File without changes
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
# Import LangChain base
|
|
2
|
+
from langchain_core.language_models.chat_models import BaseChatModel
|
|
3
|
+
from langchain_core.messages import AIMessage, HumanMessage, SystemMessage, ToolCall
|
|
4
|
+
from langchain_core.tools import BaseTool
|
|
5
|
+
|
|
6
|
+
# Import Hugging Face Model base
|
|
7
|
+
from smolagents import Model, Tool
|
|
8
|
+
from smolagents.models import ChatMessage, ChatMessageToolCall, ChatMessageToolCallDefinition
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def _lc_tool_call_to_hf_tool_call(tool_call: ToolCall) -> ChatMessageToolCall:
|
|
12
|
+
"""Convert a LangChain ToolCall to a Hugging Face ChatMessageToolCall.
|
|
13
|
+
|
|
14
|
+
Args:
|
|
15
|
+
tool_call (ToolCall): LangChain tool call to convert
|
|
16
|
+
|
|
17
|
+
Returns:
|
|
18
|
+
ChatMessageToolCall: Equivalent Hugging Face tool call
|
|
19
|
+
"""
|
|
20
|
+
return ChatMessageToolCall(
|
|
21
|
+
function=ChatMessageToolCallDefinition(name=tool_call.name, arguments=tool_call.args),
|
|
22
|
+
id=tool_call.id,
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def _hf_tool_to_lc_tool(tool) -> BaseTool:
|
|
27
|
+
"""Convert a Hugging Face Tool to a LangChain BaseTool.
|
|
28
|
+
|
|
29
|
+
Args:
|
|
30
|
+
tool (Tool): Hugging Face tool to convert
|
|
31
|
+
|
|
32
|
+
Returns:
|
|
33
|
+
BaseTool: Equivalent LangChain tool
|
|
34
|
+
"""
|
|
35
|
+
if not hasattr(tool, "langchain_tool"):
|
|
36
|
+
msg = "Hugging Face Tool does not have a langchain_tool attribute"
|
|
37
|
+
raise ValueError(msg)
|
|
38
|
+
return tool.langchain_tool
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class LangChainHFModel(Model):
|
|
42
|
+
"""A class bridging Hugging Face's `Model` interface with a LangChain `BaseChatModel`.
|
|
43
|
+
|
|
44
|
+
This adapter allows using any LangChain chat model with the Hugging Face interface.
|
|
45
|
+
It handles conversion of message formats and tool calls between the two frameworks.
|
|
46
|
+
|
|
47
|
+
Usage:
|
|
48
|
+
>>> lc_model = LangChainChatModel(...) # any BaseChatModel
|
|
49
|
+
>>> hf_model = LangChainHFModel(lc_model)
|
|
50
|
+
>>> hf_model(messages=[{"role": "user", "content": "Hello!"}])
|
|
51
|
+
"""
|
|
52
|
+
|
|
53
|
+
def __init__(self, chat_model: BaseChatModel, **kwargs):
|
|
54
|
+
"""Initialize the bridge model.
|
|
55
|
+
|
|
56
|
+
Args:
|
|
57
|
+
chat_model (BaseChatModel): LangChain chat model to wrap
|
|
58
|
+
**kwargs: Additional arguments passed to Model.__init__
|
|
59
|
+
"""
|
|
60
|
+
super().__init__(**kwargs)
|
|
61
|
+
self.chat_model = chat_model
|
|
62
|
+
|
|
63
|
+
def __call__(
|
|
64
|
+
self,
|
|
65
|
+
messages: list[dict[str, str]],
|
|
66
|
+
stop_sequences: list[str] | None = None,
|
|
67
|
+
grammar: str | None = None,
|
|
68
|
+
tools_to_call_from: list[Tool] | None = None,
|
|
69
|
+
**kwargs,
|
|
70
|
+
) -> ChatMessage:
|
|
71
|
+
"""Process messages through the LangChain model and return Hugging Face format.
|
|
72
|
+
|
|
73
|
+
Args:
|
|
74
|
+
messages: List of message dictionaries with 'role' and 'content' keys
|
|
75
|
+
stop_sequences: Optional list of strings to stop generation
|
|
76
|
+
grammar: Optional grammar specification (not used)
|
|
77
|
+
tools_to_call_from: Optional list of available tools (not used)
|
|
78
|
+
**kwargs: Additional arguments passed to the LangChain model
|
|
79
|
+
|
|
80
|
+
Returns:
|
|
81
|
+
ChatMessage: Response in Hugging Face format
|
|
82
|
+
"""
|
|
83
|
+
if grammar:
|
|
84
|
+
msg = "Grammar is not yet supported."
|
|
85
|
+
raise ValueError(msg)
|
|
86
|
+
|
|
87
|
+
# Convert HF messages to LangChain messages
|
|
88
|
+
lc_messages = []
|
|
89
|
+
for m in messages:
|
|
90
|
+
role = m["role"]
|
|
91
|
+
content = m["content"]
|
|
92
|
+
if role == "system":
|
|
93
|
+
lc_messages.append(SystemMessage(content=content))
|
|
94
|
+
elif role == "assistant":
|
|
95
|
+
lc_messages.append(AIMessage(content=content))
|
|
96
|
+
else:
|
|
97
|
+
# Default any unknown role to "user"
|
|
98
|
+
lc_messages.append(HumanMessage(content=content))
|
|
99
|
+
|
|
100
|
+
# Convert tools to LangChain tools
|
|
101
|
+
if tools_to_call_from:
|
|
102
|
+
tools_to_call_from = [_hf_tool_to_lc_tool(tool) for tool in tools_to_call_from]
|
|
103
|
+
|
|
104
|
+
model = self.chat_model.bind_tools(tools_to_call_from) if tools_to_call_from else self.chat_model
|
|
105
|
+
|
|
106
|
+
# Call the LangChain model
|
|
107
|
+
result_msg: AIMessage = model.invoke(lc_messages, stop=stop_sequences, **kwargs)
|
|
108
|
+
|
|
109
|
+
# Convert the AIMessage into an HF ChatMessage
|
|
110
|
+
return ChatMessage(
|
|
111
|
+
role="assistant",
|
|
112
|
+
content=result_msg.content or "",
|
|
113
|
+
tool_calls=[_lc_tool_call_to_hf_tool_call(tool_call) for tool_call in result_msg.tool_calls],
|
|
114
|
+
)
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
# How to use
|
|
118
|
+
# if __name__ == "__main__":
|
|
119
|
+
# from langchain_community.tools import DuckDuckGoSearchRun
|
|
120
|
+
# from langchain_openai import ChatOpenAI
|
|
121
|
+
# from rich import rprint
|
|
122
|
+
# from smolagents import CodeAgent
|
|
123
|
+
|
|
124
|
+
# # Example usage
|
|
125
|
+
# model = LangChainHFModel(chat_model=ChatOpenAI(model="gpt-4o-mini"))
|
|
126
|
+
# search_tool = DuckDuckGoSearchRun()
|
|
127
|
+
# hf_tool = Tool.from_langchain(search_tool)
|
|
128
|
+
|
|
129
|
+
# code_agent = CodeAgent(
|
|
130
|
+
# model=model,
|
|
131
|
+
# tools=[hf_tool],
|
|
132
|
+
# )
|
|
133
|
+
# rprint(code_agent.run("Search for Langflow on DuckDuckGo and return the first result"))
|
lfx/base/io/__init__.py
ADDED
|
File without changes
|
lfx/base/io/chat.py
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
from lfx.custom.custom_component.component import Component
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class ChatComponent(Component):
|
|
5
|
+
display_name = "Chat Component"
|
|
6
|
+
description = "Use as base for chat components."
|
|
7
|
+
|
|
8
|
+
def get_properties_from_source_component(self):
|
|
9
|
+
vertex = self.get_vertex()
|
|
10
|
+
if vertex and hasattr(vertex, "incoming_edges") and vertex.incoming_edges:
|
|
11
|
+
source_id = vertex.incoming_edges[0].source_id
|
|
12
|
+
source_vertex = self.graph.get_vertex(source_id)
|
|
13
|
+
component = source_vertex.custom_component
|
|
14
|
+
source = component.display_name
|
|
15
|
+
icon = component.icon
|
|
16
|
+
possible_attributes = ["model_name", "model_id", "model"]
|
|
17
|
+
for attribute in possible_attributes:
|
|
18
|
+
if hasattr(component, attribute) and getattr(component, attribute):
|
|
19
|
+
return getattr(component, attribute), icon, source, component.get_id()
|
|
20
|
+
return source, icon, component.display_name, component.get_id()
|
|
21
|
+
return None, None, None, None
|
lfx/base/io/text.py
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
from lfx.custom.custom_component.component import Component
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class TextComponent(Component):
|
|
5
|
+
display_name = "Text Component"
|
|
6
|
+
description = "Used to pass text to the next component."
|
|
7
|
+
|
|
8
|
+
def build_config(self):
|
|
9
|
+
return {
|
|
10
|
+
"input_value": {
|
|
11
|
+
"display_name": "Value",
|
|
12
|
+
"input_types": ["Message", "Data"],
|
|
13
|
+
"info": "Text or Data to be passed.",
|
|
14
|
+
},
|
|
15
|
+
"data_template": {
|
|
16
|
+
"display_name": "Data Template",
|
|
17
|
+
"multiline": True,
|
|
18
|
+
"info": "Template to convert Data to Text. "
|
|
19
|
+
"If left empty, it will be dynamically set to the Data's text key.",
|
|
20
|
+
"advanced": True,
|
|
21
|
+
},
|
|
22
|
+
}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import math
|
|
2
|
+
from collections import Counter
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
from uuid import UUID
|
|
5
|
+
|
|
6
|
+
from langflow.services.database.models.user.crud import get_user_by_id
|
|
7
|
+
from langflow.services.deps import session_scope
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def compute_tfidf(documents: list[str], query_terms: list[str]) -> list[float]:
|
|
11
|
+
"""Compute TF-IDF scores for query terms across a collection of documents.
|
|
12
|
+
|
|
13
|
+
Args:
|
|
14
|
+
documents: List of document strings
|
|
15
|
+
query_terms: List of query terms to score
|
|
16
|
+
|
|
17
|
+
Returns:
|
|
18
|
+
List of TF-IDF scores for each document
|
|
19
|
+
"""
|
|
20
|
+
# Tokenize documents (simple whitespace splitting)
|
|
21
|
+
tokenized_docs = [doc.lower().split() for doc in documents]
|
|
22
|
+
n_docs = len(documents)
|
|
23
|
+
|
|
24
|
+
# Calculate document frequency for each term
|
|
25
|
+
document_frequencies = {}
|
|
26
|
+
for term in query_terms:
|
|
27
|
+
document_frequencies[term] = sum(1 for doc in tokenized_docs if term.lower() in doc)
|
|
28
|
+
|
|
29
|
+
scores = []
|
|
30
|
+
|
|
31
|
+
for doc_tokens in tokenized_docs:
|
|
32
|
+
doc_score = 0.0
|
|
33
|
+
doc_length = len(doc_tokens)
|
|
34
|
+
term_counts = Counter(doc_tokens)
|
|
35
|
+
|
|
36
|
+
for term in query_terms:
|
|
37
|
+
term_lower = term.lower()
|
|
38
|
+
|
|
39
|
+
# Term frequency (TF)
|
|
40
|
+
tf = term_counts[term_lower] / doc_length if doc_length > 0 else 0
|
|
41
|
+
|
|
42
|
+
# Inverse document frequency (IDF)
|
|
43
|
+
idf = math.log(n_docs / document_frequencies[term]) if document_frequencies[term] > 0 else 0
|
|
44
|
+
|
|
45
|
+
# TF-IDF score
|
|
46
|
+
doc_score += tf * idf
|
|
47
|
+
|
|
48
|
+
scores.append(doc_score)
|
|
49
|
+
|
|
50
|
+
return scores
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def compute_bm25(documents: list[str], query_terms: list[str], k1: float = 1.2, b: float = 0.75) -> list[float]:
|
|
54
|
+
"""Compute BM25 scores for query terms across a collection of documents.
|
|
55
|
+
|
|
56
|
+
Args:
|
|
57
|
+
documents: List of document strings
|
|
58
|
+
query_terms: List of query terms to score
|
|
59
|
+
k1: Controls term frequency scaling (default: 1.2)
|
|
60
|
+
b: Controls document length normalization (default: 0.75)
|
|
61
|
+
|
|
62
|
+
Returns:
|
|
63
|
+
List of BM25 scores for each document
|
|
64
|
+
"""
|
|
65
|
+
# Tokenize documents
|
|
66
|
+
tokenized_docs = [doc.lower().split() for doc in documents]
|
|
67
|
+
n_docs = len(documents)
|
|
68
|
+
|
|
69
|
+
# Calculate average document length
|
|
70
|
+
avg_doc_length = sum(len(doc) for doc in tokenized_docs) / n_docs if n_docs > 0 else 0
|
|
71
|
+
|
|
72
|
+
# Handle edge case where all documents are empty
|
|
73
|
+
if avg_doc_length == 0:
|
|
74
|
+
return [0.0] * n_docs
|
|
75
|
+
|
|
76
|
+
# Calculate document frequency for each term
|
|
77
|
+
document_frequencies = {}
|
|
78
|
+
for term in query_terms:
|
|
79
|
+
document_frequencies[term] = sum(1 for doc in tokenized_docs if term.lower() in doc)
|
|
80
|
+
|
|
81
|
+
scores = []
|
|
82
|
+
|
|
83
|
+
for doc_tokens in tokenized_docs:
|
|
84
|
+
doc_score = 0.0
|
|
85
|
+
doc_length = len(doc_tokens)
|
|
86
|
+
term_counts = Counter(doc_tokens)
|
|
87
|
+
|
|
88
|
+
for term in query_terms:
|
|
89
|
+
term_lower = term.lower()
|
|
90
|
+
|
|
91
|
+
# Term frequency in document
|
|
92
|
+
tf = term_counts[term_lower]
|
|
93
|
+
|
|
94
|
+
# Inverse document frequency (IDF)
|
|
95
|
+
# Use standard BM25 IDF formula that ensures non-negative values
|
|
96
|
+
idf = math.log(n_docs / document_frequencies[term]) if document_frequencies[term] > 0 else 0
|
|
97
|
+
|
|
98
|
+
# BM25 score calculation
|
|
99
|
+
numerator = tf * (k1 + 1)
|
|
100
|
+
denominator = tf + k1 * (1 - b + b * (doc_length / avg_doc_length))
|
|
101
|
+
|
|
102
|
+
# Handle division by zero when tf=0 and k1=0
|
|
103
|
+
term_score = 0 if denominator == 0 else idf * (numerator / denominator)
|
|
104
|
+
|
|
105
|
+
doc_score += term_score
|
|
106
|
+
|
|
107
|
+
scores.append(doc_score)
|
|
108
|
+
|
|
109
|
+
return scores
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
async def get_knowledge_bases(kb_root: Path, user_id: UUID | str) -> list[str]:
|
|
113
|
+
"""Retrieve a list of available knowledge bases.
|
|
114
|
+
|
|
115
|
+
Returns:
|
|
116
|
+
A list of knowledge base names.
|
|
117
|
+
"""
|
|
118
|
+
if not kb_root.exists():
|
|
119
|
+
return []
|
|
120
|
+
|
|
121
|
+
# Get the current user
|
|
122
|
+
async with session_scope() as db:
|
|
123
|
+
if not user_id:
|
|
124
|
+
msg = "User ID is required for fetching knowledge bases."
|
|
125
|
+
raise ValueError(msg)
|
|
126
|
+
user_id = UUID(user_id) if isinstance(user_id, str) else user_id
|
|
127
|
+
current_user = await get_user_by_id(db, user_id)
|
|
128
|
+
if not current_user:
|
|
129
|
+
msg = f"User with ID {user_id} not found."
|
|
130
|
+
raise ValueError(msg)
|
|
131
|
+
kb_user = current_user.username
|
|
132
|
+
kb_path = kb_root / kb_user
|
|
133
|
+
|
|
134
|
+
if not kb_path.exists():
|
|
135
|
+
return []
|
|
136
|
+
|
|
137
|
+
return [str(d.name) for d in kb_path.iterdir() if not d.name.startswith(".") and d.is_dir()]
|
|
File without changes
|