lfx-nightly 0.2.0.dev25__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of lfx-nightly might be problematic. Click here for more details.
- lfx/__init__.py +0 -0
- lfx/__main__.py +25 -0
- lfx/_assets/component_index.json +1 -0
- lfx/base/__init__.py +0 -0
- lfx/base/agents/__init__.py +0 -0
- lfx/base/agents/agent.py +375 -0
- lfx/base/agents/altk_base_agent.py +380 -0
- lfx/base/agents/altk_tool_wrappers.py +565 -0
- lfx/base/agents/callback.py +130 -0
- lfx/base/agents/context.py +109 -0
- lfx/base/agents/crewai/__init__.py +0 -0
- lfx/base/agents/crewai/crew.py +231 -0
- lfx/base/agents/crewai/tasks.py +12 -0
- lfx/base/agents/default_prompts.py +23 -0
- lfx/base/agents/errors.py +15 -0
- lfx/base/agents/events.py +430 -0
- lfx/base/agents/utils.py +237 -0
- lfx/base/astra_assistants/__init__.py +0 -0
- lfx/base/astra_assistants/util.py +171 -0
- lfx/base/chains/__init__.py +0 -0
- lfx/base/chains/model.py +19 -0
- lfx/base/composio/__init__.py +0 -0
- lfx/base/composio/composio_base.py +2584 -0
- lfx/base/compressors/__init__.py +0 -0
- lfx/base/compressors/model.py +60 -0
- lfx/base/constants.py +46 -0
- lfx/base/curl/__init__.py +0 -0
- lfx/base/curl/parse.py +188 -0
- lfx/base/data/__init__.py +5 -0
- lfx/base/data/base_file.py +810 -0
- lfx/base/data/docling_utils.py +338 -0
- lfx/base/data/storage_utils.py +192 -0
- lfx/base/data/utils.py +362 -0
- lfx/base/datastax/__init__.py +5 -0
- lfx/base/datastax/astradb_base.py +896 -0
- lfx/base/document_transformers/__init__.py +0 -0
- lfx/base/document_transformers/model.py +43 -0
- lfx/base/embeddings/__init__.py +0 -0
- lfx/base/embeddings/aiml_embeddings.py +62 -0
- lfx/base/embeddings/embeddings_class.py +113 -0
- lfx/base/embeddings/model.py +26 -0
- lfx/base/flow_processing/__init__.py +0 -0
- lfx/base/flow_processing/utils.py +86 -0
- lfx/base/huggingface/__init__.py +0 -0
- lfx/base/huggingface/model_bridge.py +133 -0
- lfx/base/io/__init__.py +0 -0
- lfx/base/io/chat.py +21 -0
- lfx/base/io/text.py +22 -0
- lfx/base/knowledge_bases/__init__.py +3 -0
- lfx/base/knowledge_bases/knowledge_base_utils.py +137 -0
- lfx/base/langchain_utilities/__init__.py +0 -0
- lfx/base/langchain_utilities/model.py +35 -0
- lfx/base/langchain_utilities/spider_constants.py +1 -0
- lfx/base/langwatch/__init__.py +0 -0
- lfx/base/langwatch/utils.py +18 -0
- lfx/base/mcp/__init__.py +0 -0
- lfx/base/mcp/constants.py +2 -0
- lfx/base/mcp/util.py +1659 -0
- lfx/base/memory/__init__.py +0 -0
- lfx/base/memory/memory.py +49 -0
- lfx/base/memory/model.py +38 -0
- lfx/base/models/__init__.py +3 -0
- lfx/base/models/aiml_constants.py +51 -0
- lfx/base/models/anthropic_constants.py +51 -0
- lfx/base/models/aws_constants.py +151 -0
- lfx/base/models/chat_result.py +76 -0
- lfx/base/models/cometapi_constants.py +54 -0
- lfx/base/models/google_generative_ai_constants.py +70 -0
- lfx/base/models/google_generative_ai_model.py +38 -0
- lfx/base/models/groq_constants.py +150 -0
- lfx/base/models/groq_model_discovery.py +265 -0
- lfx/base/models/model.py +375 -0
- lfx/base/models/model_input_constants.py +378 -0
- lfx/base/models/model_metadata.py +41 -0
- lfx/base/models/model_utils.py +108 -0
- lfx/base/models/novita_constants.py +35 -0
- lfx/base/models/ollama_constants.py +52 -0
- lfx/base/models/openai_constants.py +129 -0
- lfx/base/models/sambanova_constants.py +18 -0
- lfx/base/models/watsonx_constants.py +36 -0
- lfx/base/processing/__init__.py +0 -0
- lfx/base/prompts/__init__.py +0 -0
- lfx/base/prompts/api_utils.py +224 -0
- lfx/base/prompts/utils.py +61 -0
- lfx/base/textsplitters/__init__.py +0 -0
- lfx/base/textsplitters/model.py +28 -0
- lfx/base/tools/__init__.py +0 -0
- lfx/base/tools/base.py +26 -0
- lfx/base/tools/component_tool.py +325 -0
- lfx/base/tools/constants.py +49 -0
- lfx/base/tools/flow_tool.py +132 -0
- lfx/base/tools/run_flow.py +698 -0
- lfx/base/vectorstores/__init__.py +0 -0
- lfx/base/vectorstores/model.py +193 -0
- lfx/base/vectorstores/utils.py +22 -0
- lfx/base/vectorstores/vector_store_connection_decorator.py +52 -0
- lfx/cli/__init__.py +5 -0
- lfx/cli/commands.py +327 -0
- lfx/cli/common.py +650 -0
- lfx/cli/run.py +506 -0
- lfx/cli/script_loader.py +289 -0
- lfx/cli/serve_app.py +546 -0
- lfx/cli/validation.py +69 -0
- lfx/components/FAISS/__init__.py +34 -0
- lfx/components/FAISS/faiss.py +111 -0
- lfx/components/Notion/__init__.py +19 -0
- lfx/components/Notion/add_content_to_page.py +269 -0
- lfx/components/Notion/create_page.py +94 -0
- lfx/components/Notion/list_database_properties.py +68 -0
- lfx/components/Notion/list_pages.py +122 -0
- lfx/components/Notion/list_users.py +77 -0
- lfx/components/Notion/page_content_viewer.py +93 -0
- lfx/components/Notion/search.py +111 -0
- lfx/components/Notion/update_page_property.py +114 -0
- lfx/components/__init__.py +428 -0
- lfx/components/_importing.py +42 -0
- lfx/components/agentql/__init__.py +3 -0
- lfx/components/agentql/agentql_api.py +151 -0
- lfx/components/aiml/__init__.py +37 -0
- lfx/components/aiml/aiml.py +115 -0
- lfx/components/aiml/aiml_embeddings.py +37 -0
- lfx/components/altk/__init__.py +34 -0
- lfx/components/altk/altk_agent.py +193 -0
- lfx/components/amazon/__init__.py +36 -0
- lfx/components/amazon/amazon_bedrock_converse.py +195 -0
- lfx/components/amazon/amazon_bedrock_embedding.py +109 -0
- lfx/components/amazon/amazon_bedrock_model.py +130 -0
- lfx/components/amazon/s3_bucket_uploader.py +211 -0
- lfx/components/anthropic/__init__.py +34 -0
- lfx/components/anthropic/anthropic.py +187 -0
- lfx/components/apify/__init__.py +5 -0
- lfx/components/apify/apify_actor.py +325 -0
- lfx/components/arxiv/__init__.py +3 -0
- lfx/components/arxiv/arxiv.py +169 -0
- lfx/components/assemblyai/__init__.py +46 -0
- lfx/components/assemblyai/assemblyai_get_subtitles.py +83 -0
- lfx/components/assemblyai/assemblyai_lemur.py +183 -0
- lfx/components/assemblyai/assemblyai_list_transcripts.py +95 -0
- lfx/components/assemblyai/assemblyai_poll_transcript.py +72 -0
- lfx/components/assemblyai/assemblyai_start_transcript.py +188 -0
- lfx/components/azure/__init__.py +37 -0
- lfx/components/azure/azure_openai.py +95 -0
- lfx/components/azure/azure_openai_embeddings.py +83 -0
- lfx/components/baidu/__init__.py +32 -0
- lfx/components/baidu/baidu_qianfan_chat.py +113 -0
- lfx/components/bing/__init__.py +3 -0
- lfx/components/bing/bing_search_api.py +61 -0
- lfx/components/cassandra/__init__.py +40 -0
- lfx/components/cassandra/cassandra.py +264 -0
- lfx/components/cassandra/cassandra_chat.py +92 -0
- lfx/components/cassandra/cassandra_graph.py +238 -0
- lfx/components/chains/__init__.py +3 -0
- lfx/components/chroma/__init__.py +34 -0
- lfx/components/chroma/chroma.py +169 -0
- lfx/components/cleanlab/__init__.py +40 -0
- lfx/components/cleanlab/cleanlab_evaluator.py +155 -0
- lfx/components/cleanlab/cleanlab_rag_evaluator.py +254 -0
- lfx/components/cleanlab/cleanlab_remediator.py +131 -0
- lfx/components/clickhouse/__init__.py +34 -0
- lfx/components/clickhouse/clickhouse.py +135 -0
- lfx/components/cloudflare/__init__.py +32 -0
- lfx/components/cloudflare/cloudflare.py +81 -0
- lfx/components/cohere/__init__.py +40 -0
- lfx/components/cohere/cohere_embeddings.py +81 -0
- lfx/components/cohere/cohere_models.py +46 -0
- lfx/components/cohere/cohere_rerank.py +51 -0
- lfx/components/cometapi/__init__.py +32 -0
- lfx/components/cometapi/cometapi.py +166 -0
- lfx/components/composio/__init__.py +222 -0
- lfx/components/composio/agentql_composio.py +11 -0
- lfx/components/composio/agiled_composio.py +11 -0
- lfx/components/composio/airtable_composio.py +11 -0
- lfx/components/composio/apollo_composio.py +11 -0
- lfx/components/composio/asana_composio.py +11 -0
- lfx/components/composio/attio_composio.py +11 -0
- lfx/components/composio/bitbucket_composio.py +11 -0
- lfx/components/composio/bolna_composio.py +11 -0
- lfx/components/composio/brightdata_composio.py +11 -0
- lfx/components/composio/calendly_composio.py +11 -0
- lfx/components/composio/canva_composio.py +11 -0
- lfx/components/composio/canvas_composio.py +11 -0
- lfx/components/composio/coda_composio.py +11 -0
- lfx/components/composio/composio_api.py +278 -0
- lfx/components/composio/contentful_composio.py +11 -0
- lfx/components/composio/digicert_composio.py +11 -0
- lfx/components/composio/discord_composio.py +11 -0
- lfx/components/composio/dropbox_compnent.py +11 -0
- lfx/components/composio/elevenlabs_composio.py +11 -0
- lfx/components/composio/exa_composio.py +11 -0
- lfx/components/composio/figma_composio.py +11 -0
- lfx/components/composio/finage_composio.py +11 -0
- lfx/components/composio/firecrawl_composio.py +11 -0
- lfx/components/composio/fireflies_composio.py +11 -0
- lfx/components/composio/fixer_composio.py +11 -0
- lfx/components/composio/flexisign_composio.py +11 -0
- lfx/components/composio/freshdesk_composio.py +11 -0
- lfx/components/composio/github_composio.py +11 -0
- lfx/components/composio/gmail_composio.py +38 -0
- lfx/components/composio/googlebigquery_composio.py +11 -0
- lfx/components/composio/googlecalendar_composio.py +11 -0
- lfx/components/composio/googleclassroom_composio.py +11 -0
- lfx/components/composio/googledocs_composio.py +11 -0
- lfx/components/composio/googlemeet_composio.py +11 -0
- lfx/components/composio/googlesheets_composio.py +11 -0
- lfx/components/composio/googletasks_composio.py +8 -0
- lfx/components/composio/heygen_composio.py +11 -0
- lfx/components/composio/instagram_composio.py +11 -0
- lfx/components/composio/jira_composio.py +11 -0
- lfx/components/composio/jotform_composio.py +11 -0
- lfx/components/composio/klaviyo_composio.py +11 -0
- lfx/components/composio/linear_composio.py +11 -0
- lfx/components/composio/listennotes_composio.py +11 -0
- lfx/components/composio/mem0_composio.py +11 -0
- lfx/components/composio/miro_composio.py +11 -0
- lfx/components/composio/missive_composio.py +11 -0
- lfx/components/composio/notion_composio.py +11 -0
- lfx/components/composio/onedrive_composio.py +11 -0
- lfx/components/composio/outlook_composio.py +11 -0
- lfx/components/composio/pandadoc_composio.py +11 -0
- lfx/components/composio/peopledatalabs_composio.py +11 -0
- lfx/components/composio/perplexityai_composio.py +11 -0
- lfx/components/composio/reddit_composio.py +11 -0
- lfx/components/composio/serpapi_composio.py +11 -0
- lfx/components/composio/slack_composio.py +11 -0
- lfx/components/composio/slackbot_composio.py +11 -0
- lfx/components/composio/snowflake_composio.py +11 -0
- lfx/components/composio/supabase_composio.py +11 -0
- lfx/components/composio/tavily_composio.py +11 -0
- lfx/components/composio/timelinesai_composio.py +11 -0
- lfx/components/composio/todoist_composio.py +11 -0
- lfx/components/composio/wrike_composio.py +11 -0
- lfx/components/composio/youtube_composio.py +11 -0
- lfx/components/confluence/__init__.py +3 -0
- lfx/components/confluence/confluence.py +84 -0
- lfx/components/couchbase/__init__.py +34 -0
- lfx/components/couchbase/couchbase.py +102 -0
- lfx/components/crewai/__init__.py +49 -0
- lfx/components/crewai/crewai.py +108 -0
- lfx/components/crewai/hierarchical_crew.py +47 -0
- lfx/components/crewai/hierarchical_task.py +45 -0
- lfx/components/crewai/sequential_crew.py +53 -0
- lfx/components/crewai/sequential_task.py +74 -0
- lfx/components/crewai/sequential_task_agent.py +144 -0
- lfx/components/cuga/__init__.py +34 -0
- lfx/components/cuga/cuga_agent.py +730 -0
- lfx/components/custom_component/__init__.py +34 -0
- lfx/components/custom_component/custom_component.py +31 -0
- lfx/components/data/__init__.py +114 -0
- lfx/components/data_source/__init__.py +58 -0
- lfx/components/data_source/api_request.py +577 -0
- lfx/components/data_source/csv_to_data.py +101 -0
- lfx/components/data_source/json_to_data.py +106 -0
- lfx/components/data_source/mock_data.py +398 -0
- lfx/components/data_source/news_search.py +166 -0
- lfx/components/data_source/rss.py +71 -0
- lfx/components/data_source/sql_executor.py +101 -0
- lfx/components/data_source/url.py +311 -0
- lfx/components/data_source/web_search.py +326 -0
- lfx/components/datastax/__init__.py +76 -0
- lfx/components/datastax/astradb_assistant_manager.py +307 -0
- lfx/components/datastax/astradb_chatmemory.py +40 -0
- lfx/components/datastax/astradb_cql.py +288 -0
- lfx/components/datastax/astradb_graph.py +217 -0
- lfx/components/datastax/astradb_tool.py +378 -0
- lfx/components/datastax/astradb_vectorize.py +122 -0
- lfx/components/datastax/astradb_vectorstore.py +449 -0
- lfx/components/datastax/create_assistant.py +59 -0
- lfx/components/datastax/create_thread.py +33 -0
- lfx/components/datastax/dotenv.py +36 -0
- lfx/components/datastax/get_assistant.py +38 -0
- lfx/components/datastax/getenvvar.py +31 -0
- lfx/components/datastax/graph_rag.py +141 -0
- lfx/components/datastax/hcd.py +315 -0
- lfx/components/datastax/list_assistants.py +26 -0
- lfx/components/datastax/run.py +90 -0
- lfx/components/deactivated/__init__.py +15 -0
- lfx/components/deactivated/amazon_kendra.py +66 -0
- lfx/components/deactivated/chat_litellm_model.py +158 -0
- lfx/components/deactivated/code_block_extractor.py +26 -0
- lfx/components/deactivated/documents_to_data.py +22 -0
- lfx/components/deactivated/embed.py +16 -0
- lfx/components/deactivated/extract_key_from_data.py +46 -0
- lfx/components/deactivated/json_document_builder.py +57 -0
- lfx/components/deactivated/list_flows.py +20 -0
- lfx/components/deactivated/mcp_sse.py +61 -0
- lfx/components/deactivated/mcp_stdio.py +62 -0
- lfx/components/deactivated/merge_data.py +93 -0
- lfx/components/deactivated/message.py +37 -0
- lfx/components/deactivated/metal.py +54 -0
- lfx/components/deactivated/multi_query.py +59 -0
- lfx/components/deactivated/retriever.py +43 -0
- lfx/components/deactivated/selective_passthrough.py +77 -0
- lfx/components/deactivated/should_run_next.py +40 -0
- lfx/components/deactivated/split_text.py +63 -0
- lfx/components/deactivated/store_message.py +24 -0
- lfx/components/deactivated/sub_flow.py +124 -0
- lfx/components/deactivated/vectara_self_query.py +76 -0
- lfx/components/deactivated/vector_store.py +24 -0
- lfx/components/deepseek/__init__.py +34 -0
- lfx/components/deepseek/deepseek.py +136 -0
- lfx/components/docling/__init__.py +43 -0
- lfx/components/docling/chunk_docling_document.py +186 -0
- lfx/components/docling/docling_inline.py +238 -0
- lfx/components/docling/docling_remote.py +195 -0
- lfx/components/docling/export_docling_document.py +117 -0
- lfx/components/documentloaders/__init__.py +3 -0
- lfx/components/duckduckgo/__init__.py +3 -0
- lfx/components/duckduckgo/duck_duck_go_search_run.py +92 -0
- lfx/components/elastic/__init__.py +37 -0
- lfx/components/elastic/elasticsearch.py +267 -0
- lfx/components/elastic/opensearch.py +789 -0
- lfx/components/elastic/opensearch_multimodal.py +1575 -0
- lfx/components/embeddings/__init__.py +37 -0
- lfx/components/embeddings/similarity.py +77 -0
- lfx/components/embeddings/text_embedder.py +65 -0
- lfx/components/exa/__init__.py +3 -0
- lfx/components/exa/exa_search.py +68 -0
- lfx/components/files_and_knowledge/__init__.py +47 -0
- lfx/components/files_and_knowledge/directory.py +113 -0
- lfx/components/files_and_knowledge/file.py +841 -0
- lfx/components/files_and_knowledge/ingestion.py +694 -0
- lfx/components/files_and_knowledge/retrieval.py +264 -0
- lfx/components/files_and_knowledge/save_file.py +746 -0
- lfx/components/firecrawl/__init__.py +43 -0
- lfx/components/firecrawl/firecrawl_crawl_api.py +88 -0
- lfx/components/firecrawl/firecrawl_extract_api.py +136 -0
- lfx/components/firecrawl/firecrawl_map_api.py +89 -0
- lfx/components/firecrawl/firecrawl_scrape_api.py +73 -0
- lfx/components/flow_controls/__init__.py +58 -0
- lfx/components/flow_controls/conditional_router.py +208 -0
- lfx/components/flow_controls/data_conditional_router.py +126 -0
- lfx/components/flow_controls/flow_tool.py +111 -0
- lfx/components/flow_controls/listen.py +29 -0
- lfx/components/flow_controls/loop.py +163 -0
- lfx/components/flow_controls/notify.py +88 -0
- lfx/components/flow_controls/pass_message.py +36 -0
- lfx/components/flow_controls/run_flow.py +108 -0
- lfx/components/flow_controls/sub_flow.py +115 -0
- lfx/components/git/__init__.py +4 -0
- lfx/components/git/git.py +262 -0
- lfx/components/git/gitextractor.py +196 -0
- lfx/components/glean/__init__.py +3 -0
- lfx/components/glean/glean_search_api.py +173 -0
- lfx/components/google/__init__.py +17 -0
- lfx/components/google/gmail.py +193 -0
- lfx/components/google/google_bq_sql_executor.py +157 -0
- lfx/components/google/google_drive.py +92 -0
- lfx/components/google/google_drive_search.py +152 -0
- lfx/components/google/google_generative_ai.py +144 -0
- lfx/components/google/google_generative_ai_embeddings.py +141 -0
- lfx/components/google/google_oauth_token.py +89 -0
- lfx/components/google/google_search_api_core.py +68 -0
- lfx/components/google/google_serper_api_core.py +74 -0
- lfx/components/groq/__init__.py +34 -0
- lfx/components/groq/groq.py +143 -0
- lfx/components/helpers/__init__.py +154 -0
- lfx/components/homeassistant/__init__.py +7 -0
- lfx/components/homeassistant/home_assistant_control.py +152 -0
- lfx/components/homeassistant/list_home_assistant_states.py +137 -0
- lfx/components/huggingface/__init__.py +37 -0
- lfx/components/huggingface/huggingface.py +199 -0
- lfx/components/huggingface/huggingface_inference_api.py +106 -0
- lfx/components/ibm/__init__.py +34 -0
- lfx/components/ibm/watsonx.py +207 -0
- lfx/components/ibm/watsonx_embeddings.py +135 -0
- lfx/components/icosacomputing/__init__.py +5 -0
- lfx/components/icosacomputing/combinatorial_reasoner.py +84 -0
- lfx/components/input_output/__init__.py +40 -0
- lfx/components/input_output/chat.py +109 -0
- lfx/components/input_output/chat_output.py +184 -0
- lfx/components/input_output/text.py +27 -0
- lfx/components/input_output/text_output.py +29 -0
- lfx/components/input_output/webhook.py +56 -0
- lfx/components/jigsawstack/__init__.py +23 -0
- lfx/components/jigsawstack/ai_scrape.py +126 -0
- lfx/components/jigsawstack/ai_web_search.py +136 -0
- lfx/components/jigsawstack/file_read.py +115 -0
- lfx/components/jigsawstack/file_upload.py +94 -0
- lfx/components/jigsawstack/image_generation.py +205 -0
- lfx/components/jigsawstack/nsfw.py +60 -0
- lfx/components/jigsawstack/object_detection.py +124 -0
- lfx/components/jigsawstack/sentiment.py +112 -0
- lfx/components/jigsawstack/text_to_sql.py +90 -0
- lfx/components/jigsawstack/text_translate.py +77 -0
- lfx/components/jigsawstack/vocr.py +107 -0
- lfx/components/knowledge_bases/__init__.py +89 -0
- lfx/components/langchain_utilities/__init__.py +109 -0
- lfx/components/langchain_utilities/character.py +53 -0
- lfx/components/langchain_utilities/conversation.py +59 -0
- lfx/components/langchain_utilities/csv_agent.py +175 -0
- lfx/components/langchain_utilities/fake_embeddings.py +26 -0
- lfx/components/langchain_utilities/html_link_extractor.py +35 -0
- lfx/components/langchain_utilities/json_agent.py +100 -0
- lfx/components/langchain_utilities/langchain_hub.py +126 -0
- lfx/components/langchain_utilities/language_recursive.py +49 -0
- lfx/components/langchain_utilities/language_semantic.py +138 -0
- lfx/components/langchain_utilities/llm_checker.py +39 -0
- lfx/components/langchain_utilities/llm_math.py +42 -0
- lfx/components/langchain_utilities/natural_language.py +61 -0
- lfx/components/langchain_utilities/openai_tools.py +53 -0
- lfx/components/langchain_utilities/openapi.py +48 -0
- lfx/components/langchain_utilities/recursive_character.py +60 -0
- lfx/components/langchain_utilities/retrieval_qa.py +83 -0
- lfx/components/langchain_utilities/runnable_executor.py +137 -0
- lfx/components/langchain_utilities/self_query.py +80 -0
- lfx/components/langchain_utilities/spider.py +142 -0
- lfx/components/langchain_utilities/sql.py +40 -0
- lfx/components/langchain_utilities/sql_database.py +35 -0
- lfx/components/langchain_utilities/sql_generator.py +78 -0
- lfx/components/langchain_utilities/tool_calling.py +59 -0
- lfx/components/langchain_utilities/vector_store_info.py +49 -0
- lfx/components/langchain_utilities/vector_store_router.py +33 -0
- lfx/components/langchain_utilities/xml_agent.py +71 -0
- lfx/components/langwatch/__init__.py +3 -0
- lfx/components/langwatch/langwatch.py +278 -0
- lfx/components/link_extractors/__init__.py +3 -0
- lfx/components/llm_operations/__init__.py +46 -0
- lfx/components/llm_operations/batch_run.py +205 -0
- lfx/components/llm_operations/lambda_filter.py +218 -0
- lfx/components/llm_operations/llm_conditional_router.py +421 -0
- lfx/components/llm_operations/llm_selector.py +499 -0
- lfx/components/llm_operations/structured_output.py +244 -0
- lfx/components/lmstudio/__init__.py +34 -0
- lfx/components/lmstudio/lmstudioembeddings.py +89 -0
- lfx/components/lmstudio/lmstudiomodel.py +133 -0
- lfx/components/logic/__init__.py +181 -0
- lfx/components/maritalk/__init__.py +32 -0
- lfx/components/maritalk/maritalk.py +52 -0
- lfx/components/mem0/__init__.py +3 -0
- lfx/components/mem0/mem0_chat_memory.py +147 -0
- lfx/components/milvus/__init__.py +34 -0
- lfx/components/milvus/milvus.py +115 -0
- lfx/components/mistral/__init__.py +37 -0
- lfx/components/mistral/mistral.py +114 -0
- lfx/components/mistral/mistral_embeddings.py +58 -0
- lfx/components/models/__init__.py +89 -0
- lfx/components/models_and_agents/__init__.py +49 -0
- lfx/components/models_and_agents/agent.py +644 -0
- lfx/components/models_and_agents/embedding_model.py +423 -0
- lfx/components/models_and_agents/language_model.py +398 -0
- lfx/components/models_and_agents/mcp_component.py +594 -0
- lfx/components/models_and_agents/memory.py +268 -0
- lfx/components/models_and_agents/prompt.py +67 -0
- lfx/components/mongodb/__init__.py +34 -0
- lfx/components/mongodb/mongodb_atlas.py +213 -0
- lfx/components/needle/__init__.py +3 -0
- lfx/components/needle/needle.py +104 -0
- lfx/components/notdiamond/__init__.py +34 -0
- lfx/components/notdiamond/notdiamond.py +228 -0
- lfx/components/novita/__init__.py +32 -0
- lfx/components/novita/novita.py +130 -0
- lfx/components/nvidia/__init__.py +57 -0
- lfx/components/nvidia/nvidia.py +151 -0
- lfx/components/nvidia/nvidia_embedding.py +77 -0
- lfx/components/nvidia/nvidia_ingest.py +317 -0
- lfx/components/nvidia/nvidia_rerank.py +63 -0
- lfx/components/nvidia/system_assist.py +65 -0
- lfx/components/olivya/__init__.py +3 -0
- lfx/components/olivya/olivya.py +116 -0
- lfx/components/ollama/__init__.py +37 -0
- lfx/components/ollama/ollama.py +548 -0
- lfx/components/ollama/ollama_embeddings.py +103 -0
- lfx/components/openai/__init__.py +37 -0
- lfx/components/openai/openai.py +100 -0
- lfx/components/openai/openai_chat_model.py +176 -0
- lfx/components/openrouter/__init__.py +32 -0
- lfx/components/openrouter/openrouter.py +104 -0
- lfx/components/output_parsers/__init__.py +3 -0
- lfx/components/perplexity/__init__.py +34 -0
- lfx/components/perplexity/perplexity.py +75 -0
- lfx/components/pgvector/__init__.py +34 -0
- lfx/components/pgvector/pgvector.py +72 -0
- lfx/components/pinecone/__init__.py +34 -0
- lfx/components/pinecone/pinecone.py +134 -0
- lfx/components/processing/__init__.py +72 -0
- lfx/components/processing/alter_metadata.py +109 -0
- lfx/components/processing/combine_text.py +40 -0
- lfx/components/processing/converter.py +248 -0
- lfx/components/processing/create_data.py +111 -0
- lfx/components/processing/create_list.py +40 -0
- lfx/components/processing/data_operations.py +528 -0
- lfx/components/processing/data_to_dataframe.py +71 -0
- lfx/components/processing/dataframe_operations.py +313 -0
- lfx/components/processing/dataframe_to_toolset.py +259 -0
- lfx/components/processing/dynamic_create_data.py +357 -0
- lfx/components/processing/extract_key.py +54 -0
- lfx/components/processing/filter_data.py +43 -0
- lfx/components/processing/filter_data_values.py +89 -0
- lfx/components/processing/json_cleaner.py +104 -0
- lfx/components/processing/merge_data.py +91 -0
- lfx/components/processing/message_to_data.py +37 -0
- lfx/components/processing/output_parser.py +46 -0
- lfx/components/processing/parse_data.py +71 -0
- lfx/components/processing/parse_dataframe.py +69 -0
- lfx/components/processing/parse_json_data.py +91 -0
- lfx/components/processing/parser.py +148 -0
- lfx/components/processing/regex.py +83 -0
- lfx/components/processing/select_data.py +49 -0
- lfx/components/processing/split_text.py +141 -0
- lfx/components/processing/store_message.py +91 -0
- lfx/components/processing/update_data.py +161 -0
- lfx/components/prototypes/__init__.py +35 -0
- lfx/components/prototypes/python_function.py +73 -0
- lfx/components/qdrant/__init__.py +34 -0
- lfx/components/qdrant/qdrant.py +109 -0
- lfx/components/redis/__init__.py +37 -0
- lfx/components/redis/redis.py +89 -0
- lfx/components/redis/redis_chat.py +43 -0
- lfx/components/sambanova/__init__.py +32 -0
- lfx/components/sambanova/sambanova.py +84 -0
- lfx/components/scrapegraph/__init__.py +40 -0
- lfx/components/scrapegraph/scrapegraph_markdownify_api.py +64 -0
- lfx/components/scrapegraph/scrapegraph_search_api.py +64 -0
- lfx/components/scrapegraph/scrapegraph_smart_scraper_api.py +71 -0
- lfx/components/searchapi/__init__.py +34 -0
- lfx/components/searchapi/search.py +79 -0
- lfx/components/serpapi/__init__.py +3 -0
- lfx/components/serpapi/serp.py +115 -0
- lfx/components/supabase/__init__.py +34 -0
- lfx/components/supabase/supabase.py +76 -0
- lfx/components/tavily/__init__.py +4 -0
- lfx/components/tavily/tavily_extract.py +117 -0
- lfx/components/tavily/tavily_search.py +212 -0
- lfx/components/textsplitters/__init__.py +3 -0
- lfx/components/toolkits/__init__.py +3 -0
- lfx/components/tools/__init__.py +66 -0
- lfx/components/tools/calculator.py +109 -0
- lfx/components/tools/google_search_api.py +45 -0
- lfx/components/tools/google_serper_api.py +115 -0
- lfx/components/tools/python_code_structured_tool.py +328 -0
- lfx/components/tools/python_repl.py +98 -0
- lfx/components/tools/search_api.py +88 -0
- lfx/components/tools/searxng.py +145 -0
- lfx/components/tools/serp_api.py +120 -0
- lfx/components/tools/tavily_search_tool.py +345 -0
- lfx/components/tools/wikidata_api.py +103 -0
- lfx/components/tools/wikipedia_api.py +50 -0
- lfx/components/tools/yahoo_finance.py +130 -0
- lfx/components/twelvelabs/__init__.py +52 -0
- lfx/components/twelvelabs/convert_astra_results.py +84 -0
- lfx/components/twelvelabs/pegasus_index.py +311 -0
- lfx/components/twelvelabs/split_video.py +301 -0
- lfx/components/twelvelabs/text_embeddings.py +57 -0
- lfx/components/twelvelabs/twelvelabs_pegasus.py +408 -0
- lfx/components/twelvelabs/video_embeddings.py +100 -0
- lfx/components/twelvelabs/video_file.py +191 -0
- lfx/components/unstructured/__init__.py +3 -0
- lfx/components/unstructured/unstructured.py +121 -0
- lfx/components/upstash/__init__.py +34 -0
- lfx/components/upstash/upstash.py +124 -0
- lfx/components/utilities/__init__.py +43 -0
- lfx/components/utilities/calculator_core.py +89 -0
- lfx/components/utilities/current_date.py +42 -0
- lfx/components/utilities/id_generator.py +42 -0
- lfx/components/utilities/python_repl_core.py +98 -0
- lfx/components/vectara/__init__.py +37 -0
- lfx/components/vectara/vectara.py +97 -0
- lfx/components/vectara/vectara_rag.py +164 -0
- lfx/components/vectorstores/__init__.py +34 -0
- lfx/components/vectorstores/local_db.py +270 -0
- lfx/components/vertexai/__init__.py +37 -0
- lfx/components/vertexai/vertexai.py +71 -0
- lfx/components/vertexai/vertexai_embeddings.py +67 -0
- lfx/components/vlmrun/__init__.py +34 -0
- lfx/components/vlmrun/vlmrun_transcription.py +224 -0
- lfx/components/weaviate/__init__.py +34 -0
- lfx/components/weaviate/weaviate.py +89 -0
- lfx/components/wikipedia/__init__.py +4 -0
- lfx/components/wikipedia/wikidata.py +86 -0
- lfx/components/wikipedia/wikipedia.py +53 -0
- lfx/components/wolframalpha/__init__.py +3 -0
- lfx/components/wolframalpha/wolfram_alpha_api.py +54 -0
- lfx/components/xai/__init__.py +32 -0
- lfx/components/xai/xai.py +167 -0
- lfx/components/yahoosearch/__init__.py +3 -0
- lfx/components/yahoosearch/yahoo.py +137 -0
- lfx/components/youtube/__init__.py +52 -0
- lfx/components/youtube/channel.py +227 -0
- lfx/components/youtube/comments.py +231 -0
- lfx/components/youtube/playlist.py +33 -0
- lfx/components/youtube/search.py +120 -0
- lfx/components/youtube/trending.py +285 -0
- lfx/components/youtube/video_details.py +263 -0
- lfx/components/youtube/youtube_transcripts.py +206 -0
- lfx/components/zep/__init__.py +3 -0
- lfx/components/zep/zep.py +45 -0
- lfx/constants.py +6 -0
- lfx/custom/__init__.py +7 -0
- lfx/custom/attributes.py +87 -0
- lfx/custom/code_parser/__init__.py +3 -0
- lfx/custom/code_parser/code_parser.py +361 -0
- lfx/custom/custom_component/__init__.py +0 -0
- lfx/custom/custom_component/base_component.py +128 -0
- lfx/custom/custom_component/component.py +1890 -0
- lfx/custom/custom_component/component_with_cache.py +8 -0
- lfx/custom/custom_component/custom_component.py +650 -0
- lfx/custom/dependency_analyzer.py +165 -0
- lfx/custom/directory_reader/__init__.py +3 -0
- lfx/custom/directory_reader/directory_reader.py +359 -0
- lfx/custom/directory_reader/utils.py +171 -0
- lfx/custom/eval.py +12 -0
- lfx/custom/schema.py +32 -0
- lfx/custom/tree_visitor.py +21 -0
- lfx/custom/utils.py +877 -0
- lfx/custom/validate.py +523 -0
- lfx/events/__init__.py +1 -0
- lfx/events/event_manager.py +110 -0
- lfx/exceptions/__init__.py +0 -0
- lfx/exceptions/component.py +15 -0
- lfx/field_typing/__init__.py +91 -0
- lfx/field_typing/constants.py +216 -0
- lfx/field_typing/range_spec.py +35 -0
- lfx/graph/__init__.py +6 -0
- lfx/graph/edge/__init__.py +0 -0
- lfx/graph/edge/base.py +300 -0
- lfx/graph/edge/schema.py +119 -0
- lfx/graph/edge/utils.py +0 -0
- lfx/graph/graph/__init__.py +0 -0
- lfx/graph/graph/ascii.py +202 -0
- lfx/graph/graph/base.py +2298 -0
- lfx/graph/graph/constants.py +63 -0
- lfx/graph/graph/runnable_vertices_manager.py +133 -0
- lfx/graph/graph/schema.py +53 -0
- lfx/graph/graph/state_model.py +66 -0
- lfx/graph/graph/utils.py +1024 -0
- lfx/graph/schema.py +75 -0
- lfx/graph/state/__init__.py +0 -0
- lfx/graph/state/model.py +250 -0
- lfx/graph/utils.py +206 -0
- lfx/graph/vertex/__init__.py +0 -0
- lfx/graph/vertex/base.py +826 -0
- lfx/graph/vertex/constants.py +0 -0
- lfx/graph/vertex/exceptions.py +4 -0
- lfx/graph/vertex/param_handler.py +316 -0
- lfx/graph/vertex/schema.py +26 -0
- lfx/graph/vertex/utils.py +19 -0
- lfx/graph/vertex/vertex_types.py +489 -0
- lfx/helpers/__init__.py +141 -0
- lfx/helpers/base_model.py +71 -0
- lfx/helpers/custom.py +13 -0
- lfx/helpers/data.py +167 -0
- lfx/helpers/flow.py +308 -0
- lfx/inputs/__init__.py +68 -0
- lfx/inputs/constants.py +2 -0
- lfx/inputs/input_mixin.py +352 -0
- lfx/inputs/inputs.py +718 -0
- lfx/inputs/validators.py +19 -0
- lfx/interface/__init__.py +6 -0
- lfx/interface/components.py +897 -0
- lfx/interface/importing/__init__.py +5 -0
- lfx/interface/importing/utils.py +39 -0
- lfx/interface/initialize/__init__.py +3 -0
- lfx/interface/initialize/loading.py +317 -0
- lfx/interface/listing.py +26 -0
- lfx/interface/run.py +16 -0
- lfx/interface/utils.py +111 -0
- lfx/io/__init__.py +63 -0
- lfx/io/schema.py +295 -0
- lfx/load/__init__.py +8 -0
- lfx/load/load.py +256 -0
- lfx/load/utils.py +99 -0
- lfx/log/__init__.py +5 -0
- lfx/log/logger.py +411 -0
- lfx/logging/__init__.py +11 -0
- lfx/logging/logger.py +24 -0
- lfx/memory/__init__.py +70 -0
- lfx/memory/stubs.py +302 -0
- lfx/processing/__init__.py +1 -0
- lfx/processing/process.py +238 -0
- lfx/processing/utils.py +25 -0
- lfx/py.typed +0 -0
- lfx/schema/__init__.py +66 -0
- lfx/schema/artifact.py +83 -0
- lfx/schema/content_block.py +62 -0
- lfx/schema/content_types.py +91 -0
- lfx/schema/cross_module.py +80 -0
- lfx/schema/data.py +309 -0
- lfx/schema/dataframe.py +210 -0
- lfx/schema/dotdict.py +74 -0
- lfx/schema/encoders.py +13 -0
- lfx/schema/graph.py +47 -0
- lfx/schema/image.py +184 -0
- lfx/schema/json_schema.py +186 -0
- lfx/schema/log.py +62 -0
- lfx/schema/message.py +493 -0
- lfx/schema/openai_responses_schemas.py +74 -0
- lfx/schema/properties.py +41 -0
- lfx/schema/schema.py +180 -0
- lfx/schema/serialize.py +13 -0
- lfx/schema/table.py +142 -0
- lfx/schema/validators.py +114 -0
- lfx/serialization/__init__.py +5 -0
- lfx/serialization/constants.py +2 -0
- lfx/serialization/serialization.py +314 -0
- lfx/services/__init__.py +26 -0
- lfx/services/base.py +28 -0
- lfx/services/cache/__init__.py +6 -0
- lfx/services/cache/base.py +183 -0
- lfx/services/cache/service.py +166 -0
- lfx/services/cache/utils.py +169 -0
- lfx/services/chat/__init__.py +1 -0
- lfx/services/chat/config.py +2 -0
- lfx/services/chat/schema.py +10 -0
- lfx/services/database/__init__.py +5 -0
- lfx/services/database/service.py +25 -0
- lfx/services/deps.py +194 -0
- lfx/services/factory.py +19 -0
- lfx/services/initialize.py +19 -0
- lfx/services/interfaces.py +103 -0
- lfx/services/manager.py +185 -0
- lfx/services/mcp_composer/__init__.py +6 -0
- lfx/services/mcp_composer/factory.py +16 -0
- lfx/services/mcp_composer/service.py +1441 -0
- lfx/services/schema.py +21 -0
- lfx/services/session.py +87 -0
- lfx/services/settings/__init__.py +3 -0
- lfx/services/settings/auth.py +133 -0
- lfx/services/settings/base.py +668 -0
- lfx/services/settings/constants.py +43 -0
- lfx/services/settings/factory.py +23 -0
- lfx/services/settings/feature_flags.py +11 -0
- lfx/services/settings/service.py +35 -0
- lfx/services/settings/utils.py +40 -0
- lfx/services/shared_component_cache/__init__.py +1 -0
- lfx/services/shared_component_cache/factory.py +30 -0
- lfx/services/shared_component_cache/service.py +9 -0
- lfx/services/storage/__init__.py +5 -0
- lfx/services/storage/local.py +185 -0
- lfx/services/storage/service.py +177 -0
- lfx/services/tracing/__init__.py +1 -0
- lfx/services/tracing/service.py +21 -0
- lfx/settings.py +6 -0
- lfx/template/__init__.py +6 -0
- lfx/template/field/__init__.py +0 -0
- lfx/template/field/base.py +260 -0
- lfx/template/field/prompt.py +15 -0
- lfx/template/frontend_node/__init__.py +6 -0
- lfx/template/frontend_node/base.py +214 -0
- lfx/template/frontend_node/constants.py +65 -0
- lfx/template/frontend_node/custom_components.py +79 -0
- lfx/template/template/__init__.py +0 -0
- lfx/template/template/base.py +100 -0
- lfx/template/utils.py +217 -0
- lfx/type_extraction/__init__.py +19 -0
- lfx/type_extraction/type_extraction.py +75 -0
- lfx/type_extraction.py +80 -0
- lfx/utils/__init__.py +1 -0
- lfx/utils/async_helpers.py +42 -0
- lfx/utils/component_utils.py +154 -0
- lfx/utils/concurrency.py +60 -0
- lfx/utils/connection_string_parser.py +11 -0
- lfx/utils/constants.py +233 -0
- lfx/utils/data_structure.py +212 -0
- lfx/utils/exceptions.py +22 -0
- lfx/utils/helpers.py +34 -0
- lfx/utils/image.py +79 -0
- lfx/utils/langflow_utils.py +52 -0
- lfx/utils/lazy_load.py +15 -0
- lfx/utils/request_utils.py +18 -0
- lfx/utils/schemas.py +139 -0
- lfx/utils/ssrf_protection.py +384 -0
- lfx/utils/util.py +626 -0
- lfx/utils/util_strings.py +56 -0
- lfx/utils/validate_cloud.py +26 -0
- lfx/utils/version.py +24 -0
- lfx_nightly-0.2.0.dev25.dist-info/METADATA +312 -0
- lfx_nightly-0.2.0.dev25.dist-info/RECORD +769 -0
- lfx_nightly-0.2.0.dev25.dist-info/WHEEL +4 -0
- lfx_nightly-0.2.0.dev25.dist-info/entry_points.txt +2 -0
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import tempfile
|
|
2
|
+
|
|
3
|
+
from lfx.custom.custom_component.component import Component
|
|
4
|
+
from lfx.io import Output, SecretStrInput, StrInput
|
|
5
|
+
from lfx.schema.data import Data
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class JigsawStackFileReadComponent(Component):
|
|
9
|
+
display_name = "File Read"
|
|
10
|
+
description = "Read any previously uploaded file seamlessly from \
|
|
11
|
+
JigsawStack File Storage and use it in your AI applications."
|
|
12
|
+
documentation = "https://jigsawstack.com/docs/api-reference/store/file/get"
|
|
13
|
+
icon = "JigsawStack"
|
|
14
|
+
name = "JigsawStackFileRead"
|
|
15
|
+
|
|
16
|
+
inputs = [
|
|
17
|
+
SecretStrInput(
|
|
18
|
+
name="api_key",
|
|
19
|
+
display_name="JigsawStack API Key",
|
|
20
|
+
info="Your JigsawStack API key for authentication",
|
|
21
|
+
required=True,
|
|
22
|
+
),
|
|
23
|
+
StrInput(
|
|
24
|
+
name="key",
|
|
25
|
+
display_name="Key",
|
|
26
|
+
info="The key used to retrieve the file from JigsawStack File Storage.",
|
|
27
|
+
required=True,
|
|
28
|
+
tool_mode=True,
|
|
29
|
+
),
|
|
30
|
+
]
|
|
31
|
+
|
|
32
|
+
outputs = [
|
|
33
|
+
Output(display_name="File Path", name="file_path", method="read_and_save_file"),
|
|
34
|
+
]
|
|
35
|
+
|
|
36
|
+
def read_and_save_file(self) -> Data:
|
|
37
|
+
"""Read file from JigsawStack and save to temp file, return file path."""
|
|
38
|
+
try:
|
|
39
|
+
from jigsawstack import JigsawStack, JigsawStackError
|
|
40
|
+
except ImportError as e:
|
|
41
|
+
jigsawstack_import_error = (
|
|
42
|
+
"JigsawStack package not found. Please install it using: pip install jigsawstack>=0.2.7"
|
|
43
|
+
)
|
|
44
|
+
raise ImportError(jigsawstack_import_error) from e
|
|
45
|
+
|
|
46
|
+
try:
|
|
47
|
+
client = JigsawStack(api_key=self.api_key)
|
|
48
|
+
if not self.key or self.key.strip() == "":
|
|
49
|
+
invalid_key_error = "Key is required to read a file from JigsawStack File Storage."
|
|
50
|
+
raise ValueError(invalid_key_error)
|
|
51
|
+
|
|
52
|
+
# Download file content
|
|
53
|
+
response = client.store.get(self.key)
|
|
54
|
+
|
|
55
|
+
# Determine file extension
|
|
56
|
+
file_extension = self._detect_file_extension(response)
|
|
57
|
+
|
|
58
|
+
# Create temporary file
|
|
59
|
+
with tempfile.NamedTemporaryFile(
|
|
60
|
+
delete=False, suffix=file_extension, prefix=f"jigsawstack_{self.key}_"
|
|
61
|
+
) as temp_file:
|
|
62
|
+
if isinstance(response, bytes):
|
|
63
|
+
temp_file.write(response)
|
|
64
|
+
else:
|
|
65
|
+
# Handle string content
|
|
66
|
+
temp_file.write(response.encode("utf-8"))
|
|
67
|
+
|
|
68
|
+
temp_path = temp_file.name
|
|
69
|
+
|
|
70
|
+
return Data(
|
|
71
|
+
data={
|
|
72
|
+
"file_path": temp_path,
|
|
73
|
+
"key": self.key,
|
|
74
|
+
"file_extension": file_extension,
|
|
75
|
+
"size": len(response) if isinstance(response, bytes) else len(str(response)),
|
|
76
|
+
"success": True,
|
|
77
|
+
}
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
except JigsawStackError as e:
|
|
81
|
+
error_data = {"error": str(e), "success": False}
|
|
82
|
+
self.status = f"Error: {e!s}"
|
|
83
|
+
return Data(data=error_data)
|
|
84
|
+
|
|
85
|
+
def _detect_file_extension(self, content) -> str:
|
|
86
|
+
"""Detect file extension based on content headers."""
|
|
87
|
+
if isinstance(content, bytes):
|
|
88
|
+
# Check magic numbers for common file types
|
|
89
|
+
if content.startswith(b"\xff\xd8\xff"):
|
|
90
|
+
return ".jpg"
|
|
91
|
+
if content.startswith(b"\x89PNG\r\n\x1a\n"):
|
|
92
|
+
return ".png"
|
|
93
|
+
if content.startswith((b"GIF87a", b"GIF89a")):
|
|
94
|
+
return ".gif"
|
|
95
|
+
if content.startswith(b"%PDF"):
|
|
96
|
+
return ".pdf"
|
|
97
|
+
if content.startswith(b"PK\x03\x04"): # ZIP/DOCX/XLSX
|
|
98
|
+
return ".zip"
|
|
99
|
+
if content.startswith(b"\x00\x00\x01\x00"): # ICO
|
|
100
|
+
return ".ico"
|
|
101
|
+
if content.startswith(b"RIFF") and b"WEBP" in content[:12]:
|
|
102
|
+
return ".webp"
|
|
103
|
+
if content.startswith((b"\xff\xfb", b"\xff\xf3", b"\xff\xf2")):
|
|
104
|
+
return ".mp3"
|
|
105
|
+
if content.startswith((b"ftypmp4", b"\x00\x00\x00\x20ftypmp4")):
|
|
106
|
+
return ".mp4"
|
|
107
|
+
# Try to decode as text
|
|
108
|
+
try:
|
|
109
|
+
content.decode("utf-8")
|
|
110
|
+
return ".txt" # noqa: TRY300
|
|
111
|
+
except UnicodeDecodeError:
|
|
112
|
+
return ".bin" # Binary file
|
|
113
|
+
else:
|
|
114
|
+
# String content
|
|
115
|
+
return ".txt"
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
from pathlib import Path
|
|
2
|
+
|
|
3
|
+
from lfx.custom.custom_component.component import Component
|
|
4
|
+
from lfx.io import BoolInput, FileInput, Output, SecretStrInput, StrInput
|
|
5
|
+
from lfx.schema.data import Data
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class JigsawStackFileUploadComponent(Component):
|
|
9
|
+
display_name = "File Upload"
|
|
10
|
+
description = "Store any file seamlessly on JigsawStack File Storage and use it in your AI applications. \
|
|
11
|
+
Supports various file types including images, documents, and more."
|
|
12
|
+
documentation = "https://jigsawstack.com/docs/api-reference/store/file/add"
|
|
13
|
+
icon = "JigsawStack"
|
|
14
|
+
name = "JigsawStackFileUpload"
|
|
15
|
+
|
|
16
|
+
inputs = [
|
|
17
|
+
SecretStrInput(
|
|
18
|
+
name="api_key",
|
|
19
|
+
display_name="JigsawStack API Key",
|
|
20
|
+
info="Your JigsawStack API key for authentication",
|
|
21
|
+
required=True,
|
|
22
|
+
),
|
|
23
|
+
FileInput(
|
|
24
|
+
name="file",
|
|
25
|
+
display_name="File",
|
|
26
|
+
info="Upload file to be stored on JigsawStack File Storage.",
|
|
27
|
+
required=True,
|
|
28
|
+
file_types=["pdf", "png", "jpg", "jpeg", "mp4", "mp3", "txt", "docx", "xlsx"],
|
|
29
|
+
),
|
|
30
|
+
StrInput(
|
|
31
|
+
name="key",
|
|
32
|
+
display_name="Key",
|
|
33
|
+
info="The key used to store the file on JigsawStack File Storage. \
|
|
34
|
+
If not provided, a unique key will be generated.",
|
|
35
|
+
required=False,
|
|
36
|
+
tool_mode=True,
|
|
37
|
+
),
|
|
38
|
+
BoolInput(
|
|
39
|
+
name="overwrite",
|
|
40
|
+
display_name="Overwrite Existing File",
|
|
41
|
+
info="If true, will overwrite the existing file with the same key. \
|
|
42
|
+
If false, will return an error if the file already exists.",
|
|
43
|
+
required=False,
|
|
44
|
+
value=True,
|
|
45
|
+
),
|
|
46
|
+
BoolInput(
|
|
47
|
+
name="temp_public_url",
|
|
48
|
+
display_name="Return Temporary Public URL",
|
|
49
|
+
info="If true, will return a temporary public URL which lasts for a limited time. \
|
|
50
|
+
If false, will return the file store key which can only be accessed by the owner.",
|
|
51
|
+
required=False,
|
|
52
|
+
value=False,
|
|
53
|
+
tool_mode=True,
|
|
54
|
+
),
|
|
55
|
+
]
|
|
56
|
+
|
|
57
|
+
outputs = [
|
|
58
|
+
Output(display_name="File Store Result", name="file_upload_result", method="upload_file"),
|
|
59
|
+
]
|
|
60
|
+
|
|
61
|
+
def upload_file(self) -> Data:
|
|
62
|
+
try:
|
|
63
|
+
from jigsawstack import JigsawStack, JigsawStackError
|
|
64
|
+
except ImportError as e:
|
|
65
|
+
jigsawstack_import_error = (
|
|
66
|
+
"JigsawStack package not found. Please install it using: pip install jigsawstack>=0.2.7"
|
|
67
|
+
)
|
|
68
|
+
raise ImportError(jigsawstack_import_error) from e
|
|
69
|
+
|
|
70
|
+
try:
|
|
71
|
+
client = JigsawStack(api_key=self.api_key)
|
|
72
|
+
|
|
73
|
+
file_path = Path(self.file)
|
|
74
|
+
with Path.open(file_path, "rb") as f:
|
|
75
|
+
file_content = f.read()
|
|
76
|
+
params = {}
|
|
77
|
+
|
|
78
|
+
if self.key:
|
|
79
|
+
# if key is provided, use it as the file store key
|
|
80
|
+
params["key"] = self.key
|
|
81
|
+
if self.overwrite is not None:
|
|
82
|
+
# if overwrite is provided, use it to determine if the file should be overwritten
|
|
83
|
+
params["overwrite"] = self.overwrite
|
|
84
|
+
if self.temp_public_url is not None:
|
|
85
|
+
# if temp_public_url is provided, use it to determine if a temporary public URL should
|
|
86
|
+
params["temp_public_url"] = self.temp_public_url
|
|
87
|
+
|
|
88
|
+
response = client.store.upload(file_content, params)
|
|
89
|
+
return Data(data=response)
|
|
90
|
+
|
|
91
|
+
except JigsawStackError as e:
|
|
92
|
+
error_data = {"error": str(e), "success": False}
|
|
93
|
+
self.status = f"Error: {e!s}"
|
|
94
|
+
return Data(data=error_data)
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
from lfx.custom.custom_component.component import Component
|
|
2
|
+
from lfx.io import DropdownInput, IntInput, MessageTextInput, Output, SecretStrInput
|
|
3
|
+
from lfx.schema.data import Data
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class JigsawStackImageGenerationComponent(Component):
|
|
7
|
+
display_name = "Image Generation"
|
|
8
|
+
description = "Generate an image based on the given text by employing AI models like Flux, \
|
|
9
|
+
Stable Diffusion, and other top models."
|
|
10
|
+
documentation = "https://jigsawstack.com/docs/api-reference/ai/image-generation"
|
|
11
|
+
icon = "JigsawStack"
|
|
12
|
+
name = "JigsawStackImageGeneration"
|
|
13
|
+
|
|
14
|
+
inputs = [
|
|
15
|
+
SecretStrInput(
|
|
16
|
+
name="api_key",
|
|
17
|
+
display_name="JigsawStack API Key",
|
|
18
|
+
info="Your JigsawStack API key for authentication",
|
|
19
|
+
required=True,
|
|
20
|
+
),
|
|
21
|
+
MessageTextInput(
|
|
22
|
+
name="prompt",
|
|
23
|
+
display_name="Prompt",
|
|
24
|
+
info="The text prompt to generate the image from. Must be between 1-5000 characters.",
|
|
25
|
+
required=True,
|
|
26
|
+
tool_mode=True,
|
|
27
|
+
),
|
|
28
|
+
MessageTextInput(
|
|
29
|
+
name="aspect_ratio",
|
|
30
|
+
display_name="Aspect Ratio",
|
|
31
|
+
info="The aspect ratio of the generated image. Must be one of the following:\
|
|
32
|
+
'1:1', '16:9', '21:9', '3:2', '2:3', '4:5', '5:4', '3:4', '4:3', '9:16', '9:21' \
|
|
33
|
+
Default is 1:1.",
|
|
34
|
+
required=False,
|
|
35
|
+
tool_mode=True,
|
|
36
|
+
),
|
|
37
|
+
MessageTextInput(
|
|
38
|
+
name="url",
|
|
39
|
+
display_name="URL",
|
|
40
|
+
info="A valid URL where the generated image will be sent.",
|
|
41
|
+
required=False,
|
|
42
|
+
),
|
|
43
|
+
MessageTextInput(
|
|
44
|
+
name="file_store_key",
|
|
45
|
+
display_name="File Store Key",
|
|
46
|
+
info="The key used to store the image on Jigsawstack File Storage. Not required if url is specified.",
|
|
47
|
+
required=False,
|
|
48
|
+
tool_mode=True,
|
|
49
|
+
),
|
|
50
|
+
IntInput(
|
|
51
|
+
name="width",
|
|
52
|
+
display_name="Width",
|
|
53
|
+
info="The width of the image. Must be between 256-1920 pixels.",
|
|
54
|
+
required=False,
|
|
55
|
+
),
|
|
56
|
+
IntInput(
|
|
57
|
+
name="height",
|
|
58
|
+
display_name="Height",
|
|
59
|
+
info="The height of the image. Must be between 256-1920 pixels.",
|
|
60
|
+
required=False,
|
|
61
|
+
),
|
|
62
|
+
IntInput(
|
|
63
|
+
name="steps",
|
|
64
|
+
display_name="Steps",
|
|
65
|
+
info="The number of denoising steps. Must be between 1-90. \
|
|
66
|
+
Higher values produce better quality images but take more time to generate.",
|
|
67
|
+
required=False,
|
|
68
|
+
),
|
|
69
|
+
DropdownInput(
|
|
70
|
+
name="output_format",
|
|
71
|
+
display_name="Output Format",
|
|
72
|
+
info="The output format of the generated image. Must be one of the following values:\
|
|
73
|
+
png or svg",
|
|
74
|
+
required=False,
|
|
75
|
+
options=["png", "svg"],
|
|
76
|
+
value="png",
|
|
77
|
+
),
|
|
78
|
+
MessageTextInput(
|
|
79
|
+
name="negative_prompt",
|
|
80
|
+
display_name="Negative Prompt",
|
|
81
|
+
info="The text prompt to avoid in the generated image. \
|
|
82
|
+
Must be between 1-5000 characters.",
|
|
83
|
+
required=False,
|
|
84
|
+
tool_mode=True,
|
|
85
|
+
advanced=True,
|
|
86
|
+
),
|
|
87
|
+
IntInput(
|
|
88
|
+
name="seed",
|
|
89
|
+
display_name="Seed",
|
|
90
|
+
info="Makes generation deterministic.\
|
|
91
|
+
Using the same seed and set of parameters will produce identical image each time.",
|
|
92
|
+
required=False,
|
|
93
|
+
tool_mode=True,
|
|
94
|
+
advanced=True,
|
|
95
|
+
),
|
|
96
|
+
IntInput(
|
|
97
|
+
name="guidance",
|
|
98
|
+
display_name="Guidance Scale",
|
|
99
|
+
info="Higher guidance forces the model to better follow the prompt, \
|
|
100
|
+
but may result in lower quality output. Must be between 1-28.",
|
|
101
|
+
required=False,
|
|
102
|
+
tool_mode=True,
|
|
103
|
+
advanced=True,
|
|
104
|
+
),
|
|
105
|
+
]
|
|
106
|
+
|
|
107
|
+
outputs = [
|
|
108
|
+
Output(display_name="Image Generation Results", name="image_generation_results", method="generate_image"),
|
|
109
|
+
]
|
|
110
|
+
|
|
111
|
+
def generate_image(self) -> Data:
|
|
112
|
+
try:
|
|
113
|
+
from jigsawstack import JigsawStack, JigsawStackError
|
|
114
|
+
except ImportError as e:
|
|
115
|
+
jigsawstack_import_error = (
|
|
116
|
+
"JigsawStack package not found. Please install it using: pip install jigsawstack>=0.2.7"
|
|
117
|
+
)
|
|
118
|
+
raise ImportError(jigsawstack_import_error) from e
|
|
119
|
+
|
|
120
|
+
try:
|
|
121
|
+
min_character_length = 1
|
|
122
|
+
max_character_length = 5000
|
|
123
|
+
min_width = 256
|
|
124
|
+
max_width = 1920
|
|
125
|
+
min_height = 256
|
|
126
|
+
max_height = 1920
|
|
127
|
+
min_steps = 1
|
|
128
|
+
max_steps = 90
|
|
129
|
+
client = JigsawStack(api_key=self.api_key)
|
|
130
|
+
|
|
131
|
+
if not self.prompt or len(self.prompt) < min_character_length or len(self.prompt) > max_character_length:
|
|
132
|
+
invalid_prompt_error = f"Prompts must be between \
|
|
133
|
+
{min_character_length}-{max_character_length} characters."
|
|
134
|
+
raise ValueError(invalid_prompt_error)
|
|
135
|
+
|
|
136
|
+
if self.aspect_ratio and self.aspect_ratio not in [
|
|
137
|
+
"1:1",
|
|
138
|
+
"16:9",
|
|
139
|
+
"21:9",
|
|
140
|
+
"3:2",
|
|
141
|
+
"2:3",
|
|
142
|
+
"4:5",
|
|
143
|
+
"5:4",
|
|
144
|
+
"3:4",
|
|
145
|
+
"4:3",
|
|
146
|
+
"9:16",
|
|
147
|
+
"9:21",
|
|
148
|
+
]:
|
|
149
|
+
invalid_aspect_ratio_error = (
|
|
150
|
+
"Aspect ratio must be one of the following: '1:1', '16:9', '21:9', '3:2', '2:3', "
|
|
151
|
+
"'4:5', '5:4', '3:4', '4:3', '9:16', '9:21'."
|
|
152
|
+
)
|
|
153
|
+
raise ValueError(invalid_aspect_ratio_error)
|
|
154
|
+
if self.width and (self.width < min_width or self.width > max_width):
|
|
155
|
+
invalid_width_error = f"Width must be between {min_width}-{max_width} pixels."
|
|
156
|
+
raise ValueError(invalid_width_error)
|
|
157
|
+
if self.height and (self.height < min_height or self.height > max_height):
|
|
158
|
+
invalid_height_error = f"Height must be between {min_height}-{max_height} pixels."
|
|
159
|
+
raise ValueError(invalid_height_error)
|
|
160
|
+
if self.steps and (self.steps < min_steps or self.steps > max_steps):
|
|
161
|
+
invalid_steps_error = f"Steps must be between {min_steps}-{max_steps}."
|
|
162
|
+
raise ValueError(invalid_steps_error)
|
|
163
|
+
|
|
164
|
+
params = {}
|
|
165
|
+
if self.prompt:
|
|
166
|
+
params["prompt"] = self.prompt.strip()
|
|
167
|
+
if self.aspect_ratio:
|
|
168
|
+
params["aspect_ratio"] = self.aspect_ratio.strip()
|
|
169
|
+
if self.url:
|
|
170
|
+
params["url"] = self.url.strip()
|
|
171
|
+
if self.file_store_key:
|
|
172
|
+
params["file_store_key"] = self.file_store_key.strip()
|
|
173
|
+
if self.width:
|
|
174
|
+
params["width"] = self.width
|
|
175
|
+
if self.height:
|
|
176
|
+
params["height"] = self.height
|
|
177
|
+
params["return_type"] = "url"
|
|
178
|
+
if self.output_format:
|
|
179
|
+
params["output_format"] = self.output_format.strip()
|
|
180
|
+
if self.steps:
|
|
181
|
+
params["steps"] = self.steps
|
|
182
|
+
|
|
183
|
+
# Initialize advance_config if any advanced parameters are provided
|
|
184
|
+
if self.negative_prompt or self.seed or self.guidance:
|
|
185
|
+
params["advance_config"] = {}
|
|
186
|
+
if self.negative_prompt:
|
|
187
|
+
params["advance_config"]["negative_prompt"] = self.negative_prompt
|
|
188
|
+
if self.seed:
|
|
189
|
+
params["advance_config"]["seed"] = self.seed
|
|
190
|
+
if self.guidance:
|
|
191
|
+
params["advance_config"]["guidance"] = self.guidance
|
|
192
|
+
|
|
193
|
+
# Call image generation
|
|
194
|
+
response = client.image_generation(params)
|
|
195
|
+
|
|
196
|
+
if response.get("url", None) is None or response.get("url", None).strip() == "":
|
|
197
|
+
failed_response_error = "JigsawStack API returned unsuccessful response"
|
|
198
|
+
raise ValueError(failed_response_error)
|
|
199
|
+
|
|
200
|
+
return Data(data=response)
|
|
201
|
+
|
|
202
|
+
except JigsawStackError as e:
|
|
203
|
+
error_data = {"error": str(e), "success": False}
|
|
204
|
+
self.status = f"Error: {e!s}"
|
|
205
|
+
return Data(data=error_data)
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
from lfx.custom.custom_component.component import Component
|
|
2
|
+
from lfx.io import Output, SecretStrInput, StrInput
|
|
3
|
+
from lfx.schema.data import Data
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class JigsawStackNSFWComponent(Component):
|
|
7
|
+
display_name = "NSFW Detection"
|
|
8
|
+
description = "Detect if image/video contains NSFW content"
|
|
9
|
+
documentation = "https://jigsawstack.com/docs/api-reference/ai/nsfw"
|
|
10
|
+
icon = "JigsawStack"
|
|
11
|
+
name = "JigsawStackNSFW"
|
|
12
|
+
|
|
13
|
+
inputs = [
|
|
14
|
+
SecretStrInput(
|
|
15
|
+
name="api_key",
|
|
16
|
+
display_name="JigsawStack API Key",
|
|
17
|
+
info="Your JigsawStack API key for authentication",
|
|
18
|
+
required=True,
|
|
19
|
+
),
|
|
20
|
+
StrInput(
|
|
21
|
+
name="url",
|
|
22
|
+
display_name="URL",
|
|
23
|
+
info="URL of the image or video to analyze",
|
|
24
|
+
required=True,
|
|
25
|
+
),
|
|
26
|
+
]
|
|
27
|
+
|
|
28
|
+
outputs = [
|
|
29
|
+
Output(display_name="NSFW Analysis", name="nsfw_result", method="detect_nsfw"),
|
|
30
|
+
]
|
|
31
|
+
|
|
32
|
+
def detect_nsfw(self) -> Data:
|
|
33
|
+
try:
|
|
34
|
+
from jigsawstack import JigsawStack, JigsawStackError
|
|
35
|
+
except ImportError as e:
|
|
36
|
+
jigsawstack_import_error = (
|
|
37
|
+
"JigsawStack package not found. Please install it using: pip install jigsawstack>=0.2.7"
|
|
38
|
+
)
|
|
39
|
+
raise ImportError(jigsawstack_import_error) from e
|
|
40
|
+
|
|
41
|
+
try:
|
|
42
|
+
client = JigsawStack(api_key=self.api_key)
|
|
43
|
+
|
|
44
|
+
# Build request parameters
|
|
45
|
+
params = {"url": self.url}
|
|
46
|
+
|
|
47
|
+
response = client.validate.nsfw(params)
|
|
48
|
+
|
|
49
|
+
api_error_msg = "JigsawStack API returned unsuccessful response"
|
|
50
|
+
if not response.get("success", False):
|
|
51
|
+
raise ValueError(api_error_msg)
|
|
52
|
+
|
|
53
|
+
return Data(data=response)
|
|
54
|
+
|
|
55
|
+
except ValueError:
|
|
56
|
+
raise
|
|
57
|
+
except JigsawStackError as e:
|
|
58
|
+
error_data = {"error": str(e), "success": False}
|
|
59
|
+
self.status = f"Error: {e!s}"
|
|
60
|
+
return Data(data=error_data)
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
from lfx.custom.custom_component.component import Component
|
|
2
|
+
from lfx.io import BoolInput, DropdownInput, MessageTextInput, Output, SecretStrInput
|
|
3
|
+
from lfx.schema.data import Data
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class JigsawStackObjectDetectionComponent(Component):
|
|
7
|
+
display_name = "Object Detection"
|
|
8
|
+
description = "Perform object detection on images using JigsawStack's Object Detection Model, \
|
|
9
|
+
capable of image grounding, segmentation and computer use."
|
|
10
|
+
documentation = "https://jigsawstack.com/docs/api-reference/ai/object-detection"
|
|
11
|
+
icon = "JigsawStack"
|
|
12
|
+
name = "JigsawStackObjectDetection"
|
|
13
|
+
|
|
14
|
+
inputs = [
|
|
15
|
+
SecretStrInput(
|
|
16
|
+
name="api_key",
|
|
17
|
+
display_name="JigsawStack API Key",
|
|
18
|
+
info="Your JigsawStack API key for authentication",
|
|
19
|
+
required=True,
|
|
20
|
+
),
|
|
21
|
+
MessageTextInput(
|
|
22
|
+
name="prompts",
|
|
23
|
+
display_name="Prompts",
|
|
24
|
+
info="The prompts to ground the object detection model. \
|
|
25
|
+
You can pass a list of comma-separated prompts to extract different information from the image.",
|
|
26
|
+
required=False,
|
|
27
|
+
tool_mode=True,
|
|
28
|
+
),
|
|
29
|
+
MessageTextInput(
|
|
30
|
+
name="url",
|
|
31
|
+
display_name="URL",
|
|
32
|
+
info="The image URL. Not required if file_store_key is specified.",
|
|
33
|
+
required=False,
|
|
34
|
+
tool_mode=True,
|
|
35
|
+
),
|
|
36
|
+
MessageTextInput(
|
|
37
|
+
name="file_store_key",
|
|
38
|
+
display_name="File Store Key",
|
|
39
|
+
info="The key used to store the image on Jigsawstack File Storage. Not required if url is specified.",
|
|
40
|
+
required=False,
|
|
41
|
+
tool_mode=True,
|
|
42
|
+
),
|
|
43
|
+
BoolInput(
|
|
44
|
+
name="annotated_image",
|
|
45
|
+
display_name="Return Annotated Image",
|
|
46
|
+
info="If true, will return an url for annotated image with detected objects.",
|
|
47
|
+
required=False,
|
|
48
|
+
value=True,
|
|
49
|
+
),
|
|
50
|
+
DropdownInput(
|
|
51
|
+
name="features",
|
|
52
|
+
display_name="Features",
|
|
53
|
+
info="Select the features to enable for object detection",
|
|
54
|
+
required=False,
|
|
55
|
+
options=["object_detection", "gui"],
|
|
56
|
+
value=["object_detection", "gui"],
|
|
57
|
+
),
|
|
58
|
+
DropdownInput(
|
|
59
|
+
name="return_type",
|
|
60
|
+
display_name="Return Type",
|
|
61
|
+
info="Select the return type for the object detection results such as masks or annotations.",
|
|
62
|
+
required=False,
|
|
63
|
+
options=["url", "base64"],
|
|
64
|
+
value="url",
|
|
65
|
+
),
|
|
66
|
+
]
|
|
67
|
+
|
|
68
|
+
outputs = [
|
|
69
|
+
Output(display_name="Object Detection results", name="object_detection_results", method="detect_objects"),
|
|
70
|
+
]
|
|
71
|
+
|
|
72
|
+
def detect_objects(self) -> Data:
|
|
73
|
+
try:
|
|
74
|
+
from jigsawstack import JigsawStack, JigsawStackError
|
|
75
|
+
except ImportError as e:
|
|
76
|
+
jigsawstack_import_error = (
|
|
77
|
+
"JigsawStack package not found. Please install it using: pip install jigsawstack>=0.2.7"
|
|
78
|
+
)
|
|
79
|
+
raise ImportError(jigsawstack_import_error) from e
|
|
80
|
+
|
|
81
|
+
try:
|
|
82
|
+
client = JigsawStack(api_key=self.api_key)
|
|
83
|
+
|
|
84
|
+
# build request object
|
|
85
|
+
params = {}
|
|
86
|
+
if self.prompts:
|
|
87
|
+
if isinstance(self.prompts, list):
|
|
88
|
+
params["prompt"] = self.prompts
|
|
89
|
+
elif isinstance(self.prompts, str):
|
|
90
|
+
if "," in self.prompts:
|
|
91
|
+
# Split by comma and strip whitespace
|
|
92
|
+
params["prompt"] = [p.strip() for p in self.prompts.split(",")]
|
|
93
|
+
else:
|
|
94
|
+
params["prompt"] = [self.prompts.strip()]
|
|
95
|
+
else:
|
|
96
|
+
invalid_prompt_error = "Prompt must be a list of strings or a single string"
|
|
97
|
+
raise ValueError(invalid_prompt_error)
|
|
98
|
+
if self.url:
|
|
99
|
+
params["url"] = self.url
|
|
100
|
+
if self.file_store_key:
|
|
101
|
+
params["file_store_key"] = self.file_store_key
|
|
102
|
+
|
|
103
|
+
# if both url and file_store_key are not provided, raise an error
|
|
104
|
+
if not self.url and not self.file_store_key:
|
|
105
|
+
missing_url_error = "Either URL or File Store Key must be provided to perform object detection"
|
|
106
|
+
raise ValueError(missing_url_error)
|
|
107
|
+
|
|
108
|
+
params["annotated_image"] = self.annotated_image
|
|
109
|
+
if self.features:
|
|
110
|
+
params["features"] = self.features
|
|
111
|
+
|
|
112
|
+
# Call web scraping
|
|
113
|
+
response = client.vision.object_detection(params)
|
|
114
|
+
|
|
115
|
+
if not response.get("success", False):
|
|
116
|
+
failed_response_error = "JigsawStack API returned unsuccessful response"
|
|
117
|
+
raise ValueError(failed_response_error)
|
|
118
|
+
|
|
119
|
+
return Data(data=response)
|
|
120
|
+
|
|
121
|
+
except JigsawStackError as e:
|
|
122
|
+
error_data = {"error": str(e), "success": False}
|
|
123
|
+
self.status = f"Error: {e!s}"
|
|
124
|
+
return Data(data=error_data)
|