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/schema/dotdict.py
ADDED
@@ -0,0 +1,74 @@
|
|
1
|
+
"""Dot-notation dictionary implementation copied from langflow for lfx package."""
|
2
|
+
|
3
|
+
|
4
|
+
class dotdict(dict): # noqa: N801
|
5
|
+
"""dotdict allows accessing dictionary elements using dot notation (e.g., dict.key instead of dict['key']).
|
6
|
+
|
7
|
+
It automatically converts nested dictionaries into dotdict instances, enabling dot notation on them as well.
|
8
|
+
|
9
|
+
Note:
|
10
|
+
- Only keys that are valid attribute names (e.g., strings that could be variable names) are accessible via dot
|
11
|
+
notation.
|
12
|
+
- Keys which are not valid Python attribute names or collide with the dict method names (like 'items', 'keys')
|
13
|
+
should be accessed using the traditional dict['key'] notation.
|
14
|
+
"""
|
15
|
+
|
16
|
+
def __getattr__(self, attr):
|
17
|
+
"""Override dot access to behave like dictionary lookup. Automatically convert nested dicts to dotdicts.
|
18
|
+
|
19
|
+
Args:
|
20
|
+
attr (str): Attribute to access.
|
21
|
+
|
22
|
+
Returns:
|
23
|
+
The value associated with 'attr' in the dictionary, converted to dotdict if it is a dict.
|
24
|
+
|
25
|
+
Raises:
|
26
|
+
AttributeError: If the attribute is not found in the dictionary.
|
27
|
+
"""
|
28
|
+
try:
|
29
|
+
value = self[attr]
|
30
|
+
if isinstance(value, dict) and not isinstance(value, dotdict):
|
31
|
+
value = dotdict(value)
|
32
|
+
self[attr] = value # Update self to nest dotdict for future accesses
|
33
|
+
except KeyError as e:
|
34
|
+
msg = f"'dotdict' object has no attribute '{attr}'"
|
35
|
+
raise AttributeError(msg) from e
|
36
|
+
else:
|
37
|
+
return value
|
38
|
+
|
39
|
+
def __setattr__(self, key, value) -> None:
|
40
|
+
"""Override attribute setting to work as dictionary item assignment.
|
41
|
+
|
42
|
+
Args:
|
43
|
+
key (str): The key under which to store the value.
|
44
|
+
value: The value to store in the dictionary.
|
45
|
+
"""
|
46
|
+
if isinstance(value, dict) and not isinstance(value, dotdict):
|
47
|
+
value = dotdict(value)
|
48
|
+
self[key] = value
|
49
|
+
|
50
|
+
def __delattr__(self, key) -> None:
|
51
|
+
"""Override attribute deletion to work as dictionary item deletion.
|
52
|
+
|
53
|
+
Args:
|
54
|
+
key (str): The key of the item to delete from the dictionary.
|
55
|
+
|
56
|
+
Raises:
|
57
|
+
AttributeError: If the key is not found in the dictionary.
|
58
|
+
"""
|
59
|
+
try:
|
60
|
+
del self[key]
|
61
|
+
except KeyError as e:
|
62
|
+
msg = f"'dotdict' object has no attribute '{key}'"
|
63
|
+
raise AttributeError(msg) from e
|
64
|
+
|
65
|
+
def __missing__(self, key):
|
66
|
+
"""Handle missing keys by returning an empty dotdict. This allows chaining access without raising KeyError.
|
67
|
+
|
68
|
+
Args:
|
69
|
+
key: The missing key.
|
70
|
+
|
71
|
+
Returns:
|
72
|
+
An empty dotdict instance for the given missing key.
|
73
|
+
"""
|
74
|
+
return dotdict()
|
lfx/schema/encoders.py
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
from collections.abc import Callable
|
2
|
+
from datetime import datetime
|
3
|
+
|
4
|
+
|
5
|
+
def encode_callable(obj: Callable):
|
6
|
+
return obj.__name__ if hasattr(obj, "__name__") else str(obj)
|
7
|
+
|
8
|
+
|
9
|
+
def encode_datetime(obj: datetime):
|
10
|
+
return obj.strftime("%Y-%m-%d %H:%M:%S %Z")
|
11
|
+
|
12
|
+
|
13
|
+
CUSTOM_ENCODERS = {Callable: encode_callable, datetime: encode_datetime}
|
lfx/schema/graph.py
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
from typing import Any
|
2
|
+
|
3
|
+
from pydantic import BaseModel, Field, RootModel
|
4
|
+
|
5
|
+
from lfx.schema.schema import InputType
|
6
|
+
|
7
|
+
|
8
|
+
class InputValue(BaseModel):
|
9
|
+
components: list[str] | None = []
|
10
|
+
input_value: str | None = None
|
11
|
+
type: InputType | None = Field(
|
12
|
+
"any",
|
13
|
+
description="Defines on which components the input value should be applied. "
|
14
|
+
"'any' applies to all input components.",
|
15
|
+
)
|
16
|
+
|
17
|
+
|
18
|
+
class Tweaks(RootModel):
|
19
|
+
root: dict[str, str | dict[str, Any]] = Field(
|
20
|
+
description="A dictionary of tweaks to adjust the flow's execution. "
|
21
|
+
"Allows customizing flow behavior dynamically. "
|
22
|
+
"All tweaks are overridden by the input values.",
|
23
|
+
)
|
24
|
+
model_config = {
|
25
|
+
"json_schema_extra": {
|
26
|
+
"examples": [
|
27
|
+
{
|
28
|
+
"parameter_name": "value",
|
29
|
+
"Component Name": {"parameter_name": "value"},
|
30
|
+
"component_id": {"parameter_name": "value"},
|
31
|
+
}
|
32
|
+
]
|
33
|
+
}
|
34
|
+
}
|
35
|
+
|
36
|
+
# This should behave like a dict
|
37
|
+
def __getitem__(self, key):
|
38
|
+
return self.root[key]
|
39
|
+
|
40
|
+
def __setitem__(self, key, value) -> None:
|
41
|
+
self.root[key] = value
|
42
|
+
|
43
|
+
def __delitem__(self, key) -> None:
|
44
|
+
del self.root[key]
|
45
|
+
|
46
|
+
def items(self):
|
47
|
+
return self.root.items()
|
lfx/schema/image.py
ADDED
@@ -0,0 +1,131 @@
|
|
1
|
+
import base64
|
2
|
+
from pathlib import Path
|
3
|
+
|
4
|
+
import aiofiles
|
5
|
+
from PIL import Image as PILImage
|
6
|
+
from platformdirs import user_cache_dir
|
7
|
+
from pydantic import BaseModel
|
8
|
+
|
9
|
+
from lfx.services.deps import get_storage_service
|
10
|
+
|
11
|
+
IMAGE_ENDPOINT = "/files/images/"
|
12
|
+
|
13
|
+
|
14
|
+
def is_image_file(file_path) -> bool:
|
15
|
+
"""Check if a file is a valid image."""
|
16
|
+
try:
|
17
|
+
with PILImage.open(file_path) as img:
|
18
|
+
img.verify() # Verify that it is, in fact, an image
|
19
|
+
except (OSError, SyntaxError):
|
20
|
+
return False
|
21
|
+
return True
|
22
|
+
|
23
|
+
|
24
|
+
def get_file_paths(files: list[str | dict]):
|
25
|
+
"""Get file paths for a list of files."""
|
26
|
+
storage_service = get_storage_service()
|
27
|
+
if not storage_service:
|
28
|
+
# Extract paths from dicts if present
|
29
|
+
|
30
|
+
extracted_files = []
|
31
|
+
cache_dir = Path(user_cache_dir("langflow"))
|
32
|
+
|
33
|
+
for file in files:
|
34
|
+
file_path = file["path"] if isinstance(file, dict) and "path" in file else file
|
35
|
+
|
36
|
+
# If it's a relative path like "flow_id/filename", resolve it to cache dir
|
37
|
+
path = Path(file_path)
|
38
|
+
if not path.is_absolute() and not path.exists():
|
39
|
+
# Check if it exists in the cache directory
|
40
|
+
cache_path = cache_dir / file_path
|
41
|
+
if cache_path.exists():
|
42
|
+
extracted_files.append(str(cache_path))
|
43
|
+
else:
|
44
|
+
# Keep the original path if not found
|
45
|
+
extracted_files.append(file_path)
|
46
|
+
else:
|
47
|
+
extracted_files.append(file_path)
|
48
|
+
return extracted_files
|
49
|
+
|
50
|
+
file_paths = []
|
51
|
+
for file in files:
|
52
|
+
# Handle dict case
|
53
|
+
if storage_service is None:
|
54
|
+
continue
|
55
|
+
if isinstance(file, dict) and "path" in file:
|
56
|
+
file_path = Path(file["path"])
|
57
|
+
elif hasattr(file, "path") and file.path:
|
58
|
+
file_path = Path(file.path)
|
59
|
+
else:
|
60
|
+
file_path = Path(file)
|
61
|
+
flow_id, file_name = str(file_path.parent), file_path.name
|
62
|
+
file_paths.append(storage_service.build_full_path(flow_id=flow_id, file_name=file_name))
|
63
|
+
return file_paths
|
64
|
+
|
65
|
+
|
66
|
+
async def get_files(
|
67
|
+
file_paths: list[str],
|
68
|
+
*,
|
69
|
+
convert_to_base64: bool = False,
|
70
|
+
):
|
71
|
+
"""Get files from storage service."""
|
72
|
+
storage_service = get_storage_service()
|
73
|
+
if not storage_service:
|
74
|
+
# For testing purposes, read files directly when no storage service
|
75
|
+
file_objects: list[str | bytes] = []
|
76
|
+
for file_path_str in file_paths:
|
77
|
+
file_path = Path(file_path_str)
|
78
|
+
if file_path.exists():
|
79
|
+
# Use async read for compatibility
|
80
|
+
|
81
|
+
async with aiofiles.open(file_path, "rb") as f:
|
82
|
+
file_content = await f.read()
|
83
|
+
if convert_to_base64:
|
84
|
+
file_base64 = base64.b64encode(file_content).decode("utf-8")
|
85
|
+
file_objects.append(file_base64)
|
86
|
+
else:
|
87
|
+
file_objects.append(file_content)
|
88
|
+
else:
|
89
|
+
msg = f"File not found: {file_path}"
|
90
|
+
raise FileNotFoundError(msg)
|
91
|
+
return file_objects
|
92
|
+
|
93
|
+
file_objects: list[str | bytes] = []
|
94
|
+
for file in file_paths:
|
95
|
+
file_path = Path(file)
|
96
|
+
flow_id, file_name = str(file_path.parent), file_path.name
|
97
|
+
if not storage_service:
|
98
|
+
continue
|
99
|
+
file_object = await storage_service.get_file(flow_id=flow_id, file_name=file_name)
|
100
|
+
if convert_to_base64:
|
101
|
+
file_base64 = base64.b64encode(file_object).decode("utf-8")
|
102
|
+
file_objects.append(file_base64)
|
103
|
+
else:
|
104
|
+
file_objects.append(file_object)
|
105
|
+
return file_objects
|
106
|
+
|
107
|
+
|
108
|
+
class Image(BaseModel):
|
109
|
+
"""Image model for lfx package."""
|
110
|
+
|
111
|
+
path: str | None = None
|
112
|
+
url: str | None = None
|
113
|
+
|
114
|
+
def to_base64(self):
|
115
|
+
"""Convert image to base64 string."""
|
116
|
+
if self.path:
|
117
|
+
files = get_files([self.path], convert_to_base64=True)
|
118
|
+
return files[0]
|
119
|
+
msg = "Image path is not set."
|
120
|
+
raise ValueError(msg)
|
121
|
+
|
122
|
+
def to_content_dict(self):
|
123
|
+
"""Convert image to content dictionary."""
|
124
|
+
return {
|
125
|
+
"type": "image_url",
|
126
|
+
"image_url": self.to_base64(),
|
127
|
+
}
|
128
|
+
|
129
|
+
def get_url(self) -> str:
|
130
|
+
"""Get the URL for the image."""
|
131
|
+
return f"{IMAGE_ENDPOINT}{self.path}"
|
@@ -0,0 +1,141 @@
|
|
1
|
+
"""JSON Schema utilities for LFX."""
|
2
|
+
|
3
|
+
from typing import Any
|
4
|
+
|
5
|
+
from pydantic import BaseModel, Field, create_model
|
6
|
+
|
7
|
+
from lfx.log.logger import logger
|
8
|
+
|
9
|
+
NULLABLE_TYPE_LENGTH = 2 # Number of types in a nullable union (the type itself + null)
|
10
|
+
|
11
|
+
|
12
|
+
def create_input_schema_from_json_schema(schema: dict[str, Any]) -> type[BaseModel]:
|
13
|
+
"""Dynamically build a Pydantic model from a JSON schema (with $defs).
|
14
|
+
|
15
|
+
Non-required fields become Optional[...] with default=None.
|
16
|
+
"""
|
17
|
+
if schema.get("type") != "object":
|
18
|
+
msg = "Root schema must be type 'object'"
|
19
|
+
raise ValueError(msg)
|
20
|
+
|
21
|
+
defs: dict[str, dict[str, Any]] = schema.get("$defs", {})
|
22
|
+
model_cache: dict[str, type[BaseModel]] = {}
|
23
|
+
|
24
|
+
def resolve_ref(s: dict[str, Any] | None) -> dict[str, Any]:
|
25
|
+
"""Follow a $ref chain until you land on a real subschema."""
|
26
|
+
if s is None:
|
27
|
+
return {}
|
28
|
+
while "$ref" in s:
|
29
|
+
ref_name = s["$ref"].split("/")[-1]
|
30
|
+
s = defs.get(ref_name)
|
31
|
+
if s is None:
|
32
|
+
logger.warning(f"Parsing input schema: Definition '{ref_name}' not found")
|
33
|
+
return {"type": "string"}
|
34
|
+
return s
|
35
|
+
|
36
|
+
def parse_type(s: dict[str, Any] | None) -> Any:
|
37
|
+
"""Map a JSON Schema subschema to a Python type (possibly nested)."""
|
38
|
+
if s is None:
|
39
|
+
return None
|
40
|
+
s = resolve_ref(s)
|
41
|
+
|
42
|
+
if "anyOf" in s:
|
43
|
+
# Handle common pattern for nullable types (anyOf with string and null)
|
44
|
+
subtypes = [sub.get("type") for sub in s["anyOf"] if isinstance(sub, dict) and "type" in sub]
|
45
|
+
|
46
|
+
# Check if this is a simple nullable type (e.g., str | None)
|
47
|
+
if len(subtypes) == NULLABLE_TYPE_LENGTH and "null" in subtypes:
|
48
|
+
# Get the non-null type
|
49
|
+
non_null_type = next(t for t in subtypes if t != "null")
|
50
|
+
# Map it to Python type
|
51
|
+
if isinstance(non_null_type, str):
|
52
|
+
return {
|
53
|
+
"string": str,
|
54
|
+
"integer": int,
|
55
|
+
"number": float,
|
56
|
+
"boolean": bool,
|
57
|
+
"object": dict,
|
58
|
+
"array": list,
|
59
|
+
}.get(non_null_type, Any)
|
60
|
+
return Any
|
61
|
+
|
62
|
+
# For other anyOf cases, use the first non-null type
|
63
|
+
subtypes = [parse_type(sub) for sub in s["anyOf"]]
|
64
|
+
non_null_types = [t for t in subtypes if t is not None and t is not type(None)]
|
65
|
+
if non_null_types:
|
66
|
+
return non_null_types[0]
|
67
|
+
return str
|
68
|
+
|
69
|
+
t = s.get("type", "any") # Use string "any" as default instead of Any type
|
70
|
+
if t == "array":
|
71
|
+
item_schema = s.get("items", {})
|
72
|
+
schema_type: Any = parse_type(item_schema)
|
73
|
+
return list[schema_type]
|
74
|
+
|
75
|
+
if t == "object":
|
76
|
+
# inline object not in $defs ⇒ anonymous nested model
|
77
|
+
return _build_model(f"AnonModel{len(model_cache)}", s)
|
78
|
+
|
79
|
+
# primitive fallback
|
80
|
+
return {
|
81
|
+
"string": str,
|
82
|
+
"integer": int,
|
83
|
+
"number": float,
|
84
|
+
"boolean": bool,
|
85
|
+
"object": dict,
|
86
|
+
"array": list,
|
87
|
+
}.get(t, Any)
|
88
|
+
|
89
|
+
def _build_model(name: str, subschema: dict[str, Any]) -> type[BaseModel]:
|
90
|
+
"""Create (or fetch) a BaseModel subclass for the given object schema."""
|
91
|
+
# If this came via a named $ref, use that name
|
92
|
+
if "$ref" in subschema:
|
93
|
+
refname = subschema["$ref"].split("/")[-1]
|
94
|
+
if refname in model_cache:
|
95
|
+
return model_cache[refname]
|
96
|
+
target = defs.get(refname)
|
97
|
+
if not target:
|
98
|
+
msg = f"Definition '{refname}' not found"
|
99
|
+
raise ValueError(msg)
|
100
|
+
cls = _build_model(refname, target)
|
101
|
+
model_cache[refname] = cls
|
102
|
+
return cls
|
103
|
+
|
104
|
+
# Named anonymous or inline: avoid clashes by name
|
105
|
+
if name in model_cache:
|
106
|
+
return model_cache[name]
|
107
|
+
|
108
|
+
props = subschema.get("properties", {})
|
109
|
+
reqs = set(subschema.get("required", []))
|
110
|
+
fields: dict[str, Any] = {}
|
111
|
+
|
112
|
+
for prop_name, prop_schema in props.items():
|
113
|
+
py_type = parse_type(prop_schema)
|
114
|
+
is_required = prop_name in reqs
|
115
|
+
if not is_required:
|
116
|
+
py_type = py_type | None
|
117
|
+
default = prop_schema.get("default", None)
|
118
|
+
else:
|
119
|
+
default = ... # required by Pydantic
|
120
|
+
|
121
|
+
fields[prop_name] = (py_type, Field(default, description=prop_schema.get("description")))
|
122
|
+
|
123
|
+
model_cls = create_model(name, **fields)
|
124
|
+
model_cache[name] = model_cls
|
125
|
+
return model_cls
|
126
|
+
|
127
|
+
# build the top - level "InputSchema" from the root properties
|
128
|
+
top_props = schema.get("properties", {})
|
129
|
+
top_reqs = set(schema.get("required", []))
|
130
|
+
top_fields: dict[str, Any] = {}
|
131
|
+
|
132
|
+
for fname, fdef in top_props.items():
|
133
|
+
py_type = parse_type(fdef)
|
134
|
+
if fname not in top_reqs:
|
135
|
+
py_type = py_type | None
|
136
|
+
default = fdef.get("default", None)
|
137
|
+
else:
|
138
|
+
default = ...
|
139
|
+
top_fields[fname] = (py_type, Field(default, description=fdef.get("description")))
|
140
|
+
|
141
|
+
return create_model("InputSchema", **top_fields)
|
lfx/schema/log.py
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
"""Log schema and types for lfx package."""
|
2
|
+
|
3
|
+
from typing import Any, Literal, TypeAlias
|
4
|
+
|
5
|
+
from pydantic import BaseModel, field_serializer
|
6
|
+
from pydantic_core import PydanticSerializationError
|
7
|
+
from typing_extensions import Protocol
|
8
|
+
|
9
|
+
from lfx.schema.message import ContentBlock, Message
|
10
|
+
from lfx.serialization.serialization import serialize
|
11
|
+
|
12
|
+
# Simplified LoggableType without PlaygroundEvent dependency
|
13
|
+
LoggableType: TypeAlias = str | dict | list | int | float | bool | BaseModel | None
|
14
|
+
|
15
|
+
|
16
|
+
class LogFunctionType(Protocol):
|
17
|
+
"""Protocol for log function type."""
|
18
|
+
|
19
|
+
def __call__(self, message: LoggableType | list[LoggableType], *, name: str | None = None) -> None: ...
|
20
|
+
|
21
|
+
|
22
|
+
class SendMessageFunctionType(Protocol):
|
23
|
+
"""Protocol for send message function type."""
|
24
|
+
|
25
|
+
async def __call__(
|
26
|
+
self,
|
27
|
+
message: Message | None = None,
|
28
|
+
text: str | None = None,
|
29
|
+
background_color: str | None = None,
|
30
|
+
text_color: str | None = None,
|
31
|
+
icon: str | None = None,
|
32
|
+
content_blocks: list[ContentBlock] | None = None,
|
33
|
+
format_type: Literal["default", "error", "warning", "info"] = "default",
|
34
|
+
id_: str | None = None,
|
35
|
+
*,
|
36
|
+
allow_markdown: bool = True,
|
37
|
+
) -> Message: ...
|
38
|
+
|
39
|
+
|
40
|
+
class OnTokenFunctionType(Protocol):
|
41
|
+
"""Protocol for on token function type."""
|
42
|
+
|
43
|
+
def __call__(self, data: dict[str, Any]) -> None: ...
|
44
|
+
|
45
|
+
|
46
|
+
class Log(BaseModel):
|
47
|
+
"""Log model for storing log messages with serialization support."""
|
48
|
+
|
49
|
+
name: str
|
50
|
+
message: LoggableType
|
51
|
+
type: str
|
52
|
+
|
53
|
+
@field_serializer("message")
|
54
|
+
def serialize_message(self, value):
|
55
|
+
"""Serialize the message field with fallback error handling."""
|
56
|
+
try:
|
57
|
+
return serialize(value)
|
58
|
+
except UnicodeDecodeError:
|
59
|
+
return str(value) # Fallback to string representation
|
60
|
+
except PydanticSerializationError:
|
61
|
+
return str(value) # Fallback to string for Pydantic errors
|