lfx-nightly 0.1.11.dev0__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.
- lfx/__init__.py +0 -0
- lfx/__main__.py +25 -0
- lfx/base/__init__.py +0 -0
- lfx/base/agents/__init__.py +0 -0
- lfx/base/agents/agent.py +268 -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 +346 -0
- lfx/base/agents/utils.py +205 -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 +1291 -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 +685 -0
- lfx/base/data/docling_utils.py +245 -0
- lfx/base/data/utils.py +198 -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/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 +20 -0
- lfx/base/io/text.py +22 -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 +1398 -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 +47 -0
- lfx/base/models/aws_constants.py +151 -0
- lfx/base/models/chat_result.py +76 -0
- lfx/base/models/google_generative_ai_constants.py +70 -0
- lfx/base/models/groq_constants.py +134 -0
- lfx/base/models/model.py +375 -0
- lfx/base/models/model_input_constants.py +307 -0
- lfx/base/models/model_metadata.py +41 -0
- lfx/base/models/model_utils.py +8 -0
- lfx/base/models/novita_constants.py +35 -0
- lfx/base/models/ollama_constants.py +49 -0
- lfx/base/models/openai_constants.py +122 -0
- lfx/base/models/sambanova_constants.py +18 -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 +224 -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 +319 -0
- lfx/cli/common.py +650 -0
- lfx/cli/run.py +441 -0
- lfx/cli/script_loader.py +247 -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 +411 -0
- lfx/components/_importing.py +42 -0
- lfx/components/agentql/__init__.py +3 -0
- lfx/components/agentql/agentql_api.py +151 -0
- lfx/components/agents/__init__.py +34 -0
- lfx/components/agents/agent.py +558 -0
- lfx/components/agents/mcp_component.py +501 -0
- lfx/components/aiml/__init__.py +37 -0
- lfx/components/aiml/aiml.py +112 -0
- lfx/components/aiml/aiml_embeddings.py +37 -0
- lfx/components/amazon/__init__.py +36 -0
- lfx/components/amazon/amazon_bedrock_embedding.py +109 -0
- lfx/components/amazon/amazon_bedrock_model.py +124 -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 +163 -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 +167 -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/composio/__init__.py +74 -0
- lfx/components/composio/composio_api.py +268 -0
- lfx/components/composio/dropbox_compnent.py +11 -0
- lfx/components/composio/github_composio.py +11 -0
- lfx/components/composio/gmail_composio.py +38 -0
- lfx/components/composio/googlecalendar_composio.py +11 -0
- lfx/components/composio/googlemeet_composio.py +11 -0
- lfx/components/composio/googletasks_composio.py +8 -0
- lfx/components/composio/linear_composio.py +11 -0
- lfx/components/composio/outlook_composio.py +11 -0
- lfx/components/composio/reddit_composio.py +11 -0
- lfx/components/composio/slack_composio.py +582 -0
- lfx/components/composio/slackbot_composio.py +11 -0
- lfx/components/composio/supabase_composio.py +11 -0
- lfx/components/composio/todoist_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 +107 -0
- lfx/components/crewai/hierarchical_crew.py +46 -0
- lfx/components/crewai/hierarchical_task.py +44 -0
- lfx/components/crewai/sequential_crew.py +52 -0
- lfx/components/crewai/sequential_task.py +73 -0
- lfx/components/crewai/sequential_task_agent.py +143 -0
- lfx/components/custom_component/__init__.py +34 -0
- lfx/components/custom_component/custom_component.py +31 -0
- lfx/components/data/__init__.py +64 -0
- lfx/components/data/api_request.py +544 -0
- lfx/components/data/csv_to_data.py +95 -0
- lfx/components/data/directory.py +113 -0
- lfx/components/data/file.py +577 -0
- lfx/components/data/json_to_data.py +98 -0
- lfx/components/data/news_search.py +164 -0
- lfx/components/data/rss.py +69 -0
- lfx/components/data/sql_executor.py +101 -0
- lfx/components/data/url.py +311 -0
- lfx/components/data/web_search.py +112 -0
- lfx/components/data/webhook.py +56 -0
- lfx/components/datastax/__init__.py +70 -0
- lfx/components/datastax/astra_assistant_manager.py +306 -0
- lfx/components/datastax/astra_db.py +75 -0
- lfx/components/datastax/astra_vectorize.py +124 -0
- lfx/components/datastax/astradb.py +1285 -0
- lfx/components/datastax/astradb_cql.py +314 -0
- lfx/components/datastax/astradb_graph.py +330 -0
- lfx/components/datastax/astradb_tool.py +414 -0
- lfx/components/datastax/astradb_vectorstore.py +1285 -0
- lfx/components/datastax/cassandra.py +92 -0
- lfx/components/datastax/create_assistant.py +58 -0
- lfx/components/datastax/create_thread.py +32 -0
- lfx/components/datastax/dotenv.py +35 -0
- lfx/components/datastax/get_assistant.py +37 -0
- lfx/components/datastax/getenvvar.py +30 -0
- lfx/components/datastax/graph_rag.py +141 -0
- lfx/components/datastax/hcd.py +314 -0
- lfx/components/datastax/list_assistants.py +25 -0
- lfx/components/datastax/run.py +89 -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 +231 -0
- lfx/components/docling/docling_remote.py +193 -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 +243 -0
- lfx/components/embeddings/__init__.py +37 -0
- lfx/components/embeddings/similarity.py +76 -0
- lfx/components/embeddings/text_embedder.py +64 -0
- lfx/components/exa/__init__.py +3 -0
- lfx/components/exa/exa_search.py +68 -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/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 +192 -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 +147 -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 +136 -0
- lfx/components/helpers/__init__.py +52 -0
- lfx/components/helpers/calculator_core.py +89 -0
- lfx/components/helpers/create_list.py +40 -0
- lfx/components/helpers/current_date.py +42 -0
- lfx/components/helpers/id_generator.py +42 -0
- lfx/components/helpers/memory.py +251 -0
- lfx/components/helpers/output_parser.py +45 -0
- lfx/components/helpers/store_message.py +90 -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 +197 -0
- lfx/components/huggingface/huggingface_inference_api.py +106 -0
- lfx/components/ibm/__init__.py +34 -0
- lfx/components/ibm/watsonx.py +203 -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 +38 -0
- lfx/components/input_output/chat.py +120 -0
- lfx/components/input_output/chat_output.py +200 -0
- lfx/components/input_output/text.py +27 -0
- lfx/components/input_output/text_output.py +29 -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/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 +107 -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 +45 -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/lmstudio/__init__.py +34 -0
- lfx/components/lmstudio/lmstudioembeddings.py +89 -0
- lfx/components/lmstudio/lmstudiomodel.py +129 -0
- lfx/components/logic/__init__.py +52 -0
- lfx/components/logic/conditional_router.py +171 -0
- lfx/components/logic/data_conditional_router.py +125 -0
- lfx/components/logic/flow_tool.py +110 -0
- lfx/components/logic/listen.py +29 -0
- lfx/components/logic/loop.py +125 -0
- lfx/components/logic/notify.py +88 -0
- lfx/components/logic/pass_message.py +35 -0
- lfx/components/logic/run_flow.py +71 -0
- lfx/components/logic/sub_flow.py +114 -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 +136 -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 +34 -0
- lfx/components/models/embedding_model.py +114 -0
- lfx/components/models/language_model.py +144 -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 +157 -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 +330 -0
- lfx/components/ollama/ollama_embeddings.py +106 -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 +202 -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 +117 -0
- lfx/components/processing/alter_metadata.py +108 -0
- lfx/components/processing/batch_run.py +205 -0
- lfx/components/processing/combine_text.py +39 -0
- lfx/components/processing/converter.py +159 -0
- lfx/components/processing/create_data.py +110 -0
- lfx/components/processing/data_operations.py +438 -0
- lfx/components/processing/data_to_dataframe.py +70 -0
- lfx/components/processing/dataframe_operations.py +313 -0
- lfx/components/processing/extract_key.py +53 -0
- lfx/components/processing/filter_data.py +42 -0
- lfx/components/processing/filter_data_values.py +88 -0
- lfx/components/processing/json_cleaner.py +103 -0
- lfx/components/processing/lambda_filter.py +154 -0
- lfx/components/processing/llm_router.py +499 -0
- lfx/components/processing/merge_data.py +90 -0
- lfx/components/processing/message_to_data.py +36 -0
- lfx/components/processing/parse_data.py +70 -0
- lfx/components/processing/parse_dataframe.py +68 -0
- lfx/components/processing/parse_json_data.py +90 -0
- lfx/components/processing/parser.py +143 -0
- lfx/components/processing/prompt.py +67 -0
- lfx/components/processing/python_repl_core.py +98 -0
- lfx/components/processing/regex.py +82 -0
- lfx/components/processing/save_file.py +225 -0
- lfx/components/processing/select_data.py +48 -0
- lfx/components/processing/split_text.py +141 -0
- lfx/components/processing/structured_output.py +202 -0
- lfx/components/processing/update_data.py +160 -0
- lfx/components/prototypes/__init__.py +34 -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 +72 -0
- lfx/components/tools/calculator.py +108 -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 +327 -0
- lfx/components/tools/python_repl.py +97 -0
- lfx/components/tools/search_api.py +87 -0
- lfx/components/tools/searxng.py +145 -0
- lfx/components/tools/serp_api.py +119 -0
- lfx/components/tools/tavily_search_tool.py +344 -0
- lfx/components/tools/wikidata_api.py +102 -0
- lfx/components/tools/wikipedia_api.py +49 -0
- lfx/components/tools/yahoo_finance.py +129 -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 +291 -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 +179 -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/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 +40 -0
- lfx/components/vectorstores/astradb.py +1285 -0
- lfx/components/vectorstores/astradb_graph.py +319 -0
- lfx/components/vectorstores/cassandra.py +264 -0
- lfx/components/vectorstores/cassandra_graph.py +238 -0
- lfx/components/vectorstores/chroma.py +167 -0
- lfx/components/vectorstores/clickhouse.py +135 -0
- lfx/components/vectorstores/couchbase.py +102 -0
- lfx/components/vectorstores/elasticsearch.py +267 -0
- lfx/components/vectorstores/faiss.py +111 -0
- lfx/components/vectorstores/graph_rag.py +141 -0
- lfx/components/vectorstores/hcd.py +314 -0
- lfx/components/vectorstores/local_db.py +261 -0
- lfx/components/vectorstores/milvus.py +115 -0
- lfx/components/vectorstores/mongodb_atlas.py +213 -0
- lfx/components/vectorstores/opensearch.py +243 -0
- lfx/components/vectorstores/pgvector.py +72 -0
- lfx/components/vectorstores/pinecone.py +134 -0
- lfx/components/vectorstores/qdrant.py +109 -0
- lfx/components/vectorstores/supabase.py +76 -0
- lfx/components/vectorstores/upstash.py +124 -0
- lfx/components/vectorstores/vectara.py +97 -0
- lfx/components/vectorstores/vectara_rag.py +164 -0
- lfx/components/vectorstores/weaviate.py +89 -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/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 +118 -0
- lfx/components/zep/__init__.py +3 -0
- lfx/components/zep/zep.py +44 -0
- lfx/constants.py +6 -0
- lfx/custom/__init__.py +7 -0
- lfx/custom/attributes.py +86 -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 +1808 -0
- lfx/custom/custom_component/component_with_cache.py +8 -0
- lfx/custom/custom_component/custom_component.py +588 -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 +488 -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 +215 -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 +277 -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 +2238 -0
- lfx/graph/graph/constants.py +63 -0
- lfx/graph/graph/runnable_vertices_manager.py +133 -0
- lfx/graph/graph/schema.py +52 -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 +237 -0
- lfx/graph/utils.py +200 -0
- lfx/graph/vertex/__init__.py +0 -0
- lfx/graph/vertex/base.py +823 -0
- lfx/graph/vertex/constants.py +0 -0
- lfx/graph/vertex/exceptions.py +4 -0
- lfx/graph/vertex/param_handler.py +264 -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 +1 -0
- lfx/helpers/base_model.py +71 -0
- lfx/helpers/custom.py +13 -0
- lfx/helpers/data.py +167 -0
- lfx/helpers/flow.py +194 -0
- lfx/inputs/__init__.py +68 -0
- lfx/inputs/constants.py +2 -0
- lfx/inputs/input_mixin.py +328 -0
- lfx/inputs/inputs.py +714 -0
- lfx/inputs/validators.py +19 -0
- lfx/interface/__init__.py +6 -0
- lfx/interface/components.py +489 -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 +224 -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 +289 -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 +385 -0
- lfx/memory/__init__.py +90 -0
- lfx/memory/stubs.py +283 -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/data.py +308 -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 +131 -0
- lfx/schema/json_schema.py +141 -0
- lfx/schema/log.py +61 -0
- lfx/schema/message.py +473 -0
- lfx/schema/openai_responses_schemas.py +74 -0
- lfx/schema/properties.py +41 -0
- lfx/schema/schema.py +171 -0
- lfx/schema/serialize.py +13 -0
- lfx/schema/table.py +140 -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 +23 -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/deps.py +129 -0
- lfx/services/factory.py +19 -0
- lfx/services/initialize.py +19 -0
- lfx/services/interfaces.py +103 -0
- lfx/services/manager.py +172 -0
- lfx/services/schema.py +20 -0
- lfx/services/session.py +82 -0
- lfx/services/settings/__init__.py +3 -0
- lfx/services/settings/auth.py +130 -0
- lfx/services/settings/base.py +539 -0
- lfx/services/settings/constants.py +31 -0
- lfx/services/settings/factory.py +23 -0
- lfx/services/settings/feature_flags.py +12 -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 +155 -0
- lfx/services/storage/service.py +54 -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 +257 -0
- lfx/template/field/prompt.py +15 -0
- lfx/template/frontend_node/__init__.py +6 -0
- lfx/template/frontend_node/base.py +212 -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 +205 -0
- lfx/utils/data_structure.py +212 -0
- lfx/utils/exceptions.py +22 -0
- lfx/utils/helpers.py +28 -0
- lfx/utils/image.py +73 -0
- lfx/utils/lazy_load.py +15 -0
- lfx/utils/request_utils.py +18 -0
- lfx/utils/schemas.py +139 -0
- lfx/utils/util.py +481 -0
- lfx/utils/util_strings.py +56 -0
- lfx/utils/version.py +24 -0
- lfx_nightly-0.1.11.dev0.dist-info/METADATA +293 -0
- lfx_nightly-0.1.11.dev0.dist-info/RECORD +699 -0
- lfx_nightly-0.1.11.dev0.dist-info/WHEEL +4 -0
- lfx_nightly-0.1.11.dev0.dist-info/entry_points.txt +2 -0
@@ -0,0 +1,167 @@
|
|
1
|
+
import requests
|
2
|
+
from langchain_openai import ChatOpenAI
|
3
|
+
from pydantic.v1 import SecretStr
|
4
|
+
from typing_extensions import override
|
5
|
+
|
6
|
+
from lfx.base.models.model import LCModelComponent
|
7
|
+
from lfx.field_typing import LanguageModel
|
8
|
+
from lfx.field_typing.range_spec import RangeSpec
|
9
|
+
from lfx.inputs.inputs import (
|
10
|
+
BoolInput,
|
11
|
+
DictInput,
|
12
|
+
DropdownInput,
|
13
|
+
IntInput,
|
14
|
+
MessageTextInput,
|
15
|
+
SecretStrInput,
|
16
|
+
SliderInput,
|
17
|
+
)
|
18
|
+
|
19
|
+
XAI_DEFAULT_MODELS = ["grok-2-latest"]
|
20
|
+
|
21
|
+
|
22
|
+
class XAIModelComponent(LCModelComponent):
|
23
|
+
display_name = "xAI"
|
24
|
+
description = "Generates text using xAI models like Grok."
|
25
|
+
icon = "xAI"
|
26
|
+
name = "xAIModel"
|
27
|
+
|
28
|
+
inputs = [
|
29
|
+
*LCModelComponent.get_base_inputs(),
|
30
|
+
IntInput(
|
31
|
+
name="max_tokens",
|
32
|
+
display_name="Max Tokens",
|
33
|
+
advanced=True,
|
34
|
+
info="The maximum number of tokens to generate. Set to 0 for unlimited tokens.",
|
35
|
+
range_spec=RangeSpec(min=0, max=128000),
|
36
|
+
),
|
37
|
+
DictInput(
|
38
|
+
name="model_kwargs",
|
39
|
+
display_name="Model Kwargs",
|
40
|
+
advanced=True,
|
41
|
+
info="Additional keyword arguments to pass to the model.",
|
42
|
+
),
|
43
|
+
BoolInput(
|
44
|
+
name="json_mode",
|
45
|
+
display_name="JSON Mode",
|
46
|
+
advanced=True,
|
47
|
+
info="If True, it will output JSON regardless of passing a schema.",
|
48
|
+
),
|
49
|
+
DropdownInput(
|
50
|
+
name="model_name",
|
51
|
+
display_name="Model Name",
|
52
|
+
advanced=False,
|
53
|
+
options=XAI_DEFAULT_MODELS,
|
54
|
+
value=XAI_DEFAULT_MODELS[0],
|
55
|
+
refresh_button=True,
|
56
|
+
combobox=True,
|
57
|
+
info="The xAI model to use",
|
58
|
+
),
|
59
|
+
MessageTextInput(
|
60
|
+
name="base_url",
|
61
|
+
display_name="xAI API Base",
|
62
|
+
advanced=True,
|
63
|
+
info="The base URL of the xAI API. Defaults to https://api.x.ai/v1",
|
64
|
+
value="https://api.x.ai/v1",
|
65
|
+
),
|
66
|
+
SecretStrInput(
|
67
|
+
name="api_key",
|
68
|
+
display_name="xAI API Key",
|
69
|
+
info="The xAI API Key to use for the model.",
|
70
|
+
advanced=False,
|
71
|
+
value="XAI_API_KEY",
|
72
|
+
required=True,
|
73
|
+
),
|
74
|
+
SliderInput(
|
75
|
+
name="temperature",
|
76
|
+
display_name="Temperature",
|
77
|
+
value=0.1,
|
78
|
+
range_spec=RangeSpec(min=0, max=2, step=0.01),
|
79
|
+
advanced=True,
|
80
|
+
),
|
81
|
+
IntInput(
|
82
|
+
name="seed",
|
83
|
+
display_name="Seed",
|
84
|
+
info="The seed controls the reproducibility of the job.",
|
85
|
+
advanced=True,
|
86
|
+
value=1,
|
87
|
+
),
|
88
|
+
]
|
89
|
+
|
90
|
+
def get_models(self) -> list[str]:
|
91
|
+
"""Fetch available models from xAI API."""
|
92
|
+
if not self.api_key:
|
93
|
+
return XAI_DEFAULT_MODELS
|
94
|
+
|
95
|
+
base_url = self.base_url or "https://api.x.ai/v1"
|
96
|
+
url = f"{base_url}/language-models"
|
97
|
+
headers = {"Authorization": f"Bearer {self.api_key}", "Accept": "application/json"}
|
98
|
+
|
99
|
+
try:
|
100
|
+
response = requests.get(url, headers=headers, timeout=10)
|
101
|
+
response.raise_for_status()
|
102
|
+
data = response.json()
|
103
|
+
|
104
|
+
# Extract model IDs and any aliases
|
105
|
+
models = set()
|
106
|
+
for model in data.get("models", []):
|
107
|
+
models.add(model["id"])
|
108
|
+
models.update(model.get("aliases", []))
|
109
|
+
|
110
|
+
return sorted(models) if models else XAI_DEFAULT_MODELS
|
111
|
+
except requests.RequestException as e:
|
112
|
+
self.status = f"Error fetching models: {e}"
|
113
|
+
return XAI_DEFAULT_MODELS
|
114
|
+
|
115
|
+
@override
|
116
|
+
def update_build_config(self, build_config: dict, field_value: str, field_name: str | None = None):
|
117
|
+
"""Update build configuration with fresh model list when key fields change."""
|
118
|
+
if field_name in {"api_key", "base_url", "model_name"}:
|
119
|
+
models = self.get_models()
|
120
|
+
build_config["model_name"]["options"] = models
|
121
|
+
return build_config
|
122
|
+
|
123
|
+
def build_model(self) -> LanguageModel:
|
124
|
+
api_key = self.api_key
|
125
|
+
temperature = self.temperature
|
126
|
+
model_name: str = self.model_name
|
127
|
+
max_tokens = self.max_tokens
|
128
|
+
model_kwargs = self.model_kwargs or {}
|
129
|
+
base_url = self.base_url or "https://api.x.ai/v1"
|
130
|
+
json_mode = self.json_mode
|
131
|
+
seed = self.seed
|
132
|
+
|
133
|
+
api_key = SecretStr(api_key).get_secret_value() if api_key else None
|
134
|
+
|
135
|
+
output = ChatOpenAI(
|
136
|
+
max_tokens=max_tokens or None,
|
137
|
+
model_kwargs=model_kwargs,
|
138
|
+
model=model_name,
|
139
|
+
base_url=base_url,
|
140
|
+
api_key=api_key,
|
141
|
+
temperature=temperature if temperature is not None else 0.1,
|
142
|
+
seed=seed,
|
143
|
+
)
|
144
|
+
|
145
|
+
if json_mode:
|
146
|
+
output = output.bind(response_format={"type": "json_object"})
|
147
|
+
|
148
|
+
return output
|
149
|
+
|
150
|
+
def _get_exception_message(self, e: Exception):
|
151
|
+
"""Get a message from an xAI exception.
|
152
|
+
|
153
|
+
Args:
|
154
|
+
e (Exception): The exception to get the message from.
|
155
|
+
|
156
|
+
Returns:
|
157
|
+
str: The message from the exception.
|
158
|
+
"""
|
159
|
+
try:
|
160
|
+
from openai import BadRequestError
|
161
|
+
except ImportError:
|
162
|
+
return None
|
163
|
+
if isinstance(e, BadRequestError):
|
164
|
+
message = e.body.get("message")
|
165
|
+
if message:
|
166
|
+
return message
|
167
|
+
return None
|
@@ -0,0 +1,137 @@
|
|
1
|
+
import ast
|
2
|
+
import pprint
|
3
|
+
from enum import Enum
|
4
|
+
|
5
|
+
import yfinance as yf
|
6
|
+
from langchain_core.tools import ToolException
|
7
|
+
from pydantic import BaseModel, Field
|
8
|
+
|
9
|
+
from lfx.custom.custom_component.component import Component
|
10
|
+
from lfx.inputs.inputs import DropdownInput, IntInput, MessageTextInput
|
11
|
+
from lfx.io import Output
|
12
|
+
from lfx.log.logger import logger
|
13
|
+
from lfx.schema.data import Data
|
14
|
+
from lfx.schema.dataframe import DataFrame
|
15
|
+
|
16
|
+
|
17
|
+
class YahooFinanceMethod(Enum):
|
18
|
+
GET_INFO = "get_info"
|
19
|
+
GET_NEWS = "get_news"
|
20
|
+
GET_ACTIONS = "get_actions"
|
21
|
+
GET_ANALYSIS = "get_analysis"
|
22
|
+
GET_BALANCE_SHEET = "get_balance_sheet"
|
23
|
+
GET_CALENDAR = "get_calendar"
|
24
|
+
GET_CASHFLOW = "get_cashflow"
|
25
|
+
GET_INSTITUTIONAL_HOLDERS = "get_institutional_holders"
|
26
|
+
GET_RECOMMENDATIONS = "get_recommendations"
|
27
|
+
GET_SUSTAINABILITY = "get_sustainability"
|
28
|
+
GET_MAJOR_HOLDERS = "get_major_holders"
|
29
|
+
GET_MUTUALFUND_HOLDERS = "get_mutualfund_holders"
|
30
|
+
GET_INSIDER_PURCHASES = "get_insider_purchases"
|
31
|
+
GET_INSIDER_TRANSACTIONS = "get_insider_transactions"
|
32
|
+
GET_INSIDER_ROSTER_HOLDERS = "get_insider_roster_holders"
|
33
|
+
GET_DIVIDENDS = "get_dividends"
|
34
|
+
GET_CAPITAL_GAINS = "get_capital_gains"
|
35
|
+
GET_SPLITS = "get_splits"
|
36
|
+
GET_SHARES = "get_shares"
|
37
|
+
GET_FAST_INFO = "get_fast_info"
|
38
|
+
GET_SEC_FILINGS = "get_sec_filings"
|
39
|
+
GET_RECOMMENDATIONS_SUMMARY = "get_recommendations_summary"
|
40
|
+
GET_UPGRADES_DOWNGRADES = "get_upgrades_downgrades"
|
41
|
+
GET_EARNINGS = "get_earnings"
|
42
|
+
GET_INCOME_STMT = "get_income_stmt"
|
43
|
+
|
44
|
+
|
45
|
+
class YahooFinanceSchema(BaseModel):
|
46
|
+
symbol: str = Field(..., description="The stock symbol to retrieve data for.")
|
47
|
+
method: YahooFinanceMethod = Field(YahooFinanceMethod.GET_INFO, description="The type of data to retrieve.")
|
48
|
+
num_news: int | None = Field(5, description="The number of news articles to retrieve.")
|
49
|
+
|
50
|
+
|
51
|
+
class YfinanceComponent(Component):
|
52
|
+
display_name = "Yahoo! Finance"
|
53
|
+
description = """Uses [yfinance](https://pypi.org/project/yfinance/) (unofficial package) \
|
54
|
+
to access financial data and market information from Yahoo! Finance."""
|
55
|
+
icon = "trending-up"
|
56
|
+
|
57
|
+
inputs = [
|
58
|
+
MessageTextInput(
|
59
|
+
name="symbol",
|
60
|
+
display_name="Stock Symbol",
|
61
|
+
info="The stock symbol to retrieve data for (e.g., AAPL, GOOG).",
|
62
|
+
tool_mode=True,
|
63
|
+
),
|
64
|
+
DropdownInput(
|
65
|
+
name="method",
|
66
|
+
display_name="Data Method",
|
67
|
+
info="The type of data to retrieve.",
|
68
|
+
options=list(YahooFinanceMethod),
|
69
|
+
value="get_news",
|
70
|
+
),
|
71
|
+
IntInput(
|
72
|
+
name="num_news",
|
73
|
+
display_name="Number of News",
|
74
|
+
info="The number of news articles to retrieve (only applicable for get_news).",
|
75
|
+
value=5,
|
76
|
+
),
|
77
|
+
]
|
78
|
+
|
79
|
+
outputs = [
|
80
|
+
Output(display_name="DataFrame", name="dataframe", method="fetch_content_dataframe"),
|
81
|
+
]
|
82
|
+
|
83
|
+
def run_model(self) -> DataFrame:
|
84
|
+
return self.fetch_content_dataframe()
|
85
|
+
|
86
|
+
def _fetch_yfinance_data(self, ticker: yf.Ticker, method: YahooFinanceMethod, num_news: int | None) -> str:
|
87
|
+
try:
|
88
|
+
if method == YahooFinanceMethod.GET_INFO:
|
89
|
+
result = ticker.info
|
90
|
+
elif method == YahooFinanceMethod.GET_NEWS:
|
91
|
+
result = ticker.news[:num_news]
|
92
|
+
else:
|
93
|
+
result = getattr(ticker, method.value)()
|
94
|
+
return pprint.pformat(result)
|
95
|
+
except Exception as e:
|
96
|
+
error_message = f"Error retrieving data: {e}"
|
97
|
+
logger.debug(error_message)
|
98
|
+
self.status = error_message
|
99
|
+
raise ToolException(error_message) from e
|
100
|
+
|
101
|
+
def fetch_content(self) -> list[Data]:
|
102
|
+
try:
|
103
|
+
return self._yahoo_finance_tool(
|
104
|
+
self.symbol,
|
105
|
+
YahooFinanceMethod(self.method),
|
106
|
+
self.num_news,
|
107
|
+
)
|
108
|
+
except ToolException:
|
109
|
+
raise
|
110
|
+
except Exception as e:
|
111
|
+
error_message = f"Unexpected error: {e}"
|
112
|
+
logger.debug(error_message)
|
113
|
+
self.status = error_message
|
114
|
+
raise ToolException(error_message) from e
|
115
|
+
|
116
|
+
def _yahoo_finance_tool(
|
117
|
+
self,
|
118
|
+
symbol: str,
|
119
|
+
method: YahooFinanceMethod,
|
120
|
+
num_news: int | None = 5,
|
121
|
+
) -> list[Data]:
|
122
|
+
ticker = yf.Ticker(symbol)
|
123
|
+
result = self._fetch_yfinance_data(ticker, method, num_news)
|
124
|
+
|
125
|
+
if method == YahooFinanceMethod.GET_NEWS:
|
126
|
+
data_list = [
|
127
|
+
Data(text=f"{article['title']}: {article['link']}", data=article)
|
128
|
+
for article in ast.literal_eval(result)
|
129
|
+
]
|
130
|
+
else:
|
131
|
+
data_list = [Data(text=result, data={"result": result})]
|
132
|
+
|
133
|
+
return data_list
|
134
|
+
|
135
|
+
def fetch_content_dataframe(self) -> DataFrame:
|
136
|
+
data = self.fetch_content()
|
137
|
+
return DataFrame(data)
|
@@ -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 .channel import YouTubeChannelComponent
|
9
|
+
from .comments import YouTubeCommentsComponent
|
10
|
+
from .playlist import YouTubePlaylistComponent
|
11
|
+
from .search import YouTubeSearchComponent
|
12
|
+
from .trending import YouTubeTrendingComponent
|
13
|
+
from .video_details import YouTubeVideoDetailsComponent
|
14
|
+
from .youtube_transcripts import YouTubeTranscriptsComponent
|
15
|
+
|
16
|
+
_dynamic_imports = {
|
17
|
+
"YouTubeChannelComponent": "channel",
|
18
|
+
"YouTubeCommentsComponent": "comments",
|
19
|
+
"YouTubePlaylistComponent": "playlist",
|
20
|
+
"YouTubeSearchComponent": "search",
|
21
|
+
"YouTubeTranscriptsComponent": "youtube_transcripts",
|
22
|
+
"YouTubeTrendingComponent": "trending",
|
23
|
+
"YouTubeVideoDetailsComponent": "video_details",
|
24
|
+
}
|
25
|
+
|
26
|
+
__all__ = [
|
27
|
+
"YouTubeChannelComponent",
|
28
|
+
"YouTubeCommentsComponent",
|
29
|
+
"YouTubePlaylistComponent",
|
30
|
+
"YouTubeSearchComponent",
|
31
|
+
"YouTubeTranscriptsComponent",
|
32
|
+
"YouTubeTrendingComponent",
|
33
|
+
"YouTubeVideoDetailsComponent",
|
34
|
+
]
|
35
|
+
|
36
|
+
|
37
|
+
def __getattr__(attr_name: str) -> Any:
|
38
|
+
"""Lazily import youtube 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__)
|
@@ -0,0 +1,227 @@
|
|
1
|
+
from typing import Any
|
2
|
+
from urllib.error import HTTPError
|
3
|
+
|
4
|
+
import pandas as pd
|
5
|
+
from googleapiclient.discovery import build
|
6
|
+
from googleapiclient.errors import HttpError
|
7
|
+
|
8
|
+
from lfx.custom.custom_component.component import Component
|
9
|
+
from lfx.inputs.inputs import BoolInput, MessageTextInput, SecretStrInput
|
10
|
+
from lfx.schema.dataframe import DataFrame
|
11
|
+
from lfx.template.field.base import Output
|
12
|
+
|
13
|
+
|
14
|
+
class YouTubeChannelComponent(Component):
|
15
|
+
"""A component that retrieves detailed information about YouTube channels."""
|
16
|
+
|
17
|
+
display_name: str = "YouTube Channel"
|
18
|
+
description: str = "Retrieves detailed information and statistics about YouTube channels as a DataFrame."
|
19
|
+
icon: str = "YouTube"
|
20
|
+
|
21
|
+
# Constants
|
22
|
+
CHANNEL_ID_LENGTH = 24
|
23
|
+
QUOTA_EXCEEDED_STATUS = 403
|
24
|
+
NOT_FOUND_STATUS = 404
|
25
|
+
MAX_PLAYLIST_RESULTS = 10
|
26
|
+
|
27
|
+
inputs = [
|
28
|
+
MessageTextInput(
|
29
|
+
name="channel_url",
|
30
|
+
display_name="Channel URL or ID",
|
31
|
+
info="The URL or ID of the YouTube channel.",
|
32
|
+
tool_mode=True,
|
33
|
+
required=True,
|
34
|
+
),
|
35
|
+
SecretStrInput(
|
36
|
+
name="api_key",
|
37
|
+
display_name="YouTube API Key",
|
38
|
+
info="Your YouTube Data API key.",
|
39
|
+
required=True,
|
40
|
+
),
|
41
|
+
BoolInput(
|
42
|
+
name="include_statistics",
|
43
|
+
display_name="Include Statistics",
|
44
|
+
value=True,
|
45
|
+
info="Include channel statistics (views, subscribers, videos).",
|
46
|
+
),
|
47
|
+
BoolInput(
|
48
|
+
name="include_branding",
|
49
|
+
display_name="Include Branding",
|
50
|
+
value=True,
|
51
|
+
info="Include channel branding settings (banner, thumbnails).",
|
52
|
+
advanced=True,
|
53
|
+
),
|
54
|
+
BoolInput(
|
55
|
+
name="include_playlists",
|
56
|
+
display_name="Include Playlists",
|
57
|
+
value=False,
|
58
|
+
info="Include channel's public playlists.",
|
59
|
+
advanced=True,
|
60
|
+
),
|
61
|
+
]
|
62
|
+
|
63
|
+
outputs = [
|
64
|
+
Output(name="channel_df", display_name="Channel Info", method="get_channel_info"),
|
65
|
+
]
|
66
|
+
|
67
|
+
def _extract_channel_id(self, channel_url: str) -> str:
|
68
|
+
"""Extracts the channel ID from various YouTube channel URL formats."""
|
69
|
+
import re
|
70
|
+
|
71
|
+
if channel_url.startswith("UC") and len(channel_url) == self.CHANNEL_ID_LENGTH:
|
72
|
+
return channel_url
|
73
|
+
|
74
|
+
patterns = {
|
75
|
+
"custom_url": r"youtube\.com\/c\/([^\/\n?]+)",
|
76
|
+
"channel_id": r"youtube\.com\/channel\/([^\/\n?]+)",
|
77
|
+
"user": r"youtube\.com\/user\/([^\/\n?]+)",
|
78
|
+
"handle": r"youtube\.com\/@([^\/\n?]+)",
|
79
|
+
}
|
80
|
+
|
81
|
+
for pattern_type, pattern in patterns.items():
|
82
|
+
match = re.search(pattern, channel_url)
|
83
|
+
if match:
|
84
|
+
if pattern_type == "channel_id":
|
85
|
+
return match.group(1)
|
86
|
+
return self._get_channel_id_by_name(match.group(1), pattern_type)
|
87
|
+
|
88
|
+
return channel_url
|
89
|
+
|
90
|
+
def _get_channel_id_by_name(self, channel_name: str, identifier_type: str) -> str:
|
91
|
+
"""Gets the channel ID using the channel name or custom URL."""
|
92
|
+
youtube = None
|
93
|
+
try:
|
94
|
+
youtube = build("youtube", "v3", developerKey=self.api_key)
|
95
|
+
|
96
|
+
if identifier_type == "handle":
|
97
|
+
channel_name = channel_name.lstrip("@")
|
98
|
+
|
99
|
+
request = youtube.search().list(part="id", q=channel_name, type="channel", maxResults=1)
|
100
|
+
response = request.execute()
|
101
|
+
|
102
|
+
if response["items"]:
|
103
|
+
return response["items"][0]["id"]["channelId"]
|
104
|
+
|
105
|
+
error_msg = f"Could not find channel ID for: {channel_name}"
|
106
|
+
raise ValueError(error_msg)
|
107
|
+
|
108
|
+
except (HttpError, HTTPError) as e:
|
109
|
+
error_msg = f"YouTube API error while getting channel ID: {e!s}"
|
110
|
+
raise RuntimeError(error_msg) from e
|
111
|
+
except Exception as e:
|
112
|
+
error_msg = f"Unexpected error while getting channel ID: {e!s}"
|
113
|
+
raise ValueError(error_msg) from e
|
114
|
+
finally:
|
115
|
+
if youtube:
|
116
|
+
youtube.close()
|
117
|
+
|
118
|
+
def _get_channel_playlists(self, youtube: Any, channel_id: str) -> list[dict[str, Any]]:
|
119
|
+
"""Gets the public playlists for a channel."""
|
120
|
+
try:
|
121
|
+
playlists_request = youtube.playlists().list(
|
122
|
+
part="snippet,contentDetails",
|
123
|
+
channelId=channel_id,
|
124
|
+
maxResults=self.MAX_PLAYLIST_RESULTS,
|
125
|
+
)
|
126
|
+
playlists_response = playlists_request.execute()
|
127
|
+
playlists = []
|
128
|
+
|
129
|
+
for item in playlists_response.get("items", []):
|
130
|
+
playlist_data = {
|
131
|
+
"playlist_title": item["snippet"]["title"],
|
132
|
+
"playlist_description": item["snippet"]["description"],
|
133
|
+
"playlist_id": item["id"],
|
134
|
+
"playlist_video_count": item["contentDetails"]["itemCount"],
|
135
|
+
"playlist_published_at": item["snippet"]["publishedAt"],
|
136
|
+
"playlist_thumbnail_url": item["snippet"]["thumbnails"]["default"]["url"],
|
137
|
+
}
|
138
|
+
playlists.append(playlist_data)
|
139
|
+
|
140
|
+
return playlists
|
141
|
+
except (HttpError, HTTPError) as e:
|
142
|
+
return [{"error": str(e)}]
|
143
|
+
else:
|
144
|
+
return playlists
|
145
|
+
|
146
|
+
def get_channel_info(self) -> DataFrame:
|
147
|
+
"""Retrieves channel information and returns it as a DataFrame."""
|
148
|
+
youtube = None
|
149
|
+
try:
|
150
|
+
# Get channel ID and initialize YouTube API client
|
151
|
+
channel_id = self._extract_channel_id(self.channel_url)
|
152
|
+
youtube = build("youtube", "v3", developerKey=self.api_key)
|
153
|
+
|
154
|
+
# Prepare parts for the API request
|
155
|
+
parts = ["snippet", "contentDetails"]
|
156
|
+
if self.include_statistics:
|
157
|
+
parts.append("statistics")
|
158
|
+
if self.include_branding:
|
159
|
+
parts.append("brandingSettings")
|
160
|
+
|
161
|
+
# Get channel information
|
162
|
+
channel_response = youtube.channels().list(part=",".join(parts), id=channel_id).execute()
|
163
|
+
|
164
|
+
if not channel_response["items"]:
|
165
|
+
return DataFrame(pd.DataFrame({"error": ["Channel not found"]}))
|
166
|
+
|
167
|
+
channel_info = channel_response["items"][0]
|
168
|
+
|
169
|
+
# Build basic channel data
|
170
|
+
channel_data = {
|
171
|
+
"title": [channel_info["snippet"]["title"]],
|
172
|
+
"description": [channel_info["snippet"]["description"]],
|
173
|
+
"custom_url": [channel_info["snippet"].get("customUrl", "")],
|
174
|
+
"published_at": [channel_info["snippet"]["publishedAt"]],
|
175
|
+
"country": [channel_info["snippet"].get("country", "Not specified")],
|
176
|
+
"channel_id": [channel_id],
|
177
|
+
}
|
178
|
+
|
179
|
+
# Add thumbnails
|
180
|
+
for size, thumb in channel_info["snippet"]["thumbnails"].items():
|
181
|
+
channel_data[f"thumbnail_{size}"] = [thumb["url"]]
|
182
|
+
|
183
|
+
# Add statistics if requested
|
184
|
+
if self.include_statistics:
|
185
|
+
stats = channel_info["statistics"]
|
186
|
+
channel_data.update(
|
187
|
+
{
|
188
|
+
"view_count": [int(stats.get("viewCount", 0))],
|
189
|
+
"subscriber_count": [int(stats.get("subscriberCount", 0))],
|
190
|
+
"hidden_subscriber_count": [stats.get("hiddenSubscriberCount", False)],
|
191
|
+
"video_count": [int(stats.get("videoCount", 0))],
|
192
|
+
}
|
193
|
+
)
|
194
|
+
|
195
|
+
# Add branding if requested
|
196
|
+
if self.include_branding:
|
197
|
+
branding = channel_info.get("brandingSettings", {})
|
198
|
+
channel_data.update(
|
199
|
+
{
|
200
|
+
"brand_title": [branding.get("channel", {}).get("title", "")],
|
201
|
+
"brand_description": [branding.get("channel", {}).get("description", "")],
|
202
|
+
"brand_keywords": [branding.get("channel", {}).get("keywords", "")],
|
203
|
+
"brand_banner_url": [branding.get("image", {}).get("bannerExternalUrl", "")],
|
204
|
+
}
|
205
|
+
)
|
206
|
+
|
207
|
+
# Create the initial DataFrame
|
208
|
+
channel_df = pd.DataFrame(channel_data)
|
209
|
+
|
210
|
+
# Add playlists if requested
|
211
|
+
if self.include_playlists:
|
212
|
+
playlists = self._get_channel_playlists(youtube, channel_id)
|
213
|
+
if playlists and "error" not in playlists[0]:
|
214
|
+
# Create a DataFrame for playlists
|
215
|
+
playlists_df = pd.DataFrame(playlists)
|
216
|
+
# Join with main DataFrame
|
217
|
+
channel_df = pd.concat([channel_df] * len(playlists_df), ignore_index=True)
|
218
|
+
for column in playlists_df.columns:
|
219
|
+
channel_df[column] = playlists_df[column].to_numpy()
|
220
|
+
|
221
|
+
return DataFrame(channel_df)
|
222
|
+
|
223
|
+
except (HttpError, HTTPError) as e:
|
224
|
+
return DataFrame(pd.DataFrame({"error": [str(e)]}))
|
225
|
+
finally:
|
226
|
+
if youtube:
|
227
|
+
youtube.close()
|