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,109 @@
|
|
|
1
|
+
from lfx.base.models.aws_constants import AWS_EMBEDDING_MODEL_IDS, AWS_REGIONS
|
|
2
|
+
from lfx.base.models.model import LCModelComponent
|
|
3
|
+
from lfx.field_typing import Embeddings
|
|
4
|
+
from lfx.inputs.inputs import SecretStrInput
|
|
5
|
+
from lfx.io import DropdownInput, MessageTextInput, Output
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class AmazonBedrockEmbeddingsComponent(LCModelComponent):
|
|
9
|
+
display_name: str = "Amazon Bedrock Embeddings"
|
|
10
|
+
description: str = "Generate embeddings using Amazon Bedrock models."
|
|
11
|
+
icon = "Amazon"
|
|
12
|
+
name = "AmazonBedrockEmbeddings"
|
|
13
|
+
|
|
14
|
+
inputs = [
|
|
15
|
+
DropdownInput(
|
|
16
|
+
name="model_id",
|
|
17
|
+
display_name="Model Id",
|
|
18
|
+
options=AWS_EMBEDDING_MODEL_IDS,
|
|
19
|
+
value="amazon.titan-embed-text-v1",
|
|
20
|
+
),
|
|
21
|
+
SecretStrInput(
|
|
22
|
+
name="aws_access_key_id",
|
|
23
|
+
display_name="AWS Access Key ID",
|
|
24
|
+
info="The access key for your AWS account."
|
|
25
|
+
"Usually set in Python code as the environment variable 'AWS_ACCESS_KEY_ID'.",
|
|
26
|
+
value="AWS_ACCESS_KEY_ID",
|
|
27
|
+
required=True,
|
|
28
|
+
),
|
|
29
|
+
SecretStrInput(
|
|
30
|
+
name="aws_secret_access_key",
|
|
31
|
+
display_name="AWS Secret Access Key",
|
|
32
|
+
info="The secret key for your AWS account. "
|
|
33
|
+
"Usually set in Python code as the environment variable 'AWS_SECRET_ACCESS_KEY'.",
|
|
34
|
+
value="AWS_SECRET_ACCESS_KEY",
|
|
35
|
+
required=True,
|
|
36
|
+
),
|
|
37
|
+
SecretStrInput(
|
|
38
|
+
name="aws_session_token",
|
|
39
|
+
display_name="AWS Session Token",
|
|
40
|
+
advanced=False,
|
|
41
|
+
info="The session key for your AWS account. "
|
|
42
|
+
"Only needed for temporary credentials. "
|
|
43
|
+
"Usually set in Python code as the environment variable 'AWS_SESSION_TOKEN'.",
|
|
44
|
+
value="AWS_SESSION_TOKEN",
|
|
45
|
+
),
|
|
46
|
+
SecretStrInput(
|
|
47
|
+
name="credentials_profile_name",
|
|
48
|
+
display_name="Credentials Profile Name",
|
|
49
|
+
advanced=True,
|
|
50
|
+
info="The name of the profile to use from your "
|
|
51
|
+
"~/.aws/credentials file. "
|
|
52
|
+
"If not provided, the default profile will be used.",
|
|
53
|
+
value="AWS_CREDENTIALS_PROFILE_NAME",
|
|
54
|
+
),
|
|
55
|
+
DropdownInput(
|
|
56
|
+
name="region_name",
|
|
57
|
+
display_name="Region Name",
|
|
58
|
+
value="us-east-1",
|
|
59
|
+
options=AWS_REGIONS,
|
|
60
|
+
info="The AWS region where your Bedrock resources are located.",
|
|
61
|
+
),
|
|
62
|
+
MessageTextInput(
|
|
63
|
+
name="endpoint_url",
|
|
64
|
+
display_name="Endpoint URL",
|
|
65
|
+
advanced=True,
|
|
66
|
+
info="The URL of the AWS Bedrock endpoint to use.",
|
|
67
|
+
),
|
|
68
|
+
]
|
|
69
|
+
|
|
70
|
+
outputs = [
|
|
71
|
+
Output(display_name="Embeddings", name="embeddings", method="build_embeddings"),
|
|
72
|
+
]
|
|
73
|
+
|
|
74
|
+
def build_embeddings(self) -> Embeddings:
|
|
75
|
+
try:
|
|
76
|
+
from langchain_aws import BedrockEmbeddings
|
|
77
|
+
except ImportError as e:
|
|
78
|
+
msg = "langchain_aws is not installed. Please install it with `pip install langchain_aws`."
|
|
79
|
+
raise ImportError(msg) from e
|
|
80
|
+
try:
|
|
81
|
+
import boto3
|
|
82
|
+
except ImportError as e:
|
|
83
|
+
msg = "boto3 is not installed. Please install it with `pip install boto3`."
|
|
84
|
+
raise ImportError(msg) from e
|
|
85
|
+
if self.aws_access_key_id or self.aws_secret_access_key:
|
|
86
|
+
session = boto3.Session(
|
|
87
|
+
aws_access_key_id=self.aws_access_key_id,
|
|
88
|
+
aws_secret_access_key=self.aws_secret_access_key,
|
|
89
|
+
aws_session_token=self.aws_session_token,
|
|
90
|
+
)
|
|
91
|
+
elif self.credentials_profile_name:
|
|
92
|
+
session = boto3.Session(profile_name=self.credentials_profile_name)
|
|
93
|
+
else:
|
|
94
|
+
session = boto3.Session()
|
|
95
|
+
|
|
96
|
+
client_params = {}
|
|
97
|
+
if self.endpoint_url:
|
|
98
|
+
client_params["endpoint_url"] = self.endpoint_url
|
|
99
|
+
if self.region_name:
|
|
100
|
+
client_params["region_name"] = self.region_name
|
|
101
|
+
|
|
102
|
+
boto3_client = session.client("bedrock-runtime", **client_params)
|
|
103
|
+
return BedrockEmbeddings(
|
|
104
|
+
credentials_profile_name=self.credentials_profile_name,
|
|
105
|
+
client=boto3_client,
|
|
106
|
+
model_id=self.model_id,
|
|
107
|
+
endpoint_url=self.endpoint_url,
|
|
108
|
+
region_name=self.region_name,
|
|
109
|
+
)
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
from lfx.base.models.aws_constants import AWS_REGIONS, AWS_MODEL_IDs
|
|
2
|
+
from lfx.base.models.model import LCModelComponent
|
|
3
|
+
from lfx.field_typing import LanguageModel
|
|
4
|
+
from lfx.inputs.inputs import MessageTextInput, SecretStrInput
|
|
5
|
+
from lfx.io import DictInput, DropdownInput
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class AmazonBedrockComponent(LCModelComponent):
|
|
9
|
+
display_name: str = "Amazon Bedrock"
|
|
10
|
+
description: str = (
|
|
11
|
+
"Generate text using Amazon Bedrock LLMs with the legacy ChatBedrock API. "
|
|
12
|
+
"This component is deprecated. Please use Amazon Bedrock Converse instead "
|
|
13
|
+
"for better compatibility, newer features, and improved conversation handling."
|
|
14
|
+
)
|
|
15
|
+
icon = "Amazon"
|
|
16
|
+
name = "AmazonBedrockModel"
|
|
17
|
+
legacy = True
|
|
18
|
+
replacement = "amazon.AmazonBedrockConverseModel"
|
|
19
|
+
|
|
20
|
+
inputs = [
|
|
21
|
+
*LCModelComponent.get_base_inputs(),
|
|
22
|
+
DropdownInput(
|
|
23
|
+
name="model_id",
|
|
24
|
+
display_name="Model ID",
|
|
25
|
+
options=AWS_MODEL_IDs,
|
|
26
|
+
value="anthropic.claude-3-haiku-20240307-v1:0",
|
|
27
|
+
info="List of available model IDs to choose from.",
|
|
28
|
+
),
|
|
29
|
+
SecretStrInput(
|
|
30
|
+
name="aws_access_key_id",
|
|
31
|
+
display_name="AWS Access Key ID",
|
|
32
|
+
info="The access key for your AWS account."
|
|
33
|
+
"Usually set in Python code as the environment variable 'AWS_ACCESS_KEY_ID'.",
|
|
34
|
+
value="AWS_ACCESS_KEY_ID",
|
|
35
|
+
required=True,
|
|
36
|
+
),
|
|
37
|
+
SecretStrInput(
|
|
38
|
+
name="aws_secret_access_key",
|
|
39
|
+
display_name="AWS Secret Access Key",
|
|
40
|
+
info="The secret key for your AWS account. "
|
|
41
|
+
"Usually set in Python code as the environment variable 'AWS_SECRET_ACCESS_KEY'.",
|
|
42
|
+
value="AWS_SECRET_ACCESS_KEY",
|
|
43
|
+
required=True,
|
|
44
|
+
),
|
|
45
|
+
SecretStrInput(
|
|
46
|
+
name="aws_session_token",
|
|
47
|
+
display_name="AWS Session Token",
|
|
48
|
+
advanced=False,
|
|
49
|
+
info="The session key for your AWS account. "
|
|
50
|
+
"Only needed for temporary credentials. "
|
|
51
|
+
"Usually set in Python code as the environment variable 'AWS_SESSION_TOKEN'.",
|
|
52
|
+
load_from_db=False,
|
|
53
|
+
),
|
|
54
|
+
SecretStrInput(
|
|
55
|
+
name="credentials_profile_name",
|
|
56
|
+
display_name="Credentials Profile Name",
|
|
57
|
+
advanced=True,
|
|
58
|
+
info="The name of the profile to use from your "
|
|
59
|
+
"~/.aws/credentials file. "
|
|
60
|
+
"If not provided, the default profile will be used.",
|
|
61
|
+
load_from_db=False,
|
|
62
|
+
),
|
|
63
|
+
DropdownInput(
|
|
64
|
+
name="region_name",
|
|
65
|
+
display_name="Region Name",
|
|
66
|
+
value="us-east-1",
|
|
67
|
+
options=AWS_REGIONS,
|
|
68
|
+
info="The AWS region where your Bedrock resources are located.",
|
|
69
|
+
),
|
|
70
|
+
DictInput(
|
|
71
|
+
name="model_kwargs",
|
|
72
|
+
display_name="Model Kwargs",
|
|
73
|
+
advanced=True,
|
|
74
|
+
is_list=True,
|
|
75
|
+
info="Additional keyword arguments to pass to the model.",
|
|
76
|
+
),
|
|
77
|
+
MessageTextInput(
|
|
78
|
+
name="endpoint_url",
|
|
79
|
+
display_name="Endpoint URL",
|
|
80
|
+
advanced=True,
|
|
81
|
+
info="The URL of the Bedrock endpoint to use.",
|
|
82
|
+
),
|
|
83
|
+
]
|
|
84
|
+
|
|
85
|
+
def build_model(self) -> LanguageModel: # type: ignore[type-var]
|
|
86
|
+
try:
|
|
87
|
+
from langchain_aws import ChatBedrock
|
|
88
|
+
except ImportError as e:
|
|
89
|
+
msg = "langchain_aws is not installed. Please install it with `pip install langchain_aws`."
|
|
90
|
+
raise ImportError(msg) from e
|
|
91
|
+
try:
|
|
92
|
+
import boto3
|
|
93
|
+
except ImportError as e:
|
|
94
|
+
msg = "boto3 is not installed. Please install it with `pip install boto3`."
|
|
95
|
+
raise ImportError(msg) from e
|
|
96
|
+
if self.aws_access_key_id or self.aws_secret_access_key:
|
|
97
|
+
try:
|
|
98
|
+
session = boto3.Session(
|
|
99
|
+
aws_access_key_id=self.aws_access_key_id,
|
|
100
|
+
aws_secret_access_key=self.aws_secret_access_key,
|
|
101
|
+
aws_session_token=self.aws_session_token,
|
|
102
|
+
)
|
|
103
|
+
except Exception as e:
|
|
104
|
+
msg = "Could not create a boto3 session."
|
|
105
|
+
raise ValueError(msg) from e
|
|
106
|
+
elif self.credentials_profile_name:
|
|
107
|
+
session = boto3.Session(profile_name=self.credentials_profile_name)
|
|
108
|
+
else:
|
|
109
|
+
session = boto3.Session()
|
|
110
|
+
|
|
111
|
+
client_params = {}
|
|
112
|
+
if self.endpoint_url:
|
|
113
|
+
client_params["endpoint_url"] = self.endpoint_url
|
|
114
|
+
if self.region_name:
|
|
115
|
+
client_params["region_name"] = self.region_name
|
|
116
|
+
|
|
117
|
+
boto3_client = session.client("bedrock-runtime", **client_params)
|
|
118
|
+
try:
|
|
119
|
+
output = ChatBedrock(
|
|
120
|
+
client=boto3_client,
|
|
121
|
+
model_id=self.model_id,
|
|
122
|
+
region_name=self.region_name,
|
|
123
|
+
model_kwargs=self.model_kwargs,
|
|
124
|
+
endpoint_url=self.endpoint_url,
|
|
125
|
+
streaming=self.stream,
|
|
126
|
+
)
|
|
127
|
+
except Exception as e:
|
|
128
|
+
msg = "Could not connect to AmazonBedrock API."
|
|
129
|
+
raise ValueError(msg) from e
|
|
130
|
+
return output
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
from pathlib import Path
|
|
2
|
+
from typing import Any
|
|
3
|
+
|
|
4
|
+
from lfx.custom.custom_component.component import Component
|
|
5
|
+
from lfx.io import (
|
|
6
|
+
BoolInput,
|
|
7
|
+
DropdownInput,
|
|
8
|
+
HandleInput,
|
|
9
|
+
Output,
|
|
10
|
+
SecretStrInput,
|
|
11
|
+
StrInput,
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class S3BucketUploaderComponent(Component):
|
|
16
|
+
"""S3BucketUploaderComponent is a component responsible for uploading files to an S3 bucket.
|
|
17
|
+
|
|
18
|
+
It provides two strategies for file upload: "By Data" and "By File Name". The component
|
|
19
|
+
requires AWS credentials and bucket details as inputs and processes files accordingly.
|
|
20
|
+
|
|
21
|
+
Attributes:
|
|
22
|
+
display_name (str): The display name of the component.
|
|
23
|
+
description (str): A brief description of the components functionality.
|
|
24
|
+
icon (str): The icon representing the component.
|
|
25
|
+
name (str): The internal name of the component.
|
|
26
|
+
inputs (list): A list of input configurations required by the component.
|
|
27
|
+
outputs (list): A list of output configurations provided by the component.
|
|
28
|
+
|
|
29
|
+
Methods:
|
|
30
|
+
process_files() -> None:
|
|
31
|
+
Processes files based on the selected strategy. Calls the appropriate method
|
|
32
|
+
based on the strategy attribute.
|
|
33
|
+
process_files_by_data() -> None:
|
|
34
|
+
Processes and uploads files to an S3 bucket based on the data inputs. Iterates
|
|
35
|
+
over the data inputs, logs the file path and text content, and uploads each file
|
|
36
|
+
to the specified S3 bucket if both file path and text content are available.
|
|
37
|
+
process_files_by_name() -> None:
|
|
38
|
+
Processes and uploads files to an S3 bucket based on their names. Iterates through
|
|
39
|
+
the list of data inputs, retrieves the file path from each data item, and uploads
|
|
40
|
+
the file to the specified S3 bucket if the file path is available. Logs the file
|
|
41
|
+
path being uploaded.
|
|
42
|
+
_s3_client() -> Any:
|
|
43
|
+
Creates and returns an S3 client using the provided AWS access key ID and secret
|
|
44
|
+
access key.
|
|
45
|
+
|
|
46
|
+
Please note that this component requires the boto3 library to be installed. It is designed
|
|
47
|
+
to work with File and Director components as inputs
|
|
48
|
+
"""
|
|
49
|
+
|
|
50
|
+
display_name = "S3 Bucket Uploader"
|
|
51
|
+
description = "Uploads files to S3 bucket."
|
|
52
|
+
icon = "Amazon"
|
|
53
|
+
name = "s3bucketuploader"
|
|
54
|
+
|
|
55
|
+
inputs = [
|
|
56
|
+
SecretStrInput(
|
|
57
|
+
name="aws_access_key_id",
|
|
58
|
+
display_name="AWS Access Key ID",
|
|
59
|
+
required=True,
|
|
60
|
+
password=True,
|
|
61
|
+
info="AWS Access key ID.",
|
|
62
|
+
),
|
|
63
|
+
SecretStrInput(
|
|
64
|
+
name="aws_secret_access_key",
|
|
65
|
+
display_name="AWS Secret Key",
|
|
66
|
+
required=True,
|
|
67
|
+
password=True,
|
|
68
|
+
info="AWS Secret Key.",
|
|
69
|
+
),
|
|
70
|
+
StrInput(
|
|
71
|
+
name="bucket_name",
|
|
72
|
+
display_name="Bucket Name",
|
|
73
|
+
info="Enter the name of the bucket.",
|
|
74
|
+
advanced=False,
|
|
75
|
+
),
|
|
76
|
+
DropdownInput(
|
|
77
|
+
name="strategy",
|
|
78
|
+
display_name="Strategy for file upload",
|
|
79
|
+
options=["Store Data", "Store Original File"],
|
|
80
|
+
value="By Data",
|
|
81
|
+
info=(
|
|
82
|
+
"Choose the strategy to upload the file. By Data means that the source file "
|
|
83
|
+
"is parsed and stored as LangFlow data. By File Name means that the source "
|
|
84
|
+
"file is uploaded as is."
|
|
85
|
+
),
|
|
86
|
+
),
|
|
87
|
+
HandleInput(
|
|
88
|
+
name="data_inputs",
|
|
89
|
+
display_name="Data Inputs",
|
|
90
|
+
info="The data to split.",
|
|
91
|
+
input_types=["Data"],
|
|
92
|
+
is_list=True,
|
|
93
|
+
required=True,
|
|
94
|
+
),
|
|
95
|
+
StrInput(
|
|
96
|
+
name="s3_prefix",
|
|
97
|
+
display_name="S3 Prefix",
|
|
98
|
+
info="Prefix for all files.",
|
|
99
|
+
advanced=True,
|
|
100
|
+
),
|
|
101
|
+
BoolInput(
|
|
102
|
+
name="strip_path",
|
|
103
|
+
display_name="Strip Path",
|
|
104
|
+
info="Removes path from file path.",
|
|
105
|
+
required=True,
|
|
106
|
+
advanced=True,
|
|
107
|
+
),
|
|
108
|
+
]
|
|
109
|
+
|
|
110
|
+
outputs = [
|
|
111
|
+
Output(display_name="Writes to AWS Bucket", name="data", method="process_files"),
|
|
112
|
+
]
|
|
113
|
+
|
|
114
|
+
def process_files(self) -> None:
|
|
115
|
+
"""Process files based on the selected strategy.
|
|
116
|
+
|
|
117
|
+
This method uses a strategy pattern to process files. The strategy is determined
|
|
118
|
+
by the `self.strategy` attribute, which can be either "By Data" or "By File Name".
|
|
119
|
+
Depending on the strategy, the corresponding method (`process_files_by_data` or
|
|
120
|
+
`process_files_by_name`) is called. If an invalid strategy is provided, an error
|
|
121
|
+
is logged.
|
|
122
|
+
|
|
123
|
+
Returns:
|
|
124
|
+
None
|
|
125
|
+
"""
|
|
126
|
+
strategy_methods = {
|
|
127
|
+
"Store Data": self.process_files_by_data,
|
|
128
|
+
"Store Original File": self.process_files_by_name,
|
|
129
|
+
}
|
|
130
|
+
strategy_methods.get(self.strategy, lambda: self.log("Invalid strategy"))()
|
|
131
|
+
|
|
132
|
+
def process_files_by_data(self) -> None:
|
|
133
|
+
"""Processes and uploads files to an S3 bucket based on the data inputs.
|
|
134
|
+
|
|
135
|
+
This method iterates over the data inputs, logs the file path and text content,
|
|
136
|
+
and uploads each file to the specified S3 bucket if both file path and text content
|
|
137
|
+
are available.
|
|
138
|
+
|
|
139
|
+
Args:
|
|
140
|
+
None
|
|
141
|
+
|
|
142
|
+
Returns:
|
|
143
|
+
None
|
|
144
|
+
"""
|
|
145
|
+
for data_item in self.data_inputs:
|
|
146
|
+
file_path = data_item.data.get("file_path")
|
|
147
|
+
text_content = data_item.data.get("text")
|
|
148
|
+
|
|
149
|
+
if file_path and text_content:
|
|
150
|
+
self._s3_client().put_object(
|
|
151
|
+
Bucket=self.bucket_name, Key=self._normalize_path(file_path), Body=text_content
|
|
152
|
+
)
|
|
153
|
+
|
|
154
|
+
def process_files_by_name(self) -> None:
|
|
155
|
+
"""Processes and uploads files to an S3 bucket based on their names.
|
|
156
|
+
|
|
157
|
+
Iterates through the list of data inputs, retrieves the file path from each data item,
|
|
158
|
+
and uploads the file to the specified S3 bucket if the file path is available.
|
|
159
|
+
Logs the file path being uploaded.
|
|
160
|
+
|
|
161
|
+
Returns:
|
|
162
|
+
None
|
|
163
|
+
"""
|
|
164
|
+
for data_item in self.data_inputs:
|
|
165
|
+
file_path = data_item.data.get("file_path")
|
|
166
|
+
self.log(f"Uploading file: {file_path}")
|
|
167
|
+
if file_path:
|
|
168
|
+
self._s3_client().upload_file(file_path, Bucket=self.bucket_name, Key=self._normalize_path(file_path))
|
|
169
|
+
|
|
170
|
+
def _s3_client(self) -> Any:
|
|
171
|
+
"""Creates and returns an S3 client using the provided AWS access key ID and secret access key.
|
|
172
|
+
|
|
173
|
+
Returns:
|
|
174
|
+
Any: A boto3 S3 client instance.
|
|
175
|
+
"""
|
|
176
|
+
try:
|
|
177
|
+
import boto3
|
|
178
|
+
except ImportError as e:
|
|
179
|
+
msg = "boto3 is not installed. Please install it using `uv pip install boto3`."
|
|
180
|
+
raise ImportError(msg) from e
|
|
181
|
+
|
|
182
|
+
return boto3.client(
|
|
183
|
+
"s3",
|
|
184
|
+
aws_access_key_id=self.aws_access_key_id,
|
|
185
|
+
aws_secret_access_key=self.aws_secret_access_key,
|
|
186
|
+
)
|
|
187
|
+
|
|
188
|
+
def _normalize_path(self, file_path) -> str:
|
|
189
|
+
"""Process the file path based on the s3_prefix and path_as_prefix.
|
|
190
|
+
|
|
191
|
+
Args:
|
|
192
|
+
file_path (str): The original file path.
|
|
193
|
+
s3_prefix (str): The S3 prefix to use.
|
|
194
|
+
path_as_prefix (bool): Whether to use the file path as the S3 prefix.
|
|
195
|
+
|
|
196
|
+
Returns:
|
|
197
|
+
str: The processed file path.
|
|
198
|
+
"""
|
|
199
|
+
prefix = self.s3_prefix
|
|
200
|
+
strip_path = self.strip_path
|
|
201
|
+
processed_path: str = file_path
|
|
202
|
+
|
|
203
|
+
if strip_path:
|
|
204
|
+
# Filename only
|
|
205
|
+
processed_path = Path(file_path).name
|
|
206
|
+
|
|
207
|
+
# Concatenate the s3_prefix if it exists
|
|
208
|
+
if prefix:
|
|
209
|
+
processed_path = str(Path(prefix) / processed_path)
|
|
210
|
+
|
|
211
|
+
return processed_path
|
|
@@ -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 lfx.components.anthropic.anthropic import AnthropicModelComponent
|
|
9
|
+
|
|
10
|
+
_dynamic_imports = {
|
|
11
|
+
"AnthropicModelComponent": "anthropic",
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
__all__ = [
|
|
15
|
+
"AnthropicModelComponent",
|
|
16
|
+
]
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def __getattr__(attr_name: str) -> Any:
|
|
20
|
+
"""Lazily import Anthropic 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,187 @@
|
|
|
1
|
+
from typing import Any, cast
|
|
2
|
+
|
|
3
|
+
import requests
|
|
4
|
+
from pydantic import ValidationError
|
|
5
|
+
|
|
6
|
+
from lfx.base.models.anthropic_constants import (
|
|
7
|
+
ANTHROPIC_MODELS,
|
|
8
|
+
DEFAULT_ANTHROPIC_API_URL,
|
|
9
|
+
TOOL_CALLING_SUPPORTED_ANTHROPIC_MODELS,
|
|
10
|
+
TOOL_CALLING_UNSUPPORTED_ANTHROPIC_MODELS,
|
|
11
|
+
)
|
|
12
|
+
from lfx.base.models.model import LCModelComponent
|
|
13
|
+
from lfx.field_typing import LanguageModel
|
|
14
|
+
from lfx.field_typing.range_spec import RangeSpec
|
|
15
|
+
from lfx.io import BoolInput, DropdownInput, IntInput, MessageTextInput, SecretStrInput, SliderInput
|
|
16
|
+
from lfx.log.logger import logger
|
|
17
|
+
from lfx.schema.dotdict import dotdict
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class AnthropicModelComponent(LCModelComponent):
|
|
21
|
+
display_name = "Anthropic"
|
|
22
|
+
description = "Generate text using Anthropic's Messages API and models."
|
|
23
|
+
icon = "Anthropic"
|
|
24
|
+
name = "AnthropicModel"
|
|
25
|
+
|
|
26
|
+
inputs = [
|
|
27
|
+
*LCModelComponent.get_base_inputs(),
|
|
28
|
+
IntInput(
|
|
29
|
+
name="max_tokens",
|
|
30
|
+
display_name="Max Tokens",
|
|
31
|
+
advanced=True,
|
|
32
|
+
value=4096,
|
|
33
|
+
info="The maximum number of tokens to generate. Set to 0 for unlimited tokens.",
|
|
34
|
+
),
|
|
35
|
+
DropdownInput(
|
|
36
|
+
name="model_name",
|
|
37
|
+
display_name="Model Name",
|
|
38
|
+
options=ANTHROPIC_MODELS,
|
|
39
|
+
refresh_button=True,
|
|
40
|
+
value=ANTHROPIC_MODELS[0],
|
|
41
|
+
combobox=True,
|
|
42
|
+
),
|
|
43
|
+
SecretStrInput(
|
|
44
|
+
name="api_key",
|
|
45
|
+
display_name="Anthropic API Key",
|
|
46
|
+
info="Your Anthropic API key.",
|
|
47
|
+
value=None,
|
|
48
|
+
required=True,
|
|
49
|
+
real_time_refresh=True,
|
|
50
|
+
),
|
|
51
|
+
SliderInput(
|
|
52
|
+
name="temperature",
|
|
53
|
+
display_name="Temperature",
|
|
54
|
+
value=0.1,
|
|
55
|
+
info="Run inference with this temperature. Must by in the closed interval [0.0, 1.0].",
|
|
56
|
+
range_spec=RangeSpec(min=0, max=1, step=0.01),
|
|
57
|
+
advanced=True,
|
|
58
|
+
),
|
|
59
|
+
MessageTextInput(
|
|
60
|
+
name="base_url",
|
|
61
|
+
display_name="Anthropic API URL",
|
|
62
|
+
info="Endpoint of the Anthropic API. Defaults to 'https://api.anthropic.com' if not specified.",
|
|
63
|
+
value=DEFAULT_ANTHROPIC_API_URL,
|
|
64
|
+
real_time_refresh=True,
|
|
65
|
+
advanced=True,
|
|
66
|
+
),
|
|
67
|
+
BoolInput(
|
|
68
|
+
name="tool_model_enabled",
|
|
69
|
+
display_name="Enable Tool Models",
|
|
70
|
+
info=(
|
|
71
|
+
"Select if you want to use models that can work with tools. If yes, only those models will be shown."
|
|
72
|
+
),
|
|
73
|
+
advanced=False,
|
|
74
|
+
value=False,
|
|
75
|
+
real_time_refresh=True,
|
|
76
|
+
),
|
|
77
|
+
]
|
|
78
|
+
|
|
79
|
+
def build_model(self) -> LanguageModel: # type: ignore[type-var]
|
|
80
|
+
try:
|
|
81
|
+
from langchain_anthropic.chat_models import ChatAnthropic
|
|
82
|
+
except ImportError as e:
|
|
83
|
+
msg = "langchain_anthropic is not installed. Please install it with `pip install langchain_anthropic`."
|
|
84
|
+
raise ImportError(msg) from e
|
|
85
|
+
try:
|
|
86
|
+
max_tokens_value = getattr(self, "max_tokens", "")
|
|
87
|
+
max_tokens_value = 4096 if max_tokens_value == "" else int(max_tokens_value)
|
|
88
|
+
output = ChatAnthropic(
|
|
89
|
+
model=self.model_name,
|
|
90
|
+
anthropic_api_key=self.api_key,
|
|
91
|
+
max_tokens=max_tokens_value,
|
|
92
|
+
temperature=self.temperature,
|
|
93
|
+
anthropic_api_url=self.base_url or DEFAULT_ANTHROPIC_API_URL,
|
|
94
|
+
streaming=self.stream,
|
|
95
|
+
)
|
|
96
|
+
except ValidationError:
|
|
97
|
+
raise
|
|
98
|
+
except Exception as e:
|
|
99
|
+
msg = "Could not connect to Anthropic API."
|
|
100
|
+
raise ValueError(msg) from e
|
|
101
|
+
|
|
102
|
+
return output
|
|
103
|
+
|
|
104
|
+
def get_models(self, *, tool_model_enabled: bool | None = None) -> list[str]:
|
|
105
|
+
try:
|
|
106
|
+
import anthropic
|
|
107
|
+
|
|
108
|
+
client = anthropic.Anthropic(api_key=self.api_key)
|
|
109
|
+
models = client.models.list(limit=20).data
|
|
110
|
+
model_ids = ANTHROPIC_MODELS + [model.id for model in models]
|
|
111
|
+
except (ImportError, ValueError, requests.exceptions.RequestException) as e:
|
|
112
|
+
logger.exception(f"Error getting model names: {e}")
|
|
113
|
+
model_ids = ANTHROPIC_MODELS
|
|
114
|
+
|
|
115
|
+
if tool_model_enabled:
|
|
116
|
+
try:
|
|
117
|
+
from langchain_anthropic.chat_models import ChatAnthropic
|
|
118
|
+
except ImportError as e:
|
|
119
|
+
msg = "langchain_anthropic is not installed. Please install it with `pip install langchain_anthropic`."
|
|
120
|
+
raise ImportError(msg) from e
|
|
121
|
+
|
|
122
|
+
# Create a new list instead of modifying while iterating
|
|
123
|
+
filtered_models = []
|
|
124
|
+
for model in model_ids:
|
|
125
|
+
if model in TOOL_CALLING_SUPPORTED_ANTHROPIC_MODELS:
|
|
126
|
+
filtered_models.append(model)
|
|
127
|
+
continue
|
|
128
|
+
|
|
129
|
+
model_with_tool = ChatAnthropic(
|
|
130
|
+
model=model, # Use the current model being checked
|
|
131
|
+
anthropic_api_key=self.api_key,
|
|
132
|
+
anthropic_api_url=cast("str", self.base_url) or DEFAULT_ANTHROPIC_API_URL,
|
|
133
|
+
)
|
|
134
|
+
|
|
135
|
+
if (
|
|
136
|
+
not self.supports_tool_calling(model_with_tool)
|
|
137
|
+
or model in TOOL_CALLING_UNSUPPORTED_ANTHROPIC_MODELS
|
|
138
|
+
):
|
|
139
|
+
continue
|
|
140
|
+
|
|
141
|
+
filtered_models.append(model)
|
|
142
|
+
|
|
143
|
+
return filtered_models
|
|
144
|
+
|
|
145
|
+
return model_ids
|
|
146
|
+
|
|
147
|
+
def _get_exception_message(self, exception: Exception) -> str | None:
|
|
148
|
+
"""Get a message from an Anthropic exception.
|
|
149
|
+
|
|
150
|
+
Args:
|
|
151
|
+
exception (Exception): The exception to get the message from.
|
|
152
|
+
|
|
153
|
+
Returns:
|
|
154
|
+
str: The message from the exception.
|
|
155
|
+
"""
|
|
156
|
+
try:
|
|
157
|
+
from anthropic import BadRequestError
|
|
158
|
+
except ImportError:
|
|
159
|
+
return None
|
|
160
|
+
if isinstance(exception, BadRequestError):
|
|
161
|
+
message = exception.body.get("error", {}).get("message")
|
|
162
|
+
if message:
|
|
163
|
+
return message
|
|
164
|
+
return None
|
|
165
|
+
|
|
166
|
+
def update_build_config(self, build_config: dotdict, field_value: Any, field_name: str | None = None):
|
|
167
|
+
if "base_url" in build_config and build_config["base_url"]["value"] is None:
|
|
168
|
+
build_config["base_url"]["value"] = DEFAULT_ANTHROPIC_API_URL
|
|
169
|
+
self.base_url = DEFAULT_ANTHROPIC_API_URL
|
|
170
|
+
if field_name in {"base_url", "model_name", "tool_model_enabled", "api_key"} and field_value:
|
|
171
|
+
try:
|
|
172
|
+
if len(self.api_key) == 0:
|
|
173
|
+
ids = ANTHROPIC_MODELS
|
|
174
|
+
else:
|
|
175
|
+
try:
|
|
176
|
+
ids = self.get_models(tool_model_enabled=self.tool_model_enabled)
|
|
177
|
+
except (ImportError, ValueError, requests.exceptions.RequestException) as e:
|
|
178
|
+
logger.exception(f"Error getting model names: {e}")
|
|
179
|
+
ids = ANTHROPIC_MODELS
|
|
180
|
+
build_config.setdefault("model_name", {})
|
|
181
|
+
build_config["model_name"]["options"] = ids
|
|
182
|
+
build_config["model_name"].setdefault("value", ids[0])
|
|
183
|
+
build_config["model_name"]["combobox"] = True
|
|
184
|
+
except Exception as e:
|
|
185
|
+
msg = f"Error getting model names: {e}"
|
|
186
|
+
raise ValueError(msg) from e
|
|
187
|
+
return build_config
|