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,345 @@
|
|
|
1
|
+
from enum import Enum
|
|
2
|
+
|
|
3
|
+
import httpx
|
|
4
|
+
from langchain.tools import StructuredTool
|
|
5
|
+
from langchain_core.tools import ToolException
|
|
6
|
+
from pydantic import BaseModel, Field
|
|
7
|
+
|
|
8
|
+
from lfx.base.langchain_utilities.model import LCToolComponent
|
|
9
|
+
from lfx.field_typing import Tool
|
|
10
|
+
from lfx.inputs.inputs import BoolInput, DropdownInput, IntInput, MessageTextInput, SecretStrInput
|
|
11
|
+
from lfx.log.logger import logger
|
|
12
|
+
from lfx.schema.data import Data
|
|
13
|
+
|
|
14
|
+
# Add at the top with other constants
|
|
15
|
+
MAX_CHUNKS_PER_SOURCE = 3
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class TavilySearchDepth(Enum):
|
|
19
|
+
BASIC = "basic"
|
|
20
|
+
ADVANCED = "advanced"
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class TavilySearchTopic(Enum):
|
|
24
|
+
GENERAL = "general"
|
|
25
|
+
NEWS = "news"
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class TavilySearchTimeRange(Enum):
|
|
29
|
+
DAY = "day"
|
|
30
|
+
WEEK = "week"
|
|
31
|
+
MONTH = "month"
|
|
32
|
+
YEAR = "year"
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class TavilySearchSchema(BaseModel):
|
|
36
|
+
query: str = Field(..., description="The search query you want to execute with Tavily.")
|
|
37
|
+
search_depth: TavilySearchDepth = Field(TavilySearchDepth.BASIC, description="The depth of the search.")
|
|
38
|
+
topic: TavilySearchTopic = Field(TavilySearchTopic.GENERAL, description="The category of the search.")
|
|
39
|
+
max_results: int = Field(5, description="The maximum number of search results to return.")
|
|
40
|
+
include_images: bool = Field(default=False, description="Include a list of query-related images in the response.")
|
|
41
|
+
include_answer: bool = Field(default=False, description="Include a short answer to original query.")
|
|
42
|
+
chunks_per_source: int = Field(
|
|
43
|
+
default=MAX_CHUNKS_PER_SOURCE,
|
|
44
|
+
description=(
|
|
45
|
+
"The number of content chunks to retrieve from each source (max 500 chars each). Only for advanced search."
|
|
46
|
+
),
|
|
47
|
+
ge=1,
|
|
48
|
+
le=MAX_CHUNKS_PER_SOURCE,
|
|
49
|
+
)
|
|
50
|
+
include_domains: list[str] = Field(
|
|
51
|
+
default=[],
|
|
52
|
+
description="A list of domains to specifically include in the search results.",
|
|
53
|
+
)
|
|
54
|
+
exclude_domains: list[str] = Field(
|
|
55
|
+
default=[],
|
|
56
|
+
description="A list of domains to specifically exclude from the search results.",
|
|
57
|
+
)
|
|
58
|
+
include_raw_content: bool = Field(
|
|
59
|
+
default=False,
|
|
60
|
+
description="Include the cleaned and parsed HTML content of each search result.",
|
|
61
|
+
)
|
|
62
|
+
days: int = Field(
|
|
63
|
+
default=7,
|
|
64
|
+
description="Number of days back from the current date to include. Only available if topic is news.",
|
|
65
|
+
ge=1,
|
|
66
|
+
)
|
|
67
|
+
time_range: TavilySearchTimeRange | None = Field(
|
|
68
|
+
default=None,
|
|
69
|
+
description="The time range back from the current date to filter results.",
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
class TavilySearchToolComponent(LCToolComponent):
|
|
74
|
+
display_name = "Tavily Search API"
|
|
75
|
+
description = """**Tavily Search API** is a search engine optimized for LLMs and RAG, \
|
|
76
|
+
aimed at efficient, quick, and persistent search results. It can be used independently or as an agent tool.
|
|
77
|
+
|
|
78
|
+
Note: Check 'Advanced' for all options.
|
|
79
|
+
"""
|
|
80
|
+
icon = "TavilyIcon"
|
|
81
|
+
name = "TavilyAISearch"
|
|
82
|
+
documentation = "https://docs.tavily.com/"
|
|
83
|
+
legacy = True
|
|
84
|
+
replacement = ["tavily.TavilySearchComponent"]
|
|
85
|
+
|
|
86
|
+
inputs = [
|
|
87
|
+
SecretStrInput(
|
|
88
|
+
name="api_key",
|
|
89
|
+
display_name="Tavily API Key",
|
|
90
|
+
required=True,
|
|
91
|
+
info="Your Tavily API Key.",
|
|
92
|
+
),
|
|
93
|
+
MessageTextInput(
|
|
94
|
+
name="query",
|
|
95
|
+
display_name="Search Query",
|
|
96
|
+
info="The search query you want to execute with Tavily.",
|
|
97
|
+
),
|
|
98
|
+
DropdownInput(
|
|
99
|
+
name="search_depth",
|
|
100
|
+
display_name="Search Depth",
|
|
101
|
+
info="The depth of the search.",
|
|
102
|
+
options=list(TavilySearchDepth),
|
|
103
|
+
value=TavilySearchDepth.ADVANCED,
|
|
104
|
+
advanced=True,
|
|
105
|
+
),
|
|
106
|
+
IntInput(
|
|
107
|
+
name="chunks_per_source",
|
|
108
|
+
display_name="Chunks Per Source",
|
|
109
|
+
info=("The number of content chunks to retrieve from each source (1-3). Only works with advanced search."),
|
|
110
|
+
value=MAX_CHUNKS_PER_SOURCE,
|
|
111
|
+
advanced=True,
|
|
112
|
+
),
|
|
113
|
+
DropdownInput(
|
|
114
|
+
name="topic",
|
|
115
|
+
display_name="Search Topic",
|
|
116
|
+
info="The category of the search.",
|
|
117
|
+
options=list(TavilySearchTopic),
|
|
118
|
+
value=TavilySearchTopic.GENERAL,
|
|
119
|
+
advanced=True,
|
|
120
|
+
),
|
|
121
|
+
IntInput(
|
|
122
|
+
name="days",
|
|
123
|
+
display_name="Days",
|
|
124
|
+
info="Number of days back from current date to include. Only available with news topic.",
|
|
125
|
+
value=7,
|
|
126
|
+
advanced=True,
|
|
127
|
+
),
|
|
128
|
+
IntInput(
|
|
129
|
+
name="max_results",
|
|
130
|
+
display_name="Max Results",
|
|
131
|
+
info="The maximum number of search results to return.",
|
|
132
|
+
value=5,
|
|
133
|
+
advanced=True,
|
|
134
|
+
),
|
|
135
|
+
BoolInput(
|
|
136
|
+
name="include_answer",
|
|
137
|
+
display_name="Include Answer",
|
|
138
|
+
info="Include a short answer to original query.",
|
|
139
|
+
value=True,
|
|
140
|
+
advanced=True,
|
|
141
|
+
),
|
|
142
|
+
DropdownInput(
|
|
143
|
+
name="time_range",
|
|
144
|
+
display_name="Time Range",
|
|
145
|
+
info="The time range back from the current date to filter results.",
|
|
146
|
+
options=list(TavilySearchTimeRange),
|
|
147
|
+
value=None,
|
|
148
|
+
advanced=True,
|
|
149
|
+
),
|
|
150
|
+
BoolInput(
|
|
151
|
+
name="include_images",
|
|
152
|
+
display_name="Include Images",
|
|
153
|
+
info="Include a list of query-related images in the response.",
|
|
154
|
+
value=True,
|
|
155
|
+
advanced=True,
|
|
156
|
+
),
|
|
157
|
+
MessageTextInput(
|
|
158
|
+
name="include_domains",
|
|
159
|
+
display_name="Include Domains",
|
|
160
|
+
info="Comma-separated list of domains to include in the search results.",
|
|
161
|
+
advanced=True,
|
|
162
|
+
),
|
|
163
|
+
MessageTextInput(
|
|
164
|
+
name="exclude_domains",
|
|
165
|
+
display_name="Exclude Domains",
|
|
166
|
+
info="Comma-separated list of domains to exclude from the search results.",
|
|
167
|
+
advanced=True,
|
|
168
|
+
),
|
|
169
|
+
BoolInput(
|
|
170
|
+
name="include_raw_content",
|
|
171
|
+
display_name="Include Raw Content",
|
|
172
|
+
info="Include the cleaned and parsed HTML content of each search result.",
|
|
173
|
+
value=False,
|
|
174
|
+
advanced=True,
|
|
175
|
+
),
|
|
176
|
+
]
|
|
177
|
+
|
|
178
|
+
def run_model(self) -> list[Data]:
|
|
179
|
+
# Convert string values to enum instances with validation
|
|
180
|
+
try:
|
|
181
|
+
search_depth_enum = (
|
|
182
|
+
self.search_depth
|
|
183
|
+
if isinstance(self.search_depth, TavilySearchDepth)
|
|
184
|
+
else TavilySearchDepth(str(self.search_depth).lower())
|
|
185
|
+
)
|
|
186
|
+
except ValueError as e:
|
|
187
|
+
error_message = f"Invalid search depth value: {e!s}"
|
|
188
|
+
self.status = error_message
|
|
189
|
+
return [Data(data={"error": error_message})]
|
|
190
|
+
|
|
191
|
+
try:
|
|
192
|
+
topic_enum = (
|
|
193
|
+
self.topic if isinstance(self.topic, TavilySearchTopic) else TavilySearchTopic(str(self.topic).lower())
|
|
194
|
+
)
|
|
195
|
+
except ValueError as e:
|
|
196
|
+
error_message = f"Invalid topic value: {e!s}"
|
|
197
|
+
self.status = error_message
|
|
198
|
+
return [Data(data={"error": error_message})]
|
|
199
|
+
|
|
200
|
+
try:
|
|
201
|
+
time_range_enum = (
|
|
202
|
+
self.time_range
|
|
203
|
+
if isinstance(self.time_range, TavilySearchTimeRange)
|
|
204
|
+
else TavilySearchTimeRange(str(self.time_range).lower())
|
|
205
|
+
if self.time_range
|
|
206
|
+
else None
|
|
207
|
+
)
|
|
208
|
+
except ValueError as e:
|
|
209
|
+
error_message = f"Invalid time range value: {e!s}"
|
|
210
|
+
self.status = error_message
|
|
211
|
+
return [Data(data={"error": error_message})]
|
|
212
|
+
|
|
213
|
+
# Initialize domain variables as None
|
|
214
|
+
include_domains = None
|
|
215
|
+
exclude_domains = None
|
|
216
|
+
|
|
217
|
+
# Only process domains if they're provided
|
|
218
|
+
if self.include_domains:
|
|
219
|
+
include_domains = [domain.strip() for domain in self.include_domains.split(",") if domain.strip()]
|
|
220
|
+
|
|
221
|
+
if self.exclude_domains:
|
|
222
|
+
exclude_domains = [domain.strip() for domain in self.exclude_domains.split(",") if domain.strip()]
|
|
223
|
+
|
|
224
|
+
return self._tavily_search(
|
|
225
|
+
self.query,
|
|
226
|
+
search_depth=search_depth_enum,
|
|
227
|
+
topic=topic_enum,
|
|
228
|
+
max_results=self.max_results,
|
|
229
|
+
include_images=self.include_images,
|
|
230
|
+
include_answer=self.include_answer,
|
|
231
|
+
chunks_per_source=self.chunks_per_source,
|
|
232
|
+
include_domains=include_domains,
|
|
233
|
+
exclude_domains=exclude_domains,
|
|
234
|
+
include_raw_content=self.include_raw_content,
|
|
235
|
+
days=self.days,
|
|
236
|
+
time_range=time_range_enum,
|
|
237
|
+
)
|
|
238
|
+
|
|
239
|
+
def build_tool(self) -> Tool:
|
|
240
|
+
return StructuredTool.from_function(
|
|
241
|
+
name="tavily_search",
|
|
242
|
+
description="Perform a web search using the Tavily API.",
|
|
243
|
+
func=self._tavily_search,
|
|
244
|
+
args_schema=TavilySearchSchema,
|
|
245
|
+
)
|
|
246
|
+
|
|
247
|
+
def _tavily_search(
|
|
248
|
+
self,
|
|
249
|
+
query: str,
|
|
250
|
+
*,
|
|
251
|
+
search_depth: TavilySearchDepth = TavilySearchDepth.BASIC,
|
|
252
|
+
topic: TavilySearchTopic = TavilySearchTopic.GENERAL,
|
|
253
|
+
max_results: int = 5,
|
|
254
|
+
include_images: bool = False,
|
|
255
|
+
include_answer: bool = False,
|
|
256
|
+
chunks_per_source: int = MAX_CHUNKS_PER_SOURCE,
|
|
257
|
+
include_domains: list[str] | None = None,
|
|
258
|
+
exclude_domains: list[str] | None = None,
|
|
259
|
+
include_raw_content: bool = False,
|
|
260
|
+
days: int = 7,
|
|
261
|
+
time_range: TavilySearchTimeRange | None = None,
|
|
262
|
+
) -> list[Data]:
|
|
263
|
+
# Validate enum values
|
|
264
|
+
if not isinstance(search_depth, TavilySearchDepth):
|
|
265
|
+
msg = f"Invalid search_depth value: {search_depth}"
|
|
266
|
+
raise TypeError(msg)
|
|
267
|
+
if not isinstance(topic, TavilySearchTopic):
|
|
268
|
+
msg = f"Invalid topic value: {topic}"
|
|
269
|
+
raise TypeError(msg)
|
|
270
|
+
|
|
271
|
+
# Validate chunks_per_source range
|
|
272
|
+
if not 1 <= chunks_per_source <= MAX_CHUNKS_PER_SOURCE:
|
|
273
|
+
msg = f"chunks_per_source must be between 1 and {MAX_CHUNKS_PER_SOURCE}, got {chunks_per_source}"
|
|
274
|
+
raise ValueError(msg)
|
|
275
|
+
|
|
276
|
+
# Validate days is positive
|
|
277
|
+
if days < 1:
|
|
278
|
+
msg = f"days must be greater than or equal to 1, got {days}"
|
|
279
|
+
raise ValueError(msg)
|
|
280
|
+
|
|
281
|
+
try:
|
|
282
|
+
url = "https://api.tavily.com/search"
|
|
283
|
+
headers = {
|
|
284
|
+
"content-type": "application/json",
|
|
285
|
+
"accept": "application/json",
|
|
286
|
+
}
|
|
287
|
+
payload = {
|
|
288
|
+
"api_key": self.api_key,
|
|
289
|
+
"query": query,
|
|
290
|
+
"search_depth": search_depth.value,
|
|
291
|
+
"topic": topic.value,
|
|
292
|
+
"max_results": max_results,
|
|
293
|
+
"include_images": include_images,
|
|
294
|
+
"include_answer": include_answer,
|
|
295
|
+
"chunks_per_source": chunks_per_source if search_depth == TavilySearchDepth.ADVANCED else None,
|
|
296
|
+
"include_domains": include_domains if include_domains else None,
|
|
297
|
+
"exclude_domains": exclude_domains if exclude_domains else None,
|
|
298
|
+
"include_raw_content": include_raw_content,
|
|
299
|
+
"days": days if topic == TavilySearchTopic.NEWS else None,
|
|
300
|
+
"time_range": time_range.value if time_range else None,
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
with httpx.Client(timeout=90.0) as client:
|
|
304
|
+
response = client.post(url, json=payload, headers=headers)
|
|
305
|
+
|
|
306
|
+
response.raise_for_status()
|
|
307
|
+
search_results = response.json()
|
|
308
|
+
|
|
309
|
+
data_results = [
|
|
310
|
+
Data(
|
|
311
|
+
data={
|
|
312
|
+
"title": result.get("title"),
|
|
313
|
+
"url": result.get("url"),
|
|
314
|
+
"content": result.get("content"),
|
|
315
|
+
"score": result.get("score"),
|
|
316
|
+
"raw_content": result.get("raw_content") if include_raw_content else None,
|
|
317
|
+
}
|
|
318
|
+
)
|
|
319
|
+
for result in search_results.get("results", [])
|
|
320
|
+
]
|
|
321
|
+
|
|
322
|
+
if include_answer and search_results.get("answer"):
|
|
323
|
+
data_results.insert(0, Data(data={"answer": search_results["answer"]}))
|
|
324
|
+
|
|
325
|
+
if include_images and search_results.get("images"):
|
|
326
|
+
data_results.append(Data(data={"images": search_results["images"]}))
|
|
327
|
+
|
|
328
|
+
self.status = data_results # type: ignore[assignment]
|
|
329
|
+
|
|
330
|
+
except httpx.TimeoutException as e:
|
|
331
|
+
error_message = "Request timed out (90s). Please try again or adjust parameters."
|
|
332
|
+
logger.error(f"Timeout error: {e}")
|
|
333
|
+
self.status = error_message
|
|
334
|
+
raise ToolException(error_message) from e
|
|
335
|
+
except httpx.HTTPStatusError as e:
|
|
336
|
+
error_message = f"HTTP error: {e.response.status_code} - {e.response.text}"
|
|
337
|
+
logger.debug(error_message)
|
|
338
|
+
self.status = error_message
|
|
339
|
+
raise ToolException(error_message) from e
|
|
340
|
+
except Exception as e:
|
|
341
|
+
error_message = f"Unexpected error: {e}"
|
|
342
|
+
logger.debug("Error running Tavily Search", exc_info=True)
|
|
343
|
+
self.status = error_message
|
|
344
|
+
raise ToolException(error_message) from e
|
|
345
|
+
return data_results
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
from typing import Any
|
|
2
|
+
|
|
3
|
+
import httpx
|
|
4
|
+
from langchain_core.tools import StructuredTool, ToolException
|
|
5
|
+
from pydantic import BaseModel, Field
|
|
6
|
+
|
|
7
|
+
from lfx.base.langchain_utilities.model import LCToolComponent
|
|
8
|
+
from lfx.field_typing import Tool
|
|
9
|
+
from lfx.inputs.inputs import MultilineInput
|
|
10
|
+
from lfx.schema.data import Data
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class WikidataSearchSchema(BaseModel):
|
|
14
|
+
query: str = Field(..., description="The search query for Wikidata")
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class WikidataAPIWrapper(BaseModel):
|
|
18
|
+
"""Wrapper around Wikidata API."""
|
|
19
|
+
|
|
20
|
+
wikidata_api_url: str = "https://www.wikidata.org/w/api.php"
|
|
21
|
+
|
|
22
|
+
def results(self, query: str) -> list[dict[str, Any]]:
|
|
23
|
+
# Define request parameters for Wikidata API
|
|
24
|
+
params = {
|
|
25
|
+
"action": "wbsearchentities",
|
|
26
|
+
"format": "json",
|
|
27
|
+
"search": query,
|
|
28
|
+
"language": "en",
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
# Send request to Wikidata API
|
|
32
|
+
response = httpx.get(self.wikidata_api_url, params=params)
|
|
33
|
+
response.raise_for_status()
|
|
34
|
+
response_json = response.json()
|
|
35
|
+
|
|
36
|
+
# Extract and return search results
|
|
37
|
+
return response_json.get("search", [])
|
|
38
|
+
|
|
39
|
+
def run(self, query: str) -> list[dict[str, Any]]:
|
|
40
|
+
try:
|
|
41
|
+
results = self.results(query)
|
|
42
|
+
if results:
|
|
43
|
+
return results
|
|
44
|
+
|
|
45
|
+
error_message = "No search results found for the given query."
|
|
46
|
+
|
|
47
|
+
raise ToolException(error_message)
|
|
48
|
+
|
|
49
|
+
except Exception as e:
|
|
50
|
+
error_message = f"Error in Wikidata Search API: {e!s}"
|
|
51
|
+
|
|
52
|
+
raise ToolException(error_message) from e
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
class WikidataAPIComponent(LCToolComponent):
|
|
56
|
+
display_name = "Wikidata API"
|
|
57
|
+
description = "Performs a search using the Wikidata API."
|
|
58
|
+
name = "WikidataAPI"
|
|
59
|
+
icon = "Wikipedia"
|
|
60
|
+
legacy = True
|
|
61
|
+
replacement = ["wikipedia.WikidataComponent"]
|
|
62
|
+
|
|
63
|
+
inputs = [
|
|
64
|
+
MultilineInput(
|
|
65
|
+
name="query",
|
|
66
|
+
display_name="Query",
|
|
67
|
+
info="The text query for similarity search on Wikidata.",
|
|
68
|
+
required=True,
|
|
69
|
+
),
|
|
70
|
+
]
|
|
71
|
+
|
|
72
|
+
def build_tool(self) -> Tool:
|
|
73
|
+
wrapper = WikidataAPIWrapper()
|
|
74
|
+
|
|
75
|
+
# Define the tool using StructuredTool and wrapper's run method
|
|
76
|
+
tool = StructuredTool.from_function(
|
|
77
|
+
name="wikidata_search_api",
|
|
78
|
+
description="Perform similarity search on Wikidata API",
|
|
79
|
+
func=wrapper.run,
|
|
80
|
+
args_schema=WikidataSearchSchema,
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
self.status = "Wikidata Search API Tool for Langchain"
|
|
84
|
+
|
|
85
|
+
return tool
|
|
86
|
+
|
|
87
|
+
def run_model(self) -> list[Data]:
|
|
88
|
+
tool = self.build_tool()
|
|
89
|
+
|
|
90
|
+
results = tool.run({"query": self.query})
|
|
91
|
+
|
|
92
|
+
# Transform the API response into Data objects
|
|
93
|
+
data = [
|
|
94
|
+
Data(
|
|
95
|
+
text=result["label"],
|
|
96
|
+
metadata=result,
|
|
97
|
+
)
|
|
98
|
+
for result in results
|
|
99
|
+
]
|
|
100
|
+
|
|
101
|
+
self.status = data # type: ignore[assignment]
|
|
102
|
+
|
|
103
|
+
return data
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
from typing import cast
|
|
2
|
+
|
|
3
|
+
from langchain_community.tools import WikipediaQueryRun
|
|
4
|
+
from langchain_community.utilities.wikipedia import WikipediaAPIWrapper
|
|
5
|
+
|
|
6
|
+
from lfx.base.langchain_utilities.model import LCToolComponent
|
|
7
|
+
from lfx.field_typing import Tool
|
|
8
|
+
from lfx.inputs.inputs import BoolInput, IntInput, MessageTextInput, MultilineInput
|
|
9
|
+
from lfx.schema.data import Data
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class WikipediaAPIComponent(LCToolComponent):
|
|
13
|
+
display_name = "Wikipedia API"
|
|
14
|
+
description = "Call Wikipedia API."
|
|
15
|
+
name = "WikipediaAPI"
|
|
16
|
+
icon = "Wikipedia"
|
|
17
|
+
legacy = True
|
|
18
|
+
replacement = ["wikipedia.WikipediaComponent"]
|
|
19
|
+
|
|
20
|
+
inputs = [
|
|
21
|
+
MultilineInput(
|
|
22
|
+
name="input_value",
|
|
23
|
+
display_name="Input",
|
|
24
|
+
),
|
|
25
|
+
MessageTextInput(name="lang", display_name="Language", value="en"),
|
|
26
|
+
IntInput(name="k", display_name="Number of results", value=4, required=True),
|
|
27
|
+
BoolInput(name="load_all_available_meta", display_name="Load all available meta", value=False, advanced=True),
|
|
28
|
+
IntInput(
|
|
29
|
+
name="doc_content_chars_max", display_name="Document content characters max", value=4000, advanced=True
|
|
30
|
+
),
|
|
31
|
+
]
|
|
32
|
+
|
|
33
|
+
def run_model(self) -> list[Data]:
|
|
34
|
+
wrapper = self._build_wrapper()
|
|
35
|
+
docs = wrapper.load(self.input_value)
|
|
36
|
+
data = [Data.from_document(doc) for doc in docs]
|
|
37
|
+
self.status = data
|
|
38
|
+
return data
|
|
39
|
+
|
|
40
|
+
def build_tool(self) -> Tool:
|
|
41
|
+
wrapper = self._build_wrapper()
|
|
42
|
+
return cast("Tool", WikipediaQueryRun(api_wrapper=wrapper))
|
|
43
|
+
|
|
44
|
+
def _build_wrapper(self) -> WikipediaAPIWrapper:
|
|
45
|
+
return WikipediaAPIWrapper(
|
|
46
|
+
top_k_results=self.k,
|
|
47
|
+
lang=self.lang,
|
|
48
|
+
load_all_available_meta=self.load_all_available_meta,
|
|
49
|
+
doc_content_chars_max=self.doc_content_chars_max,
|
|
50
|
+
)
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import ast
|
|
2
|
+
import pprint
|
|
3
|
+
from enum import Enum
|
|
4
|
+
|
|
5
|
+
from langchain.tools import StructuredTool
|
|
6
|
+
from langchain_core.tools import ToolException
|
|
7
|
+
from pydantic import BaseModel, Field
|
|
8
|
+
|
|
9
|
+
from lfx.base.langchain_utilities.model import LCToolComponent
|
|
10
|
+
from lfx.field_typing import Tool
|
|
11
|
+
from lfx.inputs.inputs import DropdownInput, IntInput, MessageTextInput
|
|
12
|
+
from lfx.log.logger import logger
|
|
13
|
+
from lfx.schema.data import Data
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class YahooFinanceMethod(Enum):
|
|
17
|
+
GET_INFO = "get_info"
|
|
18
|
+
GET_NEWS = "get_news"
|
|
19
|
+
GET_ACTIONS = "get_actions"
|
|
20
|
+
GET_ANALYSIS = "get_analysis"
|
|
21
|
+
GET_BALANCE_SHEET = "get_balance_sheet"
|
|
22
|
+
GET_CALENDAR = "get_calendar"
|
|
23
|
+
GET_CASHFLOW = "get_cashflow"
|
|
24
|
+
GET_INSTITUTIONAL_HOLDERS = "get_institutional_holders"
|
|
25
|
+
GET_RECOMMENDATIONS = "get_recommendations"
|
|
26
|
+
GET_SUSTAINABILITY = "get_sustainability"
|
|
27
|
+
GET_MAJOR_HOLDERS = "get_major_holders"
|
|
28
|
+
GET_MUTUALFUND_HOLDERS = "get_mutualfund_holders"
|
|
29
|
+
GET_INSIDER_PURCHASES = "get_insider_purchases"
|
|
30
|
+
GET_INSIDER_TRANSACTIONS = "get_insider_transactions"
|
|
31
|
+
GET_INSIDER_ROSTER_HOLDERS = "get_insider_roster_holders"
|
|
32
|
+
GET_DIVIDENDS = "get_dividends"
|
|
33
|
+
GET_CAPITAL_GAINS = "get_capital_gains"
|
|
34
|
+
GET_SPLITS = "get_splits"
|
|
35
|
+
GET_SHARES = "get_shares"
|
|
36
|
+
GET_FAST_INFO = "get_fast_info"
|
|
37
|
+
GET_SEC_FILINGS = "get_sec_filings"
|
|
38
|
+
GET_RECOMMENDATIONS_SUMMARY = "get_recommendations_summary"
|
|
39
|
+
GET_UPGRADES_DOWNGRADES = "get_upgrades_downgrades"
|
|
40
|
+
GET_EARNINGS = "get_earnings"
|
|
41
|
+
GET_INCOME_STMT = "get_income_stmt"
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class YahooFinanceSchema(BaseModel):
|
|
45
|
+
symbol: str = Field(..., description="The stock symbol to retrieve data for.")
|
|
46
|
+
method: YahooFinanceMethod = Field(YahooFinanceMethod.GET_INFO, description="The type of data to retrieve.")
|
|
47
|
+
num_news: int | None = Field(5, description="The number of news articles to retrieve.")
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
class YfinanceToolComponent(LCToolComponent):
|
|
51
|
+
display_name = "Yahoo! Finance"
|
|
52
|
+
description = """Uses [yfinance](https://pypi.org/project/yfinance/) (unofficial package) \
|
|
53
|
+
to access financial data and market information from Yahoo! Finance."""
|
|
54
|
+
icon = "trending-up"
|
|
55
|
+
name = "YahooFinanceTool"
|
|
56
|
+
legacy = True
|
|
57
|
+
replacement = ["yahoosearch.YfinanceComponent"]
|
|
58
|
+
|
|
59
|
+
inputs = [
|
|
60
|
+
MessageTextInput(
|
|
61
|
+
name="symbol",
|
|
62
|
+
display_name="Stock Symbol",
|
|
63
|
+
info="The stock symbol to retrieve data for (e.g., AAPL, GOOG).",
|
|
64
|
+
),
|
|
65
|
+
DropdownInput(
|
|
66
|
+
name="method",
|
|
67
|
+
display_name="Data Method",
|
|
68
|
+
info="The type of data to retrieve.",
|
|
69
|
+
options=list(YahooFinanceMethod),
|
|
70
|
+
value="get_news",
|
|
71
|
+
),
|
|
72
|
+
IntInput(
|
|
73
|
+
name="num_news",
|
|
74
|
+
display_name="Number of News",
|
|
75
|
+
info="The number of news articles to retrieve (only applicable for get_news).",
|
|
76
|
+
value=5,
|
|
77
|
+
),
|
|
78
|
+
]
|
|
79
|
+
|
|
80
|
+
def run_model(self) -> list[Data]:
|
|
81
|
+
return self._yahoo_finance_tool(
|
|
82
|
+
self.symbol,
|
|
83
|
+
self.method,
|
|
84
|
+
self.num_news,
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
def build_tool(self) -> Tool:
|
|
88
|
+
return StructuredTool.from_function(
|
|
89
|
+
name="yahoo_finance",
|
|
90
|
+
description="Access financial data and market information from Yahoo! Finance.",
|
|
91
|
+
func=self._yahoo_finance_tool,
|
|
92
|
+
args_schema=YahooFinanceSchema,
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
def _yahoo_finance_tool(
|
|
96
|
+
self,
|
|
97
|
+
symbol: str,
|
|
98
|
+
method: YahooFinanceMethod,
|
|
99
|
+
num_news: int | None = 5,
|
|
100
|
+
) -> list[Data]:
|
|
101
|
+
try:
|
|
102
|
+
import yfinance as yf
|
|
103
|
+
except ImportError as e:
|
|
104
|
+
msg = ""
|
|
105
|
+
raise ImportError(msg) from e
|
|
106
|
+
|
|
107
|
+
ticker = yf.Ticker(symbol)
|
|
108
|
+
|
|
109
|
+
try:
|
|
110
|
+
if method == YahooFinanceMethod.GET_INFO:
|
|
111
|
+
result = ticker.info
|
|
112
|
+
elif method == YahooFinanceMethod.GET_NEWS:
|
|
113
|
+
result = ticker.news[:num_news]
|
|
114
|
+
else:
|
|
115
|
+
result = getattr(ticker, method.value)()
|
|
116
|
+
|
|
117
|
+
result = pprint.pformat(result)
|
|
118
|
+
|
|
119
|
+
if method == YahooFinanceMethod.GET_NEWS:
|
|
120
|
+
data_list = [Data(data=article) for article in ast.literal_eval(result)]
|
|
121
|
+
else:
|
|
122
|
+
data_list = [Data(data={"result": result})]
|
|
123
|
+
|
|
124
|
+
except Exception as e:
|
|
125
|
+
error_message = f"Error retrieving data: {e}"
|
|
126
|
+
logger.debug(error_message)
|
|
127
|
+
self.status = error_message
|
|
128
|
+
raise ToolException(error_message) from e
|
|
129
|
+
|
|
130
|
+
return data_list
|
|
@@ -0,0 +1,52 @@
|
|
|
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 .convert_astra_results import ConvertAstraToTwelveLabs
|
|
9
|
+
from .pegasus_index import PegasusIndexVideo
|
|
10
|
+
from .split_video import SplitVideoComponent
|
|
11
|
+
from .text_embeddings import TwelveLabsTextEmbeddingsComponent
|
|
12
|
+
from .twelvelabs_pegasus import TwelveLabsPegasus
|
|
13
|
+
from .video_embeddings import TwelveLabsVideoEmbeddingsComponent
|
|
14
|
+
from .video_file import VideoFileComponent
|
|
15
|
+
|
|
16
|
+
_dynamic_imports = {
|
|
17
|
+
"ConvertAstraToTwelveLabs": "convert_astra_results",
|
|
18
|
+
"PegasusIndexVideo": "pegasus_index",
|
|
19
|
+
"SplitVideoComponent": "split_video",
|
|
20
|
+
"TwelveLabsPegasus": "twelvelabs_pegasus",
|
|
21
|
+
"TwelveLabsTextEmbeddingsComponent": "text_embeddings",
|
|
22
|
+
"TwelveLabsVideoEmbeddingsComponent": "video_embeddings",
|
|
23
|
+
"VideoFileComponent": "video_file",
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
__all__ = [
|
|
27
|
+
"ConvertAstraToTwelveLabs",
|
|
28
|
+
"PegasusIndexVideo",
|
|
29
|
+
"SplitVideoComponent",
|
|
30
|
+
"TwelveLabsPegasus",
|
|
31
|
+
"TwelveLabsTextEmbeddingsComponent",
|
|
32
|
+
"TwelveLabsVideoEmbeddingsComponent",
|
|
33
|
+
"VideoFileComponent",
|
|
34
|
+
]
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def __getattr__(attr_name: str) -> Any:
|
|
38
|
+
"""Lazily import twelvelabs components on attribute access."""
|
|
39
|
+
if attr_name not in _dynamic_imports:
|
|
40
|
+
msg = f"module '{__name__}' has no attribute '{attr_name}'"
|
|
41
|
+
raise AttributeError(msg)
|
|
42
|
+
try:
|
|
43
|
+
result = import_mod(attr_name, _dynamic_imports[attr_name], __spec__.parent)
|
|
44
|
+
except (ModuleNotFoundError, ImportError, AttributeError) as e:
|
|
45
|
+
msg = f"Could not import '{attr_name}' from '{__name__}': {e}"
|
|
46
|
+
raise AttributeError(msg) from e
|
|
47
|
+
globals()[attr_name] = result
|
|
48
|
+
return result
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def __dir__() -> list[str]:
|
|
52
|
+
return list(__all__)
|