lfx-nightly 0.1.11.dev0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- lfx/__init__.py +0 -0
- lfx/__main__.py +25 -0
- lfx/base/__init__.py +0 -0
- lfx/base/agents/__init__.py +0 -0
- lfx/base/agents/agent.py +268 -0
- lfx/base/agents/callback.py +130 -0
- lfx/base/agents/context.py +109 -0
- lfx/base/agents/crewai/__init__.py +0 -0
- lfx/base/agents/crewai/crew.py +231 -0
- lfx/base/agents/crewai/tasks.py +12 -0
- lfx/base/agents/default_prompts.py +23 -0
- lfx/base/agents/errors.py +15 -0
- lfx/base/agents/events.py +346 -0
- lfx/base/agents/utils.py +205 -0
- lfx/base/astra_assistants/__init__.py +0 -0
- lfx/base/astra_assistants/util.py +171 -0
- lfx/base/chains/__init__.py +0 -0
- lfx/base/chains/model.py +19 -0
- lfx/base/composio/__init__.py +0 -0
- lfx/base/composio/composio_base.py +1291 -0
- lfx/base/compressors/__init__.py +0 -0
- lfx/base/compressors/model.py +60 -0
- lfx/base/constants.py +46 -0
- lfx/base/curl/__init__.py +0 -0
- lfx/base/curl/parse.py +188 -0
- lfx/base/data/__init__.py +5 -0
- lfx/base/data/base_file.py +685 -0
- lfx/base/data/docling_utils.py +245 -0
- lfx/base/data/utils.py +198 -0
- lfx/base/document_transformers/__init__.py +0 -0
- lfx/base/document_transformers/model.py +43 -0
- lfx/base/embeddings/__init__.py +0 -0
- lfx/base/embeddings/aiml_embeddings.py +62 -0
- lfx/base/embeddings/model.py +26 -0
- lfx/base/flow_processing/__init__.py +0 -0
- lfx/base/flow_processing/utils.py +86 -0
- lfx/base/huggingface/__init__.py +0 -0
- lfx/base/huggingface/model_bridge.py +133 -0
- lfx/base/io/__init__.py +0 -0
- lfx/base/io/chat.py +20 -0
- lfx/base/io/text.py +22 -0
- lfx/base/langchain_utilities/__init__.py +0 -0
- lfx/base/langchain_utilities/model.py +35 -0
- lfx/base/langchain_utilities/spider_constants.py +1 -0
- lfx/base/langwatch/__init__.py +0 -0
- lfx/base/langwatch/utils.py +18 -0
- lfx/base/mcp/__init__.py +0 -0
- lfx/base/mcp/constants.py +2 -0
- lfx/base/mcp/util.py +1398 -0
- lfx/base/memory/__init__.py +0 -0
- lfx/base/memory/memory.py +49 -0
- lfx/base/memory/model.py +38 -0
- lfx/base/models/__init__.py +3 -0
- lfx/base/models/aiml_constants.py +51 -0
- lfx/base/models/anthropic_constants.py +47 -0
- lfx/base/models/aws_constants.py +151 -0
- lfx/base/models/chat_result.py +76 -0
- lfx/base/models/google_generative_ai_constants.py +70 -0
- lfx/base/models/groq_constants.py +134 -0
- lfx/base/models/model.py +375 -0
- lfx/base/models/model_input_constants.py +307 -0
- lfx/base/models/model_metadata.py +41 -0
- lfx/base/models/model_utils.py +8 -0
- lfx/base/models/novita_constants.py +35 -0
- lfx/base/models/ollama_constants.py +49 -0
- lfx/base/models/openai_constants.py +122 -0
- lfx/base/models/sambanova_constants.py +18 -0
- lfx/base/processing/__init__.py +0 -0
- lfx/base/prompts/__init__.py +0 -0
- lfx/base/prompts/api_utils.py +224 -0
- lfx/base/prompts/utils.py +61 -0
- lfx/base/textsplitters/__init__.py +0 -0
- lfx/base/textsplitters/model.py +28 -0
- lfx/base/tools/__init__.py +0 -0
- lfx/base/tools/base.py +26 -0
- lfx/base/tools/component_tool.py +325 -0
- lfx/base/tools/constants.py +49 -0
- lfx/base/tools/flow_tool.py +132 -0
- lfx/base/tools/run_flow.py +224 -0
- lfx/base/vectorstores/__init__.py +0 -0
- lfx/base/vectorstores/model.py +193 -0
- lfx/base/vectorstores/utils.py +22 -0
- lfx/base/vectorstores/vector_store_connection_decorator.py +52 -0
- lfx/cli/__init__.py +5 -0
- lfx/cli/commands.py +319 -0
- lfx/cli/common.py +650 -0
- lfx/cli/run.py +441 -0
- lfx/cli/script_loader.py +247 -0
- lfx/cli/serve_app.py +546 -0
- lfx/cli/validation.py +69 -0
- lfx/components/FAISS/__init__.py +34 -0
- lfx/components/FAISS/faiss.py +111 -0
- lfx/components/Notion/__init__.py +19 -0
- lfx/components/Notion/add_content_to_page.py +269 -0
- lfx/components/Notion/create_page.py +94 -0
- lfx/components/Notion/list_database_properties.py +68 -0
- lfx/components/Notion/list_pages.py +122 -0
- lfx/components/Notion/list_users.py +77 -0
- lfx/components/Notion/page_content_viewer.py +93 -0
- lfx/components/Notion/search.py +111 -0
- lfx/components/Notion/update_page_property.py +114 -0
- lfx/components/__init__.py +411 -0
- lfx/components/_importing.py +42 -0
- lfx/components/agentql/__init__.py +3 -0
- lfx/components/agentql/agentql_api.py +151 -0
- lfx/components/agents/__init__.py +34 -0
- lfx/components/agents/agent.py +558 -0
- lfx/components/agents/mcp_component.py +501 -0
- lfx/components/aiml/__init__.py +37 -0
- lfx/components/aiml/aiml.py +112 -0
- lfx/components/aiml/aiml_embeddings.py +37 -0
- lfx/components/amazon/__init__.py +36 -0
- lfx/components/amazon/amazon_bedrock_embedding.py +109 -0
- lfx/components/amazon/amazon_bedrock_model.py +124 -0
- lfx/components/amazon/s3_bucket_uploader.py +211 -0
- lfx/components/anthropic/__init__.py +34 -0
- lfx/components/anthropic/anthropic.py +187 -0
- lfx/components/apify/__init__.py +5 -0
- lfx/components/apify/apify_actor.py +325 -0
- lfx/components/arxiv/__init__.py +3 -0
- lfx/components/arxiv/arxiv.py +163 -0
- lfx/components/assemblyai/__init__.py +46 -0
- lfx/components/assemblyai/assemblyai_get_subtitles.py +83 -0
- lfx/components/assemblyai/assemblyai_lemur.py +183 -0
- lfx/components/assemblyai/assemblyai_list_transcripts.py +95 -0
- lfx/components/assemblyai/assemblyai_poll_transcript.py +72 -0
- lfx/components/assemblyai/assemblyai_start_transcript.py +188 -0
- lfx/components/azure/__init__.py +37 -0
- lfx/components/azure/azure_openai.py +95 -0
- lfx/components/azure/azure_openai_embeddings.py +83 -0
- lfx/components/baidu/__init__.py +32 -0
- lfx/components/baidu/baidu_qianfan_chat.py +113 -0
- lfx/components/bing/__init__.py +3 -0
- lfx/components/bing/bing_search_api.py +61 -0
- lfx/components/cassandra/__init__.py +40 -0
- lfx/components/cassandra/cassandra.py +264 -0
- lfx/components/cassandra/cassandra_chat.py +92 -0
- lfx/components/cassandra/cassandra_graph.py +238 -0
- lfx/components/chains/__init__.py +3 -0
- lfx/components/chroma/__init__.py +34 -0
- lfx/components/chroma/chroma.py +167 -0
- lfx/components/cleanlab/__init__.py +40 -0
- lfx/components/cleanlab/cleanlab_evaluator.py +155 -0
- lfx/components/cleanlab/cleanlab_rag_evaluator.py +254 -0
- lfx/components/cleanlab/cleanlab_remediator.py +131 -0
- lfx/components/clickhouse/__init__.py +34 -0
- lfx/components/clickhouse/clickhouse.py +135 -0
- lfx/components/cloudflare/__init__.py +32 -0
- lfx/components/cloudflare/cloudflare.py +81 -0
- lfx/components/cohere/__init__.py +40 -0
- lfx/components/cohere/cohere_embeddings.py +81 -0
- lfx/components/cohere/cohere_models.py +46 -0
- lfx/components/cohere/cohere_rerank.py +51 -0
- lfx/components/composio/__init__.py +74 -0
- lfx/components/composio/composio_api.py +268 -0
- lfx/components/composio/dropbox_compnent.py +11 -0
- lfx/components/composio/github_composio.py +11 -0
- lfx/components/composio/gmail_composio.py +38 -0
- lfx/components/composio/googlecalendar_composio.py +11 -0
- lfx/components/composio/googlemeet_composio.py +11 -0
- lfx/components/composio/googletasks_composio.py +8 -0
- lfx/components/composio/linear_composio.py +11 -0
- lfx/components/composio/outlook_composio.py +11 -0
- lfx/components/composio/reddit_composio.py +11 -0
- lfx/components/composio/slack_composio.py +582 -0
- lfx/components/composio/slackbot_composio.py +11 -0
- lfx/components/composio/supabase_composio.py +11 -0
- lfx/components/composio/todoist_composio.py +11 -0
- lfx/components/composio/youtube_composio.py +11 -0
- lfx/components/confluence/__init__.py +3 -0
- lfx/components/confluence/confluence.py +84 -0
- lfx/components/couchbase/__init__.py +34 -0
- lfx/components/couchbase/couchbase.py +102 -0
- lfx/components/crewai/__init__.py +49 -0
- lfx/components/crewai/crewai.py +107 -0
- lfx/components/crewai/hierarchical_crew.py +46 -0
- lfx/components/crewai/hierarchical_task.py +44 -0
- lfx/components/crewai/sequential_crew.py +52 -0
- lfx/components/crewai/sequential_task.py +73 -0
- lfx/components/crewai/sequential_task_agent.py +143 -0
- lfx/components/custom_component/__init__.py +34 -0
- lfx/components/custom_component/custom_component.py +31 -0
- lfx/components/data/__init__.py +64 -0
- lfx/components/data/api_request.py +544 -0
- lfx/components/data/csv_to_data.py +95 -0
- lfx/components/data/directory.py +113 -0
- lfx/components/data/file.py +577 -0
- lfx/components/data/json_to_data.py +98 -0
- lfx/components/data/news_search.py +164 -0
- lfx/components/data/rss.py +69 -0
- lfx/components/data/sql_executor.py +101 -0
- lfx/components/data/url.py +311 -0
- lfx/components/data/web_search.py +112 -0
- lfx/components/data/webhook.py +56 -0
- lfx/components/datastax/__init__.py +70 -0
- lfx/components/datastax/astra_assistant_manager.py +306 -0
- lfx/components/datastax/astra_db.py +75 -0
- lfx/components/datastax/astra_vectorize.py +124 -0
- lfx/components/datastax/astradb.py +1285 -0
- lfx/components/datastax/astradb_cql.py +314 -0
- lfx/components/datastax/astradb_graph.py +330 -0
- lfx/components/datastax/astradb_tool.py +414 -0
- lfx/components/datastax/astradb_vectorstore.py +1285 -0
- lfx/components/datastax/cassandra.py +92 -0
- lfx/components/datastax/create_assistant.py +58 -0
- lfx/components/datastax/create_thread.py +32 -0
- lfx/components/datastax/dotenv.py +35 -0
- lfx/components/datastax/get_assistant.py +37 -0
- lfx/components/datastax/getenvvar.py +30 -0
- lfx/components/datastax/graph_rag.py +141 -0
- lfx/components/datastax/hcd.py +314 -0
- lfx/components/datastax/list_assistants.py +25 -0
- lfx/components/datastax/run.py +89 -0
- lfx/components/deactivated/__init__.py +15 -0
- lfx/components/deactivated/amazon_kendra.py +66 -0
- lfx/components/deactivated/chat_litellm_model.py +158 -0
- lfx/components/deactivated/code_block_extractor.py +26 -0
- lfx/components/deactivated/documents_to_data.py +22 -0
- lfx/components/deactivated/embed.py +16 -0
- lfx/components/deactivated/extract_key_from_data.py +46 -0
- lfx/components/deactivated/json_document_builder.py +57 -0
- lfx/components/deactivated/list_flows.py +20 -0
- lfx/components/deactivated/mcp_sse.py +61 -0
- lfx/components/deactivated/mcp_stdio.py +62 -0
- lfx/components/deactivated/merge_data.py +93 -0
- lfx/components/deactivated/message.py +37 -0
- lfx/components/deactivated/metal.py +54 -0
- lfx/components/deactivated/multi_query.py +59 -0
- lfx/components/deactivated/retriever.py +43 -0
- lfx/components/deactivated/selective_passthrough.py +77 -0
- lfx/components/deactivated/should_run_next.py +40 -0
- lfx/components/deactivated/split_text.py +63 -0
- lfx/components/deactivated/store_message.py +24 -0
- lfx/components/deactivated/sub_flow.py +124 -0
- lfx/components/deactivated/vectara_self_query.py +76 -0
- lfx/components/deactivated/vector_store.py +24 -0
- lfx/components/deepseek/__init__.py +34 -0
- lfx/components/deepseek/deepseek.py +136 -0
- lfx/components/docling/__init__.py +43 -0
- lfx/components/docling/chunk_docling_document.py +186 -0
- lfx/components/docling/docling_inline.py +231 -0
- lfx/components/docling/docling_remote.py +193 -0
- lfx/components/docling/export_docling_document.py +117 -0
- lfx/components/documentloaders/__init__.py +3 -0
- lfx/components/duckduckgo/__init__.py +3 -0
- lfx/components/duckduckgo/duck_duck_go_search_run.py +92 -0
- lfx/components/elastic/__init__.py +37 -0
- lfx/components/elastic/elasticsearch.py +267 -0
- lfx/components/elastic/opensearch.py +243 -0
- lfx/components/embeddings/__init__.py +37 -0
- lfx/components/embeddings/similarity.py +76 -0
- lfx/components/embeddings/text_embedder.py +64 -0
- lfx/components/exa/__init__.py +3 -0
- lfx/components/exa/exa_search.py +68 -0
- lfx/components/firecrawl/__init__.py +43 -0
- lfx/components/firecrawl/firecrawl_crawl_api.py +88 -0
- lfx/components/firecrawl/firecrawl_extract_api.py +136 -0
- lfx/components/firecrawl/firecrawl_map_api.py +89 -0
- lfx/components/firecrawl/firecrawl_scrape_api.py +73 -0
- lfx/components/git/__init__.py +4 -0
- lfx/components/git/git.py +262 -0
- lfx/components/git/gitextractor.py +196 -0
- lfx/components/glean/__init__.py +3 -0
- lfx/components/glean/glean_search_api.py +173 -0
- lfx/components/google/__init__.py +17 -0
- lfx/components/google/gmail.py +192 -0
- lfx/components/google/google_bq_sql_executor.py +157 -0
- lfx/components/google/google_drive.py +92 -0
- lfx/components/google/google_drive_search.py +152 -0
- lfx/components/google/google_generative_ai.py +147 -0
- lfx/components/google/google_generative_ai_embeddings.py +141 -0
- lfx/components/google/google_oauth_token.py +89 -0
- lfx/components/google/google_search_api_core.py +68 -0
- lfx/components/google/google_serper_api_core.py +74 -0
- lfx/components/groq/__init__.py +34 -0
- lfx/components/groq/groq.py +136 -0
- lfx/components/helpers/__init__.py +52 -0
- lfx/components/helpers/calculator_core.py +89 -0
- lfx/components/helpers/create_list.py +40 -0
- lfx/components/helpers/current_date.py +42 -0
- lfx/components/helpers/id_generator.py +42 -0
- lfx/components/helpers/memory.py +251 -0
- lfx/components/helpers/output_parser.py +45 -0
- lfx/components/helpers/store_message.py +90 -0
- lfx/components/homeassistant/__init__.py +7 -0
- lfx/components/homeassistant/home_assistant_control.py +152 -0
- lfx/components/homeassistant/list_home_assistant_states.py +137 -0
- lfx/components/huggingface/__init__.py +37 -0
- lfx/components/huggingface/huggingface.py +197 -0
- lfx/components/huggingface/huggingface_inference_api.py +106 -0
- lfx/components/ibm/__init__.py +34 -0
- lfx/components/ibm/watsonx.py +203 -0
- lfx/components/ibm/watsonx_embeddings.py +135 -0
- lfx/components/icosacomputing/__init__.py +5 -0
- lfx/components/icosacomputing/combinatorial_reasoner.py +84 -0
- lfx/components/input_output/__init__.py +38 -0
- lfx/components/input_output/chat.py +120 -0
- lfx/components/input_output/chat_output.py +200 -0
- lfx/components/input_output/text.py +27 -0
- lfx/components/input_output/text_output.py +29 -0
- lfx/components/jigsawstack/__init__.py +23 -0
- lfx/components/jigsawstack/ai_scrape.py +126 -0
- lfx/components/jigsawstack/ai_web_search.py +136 -0
- lfx/components/jigsawstack/file_read.py +115 -0
- lfx/components/jigsawstack/file_upload.py +94 -0
- lfx/components/jigsawstack/image_generation.py +205 -0
- lfx/components/jigsawstack/nsfw.py +60 -0
- lfx/components/jigsawstack/object_detection.py +124 -0
- lfx/components/jigsawstack/sentiment.py +112 -0
- lfx/components/jigsawstack/text_to_sql.py +90 -0
- lfx/components/jigsawstack/text_translate.py +77 -0
- lfx/components/jigsawstack/vocr.py +107 -0
- lfx/components/langchain_utilities/__init__.py +109 -0
- lfx/components/langchain_utilities/character.py +53 -0
- lfx/components/langchain_utilities/conversation.py +59 -0
- lfx/components/langchain_utilities/csv_agent.py +107 -0
- lfx/components/langchain_utilities/fake_embeddings.py +26 -0
- lfx/components/langchain_utilities/html_link_extractor.py +35 -0
- lfx/components/langchain_utilities/json_agent.py +45 -0
- lfx/components/langchain_utilities/langchain_hub.py +126 -0
- lfx/components/langchain_utilities/language_recursive.py +49 -0
- lfx/components/langchain_utilities/language_semantic.py +138 -0
- lfx/components/langchain_utilities/llm_checker.py +39 -0
- lfx/components/langchain_utilities/llm_math.py +42 -0
- lfx/components/langchain_utilities/natural_language.py +61 -0
- lfx/components/langchain_utilities/openai_tools.py +53 -0
- lfx/components/langchain_utilities/openapi.py +48 -0
- lfx/components/langchain_utilities/recursive_character.py +60 -0
- lfx/components/langchain_utilities/retrieval_qa.py +83 -0
- lfx/components/langchain_utilities/runnable_executor.py +137 -0
- lfx/components/langchain_utilities/self_query.py +80 -0
- lfx/components/langchain_utilities/spider.py +142 -0
- lfx/components/langchain_utilities/sql.py +40 -0
- lfx/components/langchain_utilities/sql_database.py +35 -0
- lfx/components/langchain_utilities/sql_generator.py +78 -0
- lfx/components/langchain_utilities/tool_calling.py +59 -0
- lfx/components/langchain_utilities/vector_store_info.py +49 -0
- lfx/components/langchain_utilities/vector_store_router.py +33 -0
- lfx/components/langchain_utilities/xml_agent.py +71 -0
- lfx/components/langwatch/__init__.py +3 -0
- lfx/components/langwatch/langwatch.py +278 -0
- lfx/components/link_extractors/__init__.py +3 -0
- lfx/components/lmstudio/__init__.py +34 -0
- lfx/components/lmstudio/lmstudioembeddings.py +89 -0
- lfx/components/lmstudio/lmstudiomodel.py +129 -0
- lfx/components/logic/__init__.py +52 -0
- lfx/components/logic/conditional_router.py +171 -0
- lfx/components/logic/data_conditional_router.py +125 -0
- lfx/components/logic/flow_tool.py +110 -0
- lfx/components/logic/listen.py +29 -0
- lfx/components/logic/loop.py +125 -0
- lfx/components/logic/notify.py +88 -0
- lfx/components/logic/pass_message.py +35 -0
- lfx/components/logic/run_flow.py +71 -0
- lfx/components/logic/sub_flow.py +114 -0
- lfx/components/maritalk/__init__.py +32 -0
- lfx/components/maritalk/maritalk.py +52 -0
- lfx/components/mem0/__init__.py +3 -0
- lfx/components/mem0/mem0_chat_memory.py +136 -0
- lfx/components/milvus/__init__.py +34 -0
- lfx/components/milvus/milvus.py +115 -0
- lfx/components/mistral/__init__.py +37 -0
- lfx/components/mistral/mistral.py +114 -0
- lfx/components/mistral/mistral_embeddings.py +58 -0
- lfx/components/models/__init__.py +34 -0
- lfx/components/models/embedding_model.py +114 -0
- lfx/components/models/language_model.py +144 -0
- lfx/components/mongodb/__init__.py +34 -0
- lfx/components/mongodb/mongodb_atlas.py +213 -0
- lfx/components/needle/__init__.py +3 -0
- lfx/components/needle/needle.py +104 -0
- lfx/components/notdiamond/__init__.py +34 -0
- lfx/components/notdiamond/notdiamond.py +228 -0
- lfx/components/novita/__init__.py +32 -0
- lfx/components/novita/novita.py +130 -0
- lfx/components/nvidia/__init__.py +57 -0
- lfx/components/nvidia/nvidia.py +157 -0
- lfx/components/nvidia/nvidia_embedding.py +77 -0
- lfx/components/nvidia/nvidia_ingest.py +317 -0
- lfx/components/nvidia/nvidia_rerank.py +63 -0
- lfx/components/nvidia/system_assist.py +65 -0
- lfx/components/olivya/__init__.py +3 -0
- lfx/components/olivya/olivya.py +116 -0
- lfx/components/ollama/__init__.py +37 -0
- lfx/components/ollama/ollama.py +330 -0
- lfx/components/ollama/ollama_embeddings.py +106 -0
- lfx/components/openai/__init__.py +37 -0
- lfx/components/openai/openai.py +100 -0
- lfx/components/openai/openai_chat_model.py +176 -0
- lfx/components/openrouter/__init__.py +32 -0
- lfx/components/openrouter/openrouter.py +202 -0
- lfx/components/output_parsers/__init__.py +3 -0
- lfx/components/perplexity/__init__.py +34 -0
- lfx/components/perplexity/perplexity.py +75 -0
- lfx/components/pgvector/__init__.py +34 -0
- lfx/components/pgvector/pgvector.py +72 -0
- lfx/components/pinecone/__init__.py +34 -0
- lfx/components/pinecone/pinecone.py +134 -0
- lfx/components/processing/__init__.py +117 -0
- lfx/components/processing/alter_metadata.py +108 -0
- lfx/components/processing/batch_run.py +205 -0
- lfx/components/processing/combine_text.py +39 -0
- lfx/components/processing/converter.py +159 -0
- lfx/components/processing/create_data.py +110 -0
- lfx/components/processing/data_operations.py +438 -0
- lfx/components/processing/data_to_dataframe.py +70 -0
- lfx/components/processing/dataframe_operations.py +313 -0
- lfx/components/processing/extract_key.py +53 -0
- lfx/components/processing/filter_data.py +42 -0
- lfx/components/processing/filter_data_values.py +88 -0
- lfx/components/processing/json_cleaner.py +103 -0
- lfx/components/processing/lambda_filter.py +154 -0
- lfx/components/processing/llm_router.py +499 -0
- lfx/components/processing/merge_data.py +90 -0
- lfx/components/processing/message_to_data.py +36 -0
- lfx/components/processing/parse_data.py +70 -0
- lfx/components/processing/parse_dataframe.py +68 -0
- lfx/components/processing/parse_json_data.py +90 -0
- lfx/components/processing/parser.py +143 -0
- lfx/components/processing/prompt.py +67 -0
- lfx/components/processing/python_repl_core.py +98 -0
- lfx/components/processing/regex.py +82 -0
- lfx/components/processing/save_file.py +225 -0
- lfx/components/processing/select_data.py +48 -0
- lfx/components/processing/split_text.py +141 -0
- lfx/components/processing/structured_output.py +202 -0
- lfx/components/processing/update_data.py +160 -0
- lfx/components/prototypes/__init__.py +34 -0
- lfx/components/prototypes/python_function.py +73 -0
- lfx/components/qdrant/__init__.py +34 -0
- lfx/components/qdrant/qdrant.py +109 -0
- lfx/components/redis/__init__.py +37 -0
- lfx/components/redis/redis.py +89 -0
- lfx/components/redis/redis_chat.py +43 -0
- lfx/components/sambanova/__init__.py +32 -0
- lfx/components/sambanova/sambanova.py +84 -0
- lfx/components/scrapegraph/__init__.py +40 -0
- lfx/components/scrapegraph/scrapegraph_markdownify_api.py +64 -0
- lfx/components/scrapegraph/scrapegraph_search_api.py +64 -0
- lfx/components/scrapegraph/scrapegraph_smart_scraper_api.py +71 -0
- lfx/components/searchapi/__init__.py +34 -0
- lfx/components/searchapi/search.py +79 -0
- lfx/components/serpapi/__init__.py +3 -0
- lfx/components/serpapi/serp.py +115 -0
- lfx/components/supabase/__init__.py +34 -0
- lfx/components/supabase/supabase.py +76 -0
- lfx/components/tavily/__init__.py +4 -0
- lfx/components/tavily/tavily_extract.py +117 -0
- lfx/components/tavily/tavily_search.py +212 -0
- lfx/components/textsplitters/__init__.py +3 -0
- lfx/components/toolkits/__init__.py +3 -0
- lfx/components/tools/__init__.py +72 -0
- lfx/components/tools/calculator.py +108 -0
- lfx/components/tools/google_search_api.py +45 -0
- lfx/components/tools/google_serper_api.py +115 -0
- lfx/components/tools/python_code_structured_tool.py +327 -0
- lfx/components/tools/python_repl.py +97 -0
- lfx/components/tools/search_api.py +87 -0
- lfx/components/tools/searxng.py +145 -0
- lfx/components/tools/serp_api.py +119 -0
- lfx/components/tools/tavily_search_tool.py +344 -0
- lfx/components/tools/wikidata_api.py +102 -0
- lfx/components/tools/wikipedia_api.py +49 -0
- lfx/components/tools/yahoo_finance.py +129 -0
- lfx/components/twelvelabs/__init__.py +52 -0
- lfx/components/twelvelabs/convert_astra_results.py +84 -0
- lfx/components/twelvelabs/pegasus_index.py +311 -0
- lfx/components/twelvelabs/split_video.py +291 -0
- lfx/components/twelvelabs/text_embeddings.py +57 -0
- lfx/components/twelvelabs/twelvelabs_pegasus.py +408 -0
- lfx/components/twelvelabs/video_embeddings.py +100 -0
- lfx/components/twelvelabs/video_file.py +179 -0
- lfx/components/unstructured/__init__.py +3 -0
- lfx/components/unstructured/unstructured.py +121 -0
- lfx/components/upstash/__init__.py +34 -0
- lfx/components/upstash/upstash.py +124 -0
- lfx/components/vectara/__init__.py +37 -0
- lfx/components/vectara/vectara.py +97 -0
- lfx/components/vectara/vectara_rag.py +164 -0
- lfx/components/vectorstores/__init__.py +40 -0
- lfx/components/vectorstores/astradb.py +1285 -0
- lfx/components/vectorstores/astradb_graph.py +319 -0
- lfx/components/vectorstores/cassandra.py +264 -0
- lfx/components/vectorstores/cassandra_graph.py +238 -0
- lfx/components/vectorstores/chroma.py +167 -0
- lfx/components/vectorstores/clickhouse.py +135 -0
- lfx/components/vectorstores/couchbase.py +102 -0
- lfx/components/vectorstores/elasticsearch.py +267 -0
- lfx/components/vectorstores/faiss.py +111 -0
- lfx/components/vectorstores/graph_rag.py +141 -0
- lfx/components/vectorstores/hcd.py +314 -0
- lfx/components/vectorstores/local_db.py +261 -0
- lfx/components/vectorstores/milvus.py +115 -0
- lfx/components/vectorstores/mongodb_atlas.py +213 -0
- lfx/components/vectorstores/opensearch.py +243 -0
- lfx/components/vectorstores/pgvector.py +72 -0
- lfx/components/vectorstores/pinecone.py +134 -0
- lfx/components/vectorstores/qdrant.py +109 -0
- lfx/components/vectorstores/supabase.py +76 -0
- lfx/components/vectorstores/upstash.py +124 -0
- lfx/components/vectorstores/vectara.py +97 -0
- lfx/components/vectorstores/vectara_rag.py +164 -0
- lfx/components/vectorstores/weaviate.py +89 -0
- lfx/components/vertexai/__init__.py +37 -0
- lfx/components/vertexai/vertexai.py +71 -0
- lfx/components/vertexai/vertexai_embeddings.py +67 -0
- lfx/components/weaviate/__init__.py +34 -0
- lfx/components/weaviate/weaviate.py +89 -0
- lfx/components/wikipedia/__init__.py +4 -0
- lfx/components/wikipedia/wikidata.py +86 -0
- lfx/components/wikipedia/wikipedia.py +53 -0
- lfx/components/wolframalpha/__init__.py +3 -0
- lfx/components/wolframalpha/wolfram_alpha_api.py +54 -0
- lfx/components/xai/__init__.py +32 -0
- lfx/components/xai/xai.py +167 -0
- lfx/components/yahoosearch/__init__.py +3 -0
- lfx/components/yahoosearch/yahoo.py +137 -0
- lfx/components/youtube/__init__.py +52 -0
- lfx/components/youtube/channel.py +227 -0
- lfx/components/youtube/comments.py +231 -0
- lfx/components/youtube/playlist.py +33 -0
- lfx/components/youtube/search.py +120 -0
- lfx/components/youtube/trending.py +285 -0
- lfx/components/youtube/video_details.py +263 -0
- lfx/components/youtube/youtube_transcripts.py +118 -0
- lfx/components/zep/__init__.py +3 -0
- lfx/components/zep/zep.py +44 -0
- lfx/constants.py +6 -0
- lfx/custom/__init__.py +7 -0
- lfx/custom/attributes.py +86 -0
- lfx/custom/code_parser/__init__.py +3 -0
- lfx/custom/code_parser/code_parser.py +361 -0
- lfx/custom/custom_component/__init__.py +0 -0
- lfx/custom/custom_component/base_component.py +128 -0
- lfx/custom/custom_component/component.py +1808 -0
- lfx/custom/custom_component/component_with_cache.py +8 -0
- lfx/custom/custom_component/custom_component.py +588 -0
- lfx/custom/dependency_analyzer.py +165 -0
- lfx/custom/directory_reader/__init__.py +3 -0
- lfx/custom/directory_reader/directory_reader.py +359 -0
- lfx/custom/directory_reader/utils.py +171 -0
- lfx/custom/eval.py +12 -0
- lfx/custom/schema.py +32 -0
- lfx/custom/tree_visitor.py +21 -0
- lfx/custom/utils.py +877 -0
- lfx/custom/validate.py +488 -0
- lfx/events/__init__.py +1 -0
- lfx/events/event_manager.py +110 -0
- lfx/exceptions/__init__.py +0 -0
- lfx/exceptions/component.py +15 -0
- lfx/field_typing/__init__.py +91 -0
- lfx/field_typing/constants.py +215 -0
- lfx/field_typing/range_spec.py +35 -0
- lfx/graph/__init__.py +6 -0
- lfx/graph/edge/__init__.py +0 -0
- lfx/graph/edge/base.py +277 -0
- lfx/graph/edge/schema.py +119 -0
- lfx/graph/edge/utils.py +0 -0
- lfx/graph/graph/__init__.py +0 -0
- lfx/graph/graph/ascii.py +202 -0
- lfx/graph/graph/base.py +2238 -0
- lfx/graph/graph/constants.py +63 -0
- lfx/graph/graph/runnable_vertices_manager.py +133 -0
- lfx/graph/graph/schema.py +52 -0
- lfx/graph/graph/state_model.py +66 -0
- lfx/graph/graph/utils.py +1024 -0
- lfx/graph/schema.py +75 -0
- lfx/graph/state/__init__.py +0 -0
- lfx/graph/state/model.py +237 -0
- lfx/graph/utils.py +200 -0
- lfx/graph/vertex/__init__.py +0 -0
- lfx/graph/vertex/base.py +823 -0
- lfx/graph/vertex/constants.py +0 -0
- lfx/graph/vertex/exceptions.py +4 -0
- lfx/graph/vertex/param_handler.py +264 -0
- lfx/graph/vertex/schema.py +26 -0
- lfx/graph/vertex/utils.py +19 -0
- lfx/graph/vertex/vertex_types.py +489 -0
- lfx/helpers/__init__.py +1 -0
- lfx/helpers/base_model.py +71 -0
- lfx/helpers/custom.py +13 -0
- lfx/helpers/data.py +167 -0
- lfx/helpers/flow.py +194 -0
- lfx/inputs/__init__.py +68 -0
- lfx/inputs/constants.py +2 -0
- lfx/inputs/input_mixin.py +328 -0
- lfx/inputs/inputs.py +714 -0
- lfx/inputs/validators.py +19 -0
- lfx/interface/__init__.py +6 -0
- lfx/interface/components.py +489 -0
- lfx/interface/importing/__init__.py +5 -0
- lfx/interface/importing/utils.py +39 -0
- lfx/interface/initialize/__init__.py +3 -0
- lfx/interface/initialize/loading.py +224 -0
- lfx/interface/listing.py +26 -0
- lfx/interface/run.py +16 -0
- lfx/interface/utils.py +111 -0
- lfx/io/__init__.py +63 -0
- lfx/io/schema.py +289 -0
- lfx/load/__init__.py +8 -0
- lfx/load/load.py +256 -0
- lfx/load/utils.py +99 -0
- lfx/log/__init__.py +5 -0
- lfx/log/logger.py +385 -0
- lfx/memory/__init__.py +90 -0
- lfx/memory/stubs.py +283 -0
- lfx/processing/__init__.py +1 -0
- lfx/processing/process.py +238 -0
- lfx/processing/utils.py +25 -0
- lfx/py.typed +0 -0
- lfx/schema/__init__.py +66 -0
- lfx/schema/artifact.py +83 -0
- lfx/schema/content_block.py +62 -0
- lfx/schema/content_types.py +91 -0
- lfx/schema/data.py +308 -0
- lfx/schema/dataframe.py +210 -0
- lfx/schema/dotdict.py +74 -0
- lfx/schema/encoders.py +13 -0
- lfx/schema/graph.py +47 -0
- lfx/schema/image.py +131 -0
- lfx/schema/json_schema.py +141 -0
- lfx/schema/log.py +61 -0
- lfx/schema/message.py +473 -0
- lfx/schema/openai_responses_schemas.py +74 -0
- lfx/schema/properties.py +41 -0
- lfx/schema/schema.py +171 -0
- lfx/schema/serialize.py +13 -0
- lfx/schema/table.py +140 -0
- lfx/schema/validators.py +114 -0
- lfx/serialization/__init__.py +5 -0
- lfx/serialization/constants.py +2 -0
- lfx/serialization/serialization.py +314 -0
- lfx/services/__init__.py +23 -0
- lfx/services/base.py +28 -0
- lfx/services/cache/__init__.py +6 -0
- lfx/services/cache/base.py +183 -0
- lfx/services/cache/service.py +166 -0
- lfx/services/cache/utils.py +169 -0
- lfx/services/chat/__init__.py +1 -0
- lfx/services/chat/config.py +2 -0
- lfx/services/chat/schema.py +10 -0
- lfx/services/deps.py +129 -0
- lfx/services/factory.py +19 -0
- lfx/services/initialize.py +19 -0
- lfx/services/interfaces.py +103 -0
- lfx/services/manager.py +172 -0
- lfx/services/schema.py +20 -0
- lfx/services/session.py +82 -0
- lfx/services/settings/__init__.py +3 -0
- lfx/services/settings/auth.py +130 -0
- lfx/services/settings/base.py +539 -0
- lfx/services/settings/constants.py +31 -0
- lfx/services/settings/factory.py +23 -0
- lfx/services/settings/feature_flags.py +12 -0
- lfx/services/settings/service.py +35 -0
- lfx/services/settings/utils.py +40 -0
- lfx/services/shared_component_cache/__init__.py +1 -0
- lfx/services/shared_component_cache/factory.py +30 -0
- lfx/services/shared_component_cache/service.py +9 -0
- lfx/services/storage/__init__.py +5 -0
- lfx/services/storage/local.py +155 -0
- lfx/services/storage/service.py +54 -0
- lfx/services/tracing/__init__.py +1 -0
- lfx/services/tracing/service.py +21 -0
- lfx/settings.py +6 -0
- lfx/template/__init__.py +6 -0
- lfx/template/field/__init__.py +0 -0
- lfx/template/field/base.py +257 -0
- lfx/template/field/prompt.py +15 -0
- lfx/template/frontend_node/__init__.py +6 -0
- lfx/template/frontend_node/base.py +212 -0
- lfx/template/frontend_node/constants.py +65 -0
- lfx/template/frontend_node/custom_components.py +79 -0
- lfx/template/template/__init__.py +0 -0
- lfx/template/template/base.py +100 -0
- lfx/template/utils.py +217 -0
- lfx/type_extraction/__init__.py +19 -0
- lfx/type_extraction/type_extraction.py +75 -0
- lfx/type_extraction.py +80 -0
- lfx/utils/__init__.py +1 -0
- lfx/utils/async_helpers.py +42 -0
- lfx/utils/component_utils.py +154 -0
- lfx/utils/concurrency.py +60 -0
- lfx/utils/connection_string_parser.py +11 -0
- lfx/utils/constants.py +205 -0
- lfx/utils/data_structure.py +212 -0
- lfx/utils/exceptions.py +22 -0
- lfx/utils/helpers.py +28 -0
- lfx/utils/image.py +73 -0
- lfx/utils/lazy_load.py +15 -0
- lfx/utils/request_utils.py +18 -0
- lfx/utils/schemas.py +139 -0
- lfx/utils/util.py +481 -0
- lfx/utils/util_strings.py +56 -0
- lfx/utils/version.py +24 -0
- lfx_nightly-0.1.11.dev0.dist-info/METADATA +293 -0
- lfx_nightly-0.1.11.dev0.dist-info/RECORD +699 -0
- lfx_nightly-0.1.11.dev0.dist-info/WHEEL +4 -0
- lfx_nightly-0.1.11.dev0.dist-info/entry_points.txt +2 -0
lfx/base/agents/utils.py
ADDED
@@ -0,0 +1,205 @@
|
|
1
|
+
import re
|
2
|
+
from collections.abc import Callable, Sequence
|
3
|
+
from typing import Any
|
4
|
+
|
5
|
+
from langchain.agents import (
|
6
|
+
create_json_chat_agent,
|
7
|
+
create_openai_tools_agent,
|
8
|
+
create_tool_calling_agent,
|
9
|
+
create_xml_agent,
|
10
|
+
)
|
11
|
+
from langchain.agents.xml.base import render_text_description
|
12
|
+
from langchain_core.language_models import BaseLanguageModel
|
13
|
+
from langchain_core.messages import BaseMessage
|
14
|
+
from langchain_core.prompts import BasePromptTemplate, ChatPromptTemplate
|
15
|
+
from langchain_core.tools import BaseTool
|
16
|
+
from pydantic import BaseModel
|
17
|
+
|
18
|
+
from lfx.log.logger import logger
|
19
|
+
from lfx.schema.data import Data
|
20
|
+
from lfx.services.cache.base import CacheService
|
21
|
+
from lfx.services.cache.utils import CacheMiss
|
22
|
+
|
23
|
+
from .default_prompts import XML_AGENT_PROMPT
|
24
|
+
|
25
|
+
|
26
|
+
class AgentSpec(BaseModel):
|
27
|
+
func: Callable[
|
28
|
+
[
|
29
|
+
BaseLanguageModel,
|
30
|
+
Sequence[BaseTool],
|
31
|
+
BasePromptTemplate | ChatPromptTemplate,
|
32
|
+
Callable[[list[BaseTool]], str] | None,
|
33
|
+
bool | list[str] | None,
|
34
|
+
],
|
35
|
+
Any,
|
36
|
+
]
|
37
|
+
prompt: Any | None = None
|
38
|
+
fields: list[str]
|
39
|
+
hub_repo: str | None = None
|
40
|
+
|
41
|
+
|
42
|
+
def data_to_messages(data: list[Data]) -> list[BaseMessage]:
|
43
|
+
"""Convert a list of data to a list of messages.
|
44
|
+
|
45
|
+
Args:
|
46
|
+
data (List[Data]): The data to convert.
|
47
|
+
|
48
|
+
Returns:
|
49
|
+
List[Message]: The data as messages.
|
50
|
+
"""
|
51
|
+
return [value.to_lc_message() for value in data]
|
52
|
+
|
53
|
+
|
54
|
+
def validate_and_create_xml_agent(
|
55
|
+
llm: BaseLanguageModel,
|
56
|
+
tools: Sequence[BaseTool],
|
57
|
+
prompt: BasePromptTemplate,
|
58
|
+
tools_renderer: Callable[[list[BaseTool]], str] = render_text_description,
|
59
|
+
*,
|
60
|
+
stop_sequence: bool | list[str] = True,
|
61
|
+
):
|
62
|
+
return create_xml_agent(
|
63
|
+
llm=llm,
|
64
|
+
tools=tools,
|
65
|
+
prompt=prompt,
|
66
|
+
tools_renderer=tools_renderer,
|
67
|
+
stop_sequence=stop_sequence,
|
68
|
+
)
|
69
|
+
|
70
|
+
|
71
|
+
def validate_and_create_openai_tools_agent(
|
72
|
+
llm: BaseLanguageModel,
|
73
|
+
tools: Sequence[BaseTool],
|
74
|
+
prompt: ChatPromptTemplate,
|
75
|
+
_tools_renderer: Callable[[list[BaseTool]], str] = render_text_description,
|
76
|
+
*,
|
77
|
+
_stop_sequence: bool | list[str] = True,
|
78
|
+
):
|
79
|
+
return create_openai_tools_agent(
|
80
|
+
llm=llm,
|
81
|
+
tools=tools,
|
82
|
+
prompt=prompt,
|
83
|
+
)
|
84
|
+
|
85
|
+
|
86
|
+
def validate_and_create_tool_calling_agent(
|
87
|
+
llm: BaseLanguageModel,
|
88
|
+
tools: Sequence[BaseTool],
|
89
|
+
prompt: ChatPromptTemplate,
|
90
|
+
_tools_renderer: Callable[[list[BaseTool]], str] = render_text_description,
|
91
|
+
*,
|
92
|
+
_stop_sequence: bool | list[str] = True,
|
93
|
+
):
|
94
|
+
return create_tool_calling_agent(
|
95
|
+
llm=llm,
|
96
|
+
tools=tools,
|
97
|
+
prompt=prompt,
|
98
|
+
)
|
99
|
+
|
100
|
+
|
101
|
+
def validate_and_create_json_chat_agent(
|
102
|
+
llm: BaseLanguageModel,
|
103
|
+
tools: Sequence[BaseTool],
|
104
|
+
prompt: ChatPromptTemplate,
|
105
|
+
tools_renderer: Callable[[list[BaseTool]], str] = render_text_description,
|
106
|
+
*,
|
107
|
+
stop_sequence: bool | list[str] = True,
|
108
|
+
):
|
109
|
+
return create_json_chat_agent(
|
110
|
+
llm=llm,
|
111
|
+
tools=tools,
|
112
|
+
prompt=prompt,
|
113
|
+
tools_renderer=tools_renderer,
|
114
|
+
stop_sequence=stop_sequence,
|
115
|
+
)
|
116
|
+
|
117
|
+
|
118
|
+
AGENTS: dict[str, AgentSpec] = {
|
119
|
+
"Tool Calling Agent": AgentSpec(
|
120
|
+
func=validate_and_create_tool_calling_agent,
|
121
|
+
prompt=None,
|
122
|
+
fields=["llm", "tools", "prompt"],
|
123
|
+
hub_repo=None,
|
124
|
+
),
|
125
|
+
"XML Agent": AgentSpec(
|
126
|
+
func=validate_and_create_xml_agent,
|
127
|
+
prompt=XML_AGENT_PROMPT, # Ensure XML_AGENT_PROMPT is properly defined and typed.
|
128
|
+
fields=["llm", "tools", "prompt", "tools_renderer", "stop_sequence"],
|
129
|
+
hub_repo="hwchase17/xml-agent-convo",
|
130
|
+
),
|
131
|
+
"OpenAI Tools Agent": AgentSpec(
|
132
|
+
func=validate_and_create_openai_tools_agent,
|
133
|
+
prompt=None,
|
134
|
+
fields=["llm", "tools", "prompt"],
|
135
|
+
hub_repo=None,
|
136
|
+
),
|
137
|
+
"JSON Chat Agent": AgentSpec(
|
138
|
+
func=validate_and_create_json_chat_agent,
|
139
|
+
prompt=None,
|
140
|
+
fields=["llm", "tools", "prompt", "tools_renderer", "stop_sequence"],
|
141
|
+
hub_repo="hwchase17/react-chat-json",
|
142
|
+
),
|
143
|
+
}
|
144
|
+
|
145
|
+
|
146
|
+
def get_agents_list():
|
147
|
+
return list(AGENTS.keys())
|
148
|
+
|
149
|
+
|
150
|
+
def safe_cache_get(cache: CacheService, key, default=None):
|
151
|
+
"""Safely get a value from cache, handling CacheMiss objects."""
|
152
|
+
try:
|
153
|
+
value = cache.get(key)
|
154
|
+
if isinstance(value, CacheMiss):
|
155
|
+
return default
|
156
|
+
except (AttributeError, KeyError, TypeError):
|
157
|
+
return default
|
158
|
+
else:
|
159
|
+
return value
|
160
|
+
|
161
|
+
|
162
|
+
def safe_cache_set(cache: CacheService, key, value):
|
163
|
+
"""Safely set a value in cache, handling potential errors."""
|
164
|
+
try:
|
165
|
+
cache.set(key, value)
|
166
|
+
except (AttributeError, TypeError) as e:
|
167
|
+
logger.warning(f"Failed to set cache key '{key}': {e}")
|
168
|
+
|
169
|
+
|
170
|
+
def maybe_unflatten_dict(flat: dict[str, Any]) -> dict[str, Any]:
|
171
|
+
"""If any key looks nested (contains a dot or "[index]"), rebuild the.
|
172
|
+
|
173
|
+
full nested structure; otherwise return flat as is.
|
174
|
+
"""
|
175
|
+
# Quick check: do we have any nested keys?
|
176
|
+
if not any(re.search(r"\.|\[\d+\]", key) for key in flat):
|
177
|
+
return flat
|
178
|
+
|
179
|
+
# Otherwise, unflatten into dicts/lists
|
180
|
+
nested: dict[str, Any] = {}
|
181
|
+
array_re = re.compile(r"^(.+)\[(\d+)\]$")
|
182
|
+
|
183
|
+
for key, val in flat.items():
|
184
|
+
parts = key.split(".")
|
185
|
+
cur = nested
|
186
|
+
for i, part in enumerate(parts):
|
187
|
+
m = array_re.match(part)
|
188
|
+
# Array segment?
|
189
|
+
if m:
|
190
|
+
name, idx = m.group(1), int(m.group(2))
|
191
|
+
lst = cur.setdefault(name, [])
|
192
|
+
# Ensure list is big enough
|
193
|
+
while len(lst) <= idx:
|
194
|
+
lst.append({})
|
195
|
+
if i == len(parts) - 1:
|
196
|
+
lst[idx] = val
|
197
|
+
else:
|
198
|
+
cur = lst[idx]
|
199
|
+
# Normal object key
|
200
|
+
elif i == len(parts) - 1:
|
201
|
+
cur[part] = val
|
202
|
+
else:
|
203
|
+
cur = cur.setdefault(part, {})
|
204
|
+
|
205
|
+
return nested
|
File without changes
|
@@ -0,0 +1,171 @@
|
|
1
|
+
import importlib
|
2
|
+
import inspect
|
3
|
+
import json
|
4
|
+
import os
|
5
|
+
import pkgutil
|
6
|
+
import threading
|
7
|
+
import uuid
|
8
|
+
from json.decoder import JSONDecodeError
|
9
|
+
from pathlib import Path
|
10
|
+
from typing import Any
|
11
|
+
|
12
|
+
import astra_assistants.tools as astra_assistants_tools
|
13
|
+
import requests
|
14
|
+
from astra_assistants import OpenAIWithDefaultKey, patch
|
15
|
+
from astra_assistants.tools.tool_interface import ToolInterface
|
16
|
+
from langchain_core.tools import BaseTool
|
17
|
+
from pydantic import BaseModel
|
18
|
+
from requests.exceptions import RequestException
|
19
|
+
|
20
|
+
from lfx.base.mcp.util import create_input_schema_from_json_schema
|
21
|
+
from lfx.services.cache.utils import CacheMiss
|
22
|
+
|
23
|
+
client_lock = threading.Lock()
|
24
|
+
client = None
|
25
|
+
|
26
|
+
|
27
|
+
def get_patched_openai_client(shared_component_cache):
|
28
|
+
os.environ["ASTRA_ASSISTANTS_QUIET"] = "true"
|
29
|
+
client = shared_component_cache.get("client")
|
30
|
+
if isinstance(client, CacheMiss):
|
31
|
+
client = patch(OpenAIWithDefaultKey())
|
32
|
+
shared_component_cache.set("client", client)
|
33
|
+
return client
|
34
|
+
|
35
|
+
|
36
|
+
url = "https://raw.githubusercontent.com/BerriAI/litellm/refs/heads/main/model_prices_and_context_window.json"
|
37
|
+
try:
|
38
|
+
response = requests.get(url, timeout=10)
|
39
|
+
response.raise_for_status()
|
40
|
+
data = json.loads(response.text)
|
41
|
+
except RequestException:
|
42
|
+
data = {}
|
43
|
+
except JSONDecodeError:
|
44
|
+
data = {}
|
45
|
+
|
46
|
+
# Extract the model names into a Python list
|
47
|
+
litellm_model_names = [model for model in data if model != "sample_spec"]
|
48
|
+
|
49
|
+
|
50
|
+
# To store the class names that extend ToolInterface
|
51
|
+
tool_names = []
|
52
|
+
tools_and_names = {}
|
53
|
+
|
54
|
+
|
55
|
+
def tools_from_package(your_package) -> None:
|
56
|
+
# Iterate over all modules in the package
|
57
|
+
package_name = your_package.__name__
|
58
|
+
for module_info in pkgutil.iter_modules(your_package.__path__):
|
59
|
+
module_name = f"{package_name}.{module_info.name}"
|
60
|
+
|
61
|
+
# Dynamically import the module
|
62
|
+
import warnings
|
63
|
+
|
64
|
+
with warnings.catch_warnings():
|
65
|
+
warnings.filterwarnings(
|
66
|
+
"ignore", message="Support for class-based `config` is deprecated", category=DeprecationWarning
|
67
|
+
)
|
68
|
+
warnings.filterwarnings("ignore", message="Valid config keys have changed in V2", category=UserWarning)
|
69
|
+
module = importlib.import_module(module_name)
|
70
|
+
|
71
|
+
# Iterate over all members of the module
|
72
|
+
for name, obj in inspect.getmembers(module, inspect.isclass):
|
73
|
+
# Check if the class is a subclass of ToolInterface and is not ToolInterface itself
|
74
|
+
if issubclass(obj, ToolInterface) and obj is not ToolInterface:
|
75
|
+
tool_names.append(name)
|
76
|
+
tools_and_names[name] = obj
|
77
|
+
|
78
|
+
|
79
|
+
tools_from_package(astra_assistants_tools)
|
80
|
+
|
81
|
+
|
82
|
+
def wrap_base_tool_as_tool_interface(base_tool: BaseTool) -> ToolInterface:
|
83
|
+
"""wrap_Base_tool_ass_tool_interface.
|
84
|
+
|
85
|
+
Wrap a BaseTool instance in a new class implementing ToolInterface,
|
86
|
+
building a dynamic Pydantic model from its args_schema (if any).
|
87
|
+
We only call `args_schema()` if it's truly a function/method,
|
88
|
+
avoiding accidental calls on a Pydantic model class (which is also callable).
|
89
|
+
"""
|
90
|
+
raw_args_schema = getattr(base_tool, "args_schema", None)
|
91
|
+
|
92
|
+
# --- 1) Distinguish between a function/method vs. class/dict/None ---
|
93
|
+
if inspect.isfunction(raw_args_schema) or inspect.ismethod(raw_args_schema):
|
94
|
+
# It's actually a function -> call it once to get a class or dict
|
95
|
+
raw_args_schema = raw_args_schema()
|
96
|
+
# Otherwise, if it's a class or dict, do nothing here
|
97
|
+
|
98
|
+
# Now `raw_args_schema` might be:
|
99
|
+
# - A Pydantic model class (subclass of BaseModel)
|
100
|
+
# - A dict (JSON schema)
|
101
|
+
# - None
|
102
|
+
# - Something unexpected => raise error
|
103
|
+
|
104
|
+
# --- 2) Convert the schema or model class to a JSON schema dict ---
|
105
|
+
if raw_args_schema is None:
|
106
|
+
# No schema => minimal
|
107
|
+
schema_dict = {"type": "object", "properties": {}}
|
108
|
+
|
109
|
+
elif isinstance(raw_args_schema, dict):
|
110
|
+
# Already a JSON schema
|
111
|
+
schema_dict = raw_args_schema
|
112
|
+
|
113
|
+
elif inspect.isclass(raw_args_schema) and issubclass(raw_args_schema, BaseModel):
|
114
|
+
# It's a Pydantic model class -> convert to JSON schema
|
115
|
+
schema_dict = raw_args_schema.schema()
|
116
|
+
|
117
|
+
else:
|
118
|
+
msg = f"args_schema must be a Pydantic model class, a JSON schema dict, or None. Got: {raw_args_schema!r}"
|
119
|
+
raise TypeError(msg)
|
120
|
+
|
121
|
+
# --- 3) Build our dynamic Pydantic model from the JSON schema ---
|
122
|
+
InputSchema: type[BaseModel] = create_input_schema_from_json_schema(schema_dict) # noqa: N806
|
123
|
+
|
124
|
+
# --- 4) Define a wrapper class that uses composition ---
|
125
|
+
class WrappedDynamicTool(ToolInterface):
|
126
|
+
"""WrappedDynamicTool.
|
127
|
+
|
128
|
+
Uses composition to delegate logic to the original base_tool,
|
129
|
+
but sets `call(..., arguments: InputSchema)` so we have a real model.
|
130
|
+
"""
|
131
|
+
|
132
|
+
def __init__(self, tool: BaseTool):
|
133
|
+
self._tool = tool
|
134
|
+
|
135
|
+
def call(self, arguments: InputSchema) -> dict: # type: ignore # noqa: PGH003
|
136
|
+
output = self._tool.invoke(arguments.dict()) # type: ignore # noqa: PGH003
|
137
|
+
result = ""
|
138
|
+
if "error" in output[0].data:
|
139
|
+
result = output[0].data["error"]
|
140
|
+
elif "result" in output[0].data:
|
141
|
+
result = output[0].data["result"]
|
142
|
+
return {"cache_id": str(uuid.uuid4()), "output": result}
|
143
|
+
|
144
|
+
def run(self, tool_input: Any) -> str:
|
145
|
+
return self._tool.run(tool_input)
|
146
|
+
|
147
|
+
def name(self) -> str:
|
148
|
+
"""Return the base tool's name if it exists."""
|
149
|
+
if hasattr(self._tool, "name"):
|
150
|
+
return str(self._tool.name)
|
151
|
+
return super().name()
|
152
|
+
|
153
|
+
def to_function(self):
|
154
|
+
"""Incorporate the base tool's description if present."""
|
155
|
+
params = InputSchema.schema()
|
156
|
+
description = getattr(self._tool, "description", "A dynamically wrapped tool")
|
157
|
+
return {
|
158
|
+
"type": "function",
|
159
|
+
"function": {"name": self.name(), "description": description, "parameters": params},
|
160
|
+
}
|
161
|
+
|
162
|
+
# Return an instance of our newly minted class
|
163
|
+
return WrappedDynamicTool(base_tool)
|
164
|
+
|
165
|
+
|
166
|
+
def sync_upload(file_path, client):
|
167
|
+
with Path(file_path).open("rb") as sync_file_handle:
|
168
|
+
return client.files.create(
|
169
|
+
file=sync_file_handle, # Pass the sync file handle
|
170
|
+
purpose="assistants",
|
171
|
+
)
|
File without changes
|
lfx/base/chains/model.py
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
from lfx.custom.custom_component.component import Component
|
2
|
+
from lfx.template.field.base import Output
|
3
|
+
|
4
|
+
|
5
|
+
class LCChainComponent(Component):
|
6
|
+
trace_type = "chain"
|
7
|
+
|
8
|
+
outputs = [Output(display_name="Text", name="text", method="invoke_chain")]
|
9
|
+
|
10
|
+
def _validate_outputs(self) -> None:
|
11
|
+
required_output_methods = ["invoke_chain"]
|
12
|
+
output_names = [output.name for output in self.outputs]
|
13
|
+
for method_name in required_output_methods:
|
14
|
+
if method_name not in output_names:
|
15
|
+
msg = f"Output with name '{method_name}' must be defined."
|
16
|
+
raise ValueError(msg)
|
17
|
+
if not hasattr(self, method_name):
|
18
|
+
msg = f"Method '{method_name}' must be defined."
|
19
|
+
raise ValueError(msg)
|
File without changes
|