lfx-nightly 0.2.0.dev25__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of lfx-nightly might be problematic. Click here for more details.
- lfx/__init__.py +0 -0
- lfx/__main__.py +25 -0
- lfx/_assets/component_index.json +1 -0
- lfx/base/__init__.py +0 -0
- lfx/base/agents/__init__.py +0 -0
- lfx/base/agents/agent.py +375 -0
- lfx/base/agents/altk_base_agent.py +380 -0
- lfx/base/agents/altk_tool_wrappers.py +565 -0
- lfx/base/agents/callback.py +130 -0
- lfx/base/agents/context.py +109 -0
- lfx/base/agents/crewai/__init__.py +0 -0
- lfx/base/agents/crewai/crew.py +231 -0
- lfx/base/agents/crewai/tasks.py +12 -0
- lfx/base/agents/default_prompts.py +23 -0
- lfx/base/agents/errors.py +15 -0
- lfx/base/agents/events.py +430 -0
- lfx/base/agents/utils.py +237 -0
- lfx/base/astra_assistants/__init__.py +0 -0
- lfx/base/astra_assistants/util.py +171 -0
- lfx/base/chains/__init__.py +0 -0
- lfx/base/chains/model.py +19 -0
- lfx/base/composio/__init__.py +0 -0
- lfx/base/composio/composio_base.py +2584 -0
- lfx/base/compressors/__init__.py +0 -0
- lfx/base/compressors/model.py +60 -0
- lfx/base/constants.py +46 -0
- lfx/base/curl/__init__.py +0 -0
- lfx/base/curl/parse.py +188 -0
- lfx/base/data/__init__.py +5 -0
- lfx/base/data/base_file.py +810 -0
- lfx/base/data/docling_utils.py +338 -0
- lfx/base/data/storage_utils.py +192 -0
- lfx/base/data/utils.py +362 -0
- lfx/base/datastax/__init__.py +5 -0
- lfx/base/datastax/astradb_base.py +896 -0
- lfx/base/document_transformers/__init__.py +0 -0
- lfx/base/document_transformers/model.py +43 -0
- lfx/base/embeddings/__init__.py +0 -0
- lfx/base/embeddings/aiml_embeddings.py +62 -0
- lfx/base/embeddings/embeddings_class.py +113 -0
- lfx/base/embeddings/model.py +26 -0
- lfx/base/flow_processing/__init__.py +0 -0
- lfx/base/flow_processing/utils.py +86 -0
- lfx/base/huggingface/__init__.py +0 -0
- lfx/base/huggingface/model_bridge.py +133 -0
- lfx/base/io/__init__.py +0 -0
- lfx/base/io/chat.py +21 -0
- lfx/base/io/text.py +22 -0
- lfx/base/knowledge_bases/__init__.py +3 -0
- lfx/base/knowledge_bases/knowledge_base_utils.py +137 -0
- lfx/base/langchain_utilities/__init__.py +0 -0
- lfx/base/langchain_utilities/model.py +35 -0
- lfx/base/langchain_utilities/spider_constants.py +1 -0
- lfx/base/langwatch/__init__.py +0 -0
- lfx/base/langwatch/utils.py +18 -0
- lfx/base/mcp/__init__.py +0 -0
- lfx/base/mcp/constants.py +2 -0
- lfx/base/mcp/util.py +1659 -0
- lfx/base/memory/__init__.py +0 -0
- lfx/base/memory/memory.py +49 -0
- lfx/base/memory/model.py +38 -0
- lfx/base/models/__init__.py +3 -0
- lfx/base/models/aiml_constants.py +51 -0
- lfx/base/models/anthropic_constants.py +51 -0
- lfx/base/models/aws_constants.py +151 -0
- lfx/base/models/chat_result.py +76 -0
- lfx/base/models/cometapi_constants.py +54 -0
- lfx/base/models/google_generative_ai_constants.py +70 -0
- lfx/base/models/google_generative_ai_model.py +38 -0
- lfx/base/models/groq_constants.py +150 -0
- lfx/base/models/groq_model_discovery.py +265 -0
- lfx/base/models/model.py +375 -0
- lfx/base/models/model_input_constants.py +378 -0
- lfx/base/models/model_metadata.py +41 -0
- lfx/base/models/model_utils.py +108 -0
- lfx/base/models/novita_constants.py +35 -0
- lfx/base/models/ollama_constants.py +52 -0
- lfx/base/models/openai_constants.py +129 -0
- lfx/base/models/sambanova_constants.py +18 -0
- lfx/base/models/watsonx_constants.py +36 -0
- lfx/base/processing/__init__.py +0 -0
- lfx/base/prompts/__init__.py +0 -0
- lfx/base/prompts/api_utils.py +224 -0
- lfx/base/prompts/utils.py +61 -0
- lfx/base/textsplitters/__init__.py +0 -0
- lfx/base/textsplitters/model.py +28 -0
- lfx/base/tools/__init__.py +0 -0
- lfx/base/tools/base.py +26 -0
- lfx/base/tools/component_tool.py +325 -0
- lfx/base/tools/constants.py +49 -0
- lfx/base/tools/flow_tool.py +132 -0
- lfx/base/tools/run_flow.py +698 -0
- lfx/base/vectorstores/__init__.py +0 -0
- lfx/base/vectorstores/model.py +193 -0
- lfx/base/vectorstores/utils.py +22 -0
- lfx/base/vectorstores/vector_store_connection_decorator.py +52 -0
- lfx/cli/__init__.py +5 -0
- lfx/cli/commands.py +327 -0
- lfx/cli/common.py +650 -0
- lfx/cli/run.py +506 -0
- lfx/cli/script_loader.py +289 -0
- lfx/cli/serve_app.py +546 -0
- lfx/cli/validation.py +69 -0
- lfx/components/FAISS/__init__.py +34 -0
- lfx/components/FAISS/faiss.py +111 -0
- lfx/components/Notion/__init__.py +19 -0
- lfx/components/Notion/add_content_to_page.py +269 -0
- lfx/components/Notion/create_page.py +94 -0
- lfx/components/Notion/list_database_properties.py +68 -0
- lfx/components/Notion/list_pages.py +122 -0
- lfx/components/Notion/list_users.py +77 -0
- lfx/components/Notion/page_content_viewer.py +93 -0
- lfx/components/Notion/search.py +111 -0
- lfx/components/Notion/update_page_property.py +114 -0
- lfx/components/__init__.py +428 -0
- lfx/components/_importing.py +42 -0
- lfx/components/agentql/__init__.py +3 -0
- lfx/components/agentql/agentql_api.py +151 -0
- lfx/components/aiml/__init__.py +37 -0
- lfx/components/aiml/aiml.py +115 -0
- lfx/components/aiml/aiml_embeddings.py +37 -0
- lfx/components/altk/__init__.py +34 -0
- lfx/components/altk/altk_agent.py +193 -0
- lfx/components/amazon/__init__.py +36 -0
- lfx/components/amazon/amazon_bedrock_converse.py +195 -0
- lfx/components/amazon/amazon_bedrock_embedding.py +109 -0
- lfx/components/amazon/amazon_bedrock_model.py +130 -0
- lfx/components/amazon/s3_bucket_uploader.py +211 -0
- lfx/components/anthropic/__init__.py +34 -0
- lfx/components/anthropic/anthropic.py +187 -0
- lfx/components/apify/__init__.py +5 -0
- lfx/components/apify/apify_actor.py +325 -0
- lfx/components/arxiv/__init__.py +3 -0
- lfx/components/arxiv/arxiv.py +169 -0
- lfx/components/assemblyai/__init__.py +46 -0
- lfx/components/assemblyai/assemblyai_get_subtitles.py +83 -0
- lfx/components/assemblyai/assemblyai_lemur.py +183 -0
- lfx/components/assemblyai/assemblyai_list_transcripts.py +95 -0
- lfx/components/assemblyai/assemblyai_poll_transcript.py +72 -0
- lfx/components/assemblyai/assemblyai_start_transcript.py +188 -0
- lfx/components/azure/__init__.py +37 -0
- lfx/components/azure/azure_openai.py +95 -0
- lfx/components/azure/azure_openai_embeddings.py +83 -0
- lfx/components/baidu/__init__.py +32 -0
- lfx/components/baidu/baidu_qianfan_chat.py +113 -0
- lfx/components/bing/__init__.py +3 -0
- lfx/components/bing/bing_search_api.py +61 -0
- lfx/components/cassandra/__init__.py +40 -0
- lfx/components/cassandra/cassandra.py +264 -0
- lfx/components/cassandra/cassandra_chat.py +92 -0
- lfx/components/cassandra/cassandra_graph.py +238 -0
- lfx/components/chains/__init__.py +3 -0
- lfx/components/chroma/__init__.py +34 -0
- lfx/components/chroma/chroma.py +169 -0
- lfx/components/cleanlab/__init__.py +40 -0
- lfx/components/cleanlab/cleanlab_evaluator.py +155 -0
- lfx/components/cleanlab/cleanlab_rag_evaluator.py +254 -0
- lfx/components/cleanlab/cleanlab_remediator.py +131 -0
- lfx/components/clickhouse/__init__.py +34 -0
- lfx/components/clickhouse/clickhouse.py +135 -0
- lfx/components/cloudflare/__init__.py +32 -0
- lfx/components/cloudflare/cloudflare.py +81 -0
- lfx/components/cohere/__init__.py +40 -0
- lfx/components/cohere/cohere_embeddings.py +81 -0
- lfx/components/cohere/cohere_models.py +46 -0
- lfx/components/cohere/cohere_rerank.py +51 -0
- lfx/components/cometapi/__init__.py +32 -0
- lfx/components/cometapi/cometapi.py +166 -0
- lfx/components/composio/__init__.py +222 -0
- lfx/components/composio/agentql_composio.py +11 -0
- lfx/components/composio/agiled_composio.py +11 -0
- lfx/components/composio/airtable_composio.py +11 -0
- lfx/components/composio/apollo_composio.py +11 -0
- lfx/components/composio/asana_composio.py +11 -0
- lfx/components/composio/attio_composio.py +11 -0
- lfx/components/composio/bitbucket_composio.py +11 -0
- lfx/components/composio/bolna_composio.py +11 -0
- lfx/components/composio/brightdata_composio.py +11 -0
- lfx/components/composio/calendly_composio.py +11 -0
- lfx/components/composio/canva_composio.py +11 -0
- lfx/components/composio/canvas_composio.py +11 -0
- lfx/components/composio/coda_composio.py +11 -0
- lfx/components/composio/composio_api.py +278 -0
- lfx/components/composio/contentful_composio.py +11 -0
- lfx/components/composio/digicert_composio.py +11 -0
- lfx/components/composio/discord_composio.py +11 -0
- lfx/components/composio/dropbox_compnent.py +11 -0
- lfx/components/composio/elevenlabs_composio.py +11 -0
- lfx/components/composio/exa_composio.py +11 -0
- lfx/components/composio/figma_composio.py +11 -0
- lfx/components/composio/finage_composio.py +11 -0
- lfx/components/composio/firecrawl_composio.py +11 -0
- lfx/components/composio/fireflies_composio.py +11 -0
- lfx/components/composio/fixer_composio.py +11 -0
- lfx/components/composio/flexisign_composio.py +11 -0
- lfx/components/composio/freshdesk_composio.py +11 -0
- lfx/components/composio/github_composio.py +11 -0
- lfx/components/composio/gmail_composio.py +38 -0
- lfx/components/composio/googlebigquery_composio.py +11 -0
- lfx/components/composio/googlecalendar_composio.py +11 -0
- lfx/components/composio/googleclassroom_composio.py +11 -0
- lfx/components/composio/googledocs_composio.py +11 -0
- lfx/components/composio/googlemeet_composio.py +11 -0
- lfx/components/composio/googlesheets_composio.py +11 -0
- lfx/components/composio/googletasks_composio.py +8 -0
- lfx/components/composio/heygen_composio.py +11 -0
- lfx/components/composio/instagram_composio.py +11 -0
- lfx/components/composio/jira_composio.py +11 -0
- lfx/components/composio/jotform_composio.py +11 -0
- lfx/components/composio/klaviyo_composio.py +11 -0
- lfx/components/composio/linear_composio.py +11 -0
- lfx/components/composio/listennotes_composio.py +11 -0
- lfx/components/composio/mem0_composio.py +11 -0
- lfx/components/composio/miro_composio.py +11 -0
- lfx/components/composio/missive_composio.py +11 -0
- lfx/components/composio/notion_composio.py +11 -0
- lfx/components/composio/onedrive_composio.py +11 -0
- lfx/components/composio/outlook_composio.py +11 -0
- lfx/components/composio/pandadoc_composio.py +11 -0
- lfx/components/composio/peopledatalabs_composio.py +11 -0
- lfx/components/composio/perplexityai_composio.py +11 -0
- lfx/components/composio/reddit_composio.py +11 -0
- lfx/components/composio/serpapi_composio.py +11 -0
- lfx/components/composio/slack_composio.py +11 -0
- lfx/components/composio/slackbot_composio.py +11 -0
- lfx/components/composio/snowflake_composio.py +11 -0
- lfx/components/composio/supabase_composio.py +11 -0
- lfx/components/composio/tavily_composio.py +11 -0
- lfx/components/composio/timelinesai_composio.py +11 -0
- lfx/components/composio/todoist_composio.py +11 -0
- lfx/components/composio/wrike_composio.py +11 -0
- lfx/components/composio/youtube_composio.py +11 -0
- lfx/components/confluence/__init__.py +3 -0
- lfx/components/confluence/confluence.py +84 -0
- lfx/components/couchbase/__init__.py +34 -0
- lfx/components/couchbase/couchbase.py +102 -0
- lfx/components/crewai/__init__.py +49 -0
- lfx/components/crewai/crewai.py +108 -0
- lfx/components/crewai/hierarchical_crew.py +47 -0
- lfx/components/crewai/hierarchical_task.py +45 -0
- lfx/components/crewai/sequential_crew.py +53 -0
- lfx/components/crewai/sequential_task.py +74 -0
- lfx/components/crewai/sequential_task_agent.py +144 -0
- lfx/components/cuga/__init__.py +34 -0
- lfx/components/cuga/cuga_agent.py +730 -0
- lfx/components/custom_component/__init__.py +34 -0
- lfx/components/custom_component/custom_component.py +31 -0
- lfx/components/data/__init__.py +114 -0
- lfx/components/data_source/__init__.py +58 -0
- lfx/components/data_source/api_request.py +577 -0
- lfx/components/data_source/csv_to_data.py +101 -0
- lfx/components/data_source/json_to_data.py +106 -0
- lfx/components/data_source/mock_data.py +398 -0
- lfx/components/data_source/news_search.py +166 -0
- lfx/components/data_source/rss.py +71 -0
- lfx/components/data_source/sql_executor.py +101 -0
- lfx/components/data_source/url.py +311 -0
- lfx/components/data_source/web_search.py +326 -0
- lfx/components/datastax/__init__.py +76 -0
- lfx/components/datastax/astradb_assistant_manager.py +307 -0
- lfx/components/datastax/astradb_chatmemory.py +40 -0
- lfx/components/datastax/astradb_cql.py +288 -0
- lfx/components/datastax/astradb_graph.py +217 -0
- lfx/components/datastax/astradb_tool.py +378 -0
- lfx/components/datastax/astradb_vectorize.py +122 -0
- lfx/components/datastax/astradb_vectorstore.py +449 -0
- lfx/components/datastax/create_assistant.py +59 -0
- lfx/components/datastax/create_thread.py +33 -0
- lfx/components/datastax/dotenv.py +36 -0
- lfx/components/datastax/get_assistant.py +38 -0
- lfx/components/datastax/getenvvar.py +31 -0
- lfx/components/datastax/graph_rag.py +141 -0
- lfx/components/datastax/hcd.py +315 -0
- lfx/components/datastax/list_assistants.py +26 -0
- lfx/components/datastax/run.py +90 -0
- lfx/components/deactivated/__init__.py +15 -0
- lfx/components/deactivated/amazon_kendra.py +66 -0
- lfx/components/deactivated/chat_litellm_model.py +158 -0
- lfx/components/deactivated/code_block_extractor.py +26 -0
- lfx/components/deactivated/documents_to_data.py +22 -0
- lfx/components/deactivated/embed.py +16 -0
- lfx/components/deactivated/extract_key_from_data.py +46 -0
- lfx/components/deactivated/json_document_builder.py +57 -0
- lfx/components/deactivated/list_flows.py +20 -0
- lfx/components/deactivated/mcp_sse.py +61 -0
- lfx/components/deactivated/mcp_stdio.py +62 -0
- lfx/components/deactivated/merge_data.py +93 -0
- lfx/components/deactivated/message.py +37 -0
- lfx/components/deactivated/metal.py +54 -0
- lfx/components/deactivated/multi_query.py +59 -0
- lfx/components/deactivated/retriever.py +43 -0
- lfx/components/deactivated/selective_passthrough.py +77 -0
- lfx/components/deactivated/should_run_next.py +40 -0
- lfx/components/deactivated/split_text.py +63 -0
- lfx/components/deactivated/store_message.py +24 -0
- lfx/components/deactivated/sub_flow.py +124 -0
- lfx/components/deactivated/vectara_self_query.py +76 -0
- lfx/components/deactivated/vector_store.py +24 -0
- lfx/components/deepseek/__init__.py +34 -0
- lfx/components/deepseek/deepseek.py +136 -0
- lfx/components/docling/__init__.py +43 -0
- lfx/components/docling/chunk_docling_document.py +186 -0
- lfx/components/docling/docling_inline.py +238 -0
- lfx/components/docling/docling_remote.py +195 -0
- lfx/components/docling/export_docling_document.py +117 -0
- lfx/components/documentloaders/__init__.py +3 -0
- lfx/components/duckduckgo/__init__.py +3 -0
- lfx/components/duckduckgo/duck_duck_go_search_run.py +92 -0
- lfx/components/elastic/__init__.py +37 -0
- lfx/components/elastic/elasticsearch.py +267 -0
- lfx/components/elastic/opensearch.py +789 -0
- lfx/components/elastic/opensearch_multimodal.py +1575 -0
- lfx/components/embeddings/__init__.py +37 -0
- lfx/components/embeddings/similarity.py +77 -0
- lfx/components/embeddings/text_embedder.py +65 -0
- lfx/components/exa/__init__.py +3 -0
- lfx/components/exa/exa_search.py +68 -0
- lfx/components/files_and_knowledge/__init__.py +47 -0
- lfx/components/files_and_knowledge/directory.py +113 -0
- lfx/components/files_and_knowledge/file.py +841 -0
- lfx/components/files_and_knowledge/ingestion.py +694 -0
- lfx/components/files_and_knowledge/retrieval.py +264 -0
- lfx/components/files_and_knowledge/save_file.py +746 -0
- lfx/components/firecrawl/__init__.py +43 -0
- lfx/components/firecrawl/firecrawl_crawl_api.py +88 -0
- lfx/components/firecrawl/firecrawl_extract_api.py +136 -0
- lfx/components/firecrawl/firecrawl_map_api.py +89 -0
- lfx/components/firecrawl/firecrawl_scrape_api.py +73 -0
- lfx/components/flow_controls/__init__.py +58 -0
- lfx/components/flow_controls/conditional_router.py +208 -0
- lfx/components/flow_controls/data_conditional_router.py +126 -0
- lfx/components/flow_controls/flow_tool.py +111 -0
- lfx/components/flow_controls/listen.py +29 -0
- lfx/components/flow_controls/loop.py +163 -0
- lfx/components/flow_controls/notify.py +88 -0
- lfx/components/flow_controls/pass_message.py +36 -0
- lfx/components/flow_controls/run_flow.py +108 -0
- lfx/components/flow_controls/sub_flow.py +115 -0
- lfx/components/git/__init__.py +4 -0
- lfx/components/git/git.py +262 -0
- lfx/components/git/gitextractor.py +196 -0
- lfx/components/glean/__init__.py +3 -0
- lfx/components/glean/glean_search_api.py +173 -0
- lfx/components/google/__init__.py +17 -0
- lfx/components/google/gmail.py +193 -0
- lfx/components/google/google_bq_sql_executor.py +157 -0
- lfx/components/google/google_drive.py +92 -0
- lfx/components/google/google_drive_search.py +152 -0
- lfx/components/google/google_generative_ai.py +144 -0
- lfx/components/google/google_generative_ai_embeddings.py +141 -0
- lfx/components/google/google_oauth_token.py +89 -0
- lfx/components/google/google_search_api_core.py +68 -0
- lfx/components/google/google_serper_api_core.py +74 -0
- lfx/components/groq/__init__.py +34 -0
- lfx/components/groq/groq.py +143 -0
- lfx/components/helpers/__init__.py +154 -0
- lfx/components/homeassistant/__init__.py +7 -0
- lfx/components/homeassistant/home_assistant_control.py +152 -0
- lfx/components/homeassistant/list_home_assistant_states.py +137 -0
- lfx/components/huggingface/__init__.py +37 -0
- lfx/components/huggingface/huggingface.py +199 -0
- lfx/components/huggingface/huggingface_inference_api.py +106 -0
- lfx/components/ibm/__init__.py +34 -0
- lfx/components/ibm/watsonx.py +207 -0
- lfx/components/ibm/watsonx_embeddings.py +135 -0
- lfx/components/icosacomputing/__init__.py +5 -0
- lfx/components/icosacomputing/combinatorial_reasoner.py +84 -0
- lfx/components/input_output/__init__.py +40 -0
- lfx/components/input_output/chat.py +109 -0
- lfx/components/input_output/chat_output.py +184 -0
- lfx/components/input_output/text.py +27 -0
- lfx/components/input_output/text_output.py +29 -0
- lfx/components/input_output/webhook.py +56 -0
- lfx/components/jigsawstack/__init__.py +23 -0
- lfx/components/jigsawstack/ai_scrape.py +126 -0
- lfx/components/jigsawstack/ai_web_search.py +136 -0
- lfx/components/jigsawstack/file_read.py +115 -0
- lfx/components/jigsawstack/file_upload.py +94 -0
- lfx/components/jigsawstack/image_generation.py +205 -0
- lfx/components/jigsawstack/nsfw.py +60 -0
- lfx/components/jigsawstack/object_detection.py +124 -0
- lfx/components/jigsawstack/sentiment.py +112 -0
- lfx/components/jigsawstack/text_to_sql.py +90 -0
- lfx/components/jigsawstack/text_translate.py +77 -0
- lfx/components/jigsawstack/vocr.py +107 -0
- lfx/components/knowledge_bases/__init__.py +89 -0
- lfx/components/langchain_utilities/__init__.py +109 -0
- lfx/components/langchain_utilities/character.py +53 -0
- lfx/components/langchain_utilities/conversation.py +59 -0
- lfx/components/langchain_utilities/csv_agent.py +175 -0
- lfx/components/langchain_utilities/fake_embeddings.py +26 -0
- lfx/components/langchain_utilities/html_link_extractor.py +35 -0
- lfx/components/langchain_utilities/json_agent.py +100 -0
- lfx/components/langchain_utilities/langchain_hub.py +126 -0
- lfx/components/langchain_utilities/language_recursive.py +49 -0
- lfx/components/langchain_utilities/language_semantic.py +138 -0
- lfx/components/langchain_utilities/llm_checker.py +39 -0
- lfx/components/langchain_utilities/llm_math.py +42 -0
- lfx/components/langchain_utilities/natural_language.py +61 -0
- lfx/components/langchain_utilities/openai_tools.py +53 -0
- lfx/components/langchain_utilities/openapi.py +48 -0
- lfx/components/langchain_utilities/recursive_character.py +60 -0
- lfx/components/langchain_utilities/retrieval_qa.py +83 -0
- lfx/components/langchain_utilities/runnable_executor.py +137 -0
- lfx/components/langchain_utilities/self_query.py +80 -0
- lfx/components/langchain_utilities/spider.py +142 -0
- lfx/components/langchain_utilities/sql.py +40 -0
- lfx/components/langchain_utilities/sql_database.py +35 -0
- lfx/components/langchain_utilities/sql_generator.py +78 -0
- lfx/components/langchain_utilities/tool_calling.py +59 -0
- lfx/components/langchain_utilities/vector_store_info.py +49 -0
- lfx/components/langchain_utilities/vector_store_router.py +33 -0
- lfx/components/langchain_utilities/xml_agent.py +71 -0
- lfx/components/langwatch/__init__.py +3 -0
- lfx/components/langwatch/langwatch.py +278 -0
- lfx/components/link_extractors/__init__.py +3 -0
- lfx/components/llm_operations/__init__.py +46 -0
- lfx/components/llm_operations/batch_run.py +205 -0
- lfx/components/llm_operations/lambda_filter.py +218 -0
- lfx/components/llm_operations/llm_conditional_router.py +421 -0
- lfx/components/llm_operations/llm_selector.py +499 -0
- lfx/components/llm_operations/structured_output.py +244 -0
- lfx/components/lmstudio/__init__.py +34 -0
- lfx/components/lmstudio/lmstudioembeddings.py +89 -0
- lfx/components/lmstudio/lmstudiomodel.py +133 -0
- lfx/components/logic/__init__.py +181 -0
- lfx/components/maritalk/__init__.py +32 -0
- lfx/components/maritalk/maritalk.py +52 -0
- lfx/components/mem0/__init__.py +3 -0
- lfx/components/mem0/mem0_chat_memory.py +147 -0
- lfx/components/milvus/__init__.py +34 -0
- lfx/components/milvus/milvus.py +115 -0
- lfx/components/mistral/__init__.py +37 -0
- lfx/components/mistral/mistral.py +114 -0
- lfx/components/mistral/mistral_embeddings.py +58 -0
- lfx/components/models/__init__.py +89 -0
- lfx/components/models_and_agents/__init__.py +49 -0
- lfx/components/models_and_agents/agent.py +644 -0
- lfx/components/models_and_agents/embedding_model.py +423 -0
- lfx/components/models_and_agents/language_model.py +398 -0
- lfx/components/models_and_agents/mcp_component.py +594 -0
- lfx/components/models_and_agents/memory.py +268 -0
- lfx/components/models_and_agents/prompt.py +67 -0
- lfx/components/mongodb/__init__.py +34 -0
- lfx/components/mongodb/mongodb_atlas.py +213 -0
- lfx/components/needle/__init__.py +3 -0
- lfx/components/needle/needle.py +104 -0
- lfx/components/notdiamond/__init__.py +34 -0
- lfx/components/notdiamond/notdiamond.py +228 -0
- lfx/components/novita/__init__.py +32 -0
- lfx/components/novita/novita.py +130 -0
- lfx/components/nvidia/__init__.py +57 -0
- lfx/components/nvidia/nvidia.py +151 -0
- lfx/components/nvidia/nvidia_embedding.py +77 -0
- lfx/components/nvidia/nvidia_ingest.py +317 -0
- lfx/components/nvidia/nvidia_rerank.py +63 -0
- lfx/components/nvidia/system_assist.py +65 -0
- lfx/components/olivya/__init__.py +3 -0
- lfx/components/olivya/olivya.py +116 -0
- lfx/components/ollama/__init__.py +37 -0
- lfx/components/ollama/ollama.py +548 -0
- lfx/components/ollama/ollama_embeddings.py +103 -0
- lfx/components/openai/__init__.py +37 -0
- lfx/components/openai/openai.py +100 -0
- lfx/components/openai/openai_chat_model.py +176 -0
- lfx/components/openrouter/__init__.py +32 -0
- lfx/components/openrouter/openrouter.py +104 -0
- lfx/components/output_parsers/__init__.py +3 -0
- lfx/components/perplexity/__init__.py +34 -0
- lfx/components/perplexity/perplexity.py +75 -0
- lfx/components/pgvector/__init__.py +34 -0
- lfx/components/pgvector/pgvector.py +72 -0
- lfx/components/pinecone/__init__.py +34 -0
- lfx/components/pinecone/pinecone.py +134 -0
- lfx/components/processing/__init__.py +72 -0
- lfx/components/processing/alter_metadata.py +109 -0
- lfx/components/processing/combine_text.py +40 -0
- lfx/components/processing/converter.py +248 -0
- lfx/components/processing/create_data.py +111 -0
- lfx/components/processing/create_list.py +40 -0
- lfx/components/processing/data_operations.py +528 -0
- lfx/components/processing/data_to_dataframe.py +71 -0
- lfx/components/processing/dataframe_operations.py +313 -0
- lfx/components/processing/dataframe_to_toolset.py +259 -0
- lfx/components/processing/dynamic_create_data.py +357 -0
- lfx/components/processing/extract_key.py +54 -0
- lfx/components/processing/filter_data.py +43 -0
- lfx/components/processing/filter_data_values.py +89 -0
- lfx/components/processing/json_cleaner.py +104 -0
- lfx/components/processing/merge_data.py +91 -0
- lfx/components/processing/message_to_data.py +37 -0
- lfx/components/processing/output_parser.py +46 -0
- lfx/components/processing/parse_data.py +71 -0
- lfx/components/processing/parse_dataframe.py +69 -0
- lfx/components/processing/parse_json_data.py +91 -0
- lfx/components/processing/parser.py +148 -0
- lfx/components/processing/regex.py +83 -0
- lfx/components/processing/select_data.py +49 -0
- lfx/components/processing/split_text.py +141 -0
- lfx/components/processing/store_message.py +91 -0
- lfx/components/processing/update_data.py +161 -0
- lfx/components/prototypes/__init__.py +35 -0
- lfx/components/prototypes/python_function.py +73 -0
- lfx/components/qdrant/__init__.py +34 -0
- lfx/components/qdrant/qdrant.py +109 -0
- lfx/components/redis/__init__.py +37 -0
- lfx/components/redis/redis.py +89 -0
- lfx/components/redis/redis_chat.py +43 -0
- lfx/components/sambanova/__init__.py +32 -0
- lfx/components/sambanova/sambanova.py +84 -0
- lfx/components/scrapegraph/__init__.py +40 -0
- lfx/components/scrapegraph/scrapegraph_markdownify_api.py +64 -0
- lfx/components/scrapegraph/scrapegraph_search_api.py +64 -0
- lfx/components/scrapegraph/scrapegraph_smart_scraper_api.py +71 -0
- lfx/components/searchapi/__init__.py +34 -0
- lfx/components/searchapi/search.py +79 -0
- lfx/components/serpapi/__init__.py +3 -0
- lfx/components/serpapi/serp.py +115 -0
- lfx/components/supabase/__init__.py +34 -0
- lfx/components/supabase/supabase.py +76 -0
- lfx/components/tavily/__init__.py +4 -0
- lfx/components/tavily/tavily_extract.py +117 -0
- lfx/components/tavily/tavily_search.py +212 -0
- lfx/components/textsplitters/__init__.py +3 -0
- lfx/components/toolkits/__init__.py +3 -0
- lfx/components/tools/__init__.py +66 -0
- lfx/components/tools/calculator.py +109 -0
- lfx/components/tools/google_search_api.py +45 -0
- lfx/components/tools/google_serper_api.py +115 -0
- lfx/components/tools/python_code_structured_tool.py +328 -0
- lfx/components/tools/python_repl.py +98 -0
- lfx/components/tools/search_api.py +88 -0
- lfx/components/tools/searxng.py +145 -0
- lfx/components/tools/serp_api.py +120 -0
- lfx/components/tools/tavily_search_tool.py +345 -0
- lfx/components/tools/wikidata_api.py +103 -0
- lfx/components/tools/wikipedia_api.py +50 -0
- lfx/components/tools/yahoo_finance.py +130 -0
- lfx/components/twelvelabs/__init__.py +52 -0
- lfx/components/twelvelabs/convert_astra_results.py +84 -0
- lfx/components/twelvelabs/pegasus_index.py +311 -0
- lfx/components/twelvelabs/split_video.py +301 -0
- lfx/components/twelvelabs/text_embeddings.py +57 -0
- lfx/components/twelvelabs/twelvelabs_pegasus.py +408 -0
- lfx/components/twelvelabs/video_embeddings.py +100 -0
- lfx/components/twelvelabs/video_file.py +191 -0
- lfx/components/unstructured/__init__.py +3 -0
- lfx/components/unstructured/unstructured.py +121 -0
- lfx/components/upstash/__init__.py +34 -0
- lfx/components/upstash/upstash.py +124 -0
- lfx/components/utilities/__init__.py +43 -0
- lfx/components/utilities/calculator_core.py +89 -0
- lfx/components/utilities/current_date.py +42 -0
- lfx/components/utilities/id_generator.py +42 -0
- lfx/components/utilities/python_repl_core.py +98 -0
- lfx/components/vectara/__init__.py +37 -0
- lfx/components/vectara/vectara.py +97 -0
- lfx/components/vectara/vectara_rag.py +164 -0
- lfx/components/vectorstores/__init__.py +34 -0
- lfx/components/vectorstores/local_db.py +270 -0
- lfx/components/vertexai/__init__.py +37 -0
- lfx/components/vertexai/vertexai.py +71 -0
- lfx/components/vertexai/vertexai_embeddings.py +67 -0
- lfx/components/vlmrun/__init__.py +34 -0
- lfx/components/vlmrun/vlmrun_transcription.py +224 -0
- lfx/components/weaviate/__init__.py +34 -0
- lfx/components/weaviate/weaviate.py +89 -0
- lfx/components/wikipedia/__init__.py +4 -0
- lfx/components/wikipedia/wikidata.py +86 -0
- lfx/components/wikipedia/wikipedia.py +53 -0
- lfx/components/wolframalpha/__init__.py +3 -0
- lfx/components/wolframalpha/wolfram_alpha_api.py +54 -0
- lfx/components/xai/__init__.py +32 -0
- lfx/components/xai/xai.py +167 -0
- lfx/components/yahoosearch/__init__.py +3 -0
- lfx/components/yahoosearch/yahoo.py +137 -0
- lfx/components/youtube/__init__.py +52 -0
- lfx/components/youtube/channel.py +227 -0
- lfx/components/youtube/comments.py +231 -0
- lfx/components/youtube/playlist.py +33 -0
- lfx/components/youtube/search.py +120 -0
- lfx/components/youtube/trending.py +285 -0
- lfx/components/youtube/video_details.py +263 -0
- lfx/components/youtube/youtube_transcripts.py +206 -0
- lfx/components/zep/__init__.py +3 -0
- lfx/components/zep/zep.py +45 -0
- lfx/constants.py +6 -0
- lfx/custom/__init__.py +7 -0
- lfx/custom/attributes.py +87 -0
- lfx/custom/code_parser/__init__.py +3 -0
- lfx/custom/code_parser/code_parser.py +361 -0
- lfx/custom/custom_component/__init__.py +0 -0
- lfx/custom/custom_component/base_component.py +128 -0
- lfx/custom/custom_component/component.py +1890 -0
- lfx/custom/custom_component/component_with_cache.py +8 -0
- lfx/custom/custom_component/custom_component.py +650 -0
- lfx/custom/dependency_analyzer.py +165 -0
- lfx/custom/directory_reader/__init__.py +3 -0
- lfx/custom/directory_reader/directory_reader.py +359 -0
- lfx/custom/directory_reader/utils.py +171 -0
- lfx/custom/eval.py +12 -0
- lfx/custom/schema.py +32 -0
- lfx/custom/tree_visitor.py +21 -0
- lfx/custom/utils.py +877 -0
- lfx/custom/validate.py +523 -0
- lfx/events/__init__.py +1 -0
- lfx/events/event_manager.py +110 -0
- lfx/exceptions/__init__.py +0 -0
- lfx/exceptions/component.py +15 -0
- lfx/field_typing/__init__.py +91 -0
- lfx/field_typing/constants.py +216 -0
- lfx/field_typing/range_spec.py +35 -0
- lfx/graph/__init__.py +6 -0
- lfx/graph/edge/__init__.py +0 -0
- lfx/graph/edge/base.py +300 -0
- lfx/graph/edge/schema.py +119 -0
- lfx/graph/edge/utils.py +0 -0
- lfx/graph/graph/__init__.py +0 -0
- lfx/graph/graph/ascii.py +202 -0
- lfx/graph/graph/base.py +2298 -0
- lfx/graph/graph/constants.py +63 -0
- lfx/graph/graph/runnable_vertices_manager.py +133 -0
- lfx/graph/graph/schema.py +53 -0
- lfx/graph/graph/state_model.py +66 -0
- lfx/graph/graph/utils.py +1024 -0
- lfx/graph/schema.py +75 -0
- lfx/graph/state/__init__.py +0 -0
- lfx/graph/state/model.py +250 -0
- lfx/graph/utils.py +206 -0
- lfx/graph/vertex/__init__.py +0 -0
- lfx/graph/vertex/base.py +826 -0
- lfx/graph/vertex/constants.py +0 -0
- lfx/graph/vertex/exceptions.py +4 -0
- lfx/graph/vertex/param_handler.py +316 -0
- lfx/graph/vertex/schema.py +26 -0
- lfx/graph/vertex/utils.py +19 -0
- lfx/graph/vertex/vertex_types.py +489 -0
- lfx/helpers/__init__.py +141 -0
- lfx/helpers/base_model.py +71 -0
- lfx/helpers/custom.py +13 -0
- lfx/helpers/data.py +167 -0
- lfx/helpers/flow.py +308 -0
- lfx/inputs/__init__.py +68 -0
- lfx/inputs/constants.py +2 -0
- lfx/inputs/input_mixin.py +352 -0
- lfx/inputs/inputs.py +718 -0
- lfx/inputs/validators.py +19 -0
- lfx/interface/__init__.py +6 -0
- lfx/interface/components.py +897 -0
- lfx/interface/importing/__init__.py +5 -0
- lfx/interface/importing/utils.py +39 -0
- lfx/interface/initialize/__init__.py +3 -0
- lfx/interface/initialize/loading.py +317 -0
- lfx/interface/listing.py +26 -0
- lfx/interface/run.py +16 -0
- lfx/interface/utils.py +111 -0
- lfx/io/__init__.py +63 -0
- lfx/io/schema.py +295 -0
- lfx/load/__init__.py +8 -0
- lfx/load/load.py +256 -0
- lfx/load/utils.py +99 -0
- lfx/log/__init__.py +5 -0
- lfx/log/logger.py +411 -0
- lfx/logging/__init__.py +11 -0
- lfx/logging/logger.py +24 -0
- lfx/memory/__init__.py +70 -0
- lfx/memory/stubs.py +302 -0
- lfx/processing/__init__.py +1 -0
- lfx/processing/process.py +238 -0
- lfx/processing/utils.py +25 -0
- lfx/py.typed +0 -0
- lfx/schema/__init__.py +66 -0
- lfx/schema/artifact.py +83 -0
- lfx/schema/content_block.py +62 -0
- lfx/schema/content_types.py +91 -0
- lfx/schema/cross_module.py +80 -0
- lfx/schema/data.py +309 -0
- lfx/schema/dataframe.py +210 -0
- lfx/schema/dotdict.py +74 -0
- lfx/schema/encoders.py +13 -0
- lfx/schema/graph.py +47 -0
- lfx/schema/image.py +184 -0
- lfx/schema/json_schema.py +186 -0
- lfx/schema/log.py +62 -0
- lfx/schema/message.py +493 -0
- lfx/schema/openai_responses_schemas.py +74 -0
- lfx/schema/properties.py +41 -0
- lfx/schema/schema.py +180 -0
- lfx/schema/serialize.py +13 -0
- lfx/schema/table.py +142 -0
- lfx/schema/validators.py +114 -0
- lfx/serialization/__init__.py +5 -0
- lfx/serialization/constants.py +2 -0
- lfx/serialization/serialization.py +314 -0
- lfx/services/__init__.py +26 -0
- lfx/services/base.py +28 -0
- lfx/services/cache/__init__.py +6 -0
- lfx/services/cache/base.py +183 -0
- lfx/services/cache/service.py +166 -0
- lfx/services/cache/utils.py +169 -0
- lfx/services/chat/__init__.py +1 -0
- lfx/services/chat/config.py +2 -0
- lfx/services/chat/schema.py +10 -0
- lfx/services/database/__init__.py +5 -0
- lfx/services/database/service.py +25 -0
- lfx/services/deps.py +194 -0
- lfx/services/factory.py +19 -0
- lfx/services/initialize.py +19 -0
- lfx/services/interfaces.py +103 -0
- lfx/services/manager.py +185 -0
- lfx/services/mcp_composer/__init__.py +6 -0
- lfx/services/mcp_composer/factory.py +16 -0
- lfx/services/mcp_composer/service.py +1441 -0
- lfx/services/schema.py +21 -0
- lfx/services/session.py +87 -0
- lfx/services/settings/__init__.py +3 -0
- lfx/services/settings/auth.py +133 -0
- lfx/services/settings/base.py +668 -0
- lfx/services/settings/constants.py +43 -0
- lfx/services/settings/factory.py +23 -0
- lfx/services/settings/feature_flags.py +11 -0
- lfx/services/settings/service.py +35 -0
- lfx/services/settings/utils.py +40 -0
- lfx/services/shared_component_cache/__init__.py +1 -0
- lfx/services/shared_component_cache/factory.py +30 -0
- lfx/services/shared_component_cache/service.py +9 -0
- lfx/services/storage/__init__.py +5 -0
- lfx/services/storage/local.py +185 -0
- lfx/services/storage/service.py +177 -0
- lfx/services/tracing/__init__.py +1 -0
- lfx/services/tracing/service.py +21 -0
- lfx/settings.py +6 -0
- lfx/template/__init__.py +6 -0
- lfx/template/field/__init__.py +0 -0
- lfx/template/field/base.py +260 -0
- lfx/template/field/prompt.py +15 -0
- lfx/template/frontend_node/__init__.py +6 -0
- lfx/template/frontend_node/base.py +214 -0
- lfx/template/frontend_node/constants.py +65 -0
- lfx/template/frontend_node/custom_components.py +79 -0
- lfx/template/template/__init__.py +0 -0
- lfx/template/template/base.py +100 -0
- lfx/template/utils.py +217 -0
- lfx/type_extraction/__init__.py +19 -0
- lfx/type_extraction/type_extraction.py +75 -0
- lfx/type_extraction.py +80 -0
- lfx/utils/__init__.py +1 -0
- lfx/utils/async_helpers.py +42 -0
- lfx/utils/component_utils.py +154 -0
- lfx/utils/concurrency.py +60 -0
- lfx/utils/connection_string_parser.py +11 -0
- lfx/utils/constants.py +233 -0
- lfx/utils/data_structure.py +212 -0
- lfx/utils/exceptions.py +22 -0
- lfx/utils/helpers.py +34 -0
- lfx/utils/image.py +79 -0
- lfx/utils/langflow_utils.py +52 -0
- lfx/utils/lazy_load.py +15 -0
- lfx/utils/request_utils.py +18 -0
- lfx/utils/schemas.py +139 -0
- lfx/utils/ssrf_protection.py +384 -0
- lfx/utils/util.py +626 -0
- lfx/utils/util_strings.py +56 -0
- lfx/utils/validate_cloud.py +26 -0
- lfx/utils/version.py +24 -0
- lfx_nightly-0.2.0.dev25.dist-info/METADATA +312 -0
- lfx_nightly-0.2.0.dev25.dist-info/RECORD +769 -0
- lfx_nightly-0.2.0.dev25.dist-info/WHEEL +4 -0
- lfx_nightly-0.2.0.dev25.dist-info/entry_points.txt +2 -0
|
@@ -0,0 +1,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,143 @@
|
|
|
1
|
+
from pydantic.v1 import SecretStr
|
|
2
|
+
|
|
3
|
+
from lfx.base.models.groq_constants import GROQ_MODELS
|
|
4
|
+
from lfx.base.models.groq_model_discovery import get_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. Add your Groq API key to access additional available models.",
|
|
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
|
+
"""Get available Groq models using the dynamic discovery system.
|
|
75
|
+
|
|
76
|
+
This method uses the groq_model_discovery module which:
|
|
77
|
+
- Fetches models directly from Groq API
|
|
78
|
+
- Automatically tests tool calling support
|
|
79
|
+
- Caches results for 24 hours
|
|
80
|
+
- Falls back to hardcoded list if API fails
|
|
81
|
+
|
|
82
|
+
Args:
|
|
83
|
+
tool_model_enabled: If True, only return models that support tool calling
|
|
84
|
+
|
|
85
|
+
Returns:
|
|
86
|
+
List of available model IDs
|
|
87
|
+
"""
|
|
88
|
+
try:
|
|
89
|
+
# Get models with metadata from dynamic discovery system
|
|
90
|
+
api_key = self.api_key if hasattr(self, "api_key") and self.api_key else None
|
|
91
|
+
models_metadata = get_groq_models(api_key=api_key)
|
|
92
|
+
|
|
93
|
+
# Filter out non-LLM models (audio, TTS, guards)
|
|
94
|
+
model_ids = [
|
|
95
|
+
model_id for model_id, metadata in models_metadata.items() if not metadata.get("not_supported", False)
|
|
96
|
+
]
|
|
97
|
+
|
|
98
|
+
# Filter by tool calling support if requested
|
|
99
|
+
if tool_model_enabled:
|
|
100
|
+
model_ids = [model_id for model_id in model_ids if models_metadata[model_id].get("tool_calling", False)]
|
|
101
|
+
logger.info(f"Loaded {len(model_ids)} Groq models with tool calling support")
|
|
102
|
+
else:
|
|
103
|
+
logger.info(f"Loaded {len(model_ids)} Groq models")
|
|
104
|
+
except (ValueError, KeyError, TypeError, ImportError) as e:
|
|
105
|
+
logger.exception(f"Error getting model names: {e}")
|
|
106
|
+
# Fallback to hardcoded list from groq_constants.py
|
|
107
|
+
return GROQ_MODELS
|
|
108
|
+
else:
|
|
109
|
+
return model_ids
|
|
110
|
+
|
|
111
|
+
def update_build_config(self, build_config: dict, field_value: str, field_name: str | None = None):
|
|
112
|
+
if field_name in {"base_url", "model_name", "tool_model_enabled", "api_key"} and field_value:
|
|
113
|
+
try:
|
|
114
|
+
if len(self.api_key) != 0:
|
|
115
|
+
try:
|
|
116
|
+
ids = self.get_models(tool_model_enabled=self.tool_model_enabled)
|
|
117
|
+
except (ValueError, KeyError, TypeError, ImportError) as e:
|
|
118
|
+
logger.exception(f"Error getting model names: {e}")
|
|
119
|
+
ids = GROQ_MODELS
|
|
120
|
+
build_config.setdefault("model_name", {})
|
|
121
|
+
build_config["model_name"]["options"] = ids
|
|
122
|
+
build_config["model_name"].setdefault("value", ids[0])
|
|
123
|
+
except (ValueError, KeyError, TypeError, AttributeError) as e:
|
|
124
|
+
msg = f"Error getting model names: {e}"
|
|
125
|
+
raise ValueError(msg) from e
|
|
126
|
+
return build_config
|
|
127
|
+
|
|
128
|
+
def build_model(self) -> LanguageModel: # type: ignore[type-var]
|
|
129
|
+
try:
|
|
130
|
+
from langchain_groq import ChatGroq
|
|
131
|
+
except ImportError as e:
|
|
132
|
+
msg = "langchain-groq is not installed. Please install it with `pip install langchain-groq`."
|
|
133
|
+
raise ImportError(msg) from e
|
|
134
|
+
|
|
135
|
+
return ChatGroq(
|
|
136
|
+
model=self.model_name,
|
|
137
|
+
max_tokens=self.max_tokens or None,
|
|
138
|
+
temperature=self.temperature,
|
|
139
|
+
base_url=self.base_url,
|
|
140
|
+
n=self.n or 1,
|
|
141
|
+
api_key=SecretStr(self.api_key).get_secret_value(),
|
|
142
|
+
streaming=self.stream,
|
|
143
|
+
)
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
"""Helpers module - backwards compatibility for moved components."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import sys
|
|
6
|
+
from typing import TYPE_CHECKING, Any
|
|
7
|
+
|
|
8
|
+
from lfx.components._importing import import_mod
|
|
9
|
+
|
|
10
|
+
if TYPE_CHECKING:
|
|
11
|
+
from lfx.components.helpers.calculator_core import CalculatorComponent
|
|
12
|
+
from lfx.components.helpers.create_list import CreateListComponent
|
|
13
|
+
from lfx.components.helpers.current_date import CurrentDateComponent
|
|
14
|
+
from lfx.components.helpers.id_generator import IDGeneratorComponent
|
|
15
|
+
from lfx.components.helpers.memory import MemoryComponent
|
|
16
|
+
from lfx.components.helpers.output_parser import OutputParserComponent
|
|
17
|
+
from lfx.components.helpers.store_message import MessageStoreComponent
|
|
18
|
+
|
|
19
|
+
_dynamic_imports = {
|
|
20
|
+
"CalculatorComponent": "calculator_core",
|
|
21
|
+
"CreateListComponent": "create_list",
|
|
22
|
+
"CurrentDateComponent": "current_date",
|
|
23
|
+
"IDGeneratorComponent": "id_generator",
|
|
24
|
+
"MemoryComponent": "memory",
|
|
25
|
+
"OutputParserComponent": "output_parser",
|
|
26
|
+
"MessageStoreComponent": "store_message",
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
__all__ = [
|
|
30
|
+
"CalculatorComponent",
|
|
31
|
+
"CreateListComponent",
|
|
32
|
+
"CurrentDateComponent",
|
|
33
|
+
"IDGeneratorComponent",
|
|
34
|
+
"MemoryComponent",
|
|
35
|
+
"MessageStoreComponent",
|
|
36
|
+
"OutputParserComponent",
|
|
37
|
+
]
|
|
38
|
+
|
|
39
|
+
# Register redirected submodules in sys.modules for direct importlib.import_module() calls
|
|
40
|
+
# This allows imports like: import lfx.components.helpers.current_date
|
|
41
|
+
_redirected_submodules = {
|
|
42
|
+
"lfx.components.helpers.current_date": "lfx.components.utilities.current_date",
|
|
43
|
+
"lfx.components.helpers.calculator_core": "lfx.components.utilities.calculator_core",
|
|
44
|
+
"lfx.components.helpers.id_generator": "lfx.components.utilities.id_generator",
|
|
45
|
+
"lfx.components.helpers.memory": "lfx.components.models_and_agents.memory",
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
for old_path, new_path in _redirected_submodules.items():
|
|
49
|
+
if old_path not in sys.modules:
|
|
50
|
+
# Use a lazy loader that imports the actual module when accessed
|
|
51
|
+
class _RedirectedModule:
|
|
52
|
+
def __init__(self, target_path: str, original_path: str):
|
|
53
|
+
self._target_path = target_path
|
|
54
|
+
self._original_path = original_path
|
|
55
|
+
self._module = None
|
|
56
|
+
|
|
57
|
+
def __getattr__(self, name: str) -> Any:
|
|
58
|
+
if self._module is None:
|
|
59
|
+
from importlib import import_module
|
|
60
|
+
|
|
61
|
+
self._module = import_module(self._target_path)
|
|
62
|
+
# Also register under the original path for future imports
|
|
63
|
+
sys.modules[self._original_path] = self._module
|
|
64
|
+
return getattr(self._module, name)
|
|
65
|
+
|
|
66
|
+
def __repr__(self) -> str:
|
|
67
|
+
return f"<redirected module '{self._original_path}' -> '{self._target_path}'>"
|
|
68
|
+
|
|
69
|
+
sys.modules[old_path] = _RedirectedModule(new_path, old_path)
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def __getattr__(attr_name: str) -> Any:
|
|
73
|
+
"""Lazily import helper components on attribute access."""
|
|
74
|
+
# Handle submodule access for backwards compatibility
|
|
75
|
+
# e.g., lfx.components.helpers.id_generator -> lfx.components.utilities.id_generator
|
|
76
|
+
if attr_name == "id_generator":
|
|
77
|
+
from importlib import import_module
|
|
78
|
+
|
|
79
|
+
result = import_module("lfx.components.utilities.id_generator")
|
|
80
|
+
globals()[attr_name] = result
|
|
81
|
+
return result
|
|
82
|
+
if attr_name == "calculator_core":
|
|
83
|
+
from importlib import import_module
|
|
84
|
+
|
|
85
|
+
result = import_module("lfx.components.utilities.calculator_core")
|
|
86
|
+
globals()[attr_name] = result
|
|
87
|
+
return result
|
|
88
|
+
if attr_name == "current_date":
|
|
89
|
+
from importlib import import_module
|
|
90
|
+
|
|
91
|
+
result = import_module("lfx.components.utilities.current_date")
|
|
92
|
+
globals()[attr_name] = result
|
|
93
|
+
return result
|
|
94
|
+
if attr_name == "memory":
|
|
95
|
+
from importlib import import_module
|
|
96
|
+
|
|
97
|
+
result = import_module("lfx.components.models_and_agents.memory")
|
|
98
|
+
globals()[attr_name] = result
|
|
99
|
+
return result
|
|
100
|
+
|
|
101
|
+
if attr_name not in _dynamic_imports:
|
|
102
|
+
msg = f"module '{__name__}' has no attribute '{attr_name}'"
|
|
103
|
+
raise AttributeError(msg)
|
|
104
|
+
|
|
105
|
+
# CurrentDateComponent, CalculatorComponent, and IDGeneratorComponent were moved to utilities
|
|
106
|
+
# Forward them to utilities for backwards compatibility
|
|
107
|
+
if attr_name in ("CurrentDateComponent", "CalculatorComponent", "IDGeneratorComponent"):
|
|
108
|
+
from lfx.components import utilities
|
|
109
|
+
|
|
110
|
+
result = getattr(utilities, attr_name)
|
|
111
|
+
globals()[attr_name] = result
|
|
112
|
+
return result
|
|
113
|
+
|
|
114
|
+
# MemoryComponent was moved to models_and_agents
|
|
115
|
+
# Forward it to models_and_agents for backwards compatibility
|
|
116
|
+
if attr_name == "MemoryComponent":
|
|
117
|
+
from lfx.components import models_and_agents
|
|
118
|
+
|
|
119
|
+
result = getattr(models_and_agents, attr_name)
|
|
120
|
+
globals()[attr_name] = result
|
|
121
|
+
return result
|
|
122
|
+
|
|
123
|
+
# CreateListComponent, MessageStoreComponent, and OutputParserComponent were moved to processing
|
|
124
|
+
# Forward them to processing for backwards compatibility
|
|
125
|
+
if attr_name == "CreateListComponent":
|
|
126
|
+
from lfx.components import processing
|
|
127
|
+
|
|
128
|
+
result = getattr(processing, attr_name)
|
|
129
|
+
globals()[attr_name] = result
|
|
130
|
+
return result
|
|
131
|
+
if attr_name == "MessageStoreComponent":
|
|
132
|
+
from lfx.components import processing
|
|
133
|
+
|
|
134
|
+
result = processing.MessageStoreComponent
|
|
135
|
+
globals()[attr_name] = result
|
|
136
|
+
return result
|
|
137
|
+
if attr_name == "OutputParserComponent":
|
|
138
|
+
from lfx.components import processing
|
|
139
|
+
|
|
140
|
+
result = getattr(processing, attr_name)
|
|
141
|
+
globals()[attr_name] = result
|
|
142
|
+
return result
|
|
143
|
+
|
|
144
|
+
try:
|
|
145
|
+
result = import_mod(attr_name, _dynamic_imports[attr_name], __spec__.parent)
|
|
146
|
+
except (ModuleNotFoundError, ImportError, AttributeError) as e:
|
|
147
|
+
msg = f"Could not import '{attr_name}' from '{__name__}': {e}"
|
|
148
|
+
raise AttributeError(msg) from e
|
|
149
|
+
globals()[attr_name] = result
|
|
150
|
+
return result
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
def __dir__() -> list[str]:
|
|
154
|
+
return list(__all__)
|