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,89 @@
|
|
1
|
+
import json
|
2
|
+
import re
|
3
|
+
from pathlib import Path
|
4
|
+
|
5
|
+
from google.auth.transport.requests import Request
|
6
|
+
from google.oauth2.credentials import Credentials
|
7
|
+
from google_auth_oauthlib.flow import InstalledAppFlow
|
8
|
+
|
9
|
+
from lfx.custom.custom_component.component import Component
|
10
|
+
from lfx.io import FileInput, MultilineInput, Output
|
11
|
+
from lfx.schema.data import Data
|
12
|
+
|
13
|
+
|
14
|
+
class GoogleOAuthToken(Component):
|
15
|
+
display_name = "Google OAuth Token"
|
16
|
+
description = "Generates a JSON string with your Google OAuth token."
|
17
|
+
documentation: str = "https://developers.google.com/identity/protocols/oauth2/web-server?hl=pt-br#python_1"
|
18
|
+
icon = "Google"
|
19
|
+
name = "GoogleOAuthToken"
|
20
|
+
legacy: bool = True
|
21
|
+
inputs = [
|
22
|
+
MultilineInput(
|
23
|
+
name="scopes",
|
24
|
+
display_name="Scopes",
|
25
|
+
info="Input scopes for your application.",
|
26
|
+
required=True,
|
27
|
+
),
|
28
|
+
FileInput(
|
29
|
+
name="oauth_credentials",
|
30
|
+
display_name="Credentials File",
|
31
|
+
info="Input OAuth Credentials file (e.g. credentials.json).",
|
32
|
+
file_types=["json"],
|
33
|
+
required=True,
|
34
|
+
),
|
35
|
+
]
|
36
|
+
|
37
|
+
outputs = [
|
38
|
+
Output(display_name="Output", name="output", method="build_output"),
|
39
|
+
]
|
40
|
+
|
41
|
+
def validate_scopes(self, scopes):
|
42
|
+
pattern = (
|
43
|
+
r"^(https://www\.googleapis\.com/auth/[\w\.\-]+"
|
44
|
+
r"|mail\.google\.com/"
|
45
|
+
r"|www\.google\.com/calendar/feeds"
|
46
|
+
r"|www\.google\.com/m8/feeds)"
|
47
|
+
r"(,\s*https://www\.googleapis\.com/auth/[\w\.\-]+"
|
48
|
+
r"|mail\.google\.com/"
|
49
|
+
r"|www\.google\.com/calendar/feeds"
|
50
|
+
r"|www\.google\.com/m8/feeds)*$"
|
51
|
+
)
|
52
|
+
if not re.match(pattern, scopes):
|
53
|
+
error_message = "Invalid scope format."
|
54
|
+
raise ValueError(error_message)
|
55
|
+
|
56
|
+
def build_output(self) -> Data:
|
57
|
+
self.validate_scopes(self.scopes)
|
58
|
+
|
59
|
+
user_scopes = [scope.strip() for scope in self.scopes.split(",")]
|
60
|
+
if self.scopes:
|
61
|
+
scopes = user_scopes
|
62
|
+
else:
|
63
|
+
error_message = "Incorrect scope, check the scopes field."
|
64
|
+
raise ValueError(error_message)
|
65
|
+
|
66
|
+
creds = None
|
67
|
+
token_path = Path("token.json")
|
68
|
+
|
69
|
+
if token_path.exists():
|
70
|
+
creds = Credentials.from_authorized_user_file(str(token_path), scopes)
|
71
|
+
|
72
|
+
if not creds or not creds.valid:
|
73
|
+
if creds and creds.expired and creds.refresh_token:
|
74
|
+
creds.refresh(Request())
|
75
|
+
else:
|
76
|
+
if self.oauth_credentials:
|
77
|
+
client_secret_file = self.oauth_credentials
|
78
|
+
else:
|
79
|
+
error_message = "OAuth 2.0 Credentials file not provided."
|
80
|
+
raise ValueError(error_message)
|
81
|
+
|
82
|
+
flow = InstalledAppFlow.from_client_secrets_file(client_secret_file, scopes)
|
83
|
+
creds = flow.run_local_server(port=0)
|
84
|
+
|
85
|
+
token_path.write_text(creds.to_json(), encoding="utf-8")
|
86
|
+
|
87
|
+
creds_json = json.loads(creds.to_json())
|
88
|
+
|
89
|
+
return Data(data=creds_json)
|
@@ -0,0 +1,68 @@
|
|
1
|
+
from langchain_google_community import GoogleSearchAPIWrapper
|
2
|
+
|
3
|
+
from lfx.custom.custom_component.component import Component
|
4
|
+
from lfx.io import IntInput, MultilineInput, Output, SecretStrInput
|
5
|
+
from lfx.schema.dataframe import DataFrame
|
6
|
+
|
7
|
+
|
8
|
+
class GoogleSearchAPICore(Component):
|
9
|
+
display_name = "Google Search API"
|
10
|
+
description = "Call Google Search API and return results as a DataFrame."
|
11
|
+
icon = "Google"
|
12
|
+
|
13
|
+
inputs = [
|
14
|
+
SecretStrInput(
|
15
|
+
name="google_api_key",
|
16
|
+
display_name="Google API Key",
|
17
|
+
required=True,
|
18
|
+
),
|
19
|
+
SecretStrInput(
|
20
|
+
name="google_cse_id",
|
21
|
+
display_name="Google CSE ID",
|
22
|
+
required=True,
|
23
|
+
),
|
24
|
+
MultilineInput(
|
25
|
+
name="input_value",
|
26
|
+
display_name="Input",
|
27
|
+
tool_mode=True,
|
28
|
+
),
|
29
|
+
IntInput(
|
30
|
+
name="k",
|
31
|
+
display_name="Number of results",
|
32
|
+
value=4,
|
33
|
+
required=True,
|
34
|
+
),
|
35
|
+
]
|
36
|
+
|
37
|
+
outputs = [
|
38
|
+
Output(
|
39
|
+
display_name="Results",
|
40
|
+
name="results",
|
41
|
+
type_=DataFrame,
|
42
|
+
method="search_google",
|
43
|
+
),
|
44
|
+
]
|
45
|
+
|
46
|
+
def search_google(self) -> DataFrame:
|
47
|
+
"""Search Google using the provided query."""
|
48
|
+
if not self.google_api_key:
|
49
|
+
return DataFrame([{"error": "Invalid Google API Key"}])
|
50
|
+
|
51
|
+
if not self.google_cse_id:
|
52
|
+
return DataFrame([{"error": "Invalid Google CSE ID"}])
|
53
|
+
|
54
|
+
try:
|
55
|
+
wrapper = GoogleSearchAPIWrapper(
|
56
|
+
google_api_key=self.google_api_key, google_cse_id=self.google_cse_id, k=self.k
|
57
|
+
)
|
58
|
+
results = wrapper.results(query=self.input_value, num_results=self.k)
|
59
|
+
return DataFrame(results)
|
60
|
+
except (ValueError, KeyError) as e:
|
61
|
+
return DataFrame([{"error": f"Invalid configuration: {e!s}"}])
|
62
|
+
except ConnectionError as e:
|
63
|
+
return DataFrame([{"error": f"Connection error: {e!s}"}])
|
64
|
+
except RuntimeError as e:
|
65
|
+
return DataFrame([{"error": f"Error occurred while searching: {e!s}"}])
|
66
|
+
|
67
|
+
def build(self):
|
68
|
+
return self.search_google
|
@@ -0,0 +1,74 @@
|
|
1
|
+
from langchain_community.utilities.google_serper import GoogleSerperAPIWrapper
|
2
|
+
|
3
|
+
from lfx.custom.custom_component.component import Component
|
4
|
+
from lfx.io import IntInput, MultilineInput, Output, SecretStrInput
|
5
|
+
from lfx.schema.dataframe import DataFrame
|
6
|
+
from lfx.schema.message import Message
|
7
|
+
|
8
|
+
|
9
|
+
class GoogleSerperAPICore(Component):
|
10
|
+
display_name = "Google Serper API"
|
11
|
+
description = "Call the Serper.dev Google Search API."
|
12
|
+
icon = "Serper"
|
13
|
+
|
14
|
+
inputs = [
|
15
|
+
SecretStrInput(
|
16
|
+
name="serper_api_key",
|
17
|
+
display_name="Serper API Key",
|
18
|
+
required=True,
|
19
|
+
),
|
20
|
+
MultilineInput(
|
21
|
+
name="input_value",
|
22
|
+
display_name="Input",
|
23
|
+
tool_mode=True,
|
24
|
+
),
|
25
|
+
IntInput(
|
26
|
+
name="k",
|
27
|
+
display_name="Number of results",
|
28
|
+
value=4,
|
29
|
+
required=True,
|
30
|
+
),
|
31
|
+
]
|
32
|
+
|
33
|
+
outputs = [
|
34
|
+
Output(
|
35
|
+
display_name="Results",
|
36
|
+
name="results",
|
37
|
+
type_=DataFrame,
|
38
|
+
method="search_serper",
|
39
|
+
),
|
40
|
+
]
|
41
|
+
|
42
|
+
def search_serper(self) -> DataFrame:
|
43
|
+
try:
|
44
|
+
wrapper = self._build_wrapper()
|
45
|
+
results = wrapper.results(query=self.input_value)
|
46
|
+
list_results = results.get("organic", [])
|
47
|
+
|
48
|
+
# Convert results to DataFrame using list comprehension
|
49
|
+
df_data = [
|
50
|
+
{
|
51
|
+
"title": result.get("title", ""),
|
52
|
+
"link": result.get("link", ""),
|
53
|
+
"snippet": result.get("snippet", ""),
|
54
|
+
}
|
55
|
+
for result in list_results
|
56
|
+
]
|
57
|
+
|
58
|
+
return DataFrame(df_data)
|
59
|
+
except (ValueError, KeyError, ConnectionError) as e:
|
60
|
+
error_message = f"Error occurred while searching: {e!s}"
|
61
|
+
self.status = error_message
|
62
|
+
# Return DataFrame with error as a list of dictionaries
|
63
|
+
return DataFrame([{"error": error_message}])
|
64
|
+
|
65
|
+
def text_search_serper(self) -> Message:
|
66
|
+
search_results = self.search_serper()
|
67
|
+
text_result = search_results.to_string(index=False) if not search_results.empty else "No results found."
|
68
|
+
return Message(text=text_result)
|
69
|
+
|
70
|
+
def _build_wrapper(self):
|
71
|
+
return GoogleSerperAPIWrapper(serper_api_key=self.serper_api_key, k=self.k)
|
72
|
+
|
73
|
+
def build(self):
|
74
|
+
return self.search_serper
|
@@ -0,0 +1,34 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
from typing import TYPE_CHECKING, Any
|
4
|
+
|
5
|
+
from lfx.components._importing import import_mod
|
6
|
+
|
7
|
+
if TYPE_CHECKING:
|
8
|
+
from .groq import GroqModel
|
9
|
+
|
10
|
+
_dynamic_imports = {
|
11
|
+
"GroqModel": "groq",
|
12
|
+
}
|
13
|
+
|
14
|
+
__all__ = [
|
15
|
+
"GroqModel",
|
16
|
+
]
|
17
|
+
|
18
|
+
|
19
|
+
def __getattr__(attr_name: str) -> Any:
|
20
|
+
"""Lazily import groq components on attribute access."""
|
21
|
+
if attr_name not in _dynamic_imports:
|
22
|
+
msg = f"module '{__name__}' has no attribute '{attr_name}'"
|
23
|
+
raise AttributeError(msg)
|
24
|
+
try:
|
25
|
+
result = import_mod(attr_name, _dynamic_imports[attr_name], __spec__.parent)
|
26
|
+
except (ModuleNotFoundError, ImportError, AttributeError) as e:
|
27
|
+
msg = f"Could not import '{attr_name}' from '{__name__}': {e}"
|
28
|
+
raise AttributeError(msg) from e
|
29
|
+
globals()[attr_name] = result
|
30
|
+
return result
|
31
|
+
|
32
|
+
|
33
|
+
def __dir__() -> list[str]:
|
34
|
+
return list(__all__)
|
@@ -0,0 +1,136 @@
|
|
1
|
+
import requests
|
2
|
+
from pydantic.v1 import SecretStr
|
3
|
+
|
4
|
+
from lfx.base.models.groq_constants import GROQ_MODELS, TOOL_CALLING_UNSUPPORTED_GROQ_MODELS, UNSUPPORTED_GROQ_MODELS
|
5
|
+
from lfx.base.models.model import LCModelComponent
|
6
|
+
from lfx.field_typing import LanguageModel
|
7
|
+
from lfx.field_typing.range_spec import RangeSpec
|
8
|
+
from lfx.io import BoolInput, DropdownInput, IntInput, MessageTextInput, SecretStrInput, SliderInput
|
9
|
+
from lfx.log.logger import logger
|
10
|
+
|
11
|
+
|
12
|
+
class GroqModel(LCModelComponent):
|
13
|
+
display_name: str = "Groq"
|
14
|
+
description: str = "Generate text using Groq."
|
15
|
+
icon = "Groq"
|
16
|
+
name = "GroqModel"
|
17
|
+
|
18
|
+
inputs = [
|
19
|
+
*LCModelComponent.get_base_inputs(),
|
20
|
+
SecretStrInput(
|
21
|
+
name="api_key", display_name="Groq API Key", info="API key for the Groq API.", real_time_refresh=True
|
22
|
+
),
|
23
|
+
MessageTextInput(
|
24
|
+
name="base_url",
|
25
|
+
display_name="Groq API Base",
|
26
|
+
info="Base URL path for API requests, leave blank if not using a proxy or service emulator.",
|
27
|
+
advanced=True,
|
28
|
+
value="https://api.groq.com",
|
29
|
+
real_time_refresh=True,
|
30
|
+
),
|
31
|
+
IntInput(
|
32
|
+
name="max_tokens",
|
33
|
+
display_name="Max Output Tokens",
|
34
|
+
info="The maximum number of tokens to generate.",
|
35
|
+
advanced=True,
|
36
|
+
),
|
37
|
+
SliderInput(
|
38
|
+
name="temperature",
|
39
|
+
display_name="Temperature",
|
40
|
+
value=0.1,
|
41
|
+
info="Run inference with this temperature. Must by in the closed interval [0.0, 1.0].",
|
42
|
+
range_spec=RangeSpec(min=0, max=1, step=0.01),
|
43
|
+
advanced=True,
|
44
|
+
),
|
45
|
+
IntInput(
|
46
|
+
name="n",
|
47
|
+
display_name="N",
|
48
|
+
info="Number of chat completions to generate for each prompt. "
|
49
|
+
"Note that the API may not return the full n completions if duplicates are generated.",
|
50
|
+
advanced=True,
|
51
|
+
),
|
52
|
+
DropdownInput(
|
53
|
+
name="model_name",
|
54
|
+
display_name="Model",
|
55
|
+
info="The name of the model to use.",
|
56
|
+
options=GROQ_MODELS,
|
57
|
+
value=GROQ_MODELS[0],
|
58
|
+
refresh_button=True,
|
59
|
+
combobox=True,
|
60
|
+
),
|
61
|
+
BoolInput(
|
62
|
+
name="tool_model_enabled",
|
63
|
+
display_name="Enable Tool Models",
|
64
|
+
info=(
|
65
|
+
"Select if you want to use models that can work with tools. If yes, only those models will be shown."
|
66
|
+
),
|
67
|
+
advanced=False,
|
68
|
+
value=False,
|
69
|
+
real_time_refresh=True,
|
70
|
+
),
|
71
|
+
]
|
72
|
+
|
73
|
+
def get_models(self, *, tool_model_enabled: bool | None = None) -> list[str]:
|
74
|
+
try:
|
75
|
+
url = f"{self.base_url}/openai/v1/models"
|
76
|
+
headers = {"Authorization": f"Bearer {self.api_key}", "Content-Type": "application/json"}
|
77
|
+
|
78
|
+
response = requests.get(url, headers=headers, timeout=10)
|
79
|
+
response.raise_for_status()
|
80
|
+
model_list = response.json()
|
81
|
+
model_ids = [
|
82
|
+
model["id"] for model in model_list.get("data", []) if model["id"] not in UNSUPPORTED_GROQ_MODELS
|
83
|
+
]
|
84
|
+
except (ImportError, ValueError, requests.exceptions.RequestException) as e:
|
85
|
+
logger.exception(f"Error getting model names: {e}")
|
86
|
+
model_ids = GROQ_MODELS
|
87
|
+
if tool_model_enabled:
|
88
|
+
try:
|
89
|
+
from langchain_groq import ChatGroq
|
90
|
+
except ImportError as e:
|
91
|
+
msg = "langchain_groq is not installed. Please install it with `pip install langchain_groq`."
|
92
|
+
raise ImportError(msg) from e
|
93
|
+
for model in model_ids:
|
94
|
+
model_with_tool = ChatGroq(
|
95
|
+
model=model,
|
96
|
+
api_key=self.api_key,
|
97
|
+
base_url=self.base_url,
|
98
|
+
)
|
99
|
+
if not self.supports_tool_calling(model_with_tool) or model in TOOL_CALLING_UNSUPPORTED_GROQ_MODELS:
|
100
|
+
model_ids.remove(model)
|
101
|
+
return model_ids
|
102
|
+
return model_ids
|
103
|
+
|
104
|
+
def update_build_config(self, build_config: dict, field_value: str, field_name: str | None = None):
|
105
|
+
if field_name in {"base_url", "model_name", "tool_model_enabled", "api_key"} and field_value:
|
106
|
+
try:
|
107
|
+
if len(self.api_key) != 0:
|
108
|
+
try:
|
109
|
+
ids = self.get_models(tool_model_enabled=self.tool_model_enabled)
|
110
|
+
except (ImportError, ValueError, requests.exceptions.RequestException) as e:
|
111
|
+
logger.exception(f"Error getting model names: {e}")
|
112
|
+
ids = GROQ_MODELS
|
113
|
+
build_config.setdefault("model_name", {})
|
114
|
+
build_config["model_name"]["options"] = ids
|
115
|
+
build_config["model_name"].setdefault("value", ids[0])
|
116
|
+
except Exception as e:
|
117
|
+
msg = f"Error getting model names: {e}"
|
118
|
+
raise ValueError(msg) from e
|
119
|
+
return build_config
|
120
|
+
|
121
|
+
def build_model(self) -> LanguageModel: # type: ignore[type-var]
|
122
|
+
try:
|
123
|
+
from langchain_groq import ChatGroq
|
124
|
+
except ImportError as e:
|
125
|
+
msg = "langchain-groq is not installed. Please install it with `pip install langchain-groq`."
|
126
|
+
raise ImportError(msg) from e
|
127
|
+
|
128
|
+
return ChatGroq(
|
129
|
+
model=self.model_name,
|
130
|
+
max_tokens=self.max_tokens or None,
|
131
|
+
temperature=self.temperature,
|
132
|
+
base_url=self.base_url,
|
133
|
+
n=self.n or 1,
|
134
|
+
api_key=SecretStr(self.api_key).get_secret_value(),
|
135
|
+
streaming=self.stream,
|
136
|
+
)
|
@@ -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 lfx.components.helpers.calculator_core import CalculatorComponent
|
9
|
+
from lfx.components.helpers.create_list import CreateListComponent
|
10
|
+
from lfx.components.helpers.current_date import CurrentDateComponent
|
11
|
+
from lfx.components.helpers.id_generator import IDGeneratorComponent
|
12
|
+
from lfx.components.helpers.memory import MemoryComponent
|
13
|
+
from lfx.components.helpers.output_parser import OutputParserComponent
|
14
|
+
from lfx.components.helpers.store_message import MessageStoreComponent
|
15
|
+
|
16
|
+
_dynamic_imports = {
|
17
|
+
"CalculatorComponent": "calculator_core",
|
18
|
+
"CreateListComponent": "create_list",
|
19
|
+
"CurrentDateComponent": "current_date",
|
20
|
+
"IDGeneratorComponent": "id_generator",
|
21
|
+
"MemoryComponent": "memory",
|
22
|
+
"OutputParserComponent": "output_parser",
|
23
|
+
"MessageStoreComponent": "store_message",
|
24
|
+
}
|
25
|
+
|
26
|
+
__all__ = [
|
27
|
+
"CalculatorComponent",
|
28
|
+
"CreateListComponent",
|
29
|
+
"CurrentDateComponent",
|
30
|
+
"IDGeneratorComponent",
|
31
|
+
"MemoryComponent",
|
32
|
+
"MessageStoreComponent",
|
33
|
+
"OutputParserComponent",
|
34
|
+
]
|
35
|
+
|
36
|
+
|
37
|
+
def __getattr__(attr_name: str) -> Any:
|
38
|
+
"""Lazily import helper 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,89 @@
|
|
1
|
+
import ast
|
2
|
+
import operator
|
3
|
+
from collections.abc import Callable
|
4
|
+
|
5
|
+
from lfx.custom.custom_component.component import Component
|
6
|
+
from lfx.inputs.inputs import MessageTextInput
|
7
|
+
from lfx.io import Output
|
8
|
+
from lfx.schema.data import Data
|
9
|
+
|
10
|
+
|
11
|
+
class CalculatorComponent(Component):
|
12
|
+
display_name = "Calculator"
|
13
|
+
description = "Perform basic arithmetic operations on a given expression."
|
14
|
+
documentation: str = "https://docs.langflow.org/components-helpers#calculator"
|
15
|
+
icon = "calculator"
|
16
|
+
|
17
|
+
# Cache operators dictionary as a class variable
|
18
|
+
OPERATORS: dict[type[ast.operator], Callable] = {
|
19
|
+
ast.Add: operator.add,
|
20
|
+
ast.Sub: operator.sub,
|
21
|
+
ast.Mult: operator.mul,
|
22
|
+
ast.Div: operator.truediv,
|
23
|
+
ast.Pow: operator.pow,
|
24
|
+
}
|
25
|
+
|
26
|
+
inputs = [
|
27
|
+
MessageTextInput(
|
28
|
+
name="expression",
|
29
|
+
display_name="Expression",
|
30
|
+
info="The arithmetic expression to evaluate (e.g., '4*4*(33/22)+12-20').",
|
31
|
+
tool_mode=True,
|
32
|
+
),
|
33
|
+
]
|
34
|
+
|
35
|
+
outputs = [
|
36
|
+
Output(display_name="Data", name="result", type_=Data, method="evaluate_expression"),
|
37
|
+
]
|
38
|
+
|
39
|
+
def _eval_expr(self, node: ast.AST) -> float:
|
40
|
+
"""Evaluate an AST node recursively."""
|
41
|
+
if isinstance(node, ast.Constant):
|
42
|
+
if isinstance(node.value, int | float):
|
43
|
+
return float(node.value)
|
44
|
+
error_msg = f"Unsupported constant type: {type(node.value).__name__}"
|
45
|
+
raise TypeError(error_msg)
|
46
|
+
if isinstance(node, ast.Num): # For backwards compatibility
|
47
|
+
if isinstance(node.n, int | float):
|
48
|
+
return float(node.n)
|
49
|
+
error_msg = f"Unsupported number type: {type(node.n).__name__}"
|
50
|
+
raise TypeError(error_msg)
|
51
|
+
|
52
|
+
if isinstance(node, ast.BinOp):
|
53
|
+
op_type = type(node.op)
|
54
|
+
if op_type not in self.OPERATORS:
|
55
|
+
error_msg = f"Unsupported binary operator: {op_type.__name__}"
|
56
|
+
raise TypeError(error_msg)
|
57
|
+
|
58
|
+
left = self._eval_expr(node.left)
|
59
|
+
right = self._eval_expr(node.right)
|
60
|
+
return self.OPERATORS[op_type](left, right)
|
61
|
+
|
62
|
+
error_msg = f"Unsupported operation or expression type: {type(node).__name__}"
|
63
|
+
raise TypeError(error_msg)
|
64
|
+
|
65
|
+
def evaluate_expression(self) -> Data:
|
66
|
+
"""Evaluate the mathematical expression and return the result."""
|
67
|
+
try:
|
68
|
+
tree = ast.parse(self.expression, mode="eval")
|
69
|
+
result = self._eval_expr(tree.body)
|
70
|
+
|
71
|
+
formatted_result = f"{float(result):.6f}".rstrip("0").rstrip(".")
|
72
|
+
self.log(f"Calculation result: {formatted_result}")
|
73
|
+
|
74
|
+
self.status = formatted_result
|
75
|
+
return Data(data={"result": formatted_result})
|
76
|
+
|
77
|
+
except ZeroDivisionError:
|
78
|
+
error_message = "Error: Division by zero"
|
79
|
+
self.status = error_message
|
80
|
+
return Data(data={"error": error_message, "input": self.expression})
|
81
|
+
|
82
|
+
except (SyntaxError, TypeError, KeyError, ValueError, AttributeError, OverflowError) as e:
|
83
|
+
error_message = f"Invalid expression: {e!s}"
|
84
|
+
self.status = error_message
|
85
|
+
return Data(data={"error": error_message, "input": self.expression})
|
86
|
+
|
87
|
+
def build(self):
|
88
|
+
"""Return the main evaluation function."""
|
89
|
+
return self.evaluate_expression
|
@@ -0,0 +1,40 @@
|
|
1
|
+
from lfx.custom.custom_component.component import Component
|
2
|
+
from lfx.inputs.inputs import StrInput
|
3
|
+
from lfx.schema.data import Data
|
4
|
+
from lfx.schema.dataframe import DataFrame
|
5
|
+
from lfx.template.field.base import Output
|
6
|
+
|
7
|
+
|
8
|
+
class CreateListComponent(Component):
|
9
|
+
display_name = "Create List"
|
10
|
+
description = "Creates a list of texts."
|
11
|
+
icon = "list"
|
12
|
+
name = "CreateList"
|
13
|
+
legacy = True
|
14
|
+
|
15
|
+
inputs = [
|
16
|
+
StrInput(
|
17
|
+
name="texts",
|
18
|
+
display_name="Texts",
|
19
|
+
info="Enter one or more texts.",
|
20
|
+
is_list=True,
|
21
|
+
),
|
22
|
+
]
|
23
|
+
|
24
|
+
outputs = [
|
25
|
+
Output(display_name="Data List", name="list", method="create_list"),
|
26
|
+
Output(display_name="DataFrame", name="dataframe", method="as_dataframe"),
|
27
|
+
]
|
28
|
+
|
29
|
+
def create_list(self) -> list[Data]:
|
30
|
+
data = [Data(text=text) for text in self.texts]
|
31
|
+
self.status = data
|
32
|
+
return data
|
33
|
+
|
34
|
+
def as_dataframe(self) -> DataFrame:
|
35
|
+
"""Convert the list of Data objects into a DataFrame.
|
36
|
+
|
37
|
+
Returns:
|
38
|
+
DataFrame: A DataFrame containing the list data.
|
39
|
+
"""
|
40
|
+
return DataFrame(self.create_list())
|
@@ -0,0 +1,42 @@
|
|
1
|
+
from datetime import datetime
|
2
|
+
from zoneinfo import ZoneInfo, available_timezones
|
3
|
+
|
4
|
+
from lfx.custom.custom_component.component import Component
|
5
|
+
from lfx.io import DropdownInput, Output
|
6
|
+
from lfx.log.logger import logger
|
7
|
+
from lfx.schema.message import Message
|
8
|
+
|
9
|
+
|
10
|
+
class CurrentDateComponent(Component):
|
11
|
+
display_name = "Current Date"
|
12
|
+
description = "Returns the current date and time in the selected timezone."
|
13
|
+
documentation: str = "https://docs.langflow.org/components-helpers#current-date"
|
14
|
+
icon = "clock"
|
15
|
+
name = "CurrentDate"
|
16
|
+
|
17
|
+
inputs = [
|
18
|
+
DropdownInput(
|
19
|
+
name="timezone",
|
20
|
+
display_name="Timezone",
|
21
|
+
options=list(available_timezones()),
|
22
|
+
value="UTC",
|
23
|
+
info="Select the timezone for the current date and time.",
|
24
|
+
tool_mode=True,
|
25
|
+
),
|
26
|
+
]
|
27
|
+
outputs = [
|
28
|
+
Output(display_name="Current Date", name="current_date", method="get_current_date"),
|
29
|
+
]
|
30
|
+
|
31
|
+
def get_current_date(self) -> Message:
|
32
|
+
try:
|
33
|
+
tz = ZoneInfo(self.timezone)
|
34
|
+
current_date = datetime.now(tz).strftime("%Y-%m-%d %H:%M:%S %Z")
|
35
|
+
result = f"Current date and time in {self.timezone}: {current_date}"
|
36
|
+
self.status = result
|
37
|
+
return Message(text=result)
|
38
|
+
except Exception as e: # noqa: BLE001
|
39
|
+
logger.debug("Error getting current date", exc_info=True)
|
40
|
+
error_message = f"Error: {e}"
|
41
|
+
self.status = error_message
|
42
|
+
return Message(text=error_message)
|
@@ -0,0 +1,42 @@
|
|
1
|
+
import uuid
|
2
|
+
from typing import Any
|
3
|
+
|
4
|
+
from typing_extensions import override
|
5
|
+
|
6
|
+
from lfx.custom.custom_component.component import Component
|
7
|
+
from lfx.io import MessageTextInput, Output
|
8
|
+
from lfx.schema.dotdict import dotdict
|
9
|
+
from lfx.schema.message import Message
|
10
|
+
|
11
|
+
|
12
|
+
class IDGeneratorComponent(Component):
|
13
|
+
display_name = "ID Generator"
|
14
|
+
description = "Generates a unique ID."
|
15
|
+
icon = "fingerprint"
|
16
|
+
name = "IDGenerator"
|
17
|
+
legacy = True
|
18
|
+
|
19
|
+
inputs = [
|
20
|
+
MessageTextInput(
|
21
|
+
name="unique_id",
|
22
|
+
display_name="Value",
|
23
|
+
info="The generated unique ID.",
|
24
|
+
refresh_button=True,
|
25
|
+
tool_mode=True,
|
26
|
+
),
|
27
|
+
]
|
28
|
+
|
29
|
+
outputs = [
|
30
|
+
Output(display_name="ID", name="id", method="generate_id"),
|
31
|
+
]
|
32
|
+
|
33
|
+
@override
|
34
|
+
def update_build_config(self, build_config: dotdict, field_value: Any, field_name: str | None = None):
|
35
|
+
if field_name == "unique_id":
|
36
|
+
build_config[field_name]["value"] = str(uuid.uuid4())
|
37
|
+
return build_config
|
38
|
+
|
39
|
+
def generate_id(self) -> Message:
|
40
|
+
unique_id = self.unique_id or str(uuid.uuid4())
|
41
|
+
self.status = f"Generated ID: {unique_id}"
|
42
|
+
return Message(text=unique_id)
|