lfx-nightly 0.1.11.dev0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- lfx/__init__.py +0 -0
- lfx/__main__.py +25 -0
- lfx/base/__init__.py +0 -0
- lfx/base/agents/__init__.py +0 -0
- lfx/base/agents/agent.py +268 -0
- lfx/base/agents/callback.py +130 -0
- lfx/base/agents/context.py +109 -0
- lfx/base/agents/crewai/__init__.py +0 -0
- lfx/base/agents/crewai/crew.py +231 -0
- lfx/base/agents/crewai/tasks.py +12 -0
- lfx/base/agents/default_prompts.py +23 -0
- lfx/base/agents/errors.py +15 -0
- lfx/base/agents/events.py +346 -0
- lfx/base/agents/utils.py +205 -0
- lfx/base/astra_assistants/__init__.py +0 -0
- lfx/base/astra_assistants/util.py +171 -0
- lfx/base/chains/__init__.py +0 -0
- lfx/base/chains/model.py +19 -0
- lfx/base/composio/__init__.py +0 -0
- lfx/base/composio/composio_base.py +1291 -0
- lfx/base/compressors/__init__.py +0 -0
- lfx/base/compressors/model.py +60 -0
- lfx/base/constants.py +46 -0
- lfx/base/curl/__init__.py +0 -0
- lfx/base/curl/parse.py +188 -0
- lfx/base/data/__init__.py +5 -0
- lfx/base/data/base_file.py +685 -0
- lfx/base/data/docling_utils.py +245 -0
- lfx/base/data/utils.py +198 -0
- lfx/base/document_transformers/__init__.py +0 -0
- lfx/base/document_transformers/model.py +43 -0
- lfx/base/embeddings/__init__.py +0 -0
- lfx/base/embeddings/aiml_embeddings.py +62 -0
- lfx/base/embeddings/model.py +26 -0
- lfx/base/flow_processing/__init__.py +0 -0
- lfx/base/flow_processing/utils.py +86 -0
- lfx/base/huggingface/__init__.py +0 -0
- lfx/base/huggingface/model_bridge.py +133 -0
- lfx/base/io/__init__.py +0 -0
- lfx/base/io/chat.py +20 -0
- lfx/base/io/text.py +22 -0
- lfx/base/langchain_utilities/__init__.py +0 -0
- lfx/base/langchain_utilities/model.py +35 -0
- lfx/base/langchain_utilities/spider_constants.py +1 -0
- lfx/base/langwatch/__init__.py +0 -0
- lfx/base/langwatch/utils.py +18 -0
- lfx/base/mcp/__init__.py +0 -0
- lfx/base/mcp/constants.py +2 -0
- lfx/base/mcp/util.py +1398 -0
- lfx/base/memory/__init__.py +0 -0
- lfx/base/memory/memory.py +49 -0
- lfx/base/memory/model.py +38 -0
- lfx/base/models/__init__.py +3 -0
- lfx/base/models/aiml_constants.py +51 -0
- lfx/base/models/anthropic_constants.py +47 -0
- lfx/base/models/aws_constants.py +151 -0
- lfx/base/models/chat_result.py +76 -0
- lfx/base/models/google_generative_ai_constants.py +70 -0
- lfx/base/models/groq_constants.py +134 -0
- lfx/base/models/model.py +375 -0
- lfx/base/models/model_input_constants.py +307 -0
- lfx/base/models/model_metadata.py +41 -0
- lfx/base/models/model_utils.py +8 -0
- lfx/base/models/novita_constants.py +35 -0
- lfx/base/models/ollama_constants.py +49 -0
- lfx/base/models/openai_constants.py +122 -0
- lfx/base/models/sambanova_constants.py +18 -0
- lfx/base/processing/__init__.py +0 -0
- lfx/base/prompts/__init__.py +0 -0
- lfx/base/prompts/api_utils.py +224 -0
- lfx/base/prompts/utils.py +61 -0
- lfx/base/textsplitters/__init__.py +0 -0
- lfx/base/textsplitters/model.py +28 -0
- lfx/base/tools/__init__.py +0 -0
- lfx/base/tools/base.py +26 -0
- lfx/base/tools/component_tool.py +325 -0
- lfx/base/tools/constants.py +49 -0
- lfx/base/tools/flow_tool.py +132 -0
- lfx/base/tools/run_flow.py +224 -0
- lfx/base/vectorstores/__init__.py +0 -0
- lfx/base/vectorstores/model.py +193 -0
- lfx/base/vectorstores/utils.py +22 -0
- lfx/base/vectorstores/vector_store_connection_decorator.py +52 -0
- lfx/cli/__init__.py +5 -0
- lfx/cli/commands.py +319 -0
- lfx/cli/common.py +650 -0
- lfx/cli/run.py +441 -0
- lfx/cli/script_loader.py +247 -0
- lfx/cli/serve_app.py +546 -0
- lfx/cli/validation.py +69 -0
- lfx/components/FAISS/__init__.py +34 -0
- lfx/components/FAISS/faiss.py +111 -0
- lfx/components/Notion/__init__.py +19 -0
- lfx/components/Notion/add_content_to_page.py +269 -0
- lfx/components/Notion/create_page.py +94 -0
- lfx/components/Notion/list_database_properties.py +68 -0
- lfx/components/Notion/list_pages.py +122 -0
- lfx/components/Notion/list_users.py +77 -0
- lfx/components/Notion/page_content_viewer.py +93 -0
- lfx/components/Notion/search.py +111 -0
- lfx/components/Notion/update_page_property.py +114 -0
- lfx/components/__init__.py +411 -0
- lfx/components/_importing.py +42 -0
- lfx/components/agentql/__init__.py +3 -0
- lfx/components/agentql/agentql_api.py +151 -0
- lfx/components/agents/__init__.py +34 -0
- lfx/components/agents/agent.py +558 -0
- lfx/components/agents/mcp_component.py +501 -0
- lfx/components/aiml/__init__.py +37 -0
- lfx/components/aiml/aiml.py +112 -0
- lfx/components/aiml/aiml_embeddings.py +37 -0
- lfx/components/amazon/__init__.py +36 -0
- lfx/components/amazon/amazon_bedrock_embedding.py +109 -0
- lfx/components/amazon/amazon_bedrock_model.py +124 -0
- lfx/components/amazon/s3_bucket_uploader.py +211 -0
- lfx/components/anthropic/__init__.py +34 -0
- lfx/components/anthropic/anthropic.py +187 -0
- lfx/components/apify/__init__.py +5 -0
- lfx/components/apify/apify_actor.py +325 -0
- lfx/components/arxiv/__init__.py +3 -0
- lfx/components/arxiv/arxiv.py +163 -0
- lfx/components/assemblyai/__init__.py +46 -0
- lfx/components/assemblyai/assemblyai_get_subtitles.py +83 -0
- lfx/components/assemblyai/assemblyai_lemur.py +183 -0
- lfx/components/assemblyai/assemblyai_list_transcripts.py +95 -0
- lfx/components/assemblyai/assemblyai_poll_transcript.py +72 -0
- lfx/components/assemblyai/assemblyai_start_transcript.py +188 -0
- lfx/components/azure/__init__.py +37 -0
- lfx/components/azure/azure_openai.py +95 -0
- lfx/components/azure/azure_openai_embeddings.py +83 -0
- lfx/components/baidu/__init__.py +32 -0
- lfx/components/baidu/baidu_qianfan_chat.py +113 -0
- lfx/components/bing/__init__.py +3 -0
- lfx/components/bing/bing_search_api.py +61 -0
- lfx/components/cassandra/__init__.py +40 -0
- lfx/components/cassandra/cassandra.py +264 -0
- lfx/components/cassandra/cassandra_chat.py +92 -0
- lfx/components/cassandra/cassandra_graph.py +238 -0
- lfx/components/chains/__init__.py +3 -0
- lfx/components/chroma/__init__.py +34 -0
- lfx/components/chroma/chroma.py +167 -0
- lfx/components/cleanlab/__init__.py +40 -0
- lfx/components/cleanlab/cleanlab_evaluator.py +155 -0
- lfx/components/cleanlab/cleanlab_rag_evaluator.py +254 -0
- lfx/components/cleanlab/cleanlab_remediator.py +131 -0
- lfx/components/clickhouse/__init__.py +34 -0
- lfx/components/clickhouse/clickhouse.py +135 -0
- lfx/components/cloudflare/__init__.py +32 -0
- lfx/components/cloudflare/cloudflare.py +81 -0
- lfx/components/cohere/__init__.py +40 -0
- lfx/components/cohere/cohere_embeddings.py +81 -0
- lfx/components/cohere/cohere_models.py +46 -0
- lfx/components/cohere/cohere_rerank.py +51 -0
- lfx/components/composio/__init__.py +74 -0
- lfx/components/composio/composio_api.py +268 -0
- lfx/components/composio/dropbox_compnent.py +11 -0
- lfx/components/composio/github_composio.py +11 -0
- lfx/components/composio/gmail_composio.py +38 -0
- lfx/components/composio/googlecalendar_composio.py +11 -0
- lfx/components/composio/googlemeet_composio.py +11 -0
- lfx/components/composio/googletasks_composio.py +8 -0
- lfx/components/composio/linear_composio.py +11 -0
- lfx/components/composio/outlook_composio.py +11 -0
- lfx/components/composio/reddit_composio.py +11 -0
- lfx/components/composio/slack_composio.py +582 -0
- lfx/components/composio/slackbot_composio.py +11 -0
- lfx/components/composio/supabase_composio.py +11 -0
- lfx/components/composio/todoist_composio.py +11 -0
- lfx/components/composio/youtube_composio.py +11 -0
- lfx/components/confluence/__init__.py +3 -0
- lfx/components/confluence/confluence.py +84 -0
- lfx/components/couchbase/__init__.py +34 -0
- lfx/components/couchbase/couchbase.py +102 -0
- lfx/components/crewai/__init__.py +49 -0
- lfx/components/crewai/crewai.py +107 -0
- lfx/components/crewai/hierarchical_crew.py +46 -0
- lfx/components/crewai/hierarchical_task.py +44 -0
- lfx/components/crewai/sequential_crew.py +52 -0
- lfx/components/crewai/sequential_task.py +73 -0
- lfx/components/crewai/sequential_task_agent.py +143 -0
- lfx/components/custom_component/__init__.py +34 -0
- lfx/components/custom_component/custom_component.py +31 -0
- lfx/components/data/__init__.py +64 -0
- lfx/components/data/api_request.py +544 -0
- lfx/components/data/csv_to_data.py +95 -0
- lfx/components/data/directory.py +113 -0
- lfx/components/data/file.py +577 -0
- lfx/components/data/json_to_data.py +98 -0
- lfx/components/data/news_search.py +164 -0
- lfx/components/data/rss.py +69 -0
- lfx/components/data/sql_executor.py +101 -0
- lfx/components/data/url.py +311 -0
- lfx/components/data/web_search.py +112 -0
- lfx/components/data/webhook.py +56 -0
- lfx/components/datastax/__init__.py +70 -0
- lfx/components/datastax/astra_assistant_manager.py +306 -0
- lfx/components/datastax/astra_db.py +75 -0
- lfx/components/datastax/astra_vectorize.py +124 -0
- lfx/components/datastax/astradb.py +1285 -0
- lfx/components/datastax/astradb_cql.py +314 -0
- lfx/components/datastax/astradb_graph.py +330 -0
- lfx/components/datastax/astradb_tool.py +414 -0
- lfx/components/datastax/astradb_vectorstore.py +1285 -0
- lfx/components/datastax/cassandra.py +92 -0
- lfx/components/datastax/create_assistant.py +58 -0
- lfx/components/datastax/create_thread.py +32 -0
- lfx/components/datastax/dotenv.py +35 -0
- lfx/components/datastax/get_assistant.py +37 -0
- lfx/components/datastax/getenvvar.py +30 -0
- lfx/components/datastax/graph_rag.py +141 -0
- lfx/components/datastax/hcd.py +314 -0
- lfx/components/datastax/list_assistants.py +25 -0
- lfx/components/datastax/run.py +89 -0
- lfx/components/deactivated/__init__.py +15 -0
- lfx/components/deactivated/amazon_kendra.py +66 -0
- lfx/components/deactivated/chat_litellm_model.py +158 -0
- lfx/components/deactivated/code_block_extractor.py +26 -0
- lfx/components/deactivated/documents_to_data.py +22 -0
- lfx/components/deactivated/embed.py +16 -0
- lfx/components/deactivated/extract_key_from_data.py +46 -0
- lfx/components/deactivated/json_document_builder.py +57 -0
- lfx/components/deactivated/list_flows.py +20 -0
- lfx/components/deactivated/mcp_sse.py +61 -0
- lfx/components/deactivated/mcp_stdio.py +62 -0
- lfx/components/deactivated/merge_data.py +93 -0
- lfx/components/deactivated/message.py +37 -0
- lfx/components/deactivated/metal.py +54 -0
- lfx/components/deactivated/multi_query.py +59 -0
- lfx/components/deactivated/retriever.py +43 -0
- lfx/components/deactivated/selective_passthrough.py +77 -0
- lfx/components/deactivated/should_run_next.py +40 -0
- lfx/components/deactivated/split_text.py +63 -0
- lfx/components/deactivated/store_message.py +24 -0
- lfx/components/deactivated/sub_flow.py +124 -0
- lfx/components/deactivated/vectara_self_query.py +76 -0
- lfx/components/deactivated/vector_store.py +24 -0
- lfx/components/deepseek/__init__.py +34 -0
- lfx/components/deepseek/deepseek.py +136 -0
- lfx/components/docling/__init__.py +43 -0
- lfx/components/docling/chunk_docling_document.py +186 -0
- lfx/components/docling/docling_inline.py +231 -0
- lfx/components/docling/docling_remote.py +193 -0
- lfx/components/docling/export_docling_document.py +117 -0
- lfx/components/documentloaders/__init__.py +3 -0
- lfx/components/duckduckgo/__init__.py +3 -0
- lfx/components/duckduckgo/duck_duck_go_search_run.py +92 -0
- lfx/components/elastic/__init__.py +37 -0
- lfx/components/elastic/elasticsearch.py +267 -0
- lfx/components/elastic/opensearch.py +243 -0
- lfx/components/embeddings/__init__.py +37 -0
- lfx/components/embeddings/similarity.py +76 -0
- lfx/components/embeddings/text_embedder.py +64 -0
- lfx/components/exa/__init__.py +3 -0
- lfx/components/exa/exa_search.py +68 -0
- lfx/components/firecrawl/__init__.py +43 -0
- lfx/components/firecrawl/firecrawl_crawl_api.py +88 -0
- lfx/components/firecrawl/firecrawl_extract_api.py +136 -0
- lfx/components/firecrawl/firecrawl_map_api.py +89 -0
- lfx/components/firecrawl/firecrawl_scrape_api.py +73 -0
- lfx/components/git/__init__.py +4 -0
- lfx/components/git/git.py +262 -0
- lfx/components/git/gitextractor.py +196 -0
- lfx/components/glean/__init__.py +3 -0
- lfx/components/glean/glean_search_api.py +173 -0
- lfx/components/google/__init__.py +17 -0
- lfx/components/google/gmail.py +192 -0
- lfx/components/google/google_bq_sql_executor.py +157 -0
- lfx/components/google/google_drive.py +92 -0
- lfx/components/google/google_drive_search.py +152 -0
- lfx/components/google/google_generative_ai.py +147 -0
- lfx/components/google/google_generative_ai_embeddings.py +141 -0
- lfx/components/google/google_oauth_token.py +89 -0
- lfx/components/google/google_search_api_core.py +68 -0
- lfx/components/google/google_serper_api_core.py +74 -0
- lfx/components/groq/__init__.py +34 -0
- lfx/components/groq/groq.py +136 -0
- lfx/components/helpers/__init__.py +52 -0
- lfx/components/helpers/calculator_core.py +89 -0
- lfx/components/helpers/create_list.py +40 -0
- lfx/components/helpers/current_date.py +42 -0
- lfx/components/helpers/id_generator.py +42 -0
- lfx/components/helpers/memory.py +251 -0
- lfx/components/helpers/output_parser.py +45 -0
- lfx/components/helpers/store_message.py +90 -0
- lfx/components/homeassistant/__init__.py +7 -0
- lfx/components/homeassistant/home_assistant_control.py +152 -0
- lfx/components/homeassistant/list_home_assistant_states.py +137 -0
- lfx/components/huggingface/__init__.py +37 -0
- lfx/components/huggingface/huggingface.py +197 -0
- lfx/components/huggingface/huggingface_inference_api.py +106 -0
- lfx/components/ibm/__init__.py +34 -0
- lfx/components/ibm/watsonx.py +203 -0
- lfx/components/ibm/watsonx_embeddings.py +135 -0
- lfx/components/icosacomputing/__init__.py +5 -0
- lfx/components/icosacomputing/combinatorial_reasoner.py +84 -0
- lfx/components/input_output/__init__.py +38 -0
- lfx/components/input_output/chat.py +120 -0
- lfx/components/input_output/chat_output.py +200 -0
- lfx/components/input_output/text.py +27 -0
- lfx/components/input_output/text_output.py +29 -0
- lfx/components/jigsawstack/__init__.py +23 -0
- lfx/components/jigsawstack/ai_scrape.py +126 -0
- lfx/components/jigsawstack/ai_web_search.py +136 -0
- lfx/components/jigsawstack/file_read.py +115 -0
- lfx/components/jigsawstack/file_upload.py +94 -0
- lfx/components/jigsawstack/image_generation.py +205 -0
- lfx/components/jigsawstack/nsfw.py +60 -0
- lfx/components/jigsawstack/object_detection.py +124 -0
- lfx/components/jigsawstack/sentiment.py +112 -0
- lfx/components/jigsawstack/text_to_sql.py +90 -0
- lfx/components/jigsawstack/text_translate.py +77 -0
- lfx/components/jigsawstack/vocr.py +107 -0
- lfx/components/langchain_utilities/__init__.py +109 -0
- lfx/components/langchain_utilities/character.py +53 -0
- lfx/components/langchain_utilities/conversation.py +59 -0
- lfx/components/langchain_utilities/csv_agent.py +107 -0
- lfx/components/langchain_utilities/fake_embeddings.py +26 -0
- lfx/components/langchain_utilities/html_link_extractor.py +35 -0
- lfx/components/langchain_utilities/json_agent.py +45 -0
- lfx/components/langchain_utilities/langchain_hub.py +126 -0
- lfx/components/langchain_utilities/language_recursive.py +49 -0
- lfx/components/langchain_utilities/language_semantic.py +138 -0
- lfx/components/langchain_utilities/llm_checker.py +39 -0
- lfx/components/langchain_utilities/llm_math.py +42 -0
- lfx/components/langchain_utilities/natural_language.py +61 -0
- lfx/components/langchain_utilities/openai_tools.py +53 -0
- lfx/components/langchain_utilities/openapi.py +48 -0
- lfx/components/langchain_utilities/recursive_character.py +60 -0
- lfx/components/langchain_utilities/retrieval_qa.py +83 -0
- lfx/components/langchain_utilities/runnable_executor.py +137 -0
- lfx/components/langchain_utilities/self_query.py +80 -0
- lfx/components/langchain_utilities/spider.py +142 -0
- lfx/components/langchain_utilities/sql.py +40 -0
- lfx/components/langchain_utilities/sql_database.py +35 -0
- lfx/components/langchain_utilities/sql_generator.py +78 -0
- lfx/components/langchain_utilities/tool_calling.py +59 -0
- lfx/components/langchain_utilities/vector_store_info.py +49 -0
- lfx/components/langchain_utilities/vector_store_router.py +33 -0
- lfx/components/langchain_utilities/xml_agent.py +71 -0
- lfx/components/langwatch/__init__.py +3 -0
- lfx/components/langwatch/langwatch.py +278 -0
- lfx/components/link_extractors/__init__.py +3 -0
- lfx/components/lmstudio/__init__.py +34 -0
- lfx/components/lmstudio/lmstudioembeddings.py +89 -0
- lfx/components/lmstudio/lmstudiomodel.py +129 -0
- lfx/components/logic/__init__.py +52 -0
- lfx/components/logic/conditional_router.py +171 -0
- lfx/components/logic/data_conditional_router.py +125 -0
- lfx/components/logic/flow_tool.py +110 -0
- lfx/components/logic/listen.py +29 -0
- lfx/components/logic/loop.py +125 -0
- lfx/components/logic/notify.py +88 -0
- lfx/components/logic/pass_message.py +35 -0
- lfx/components/logic/run_flow.py +71 -0
- lfx/components/logic/sub_flow.py +114 -0
- lfx/components/maritalk/__init__.py +32 -0
- lfx/components/maritalk/maritalk.py +52 -0
- lfx/components/mem0/__init__.py +3 -0
- lfx/components/mem0/mem0_chat_memory.py +136 -0
- lfx/components/milvus/__init__.py +34 -0
- lfx/components/milvus/milvus.py +115 -0
- lfx/components/mistral/__init__.py +37 -0
- lfx/components/mistral/mistral.py +114 -0
- lfx/components/mistral/mistral_embeddings.py +58 -0
- lfx/components/models/__init__.py +34 -0
- lfx/components/models/embedding_model.py +114 -0
- lfx/components/models/language_model.py +144 -0
- lfx/components/mongodb/__init__.py +34 -0
- lfx/components/mongodb/mongodb_atlas.py +213 -0
- lfx/components/needle/__init__.py +3 -0
- lfx/components/needle/needle.py +104 -0
- lfx/components/notdiamond/__init__.py +34 -0
- lfx/components/notdiamond/notdiamond.py +228 -0
- lfx/components/novita/__init__.py +32 -0
- lfx/components/novita/novita.py +130 -0
- lfx/components/nvidia/__init__.py +57 -0
- lfx/components/nvidia/nvidia.py +157 -0
- lfx/components/nvidia/nvidia_embedding.py +77 -0
- lfx/components/nvidia/nvidia_ingest.py +317 -0
- lfx/components/nvidia/nvidia_rerank.py +63 -0
- lfx/components/nvidia/system_assist.py +65 -0
- lfx/components/olivya/__init__.py +3 -0
- lfx/components/olivya/olivya.py +116 -0
- lfx/components/ollama/__init__.py +37 -0
- lfx/components/ollama/ollama.py +330 -0
- lfx/components/ollama/ollama_embeddings.py +106 -0
- lfx/components/openai/__init__.py +37 -0
- lfx/components/openai/openai.py +100 -0
- lfx/components/openai/openai_chat_model.py +176 -0
- lfx/components/openrouter/__init__.py +32 -0
- lfx/components/openrouter/openrouter.py +202 -0
- lfx/components/output_parsers/__init__.py +3 -0
- lfx/components/perplexity/__init__.py +34 -0
- lfx/components/perplexity/perplexity.py +75 -0
- lfx/components/pgvector/__init__.py +34 -0
- lfx/components/pgvector/pgvector.py +72 -0
- lfx/components/pinecone/__init__.py +34 -0
- lfx/components/pinecone/pinecone.py +134 -0
- lfx/components/processing/__init__.py +117 -0
- lfx/components/processing/alter_metadata.py +108 -0
- lfx/components/processing/batch_run.py +205 -0
- lfx/components/processing/combine_text.py +39 -0
- lfx/components/processing/converter.py +159 -0
- lfx/components/processing/create_data.py +110 -0
- lfx/components/processing/data_operations.py +438 -0
- lfx/components/processing/data_to_dataframe.py +70 -0
- lfx/components/processing/dataframe_operations.py +313 -0
- lfx/components/processing/extract_key.py +53 -0
- lfx/components/processing/filter_data.py +42 -0
- lfx/components/processing/filter_data_values.py +88 -0
- lfx/components/processing/json_cleaner.py +103 -0
- lfx/components/processing/lambda_filter.py +154 -0
- lfx/components/processing/llm_router.py +499 -0
- lfx/components/processing/merge_data.py +90 -0
- lfx/components/processing/message_to_data.py +36 -0
- lfx/components/processing/parse_data.py +70 -0
- lfx/components/processing/parse_dataframe.py +68 -0
- lfx/components/processing/parse_json_data.py +90 -0
- lfx/components/processing/parser.py +143 -0
- lfx/components/processing/prompt.py +67 -0
- lfx/components/processing/python_repl_core.py +98 -0
- lfx/components/processing/regex.py +82 -0
- lfx/components/processing/save_file.py +225 -0
- lfx/components/processing/select_data.py +48 -0
- lfx/components/processing/split_text.py +141 -0
- lfx/components/processing/structured_output.py +202 -0
- lfx/components/processing/update_data.py +160 -0
- lfx/components/prototypes/__init__.py +34 -0
- lfx/components/prototypes/python_function.py +73 -0
- lfx/components/qdrant/__init__.py +34 -0
- lfx/components/qdrant/qdrant.py +109 -0
- lfx/components/redis/__init__.py +37 -0
- lfx/components/redis/redis.py +89 -0
- lfx/components/redis/redis_chat.py +43 -0
- lfx/components/sambanova/__init__.py +32 -0
- lfx/components/sambanova/sambanova.py +84 -0
- lfx/components/scrapegraph/__init__.py +40 -0
- lfx/components/scrapegraph/scrapegraph_markdownify_api.py +64 -0
- lfx/components/scrapegraph/scrapegraph_search_api.py +64 -0
- lfx/components/scrapegraph/scrapegraph_smart_scraper_api.py +71 -0
- lfx/components/searchapi/__init__.py +34 -0
- lfx/components/searchapi/search.py +79 -0
- lfx/components/serpapi/__init__.py +3 -0
- lfx/components/serpapi/serp.py +115 -0
- lfx/components/supabase/__init__.py +34 -0
- lfx/components/supabase/supabase.py +76 -0
- lfx/components/tavily/__init__.py +4 -0
- lfx/components/tavily/tavily_extract.py +117 -0
- lfx/components/tavily/tavily_search.py +212 -0
- lfx/components/textsplitters/__init__.py +3 -0
- lfx/components/toolkits/__init__.py +3 -0
- lfx/components/tools/__init__.py +72 -0
- lfx/components/tools/calculator.py +108 -0
- lfx/components/tools/google_search_api.py +45 -0
- lfx/components/tools/google_serper_api.py +115 -0
- lfx/components/tools/python_code_structured_tool.py +327 -0
- lfx/components/tools/python_repl.py +97 -0
- lfx/components/tools/search_api.py +87 -0
- lfx/components/tools/searxng.py +145 -0
- lfx/components/tools/serp_api.py +119 -0
- lfx/components/tools/tavily_search_tool.py +344 -0
- lfx/components/tools/wikidata_api.py +102 -0
- lfx/components/tools/wikipedia_api.py +49 -0
- lfx/components/tools/yahoo_finance.py +129 -0
- lfx/components/twelvelabs/__init__.py +52 -0
- lfx/components/twelvelabs/convert_astra_results.py +84 -0
- lfx/components/twelvelabs/pegasus_index.py +311 -0
- lfx/components/twelvelabs/split_video.py +291 -0
- lfx/components/twelvelabs/text_embeddings.py +57 -0
- lfx/components/twelvelabs/twelvelabs_pegasus.py +408 -0
- lfx/components/twelvelabs/video_embeddings.py +100 -0
- lfx/components/twelvelabs/video_file.py +179 -0
- lfx/components/unstructured/__init__.py +3 -0
- lfx/components/unstructured/unstructured.py +121 -0
- lfx/components/upstash/__init__.py +34 -0
- lfx/components/upstash/upstash.py +124 -0
- lfx/components/vectara/__init__.py +37 -0
- lfx/components/vectara/vectara.py +97 -0
- lfx/components/vectara/vectara_rag.py +164 -0
- lfx/components/vectorstores/__init__.py +40 -0
- lfx/components/vectorstores/astradb.py +1285 -0
- lfx/components/vectorstores/astradb_graph.py +319 -0
- lfx/components/vectorstores/cassandra.py +264 -0
- lfx/components/vectorstores/cassandra_graph.py +238 -0
- lfx/components/vectorstores/chroma.py +167 -0
- lfx/components/vectorstores/clickhouse.py +135 -0
- lfx/components/vectorstores/couchbase.py +102 -0
- lfx/components/vectorstores/elasticsearch.py +267 -0
- lfx/components/vectorstores/faiss.py +111 -0
- lfx/components/vectorstores/graph_rag.py +141 -0
- lfx/components/vectorstores/hcd.py +314 -0
- lfx/components/vectorstores/local_db.py +261 -0
- lfx/components/vectorstores/milvus.py +115 -0
- lfx/components/vectorstores/mongodb_atlas.py +213 -0
- lfx/components/vectorstores/opensearch.py +243 -0
- lfx/components/vectorstores/pgvector.py +72 -0
- lfx/components/vectorstores/pinecone.py +134 -0
- lfx/components/vectorstores/qdrant.py +109 -0
- lfx/components/vectorstores/supabase.py +76 -0
- lfx/components/vectorstores/upstash.py +124 -0
- lfx/components/vectorstores/vectara.py +97 -0
- lfx/components/vectorstores/vectara_rag.py +164 -0
- lfx/components/vectorstores/weaviate.py +89 -0
- lfx/components/vertexai/__init__.py +37 -0
- lfx/components/vertexai/vertexai.py +71 -0
- lfx/components/vertexai/vertexai_embeddings.py +67 -0
- lfx/components/weaviate/__init__.py +34 -0
- lfx/components/weaviate/weaviate.py +89 -0
- lfx/components/wikipedia/__init__.py +4 -0
- lfx/components/wikipedia/wikidata.py +86 -0
- lfx/components/wikipedia/wikipedia.py +53 -0
- lfx/components/wolframalpha/__init__.py +3 -0
- lfx/components/wolframalpha/wolfram_alpha_api.py +54 -0
- lfx/components/xai/__init__.py +32 -0
- lfx/components/xai/xai.py +167 -0
- lfx/components/yahoosearch/__init__.py +3 -0
- lfx/components/yahoosearch/yahoo.py +137 -0
- lfx/components/youtube/__init__.py +52 -0
- lfx/components/youtube/channel.py +227 -0
- lfx/components/youtube/comments.py +231 -0
- lfx/components/youtube/playlist.py +33 -0
- lfx/components/youtube/search.py +120 -0
- lfx/components/youtube/trending.py +285 -0
- lfx/components/youtube/video_details.py +263 -0
- lfx/components/youtube/youtube_transcripts.py +118 -0
- lfx/components/zep/__init__.py +3 -0
- lfx/components/zep/zep.py +44 -0
- lfx/constants.py +6 -0
- lfx/custom/__init__.py +7 -0
- lfx/custom/attributes.py +86 -0
- lfx/custom/code_parser/__init__.py +3 -0
- lfx/custom/code_parser/code_parser.py +361 -0
- lfx/custom/custom_component/__init__.py +0 -0
- lfx/custom/custom_component/base_component.py +128 -0
- lfx/custom/custom_component/component.py +1808 -0
- lfx/custom/custom_component/component_with_cache.py +8 -0
- lfx/custom/custom_component/custom_component.py +588 -0
- lfx/custom/dependency_analyzer.py +165 -0
- lfx/custom/directory_reader/__init__.py +3 -0
- lfx/custom/directory_reader/directory_reader.py +359 -0
- lfx/custom/directory_reader/utils.py +171 -0
- lfx/custom/eval.py +12 -0
- lfx/custom/schema.py +32 -0
- lfx/custom/tree_visitor.py +21 -0
- lfx/custom/utils.py +877 -0
- lfx/custom/validate.py +488 -0
- lfx/events/__init__.py +1 -0
- lfx/events/event_manager.py +110 -0
- lfx/exceptions/__init__.py +0 -0
- lfx/exceptions/component.py +15 -0
- lfx/field_typing/__init__.py +91 -0
- lfx/field_typing/constants.py +215 -0
- lfx/field_typing/range_spec.py +35 -0
- lfx/graph/__init__.py +6 -0
- lfx/graph/edge/__init__.py +0 -0
- lfx/graph/edge/base.py +277 -0
- lfx/graph/edge/schema.py +119 -0
- lfx/graph/edge/utils.py +0 -0
- lfx/graph/graph/__init__.py +0 -0
- lfx/graph/graph/ascii.py +202 -0
- lfx/graph/graph/base.py +2238 -0
- lfx/graph/graph/constants.py +63 -0
- lfx/graph/graph/runnable_vertices_manager.py +133 -0
- lfx/graph/graph/schema.py +52 -0
- lfx/graph/graph/state_model.py +66 -0
- lfx/graph/graph/utils.py +1024 -0
- lfx/graph/schema.py +75 -0
- lfx/graph/state/__init__.py +0 -0
- lfx/graph/state/model.py +237 -0
- lfx/graph/utils.py +200 -0
- lfx/graph/vertex/__init__.py +0 -0
- lfx/graph/vertex/base.py +823 -0
- lfx/graph/vertex/constants.py +0 -0
- lfx/graph/vertex/exceptions.py +4 -0
- lfx/graph/vertex/param_handler.py +264 -0
- lfx/graph/vertex/schema.py +26 -0
- lfx/graph/vertex/utils.py +19 -0
- lfx/graph/vertex/vertex_types.py +489 -0
- lfx/helpers/__init__.py +1 -0
- lfx/helpers/base_model.py +71 -0
- lfx/helpers/custom.py +13 -0
- lfx/helpers/data.py +167 -0
- lfx/helpers/flow.py +194 -0
- lfx/inputs/__init__.py +68 -0
- lfx/inputs/constants.py +2 -0
- lfx/inputs/input_mixin.py +328 -0
- lfx/inputs/inputs.py +714 -0
- lfx/inputs/validators.py +19 -0
- lfx/interface/__init__.py +6 -0
- lfx/interface/components.py +489 -0
- lfx/interface/importing/__init__.py +5 -0
- lfx/interface/importing/utils.py +39 -0
- lfx/interface/initialize/__init__.py +3 -0
- lfx/interface/initialize/loading.py +224 -0
- lfx/interface/listing.py +26 -0
- lfx/interface/run.py +16 -0
- lfx/interface/utils.py +111 -0
- lfx/io/__init__.py +63 -0
- lfx/io/schema.py +289 -0
- lfx/load/__init__.py +8 -0
- lfx/load/load.py +256 -0
- lfx/load/utils.py +99 -0
- lfx/log/__init__.py +5 -0
- lfx/log/logger.py +385 -0
- lfx/memory/__init__.py +90 -0
- lfx/memory/stubs.py +283 -0
- lfx/processing/__init__.py +1 -0
- lfx/processing/process.py +238 -0
- lfx/processing/utils.py +25 -0
- lfx/py.typed +0 -0
- lfx/schema/__init__.py +66 -0
- lfx/schema/artifact.py +83 -0
- lfx/schema/content_block.py +62 -0
- lfx/schema/content_types.py +91 -0
- lfx/schema/data.py +308 -0
- lfx/schema/dataframe.py +210 -0
- lfx/schema/dotdict.py +74 -0
- lfx/schema/encoders.py +13 -0
- lfx/schema/graph.py +47 -0
- lfx/schema/image.py +131 -0
- lfx/schema/json_schema.py +141 -0
- lfx/schema/log.py +61 -0
- lfx/schema/message.py +473 -0
- lfx/schema/openai_responses_schemas.py +74 -0
- lfx/schema/properties.py +41 -0
- lfx/schema/schema.py +171 -0
- lfx/schema/serialize.py +13 -0
- lfx/schema/table.py +140 -0
- lfx/schema/validators.py +114 -0
- lfx/serialization/__init__.py +5 -0
- lfx/serialization/constants.py +2 -0
- lfx/serialization/serialization.py +314 -0
- lfx/services/__init__.py +23 -0
- lfx/services/base.py +28 -0
- lfx/services/cache/__init__.py +6 -0
- lfx/services/cache/base.py +183 -0
- lfx/services/cache/service.py +166 -0
- lfx/services/cache/utils.py +169 -0
- lfx/services/chat/__init__.py +1 -0
- lfx/services/chat/config.py +2 -0
- lfx/services/chat/schema.py +10 -0
- lfx/services/deps.py +129 -0
- lfx/services/factory.py +19 -0
- lfx/services/initialize.py +19 -0
- lfx/services/interfaces.py +103 -0
- lfx/services/manager.py +172 -0
- lfx/services/schema.py +20 -0
- lfx/services/session.py +82 -0
- lfx/services/settings/__init__.py +3 -0
- lfx/services/settings/auth.py +130 -0
- lfx/services/settings/base.py +539 -0
- lfx/services/settings/constants.py +31 -0
- lfx/services/settings/factory.py +23 -0
- lfx/services/settings/feature_flags.py +12 -0
- lfx/services/settings/service.py +35 -0
- lfx/services/settings/utils.py +40 -0
- lfx/services/shared_component_cache/__init__.py +1 -0
- lfx/services/shared_component_cache/factory.py +30 -0
- lfx/services/shared_component_cache/service.py +9 -0
- lfx/services/storage/__init__.py +5 -0
- lfx/services/storage/local.py +155 -0
- lfx/services/storage/service.py +54 -0
- lfx/services/tracing/__init__.py +1 -0
- lfx/services/tracing/service.py +21 -0
- lfx/settings.py +6 -0
- lfx/template/__init__.py +6 -0
- lfx/template/field/__init__.py +0 -0
- lfx/template/field/base.py +257 -0
- lfx/template/field/prompt.py +15 -0
- lfx/template/frontend_node/__init__.py +6 -0
- lfx/template/frontend_node/base.py +212 -0
- lfx/template/frontend_node/constants.py +65 -0
- lfx/template/frontend_node/custom_components.py +79 -0
- lfx/template/template/__init__.py +0 -0
- lfx/template/template/base.py +100 -0
- lfx/template/utils.py +217 -0
- lfx/type_extraction/__init__.py +19 -0
- lfx/type_extraction/type_extraction.py +75 -0
- lfx/type_extraction.py +80 -0
- lfx/utils/__init__.py +1 -0
- lfx/utils/async_helpers.py +42 -0
- lfx/utils/component_utils.py +154 -0
- lfx/utils/concurrency.py +60 -0
- lfx/utils/connection_string_parser.py +11 -0
- lfx/utils/constants.py +205 -0
- lfx/utils/data_structure.py +212 -0
- lfx/utils/exceptions.py +22 -0
- lfx/utils/helpers.py +28 -0
- lfx/utils/image.py +73 -0
- lfx/utils/lazy_load.py +15 -0
- lfx/utils/request_utils.py +18 -0
- lfx/utils/schemas.py +139 -0
- lfx/utils/util.py +481 -0
- lfx/utils/util_strings.py +56 -0
- lfx/utils/version.py +24 -0
- lfx_nightly-0.1.11.dev0.dist-info/METADATA +293 -0
- lfx_nightly-0.1.11.dev0.dist-info/RECORD +699 -0
- lfx_nightly-0.1.11.dev0.dist-info/WHEEL +4 -0
- lfx_nightly-0.1.11.dev0.dist-info/entry_points.txt +2 -0
@@ -0,0 +1,176 @@
|
|
1
|
+
from typing import Any
|
2
|
+
|
3
|
+
from langchain_openai import ChatOpenAI
|
4
|
+
from pydantic.v1 import SecretStr
|
5
|
+
|
6
|
+
from lfx.base.models.model import LCModelComponent
|
7
|
+
from lfx.base.models.openai_constants import OPENAI_CHAT_MODEL_NAMES, OPENAI_REASONING_MODEL_NAMES
|
8
|
+
from lfx.field_typing import LanguageModel
|
9
|
+
from lfx.field_typing.range_spec import RangeSpec
|
10
|
+
from lfx.inputs.inputs import BoolInput, DictInput, DropdownInput, IntInput, SecretStrInput, SliderInput, StrInput
|
11
|
+
from lfx.log.logger import logger
|
12
|
+
|
13
|
+
|
14
|
+
class OpenAIModelComponent(LCModelComponent):
|
15
|
+
display_name = "OpenAI"
|
16
|
+
description = "Generates text using OpenAI LLMs."
|
17
|
+
icon = "OpenAI"
|
18
|
+
name = "OpenAIModel"
|
19
|
+
|
20
|
+
inputs = [
|
21
|
+
*LCModelComponent.get_base_inputs(),
|
22
|
+
IntInput(
|
23
|
+
name="max_tokens",
|
24
|
+
display_name="Max Tokens",
|
25
|
+
advanced=True,
|
26
|
+
info="The maximum number of tokens to generate. Set to 0 for unlimited tokens.",
|
27
|
+
range_spec=RangeSpec(min=0, max=128000),
|
28
|
+
),
|
29
|
+
DictInput(
|
30
|
+
name="model_kwargs",
|
31
|
+
display_name="Model Kwargs",
|
32
|
+
advanced=True,
|
33
|
+
info="Additional keyword arguments to pass to the model.",
|
34
|
+
),
|
35
|
+
BoolInput(
|
36
|
+
name="json_mode",
|
37
|
+
display_name="JSON Mode",
|
38
|
+
advanced=True,
|
39
|
+
info="If True, it will output JSON regardless of passing a schema.",
|
40
|
+
),
|
41
|
+
DropdownInput(
|
42
|
+
name="model_name",
|
43
|
+
display_name="Model Name",
|
44
|
+
advanced=False,
|
45
|
+
options=OPENAI_CHAT_MODEL_NAMES + OPENAI_REASONING_MODEL_NAMES,
|
46
|
+
value=OPENAI_CHAT_MODEL_NAMES[0],
|
47
|
+
combobox=True,
|
48
|
+
real_time_refresh=True,
|
49
|
+
),
|
50
|
+
StrInput(
|
51
|
+
name="openai_api_base",
|
52
|
+
display_name="OpenAI API Base",
|
53
|
+
advanced=True,
|
54
|
+
info="The base URL of the OpenAI API. "
|
55
|
+
"Defaults to https://api.openai.com/v1. "
|
56
|
+
"You can change this to use other APIs like JinaChat, LocalAI and Prem.",
|
57
|
+
),
|
58
|
+
SecretStrInput(
|
59
|
+
name="api_key",
|
60
|
+
display_name="OpenAI API Key",
|
61
|
+
info="The OpenAI API Key to use for the OpenAI model.",
|
62
|
+
advanced=False,
|
63
|
+
value="OPENAI_API_KEY",
|
64
|
+
required=True,
|
65
|
+
),
|
66
|
+
SliderInput(
|
67
|
+
name="temperature",
|
68
|
+
display_name="Temperature",
|
69
|
+
value=0.1,
|
70
|
+
range_spec=RangeSpec(min=0, max=1, step=0.01),
|
71
|
+
show=True,
|
72
|
+
),
|
73
|
+
IntInput(
|
74
|
+
name="seed",
|
75
|
+
display_name="Seed",
|
76
|
+
info="The seed controls the reproducibility of the job.",
|
77
|
+
advanced=True,
|
78
|
+
value=1,
|
79
|
+
),
|
80
|
+
IntInput(
|
81
|
+
name="max_retries",
|
82
|
+
display_name="Max Retries",
|
83
|
+
info="The maximum number of retries to make when generating.",
|
84
|
+
advanced=True,
|
85
|
+
value=5,
|
86
|
+
),
|
87
|
+
IntInput(
|
88
|
+
name="timeout",
|
89
|
+
display_name="Timeout",
|
90
|
+
info="The timeout for requests to OpenAI completion API.",
|
91
|
+
advanced=True,
|
92
|
+
value=700,
|
93
|
+
),
|
94
|
+
]
|
95
|
+
|
96
|
+
def build_model(self) -> LanguageModel: # type: ignore[type-var]
|
97
|
+
logger.debug(f"Executing request with model: {self.model_name}")
|
98
|
+
# Handle api_key - it can be string or SecretStr
|
99
|
+
api_key_value = None
|
100
|
+
if self.api_key:
|
101
|
+
logger.debug(f"API key type: {type(self.api_key)}, value: {self.api_key!r}")
|
102
|
+
if isinstance(self.api_key, SecretStr):
|
103
|
+
api_key_value = self.api_key.get_secret_value()
|
104
|
+
else:
|
105
|
+
api_key_value = str(self.api_key)
|
106
|
+
logger.debug(f"Final api_key_value type: {type(api_key_value)}, value: {'***' if api_key_value else None}")
|
107
|
+
|
108
|
+
# Handle model_kwargs and ensure api_key doesn't conflict
|
109
|
+
model_kwargs = self.model_kwargs or {}
|
110
|
+
# Remove api_key from model_kwargs if it exists to prevent conflicts
|
111
|
+
if "api_key" in model_kwargs:
|
112
|
+
logger.warning("api_key found in model_kwargs, removing to prevent conflicts")
|
113
|
+
model_kwargs = dict(model_kwargs) # Make a copy
|
114
|
+
del model_kwargs["api_key"]
|
115
|
+
|
116
|
+
parameters = {
|
117
|
+
"api_key": api_key_value,
|
118
|
+
"model_name": self.model_name,
|
119
|
+
"max_tokens": self.max_tokens or None,
|
120
|
+
"model_kwargs": model_kwargs,
|
121
|
+
"base_url": self.openai_api_base or "https://api.openai.com/v1",
|
122
|
+
"max_retries": self.max_retries,
|
123
|
+
"timeout": self.timeout,
|
124
|
+
}
|
125
|
+
|
126
|
+
# TODO: Revisit if/once parameters are supported for reasoning models
|
127
|
+
unsupported_params_for_reasoning_models = ["temperature", "seed"]
|
128
|
+
|
129
|
+
if self.model_name not in OPENAI_REASONING_MODEL_NAMES:
|
130
|
+
parameters["temperature"] = self.temperature if self.temperature is not None else 0.1
|
131
|
+
parameters["seed"] = self.seed
|
132
|
+
else:
|
133
|
+
params_str = ", ".join(unsupported_params_for_reasoning_models)
|
134
|
+
logger.debug(f"{self.model_name} is a reasoning model, {params_str} are not configurable. Ignoring.")
|
135
|
+
|
136
|
+
# Ensure all parameter values are the correct types
|
137
|
+
if isinstance(parameters.get("api_key"), SecretStr):
|
138
|
+
parameters["api_key"] = parameters["api_key"].get_secret_value()
|
139
|
+
output = ChatOpenAI(**parameters)
|
140
|
+
if self.json_mode:
|
141
|
+
output = output.bind(response_format={"type": "json_object"})
|
142
|
+
|
143
|
+
return output
|
144
|
+
|
145
|
+
def _get_exception_message(self, e: Exception):
|
146
|
+
"""Get a message from an OpenAI exception.
|
147
|
+
|
148
|
+
Args:
|
149
|
+
e (Exception): The exception to get the message from.
|
150
|
+
|
151
|
+
Returns:
|
152
|
+
str: The message from the exception.
|
153
|
+
"""
|
154
|
+
try:
|
155
|
+
from openai import BadRequestError
|
156
|
+
except ImportError:
|
157
|
+
return None
|
158
|
+
if isinstance(e, BadRequestError):
|
159
|
+
message = e.body.get("message")
|
160
|
+
if message:
|
161
|
+
return message
|
162
|
+
return None
|
163
|
+
|
164
|
+
def update_build_config(self, build_config: dict, field_value: Any, field_name: str | None = None) -> dict:
|
165
|
+
if field_name in {"base_url", "model_name", "api_key"} and field_value in OPENAI_REASONING_MODEL_NAMES:
|
166
|
+
build_config["temperature"]["show"] = False
|
167
|
+
build_config["seed"]["show"] = False
|
168
|
+
# Hide system_message for o1 models - currently unsupported
|
169
|
+
if field_value.startswith("o1") and "system_message" in build_config:
|
170
|
+
build_config["system_message"]["show"] = False
|
171
|
+
if field_name in {"base_url", "model_name", "api_key"} and field_value in OPENAI_CHAT_MODEL_NAMES:
|
172
|
+
build_config["temperature"]["show"] = True
|
173
|
+
build_config["seed"]["show"] = True
|
174
|
+
if "system_message" in build_config:
|
175
|
+
build_config["system_message"]["show"] = True
|
176
|
+
return build_config
|
@@ -0,0 +1,32 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
from typing import TYPE_CHECKING, Any
|
4
|
+
|
5
|
+
from lfx.components._importing import import_mod
|
6
|
+
|
7
|
+
if TYPE_CHECKING:
|
8
|
+
from lfx.components.openrouter.openrouter import OpenRouterComponent
|
9
|
+
|
10
|
+
_dynamic_imports = {
|
11
|
+
"OpenRouterComponent": "openrouter",
|
12
|
+
}
|
13
|
+
|
14
|
+
__all__ = ["OpenRouterComponent"]
|
15
|
+
|
16
|
+
|
17
|
+
def __getattr__(attr_name: str) -> Any:
|
18
|
+
"""Lazily import openrouter components on attribute access."""
|
19
|
+
if attr_name not in _dynamic_imports:
|
20
|
+
msg = f"module '{__name__}' has no attribute '{attr_name}'"
|
21
|
+
raise AttributeError(msg)
|
22
|
+
try:
|
23
|
+
result = import_mod(attr_name, _dynamic_imports[attr_name], __spec__.parent)
|
24
|
+
except (ModuleNotFoundError, ImportError, AttributeError) as e:
|
25
|
+
msg = f"Could not import '{attr_name}' from '{__name__}': {e}"
|
26
|
+
raise AttributeError(msg) from e
|
27
|
+
globals()[attr_name] = result
|
28
|
+
return result
|
29
|
+
|
30
|
+
|
31
|
+
def __dir__() -> list[str]:
|
32
|
+
return list(__all__)
|
@@ -0,0 +1,202 @@
|
|
1
|
+
from collections import defaultdict
|
2
|
+
from typing import Any
|
3
|
+
|
4
|
+
import httpx
|
5
|
+
from langchain_openai import ChatOpenAI
|
6
|
+
from pydantic.v1 import SecretStr
|
7
|
+
|
8
|
+
from lfx.base.models.model import LCModelComponent
|
9
|
+
from lfx.field_typing import LanguageModel
|
10
|
+
from lfx.field_typing.range_spec import RangeSpec
|
11
|
+
from lfx.inputs.inputs import (
|
12
|
+
DropdownInput,
|
13
|
+
IntInput,
|
14
|
+
SecretStrInput,
|
15
|
+
SliderInput,
|
16
|
+
StrInput,
|
17
|
+
)
|
18
|
+
|
19
|
+
|
20
|
+
class OpenRouterComponent(LCModelComponent):
|
21
|
+
"""OpenRouter API component for language models."""
|
22
|
+
|
23
|
+
display_name = "OpenRouter"
|
24
|
+
description = (
|
25
|
+
"OpenRouter provides unified access to multiple AI models from different providers through a single API."
|
26
|
+
)
|
27
|
+
icon = "OpenRouter"
|
28
|
+
|
29
|
+
inputs = [
|
30
|
+
*LCModelComponent.get_base_inputs(),
|
31
|
+
SecretStrInput(
|
32
|
+
name="api_key", display_name="OpenRouter API Key", required=True, info="Your OpenRouter API key"
|
33
|
+
),
|
34
|
+
StrInput(
|
35
|
+
name="site_url",
|
36
|
+
display_name="Site URL",
|
37
|
+
info="Your site URL for OpenRouter rankings",
|
38
|
+
advanced=True,
|
39
|
+
),
|
40
|
+
StrInput(
|
41
|
+
name="app_name",
|
42
|
+
display_name="App Name",
|
43
|
+
info="Your app name for OpenRouter rankings",
|
44
|
+
advanced=True,
|
45
|
+
),
|
46
|
+
DropdownInput(
|
47
|
+
name="provider",
|
48
|
+
display_name="Provider",
|
49
|
+
info="The AI model provider",
|
50
|
+
options=["Loading providers..."],
|
51
|
+
value="Loading providers...",
|
52
|
+
real_time_refresh=True,
|
53
|
+
required=True,
|
54
|
+
),
|
55
|
+
DropdownInput(
|
56
|
+
name="model_name",
|
57
|
+
display_name="Model",
|
58
|
+
info="The model to use for chat completion",
|
59
|
+
options=["Select a provider first"],
|
60
|
+
value="Select a provider first",
|
61
|
+
real_time_refresh=True,
|
62
|
+
required=True,
|
63
|
+
),
|
64
|
+
SliderInput(
|
65
|
+
name="temperature",
|
66
|
+
display_name="Temperature",
|
67
|
+
value=0.7,
|
68
|
+
range_spec=RangeSpec(min=0, max=2, step=0.01),
|
69
|
+
info="Controls randomness. Lower values are more deterministic, higher values are more creative.",
|
70
|
+
advanced=True,
|
71
|
+
),
|
72
|
+
IntInput(
|
73
|
+
name="max_tokens",
|
74
|
+
display_name="Max Tokens",
|
75
|
+
info="Maximum number of tokens to generate",
|
76
|
+
advanced=True,
|
77
|
+
),
|
78
|
+
]
|
79
|
+
|
80
|
+
def fetch_models(self) -> dict[str, list]:
|
81
|
+
"""Fetch available models from OpenRouter API and organize them by provider."""
|
82
|
+
url = "https://openrouter.ai/api/v1/models"
|
83
|
+
|
84
|
+
try:
|
85
|
+
with httpx.Client() as client:
|
86
|
+
response = client.get(url)
|
87
|
+
response.raise_for_status()
|
88
|
+
|
89
|
+
models_data = response.json().get("data", [])
|
90
|
+
provider_models = defaultdict(list)
|
91
|
+
|
92
|
+
for model in models_data:
|
93
|
+
model_id = model.get("id", "")
|
94
|
+
if "/" in model_id:
|
95
|
+
provider = model_id.split("/")[0].title()
|
96
|
+
provider_models[provider].append(
|
97
|
+
{
|
98
|
+
"id": model_id,
|
99
|
+
"name": model.get("name", ""),
|
100
|
+
"description": model.get("description", ""),
|
101
|
+
"context_length": model.get("context_length", 0),
|
102
|
+
}
|
103
|
+
)
|
104
|
+
|
105
|
+
return dict(provider_models)
|
106
|
+
|
107
|
+
except httpx.HTTPError as e:
|
108
|
+
self.log(f"Error fetching models: {e!s}")
|
109
|
+
return {"Error": [{"id": "error", "name": f"Error fetching models: {e!s}"}]}
|
110
|
+
|
111
|
+
def build_model(self) -> LanguageModel:
|
112
|
+
"""Build and return the OpenRouter language model."""
|
113
|
+
model_not_selected = "Please select a model"
|
114
|
+
api_key_required = "API key is required"
|
115
|
+
|
116
|
+
if not self.model_name or self.model_name == "Select a provider first":
|
117
|
+
raise ValueError(model_not_selected)
|
118
|
+
|
119
|
+
if not self.api_key:
|
120
|
+
raise ValueError(api_key_required)
|
121
|
+
|
122
|
+
api_key = SecretStr(self.api_key).get_secret_value()
|
123
|
+
|
124
|
+
# Build base configuration
|
125
|
+
kwargs: dict[str, Any] = {
|
126
|
+
"model": self.model_name,
|
127
|
+
"openai_api_key": api_key,
|
128
|
+
"openai_api_base": "https://openrouter.ai/api/v1",
|
129
|
+
"temperature": self.temperature if self.temperature is not None else 0.7,
|
130
|
+
}
|
131
|
+
|
132
|
+
# Add optional parameters
|
133
|
+
if self.max_tokens:
|
134
|
+
kwargs["max_tokens"] = self.max_tokens
|
135
|
+
|
136
|
+
headers = {}
|
137
|
+
if self.site_url:
|
138
|
+
headers["HTTP-Referer"] = self.site_url
|
139
|
+
if self.app_name:
|
140
|
+
headers["X-Title"] = self.app_name
|
141
|
+
|
142
|
+
if headers:
|
143
|
+
kwargs["default_headers"] = headers
|
144
|
+
|
145
|
+
try:
|
146
|
+
return ChatOpenAI(**kwargs)
|
147
|
+
except (ValueError, httpx.HTTPError) as err:
|
148
|
+
error_msg = f"Failed to build model: {err!s}"
|
149
|
+
self.log(error_msg)
|
150
|
+
raise ValueError(error_msg) from err
|
151
|
+
|
152
|
+
def _get_exception_message(self, e: Exception) -> str | None:
|
153
|
+
"""Get a message from an OpenRouter exception.
|
154
|
+
|
155
|
+
Args:
|
156
|
+
e (Exception): The exception to get the message from.
|
157
|
+
|
158
|
+
Returns:
|
159
|
+
str | None: The message from the exception, or None if no specific message can be extracted.
|
160
|
+
"""
|
161
|
+
try:
|
162
|
+
from openai import BadRequestError
|
163
|
+
|
164
|
+
if isinstance(e, BadRequestError):
|
165
|
+
message = e.body.get("message")
|
166
|
+
if message:
|
167
|
+
return message
|
168
|
+
except ImportError:
|
169
|
+
pass
|
170
|
+
return None
|
171
|
+
|
172
|
+
def update_build_config(self, build_config: dict, field_value: str, field_name: str | None = None) -> dict:
|
173
|
+
"""Update build configuration based on field updates."""
|
174
|
+
try:
|
175
|
+
if field_name is None or field_name == "provider":
|
176
|
+
provider_models = self.fetch_models()
|
177
|
+
build_config["provider"]["options"] = sorted(provider_models.keys())
|
178
|
+
if build_config["provider"]["value"] not in provider_models:
|
179
|
+
build_config["provider"]["value"] = build_config["provider"]["options"][0]
|
180
|
+
|
181
|
+
if field_name == "provider" and field_value in self.fetch_models():
|
182
|
+
provider_models = self.fetch_models()
|
183
|
+
models = provider_models[field_value]
|
184
|
+
|
185
|
+
build_config["model_name"]["options"] = [model["id"] for model in models]
|
186
|
+
if models:
|
187
|
+
build_config["model_name"]["value"] = models[0]["id"]
|
188
|
+
|
189
|
+
tooltips = {
|
190
|
+
model["id"]: (f"{model['name']}\nContext Length: {model['context_length']}\n{model['description']}")
|
191
|
+
for model in models
|
192
|
+
}
|
193
|
+
build_config["model_name"]["tooltips"] = tooltips
|
194
|
+
|
195
|
+
except httpx.HTTPError as e:
|
196
|
+
self.log(f"Error updating build config: {e!s}")
|
197
|
+
build_config["provider"]["options"] = ["Error loading providers"]
|
198
|
+
build_config["provider"]["value"] = "Error loading providers"
|
199
|
+
build_config["model_name"]["options"] = ["Error loading models"]
|
200
|
+
build_config["model_name"]["value"] = "Error loading models"
|
201
|
+
|
202
|
+
return build_config
|
@@ -0,0 +1,34 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
from typing import TYPE_CHECKING, Any
|
4
|
+
|
5
|
+
from lfx.components._importing import import_mod
|
6
|
+
|
7
|
+
if TYPE_CHECKING:
|
8
|
+
from .perplexity import PerplexityComponent
|
9
|
+
|
10
|
+
_dynamic_imports = {
|
11
|
+
"PerplexityComponent": "perplexity",
|
12
|
+
}
|
13
|
+
|
14
|
+
__all__ = [
|
15
|
+
"PerplexityComponent",
|
16
|
+
]
|
17
|
+
|
18
|
+
|
19
|
+
def __getattr__(attr_name: str) -> Any:
|
20
|
+
"""Lazily import perplexity components on attribute access."""
|
21
|
+
if attr_name not in _dynamic_imports:
|
22
|
+
msg = f"module '{__name__}' has no attribute '{attr_name}'"
|
23
|
+
raise AttributeError(msg)
|
24
|
+
try:
|
25
|
+
result = import_mod(attr_name, _dynamic_imports[attr_name], __spec__.parent)
|
26
|
+
except (ModuleNotFoundError, ImportError, AttributeError) as e:
|
27
|
+
msg = f"Could not import '{attr_name}' from '{__name__}': {e}"
|
28
|
+
raise AttributeError(msg) from e
|
29
|
+
globals()[attr_name] = result
|
30
|
+
return result
|
31
|
+
|
32
|
+
|
33
|
+
def __dir__() -> list[str]:
|
34
|
+
return list(__all__)
|
@@ -0,0 +1,75 @@
|
|
1
|
+
from langchain_community.chat_models import ChatPerplexity
|
2
|
+
from pydantic.v1 import SecretStr
|
3
|
+
|
4
|
+
from lfx.base.models.model import LCModelComponent
|
5
|
+
from lfx.field_typing import LanguageModel
|
6
|
+
from lfx.field_typing.range_spec import RangeSpec
|
7
|
+
from lfx.io import DropdownInput, FloatInput, IntInput, SecretStrInput, SliderInput
|
8
|
+
|
9
|
+
|
10
|
+
class PerplexityComponent(LCModelComponent):
|
11
|
+
display_name = "Perplexity"
|
12
|
+
description = "Generate text using Perplexity LLMs."
|
13
|
+
documentation = "https://python.langchain.com/v0.2/docs/integrations/chat/perplexity/"
|
14
|
+
icon = "Perplexity"
|
15
|
+
name = "PerplexityModel"
|
16
|
+
|
17
|
+
inputs = [
|
18
|
+
*LCModelComponent.get_base_inputs(),
|
19
|
+
DropdownInput(
|
20
|
+
name="model_name",
|
21
|
+
display_name="Model Name",
|
22
|
+
advanced=False,
|
23
|
+
options=[
|
24
|
+
"llama-3.1-sonar-small-128k-online",
|
25
|
+
"llama-3.1-sonar-large-128k-online",
|
26
|
+
"llama-3.1-sonar-huge-128k-online",
|
27
|
+
"llama-3.1-sonar-small-128k-chat",
|
28
|
+
"llama-3.1-sonar-large-128k-chat",
|
29
|
+
"llama-3.1-8b-instruct",
|
30
|
+
"llama-3.1-70b-instruct",
|
31
|
+
],
|
32
|
+
value="llama-3.1-sonar-small-128k-online",
|
33
|
+
),
|
34
|
+
IntInput(name="max_tokens", display_name="Max Output Tokens", info="The maximum number of tokens to generate."),
|
35
|
+
SecretStrInput(
|
36
|
+
name="api_key",
|
37
|
+
display_name="Perplexity API Key",
|
38
|
+
info="The Perplexity API Key to use for the Perplexity model.",
|
39
|
+
advanced=False,
|
40
|
+
required=True,
|
41
|
+
),
|
42
|
+
SliderInput(
|
43
|
+
name="temperature", display_name="Temperature", value=0.75, range_spec=RangeSpec(min=0, max=2, step=0.05)
|
44
|
+
),
|
45
|
+
FloatInput(
|
46
|
+
name="top_p",
|
47
|
+
display_name="Top P",
|
48
|
+
info="The maximum cumulative probability of tokens to consider when sampling.",
|
49
|
+
advanced=True,
|
50
|
+
),
|
51
|
+
IntInput(
|
52
|
+
name="n",
|
53
|
+
display_name="N",
|
54
|
+
info="Number of chat completions to generate for each prompt. "
|
55
|
+
"Note that the API may not return the full n completions if duplicates are generated.",
|
56
|
+
advanced=True,
|
57
|
+
),
|
58
|
+
]
|
59
|
+
|
60
|
+
def build_model(self) -> LanguageModel: # type: ignore[type-var]
|
61
|
+
api_key = SecretStr(self.api_key).get_secret_value()
|
62
|
+
temperature = self.temperature
|
63
|
+
model = self.model_name
|
64
|
+
max_tokens = self.max_tokens
|
65
|
+
top_p = self.top_p
|
66
|
+
n = self.n
|
67
|
+
|
68
|
+
return ChatPerplexity(
|
69
|
+
model=model,
|
70
|
+
temperature=temperature or 0.75,
|
71
|
+
pplx_api_key=api_key,
|
72
|
+
top_p=top_p or None,
|
73
|
+
n=n or 1,
|
74
|
+
max_tokens=max_tokens,
|
75
|
+
)
|
@@ -0,0 +1,34 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
from typing import TYPE_CHECKING, Any
|
4
|
+
|
5
|
+
from lfx.components._importing import import_mod
|
6
|
+
|
7
|
+
if TYPE_CHECKING:
|
8
|
+
from .pgvector import PGVectorStoreComponent
|
9
|
+
|
10
|
+
_dynamic_imports = {
|
11
|
+
"PGVectorStoreComponent": "pgvector",
|
12
|
+
}
|
13
|
+
|
14
|
+
__all__ = [
|
15
|
+
"PGVectorStoreComponent",
|
16
|
+
]
|
17
|
+
|
18
|
+
|
19
|
+
def __getattr__(attr_name: str) -> Any:
|
20
|
+
"""Lazily import pgvector components on attribute access."""
|
21
|
+
if attr_name not in _dynamic_imports:
|
22
|
+
msg = f"module '{__name__}' has no attribute '{attr_name}'"
|
23
|
+
raise AttributeError(msg)
|
24
|
+
try:
|
25
|
+
result = import_mod(attr_name, _dynamic_imports[attr_name], __spec__.parent)
|
26
|
+
except (ModuleNotFoundError, ImportError, AttributeError) as e:
|
27
|
+
msg = f"Could not import '{attr_name}' from '{__name__}': {e}"
|
28
|
+
raise AttributeError(msg) from e
|
29
|
+
globals()[attr_name] = result
|
30
|
+
return result
|
31
|
+
|
32
|
+
|
33
|
+
def __dir__() -> list[str]:
|
34
|
+
return list(__all__)
|
@@ -0,0 +1,72 @@
|
|
1
|
+
from langchain_community.vectorstores import PGVector
|
2
|
+
|
3
|
+
from lfx.base.vectorstores.model import LCVectorStoreComponent, check_cached_vector_store
|
4
|
+
from lfx.helpers.data import docs_to_data
|
5
|
+
from lfx.io import HandleInput, IntInput, SecretStrInput, StrInput
|
6
|
+
from lfx.schema.data import Data
|
7
|
+
from lfx.utils.connection_string_parser import transform_connection_string
|
8
|
+
|
9
|
+
|
10
|
+
class PGVectorStoreComponent(LCVectorStoreComponent):
|
11
|
+
display_name = "PGVector"
|
12
|
+
description = "PGVector Vector Store with search capabilities"
|
13
|
+
name = "pgvector"
|
14
|
+
icon = "cpu"
|
15
|
+
|
16
|
+
inputs = [
|
17
|
+
SecretStrInput(name="pg_server_url", display_name="PostgreSQL Server Connection String", required=True),
|
18
|
+
StrInput(name="collection_name", display_name="Table", required=True),
|
19
|
+
*LCVectorStoreComponent.inputs,
|
20
|
+
HandleInput(name="embedding", display_name="Embedding", input_types=["Embeddings"], required=True),
|
21
|
+
IntInput(
|
22
|
+
name="number_of_results",
|
23
|
+
display_name="Number of Results",
|
24
|
+
info="Number of results to return.",
|
25
|
+
value=4,
|
26
|
+
advanced=True,
|
27
|
+
),
|
28
|
+
]
|
29
|
+
|
30
|
+
@check_cached_vector_store
|
31
|
+
def build_vector_store(self) -> PGVector:
|
32
|
+
# Convert DataFrame to Data if needed using parent's method
|
33
|
+
self.ingest_data = self._prepare_ingest_data()
|
34
|
+
|
35
|
+
documents = []
|
36
|
+
for _input in self.ingest_data or []:
|
37
|
+
if isinstance(_input, Data):
|
38
|
+
documents.append(_input.to_lc_document())
|
39
|
+
else:
|
40
|
+
documents.append(_input)
|
41
|
+
|
42
|
+
connection_string_parsed = transform_connection_string(self.pg_server_url)
|
43
|
+
|
44
|
+
if documents:
|
45
|
+
pgvector = PGVector.from_documents(
|
46
|
+
embedding=self.embedding,
|
47
|
+
documents=documents,
|
48
|
+
collection_name=self.collection_name,
|
49
|
+
connection_string=connection_string_parsed,
|
50
|
+
)
|
51
|
+
else:
|
52
|
+
pgvector = PGVector.from_existing_index(
|
53
|
+
embedding=self.embedding,
|
54
|
+
collection_name=self.collection_name,
|
55
|
+
connection_string=connection_string_parsed,
|
56
|
+
)
|
57
|
+
|
58
|
+
return pgvector
|
59
|
+
|
60
|
+
def search_documents(self) -> list[Data]:
|
61
|
+
vector_store = self.build_vector_store()
|
62
|
+
|
63
|
+
if self.search_query and isinstance(self.search_query, str) and self.search_query.strip():
|
64
|
+
docs = vector_store.similarity_search(
|
65
|
+
query=self.search_query,
|
66
|
+
k=self.number_of_results,
|
67
|
+
)
|
68
|
+
|
69
|
+
data = docs_to_data(docs)
|
70
|
+
self.status = data
|
71
|
+
return data
|
72
|
+
return []
|
@@ -0,0 +1,34 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
from typing import TYPE_CHECKING, Any
|
4
|
+
|
5
|
+
from lfx.components._importing import import_mod
|
6
|
+
|
7
|
+
if TYPE_CHECKING:
|
8
|
+
from .pinecone import PineconeVectorStoreComponent
|
9
|
+
|
10
|
+
_dynamic_imports = {
|
11
|
+
"PineconeVectorStoreComponent": "pinecone",
|
12
|
+
}
|
13
|
+
|
14
|
+
__all__ = [
|
15
|
+
"PineconeVectorStoreComponent",
|
16
|
+
]
|
17
|
+
|
18
|
+
|
19
|
+
def __getattr__(attr_name: str) -> Any:
|
20
|
+
"""Lazily import Pinecone components on attribute access."""
|
21
|
+
if attr_name not in _dynamic_imports:
|
22
|
+
msg = f"module '{__name__}' has no attribute '{attr_name}'"
|
23
|
+
raise AttributeError(msg)
|
24
|
+
try:
|
25
|
+
result = import_mod(attr_name, _dynamic_imports[attr_name], __spec__.parent)
|
26
|
+
except (ModuleNotFoundError, ImportError, AttributeError) as e:
|
27
|
+
msg = f"Could not import '{attr_name}' from '{__name__}': {e}"
|
28
|
+
raise AttributeError(msg) from e
|
29
|
+
globals()[attr_name] = result
|
30
|
+
return result
|
31
|
+
|
32
|
+
|
33
|
+
def __dir__() -> list[str]:
|
34
|
+
return list(__all__)
|