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,67 @@
|
|
|
1
|
+
from lfx.base.models.model import LCModelComponent
|
|
2
|
+
from lfx.field_typing import Embeddings
|
|
3
|
+
from lfx.io import BoolInput, FileInput, FloatInput, IntInput, MessageTextInput, Output
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class VertexAIEmbeddingsComponent(LCModelComponent):
|
|
7
|
+
display_name = "Vertex AI Embeddings"
|
|
8
|
+
description = "Generate embeddings using Google Cloud Vertex AI models."
|
|
9
|
+
icon = "VertexAI"
|
|
10
|
+
name = "VertexAIEmbeddings"
|
|
11
|
+
|
|
12
|
+
inputs = [
|
|
13
|
+
FileInput(
|
|
14
|
+
name="credentials",
|
|
15
|
+
display_name="Credentials",
|
|
16
|
+
info="JSON credentials file. Leave empty to fallback to environment variables",
|
|
17
|
+
value="",
|
|
18
|
+
file_types=["json"],
|
|
19
|
+
required=True,
|
|
20
|
+
),
|
|
21
|
+
MessageTextInput(name="location", display_name="Location", value="us-central1", advanced=True),
|
|
22
|
+
MessageTextInput(name="project", display_name="Project", info="The project ID.", advanced=True),
|
|
23
|
+
IntInput(name="max_output_tokens", display_name="Max Output Tokens", advanced=True),
|
|
24
|
+
IntInput(name="max_retries", display_name="Max Retries", value=1, advanced=True),
|
|
25
|
+
MessageTextInput(name="model_name", display_name="Model Name", value="textembedding-gecko", required=True),
|
|
26
|
+
IntInput(name="n", display_name="N", value=1, advanced=True),
|
|
27
|
+
IntInput(name="request_parallelism", value=5, display_name="Request Parallelism", advanced=True),
|
|
28
|
+
MessageTextInput(name="stop_sequences", display_name="Stop", advanced=True, is_list=True),
|
|
29
|
+
BoolInput(name="streaming", display_name="Streaming", value=False, advanced=True),
|
|
30
|
+
FloatInput(name="temperature", value=0.0, display_name="Temperature"),
|
|
31
|
+
IntInput(name="top_k", display_name="Top K", advanced=True),
|
|
32
|
+
FloatInput(name="top_p", display_name="Top P", value=0.95, advanced=True),
|
|
33
|
+
]
|
|
34
|
+
|
|
35
|
+
outputs = [
|
|
36
|
+
Output(display_name="Embeddings", name="embeddings", method="build_embeddings"),
|
|
37
|
+
]
|
|
38
|
+
|
|
39
|
+
def build_embeddings(self) -> Embeddings:
|
|
40
|
+
try:
|
|
41
|
+
from langchain_google_vertexai import VertexAIEmbeddings
|
|
42
|
+
except ImportError as e:
|
|
43
|
+
msg = "Please install the langchain-google-vertexai package to use the VertexAIEmbeddings component."
|
|
44
|
+
raise ImportError(msg) from e
|
|
45
|
+
|
|
46
|
+
from google.oauth2 import service_account
|
|
47
|
+
|
|
48
|
+
if self.credentials:
|
|
49
|
+
gcloud_credentials = service_account.Credentials.from_service_account_file(self.credentials)
|
|
50
|
+
else:
|
|
51
|
+
# will fallback to environment variable or inferred from gcloud CLI
|
|
52
|
+
gcloud_credentials = None
|
|
53
|
+
return VertexAIEmbeddings(
|
|
54
|
+
credentials=gcloud_credentials,
|
|
55
|
+
location=self.location,
|
|
56
|
+
max_output_tokens=self.max_output_tokens or None,
|
|
57
|
+
max_retries=self.max_retries,
|
|
58
|
+
model_name=self.model_name,
|
|
59
|
+
n=self.n,
|
|
60
|
+
project=self.project,
|
|
61
|
+
request_parallelism=self.request_parallelism,
|
|
62
|
+
stop=self.stop_sequences or None,
|
|
63
|
+
streaming=self.streaming,
|
|
64
|
+
temperature=self.temperature,
|
|
65
|
+
top_k=self.top_k or None,
|
|
66
|
+
top_p=self.top_p,
|
|
67
|
+
)
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import TYPE_CHECKING, Any
|
|
4
|
+
|
|
5
|
+
from langflow.components._importing import import_mod
|
|
6
|
+
|
|
7
|
+
if TYPE_CHECKING:
|
|
8
|
+
from .vlmrun_transcription import VLMRunTranscription
|
|
9
|
+
|
|
10
|
+
_dynamic_imports = {
|
|
11
|
+
"VLMRunTranscription": "vlmrun_transcription",
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
__all__ = [
|
|
15
|
+
"VLMRunTranscription",
|
|
16
|
+
]
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def __getattr__(attr_name: str) -> Any:
|
|
20
|
+
"""Lazily import VLMRun 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,224 @@
|
|
|
1
|
+
from pathlib import Path
|
|
2
|
+
from urllib.parse import urlparse
|
|
3
|
+
|
|
4
|
+
from langflow.custom.custom_component.component import Component
|
|
5
|
+
from langflow.io import (
|
|
6
|
+
DropdownInput,
|
|
7
|
+
FileInput,
|
|
8
|
+
IntInput,
|
|
9
|
+
MessageTextInput,
|
|
10
|
+
Output,
|
|
11
|
+
SecretStrInput,
|
|
12
|
+
)
|
|
13
|
+
from langflow.schema.data import Data
|
|
14
|
+
from loguru import logger
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class VLMRunTranscription(Component):
|
|
18
|
+
display_name = "VLM Run Transcription"
|
|
19
|
+
description = "Extract structured data from audio and video using [VLM Run AI](https://app.vlm.run)"
|
|
20
|
+
documentation = "https://docs.vlm.run"
|
|
21
|
+
icon = "VLMRun"
|
|
22
|
+
beta = True
|
|
23
|
+
|
|
24
|
+
inputs = [
|
|
25
|
+
SecretStrInput(
|
|
26
|
+
name="api_key",
|
|
27
|
+
display_name="VLM Run API Key",
|
|
28
|
+
info="Get your API key from https://app.vlm.run",
|
|
29
|
+
required=True,
|
|
30
|
+
),
|
|
31
|
+
DropdownInput(
|
|
32
|
+
name="media_type",
|
|
33
|
+
display_name="Media Type",
|
|
34
|
+
options=["audio", "video"],
|
|
35
|
+
value="audio",
|
|
36
|
+
info="Select the type of media to process",
|
|
37
|
+
),
|
|
38
|
+
FileInput(
|
|
39
|
+
name="media_files",
|
|
40
|
+
display_name="Media Files",
|
|
41
|
+
file_types=[
|
|
42
|
+
"mp3",
|
|
43
|
+
"wav",
|
|
44
|
+
"m4a",
|
|
45
|
+
"flac",
|
|
46
|
+
"ogg",
|
|
47
|
+
"opus",
|
|
48
|
+
"webm",
|
|
49
|
+
"aac",
|
|
50
|
+
"mp4",
|
|
51
|
+
"mov",
|
|
52
|
+
"avi",
|
|
53
|
+
"mkv",
|
|
54
|
+
"flv",
|
|
55
|
+
"wmv",
|
|
56
|
+
"m4v",
|
|
57
|
+
],
|
|
58
|
+
info="Upload one or more audio/video files",
|
|
59
|
+
required=False,
|
|
60
|
+
is_list=True,
|
|
61
|
+
),
|
|
62
|
+
MessageTextInput(
|
|
63
|
+
name="media_url",
|
|
64
|
+
display_name="Media URL",
|
|
65
|
+
info="URL to media file (alternative to file upload)",
|
|
66
|
+
required=False,
|
|
67
|
+
advanced=True,
|
|
68
|
+
),
|
|
69
|
+
IntInput(
|
|
70
|
+
name="timeout_seconds",
|
|
71
|
+
display_name="Timeout (seconds)",
|
|
72
|
+
value=600,
|
|
73
|
+
info="Maximum time to wait for processing completion",
|
|
74
|
+
advanced=True,
|
|
75
|
+
),
|
|
76
|
+
DropdownInput(
|
|
77
|
+
name="domain",
|
|
78
|
+
display_name="Processing Domain",
|
|
79
|
+
options=["transcription"],
|
|
80
|
+
value="transcription",
|
|
81
|
+
info="Select the processing domain",
|
|
82
|
+
advanced=True,
|
|
83
|
+
),
|
|
84
|
+
]
|
|
85
|
+
|
|
86
|
+
outputs = [
|
|
87
|
+
Output(
|
|
88
|
+
display_name="Result",
|
|
89
|
+
name="result",
|
|
90
|
+
method="process_media",
|
|
91
|
+
),
|
|
92
|
+
]
|
|
93
|
+
|
|
94
|
+
def _check_inputs(self) -> str | None:
|
|
95
|
+
"""Validate that either media files or URL is provided."""
|
|
96
|
+
if not self.media_files and not self.media_url:
|
|
97
|
+
return "Either media files or media URL must be provided"
|
|
98
|
+
return None
|
|
99
|
+
|
|
100
|
+
def _import_vlmrun(self):
|
|
101
|
+
"""Import and return VLMRun client class."""
|
|
102
|
+
try:
|
|
103
|
+
from vlmrun.client import VLMRun
|
|
104
|
+
except ImportError as e:
|
|
105
|
+
error_msg = "VLM Run SDK not installed. Run: pip install 'vlmrun[all]'"
|
|
106
|
+
raise ImportError(error_msg) from e
|
|
107
|
+
else:
|
|
108
|
+
return VLMRun
|
|
109
|
+
|
|
110
|
+
def _generate_media_response(self, client, media_source):
|
|
111
|
+
"""Generate response for audio or video media."""
|
|
112
|
+
domain_str = f"{self.media_type}.{self.domain}"
|
|
113
|
+
|
|
114
|
+
if self.media_type == "audio":
|
|
115
|
+
if isinstance(media_source, Path):
|
|
116
|
+
return client.audio.generate(file=media_source, domain=domain_str, batch=True)
|
|
117
|
+
return client.audio.generate(url=media_source, domain=domain_str, batch=True)
|
|
118
|
+
# video
|
|
119
|
+
if isinstance(media_source, Path):
|
|
120
|
+
return client.video.generate(file=media_source, domain=domain_str, batch=True)
|
|
121
|
+
return client.video.generate(url=media_source, domain=domain_str, batch=True)
|
|
122
|
+
|
|
123
|
+
def _wait_for_response(self, client, response):
|
|
124
|
+
"""Wait for batch processing to complete if needed."""
|
|
125
|
+
if hasattr(response, "id"):
|
|
126
|
+
return client.predictions.wait(response.id, timeout=self.timeout_seconds)
|
|
127
|
+
return response
|
|
128
|
+
|
|
129
|
+
def _extract_transcription(self, segments: list) -> list[str]:
|
|
130
|
+
"""Extract transcription parts from segments."""
|
|
131
|
+
transcription_parts = []
|
|
132
|
+
for segment in segments:
|
|
133
|
+
if self.media_type == "audio" and "audio" in segment:
|
|
134
|
+
transcription_parts.append(segment["audio"].get("content", ""))
|
|
135
|
+
elif self.media_type == "video" and "video" in segment:
|
|
136
|
+
transcription_parts.append(segment["video"].get("content", ""))
|
|
137
|
+
# Also include audio if available for video
|
|
138
|
+
if "audio" in segment:
|
|
139
|
+
audio_content = segment["audio"].get("content", "")
|
|
140
|
+
if audio_content and audio_content.strip():
|
|
141
|
+
transcription_parts.append(f"[Audio: {audio_content}]")
|
|
142
|
+
return transcription_parts
|
|
143
|
+
|
|
144
|
+
def _create_result_dict(self, response, transcription_parts: list, source_name: str) -> dict:
|
|
145
|
+
"""Create a standardized result dictionary."""
|
|
146
|
+
response_data = response.response if hasattr(response, "response") else {}
|
|
147
|
+
result = {
|
|
148
|
+
"prediction_id": response.id if hasattr(response, "id") else None,
|
|
149
|
+
"transcription": " ".join(transcription_parts),
|
|
150
|
+
"full_response": response_data,
|
|
151
|
+
"metadata": {
|
|
152
|
+
"media_type": self.media_type,
|
|
153
|
+
"duration": response_data.get("metadata", {}).get("duration", 0),
|
|
154
|
+
},
|
|
155
|
+
"usage": response.usage if hasattr(response, "usage") else None,
|
|
156
|
+
"status": response.status if hasattr(response, "status") else "completed",
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
# Add source-specific field
|
|
160
|
+
parsed_url = urlparse(source_name)
|
|
161
|
+
if parsed_url.scheme in ["http", "https", "s3", "gs", "ftp", "ftps"]:
|
|
162
|
+
result["source"] = source_name
|
|
163
|
+
else:
|
|
164
|
+
result["filename"] = source_name
|
|
165
|
+
|
|
166
|
+
return result
|
|
167
|
+
|
|
168
|
+
def _process_single_media(self, client, media_source, source_name: str) -> dict:
|
|
169
|
+
"""Process a single media file or URL."""
|
|
170
|
+
response = self._generate_media_response(client, media_source)
|
|
171
|
+
response = self._wait_for_response(client, response)
|
|
172
|
+
response_data = response.response if hasattr(response, "response") else {}
|
|
173
|
+
segments = response_data.get("segments", [])
|
|
174
|
+
transcription_parts = self._extract_transcription(segments)
|
|
175
|
+
return self._create_result_dict(response, transcription_parts, source_name)
|
|
176
|
+
|
|
177
|
+
def process_media(self) -> Data:
|
|
178
|
+
"""Process audio or video file and extract structured data."""
|
|
179
|
+
# Validate inputs
|
|
180
|
+
error_msg = self._check_inputs()
|
|
181
|
+
if error_msg:
|
|
182
|
+
self.status = error_msg
|
|
183
|
+
return Data(data={"error": error_msg})
|
|
184
|
+
|
|
185
|
+
try:
|
|
186
|
+
# Import and initialize client
|
|
187
|
+
vlmrun_class = self._import_vlmrun()
|
|
188
|
+
client = vlmrun_class(api_key=self.api_key)
|
|
189
|
+
all_results = []
|
|
190
|
+
|
|
191
|
+
# Handle multiple files
|
|
192
|
+
if self.media_files:
|
|
193
|
+
files_to_process = self.media_files if isinstance(self.media_files, list) else [self.media_files]
|
|
194
|
+
for idx, media_file in enumerate(files_to_process):
|
|
195
|
+
self.status = f"Processing file {idx + 1} of {len(files_to_process)}..."
|
|
196
|
+
result = self._process_single_media(client, Path(media_file), Path(media_file).name)
|
|
197
|
+
all_results.append(result)
|
|
198
|
+
|
|
199
|
+
# Handle URL
|
|
200
|
+
elif self.media_url:
|
|
201
|
+
result = self._process_single_media(client, self.media_url, self.media_url)
|
|
202
|
+
all_results.append(result)
|
|
203
|
+
|
|
204
|
+
# Return clean, flexible output structure
|
|
205
|
+
output_data = {
|
|
206
|
+
"results": all_results,
|
|
207
|
+
"total_files": len(all_results),
|
|
208
|
+
}
|
|
209
|
+
self.status = f"Successfully processed {len(all_results)} file(s)"
|
|
210
|
+
return Data(data=output_data)
|
|
211
|
+
|
|
212
|
+
except ImportError as e:
|
|
213
|
+
self.status = str(e)
|
|
214
|
+
return Data(data={"error": str(e)})
|
|
215
|
+
except (ValueError, ConnectionError, TimeoutError) as e:
|
|
216
|
+
logger.opt(exception=True).debug("Error processing media with VLM Run")
|
|
217
|
+
error_msg = f"Processing failed: {e!s}"
|
|
218
|
+
self.status = error_msg
|
|
219
|
+
return Data(data={"error": error_msg})
|
|
220
|
+
except (AttributeError, KeyError, OSError) as e:
|
|
221
|
+
logger.opt(exception=True).debug("Unexpected error processing media with VLM Run")
|
|
222
|
+
error_msg = f"Unexpected error: {e!s}"
|
|
223
|
+
self.status = error_msg
|
|
224
|
+
return Data(data={"error": error_msg})
|
|
@@ -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 .weaviate import WeaviateVectorStoreComponent
|
|
9
|
+
|
|
10
|
+
_dynamic_imports = {
|
|
11
|
+
"WeaviateVectorStoreComponent": "weaviate",
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
__all__ = [
|
|
15
|
+
"WeaviateVectorStoreComponent",
|
|
16
|
+
]
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def __getattr__(attr_name: str) -> Any:
|
|
20
|
+
"""Lazily import Weaviate 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,89 @@
|
|
|
1
|
+
import weaviate
|
|
2
|
+
from langchain_community.vectorstores import Weaviate
|
|
3
|
+
|
|
4
|
+
from lfx.base.vectorstores.model import LCVectorStoreComponent, check_cached_vector_store
|
|
5
|
+
from lfx.helpers.data import docs_to_data
|
|
6
|
+
from lfx.io import BoolInput, HandleInput, IntInput, SecretStrInput, StrInput
|
|
7
|
+
from lfx.schema.data import Data
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class WeaviateVectorStoreComponent(LCVectorStoreComponent):
|
|
11
|
+
display_name = "Weaviate"
|
|
12
|
+
description = "Weaviate Vector Store with search capabilities"
|
|
13
|
+
name = "Weaviate"
|
|
14
|
+
icon = "Weaviate"
|
|
15
|
+
|
|
16
|
+
inputs = [
|
|
17
|
+
StrInput(name="url", display_name="Weaviate URL", value="http://localhost:8080", required=True),
|
|
18
|
+
SecretStrInput(name="api_key", display_name="API Key", required=False),
|
|
19
|
+
StrInput(
|
|
20
|
+
name="index_name",
|
|
21
|
+
display_name="Index Name",
|
|
22
|
+
required=True,
|
|
23
|
+
info="Requires capitalized index name.",
|
|
24
|
+
),
|
|
25
|
+
StrInput(name="text_key", display_name="Text Key", value="text", advanced=True),
|
|
26
|
+
*LCVectorStoreComponent.inputs,
|
|
27
|
+
HandleInput(name="embedding", display_name="Embedding", input_types=["Embeddings"]),
|
|
28
|
+
IntInput(
|
|
29
|
+
name="number_of_results",
|
|
30
|
+
display_name="Number of Results",
|
|
31
|
+
info="Number of results to return.",
|
|
32
|
+
value=4,
|
|
33
|
+
advanced=True,
|
|
34
|
+
),
|
|
35
|
+
BoolInput(name="search_by_text", display_name="Search By Text", advanced=True),
|
|
36
|
+
]
|
|
37
|
+
|
|
38
|
+
@check_cached_vector_store
|
|
39
|
+
def build_vector_store(self) -> Weaviate:
|
|
40
|
+
if self.api_key:
|
|
41
|
+
auth_config = weaviate.AuthApiKey(api_key=self.api_key)
|
|
42
|
+
client = weaviate.Client(url=self.url, auth_client_secret=auth_config)
|
|
43
|
+
else:
|
|
44
|
+
client = weaviate.Client(url=self.url)
|
|
45
|
+
|
|
46
|
+
if self.index_name != self.index_name.capitalize():
|
|
47
|
+
msg = f"Weaviate requires the index name to be capitalized. Use: {self.index_name.capitalize()}"
|
|
48
|
+
raise ValueError(msg)
|
|
49
|
+
|
|
50
|
+
# Convert DataFrame to Data if needed using parent's method
|
|
51
|
+
self.ingest_data = self._prepare_ingest_data()
|
|
52
|
+
|
|
53
|
+
documents = []
|
|
54
|
+
for _input in self.ingest_data or []:
|
|
55
|
+
if isinstance(_input, Data):
|
|
56
|
+
documents.append(_input.to_lc_document())
|
|
57
|
+
else:
|
|
58
|
+
documents.append(_input)
|
|
59
|
+
|
|
60
|
+
if documents and self.embedding:
|
|
61
|
+
return Weaviate.from_documents(
|
|
62
|
+
client=client,
|
|
63
|
+
index_name=self.index_name,
|
|
64
|
+
documents=documents,
|
|
65
|
+
embedding=self.embedding,
|
|
66
|
+
by_text=self.search_by_text,
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
return Weaviate(
|
|
70
|
+
client=client,
|
|
71
|
+
index_name=self.index_name,
|
|
72
|
+
text_key=self.text_key,
|
|
73
|
+
embedding=self.embedding,
|
|
74
|
+
by_text=self.search_by_text,
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
def search_documents(self) -> list[Data]:
|
|
78
|
+
vector_store = self.build_vector_store()
|
|
79
|
+
|
|
80
|
+
if self.search_query and isinstance(self.search_query, str) and self.search_query.strip():
|
|
81
|
+
docs = vector_store.similarity_search(
|
|
82
|
+
query=self.search_query,
|
|
83
|
+
k=self.number_of_results,
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
data = docs_to_data(docs)
|
|
87
|
+
self.status = data
|
|
88
|
+
return data
|
|
89
|
+
return []
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import httpx
|
|
2
|
+
from httpx import HTTPError
|
|
3
|
+
from langchain_core.tools import ToolException
|
|
4
|
+
|
|
5
|
+
from lfx.custom.custom_component.component import Component
|
|
6
|
+
from lfx.inputs.inputs import MultilineInput
|
|
7
|
+
from lfx.schema.data import Data
|
|
8
|
+
from lfx.schema.dataframe import DataFrame
|
|
9
|
+
from lfx.template.field.base import Output
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class WikidataComponent(Component):
|
|
13
|
+
display_name = "Wikidata"
|
|
14
|
+
description = "Performs a search using the Wikidata API."
|
|
15
|
+
icon = "Wikipedia"
|
|
16
|
+
|
|
17
|
+
inputs = [
|
|
18
|
+
MultilineInput(
|
|
19
|
+
name="query",
|
|
20
|
+
display_name="Query",
|
|
21
|
+
info="The text query for similarity search on Wikidata.",
|
|
22
|
+
required=True,
|
|
23
|
+
tool_mode=True,
|
|
24
|
+
),
|
|
25
|
+
]
|
|
26
|
+
|
|
27
|
+
outputs = [
|
|
28
|
+
Output(display_name="DataFrame", name="dataframe", method="fetch_content_dataframe"),
|
|
29
|
+
]
|
|
30
|
+
|
|
31
|
+
def run_model(self) -> DataFrame:
|
|
32
|
+
return self.fetch_content_dataframe()
|
|
33
|
+
|
|
34
|
+
def fetch_content(self) -> list[Data]:
|
|
35
|
+
try:
|
|
36
|
+
# Define request parameters for Wikidata API
|
|
37
|
+
params = {
|
|
38
|
+
"action": "wbsearchentities",
|
|
39
|
+
"format": "json",
|
|
40
|
+
"search": self.query,
|
|
41
|
+
"language": "en",
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
# Send request to Wikidata API
|
|
45
|
+
wikidata_api_url = "https://www.wikidata.org/w/api.php"
|
|
46
|
+
response = httpx.get(wikidata_api_url, params=params)
|
|
47
|
+
response.raise_for_status()
|
|
48
|
+
response_json = response.json()
|
|
49
|
+
|
|
50
|
+
# Extract search results
|
|
51
|
+
results = response_json.get("search", [])
|
|
52
|
+
|
|
53
|
+
if not results:
|
|
54
|
+
return [Data(data={"error": "No search results found for the given query."})]
|
|
55
|
+
|
|
56
|
+
# Transform the API response into Data objects
|
|
57
|
+
data = [
|
|
58
|
+
Data(
|
|
59
|
+
text=f"{result['label']}: {result.get('description', '')}",
|
|
60
|
+
data={
|
|
61
|
+
"label": result["label"],
|
|
62
|
+
"id": result.get("id"),
|
|
63
|
+
"url": result.get("url"),
|
|
64
|
+
"description": result.get("description", ""),
|
|
65
|
+
"concepturi": result.get("concepturi"),
|
|
66
|
+
},
|
|
67
|
+
)
|
|
68
|
+
for result in results
|
|
69
|
+
]
|
|
70
|
+
|
|
71
|
+
self.status = data
|
|
72
|
+
except HTTPError as e:
|
|
73
|
+
error_message = f"HTTP Error in Wikidata Search API: {e!s}"
|
|
74
|
+
raise ToolException(error_message) from None
|
|
75
|
+
except KeyError as e:
|
|
76
|
+
error_message = f"Data parsing error in Wikidata API response: {e!s}"
|
|
77
|
+
raise ToolException(error_message) from None
|
|
78
|
+
except ValueError as e:
|
|
79
|
+
error_message = f"Value error in Wikidata API: {e!s}"
|
|
80
|
+
raise ToolException(error_message) from None
|
|
81
|
+
else:
|
|
82
|
+
return data
|
|
83
|
+
|
|
84
|
+
def fetch_content_dataframe(self) -> DataFrame:
|
|
85
|
+
data = self.fetch_content()
|
|
86
|
+
return DataFrame(data)
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
from langchain_community.utilities.wikipedia import WikipediaAPIWrapper
|
|
2
|
+
|
|
3
|
+
from lfx.custom.custom_component.component import Component
|
|
4
|
+
from lfx.inputs.inputs import BoolInput, IntInput, MessageTextInput, MultilineInput
|
|
5
|
+
from lfx.io import Output
|
|
6
|
+
from lfx.schema.data import Data
|
|
7
|
+
from lfx.schema.dataframe import DataFrame
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class WikipediaComponent(Component):
|
|
11
|
+
display_name = "Wikipedia"
|
|
12
|
+
description = "Call Wikipedia API."
|
|
13
|
+
icon = "Wikipedia"
|
|
14
|
+
|
|
15
|
+
inputs = [
|
|
16
|
+
MultilineInput(
|
|
17
|
+
name="input_value",
|
|
18
|
+
display_name="Input",
|
|
19
|
+
tool_mode=True,
|
|
20
|
+
),
|
|
21
|
+
MessageTextInput(name="lang", display_name="Language", value="en"),
|
|
22
|
+
IntInput(name="k", display_name="Number of results", value=4, required=True),
|
|
23
|
+
BoolInput(name="load_all_available_meta", display_name="Load all available meta", value=False, advanced=True),
|
|
24
|
+
IntInput(
|
|
25
|
+
name="doc_content_chars_max", display_name="Document content characters max", value=4000, advanced=True
|
|
26
|
+
),
|
|
27
|
+
]
|
|
28
|
+
|
|
29
|
+
outputs = [
|
|
30
|
+
Output(display_name="DataFrame", name="dataframe", method="fetch_content_dataframe"),
|
|
31
|
+
]
|
|
32
|
+
|
|
33
|
+
def run_model(self) -> DataFrame:
|
|
34
|
+
return self.fetch_content_dataframe()
|
|
35
|
+
|
|
36
|
+
def _build_wrapper(self) -> WikipediaAPIWrapper:
|
|
37
|
+
return WikipediaAPIWrapper(
|
|
38
|
+
top_k_results=self.k,
|
|
39
|
+
lang=self.lang,
|
|
40
|
+
load_all_available_meta=self.load_all_available_meta,
|
|
41
|
+
doc_content_chars_max=self.doc_content_chars_max,
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
def fetch_content(self) -> list[Data]:
|
|
45
|
+
wrapper = self._build_wrapper()
|
|
46
|
+
docs = wrapper.load(self.input_value)
|
|
47
|
+
data = [Data.from_document(doc) for doc in docs]
|
|
48
|
+
self.status = data
|
|
49
|
+
return data
|
|
50
|
+
|
|
51
|
+
def fetch_content_dataframe(self) -> DataFrame:
|
|
52
|
+
data = self.fetch_content()
|
|
53
|
+
return DataFrame(data)
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
from langchain_community.utilities.wolfram_alpha import WolframAlphaAPIWrapper
|
|
2
|
+
|
|
3
|
+
from lfx.base.langchain_utilities.model import LCToolComponent
|
|
4
|
+
from lfx.field_typing import Tool
|
|
5
|
+
from lfx.inputs.inputs import MultilineInput, SecretStrInput
|
|
6
|
+
from lfx.io import Output
|
|
7
|
+
from lfx.schema.data import Data
|
|
8
|
+
from lfx.schema.dataframe import DataFrame
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class WolframAlphaAPIComponent(LCToolComponent):
|
|
12
|
+
display_name = "WolframAlpha API"
|
|
13
|
+
description = """Enables queries to WolframAlpha for computational data, facts, and calculations across various \
|
|
14
|
+
topics, delivering structured responses."""
|
|
15
|
+
name = "WolframAlphaAPI"
|
|
16
|
+
|
|
17
|
+
outputs = [
|
|
18
|
+
Output(display_name="DataFrame", name="dataframe", method="fetch_content_dataframe"),
|
|
19
|
+
]
|
|
20
|
+
|
|
21
|
+
inputs = [
|
|
22
|
+
MultilineInput(
|
|
23
|
+
name="input_value", display_name="Input Query", info="Example query: 'What is the population of France?'"
|
|
24
|
+
),
|
|
25
|
+
SecretStrInput(name="app_id", display_name="WolframAlpha App ID", required=True),
|
|
26
|
+
]
|
|
27
|
+
|
|
28
|
+
icon = "WolframAlphaAPI"
|
|
29
|
+
|
|
30
|
+
def run_model(self) -> DataFrame:
|
|
31
|
+
return self.fetch_content_dataframe()
|
|
32
|
+
|
|
33
|
+
def build_tool(self) -> Tool:
|
|
34
|
+
wrapper = self._build_wrapper()
|
|
35
|
+
return Tool(name="wolfram_alpha_api", description="Answers mathematical questions.", func=wrapper.run)
|
|
36
|
+
|
|
37
|
+
def _build_wrapper(self) -> WolframAlphaAPIWrapper:
|
|
38
|
+
return WolframAlphaAPIWrapper(wolfram_alpha_appid=self.app_id)
|
|
39
|
+
|
|
40
|
+
def fetch_content(self) -> list[Data]:
|
|
41
|
+
wrapper = self._build_wrapper()
|
|
42
|
+
result_str = wrapper.run(self.input_value)
|
|
43
|
+
data = [Data(text=result_str)]
|
|
44
|
+
self.status = data
|
|
45
|
+
return data
|
|
46
|
+
|
|
47
|
+
def fetch_content_dataframe(self) -> DataFrame:
|
|
48
|
+
"""Convert the WolframAlpha results to a DataFrame.
|
|
49
|
+
|
|
50
|
+
Returns:
|
|
51
|
+
DataFrame: A DataFrame containing the query results.
|
|
52
|
+
"""
|
|
53
|
+
data = self.fetch_content()
|
|
54
|
+
return DataFrame(data)
|