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,74 @@
|
|
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 .composio_api import ComposioAPIComponent
|
9
|
+
from .github_composio import ComposioGitHubAPIComponent
|
10
|
+
from .gmail_composio import ComposioGmailAPIComponent
|
11
|
+
from .googlecalendar_composio import ComposioGoogleCalendarAPIComponent
|
12
|
+
from .googlemeet_composio import ComposioGooglemeetAPIComponent
|
13
|
+
from .googletasks_composio import ComposioGoogleTasksAPIComponent
|
14
|
+
from .linear_composio import ComposioLinearAPIComponent
|
15
|
+
from .outlook_composio import ComposioOutlookAPIComponent
|
16
|
+
from .reddit_composio import ComposioRedditAPIComponent
|
17
|
+
from .slack_composio import ComposioSlackAPIComponent
|
18
|
+
from .slackbot_composio import ComposioSlackbotAPIComponent
|
19
|
+
from .supabase_composio import ComposioSupabaseAPIComponent
|
20
|
+
from .todoist_composio import ComposioTodoistAPIComponent
|
21
|
+
from .youtube_composio import ComposioYoutubeAPIComponent
|
22
|
+
|
23
|
+
_dynamic_imports = {
|
24
|
+
"ComposioAPIComponent": "composio_api",
|
25
|
+
"ComposioGitHubAPIComponent": "github_composio",
|
26
|
+
"ComposioGmailAPIComponent": "gmail_composio",
|
27
|
+
"ComposioGoogleCalendarAPIComponent": "googlecalendar_composio",
|
28
|
+
"ComposioGooglemeetAPIComponent": "googlemeet_composio",
|
29
|
+
"ComposioOutlookAPIComponent": "outlook_composio",
|
30
|
+
"ComposioSlackAPIComponent": "slack_composio",
|
31
|
+
"ComposioGoogleTasksAPIComponent": "googletasks_composio",
|
32
|
+
"ComposioLinearAPIComponent": "linear_composio",
|
33
|
+
"ComposioRedditAPIComponent": "reddit_composio",
|
34
|
+
"ComposioSlackbotAPIComponent": "slackbot_composio",
|
35
|
+
"ComposioSupabaseAPIComponent": "supabase_composio",
|
36
|
+
"ComposioTodoistAPIComponent": "todoist_composio",
|
37
|
+
"ComposioYoutubeAPIComponent": "youtube_composio",
|
38
|
+
}
|
39
|
+
|
40
|
+
# Always expose all components - individual failures will be handled on import
|
41
|
+
__all__ = [
|
42
|
+
"ComposioAPIComponent",
|
43
|
+
"ComposioGitHubAPIComponent",
|
44
|
+
"ComposioGmailAPIComponent",
|
45
|
+
"ComposioGoogleCalendarAPIComponent",
|
46
|
+
"ComposioGoogleTasksAPIComponent",
|
47
|
+
"ComposioGooglemeetAPIComponent",
|
48
|
+
"ComposioLinearAPIComponent",
|
49
|
+
"ComposioOutlookAPIComponent",
|
50
|
+
"ComposioRedditAPIComponent",
|
51
|
+
"ComposioSlackAPIComponent",
|
52
|
+
"ComposioSlackbotAPIComponent",
|
53
|
+
"ComposioSupabaseAPIComponent",
|
54
|
+
"ComposioTodoistAPIComponent",
|
55
|
+
"ComposioYoutubeAPIComponent",
|
56
|
+
]
|
57
|
+
|
58
|
+
|
59
|
+
def __getattr__(attr_name: str) -> Any:
|
60
|
+
"""Lazily import composio components on attribute access."""
|
61
|
+
if attr_name not in _dynamic_imports:
|
62
|
+
msg = f"module '{__name__}' has no attribute '{attr_name}'"
|
63
|
+
raise AttributeError(msg)
|
64
|
+
try:
|
65
|
+
result = import_mod(attr_name, _dynamic_imports[attr_name], __spec__.parent)
|
66
|
+
except (ModuleNotFoundError, ImportError, AttributeError) as e:
|
67
|
+
msg = f"Could not import '{attr_name}' from '{__name__}': {e}"
|
68
|
+
raise AttributeError(msg) from e
|
69
|
+
globals()[attr_name] = result
|
70
|
+
return result
|
71
|
+
|
72
|
+
|
73
|
+
def __dir__() -> list[str]:
|
74
|
+
return list(__all__)
|
@@ -0,0 +1,268 @@
|
|
1
|
+
# Standard library imports
|
2
|
+
from collections.abc import Sequence
|
3
|
+
from typing import Any
|
4
|
+
|
5
|
+
from composio import Composio
|
6
|
+
from composio_langchain import LangchainProvider
|
7
|
+
|
8
|
+
# Third-party imports
|
9
|
+
from langchain_core.tools import Tool
|
10
|
+
|
11
|
+
# Local imports
|
12
|
+
from lfx.base.langchain_utilities.model import LCToolComponent
|
13
|
+
from lfx.inputs.inputs import (
|
14
|
+
ConnectionInput,
|
15
|
+
MessageTextInput,
|
16
|
+
SecretStrInput,
|
17
|
+
SortableListInput,
|
18
|
+
)
|
19
|
+
from lfx.io import Output
|
20
|
+
|
21
|
+
# TODO: We get the list from the API but we need to filter it
|
22
|
+
enabled_tools = ["confluence", "discord", "dropbox", "github", "gmail", "linkedin", "notion", "slack", "youtube"]
|
23
|
+
|
24
|
+
|
25
|
+
class ComposioAPIComponent(LCToolComponent):
|
26
|
+
display_name: str = "Composio Tools"
|
27
|
+
description: str = "Use Composio toolset to run actions with your agent"
|
28
|
+
name = "ComposioAPI"
|
29
|
+
icon = "Composio"
|
30
|
+
documentation: str = "https://docs.composio.dev"
|
31
|
+
|
32
|
+
inputs = [
|
33
|
+
# Basic configuration inputs
|
34
|
+
MessageTextInput(name="entity_id", display_name="Entity ID", value="default", advanced=True),
|
35
|
+
SecretStrInput(
|
36
|
+
name="api_key",
|
37
|
+
display_name="Composio API Key",
|
38
|
+
required=True,
|
39
|
+
info="Refer to https://docs.composio.dev/faq/api_key/api_key",
|
40
|
+
real_time_refresh=True,
|
41
|
+
),
|
42
|
+
ConnectionInput(
|
43
|
+
name="tool_name",
|
44
|
+
display_name="Tool Name",
|
45
|
+
placeholder="Select a tool...",
|
46
|
+
button_metadata={"icon": "unplug", "variant": "destructive"},
|
47
|
+
options=[],
|
48
|
+
search_category=[],
|
49
|
+
value="",
|
50
|
+
connection_link="",
|
51
|
+
info="The name of the tool to use",
|
52
|
+
real_time_refresh=True,
|
53
|
+
),
|
54
|
+
SortableListInput(
|
55
|
+
name="actions",
|
56
|
+
display_name="Actions",
|
57
|
+
placeholder="Select action",
|
58
|
+
helper_text="Please connect before selecting actions.",
|
59
|
+
helper_text_metadata={"icon": "OctagonAlert", "variant": "destructive"},
|
60
|
+
options=[],
|
61
|
+
value="",
|
62
|
+
info="The actions to use",
|
63
|
+
limit=1,
|
64
|
+
show=False,
|
65
|
+
),
|
66
|
+
]
|
67
|
+
|
68
|
+
outputs = [
|
69
|
+
Output(name="tools", display_name="Tools", method="build_tool"),
|
70
|
+
]
|
71
|
+
|
72
|
+
def validate_tool(self, build_config: dict, field_value: Any, tool_name: str | None = None) -> dict:
|
73
|
+
# Get the index of the selected tool in the list of options
|
74
|
+
selected_tool_index = next(
|
75
|
+
(
|
76
|
+
ind
|
77
|
+
for ind, tool in enumerate(build_config["tool_name"]["options"])
|
78
|
+
if tool["name"] == field_value
|
79
|
+
or ("validate" in field_value and tool["name"] == field_value["validate"])
|
80
|
+
),
|
81
|
+
None,
|
82
|
+
)
|
83
|
+
|
84
|
+
# Set the link to be the text 'validated'
|
85
|
+
build_config["tool_name"]["options"][selected_tool_index]["link"] = "validated"
|
86
|
+
|
87
|
+
# Set the helper text and helper text metadata field of the actions now
|
88
|
+
build_config["actions"]["helper_text"] = ""
|
89
|
+
build_config["actions"]["helper_text_metadata"] = {"icon": "Check", "variant": "success"}
|
90
|
+
|
91
|
+
try:
|
92
|
+
composio = self._build_wrapper()
|
93
|
+
current_tool = tool_name or getattr(self, "tool_name", None)
|
94
|
+
if not current_tool:
|
95
|
+
self.log("No tool name available for validate_tool")
|
96
|
+
return build_config
|
97
|
+
|
98
|
+
toolkit_slug = current_tool.lower()
|
99
|
+
|
100
|
+
tools = composio.tools.get(user_id=self.entity_id, toolkits=[toolkit_slug])
|
101
|
+
|
102
|
+
authenticated_actions = []
|
103
|
+
for tool in tools:
|
104
|
+
if hasattr(tool, "name"):
|
105
|
+
action_name = tool.name
|
106
|
+
display_name = action_name.replace("_", " ").title()
|
107
|
+
authenticated_actions.append({"name": action_name, "display_name": display_name})
|
108
|
+
except (ValueError, ConnectionError, AttributeError) as e:
|
109
|
+
self.log(f"Error getting actions for {current_tool or 'unknown tool'}: {e}")
|
110
|
+
authenticated_actions = []
|
111
|
+
|
112
|
+
build_config["actions"]["options"] = [
|
113
|
+
{
|
114
|
+
"name": action["name"],
|
115
|
+
}
|
116
|
+
for action in authenticated_actions
|
117
|
+
]
|
118
|
+
|
119
|
+
build_config["actions"]["show"] = True
|
120
|
+
return build_config
|
121
|
+
|
122
|
+
def update_build_config(self, build_config: dict, field_value: Any, field_name: str | None = None) -> dict:
|
123
|
+
if field_name == "api_key" or (self.api_key and not build_config["tool_name"]["options"]):
|
124
|
+
if field_name == "api_key" and not field_value:
|
125
|
+
build_config["tool_name"]["options"] = []
|
126
|
+
build_config["tool_name"]["value"] = ""
|
127
|
+
|
128
|
+
# Reset the list of actions
|
129
|
+
build_config["actions"]["show"] = False
|
130
|
+
build_config["actions"]["options"] = []
|
131
|
+
build_config["actions"]["value"] = ""
|
132
|
+
|
133
|
+
return build_config
|
134
|
+
|
135
|
+
# Build the list of available tools
|
136
|
+
build_config["tool_name"]["options"] = [
|
137
|
+
{
|
138
|
+
"name": app.title(),
|
139
|
+
"icon": app,
|
140
|
+
"link": (
|
141
|
+
build_config["tool_name"]["options"][ind]["link"]
|
142
|
+
if build_config["tool_name"]["options"]
|
143
|
+
else ""
|
144
|
+
),
|
145
|
+
}
|
146
|
+
for ind, app in enumerate(enabled_tools)
|
147
|
+
]
|
148
|
+
|
149
|
+
return build_config
|
150
|
+
|
151
|
+
if field_name == "tool_name" and field_value:
|
152
|
+
composio = self._build_wrapper()
|
153
|
+
|
154
|
+
current_tool_name = (
|
155
|
+
field_value
|
156
|
+
if isinstance(field_value, str)
|
157
|
+
else field_value.get("validate")
|
158
|
+
if isinstance(field_value, dict) and "validate" in field_value
|
159
|
+
else getattr(self, "tool_name", None)
|
160
|
+
)
|
161
|
+
|
162
|
+
if not current_tool_name:
|
163
|
+
self.log("No tool name available for connection check")
|
164
|
+
return build_config
|
165
|
+
|
166
|
+
try:
|
167
|
+
toolkit_slug = current_tool_name.lower()
|
168
|
+
|
169
|
+
connection_list = composio.connected_accounts.list(
|
170
|
+
user_ids=[self.entity_id], toolkit_slugs=[toolkit_slug]
|
171
|
+
)
|
172
|
+
|
173
|
+
# Check for active connections
|
174
|
+
has_active_connections = False
|
175
|
+
if (
|
176
|
+
connection_list
|
177
|
+
and hasattr(connection_list, "items")
|
178
|
+
and connection_list.items
|
179
|
+
and isinstance(connection_list.items, list)
|
180
|
+
and len(connection_list.items) > 0
|
181
|
+
):
|
182
|
+
for connection in connection_list.items:
|
183
|
+
if getattr(connection, "status", None) == "ACTIVE":
|
184
|
+
has_active_connections = True
|
185
|
+
break
|
186
|
+
|
187
|
+
# Get the index of the selected tool in the list of options
|
188
|
+
selected_tool_index = next(
|
189
|
+
(
|
190
|
+
ind
|
191
|
+
for ind, tool in enumerate(build_config["tool_name"]["options"])
|
192
|
+
if tool["name"] == current_tool_name.title()
|
193
|
+
),
|
194
|
+
None,
|
195
|
+
)
|
196
|
+
|
197
|
+
if has_active_connections:
|
198
|
+
# User has active connection
|
199
|
+
if selected_tool_index is not None:
|
200
|
+
build_config["tool_name"]["options"][selected_tool_index]["link"] = "validated"
|
201
|
+
|
202
|
+
# If it's a validation request, validate the tool
|
203
|
+
if (isinstance(field_value, dict) and "validate" in field_value) or isinstance(field_value, str):
|
204
|
+
return self.validate_tool(build_config, field_value, current_tool_name)
|
205
|
+
else:
|
206
|
+
# No active connection - create OAuth connection
|
207
|
+
try:
|
208
|
+
connection = composio.toolkits.authorize(user_id=self.entity_id, toolkit=toolkit_slug)
|
209
|
+
redirect_url = getattr(connection, "redirect_url", None)
|
210
|
+
|
211
|
+
if redirect_url and redirect_url.startswith(("http://", "https://")):
|
212
|
+
if selected_tool_index is not None:
|
213
|
+
build_config["tool_name"]["options"][selected_tool_index]["link"] = redirect_url
|
214
|
+
elif selected_tool_index is not None:
|
215
|
+
build_config["tool_name"]["options"][selected_tool_index]["link"] = "error"
|
216
|
+
except (ValueError, ConnectionError, AttributeError) as e:
|
217
|
+
self.log(f"Error creating OAuth connection: {e}")
|
218
|
+
if selected_tool_index is not None:
|
219
|
+
build_config["tool_name"]["options"][selected_tool_index]["link"] = "error"
|
220
|
+
|
221
|
+
except (ValueError, ConnectionError, AttributeError) as e:
|
222
|
+
self.log(f"Error checking connection status: {e}")
|
223
|
+
|
224
|
+
return build_config
|
225
|
+
|
226
|
+
def build_tool(self) -> Sequence[Tool]:
|
227
|
+
"""Build Composio tools based on selected actions.
|
228
|
+
|
229
|
+
Returns:
|
230
|
+
Sequence[Tool]: List of configured Composio tools.
|
231
|
+
"""
|
232
|
+
composio = self._build_wrapper()
|
233
|
+
action_names = [action["name"] for action in self.actions]
|
234
|
+
|
235
|
+
# Get toolkits from action names
|
236
|
+
toolkits = set()
|
237
|
+
for action_name in action_names:
|
238
|
+
if "_" in action_name:
|
239
|
+
toolkit = action_name.split("_")[0].lower()
|
240
|
+
toolkits.add(toolkit)
|
241
|
+
|
242
|
+
if not toolkits:
|
243
|
+
return []
|
244
|
+
|
245
|
+
# Get all tools for the relevant toolkits
|
246
|
+
all_tools = composio.tools.get(user_id=self.entity_id, toolkits=list(toolkits))
|
247
|
+
|
248
|
+
# Filter to only the specific actions we want using list comprehension
|
249
|
+
return [tool for tool in all_tools if hasattr(tool, "name") and tool.name in action_names]
|
250
|
+
|
251
|
+
def _build_wrapper(self) -> Composio:
|
252
|
+
"""Build the Composio wrapper using new SDK.
|
253
|
+
|
254
|
+
Returns:
|
255
|
+
Composio: The initialized Composio client.
|
256
|
+
|
257
|
+
Raises:
|
258
|
+
ValueError: If the API key is not found or invalid.
|
259
|
+
"""
|
260
|
+
try:
|
261
|
+
if not self.api_key:
|
262
|
+
msg = "Composio API Key is required"
|
263
|
+
raise ValueError(msg)
|
264
|
+
return Composio(api_key=self.api_key, provider=LangchainProvider())
|
265
|
+
except ValueError as e:
|
266
|
+
self.log(f"Error building Composio wrapper: {e}")
|
267
|
+
msg = "Please provide a valid Composio API Key in the component settings"
|
268
|
+
raise ValueError(msg) from e
|
@@ -0,0 +1,11 @@
|
|
1
|
+
from lfx.base.composio.composio_base import ComposioBaseComponent
|
2
|
+
|
3
|
+
|
4
|
+
class ComposioDropboxAPIComponent(ComposioBaseComponent):
|
5
|
+
display_name: str = "Dropbox"
|
6
|
+
icon = "Dropbox"
|
7
|
+
documentation: str = "https://docs.composio.dev"
|
8
|
+
app_name = "dropbox"
|
9
|
+
|
10
|
+
def set_default_tools(self):
|
11
|
+
"""Set the default tools for Dropbox component."""
|
@@ -0,0 +1,11 @@
|
|
1
|
+
from lfx.base.composio.composio_base import ComposioBaseComponent
|
2
|
+
|
3
|
+
|
4
|
+
class ComposioGitHubAPIComponent(ComposioBaseComponent):
|
5
|
+
display_name: str = "GitHub"
|
6
|
+
icon = "Github"
|
7
|
+
documentation: str = "https://docs.composio.dev"
|
8
|
+
app_name = "github"
|
9
|
+
|
10
|
+
def set_default_tools(self):
|
11
|
+
"""Set the default tools for GitHub component."""
|
@@ -0,0 +1,38 @@
|
|
1
|
+
from lfx.base.composio.composio_base import ComposioBaseComponent
|
2
|
+
|
3
|
+
|
4
|
+
class ComposioGmailAPIComponent(ComposioBaseComponent):
|
5
|
+
display_name: str = "Gmail"
|
6
|
+
icon = "Google"
|
7
|
+
documentation: str = "https://docs.composio.dev"
|
8
|
+
app_name = "gmail"
|
9
|
+
|
10
|
+
def __init__(self, **kwargs):
|
11
|
+
super().__init__(**kwargs)
|
12
|
+
self.post_processors = {
|
13
|
+
"GMAIL_SEND_EMAIL": self._process_send_email_response,
|
14
|
+
"GMAIL_FETCH_EMAILS": self._process_fetch_emails_response,
|
15
|
+
}
|
16
|
+
|
17
|
+
def _process_send_email_response(self, raw_data):
|
18
|
+
"""Post-processor for GMAIL_SEND_EMAIL action."""
|
19
|
+
if isinstance(raw_data, dict):
|
20
|
+
response_data = raw_data.get("response_data", raw_data)
|
21
|
+
|
22
|
+
return {
|
23
|
+
"message_id": response_data.get("id"),
|
24
|
+
"thread_id": response_data.get("threadId"),
|
25
|
+
"label_ids": response_data.get("labelIds", []),
|
26
|
+
}
|
27
|
+
return raw_data
|
28
|
+
|
29
|
+
def _process_fetch_emails_response(self, raw_data):
|
30
|
+
"""Post-processor for GMAIL_FETCH_EMAILS action."""
|
31
|
+
if isinstance(raw_data, dict):
|
32
|
+
messages = raw_data.get("messages", [])
|
33
|
+
if messages:
|
34
|
+
return messages
|
35
|
+
return raw_data
|
36
|
+
|
37
|
+
def set_default_tools(self):
|
38
|
+
"""Set the default tools for Gmail component."""
|
@@ -0,0 +1,11 @@
|
|
1
|
+
from lfx.base.composio.composio_base import ComposioBaseComponent
|
2
|
+
|
3
|
+
|
4
|
+
class ComposioGoogleCalendarAPIComponent(ComposioBaseComponent):
|
5
|
+
display_name: str = "Google Calendar"
|
6
|
+
icon = "Googlecalendar"
|
7
|
+
documentation: str = "https://docs.composio.dev"
|
8
|
+
app_name = "googlecalendar"
|
9
|
+
|
10
|
+
def set_default_tools(self):
|
11
|
+
"""Set the default tools for Google Calendar component."""
|
@@ -0,0 +1,11 @@
|
|
1
|
+
from lfx.base.composio.composio_base import ComposioBaseComponent
|
2
|
+
|
3
|
+
|
4
|
+
class ComposioGooglemeetAPIComponent(ComposioBaseComponent):
|
5
|
+
display_name: str = "Google Meet"
|
6
|
+
icon = "Googlemeet"
|
7
|
+
documentation: str = "https://docs.composio.dev"
|
8
|
+
app_name = "googlemeet"
|
9
|
+
|
10
|
+
def set_default_tools(self):
|
11
|
+
"""Set the default tools for Google Calendar component."""
|
@@ -0,0 +1,8 @@
|
|
1
|
+
from lfx.base.composio.composio_base import ComposioBaseComponent
|
2
|
+
|
3
|
+
|
4
|
+
class ComposioGoogleTasksAPIComponent(ComposioBaseComponent):
|
5
|
+
display_name: str = "Google Tasks"
|
6
|
+
icon = "GoogleTasks"
|
7
|
+
documentation: str = "https://docs.composio.dev"
|
8
|
+
app_name = "googletasks"
|
@@ -0,0 +1,11 @@
|
|
1
|
+
from lfx.base.composio.composio_base import ComposioBaseComponent
|
2
|
+
|
3
|
+
|
4
|
+
class ComposioLinearAPIComponent(ComposioBaseComponent):
|
5
|
+
display_name: str = "Linear"
|
6
|
+
icon = "Linear"
|
7
|
+
documentation: str = "https://docs.composio.dev"
|
8
|
+
app_name = "linear"
|
9
|
+
|
10
|
+
def set_default_tools(self):
|
11
|
+
"""Set the default tools for Linear component."""
|
@@ -0,0 +1,11 @@
|
|
1
|
+
from lfx.base.composio.composio_base import ComposioBaseComponent
|
2
|
+
|
3
|
+
|
4
|
+
class ComposioOutlookAPIComponent(ComposioBaseComponent):
|
5
|
+
display_name: str = "Outlook"
|
6
|
+
icon = "Outlook"
|
7
|
+
documentation: str = "https://docs.composio.dev"
|
8
|
+
app_name = "outlook"
|
9
|
+
|
10
|
+
def set_default_tools(self):
|
11
|
+
"""Set the default tools for Gmail component."""
|
@@ -0,0 +1,11 @@
|
|
1
|
+
from lfx.base.composio.composio_base import ComposioBaseComponent
|
2
|
+
|
3
|
+
|
4
|
+
class ComposioRedditAPIComponent(ComposioBaseComponent):
|
5
|
+
display_name: str = "Reddit"
|
6
|
+
icon = "Reddit"
|
7
|
+
documentation: str = "https://docs.composio.dev"
|
8
|
+
app_name = "reddit"
|
9
|
+
|
10
|
+
def set_default_tools(self):
|
11
|
+
"""Set the default tools for Reddit component."""
|