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,100 @@
|
|
|
1
|
+
from langchain_openai import OpenAIEmbeddings
|
|
2
|
+
|
|
3
|
+
from lfx.base.embeddings.model import LCEmbeddingsModel
|
|
4
|
+
from lfx.base.models.openai_constants import OPENAI_EMBEDDING_MODEL_NAMES
|
|
5
|
+
from lfx.field_typing import Embeddings
|
|
6
|
+
from lfx.io import BoolInput, DictInput, DropdownInput, FloatInput, IntInput, MessageTextInput, SecretStrInput
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class OpenAIEmbeddingsComponent(LCEmbeddingsModel):
|
|
10
|
+
display_name = "OpenAI Embeddings"
|
|
11
|
+
description = "Generate embeddings using OpenAI models."
|
|
12
|
+
icon = "OpenAI"
|
|
13
|
+
name = "OpenAIEmbeddings"
|
|
14
|
+
|
|
15
|
+
inputs = [
|
|
16
|
+
DictInput(
|
|
17
|
+
name="default_headers",
|
|
18
|
+
display_name="Default Headers",
|
|
19
|
+
advanced=True,
|
|
20
|
+
info="Default headers to use for the API request.",
|
|
21
|
+
),
|
|
22
|
+
DictInput(
|
|
23
|
+
name="default_query",
|
|
24
|
+
display_name="Default Query",
|
|
25
|
+
advanced=True,
|
|
26
|
+
info="Default query parameters to use for the API request.",
|
|
27
|
+
),
|
|
28
|
+
IntInput(name="chunk_size", display_name="Chunk Size", advanced=True, value=1000),
|
|
29
|
+
MessageTextInput(name="client", display_name="Client", advanced=True),
|
|
30
|
+
MessageTextInput(name="deployment", display_name="Deployment", advanced=True),
|
|
31
|
+
IntInput(name="embedding_ctx_length", display_name="Embedding Context Length", advanced=True, value=1536),
|
|
32
|
+
IntInput(name="max_retries", display_name="Max Retries", value=3, advanced=True),
|
|
33
|
+
DropdownInput(
|
|
34
|
+
name="model",
|
|
35
|
+
display_name="Model",
|
|
36
|
+
advanced=False,
|
|
37
|
+
options=OPENAI_EMBEDDING_MODEL_NAMES,
|
|
38
|
+
value="text-embedding-3-small",
|
|
39
|
+
),
|
|
40
|
+
DictInput(name="model_kwargs", display_name="Model Kwargs", advanced=True),
|
|
41
|
+
SecretStrInput(name="openai_api_key", display_name="OpenAI API Key", value="OPENAI_API_KEY", required=True),
|
|
42
|
+
MessageTextInput(name="openai_api_base", display_name="OpenAI API Base", advanced=True),
|
|
43
|
+
MessageTextInput(name="openai_api_type", display_name="OpenAI API Type", advanced=True),
|
|
44
|
+
MessageTextInput(name="openai_api_version", display_name="OpenAI API Version", advanced=True),
|
|
45
|
+
MessageTextInput(
|
|
46
|
+
name="openai_organization",
|
|
47
|
+
display_name="OpenAI Organization",
|
|
48
|
+
advanced=True,
|
|
49
|
+
),
|
|
50
|
+
MessageTextInput(name="openai_proxy", display_name="OpenAI Proxy", advanced=True),
|
|
51
|
+
FloatInput(name="request_timeout", display_name="Request Timeout", advanced=True),
|
|
52
|
+
BoolInput(name="show_progress_bar", display_name="Show Progress Bar", advanced=True),
|
|
53
|
+
BoolInput(name="skip_empty", display_name="Skip Empty", advanced=True),
|
|
54
|
+
MessageTextInput(
|
|
55
|
+
name="tiktoken_model_name",
|
|
56
|
+
display_name="TikToken Model Name",
|
|
57
|
+
advanced=True,
|
|
58
|
+
),
|
|
59
|
+
BoolInput(
|
|
60
|
+
name="tiktoken_enable",
|
|
61
|
+
display_name="TikToken Enable",
|
|
62
|
+
advanced=True,
|
|
63
|
+
value=True,
|
|
64
|
+
info="If False, you must have transformers installed.",
|
|
65
|
+
),
|
|
66
|
+
IntInput(
|
|
67
|
+
name="dimensions",
|
|
68
|
+
display_name="Dimensions",
|
|
69
|
+
info="The number of dimensions the resulting output embeddings should have. "
|
|
70
|
+
"Only supported by certain models.",
|
|
71
|
+
advanced=True,
|
|
72
|
+
),
|
|
73
|
+
]
|
|
74
|
+
|
|
75
|
+
def build_embeddings(self) -> Embeddings:
|
|
76
|
+
return OpenAIEmbeddings(
|
|
77
|
+
client=self.client or None,
|
|
78
|
+
model=self.model,
|
|
79
|
+
dimensions=self.dimensions or None,
|
|
80
|
+
deployment=self.deployment or None,
|
|
81
|
+
api_version=self.openai_api_version or None,
|
|
82
|
+
base_url=self.openai_api_base or None,
|
|
83
|
+
openai_api_type=self.openai_api_type or None,
|
|
84
|
+
openai_proxy=self.openai_proxy or None,
|
|
85
|
+
embedding_ctx_length=self.embedding_ctx_length,
|
|
86
|
+
api_key=self.openai_api_key or None,
|
|
87
|
+
organization=self.openai_organization or None,
|
|
88
|
+
allowed_special="all",
|
|
89
|
+
disallowed_special="all",
|
|
90
|
+
chunk_size=self.chunk_size,
|
|
91
|
+
max_retries=self.max_retries,
|
|
92
|
+
timeout=self.request_timeout or None,
|
|
93
|
+
tiktoken_enabled=self.tiktoken_enable,
|
|
94
|
+
tiktoken_model_name=self.tiktoken_model_name or None,
|
|
95
|
+
show_progress_bar=self.show_progress_bar,
|
|
96
|
+
model_kwargs=self.model_kwargs,
|
|
97
|
+
skip_empty=self.skip_empty,
|
|
98
|
+
default_headers=self.default_headers or None,
|
|
99
|
+
default_query=self.default_query or None,
|
|
100
|
+
)
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
from typing import Any
|
|
2
|
+
|
|
3
|
+
from langchain_openai import ChatOpenAI
|
|
4
|
+
from pydantic.v1 import SecretStr
|
|
5
|
+
|
|
6
|
+
from lfx.base.models.model import LCModelComponent
|
|
7
|
+
from lfx.base.models.openai_constants import OPENAI_CHAT_MODEL_NAMES, OPENAI_REASONING_MODEL_NAMES
|
|
8
|
+
from lfx.field_typing import LanguageModel
|
|
9
|
+
from lfx.field_typing.range_spec import RangeSpec
|
|
10
|
+
from lfx.inputs.inputs import BoolInput, DictInput, DropdownInput, IntInput, SecretStrInput, SliderInput, StrInput
|
|
11
|
+
from lfx.log.logger import logger
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class OpenAIModelComponent(LCModelComponent):
|
|
15
|
+
display_name = "OpenAI"
|
|
16
|
+
description = "Generates text using OpenAI LLMs."
|
|
17
|
+
icon = "OpenAI"
|
|
18
|
+
name = "OpenAIModel"
|
|
19
|
+
|
|
20
|
+
inputs = [
|
|
21
|
+
*LCModelComponent.get_base_inputs(),
|
|
22
|
+
IntInput(
|
|
23
|
+
name="max_tokens",
|
|
24
|
+
display_name="Max Tokens",
|
|
25
|
+
advanced=True,
|
|
26
|
+
info="The maximum number of tokens to generate. Set to 0 for unlimited tokens.",
|
|
27
|
+
range_spec=RangeSpec(min=0, max=128000),
|
|
28
|
+
),
|
|
29
|
+
DictInput(
|
|
30
|
+
name="model_kwargs",
|
|
31
|
+
display_name="Model Kwargs",
|
|
32
|
+
advanced=True,
|
|
33
|
+
info="Additional keyword arguments to pass to the model.",
|
|
34
|
+
),
|
|
35
|
+
BoolInput(
|
|
36
|
+
name="json_mode",
|
|
37
|
+
display_name="JSON Mode",
|
|
38
|
+
advanced=True,
|
|
39
|
+
info="If True, it will output JSON regardless of passing a schema.",
|
|
40
|
+
),
|
|
41
|
+
DropdownInput(
|
|
42
|
+
name="model_name",
|
|
43
|
+
display_name="Model Name",
|
|
44
|
+
advanced=False,
|
|
45
|
+
options=OPENAI_CHAT_MODEL_NAMES + OPENAI_REASONING_MODEL_NAMES,
|
|
46
|
+
value=OPENAI_CHAT_MODEL_NAMES[0],
|
|
47
|
+
combobox=True,
|
|
48
|
+
real_time_refresh=True,
|
|
49
|
+
),
|
|
50
|
+
StrInput(
|
|
51
|
+
name="openai_api_base",
|
|
52
|
+
display_name="OpenAI API Base",
|
|
53
|
+
advanced=True,
|
|
54
|
+
info="The base URL of the OpenAI API. "
|
|
55
|
+
"Defaults to https://api.openai.com/v1. "
|
|
56
|
+
"You can change this to use other APIs like JinaChat, LocalAI and Prem.",
|
|
57
|
+
),
|
|
58
|
+
SecretStrInput(
|
|
59
|
+
name="api_key",
|
|
60
|
+
display_name="OpenAI API Key",
|
|
61
|
+
info="The OpenAI API Key to use for the OpenAI model.",
|
|
62
|
+
advanced=False,
|
|
63
|
+
value="OPENAI_API_KEY",
|
|
64
|
+
required=True,
|
|
65
|
+
),
|
|
66
|
+
SliderInput(
|
|
67
|
+
name="temperature",
|
|
68
|
+
display_name="Temperature",
|
|
69
|
+
value=0.1,
|
|
70
|
+
range_spec=RangeSpec(min=0, max=1, step=0.01),
|
|
71
|
+
show=True,
|
|
72
|
+
),
|
|
73
|
+
IntInput(
|
|
74
|
+
name="seed",
|
|
75
|
+
display_name="Seed",
|
|
76
|
+
info="The seed controls the reproducibility of the job.",
|
|
77
|
+
advanced=True,
|
|
78
|
+
value=1,
|
|
79
|
+
),
|
|
80
|
+
IntInput(
|
|
81
|
+
name="max_retries",
|
|
82
|
+
display_name="Max Retries",
|
|
83
|
+
info="The maximum number of retries to make when generating.",
|
|
84
|
+
advanced=True,
|
|
85
|
+
value=5,
|
|
86
|
+
),
|
|
87
|
+
IntInput(
|
|
88
|
+
name="timeout",
|
|
89
|
+
display_name="Timeout",
|
|
90
|
+
info="The timeout for requests to OpenAI completion API.",
|
|
91
|
+
advanced=True,
|
|
92
|
+
value=700,
|
|
93
|
+
),
|
|
94
|
+
]
|
|
95
|
+
|
|
96
|
+
def build_model(self) -> LanguageModel: # type: ignore[type-var]
|
|
97
|
+
logger.debug(f"Executing request with model: {self.model_name}")
|
|
98
|
+
# Handle api_key - it can be string or SecretStr
|
|
99
|
+
api_key_value = None
|
|
100
|
+
if self.api_key:
|
|
101
|
+
logger.debug(f"API key type: {type(self.api_key)}, value: {self.api_key!r}")
|
|
102
|
+
if isinstance(self.api_key, SecretStr):
|
|
103
|
+
api_key_value = self.api_key.get_secret_value()
|
|
104
|
+
else:
|
|
105
|
+
api_key_value = str(self.api_key)
|
|
106
|
+
logger.debug(f"Final api_key_value type: {type(api_key_value)}, value: {'***' if api_key_value else None}")
|
|
107
|
+
|
|
108
|
+
# Handle model_kwargs and ensure api_key doesn't conflict
|
|
109
|
+
model_kwargs = self.model_kwargs or {}
|
|
110
|
+
# Remove api_key from model_kwargs if it exists to prevent conflicts
|
|
111
|
+
if "api_key" in model_kwargs:
|
|
112
|
+
logger.warning("api_key found in model_kwargs, removing to prevent conflicts")
|
|
113
|
+
model_kwargs = dict(model_kwargs) # Make a copy
|
|
114
|
+
del model_kwargs["api_key"]
|
|
115
|
+
|
|
116
|
+
parameters = {
|
|
117
|
+
"api_key": api_key_value,
|
|
118
|
+
"model_name": self.model_name,
|
|
119
|
+
"max_tokens": self.max_tokens or None,
|
|
120
|
+
"model_kwargs": model_kwargs,
|
|
121
|
+
"base_url": self.openai_api_base or "https://api.openai.com/v1",
|
|
122
|
+
"max_retries": self.max_retries,
|
|
123
|
+
"timeout": self.timeout,
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
# TODO: Revisit if/once parameters are supported for reasoning models
|
|
127
|
+
unsupported_params_for_reasoning_models = ["temperature", "seed"]
|
|
128
|
+
|
|
129
|
+
if self.model_name not in OPENAI_REASONING_MODEL_NAMES:
|
|
130
|
+
parameters["temperature"] = self.temperature if self.temperature is not None else 0.1
|
|
131
|
+
parameters["seed"] = self.seed
|
|
132
|
+
else:
|
|
133
|
+
params_str = ", ".join(unsupported_params_for_reasoning_models)
|
|
134
|
+
logger.debug(f"{self.model_name} is a reasoning model, {params_str} are not configurable. Ignoring.")
|
|
135
|
+
|
|
136
|
+
# Ensure all parameter values are the correct types
|
|
137
|
+
if isinstance(parameters.get("api_key"), SecretStr):
|
|
138
|
+
parameters["api_key"] = parameters["api_key"].get_secret_value()
|
|
139
|
+
output = ChatOpenAI(**parameters)
|
|
140
|
+
if self.json_mode:
|
|
141
|
+
output = output.bind(response_format={"type": "json_object"})
|
|
142
|
+
|
|
143
|
+
return output
|
|
144
|
+
|
|
145
|
+
def _get_exception_message(self, e: Exception):
|
|
146
|
+
"""Get a message from an OpenAI exception.
|
|
147
|
+
|
|
148
|
+
Args:
|
|
149
|
+
e (Exception): The exception to get the message from.
|
|
150
|
+
|
|
151
|
+
Returns:
|
|
152
|
+
str: The message from the exception.
|
|
153
|
+
"""
|
|
154
|
+
try:
|
|
155
|
+
from openai import BadRequestError
|
|
156
|
+
except ImportError:
|
|
157
|
+
return None
|
|
158
|
+
if isinstance(e, BadRequestError):
|
|
159
|
+
message = e.body.get("message")
|
|
160
|
+
if message:
|
|
161
|
+
return message
|
|
162
|
+
return None
|
|
163
|
+
|
|
164
|
+
def update_build_config(self, build_config: dict, field_value: Any, field_name: str | None = None) -> dict:
|
|
165
|
+
if field_name in {"base_url", "model_name", "api_key"} and field_value in OPENAI_REASONING_MODEL_NAMES:
|
|
166
|
+
build_config["temperature"]["show"] = False
|
|
167
|
+
build_config["seed"]["show"] = False
|
|
168
|
+
# Hide system_message for o1 models - currently unsupported
|
|
169
|
+
if field_value.startswith("o1") and "system_message" in build_config:
|
|
170
|
+
build_config["system_message"]["show"] = False
|
|
171
|
+
if field_name in {"base_url", "model_name", "api_key"} and field_value in OPENAI_CHAT_MODEL_NAMES:
|
|
172
|
+
build_config["temperature"]["show"] = True
|
|
173
|
+
build_config["seed"]["show"] = True
|
|
174
|
+
if "system_message" in build_config:
|
|
175
|
+
build_config["system_message"]["show"] = True
|
|
176
|
+
return build_config
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import TYPE_CHECKING, Any
|
|
4
|
+
|
|
5
|
+
from lfx.components._importing import import_mod
|
|
6
|
+
|
|
7
|
+
if TYPE_CHECKING:
|
|
8
|
+
from lfx.components.openrouter.openrouter import OpenRouterComponent
|
|
9
|
+
|
|
10
|
+
_dynamic_imports = {
|
|
11
|
+
"OpenRouterComponent": "openrouter",
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
__all__ = ["OpenRouterComponent"]
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def __getattr__(attr_name: str) -> Any:
|
|
18
|
+
"""Lazily import openrouter components on attribute access."""
|
|
19
|
+
if attr_name not in _dynamic_imports:
|
|
20
|
+
msg = f"module '{__name__}' has no attribute '{attr_name}'"
|
|
21
|
+
raise AttributeError(msg)
|
|
22
|
+
try:
|
|
23
|
+
result = import_mod(attr_name, _dynamic_imports[attr_name], __spec__.parent)
|
|
24
|
+
except (ModuleNotFoundError, ImportError, AttributeError) as e:
|
|
25
|
+
msg = f"Could not import '{attr_name}' from '{__name__}': {e}"
|
|
26
|
+
raise AttributeError(msg) from e
|
|
27
|
+
globals()[attr_name] = result
|
|
28
|
+
return result
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def __dir__() -> list[str]:
|
|
32
|
+
return list(__all__)
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import httpx
|
|
2
|
+
from langchain_openai import ChatOpenAI
|
|
3
|
+
from pydantic.v1 import SecretStr
|
|
4
|
+
|
|
5
|
+
from lfx.base.models.model import LCModelComponent
|
|
6
|
+
from lfx.field_typing import LanguageModel
|
|
7
|
+
from lfx.field_typing.range_spec import RangeSpec
|
|
8
|
+
from lfx.inputs.inputs import DropdownInput, IntInput, SecretStrInput, SliderInput, StrInput
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class OpenRouterComponent(LCModelComponent):
|
|
12
|
+
"""OpenRouter API component for language models."""
|
|
13
|
+
|
|
14
|
+
display_name = "OpenRouter"
|
|
15
|
+
description = (
|
|
16
|
+
"OpenRouter provides unified access to multiple AI models from different providers through a single API."
|
|
17
|
+
)
|
|
18
|
+
icon = "OpenRouter"
|
|
19
|
+
|
|
20
|
+
inputs = [
|
|
21
|
+
*LCModelComponent.get_base_inputs(),
|
|
22
|
+
SecretStrInput(name="api_key", display_name="API Key", required=True),
|
|
23
|
+
DropdownInput(
|
|
24
|
+
name="model_name",
|
|
25
|
+
display_name="Model",
|
|
26
|
+
options=[],
|
|
27
|
+
value="",
|
|
28
|
+
refresh_button=True,
|
|
29
|
+
real_time_refresh=True,
|
|
30
|
+
required=True,
|
|
31
|
+
),
|
|
32
|
+
SliderInput(
|
|
33
|
+
name="temperature",
|
|
34
|
+
display_name="Temperature",
|
|
35
|
+
value=0.7,
|
|
36
|
+
range_spec=RangeSpec(min=0, max=2, step=0.01),
|
|
37
|
+
advanced=True,
|
|
38
|
+
),
|
|
39
|
+
IntInput(name="max_tokens", display_name="Max Tokens", advanced=True),
|
|
40
|
+
StrInput(name="site_url", display_name="Site URL", advanced=True),
|
|
41
|
+
StrInput(name="app_name", display_name="App Name", advanced=True),
|
|
42
|
+
]
|
|
43
|
+
|
|
44
|
+
def fetch_models(self) -> list[dict]:
|
|
45
|
+
"""Fetch available models from OpenRouter."""
|
|
46
|
+
try:
|
|
47
|
+
response = httpx.get("https://openrouter.ai/api/v1/models", timeout=10.0)
|
|
48
|
+
response.raise_for_status()
|
|
49
|
+
models = response.json().get("data", [])
|
|
50
|
+
return sorted(
|
|
51
|
+
[
|
|
52
|
+
{
|
|
53
|
+
"id": m["id"],
|
|
54
|
+
"name": m.get("name", m["id"]),
|
|
55
|
+
"context": m.get("context_length", 0),
|
|
56
|
+
}
|
|
57
|
+
for m in models
|
|
58
|
+
if m.get("id")
|
|
59
|
+
],
|
|
60
|
+
key=lambda x: x["name"],
|
|
61
|
+
)
|
|
62
|
+
except (httpx.RequestError, httpx.HTTPStatusError) as e:
|
|
63
|
+
self.log(f"Error fetching models: {e}")
|
|
64
|
+
return []
|
|
65
|
+
|
|
66
|
+
def update_build_config(self, build_config: dict, field_value: str, field_name: str | None = None) -> dict: # noqa: ARG002
|
|
67
|
+
"""Update model options."""
|
|
68
|
+
models = self.fetch_models()
|
|
69
|
+
if models:
|
|
70
|
+
build_config["model_name"]["options"] = [m["id"] for m in models]
|
|
71
|
+
build_config["model_name"]["tooltips"] = {m["id"]: f"{m['name']} ({m['context']:,} tokens)" for m in models}
|
|
72
|
+
else:
|
|
73
|
+
build_config["model_name"]["options"] = ["Failed to load models"]
|
|
74
|
+
build_config["model_name"]["value"] = "Failed to load models"
|
|
75
|
+
return build_config
|
|
76
|
+
|
|
77
|
+
def build_model(self) -> LanguageModel:
|
|
78
|
+
"""Build the OpenRouter model."""
|
|
79
|
+
if not self.api_key:
|
|
80
|
+
msg = "API key is required"
|
|
81
|
+
raise ValueError(msg)
|
|
82
|
+
if not self.model_name or self.model_name == "Loading...":
|
|
83
|
+
msg = "Please select a model"
|
|
84
|
+
raise ValueError(msg)
|
|
85
|
+
|
|
86
|
+
kwargs = {
|
|
87
|
+
"model": self.model_name,
|
|
88
|
+
"openai_api_key": SecretStr(self.api_key).get_secret_value(),
|
|
89
|
+
"openai_api_base": "https://openrouter.ai/api/v1",
|
|
90
|
+
"temperature": self.temperature if self.temperature is not None else 0.7,
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
if self.max_tokens:
|
|
94
|
+
kwargs["max_tokens"] = int(self.max_tokens)
|
|
95
|
+
|
|
96
|
+
headers = {}
|
|
97
|
+
if self.site_url:
|
|
98
|
+
headers["HTTP-Referer"] = self.site_url
|
|
99
|
+
if self.app_name:
|
|
100
|
+
headers["X-Title"] = self.app_name
|
|
101
|
+
if headers:
|
|
102
|
+
kwargs["default_headers"] = headers
|
|
103
|
+
|
|
104
|
+
return ChatOpenAI(**kwargs)
|
|
@@ -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 .perplexity import PerplexityComponent
|
|
9
|
+
|
|
10
|
+
_dynamic_imports = {
|
|
11
|
+
"PerplexityComponent": "perplexity",
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
__all__ = [
|
|
15
|
+
"PerplexityComponent",
|
|
16
|
+
]
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def __getattr__(attr_name: str) -> Any:
|
|
20
|
+
"""Lazily import perplexity 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,75 @@
|
|
|
1
|
+
from langchain_community.chat_models import ChatPerplexity
|
|
2
|
+
from pydantic.v1 import SecretStr
|
|
3
|
+
|
|
4
|
+
from lfx.base.models.model import LCModelComponent
|
|
5
|
+
from lfx.field_typing import LanguageModel
|
|
6
|
+
from lfx.field_typing.range_spec import RangeSpec
|
|
7
|
+
from lfx.io import DropdownInput, FloatInput, IntInput, SecretStrInput, SliderInput
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class PerplexityComponent(LCModelComponent):
|
|
11
|
+
display_name = "Perplexity"
|
|
12
|
+
description = "Generate text using Perplexity LLMs."
|
|
13
|
+
documentation = "https://python.langchain.com/v0.2/docs/integrations/chat/perplexity/"
|
|
14
|
+
icon = "Perplexity"
|
|
15
|
+
name = "PerplexityModel"
|
|
16
|
+
|
|
17
|
+
inputs = [
|
|
18
|
+
*LCModelComponent.get_base_inputs(),
|
|
19
|
+
DropdownInput(
|
|
20
|
+
name="model_name",
|
|
21
|
+
display_name="Model Name",
|
|
22
|
+
advanced=False,
|
|
23
|
+
options=[
|
|
24
|
+
"llama-3.1-sonar-small-128k-online",
|
|
25
|
+
"llama-3.1-sonar-large-128k-online",
|
|
26
|
+
"llama-3.1-sonar-huge-128k-online",
|
|
27
|
+
"llama-3.1-sonar-small-128k-chat",
|
|
28
|
+
"llama-3.1-sonar-large-128k-chat",
|
|
29
|
+
"llama-3.1-8b-instruct",
|
|
30
|
+
"llama-3.1-70b-instruct",
|
|
31
|
+
],
|
|
32
|
+
value="llama-3.1-sonar-small-128k-online",
|
|
33
|
+
),
|
|
34
|
+
IntInput(name="max_tokens", display_name="Max Output Tokens", info="The maximum number of tokens to generate."),
|
|
35
|
+
SecretStrInput(
|
|
36
|
+
name="api_key",
|
|
37
|
+
display_name="Perplexity API Key",
|
|
38
|
+
info="The Perplexity API Key to use for the Perplexity model.",
|
|
39
|
+
advanced=False,
|
|
40
|
+
required=True,
|
|
41
|
+
),
|
|
42
|
+
SliderInput(
|
|
43
|
+
name="temperature", display_name="Temperature", value=0.75, range_spec=RangeSpec(min=0, max=2, step=0.05)
|
|
44
|
+
),
|
|
45
|
+
FloatInput(
|
|
46
|
+
name="top_p",
|
|
47
|
+
display_name="Top P",
|
|
48
|
+
info="The maximum cumulative probability of tokens to consider when sampling.",
|
|
49
|
+
advanced=True,
|
|
50
|
+
),
|
|
51
|
+
IntInput(
|
|
52
|
+
name="n",
|
|
53
|
+
display_name="N",
|
|
54
|
+
info="Number of chat completions to generate for each prompt. "
|
|
55
|
+
"Note that the API may not return the full n completions if duplicates are generated.",
|
|
56
|
+
advanced=True,
|
|
57
|
+
),
|
|
58
|
+
]
|
|
59
|
+
|
|
60
|
+
def build_model(self) -> LanguageModel: # type: ignore[type-var]
|
|
61
|
+
api_key = SecretStr(self.api_key).get_secret_value()
|
|
62
|
+
temperature = self.temperature
|
|
63
|
+
model = self.model_name
|
|
64
|
+
max_tokens = self.max_tokens
|
|
65
|
+
top_p = self.top_p
|
|
66
|
+
n = self.n
|
|
67
|
+
|
|
68
|
+
return ChatPerplexity(
|
|
69
|
+
model=model,
|
|
70
|
+
temperature=temperature or 0.75,
|
|
71
|
+
pplx_api_key=api_key,
|
|
72
|
+
top_p=top_p or None,
|
|
73
|
+
n=n or 1,
|
|
74
|
+
max_tokens=max_tokens,
|
|
75
|
+
)
|
|
@@ -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 .pgvector import PGVectorStoreComponent
|
|
9
|
+
|
|
10
|
+
_dynamic_imports = {
|
|
11
|
+
"PGVectorStoreComponent": "pgvector",
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
__all__ = [
|
|
15
|
+
"PGVectorStoreComponent",
|
|
16
|
+
]
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def __getattr__(attr_name: str) -> Any:
|
|
20
|
+
"""Lazily import pgvector 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,72 @@
|
|
|
1
|
+
from langchain_community.vectorstores import PGVector
|
|
2
|
+
|
|
3
|
+
from lfx.base.vectorstores.model import LCVectorStoreComponent, check_cached_vector_store
|
|
4
|
+
from lfx.helpers.data import docs_to_data
|
|
5
|
+
from lfx.io import HandleInput, IntInput, SecretStrInput, StrInput
|
|
6
|
+
from lfx.schema.data import Data
|
|
7
|
+
from lfx.utils.connection_string_parser import transform_connection_string
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class PGVectorStoreComponent(LCVectorStoreComponent):
|
|
11
|
+
display_name = "PGVector"
|
|
12
|
+
description = "PGVector Vector Store with search capabilities"
|
|
13
|
+
name = "pgvector"
|
|
14
|
+
icon = "cpu"
|
|
15
|
+
|
|
16
|
+
inputs = [
|
|
17
|
+
SecretStrInput(name="pg_server_url", display_name="PostgreSQL Server Connection String", required=True),
|
|
18
|
+
StrInput(name="collection_name", display_name="Table", required=True),
|
|
19
|
+
*LCVectorStoreComponent.inputs,
|
|
20
|
+
HandleInput(name="embedding", display_name="Embedding", input_types=["Embeddings"], required=True),
|
|
21
|
+
IntInput(
|
|
22
|
+
name="number_of_results",
|
|
23
|
+
display_name="Number of Results",
|
|
24
|
+
info="Number of results to return.",
|
|
25
|
+
value=4,
|
|
26
|
+
advanced=True,
|
|
27
|
+
),
|
|
28
|
+
]
|
|
29
|
+
|
|
30
|
+
@check_cached_vector_store
|
|
31
|
+
def build_vector_store(self) -> PGVector:
|
|
32
|
+
# Convert DataFrame to Data if needed using parent's method
|
|
33
|
+
self.ingest_data = self._prepare_ingest_data()
|
|
34
|
+
|
|
35
|
+
documents = []
|
|
36
|
+
for _input in self.ingest_data or []:
|
|
37
|
+
if isinstance(_input, Data):
|
|
38
|
+
documents.append(_input.to_lc_document())
|
|
39
|
+
else:
|
|
40
|
+
documents.append(_input)
|
|
41
|
+
|
|
42
|
+
connection_string_parsed = transform_connection_string(self.pg_server_url)
|
|
43
|
+
|
|
44
|
+
if documents:
|
|
45
|
+
pgvector = PGVector.from_documents(
|
|
46
|
+
embedding=self.embedding,
|
|
47
|
+
documents=documents,
|
|
48
|
+
collection_name=self.collection_name,
|
|
49
|
+
connection_string=connection_string_parsed,
|
|
50
|
+
)
|
|
51
|
+
else:
|
|
52
|
+
pgvector = PGVector.from_existing_index(
|
|
53
|
+
embedding=self.embedding,
|
|
54
|
+
collection_name=self.collection_name,
|
|
55
|
+
connection_string=connection_string_parsed,
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
return pgvector
|
|
59
|
+
|
|
60
|
+
def search_documents(self) -> list[Data]:
|
|
61
|
+
vector_store = self.build_vector_store()
|
|
62
|
+
|
|
63
|
+
if self.search_query and isinstance(self.search_query, str) and self.search_query.strip():
|
|
64
|
+
docs = vector_store.similarity_search(
|
|
65
|
+
query=self.search_query,
|
|
66
|
+
k=self.number_of_results,
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
data = docs_to_data(docs)
|
|
70
|
+
self.status = data
|
|
71
|
+
return data
|
|
72
|
+
return []
|
|
@@ -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 .pinecone import PineconeVectorStoreComponent
|
|
9
|
+
|
|
10
|
+
_dynamic_imports = {
|
|
11
|
+
"PineconeVectorStoreComponent": "pinecone",
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
__all__ = [
|
|
15
|
+
"PineconeVectorStoreComponent",
|
|
16
|
+
]
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def __getattr__(attr_name: str) -> Any:
|
|
20
|
+
"""Lazily import Pinecone 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__)
|