{
  "schema_version": "1",
  "generated_at": "2026-07-14T12:51:45.566Z",
  "nodes": [
    {
      "type": "apify.scraping.ApifyAmazonScraper",
      "title": "Apify Amazon Scraper",
      "namespace": "apify.scraping",
      "description": "Scrape Amazon product data including prices, ratings, seller information, and customer reviews.\n    apify, amazon, ecommerce, products, scraping, prices, reviews",
      "inputs": [
        {
          "name": "search_queries",
          "type": "list[str]",
          "description": "List of search queries to execute on Amazon",
          "required": false,
          "default": null
        },
        {
          "name": "product_urls",
          "type": "list[str]",
          "description": "List of Amazon product URLs to scrape",
          "required": false,
          "default": null
        },
        {
          "name": "country_code",
          "type": "str",
          "description": "Amazon country code (US, UK, DE, FR, ES, IT, etc.)",
          "required": false,
          "default": "US"
        },
        {
          "name": "max_items",
          "type": "int",
          "description": "Maximum number of products to scrape per search",
          "required": false,
          "default": 20
        },
        {
          "name": "scrape_reviews",
          "type": "bool",
          "description": "Whether to scrape product reviews",
          "required": false,
          "default": false
        },
        {
          "name": "wait_for_finish",
          "type": "int",
          "description": "Maximum time to wait for scraping to complete (seconds)",
          "required": false,
          "default": 600
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "list[dict[str, any]]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/apify/scraping/apifyamazonscraper",
      "markdown_url": "https://docs.nodetool.ai/nodes/apify/scraping/apifyamazonscraper.md"
    },
    {
      "type": "apify.scraping.ApifyGoogleSearchScraper",
      "title": "Apify Google Search Scraper",
      "namespace": "apify.scraping",
      "description": "Scrape Google Search results using Apify — organic results, ads, related searches, and more.\n    apify, google, search, serp, scraping, seo",
      "inputs": [
        {
          "name": "queries",
          "type": "list[str]",
          "description": "List of search queries to execute",
          "required": false,
          "default": null
        },
        {
          "name": "country_code",
          "type": "str",
          "description": "Country code for Google search (e.g., 'us', 'uk', 'de')",
          "required": false,
          "default": "us"
        },
        {
          "name": "language_code",
          "type": "str",
          "description": "Language code for results (e.g., 'en', 'es', 'fr')",
          "required": false,
          "default": "en"
        },
        {
          "name": "max_pages",
          "type": "int",
          "description": "Maximum number of result pages per query",
          "required": false,
          "default": 1
        },
        {
          "name": "results_per_page",
          "type": "int",
          "description": "Number of results per page (10-100)",
          "required": false,
          "default": 100
        },
        {
          "name": "wait_for_finish",
          "type": "int",
          "description": "Maximum time to wait for scraping to complete (seconds)",
          "required": false,
          "default": 300
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "list[dict[str, any]]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/apify/scraping/apifygooglesearchscraper",
      "markdown_url": "https://docs.nodetool.ai/nodes/apify/scraping/apifygooglesearchscraper.md"
    },
    {
      "type": "apify.scraping.ApifyInstagramScraper",
      "title": "Apify Instagram Scraper",
      "namespace": "apify.scraping",
      "description": "Scrape Instagram profiles, posts, comments, and hashtags — user data, post details, and engagement metrics.\n    apify, instagram, social, media, scraping, posts, profiles",
      "inputs": [
        {
          "name": "usernames",
          "type": "list[str]",
          "description": "List of Instagram usernames to scrape",
          "required": false,
          "default": null
        },
        {
          "name": "hashtags",
          "type": "list[str]",
          "description": "List of hashtags to scrape",
          "required": false,
          "default": null
        },
        {
          "name": "results_limit",
          "type": "int",
          "description": "Maximum number of posts to scrape per profile/hashtag",
          "required": false,
          "default": 50
        },
        {
          "name": "scrape_comments",
          "type": "bool",
          "description": "Whether to scrape comments on posts",
          "required": false,
          "default": false
        },
        {
          "name": "scrape_likes",
          "type": "bool",
          "description": "Whether to scrape likes on posts",
          "required": false,
          "default": false
        },
        {
          "name": "wait_for_finish",
          "type": "int",
          "description": "Maximum time to wait for scraping to complete (seconds)",
          "required": false,
          "default": 600
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "list[dict[str, any]]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/apify/scraping/apifyinstagramscraper",
      "markdown_url": "https://docs.nodetool.ai/nodes/apify/scraping/apifyinstagramscraper.md"
    },
    {
      "type": "apify.scraping.ApifyLinkedInScraper",
      "title": "Apify Linked In Scraper",
      "namespace": "apify.scraping",
      "description": "Scrape LinkedIn profiles, company pages, and job postings — professional info, connections, and company data.\n    apify, linkedin, professional, social, scraping, profiles, jobs",
      "inputs": [
        {
          "name": "profile_urls",
          "type": "list[str]",
          "description": "List of LinkedIn profile URLs to scrape",
          "required": false,
          "default": null
        },
        {
          "name": "company_urls",
          "type": "list[str]",
          "description": "List of LinkedIn company page URLs to scrape",
          "required": false,
          "default": null
        },
        {
          "name": "job_search_urls",
          "type": "list[str]",
          "description": "List of LinkedIn job search URLs",
          "required": false,
          "default": null
        },
        {
          "name": "max_results",
          "type": "int",
          "description": "Maximum number of results to scrape",
          "required": false,
          "default": 50
        },
        {
          "name": "wait_for_finish",
          "type": "int",
          "description": "Maximum time to wait for scraping to complete (seconds)",
          "required": false,
          "default": 600
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "list[dict[str, any]]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/apify/scraping/apifylinkedinscraper",
      "markdown_url": "https://docs.nodetool.ai/nodes/apify/scraping/apifylinkedinscraper.md"
    },
    {
      "type": "apify.scraping.ApifyTwitterScraper",
      "title": "Apify Twitter Scraper",
      "namespace": "apify.scraping",
      "description": "Scrape Twitter/X posts, profiles, and followers — tweets, user information, and engagement metrics.\n    apify, twitter, x, social, media, scraping, tweets, posts",
      "inputs": [
        {
          "name": "search_terms",
          "type": "list[str]",
          "description": "List of search terms to find tweets",
          "required": false,
          "default": null
        },
        {
          "name": "usernames",
          "type": "list[str]",
          "description": "List of Twitter usernames to scrape",
          "required": false,
          "default": null
        },
        {
          "name": "tweet_urls",
          "type": "list[str]",
          "description": "List of specific tweet URLs to scrape",
          "required": false,
          "default": null
        },
        {
          "name": "max_tweets",
          "type": "int",
          "description": "Maximum number of tweets to scrape",
          "required": false,
          "default": 100
        },
        {
          "name": "wait_for_finish",
          "type": "int",
          "description": "Maximum time to wait for scraping to complete (seconds)",
          "required": false,
          "default": 600
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "list[dict[str, any]]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/apify/scraping/apifytwitterscraper",
      "markdown_url": "https://docs.nodetool.ai/nodes/apify/scraping/apifytwitterscraper.md"
    },
    {
      "type": "apify.scraping.ApifyWebScraper",
      "title": "Apify Web Scraper",
      "namespace": "apify.scraping",
      "description": "Scrape websites using Apify's Web Scraper actor, extracting data via CSS selectors or custom JavaScript.\n    apify, scraping, web, data, extraction, crawler",
      "inputs": [
        {
          "name": "start_urls",
          "type": "list[str]",
          "description": "List of URLs to scrape",
          "required": false,
          "default": null
        },
        {
          "name": "link_selector",
          "type": "str",
          "description": "CSS selector for links to follow",
          "required": false,
          "default": "a[href]"
        },
        {
          "name": "page_function",
          "type": "str",
          "description": "JavaScript function to execute on each page",
          "required": false,
          "default": ""
        },
        {
          "name": "max_pages",
          "type": "int",
          "description": "Maximum number of pages to scrape",
          "required": false,
          "default": 10
        },
        {
          "name": "wait_for_finish",
          "type": "int",
          "description": "Maximum time to wait for scraping to complete (seconds)",
          "required": false,
          "default": 300
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "list[dict[str, any]]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/apify/scraping/apifywebscraper",
      "markdown_url": "https://docs.nodetool.ai/nodes/apify/scraping/apifywebscraper.md"
    },
    {
      "type": "apify.scraping.ApifyYouTubeScraper",
      "title": "Apify You Tube Scraper",
      "namespace": "apify.scraping",
      "description": "Scrape YouTube videos, channels, and playlists — metadata, comments, channel info, and statistics.\n    apify, youtube, video, scraping, social, media, channels",
      "inputs": [
        {
          "name": "search_queries",
          "type": "list[str]",
          "description": "List of search queries to execute on YouTube",
          "required": false,
          "default": null
        },
        {
          "name": "video_urls",
          "type": "list[str]",
          "description": "List of YouTube video URLs to scrape",
          "required": false,
          "default": null
        },
        {
          "name": "channel_urls",
          "type": "list[str]",
          "description": "List of YouTube channel URLs to scrape",
          "required": false,
          "default": null
        },
        {
          "name": "max_results",
          "type": "int",
          "description": "Maximum number of videos to scrape",
          "required": false,
          "default": 50
        },
        {
          "name": "scrape_comments",
          "type": "bool",
          "description": "Whether to scrape video comments",
          "required": false,
          "default": false
        },
        {
          "name": "wait_for_finish",
          "type": "int",
          "description": "Maximum time to wait for scraping to complete (seconds)",
          "required": false,
          "default": 600
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "list[dict[str, any]]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/apify/scraping/apifyyoutubescraper",
      "markdown_url": "https://docs.nodetool.ai/nodes/apify/scraping/apifyyoutubescraper.md"
    },
    {
      "type": "elevenlabs.RealtimeSpeechToText",
      "title": "Realtime Speech to Text",
      "namespace": "elevenlabs",
      "description": "",
      "inputs": [
        {
          "name": "chunk",
          "type": "chunk",
          "description": "Audio chunk input stream (base64-encoded PCM16 audio).",
          "required": false,
          "default": ""
        },
        {
          "name": "model_id",
          "type": "str",
          "description": "The realtime transcription model to use.",
          "required": false,
          "default": "scribe_v2_realtime"
        },
        {
          "name": "language_code",
          "type": "str",
          "description": "ISO 639-1/3 language code. Leave empty for auto-detection.",
          "required": false,
          "default": ""
        },
        {
          "name": "commit_strategy",
          "type": "enum",
          "description": "Strategy for committing transcriptions: manual or voice activity detection.",
          "required": false,
          "default": "vad"
        },
        {
          "name": "include_timestamps",
          "type": "bool",
          "description": "Include word-level timestamps in the transcription.",
          "required": false,
          "default": false
        },
        {
          "name": "include_language_detection",
          "type": "bool",
          "description": "Include language detection in the transcription.",
          "required": false,
          "default": false
        },
        {
          "name": "vad_silence_threshold_secs",
          "type": "float",
          "description": "Silence threshold in seconds for VAD mode.",
          "required": false,
          "default": 1.5
        },
        {
          "name": "vad_threshold",
          "type": "float",
          "description": "Threshold for voice activity detection.",
          "required": false,
          "default": 0.4
        },
        {
          "name": "min_speech_duration_ms",
          "type": "int",
          "description": "Minimum speech duration in milliseconds.",
          "required": false,
          "default": 100
        },
        {
          "name": "min_silence_duration_ms",
          "type": "int",
          "description": "Minimum silence duration in milliseconds.",
          "required": false,
          "default": 100
        }
      ],
      "outputs": [
        {
          "name": "chunk",
          "type": "chunk"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/elevenlabs/realtimespeechtotext",
      "markdown_url": "https://docs.nodetool.ai/nodes/elevenlabs/realtimespeechtotext.md"
    },
    {
      "type": "elevenlabs.RealtimeTextToSpeech",
      "title": "Realtime Text to Speech",
      "namespace": "elevenlabs",
      "description": "",
      "inputs": [
        {
          "name": "voice_id",
          "type": "str",
          "description": "ElevenLabs voice ID to use for generation. Connect a Standard Voice node or provide a custom voice ID.",
          "required": true
        },
        {
          "name": "chunk",
          "type": "chunk",
          "description": "Text chunk input stream.",
          "required": false,
          "default": ""
        },
        {
          "name": "model_id",
          "type": "enum",
          "description": "The TTS model to use.",
          "required": false,
          "default": "eleven_turbo_v2_5"
        },
        {
          "name": "language_code",
          "type": "enum",
          "description": "Language code to enforce (works with Turbo v2.5+).",
          "required": false,
          "default": "none"
        },
        {
          "name": "output_format",
          "type": "enum",
          "description": "Audio output format for streaming.",
          "required": false,
          "default": "mp3_44100_128"
        },
        {
          "name": "stability",
          "type": "float",
          "description": "Voice stability (0-1).",
          "required": false,
          "default": 0.5
        },
        {
          "name": "similarity_boost",
          "type": "float",
          "description": "Similarity to original voice (0-1).",
          "required": false,
          "default": 0.75
        },
        {
          "name": "style",
          "type": "float",
          "description": "Speaking style emphasis (0-1).",
          "required": false,
          "default": 0
        },
        {
          "name": "use_speaker_boost",
          "type": "bool",
          "description": "Use speaker boost for clearer output.",
          "required": false,
          "default": true
        },
        {
          "name": "speed",
          "type": "float",
          "description": "Speed of generated speech (0.7-1.2).",
          "required": false,
          "default": 1
        },
        {
          "name": "enable_ssml_parsing",
          "type": "bool",
          "description": "Enable SSML parsing in text input.",
          "required": false,
          "default": false
        }
      ],
      "outputs": [
        {
          "name": "chunk",
          "type": "chunk"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/elevenlabs/realtimetexttospeech",
      "markdown_url": "https://docs.nodetool.ai/nodes/elevenlabs/realtimetexttospeech.md"
    },
    {
      "type": "elevenlabs.SpeechToText",
      "title": "Speech to Text",
      "namespace": "elevenlabs",
      "description": "",
      "inputs": [
        {
          "name": "audio",
          "type": "audio",
          "description": "The audio or video file to transcribe.",
          "required": false,
          "default": {
            "type": "audio"
          }
        },
        {
          "name": "model_id",
          "type": "enum",
          "description": "The transcription model to use.",
          "required": false,
          "default": "scribe_v2"
        },
        {
          "name": "language_code",
          "type": "str",
          "description": "ISO-639-1 or ISO-639-3 language code (e.g. 'en', 'es'). Leave empty for auto-detection.",
          "required": false,
          "default": ""
        },
        {
          "name": "tag_audio_events",
          "type": "bool",
          "description": "Tag audio events like (laughter), (footsteps), etc.",
          "required": false,
          "default": true
        },
        {
          "name": "num_speakers",
          "type": "int",
          "description": "Maximum number of speakers (0 = auto-detect, max 32).",
          "required": false,
          "default": 0
        },
        {
          "name": "timestamps_granularity",
          "type": "enum",
          "description": "Granularity of timestamps: none, word, or character.",
          "required": false,
          "default": "word"
        },
        {
          "name": "diarize",
          "type": "bool",
          "description": "Annotate which speaker is talking.",
          "required": false,
          "default": false
        },
        {
          "name": "file_format",
          "type": "enum",
          "description": "Audio format: pcm_s16le_16 for lower latency or other for all formats.",
          "required": false,
          "default": "other"
        }
      ],
      "outputs": [
        {
          "name": "text",
          "type": "str"
        },
        {
          "name": "language_code",
          "type": "str"
        },
        {
          "name": "language_probability",
          "type": "float"
        },
        {
          "name": "words",
          "type": "list"
        },
        {
          "name": "transcription_id",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/elevenlabs/speechtotext",
      "markdown_url": "https://docs.nodetool.ai/nodes/elevenlabs/speechtotext.md"
    },
    {
      "type": "elevenlabs.StandardVoice",
      "title": "Standard Voice",
      "namespace": "elevenlabs",
      "description": "",
      "inputs": [
        {
          "name": "voice",
          "type": "enum",
          "description": "Standard ElevenLabs voice to use.",
          "required": false,
          "default": "Aria"
        }
      ],
      "outputs": [
        {
          "name": "voice_id",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/elevenlabs/standardvoice",
      "markdown_url": "https://docs.nodetool.ai/nodes/elevenlabs/standardvoice.md"
    },
    {
      "type": "elevenlabs.TextToSpeech",
      "title": "Text to Speech",
      "namespace": "elevenlabs",
      "description": "",
      "inputs": [
        {
          "name": "voice_id",
          "type": "str",
          "description": "ElevenLabs voice ID to use for generation. Connect a Standard Voice node or provide a custom voice ID.",
          "required": true
        },
        {
          "name": "text",
          "type": "str",
          "description": "The text to convert to speech.",
          "required": false,
          "default": "Hello, how are you?"
        },
        {
          "name": "model_id",
          "type": "enum",
          "description": "The TTS model to use.",
          "required": false,
          "default": "eleven_monolingual_v1"
        },
        {
          "name": "language_code",
          "type": "enum",
          "description": "Language code to enforce (works with Turbo v2.5+).",
          "required": false,
          "default": "none"
        },
        {
          "name": "stability",
          "type": "float",
          "description": "Voice stability (0-1). Higher = more consistent.",
          "required": false,
          "default": 0.5
        },
        {
          "name": "similarity_boost",
          "type": "float",
          "description": "Similarity to original voice (0-1).",
          "required": false,
          "default": 0.75
        },
        {
          "name": "style",
          "type": "float",
          "description": "Speaking style emphasis (0-1).",
          "required": false,
          "default": 0
        },
        {
          "name": "use_speaker_boost",
          "type": "bool",
          "description": "Use speaker boost for clearer output.",
          "required": false,
          "default": false
        },
        {
          "name": "seed",
          "type": "int",
          "description": "Seed for deterministic generation (-1 = random).",
          "required": false,
          "default": -1
        },
        {
          "name": "optimize_streaming_latency",
          "type": "int",
          "description": "Latency optimization level (0-4). Higher values trade quality for speed.",
          "required": false,
          "default": 2
        },
        {
          "name": "text_normalization",
          "type": "enum",
          "description": "Controls text normalization behavior.",
          "required": false,
          "default": "auto"
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "audio"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/elevenlabs/texttospeech",
      "markdown_url": "https://docs.nodetool.ai/nodes/elevenlabs/texttospeech.md"
    },
    {
      "type": "fal.dynamic.FalDynamic",
      "title": "FAL Dynamic",
      "namespace": "fal.dynamic",
      "description": "",
      "inputs": [
        {
          "name": "model_info",
          "type": "str",
          "description": "Endpoint ID (e.g. 'fal-ai/flux/dev'), fal.ai model URL, llms.txt URL, or pasted llms.txt content.",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [],
      "documentation_url": "https://docs.nodetool.ai/nodes/fal/dynamic/faldynamic",
      "markdown_url": "https://docs.nodetool.ai/nodes/fal/dynamic/faldynamic.md"
    },
    {
      "type": "fal.dynamic.FalRaw",
      "title": "FAL Raw",
      "namespace": "fal.dynamic",
      "description": "",
      "inputs": [
        {
          "name": "endpoint_id",
          "type": "str",
          "description": "FAL endpoint ID, e.g. \"fal-ai/flux/dev\" or \"fal-ai/mmaudio-v2/text-to-audio\".",
          "required": false,
          "default": ""
        },
        {
          "name": "arguments",
          "type": "str",
          "description": "JSON object of arguments to pass to the endpoint.",
          "required": false,
          "default": "{}"
        }
      ],
      "outputs": [],
      "documentation_url": "https://docs.nodetool.ai/nodes/fal/dynamic/falraw",
      "markdown_url": "https://docs.nodetool.ai/nodes/fal/dynamic/falraw.md"
    },
    {
      "type": "gemini.audio.TextToSpeech",
      "title": "Text To Speech",
      "namespace": "gemini.audio",
      "description": "Generate speech audio from text using Google's Gemini text-to-speech models.\n    google, text-to-speech, tts, audio, speech, voice, ai\n\n    This node converts text input into natural-sounding speech audio using Google's\n    advanced text-to-speech models with support for multiple voices and speech styles.\n\n    Supported voices:\n    - achernar, achird, algenib, algieba, alnilam\n    - aoede, autonoe, callirrhoe, charon, despina\n    - enceladus, erinome, fenrir, gacrux, iapetus\n    - kore, laomedeia, leda, orus, puck\n    - pulcherrima, rasalgethi, sadachbia, sadaltager, schedar\n    - sulafat, umbriel, vindemiatrix, zephyr, zubenelgenubi\n\n    Use cases:\n    - Create voiceovers for videos and presentations\n    - Generate audio content for podcasts and audiobooks\n    - Add voice narration to applications\n    - Create accessibility features with speech output\n    - Generate multilingual audio content",
      "inputs": [
        {
          "name": "text",
          "type": "str",
          "description": "The text to convert to speech.",
          "required": false,
          "default": ""
        },
        {
          "name": "model",
          "type": "enum",
          "description": "The text-to-speech model to use",
          "required": false,
          "default": "gemini-3.1-flash-tts-preview"
        },
        {
          "name": "voice_name",
          "type": "enum",
          "description": "The voice to use for speech generation",
          "required": false,
          "default": "kore"
        },
        {
          "name": "style_prompt",
          "type": "str",
          "description": "Optional style prompt to control speech characteristics (e.g., 'Say cheerfully', 'Speak with excitement')",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "audio"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/gemini/audio/texttospeech",
      "markdown_url": "https://docs.nodetool.ai/nodes/gemini/audio/texttospeech.md"
    },
    {
      "type": "gemini.audio.Transcribe",
      "title": "Transcribe",
      "namespace": "gemini.audio",
      "description": "Transcribe audio to text using Google's Gemini models.\n    google, transcription, speech-to-text, audio, whisper, ai\n\n    This node converts audio input into text using Google's multimodal Gemini models.\n    Supports various audio formats and provides accurate speech-to-text transcription.\n\n    Use cases:\n    - Convert recorded audio to text\n    - Transcribe podcasts and interviews\n    - Generate subtitles from audio tracks\n    - Create meeting notes from audio recordings\n    - Analyze speech content in audio files",
      "inputs": [
        {
          "name": "audio",
          "type": "audio",
          "description": "The audio file to transcribe.",
          "required": false,
          "default": {
            "type": "audio",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "model",
          "type": "enum",
          "description": "The Gemini model to use for transcription",
          "required": false,
          "default": "gemini-3.5-flash"
        },
        {
          "name": "prompt",
          "type": "str",
          "description": "Instructions for the transcription. You can customize this to request specific formatting or focus.",
          "required": false,
          "default": "Transcribe the following audio accurately. Return only the transcription text without any additional commentary."
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/gemini/audio/transcribe",
      "markdown_url": "https://docs.nodetool.ai/nodes/gemini/audio/transcribe.md"
    },
    {
      "type": "gemini.image.ImageGeneration",
      "title": "Image Generation",
      "namespace": "gemini.image",
      "description": "Generate an image using Google's Imagen model via the Gemini API.\n    google, image generation, ai, imagen\n\n    Use cases:\n    - Create images from text descriptions\n    - Generate assets for creative projects\n    - Explore AI-powered image synthesis",
      "inputs": [
        {
          "name": "prompt",
          "type": "str",
          "description": "The text prompt describing the image to generate.",
          "required": false,
          "default": ""
        },
        {
          "name": "model",
          "type": "enum",
          "description": "The image generation model to use",
          "required": false,
          "default": "gemini-3.1-flash-image"
        },
        {
          "name": "image",
          "type": "image",
          "description": "The image to use as a base for the generation.",
          "required": false,
          "default": {
            "type": "image",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "aspect_ratio",
          "type": "enum",
          "description": "The aspect ratio of the generated image",
          "required": false,
          "default": "1:1"
        },
        {
          "name": "resolution",
          "type": "enum",
          "description": "The output image resolution",
          "required": false,
          "default": "1K"
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/gemini/image/imagegeneration",
      "markdown_url": "https://docs.nodetool.ai/nodes/gemini/image/imagegeneration.md"
    },
    {
      "type": "gemini.text.Embedding",
      "title": "Embedding",
      "namespace": "gemini.text",
      "description": "Generate vector representations of text for semantic analysis using Google's Gemini API.\n    embeddings, similarity, search, clustering, classification, gemini\n\n    Uses Google's text embedding models to create dense vector representations of text.\n    These vectors capture semantic meaning, enabling:\n    - Semantic search\n    - Text clustering\n    - Document classification\n    - Recommendation systems\n    - Anomaly detection\n    - Measuring text similarity and diversity",
      "inputs": [
        {
          "name": "input",
          "type": "str",
          "description": "The text to embed.",
          "required": false,
          "default": ""
        },
        {
          "name": "model",
          "type": "enum",
          "description": "The embedding model to use",
          "required": false,
          "default": "gemini-embedding-2"
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "list"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/gemini/text/embedding",
      "markdown_url": "https://docs.nodetool.ai/nodes/gemini/text/embedding.md"
    },
    {
      "type": "gemini.text.GroundedSearch",
      "title": "Grounded Search",
      "namespace": "gemini.text",
      "description": "Search the web using Google's Gemini API with grounding capabilities.\n    google, search, grounded, web, gemini, ai\n\n    This node uses Google's Gemini API to perform web searches and return structured results\n    with source information. Requires a Gemini API key.\n\n    Use cases:\n    - Research current events and latest information\n    - Find reliable sources for fact-checking\n    - Gather web-based information with citations\n    - Get up-to-date information beyond the model's training data",
      "inputs": [
        {
          "name": "query",
          "type": "str",
          "description": "The search query to execute",
          "required": false,
          "default": ""
        },
        {
          "name": "model",
          "type": "enum",
          "description": "The Gemini model to use for search",
          "required": false,
          "default": "gemini-3.5-flash"
        }
      ],
      "outputs": [
        {
          "name": "results",
          "type": "list[str]"
        },
        {
          "name": "sources",
          "type": "list[source]"
        },
        {
          "name": "text",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/gemini/text/groundedsearch",
      "markdown_url": "https://docs.nodetool.ai/nodes/gemini/text/groundedsearch.md"
    },
    {
      "type": "gemini.video.ImageToVideo",
      "title": "Image To Video",
      "namespace": "gemini.video",
      "description": "Generate videos from images using Google's Veo models.\n    google, video, generation, image-to-video, veo, ai, animation\n\n    This node uses Google's Veo models to animate static images into dynamic videos.\n    Supports 720p resolution at 24fps with 8-second duration and native audio generation.",
      "inputs": [
        {
          "name": "image",
          "type": "image",
          "description": "The image to animate into a video",
          "required": false,
          "default": {
            "type": "image",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "prompt",
          "type": "str",
          "description": "Optional text prompt describing the desired animation",
          "required": false,
          "default": ""
        },
        {
          "name": "model",
          "type": "enum",
          "description": "The Veo model to use for video generation",
          "required": false,
          "default": "veo-3.1-generate-preview"
        },
        {
          "name": "aspect_ratio",
          "type": "enum",
          "description": "The aspect ratio of the generated video",
          "required": false,
          "default": "16:9"
        },
        {
          "name": "negative_prompt",
          "type": "str",
          "description": "Negative prompt to guide what to avoid in the video",
          "required": false,
          "default": ""
        },
        {
          "name": "resolution",
          "type": "enum",
          "description": "The output video resolution",
          "required": false,
          "default": "720p"
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "video"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/gemini/video/imagetovideo",
      "markdown_url": "https://docs.nodetool.ai/nodes/gemini/video/imagetovideo.md"
    },
    {
      "type": "gemini.video.TextToVideo",
      "title": "Text To Video",
      "namespace": "gemini.video",
      "description": "Generate videos from text prompts using Google's Veo models.\n    google, video, generation, text-to-video, veo, ai\n\n    This node uses Google's Veo models to generate high-quality videos from text descriptions.\n    Supports 720p resolution at 24fps with 8-second duration and native audio generation.",
      "inputs": [
        {
          "name": "prompt",
          "type": "str",
          "description": "The text prompt describing the video to generate",
          "required": false,
          "default": ""
        },
        {
          "name": "model",
          "type": "enum",
          "description": "The Veo model to use for video generation",
          "required": false,
          "default": "veo-3.1-generate-preview"
        },
        {
          "name": "aspect_ratio",
          "type": "enum",
          "description": "The aspect ratio of the generated video",
          "required": false,
          "default": "16:9"
        },
        {
          "name": "negative_prompt",
          "type": "str",
          "description": "Negative prompt to guide what to avoid in the video",
          "required": false,
          "default": ""
        },
        {
          "name": "resolution",
          "type": "enum",
          "description": "The output video resolution",
          "required": false,
          "default": "720p"
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "video"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/gemini/video/texttovideo",
      "markdown_url": "https://docs.nodetool.ai/nodes/gemini/video/texttovideo.md"
    },
    {
      "type": "huggingface.AudioClassification",
      "title": "Audio Classification",
      "namespace": "huggingface",
      "description": "",
      "inputs": [
        {
          "name": "model",
          "type": "str",
          "description": "Audio-classification model repo id.",
          "required": false,
          "default": "superb/hubert-base-superb-er"
        },
        {
          "name": "audio",
          "type": "audio",
          "description": "The audio to classify.",
          "required": true
        },
        {
          "name": "top_k",
          "type": "int",
          "description": "Return the top K most probable classes.",
          "required": false,
          "default": 5
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        },
        {
          "name": "scores",
          "type": "list"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/huggingface/audioclassification",
      "markdown_url": "https://docs.nodetool.ai/nodes/huggingface/audioclassification.md"
    },
    {
      "type": "huggingface.AutomaticSpeechRecognition",
      "title": "Automatic Speech Recognition",
      "namespace": "huggingface",
      "description": "",
      "inputs": [
        {
          "name": "model",
          "type": "str",
          "description": "Automatic-speech-recognition model repo id.",
          "required": false,
          "default": "openai/whisper-large-v3"
        },
        {
          "name": "audio",
          "type": "audio",
          "description": "The audio to transcribe.",
          "required": true
        },
        {
          "name": "return_timestamps",
          "type": "bool",
          "description": "Also return per-chunk timestamps.",
          "required": false,
          "default": false
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        },
        {
          "name": "chunks",
          "type": "list"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/huggingface/automaticspeechrecognition",
      "markdown_url": "https://docs.nodetool.ai/nodes/huggingface/automaticspeechrecognition.md"
    },
    {
      "type": "huggingface.ChatCompletion",
      "title": "Chat Completion",
      "namespace": "huggingface",
      "description": "",
      "inputs": [
        {
          "name": "model",
          "type": "str",
          "description": "Conversational model repo id (e.g. meta-llama/Llama-3.1-8B-Instruct, Qwen/Qwen2.5-7B-Instruct, openai/gpt-oss-120b).",
          "required": false,
          "default": "meta-llama/Llama-3.1-8B-Instruct"
        },
        {
          "name": "system",
          "type": "str",
          "description": "Optional system prompt setting the assistant's behavior.",
          "required": false,
          "default": ""
        },
        {
          "name": "prompt",
          "type": "str",
          "description": "The user message to send to the model.",
          "required": false,
          "default": "Hello!"
        },
        {
          "name": "max_tokens",
          "type": "int",
          "description": "Maximum number of tokens to generate.",
          "required": false,
          "default": 512
        },
        {
          "name": "temperature",
          "type": "float",
          "description": "Sampling temperature (0-2). Higher is more random.",
          "required": false,
          "default": 0.7
        },
        {
          "name": "top_p",
          "type": "float",
          "description": "Nucleus sampling probability mass (0-1).",
          "required": false,
          "default": 1
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/huggingface/chatcompletion",
      "markdown_url": "https://docs.nodetool.ai/nodes/huggingface/chatcompletion.md"
    },
    {
      "type": "huggingface.FeatureExtraction",
      "title": "Feature Extraction",
      "namespace": "huggingface",
      "description": "",
      "inputs": [
        {
          "name": "model",
          "type": "str",
          "description": "Feature-extraction / embedding model repo id.",
          "required": false,
          "default": "sentence-transformers/all-MiniLM-L6-v2"
        },
        {
          "name": "inputs",
          "type": "str",
          "description": "The text to embed.",
          "required": false,
          "default": ""
        },
        {
          "name": "normalize",
          "type": "bool",
          "description": "L2-normalize the returned embedding.",
          "required": false,
          "default": false
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "list"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/huggingface/featureextraction",
      "markdown_url": "https://docs.nodetool.ai/nodes/huggingface/featureextraction.md"
    },
    {
      "type": "huggingface.FillMask",
      "title": "Fill Mask",
      "namespace": "huggingface",
      "description": "",
      "inputs": [
        {
          "name": "model",
          "type": "str",
          "description": "Fill-mask model repo id.",
          "required": false,
          "default": "bert-base-uncased"
        },
        {
          "name": "inputs",
          "type": "str",
          "description": "Text containing a mask token (e.g. [MASK] for BERT, <mask> for RoBERTa).",
          "required": false,
          "default": "The capital of France is [MASK]."
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        },
        {
          "name": "predictions",
          "type": "list"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/huggingface/fillmask",
      "markdown_url": "https://docs.nodetool.ai/nodes/huggingface/fillmask.md"
    },
    {
      "type": "huggingface.ImageClassification",
      "title": "Image Classification",
      "namespace": "huggingface",
      "description": "",
      "inputs": [
        {
          "name": "model",
          "type": "str",
          "description": "Image-classification model repo id.",
          "required": false,
          "default": "google/vit-base-patch16-224"
        },
        {
          "name": "image",
          "type": "image",
          "description": "The image to classify.",
          "required": true
        },
        {
          "name": "top_k",
          "type": "int",
          "description": "Return the top K most probable classes.",
          "required": false,
          "default": 5
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        },
        {
          "name": "scores",
          "type": "list"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/huggingface/imageclassification",
      "markdown_url": "https://docs.nodetool.ai/nodes/huggingface/imageclassification.md"
    },
    {
      "type": "huggingface.ImageSegmentation",
      "title": "Image Segmentation",
      "namespace": "huggingface",
      "description": "",
      "inputs": [
        {
          "name": "model",
          "type": "str",
          "description": "Image-segmentation model repo id.",
          "required": false,
          "default": "nvidia/segformer-b0-finetuned-ade-512-512"
        },
        {
          "name": "image",
          "type": "image",
          "description": "The image to segment.",
          "required": true
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "list"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/huggingface/imagesegmentation",
      "markdown_url": "https://docs.nodetool.ai/nodes/huggingface/imagesegmentation.md"
    },
    {
      "type": "huggingface.ImageToImage",
      "title": "Image to Image",
      "namespace": "huggingface",
      "description": "",
      "inputs": [
        {
          "name": "model",
          "type": "str",
          "description": "Image-to-image model repo id.",
          "required": false,
          "default": "black-forest-labs/FLUX.1-Kontext-dev"
        },
        {
          "name": "image",
          "type": "image",
          "description": "The source image to transform.",
          "required": true
        },
        {
          "name": "prompt",
          "type": "str",
          "description": "Text prompt guiding the transformation.",
          "required": false,
          "default": ""
        },
        {
          "name": "negative_prompt",
          "type": "str",
          "description": "What the result should NOT contain.",
          "required": false,
          "default": ""
        },
        {
          "name": "guidance_scale",
          "type": "float",
          "description": "How closely to follow the prompt (0 = model default).",
          "required": false,
          "default": 0
        },
        {
          "name": "num_inference_steps",
          "type": "int",
          "description": "Number of denoising steps (0 = model default).",
          "required": false,
          "default": 0
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/huggingface/imagetoimage",
      "markdown_url": "https://docs.nodetool.ai/nodes/huggingface/imagetoimage.md"
    },
    {
      "type": "huggingface.ObjectDetection",
      "title": "Object Detection",
      "namespace": "huggingface",
      "description": "",
      "inputs": [
        {
          "name": "model",
          "type": "str",
          "description": "Object-detection model repo id.",
          "required": false,
          "default": "facebook/detr-resnet-50"
        },
        {
          "name": "image",
          "type": "image",
          "description": "The image to analyze.",
          "required": true
        },
        {
          "name": "threshold",
          "type": "float",
          "description": "Minimum confidence for a detection to be returned.",
          "required": false,
          "default": 0.5
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "list"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/huggingface/objectdetection",
      "markdown_url": "https://docs.nodetool.ai/nodes/huggingface/objectdetection.md"
    },
    {
      "type": "huggingface.QuestionAnswering",
      "title": "Question Answering",
      "namespace": "huggingface",
      "description": "",
      "inputs": [
        {
          "name": "model",
          "type": "str",
          "description": "Question-answering model repo id.",
          "required": false,
          "default": "deepset/roberta-base-squad2"
        },
        {
          "name": "question",
          "type": "str",
          "description": "The question to answer.",
          "required": false,
          "default": ""
        },
        {
          "name": "context",
          "type": "str",
          "description": "The passage that contains the answer.",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        },
        {
          "name": "score",
          "type": "float"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/huggingface/questionanswering",
      "markdown_url": "https://docs.nodetool.ai/nodes/huggingface/questionanswering.md"
    },
    {
      "type": "huggingface.Summarization",
      "title": "Summarization",
      "namespace": "huggingface",
      "description": "",
      "inputs": [
        {
          "name": "model",
          "type": "str",
          "description": "Summarization model repo id.",
          "required": false,
          "default": "facebook/bart-large-cnn"
        },
        {
          "name": "inputs",
          "type": "str",
          "description": "The text to summarize.",
          "required": false,
          "default": ""
        },
        {
          "name": "max_length",
          "type": "int",
          "description": "Maximum length of the summary in tokens (0 = model default).",
          "required": false,
          "default": 0
        },
        {
          "name": "min_length",
          "type": "int",
          "description": "Minimum length of the summary in tokens (0 = model default).",
          "required": false,
          "default": 0
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/huggingface/summarization",
      "markdown_url": "https://docs.nodetool.ai/nodes/huggingface/summarization.md"
    },
    {
      "type": "huggingface.TableQuestionAnswering",
      "title": "Table Question Answering",
      "namespace": "huggingface",
      "description": "",
      "inputs": [
        {
          "name": "model",
          "type": "str",
          "description": "Table-question-answering model repo id.",
          "required": false,
          "default": "google/tapas-base-finetuned-wtq"
        },
        {
          "name": "question",
          "type": "str",
          "description": "The question to ask about the table.",
          "required": false,
          "default": ""
        },
        {
          "name": "table",
          "type": "dict",
          "description": "The table as an object mapping each column name to an array of string cell values.",
          "required": false,
          "default": {}
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        },
        {
          "name": "cells",
          "type": "list"
        },
        {
          "name": "aggregator",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/huggingface/tablequestionanswering",
      "markdown_url": "https://docs.nodetool.ai/nodes/huggingface/tablequestionanswering.md"
    },
    {
      "type": "huggingface.TextClassification",
      "title": "Text Classification",
      "namespace": "huggingface",
      "description": "",
      "inputs": [
        {
          "name": "model",
          "type": "str",
          "description": "Text-classification model repo id.",
          "required": false,
          "default": "distilbert-base-uncased-finetuned-sst-2-english"
        },
        {
          "name": "inputs",
          "type": "str",
          "description": "The text to classify.",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        },
        {
          "name": "scores",
          "type": "list"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/huggingface/textclassification",
      "markdown_url": "https://docs.nodetool.ai/nodes/huggingface/textclassification.md"
    },
    {
      "type": "huggingface.TextGeneration",
      "title": "Text Generation",
      "namespace": "huggingface",
      "description": "",
      "inputs": [
        {
          "name": "model",
          "type": "str",
          "description": "Text-generation model repo id.",
          "required": false,
          "default": "HuggingFaceH4/zephyr-7b-beta"
        },
        {
          "name": "prompt",
          "type": "str",
          "description": "The text prompt to continue.",
          "required": false,
          "default": "Once upon a time"
        },
        {
          "name": "max_new_tokens",
          "type": "int",
          "description": "Maximum number of new tokens to generate.",
          "required": false,
          "default": 256
        },
        {
          "name": "temperature",
          "type": "float",
          "description": "Sampling temperature.",
          "required": false,
          "default": 0.7
        },
        {
          "name": "return_full_text",
          "type": "bool",
          "description": "Include the prompt in the returned text.",
          "required": false,
          "default": false
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/huggingface/textgeneration",
      "markdown_url": "https://docs.nodetool.ai/nodes/huggingface/textgeneration.md"
    },
    {
      "type": "huggingface.TextToImage",
      "title": "Text to Image",
      "namespace": "huggingface",
      "description": "",
      "inputs": [
        {
          "name": "model",
          "type": "str",
          "description": "Text-to-image model repo id (e.g. black-forest-labs/FLUX.1-schnell, stabilityai/stable-diffusion-xl-base-1.0).",
          "required": false,
          "default": "black-forest-labs/FLUX.1-schnell"
        },
        {
          "name": "prompt",
          "type": "str",
          "description": "The text prompt describing the image.",
          "required": false,
          "default": ""
        },
        {
          "name": "negative_prompt",
          "type": "str",
          "description": "What the image should NOT contain.",
          "required": false,
          "default": ""
        },
        {
          "name": "width",
          "type": "int",
          "description": "Output width in pixels (0 = model default).",
          "required": false,
          "default": 0
        },
        {
          "name": "height",
          "type": "int",
          "description": "Output height in pixels (0 = model default).",
          "required": false,
          "default": 0
        },
        {
          "name": "guidance_scale",
          "type": "float",
          "description": "How closely to follow the prompt (0 = model default).",
          "required": false,
          "default": 0
        },
        {
          "name": "num_inference_steps",
          "type": "int",
          "description": "Number of denoising steps (0 = model default).",
          "required": false,
          "default": 0
        },
        {
          "name": "seed",
          "type": "int",
          "description": "Random seed (-1 = random).",
          "required": false,
          "default": -1
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/huggingface/texttoimage",
      "markdown_url": "https://docs.nodetool.ai/nodes/huggingface/texttoimage.md"
    },
    {
      "type": "huggingface.TextToVideo",
      "title": "Text to Video",
      "namespace": "huggingface",
      "description": "",
      "inputs": [
        {
          "name": "model",
          "type": "str",
          "description": "Text-to-video model repo id.",
          "required": false,
          "default": "Wan-AI/Wan2.2-T2V-A14B"
        },
        {
          "name": "prompt",
          "type": "str",
          "description": "The text prompt describing the video.",
          "required": false,
          "default": ""
        },
        {
          "name": "negative_prompt",
          "type": "str",
          "description": "What the video should NOT contain.",
          "required": false,
          "default": ""
        },
        {
          "name": "num_frames",
          "type": "int",
          "description": "Number of frames to generate (0 = model default).",
          "required": false,
          "default": 0
        },
        {
          "name": "guidance_scale",
          "type": "float",
          "description": "How closely to follow the prompt (0 = model default).",
          "required": false,
          "default": 0
        },
        {
          "name": "num_inference_steps",
          "type": "int",
          "description": "Number of denoising steps (0 = model default).",
          "required": false,
          "default": 0
        },
        {
          "name": "seed",
          "type": "int",
          "description": "Random seed (-1 = random).",
          "required": false,
          "default": -1
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "video"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/huggingface/texttovideo",
      "markdown_url": "https://docs.nodetool.ai/nodes/huggingface/texttovideo.md"
    },
    {
      "type": "huggingface.TokenClassification",
      "title": "Token Classification",
      "namespace": "huggingface",
      "description": "",
      "inputs": [
        {
          "name": "model",
          "type": "str",
          "description": "Token-classification / NER model repo id.",
          "required": false,
          "default": "dslim/bert-base-NER"
        },
        {
          "name": "inputs",
          "type": "str",
          "description": "The text to analyze.",
          "required": false,
          "default": ""
        },
        {
          "name": "aggregation_strategy",
          "type": "enum",
          "description": "How to group sub-word tokens into entities.",
          "required": false,
          "default": "simple"
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "list"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/huggingface/tokenclassification",
      "markdown_url": "https://docs.nodetool.ai/nodes/huggingface/tokenclassification.md"
    },
    {
      "type": "huggingface.Translation",
      "title": "Translation",
      "namespace": "huggingface",
      "description": "",
      "inputs": [
        {
          "name": "model",
          "type": "str",
          "description": "Translation model repo id (e.g. facebook/nllb-200-distilled-600M, Helsinki-NLP/opus-mt-en-fr).",
          "required": false,
          "default": "facebook/nllb-200-distilled-600M"
        },
        {
          "name": "inputs",
          "type": "str",
          "description": "The text to translate.",
          "required": false,
          "default": ""
        },
        {
          "name": "src_lang",
          "type": "str",
          "description": "Optional source language code for multilingual models (e.g. eng_Latn).",
          "required": false,
          "default": ""
        },
        {
          "name": "tgt_lang",
          "type": "str",
          "description": "Optional target language code for multilingual models (e.g. fra_Latn).",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/huggingface/translation",
      "markdown_url": "https://docs.nodetool.ai/nodes/huggingface/translation.md"
    },
    {
      "type": "huggingface.ZeroShotClassification",
      "title": "Zero Shot Classification",
      "namespace": "huggingface",
      "description": "",
      "inputs": [
        {
          "name": "model",
          "type": "str",
          "description": "Zero-shot-classification model repo id.",
          "required": false,
          "default": "facebook/bart-large-mnli"
        },
        {
          "name": "inputs",
          "type": "str",
          "description": "The text to classify.",
          "required": false,
          "default": ""
        },
        {
          "name": "candidate_labels",
          "type": "str",
          "description": "Comma-separated list of candidate labels.",
          "required": false,
          "default": ""
        },
        {
          "name": "multi_label",
          "type": "bool",
          "description": "Allow multiple labels to be true at once.",
          "required": false,
          "default": false
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        },
        {
          "name": "scores",
          "type": "list"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/huggingface/zeroshotclassification",
      "markdown_url": "https://docs.nodetool.ai/nodes/huggingface/zeroshotclassification.md"
    },
    {
      "type": "kie.dynamic_schema.KieAI",
      "title": "Kie AI",
      "namespace": "kie.dynamic_schema",
      "description": "Dynamic Kie.ai node for running any kie.ai model.\n    kie, dynamic, schema, api, inference, runtime, model\n\n    Use cases:\n    - Call any kie.ai model without a dedicated Python node\n    - Prototype workflows with new models as they appear\n    - Run models by pasting their API documentation\n    - Access the full kie.ai catalog dynamically",
      "inputs": [
        {
          "name": "model_info",
          "type": "str",
          "description": "Paste the full API documentation from the kie.ai model page.",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [],
      "documentation_url": "https://docs.nodetool.ai/nodes/kie/dynamic_schema/kieai",
      "markdown_url": "https://docs.nodetool.ai/nodes/kie/dynamic_schema/kieai.md"
    },
    {
      "type": "lib.apple.CreateCalendarEvent",
      "title": "Create Calendar Event",
      "namespace": "lib.apple",
      "description": "Create a new event in macOS Calendar via AppleScript.\n    calendar, event, macos, applescript",
      "inputs": [
        {
          "name": "event_title",
          "type": "str",
          "description": "Title of the calendar event",
          "required": false,
          "default": ""
        },
        {
          "name": "start_date",
          "type": "any",
          "description": "Start date and time",
          "required": false,
          "default": ""
        },
        {
          "name": "end_date",
          "type": "any",
          "description": "End date and time",
          "required": false,
          "default": ""
        },
        {
          "name": "calendar_name",
          "type": "str",
          "description": "Name of the target calendar",
          "required": false,
          "default": "Calendar"
        },
        {
          "name": "location",
          "type": "str",
          "description": "Location of the event",
          "required": false,
          "default": ""
        },
        {
          "name": "description_text",
          "type": "str",
          "description": "Notes for the event",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "bool"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/apple/createcalendarevent",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/apple/createcalendarevent.md"
    },
    {
      "type": "lib.apple.CreateNote",
      "title": "Create Note",
      "namespace": "lib.apple",
      "description": "Create a new note in macOS Notes via AppleScript.\n    notes, macos, applescript",
      "inputs": [
        {
          "name": "title",
          "type": "str",
          "description": "Title of the note",
          "required": false,
          "default": ""
        },
        {
          "name": "body",
          "type": "str",
          "description": "Body content (plain text or HTML)",
          "required": false,
          "default": ""
        },
        {
          "name": "folder",
          "type": "str",
          "description": "Folder to save the note in",
          "required": false,
          "default": "Notes"
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "bool"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/apple/createnote",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/apple/createnote.md"
    },
    {
      "type": "lib.apple.CreateReminder",
      "title": "Create Reminder",
      "namespace": "lib.apple",
      "description": "Create a reminder in macOS Reminders via AppleScript.\n    reminders, todo, macos",
      "inputs": [
        {
          "name": "title",
          "type": "str",
          "description": "Title of the reminder",
          "required": false,
          "default": ""
        },
        {
          "name": "due_date",
          "type": "any",
          "description": "Optional due date; leave empty for none",
          "required": false,
          "default": ""
        },
        {
          "name": "list_name",
          "type": "str",
          "description": "Reminders list name",
          "required": false,
          "default": "Reminders"
        },
        {
          "name": "notes",
          "type": "str",
          "description": "Additional notes",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "bool"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/apple/createreminder",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/apple/createreminder.md"
    },
    {
      "type": "lib.apple.GetClipboardText",
      "title": "Get Clipboard Text",
      "namespace": "lib.apple",
      "description": "Read plain text from the macOS clipboard via AppleScript.\n    clipboard, text, macos",
      "inputs": [],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/apple/getclipboardtext",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/apple/getclipboardtext.md"
    },
    {
      "type": "lib.apple.GetFrontSafariTab",
      "title": "Get Front Safari Tab",
      "namespace": "lib.apple",
      "description": "Read URL and title of Safari's frontmost tab.\n    safari, browser, tab, macos",
      "inputs": [],
      "outputs": [
        {
          "name": "url",
          "type": "str"
        },
        {
          "name": "title",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/apple/getfrontsafaritab",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/apple/getfrontsafaritab.md"
    },
    {
      "type": "lib.apple.ListCalendarEvents",
      "title": "List Calendar Events",
      "namespace": "lib.apple",
      "description": "List events from a Calendar in a date range using AppleScript.\n    calendar, list, events, macos",
      "inputs": [
        {
          "name": "days_back",
          "type": "int",
          "description": "Days back from today",
          "required": false,
          "default": 0
        },
        {
          "name": "days_forward",
          "type": "int",
          "description": "Days forward from today",
          "required": false,
          "default": 7
        },
        {
          "name": "calendar_name",
          "type": "str",
          "description": "Calendar to query",
          "required": false,
          "default": "Calendar"
        }
      ],
      "outputs": [
        {
          "name": "events",
          "type": "list"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/apple/listcalendarevents",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/apple/listcalendarevents.md"
    },
    {
      "type": "lib.apple.ListNotes",
      "title": "List Notes",
      "namespace": "lib.apple",
      "description": "List notes from macOS Notes via AppleScript.\n    notes, list, macos",
      "inputs": [
        {
          "name": "limit",
          "type": "int",
          "description": "Maximum notes to return",
          "required": false,
          "default": 25
        },
        {
          "name": "folder",
          "type": "str",
          "description": "Optional folder name; empty = all folders",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "notes",
          "type": "list"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/apple/listnotes",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/apple/listnotes.md"
    },
    {
      "type": "lib.apple.ListReminders",
      "title": "List Reminders",
      "namespace": "lib.apple",
      "description": "List reminders in a given list via AppleScript.\n    reminders, todo, list, macos",
      "inputs": [
        {
          "name": "list_name",
          "type": "str",
          "description": "Reminders list name",
          "required": false,
          "default": "Reminders"
        },
        {
          "name": "include_completed",
          "type": "bool",
          "description": "Include completed reminders",
          "required": false,
          "default": false
        }
      ],
      "outputs": [
        {
          "name": "reminders",
          "type": "list"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/apple/listreminders",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/apple/listreminders.md"
    },
    {
      "type": "lib.apple.OpenSafariURL",
      "title": "Open URL in Safari",
      "namespace": "lib.apple",
      "description": "Open a URL in Safari and optionally bring it to the front.\n    safari, browser, open, macos",
      "inputs": [
        {
          "name": "url",
          "type": "str",
          "description": "URL to open",
          "required": false,
          "default": ""
        },
        {
          "name": "activate",
          "type": "bool",
          "description": "Bring Safari to the foreground",
          "required": false,
          "default": true
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "bool"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/apple/openurlinsafari",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/apple/openurlinsafari.md"
    },
    {
      "type": "lib.apple.PostNotification",
      "title": "Post Notification",
      "namespace": "lib.apple",
      "description": "Post a notification to macOS Notification Center via AppleScript.\n    notification, alert, macos",
      "inputs": [
        {
          "name": "title",
          "type": "str",
          "description": "Notification title",
          "required": false,
          "default": "Nodetool"
        },
        {
          "name": "subtitle",
          "type": "str",
          "description": "Notification subtitle",
          "required": false,
          "default": ""
        },
        {
          "name": "message",
          "type": "str",
          "description": "Notification body",
          "required": false,
          "default": ""
        },
        {
          "name": "sound_name",
          "type": "str",
          "description": "Optional sound name (e.g. 'Glass'); empty = silent",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "bool"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/apple/postnotification",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/apple/postnotification.md"
    },
    {
      "type": "lib.apple.SafariPageText",
      "title": "Safari Page Text",
      "namespace": "lib.apple",
      "description": "Extract visible text from Safari's front document via injected JavaScript (requires 'Allow JavaScript from Apple Events' in Safari's Develop menu).\n    safari, page, text, extract",
      "inputs": [
        {
          "name": "max_chars",
          "type": "int",
          "description": "Truncate output to this many characters",
          "required": false,
          "default": 50000
        },
        {
          "name": "prefer_article",
          "type": "bool",
          "description": "Use <article> innerText when present",
          "required": false,
          "default": true
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/apple/safaripagetext",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/apple/safaripagetext.md"
    },
    {
      "type": "lib.apple.SafariSelectionText",
      "title": "Safari Selection Text",
      "namespace": "lib.apple",
      "description": "Return the currently selected text from Safari's front document (uses `do JavaScript`; requires 'Allow JavaScript from Apple Events' in Safari's Develop menu).\n    safari, selection, text",
      "inputs": [],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/apple/safariselectiontext",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/apple/safariselectiontext.md"
    },
    {
      "type": "lib.apple.SayText",
      "title": "Say Text",
      "namespace": "lib.apple",
      "description": "Speak text aloud using macOS text-to-speech via AppleScript's `say` command.\n    speech, tts, voice, macos",
      "inputs": [
        {
          "name": "text",
          "type": "str",
          "description": "Text to speak",
          "required": false,
          "default": ""
        },
        {
          "name": "voice",
          "type": "str",
          "description": "Voice name (e.g. 'Alex', 'Samantha'). Empty = system default.",
          "required": false,
          "default": ""
        },
        {
          "name": "rate",
          "type": "int",
          "description": "Speaking rate (words per minute)",
          "required": false,
          "default": 175
        },
        {
          "name": "wait",
          "type": "bool",
          "description": "Wait for speech to finish before returning",
          "required": false,
          "default": true
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "bool"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/apple/saytext",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/apple/saytext.md"
    },
    {
      "type": "lib.apple.SearchContacts",
      "title": "Search Contacts",
      "namespace": "lib.apple",
      "description": "Search macOS Contacts via AppleScript.\n    contacts, search, address book, macos",
      "inputs": [
        {
          "name": "query",
          "type": "str",
          "description": "Substring to match against name/email/phone",
          "required": false,
          "default": ""
        },
        {
          "name": "limit",
          "type": "int",
          "description": "Maximum results",
          "required": false,
          "default": 10
        }
      ],
      "outputs": [
        {
          "name": "contacts",
          "type": "list"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/apple/searchcontacts",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/apple/searchcontacts.md"
    },
    {
      "type": "lib.apple.SendMail",
      "title": "Send Mail (Apple Mail)",
      "namespace": "lib.apple",
      "description": "Compose and send an email through Apple Mail via AppleScript.\n    mail, email, send, macos",
      "inputs": [
        {
          "name": "to_address",
          "type": "str",
          "description": "Recipient email address",
          "required": false,
          "default": ""
        },
        {
          "name": "cc_address",
          "type": "str",
          "description": "CC email address (optional)",
          "required": false,
          "default": ""
        },
        {
          "name": "subject",
          "type": "str",
          "description": "Email subject",
          "required": false,
          "default": ""
        },
        {
          "name": "body",
          "type": "str",
          "description": "Email body (plain text)",
          "required": false,
          "default": ""
        },
        {
          "name": "visible",
          "type": "bool",
          "description": "Show the message in the UI rather than sending silently",
          "required": false,
          "default": false
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "bool"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/apple/sendmailapplemail",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/apple/sendmailapplemail.md"
    },
    {
      "type": "lib.apple.SendMessage",
      "title": "Send iMessage",
      "namespace": "lib.apple",
      "description": "Send an iMessage to a phone number or email via AppleScript.\n    messages, imessage, send, macos",
      "inputs": [
        {
          "name": "recipient",
          "type": "str",
          "description": "Phone number or email of the recipient",
          "required": false,
          "default": ""
        },
        {
          "name": "text",
          "type": "str",
          "description": "Message body",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "bool"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/apple/sendimessage",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/apple/sendimessage.md"
    },
    {
      "type": "lib.apple.SetClipboardText",
      "title": "Set Clipboard Text",
      "namespace": "lib.apple",
      "description": "Write plain text to the macOS clipboard via AppleScript.\n    clipboard, text, macos",
      "inputs": [
        {
          "name": "text",
          "type": "str",
          "description": "Text to put on the clipboard",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "bool"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/apple/setclipboardtext",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/apple/setclipboardtext.md"
    },
    {
      "type": "lib.audio.Bitcrush",
      "title": "Bitcrush",
      "namespace": "lib.audio",
      "description": "Applies a bitcrushing effect to an audio file, reducing bit depth and/or sample rate.\n    audio, effect, distortion\n\n    Use cases:\n    - Create lo-fi or retro-style audio effects\n    - Simulate vintage digital audio equipment\n    - Add digital distortion and artifacts to sounds",
      "inputs": [
        {
          "name": "audio",
          "type": "audio",
          "description": "The audio file to process.",
          "required": false,
          "default": {
            "type": "audio",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "bit_depth",
          "type": "int",
          "description": "The bit depth to reduce the audio to. Lower values create more distortion.",
          "required": false,
          "default": 8
        },
        {
          "name": "sample_rate_reduction",
          "type": "int",
          "description": "Factor by which to reduce the sample rate. Higher values create more aliasing.",
          "required": false,
          "default": 1
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "audio"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/audio/bitcrush",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/audio/bitcrush.md"
    },
    {
      "type": "lib.audio.Compress",
      "title": "Compress",
      "namespace": "lib.audio",
      "description": "Applies dynamic range compression to an audio file.\n    audio, effect, dynamics\n\n    Use cases:\n    - Even out volume levels in a recording\n    - Increase perceived loudness of audio\n    - Control peaks in audio signals",
      "inputs": [
        {
          "name": "audio",
          "type": "audio",
          "description": "The audio file to process.",
          "required": false,
          "default": {
            "type": "audio",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "threshold",
          "type": "float",
          "description": "Threshold in dB above which compression is applied.",
          "required": false,
          "default": -20
        },
        {
          "name": "ratio",
          "type": "float",
          "description": "Compression ratio. Higher values result in more compression.",
          "required": false,
          "default": 4
        },
        {
          "name": "attack",
          "type": "float",
          "description": "Attack time in milliseconds.",
          "required": false,
          "default": 5
        },
        {
          "name": "release",
          "type": "float",
          "description": "Release time in milliseconds.",
          "required": false,
          "default": 50
        },
        {
          "name": "auto_gain",
          "type": "bool",
          "description": "Apply automatic makeup gain to compensate for the level lost to compression, keeping the output roughly as loud as the input.",
          "required": false,
          "default": true
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "audio"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/audio/compress",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/audio/compress.md"
    },
    {
      "type": "lib.audio.Delay",
      "title": "Delay",
      "namespace": "lib.audio",
      "description": "Applies a delay effect to an audio file.\n    audio, effect, time-based\n\n    Use cases:\n    - Create echo effects\n    - Add spaciousness to sounds\n    - Produce rhythmic patterns",
      "inputs": [
        {
          "name": "audio",
          "type": "audio",
          "description": "The audio file to process.",
          "required": false,
          "default": {
            "type": "audio",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "delay_seconds",
          "type": "float",
          "description": "Delay time in seconds.",
          "required": false,
          "default": 0.5
        },
        {
          "name": "feedback",
          "type": "float",
          "description": "Amount of delayed signal fed back into the effect.",
          "required": false,
          "default": 0.3
        },
        {
          "name": "mix",
          "type": "float",
          "description": "Mix between the dry (original) and wet (delayed) signals.",
          "required": false,
          "default": 0.5
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "audio"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/audio/delay",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/audio/delay.md"
    },
    {
      "type": "lib.audio.Distortion",
      "title": "Distortion",
      "namespace": "lib.audio",
      "description": "Applies a distortion effect to an audio file.\n    audio, effect, distortion\n\n    Use cases:\n    - Add grit and character to instruments\n    - Create aggressive sound effects\n    - Simulate overdriven amplifiers",
      "inputs": [
        {
          "name": "audio",
          "type": "audio",
          "description": "The audio file to process.",
          "required": false,
          "default": {
            "type": "audio",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "drive_db",
          "type": "float",
          "description": "Amount of distortion to apply in decibels.",
          "required": false,
          "default": 25
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "audio"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/audio/distortion",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/audio/distortion.md"
    },
    {
      "type": "lib.audio.Gain",
      "title": "Gain",
      "namespace": "lib.audio",
      "description": "Applies a gain (volume adjustment) to an audio file.\n    audio, effect, volume\n\n    Use cases:\n    - Increase or decrease overall volume of audio\n    - Balance levels between different audio tracks\n    - Prepare audio for further processing",
      "inputs": [
        {
          "name": "audio",
          "type": "audio",
          "description": "The audio file to process.",
          "required": false,
          "default": {
            "type": "audio",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "gain_db",
          "type": "float",
          "description": "Gain to apply in decibels. Positive values increase volume, negative values decrease it.",
          "required": false,
          "default": 0
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "audio"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/audio/gain",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/audio/gain.md"
    },
    {
      "type": "lib.audio.HighPassFilter",
      "title": "High Pass Filter",
      "namespace": "lib.audio",
      "description": "Applies a high-pass filter to attenuate frequencies below a cutoff point.\n    audio, effect, equalizer\n\n    Use cases:\n    - Remove low-frequency rumble or noise\n    - Clean up the low end of a mix\n    - Create filter sweep effects",
      "inputs": [
        {
          "name": "audio",
          "type": "audio",
          "description": "The audio file to process.",
          "required": false,
          "default": {
            "type": "audio",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "cutoff_frequency_hz",
          "type": "float",
          "description": "The cutoff frequency of the high-pass filter in Hz.",
          "required": false,
          "default": 80
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "audio"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/audio/highpassfilter",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/audio/highpassfilter.md"
    },
    {
      "type": "lib.audio.HighShelfFilter",
      "title": "High Shelf Filter",
      "namespace": "lib.audio",
      "description": "Applies a high shelf filter to boost or cut high frequencies.\n    audio, effect, equalizer\n\n    Use cases:\n    - Enhance or reduce treble frequencies\n    - Add brightness or air to audio\n    - Tame harsh high frequencies",
      "inputs": [
        {
          "name": "audio",
          "type": "audio",
          "description": "The audio file to process.",
          "required": false,
          "default": {
            "type": "audio",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "cutoff_frequency_hz",
          "type": "float",
          "description": "The cutoff frequency of the shelf filter in Hz.",
          "required": false,
          "default": 5000
        },
        {
          "name": "gain_db",
          "type": "float",
          "description": "The gain to apply to the frequencies above the cutoff, in dB.",
          "required": false,
          "default": 0
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "audio"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/audio/highshelffilter",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/audio/highshelffilter.md"
    },
    {
      "type": "lib.audio.Limiter",
      "title": "Limiter",
      "namespace": "lib.audio",
      "description": "Applies a limiter effect to an audio file.\n    audio, effect, dynamics\n\n    Use cases:\n    - Prevent audio clipping\n    - Increase perceived loudness without distortion\n    - Control dynamic range of audio",
      "inputs": [
        {
          "name": "audio",
          "type": "audio",
          "description": "The audio file to process.",
          "required": false,
          "default": {
            "type": "audio",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "threshold_db",
          "type": "float",
          "description": "Threshold in dB above which the limiter is applied.",
          "required": false,
          "default": -2
        },
        {
          "name": "release_ms",
          "type": "float",
          "description": "Release time in milliseconds.",
          "required": false,
          "default": 250
        },
        {
          "name": "auto_gain",
          "type": "bool",
          "description": "Apply automatic makeup gain so the limited peaks reach 0 dBFS, turning the headroom below the ceiling into added loudness (maximizer behaviour).",
          "required": false,
          "default": true
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "audio"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/audio/limiter",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/audio/limiter.md"
    },
    {
      "type": "lib.audio.LowPassFilter",
      "title": "Low Pass Filter",
      "namespace": "lib.audio",
      "description": "Applies a low-pass filter to attenuate frequencies above a cutoff point.\n    audio, effect, equalizer\n\n    Use cases:\n    - Reduce high-frequency harshness\n    - Simulate muffled or distant sounds\n    - Create dub-style effects",
      "inputs": [
        {
          "name": "audio",
          "type": "audio",
          "description": "The audio file to process.",
          "required": false,
          "default": {
            "type": "audio",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "cutoff_frequency_hz",
          "type": "float",
          "description": "The cutoff frequency of the low-pass filter in Hz.",
          "required": false,
          "default": 5000
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "audio"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/audio/lowpassfilter",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/audio/lowpassfilter.md"
    },
    {
      "type": "lib.audio.LowShelfFilter",
      "title": "Low Shelf Filter",
      "namespace": "lib.audio",
      "description": "Applies a low shelf filter to boost or cut low frequencies.\n    audio, effect, equalizer\n\n    Use cases:\n    - Enhance or reduce bass frequencies\n    - Shape the low-end response of audio\n    - Compensate for speaker or room deficiencies",
      "inputs": [
        {
          "name": "audio",
          "type": "audio",
          "description": "The audio file to process.",
          "required": false,
          "default": {
            "type": "audio",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "cutoff_frequency_hz",
          "type": "float",
          "description": "The cutoff frequency of the shelf filter in Hz.",
          "required": false,
          "default": 200
        },
        {
          "name": "gain_db",
          "type": "float",
          "description": "The gain to apply to the frequencies below the cutoff, in dB.",
          "required": false,
          "default": 0
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "audio"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/audio/lowshelffilter",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/audio/lowshelffilter.md"
    },
    {
      "type": "lib.audio.NoiseGate",
      "title": "Noise Gate",
      "namespace": "lib.audio",
      "description": "Applies a noise gate effect to an audio file.\n    audio, effect, dynamics\n\n    Use cases:\n    - Reduce background noise in recordings\n    - Clean up audio tracks with unwanted low-level sounds\n    - Create rhythmic effects by gating sustained sounds",
      "inputs": [
        {
          "name": "audio",
          "type": "audio",
          "description": "The audio file to process.",
          "required": false,
          "default": {
            "type": "audio",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "threshold_db",
          "type": "float",
          "description": "Threshold in dB below which the gate is active.",
          "required": false,
          "default": -50
        },
        {
          "name": "attack_ms",
          "type": "float",
          "description": "Attack time in milliseconds.",
          "required": false,
          "default": 1
        },
        {
          "name": "release_ms",
          "type": "float",
          "description": "Release time in milliseconds.",
          "required": false,
          "default": 100
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "audio"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/audio/noisegate",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/audio/noisegate.md"
    },
    {
      "type": "lib.audio.PeakFilter",
      "title": "Peak Filter",
      "namespace": "lib.audio",
      "description": "Applies a peak filter to boost or cut a specific frequency range.\n    audio, effect, equalizer\n\n    Use cases:\n    - Isolate specific frequency ranges\n    - Create telephone or radio voice effects\n    - Focus on particular instrument ranges in a mix",
      "inputs": [
        {
          "name": "audio",
          "type": "audio",
          "description": "The audio file to process.",
          "required": false,
          "default": {
            "type": "audio",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "cutoff_frequency_hz",
          "type": "float",
          "description": "The cutoff frequency of the band-pass filter in Hz.",
          "required": false,
          "default": 1000
        },
        {
          "name": "q_factor",
          "type": "float",
          "description": "The Q factor, determining the width of the band. Higher values create narrower bands.",
          "required": false,
          "default": 1
        },
        {
          "name": "gain_db",
          "type": "float",
          "description": "The gain to apply at the centre frequency, in dB. Positive values boost, negative values cut.",
          "required": false,
          "default": 0
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "audio"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/audio/peakfilter",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/audio/peakfilter.md"
    },
    {
      "type": "lib.audio.Phaser",
      "title": "Phaser",
      "namespace": "lib.audio",
      "description": "Applies a phaser effect to an audio file.\n    audio, effect, modulation\n\n    Use cases:\n    - Create sweeping, swooshing sounds\n    - Add movement to static sounds\n    - Produce psychedelic or space-like effects",
      "inputs": [
        {
          "name": "audio",
          "type": "audio",
          "description": "The audio file to process.",
          "required": false,
          "default": {
            "type": "audio",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "rate_hz",
          "type": "float",
          "description": "Rate of the phaser effect in Hz.",
          "required": false,
          "default": 1
        },
        {
          "name": "depth",
          "type": "float",
          "description": "Depth of the phaser effect.",
          "required": false,
          "default": 0.5
        },
        {
          "name": "centre_frequency_hz",
          "type": "float",
          "description": "Centre frequency of the phaser in Hz.",
          "required": false,
          "default": 1300
        },
        {
          "name": "feedback",
          "type": "float",
          "description": "Feedback of the phaser effect. Negative values invert the phase.",
          "required": false,
          "default": 0
        },
        {
          "name": "mix",
          "type": "float",
          "description": "Mix between the dry (original) and wet (effected) signals.",
          "required": false,
          "default": 0.5
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "audio"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/audio/phaser",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/audio/phaser.md"
    },
    {
      "type": "lib.audio.PitchShift",
      "title": "Pitch Shift",
      "namespace": "lib.audio",
      "description": "Shifts the pitch of an audio file without changing its duration.\n    audio, effect, pitch\n\n    Use cases:\n    - Transpose audio to a different key\n    - Create harmonies or vocal effects\n    - Adjust instrument tuning",
      "inputs": [
        {
          "name": "audio",
          "type": "audio",
          "description": "The audio file to process.",
          "required": false,
          "default": {
            "type": "audio",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "semitones",
          "type": "float",
          "description": "Number of semitones to shift the pitch. Positive values shift up, negative values shift down.",
          "required": false,
          "default": 0
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "audio"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/audio/pitchshift",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/audio/pitchshift.md"
    },
    {
      "type": "lib.audio.Reverb",
      "title": "Reverb",
      "namespace": "lib.audio",
      "description": "Applies a reverb effect to an audio file.\n    audio, effect, reverb\n\n    Use cases:\n    - Add spatial depth to dry recordings\n    - Simulate different room acoustics\n    - Create atmospheric sound effects",
      "inputs": [
        {
          "name": "audio",
          "type": "audio",
          "description": "The audio file to process.",
          "required": false,
          "default": {
            "type": "audio",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "room_scale",
          "type": "float",
          "description": "Size of the simulated room. Higher values create larger spaces.",
          "required": false,
          "default": 0.5
        },
        {
          "name": "damping",
          "type": "float",
          "description": "Amount of high frequency absorption. Higher values create a duller sound.",
          "required": false,
          "default": 0.5
        },
        {
          "name": "wet_level",
          "type": "float",
          "description": "Level of the reverb effect in the output.",
          "required": false,
          "default": 0.15
        },
        {
          "name": "dry_level",
          "type": "float",
          "description": "Level of the original signal in the output.",
          "required": false,
          "default": 0.5
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "audio"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/audio/reverb",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/audio/reverb.md"
    },
    {
      "type": "lib.audio.TimeStretch",
      "title": "Time Stretch",
      "namespace": "lib.audio",
      "description": "Changes the speed of an audio file without altering its pitch.\n    audio, transform, time\n\n    Use cases:\n    - Adjust audio duration to fit video length\n    - Create slow-motion or fast-motion audio effects\n    - Synchronize audio tracks of different lengths",
      "inputs": [
        {
          "name": "audio",
          "type": "audio",
          "description": "The audio file to process.",
          "required": false,
          "default": {
            "type": "audio",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "rate",
          "type": "float",
          "description": "Time stretch factor. Values > 1 speed up, < 1 slow down.",
          "required": false,
          "default": 1
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "audio"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/audio/timestretch",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/audio/timestretch.md"
    },
    {
      "type": "lib.browser.Browser",
      "title": "Browser",
      "namespace": "lib.browser",
      "description": "Fetches content from a web page using a headless browser.\n    browser, web, scraping, content, fetch\n\n    Use cases:\n    - Extract content from JavaScript-heavy websites\n    - Retrieve text content from web pages\n    - Get metadata from web pages\n    - Save extracted content to files",
      "inputs": [
        {
          "name": "url",
          "type": "str",
          "description": "URL to navigate to",
          "required": false,
          "default": ""
        },
        {
          "name": "timeout",
          "type": "int",
          "description": "Timeout in milliseconds for page navigation",
          "required": false,
          "default": 20000
        }
      ],
      "outputs": [
        {
          "name": "success",
          "type": "bool"
        },
        {
          "name": "content",
          "type": "str"
        },
        {
          "name": "metadata",
          "type": "dict[str, any]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/browser/browser",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/browser/browser.md"
    },
    {
      "type": "lib.browser.DownloadFile",
      "title": "Download File",
      "namespace": "lib.browser",
      "description": "Downloads a file from a URL and saves it to disk.\n    download, file, web, save\n\n    Use cases:\n    - Download documents, images, or other files from the web\n    - Save data for further processing\n    - Retrieve file assets for analysis",
      "inputs": [
        {
          "name": "url",
          "type": "str",
          "description": "URL of the file to download",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "bytes"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/browser/downloadfile",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/browser/downloadfile.md"
    },
    {
      "type": "lib.browser.Screenshot",
      "title": "Screenshot",
      "namespace": "lib.browser",
      "description": "Takes a screenshot of a web page or specific element.\n    browser, screenshot, capture, image\n\n    Use cases:\n    - Capture visual representation of web pages\n    - Document specific UI elements\n    - Create visual records of web content",
      "inputs": [
        {
          "name": "url",
          "type": "str",
          "description": "URL to navigate to before taking screenshot",
          "required": false,
          "default": ""
        },
        {
          "name": "selector",
          "type": "str",
          "description": "Optional CSS selector for capturing a specific element",
          "required": false,
          "default": ""
        },
        {
          "name": "timeout",
          "type": "int",
          "description": "Timeout in milliseconds for page navigation",
          "required": false,
          "default": 30000
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/browser/screenshot",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/browser/screenshot.md"
    },
    {
      "type": "lib.browser.SpiderCrawl",
      "title": "Spider Crawl",
      "namespace": "lib.browser",
      "description": "Crawls websites following links and emitting URLs with optional HTML content.\n    spider, crawler, web scraping, links, sitemap\n\n    Use cases:\n    - Build sitemaps and discover website structure\n    - Collect URLs for bulk processing\n    - Find all pages on a website\n    - Extract content from multiple pages\n    - Feed agentic workflows with discovered pages\n    - Analyze website content and structure",
      "inputs": [
        {
          "name": "start_url",
          "type": "str",
          "description": "The starting URL to begin crawling from",
          "required": false,
          "default": ""
        },
        {
          "name": "max_depth",
          "type": "int",
          "description": "Maximum depth to crawl (0 = start page only, 1 = start + linked pages, etc.)",
          "required": false,
          "default": 2
        },
        {
          "name": "max_pages",
          "type": "int",
          "description": "Maximum number of pages to crawl (safety limit)",
          "required": false,
          "default": 50
        },
        {
          "name": "same_domain_only",
          "type": "bool",
          "description": "Only follow links within the same domain as the start URL",
          "required": false,
          "default": true
        },
        {
          "name": "include_html",
          "type": "bool",
          "description": "Include the HTML content of each page in the output (increases bandwidth)",
          "required": false,
          "default": false
        },
        {
          "name": "respect_robots_txt",
          "type": "bool",
          "description": "Respect robots.txt rules (follows web crawler best practices)",
          "required": false,
          "default": true
        },
        {
          "name": "delay_ms",
          "type": "int",
          "description": "Delay in milliseconds between requests (politeness policy)",
          "required": false,
          "default": 1000
        },
        {
          "name": "timeout",
          "type": "int",
          "description": "Timeout in milliseconds for each page load",
          "required": false,
          "default": 30000
        },
        {
          "name": "url_pattern",
          "type": "str",
          "description": "Optional regex pattern to filter URLs (only crawl matching URLs)",
          "required": false,
          "default": ""
        },
        {
          "name": "exclude_pattern",
          "type": "str",
          "description": "Optional regex pattern to exclude URLs (skip matching URLs)",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "url",
          "type": "str"
        },
        {
          "name": "depth",
          "type": "int"
        },
        {
          "name": "html",
          "type": "str"
        },
        {
          "name": "title",
          "type": "str"
        },
        {
          "name": "status_code",
          "type": "int"
        },
        {
          "name": "pages",
          "type": "list"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/browser/spidercrawl",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/browser/spidercrawl.md"
    },
    {
      "type": "lib.browser.WebFetch",
      "title": "Web Fetch",
      "namespace": "lib.browser",
      "description": "Fetches HTML content from a URL and converts it to text.\n    web, fetch, html, markdown, http\n\n    Use cases:\n    - Extract text content from web pages\n    - Process web content for analysis\n    - Save web content to files",
      "inputs": [
        {
          "name": "url",
          "type": "str",
          "description": "URL to fetch content from",
          "required": false,
          "default": ""
        },
        {
          "name": "selector",
          "type": "str",
          "description": "CSS selector to extract specific elements",
          "required": false,
          "default": "body"
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/browser/webfetch",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/browser/webfetch.md"
    },
    {
      "type": "lib.charts.ChartRenderer",
      "title": "Chart Renderer",
      "namespace": "lib.charts",
      "description": "Node responsible for rendering chart configurations into image format using seaborn.\n    chart, seaborn, plot, visualization, data",
      "inputs": [
        {
          "name": "chart_config",
          "type": "chart_config",
          "description": "The chart configuration to render.",
          "required": false,
          "default": {
            "type": "chart_config",
            "title": "",
            "x_label": "",
            "y_label": "",
            "legend": true,
            "data": {
              "type": "chart_data",
              "series": [],
              "row": null,
              "col": null,
              "col_wrap": null
            },
            "height": null,
            "aspect": null,
            "x_lim": null,
            "y_lim": null,
            "x_scale": null,
            "y_scale": null,
            "legend_position": "auto",
            "palette": null,
            "hue_order": null,
            "hue_norm": null,
            "sizes": null,
            "size_order": null,
            "size_norm": null,
            "marginal_kws": null,
            "joint_kws": null,
            "diag_kind": null,
            "corner": false,
            "center": null,
            "vmin": null,
            "vmax": null,
            "cmap": null,
            "annot": false,
            "fmt": ".2g",
            "square": false
          }
        },
        {
          "name": "width",
          "type": "int",
          "description": "The width of the chart in pixels.",
          "required": false,
          "default": 640
        },
        {
          "name": "height",
          "type": "int",
          "description": "The height of the chart in pixels.",
          "required": false,
          "default": 480
        },
        {
          "name": "data",
          "type": "dataframe",
          "description": "The data to visualize as a pandas DataFrame.",
          "required": false,
          "default": {
            "type": "dataframe",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null,
            "columns": null
          }
        },
        {
          "name": "background_color",
          "type": "str",
          "description": "Background color of the chart (CSS color string).",
          "required": false,
          "default": "#ffffff"
        },
        {
          "name": "despine",
          "type": "bool",
          "description": "Whether to remove top and right spines.",
          "required": false,
          "default": true
        },
        {
          "name": "trim_margins",
          "type": "bool",
          "description": "Whether to use tight layout for margins.",
          "required": false,
          "default": true
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/charts/chartrenderer",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/charts/chartrenderer.md"
    },
    {
      "type": "lib.comfy.RunWorkflow",
      "title": "Run ComfyUI Workflow",
      "namespace": "lib.comfy",
      "description": "Run a ComfyUI workflow on a ComfyUI server.\n    comfy, comfyui, workflow, image, diffusion\n\n    Use cases:\n    - Generate images with an existing ComfyUI workflow\n    - Call a local or remote ComfyUI server (RunPod, etc.)\n    - Embed ComfyUI generation inside a NodeTool workflow",
      "inputs": [
        {
          "name": "endpoint",
          "type": "str",
          "description": "ComfyUI server address, e.g. 127.0.0.1:8188 or http://host:8188.",
          "required": false,
          "default": "127.0.0.1:8188"
        },
        {
          "name": "workflow",
          "type": "str",
          "description": "ComfyUI workflow in API (prompt) format, as a JSON string: a map of node id to { class_type, inputs }.",
          "required": false,
          "default": ""
        },
        {
          "name": "timeout",
          "type": "int",
          "description": "Maximum seconds to wait for the workflow to finish.",
          "required": false,
          "default": 600
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "dict[str, any]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/comfy/runcomfyuiworkflow",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/comfy/runcomfyuiworkflow.md"
    },
    {
      "type": "lib.comfy.RunWorkflowOnWorker",
      "title": "Run ComfyUI Workflow (Worker)",
      "namespace": "lib.comfy",
      "description": "Run a ComfyUI workflow on a NodeTool worker (nodetool-worker-comfy) over the worker bridge.\n    comfy, comfyui, workflow, worker, runpod, diffusion\n\n    Use cases:\n    - Run ComfyUI on a remote GPU worker without exposing ComfyUI directly\n    - Drive a RunPod ComfyUI worker from inside a NodeTool workflow",
      "inputs": [
        {
          "name": "worker_url",
          "type": "str",
          "description": "WebSocket URL of the NodeTool worker fronting ComfyUI, e.g. ws://host:7777/ws.",
          "required": false,
          "default": "ws://127.0.0.1:7777/ws"
        },
        {
          "name": "worker_token",
          "type": "str",
          "description": "Bearer token for the worker, if it requires authentication.",
          "required": false,
          "default": ""
        },
        {
          "name": "workflow",
          "type": "str",
          "description": "ComfyUI workflow in API (prompt) format, as a JSON string: a map of node id to { class_type, inputs }.",
          "required": false,
          "default": ""
        },
        {
          "name": "timeout",
          "type": "int",
          "description": "Maximum seconds to wait for the workflow to finish.",
          "required": false,
          "default": 600
        },
        {
          "name": "previews",
          "type": "bool",
          "description": "Stream ComfyUI preview images while the workflow runs.",
          "required": false,
          "default": false
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "dict[str, any]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/comfy/runcomfyuiworkflowworker",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/comfy/runcomfyuiworkflowworker.md"
    },
    {
      "type": "lib.convert.ConvertToMarkdown",
      "title": "Convert To Markdown",
      "namespace": "lib.convert",
      "description": "Converts PDF, DOCX, or HTML to markdown text.\n    markdown, convert, document, pdf, docx, html, bytes\n\n    Connect one input — document ref, raw bytes, or HTML string.",
      "inputs": [
        {
          "name": "document",
          "type": "document",
          "description": "A document ref (PDF, DOCX, or text file)",
          "required": false,
          "default": {
            "type": "document",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "bytes",
          "type": "bytes",
          "description": "Raw PDF or DOCX bytes (e.g. from HTTP GET Bytes)",
          "required": false,
          "default": null
        },
        {
          "name": "html",
          "type": "str",
          "description": "HTML string to convert to markdown",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/convert/converttomarkdown",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/convert/converttomarkdown.md"
    },
    {
      "type": "lib.convert.pandoc.ConvertFile",
      "title": "Convert File",
      "namespace": "lib.convert.pandoc",
      "description": "Converts between different document formats using pandoc.\n    convert, document, format, pandoc\n\n    Use cases:\n    - Convert between various document formats (Markdown, HTML, LaTeX, etc.)\n    - Generate documentation in different formats\n    - Create publication-ready documents",
      "inputs": [
        {
          "name": "input_path",
          "type": "file_path",
          "description": "Path to the input file",
          "required": false,
          "default": {
            "type": "file_path",
            "path": ""
          }
        },
        {
          "name": "input_format",
          "type": "enum",
          "description": "Input format",
          "required": false,
          "default": "markdown"
        },
        {
          "name": "output_format",
          "type": "enum",
          "description": "Output format",
          "required": false,
          "default": "pdf"
        },
        {
          "name": "extra_args",
          "type": "list[str]",
          "description": "Additional pandoc arguments",
          "required": false,
          "default": []
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/convert/pandoc/convertfile",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/convert/pandoc/convertfile.md"
    },
    {
      "type": "lib.convert.pandoc.ConvertText",
      "title": "Convert Text",
      "namespace": "lib.convert.pandoc",
      "description": "Converts text content between different document formats using pandoc.\n    convert, text, format, pandoc\n\n    Use cases:\n    - Convert text content between various formats (Markdown, HTML, LaTeX, etc.)\n    - Transform content without saving to disk\n    - Process text snippets in different formats",
      "inputs": [
        {
          "name": "content",
          "type": "str",
          "description": "Text content to convert",
          "required": false,
          "default": ""
        },
        {
          "name": "input_format",
          "type": "enum",
          "description": "Input format",
          "required": false,
          "default": "markdown"
        },
        {
          "name": "output_format",
          "type": "enum",
          "description": "Output format",
          "required": false,
          "default": "docx"
        },
        {
          "name": "extra_args",
          "type": "list[str]",
          "description": "Additional pandoc arguments",
          "required": false,
          "default": []
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/convert/pandoc/converttext",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/convert/pandoc/converttext.md"
    },
    {
      "type": "lib.datetime.Add",
      "title": "Add / Subtract Time",
      "namespace": "lib.datetime",
      "description": "Add (or subtract, when amount is negative) a number of time units to a date.\n    date, add, subtract, shift, offset",
      "inputs": [
        {
          "name": "date",
          "type": "any",
          "description": "Input date.",
          "required": false,
          "default": ""
        },
        {
          "name": "amount",
          "type": "int",
          "description": "Amount to add (use negative to subtract).",
          "required": false,
          "default": 0
        },
        {
          "name": "unit",
          "type": "enum",
          "description": "Unit of time.",
          "required": false,
          "default": "day"
        }
      ],
      "outputs": [
        {
          "name": "iso",
          "type": "str"
        },
        {
          "name": "epoch_ms",
          "type": "int"
        },
        {
          "name": "date",
          "type": "datetime"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/datetime/addsubtracttime",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/datetime/addsubtracttime.md"
    },
    {
      "type": "lib.datetime.Diff",
      "title": "Date Difference",
      "namespace": "lib.datetime",
      "description": "Difference between two dates (date_a − date_b) expressed in the given unit.\n    date, diff, difference, between, duration",
      "inputs": [
        {
          "name": "date_a",
          "type": "any",
          "description": "",
          "required": false,
          "default": ""
        },
        {
          "name": "date_b",
          "type": "any",
          "description": "",
          "required": false,
          "default": ""
        },
        {
          "name": "unit",
          "type": "enum",
          "description": "Unit for the returned diff.",
          "required": false,
          "default": "day"
        }
      ],
      "outputs": [
        {
          "name": "diff",
          "type": "int"
        },
        {
          "name": "is_before",
          "type": "bool"
        },
        {
          "name": "is_after",
          "type": "bool"
        },
        {
          "name": "is_same",
          "type": "bool"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/datetime/datedifference",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/datetime/datedifference.md"
    },
    {
      "type": "lib.datetime.Format",
      "title": "Format Date",
      "namespace": "lib.datetime",
      "description": "Parse a date string/number/Date and format it. Supports tokens YYYY, MM, DD, HH, mm, ss, SSS, Z. Use [brackets] for literals.\n    date, format, parse, strftime",
      "inputs": [
        {
          "name": "date",
          "type": "any",
          "description": "Date string, number (epoch ms), or Date.",
          "required": false,
          "default": ""
        },
        {
          "name": "pattern",
          "type": "str",
          "description": "Format pattern (YYYY, MM, DD, HH, mm, ss, SSS, Z).",
          "required": false,
          "default": "YYYY-MM-DD HH:mm:ss"
        }
      ],
      "outputs": [
        {
          "name": "formatted",
          "type": "str"
        },
        {
          "name": "iso",
          "type": "str"
        },
        {
          "name": "epoch_ms",
          "type": "int"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/datetime/formatdate",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/datetime/formatdate.md"
    },
    {
      "type": "lib.datetime.Now",
      "title": "Now",
      "namespace": "lib.datetime",
      "description": "Return the current date as ISO string, epoch ms, and a Date value.\n    date, time, now, current",
      "inputs": [],
      "outputs": [
        {
          "name": "iso",
          "type": "str"
        },
        {
          "name": "epoch_ms",
          "type": "int"
        },
        {
          "name": "date",
          "type": "datetime"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/datetime/now",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/datetime/now.md"
    },
    {
      "type": "lib.datetime.StartEnd",
      "title": "Start / End of Period",
      "namespace": "lib.datetime",
      "description": "Return the start and end of the given period (day, week, month, year).\n    date, start, end, period, boundary",
      "inputs": [
        {
          "name": "date",
          "type": "any",
          "description": "",
          "required": false,
          "default": ""
        },
        {
          "name": "unit",
          "type": "enum",
          "description": "",
          "required": false,
          "default": "day"
        }
      ],
      "outputs": [
        {
          "name": "start_iso",
          "type": "str"
        },
        {
          "name": "end_iso",
          "type": "str"
        },
        {
          "name": "start",
          "type": "datetime"
        },
        {
          "name": "end",
          "type": "datetime"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/datetime/startendofperiod",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/datetime/startendofperiod.md"
    },
    {
      "type": "lib.docx.AddHeading",
      "title": "Add Heading",
      "namespace": "lib.docx",
      "description": "Adds a heading to the document\n    document, docx, heading, format",
      "inputs": [
        {
          "name": "document",
          "type": "document",
          "description": "The document to add the heading to",
          "required": false,
          "default": {
            "type": "document",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "text",
          "type": "str",
          "description": "The heading text",
          "required": false,
          "default": ""
        },
        {
          "name": "level",
          "type": "int",
          "description": "Heading level (1-9)",
          "required": false,
          "default": 1
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "document"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/docx/addheading",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/docx/addheading.md"
    },
    {
      "type": "lib.docx.AddImage",
      "title": "Add Image",
      "namespace": "lib.docx",
      "description": "Adds an image to the document\n    document, docx, image, format",
      "inputs": [
        {
          "name": "document",
          "type": "document",
          "description": "The document to add the image to",
          "required": false,
          "default": {
            "type": "document",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "image",
          "type": "image",
          "description": "The image to add",
          "required": false,
          "default": {
            "type": "image",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "width",
          "type": "float",
          "description": "Image width in inches",
          "required": false,
          "default": 0
        },
        {
          "name": "height",
          "type": "float",
          "description": "Image height in inches",
          "required": false,
          "default": 0
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "document"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/docx/addimage",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/docx/addimage.md"
    },
    {
      "type": "lib.docx.AddPageBreak",
      "title": "Add Page Break",
      "namespace": "lib.docx",
      "description": "Adds a page break to the document\n    document, docx, format, layout",
      "inputs": [
        {
          "name": "document",
          "type": "document",
          "description": "The document to add the page break to",
          "required": false,
          "default": {
            "type": "document",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "document"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/docx/addpagebreak",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/docx/addpagebreak.md"
    },
    {
      "type": "lib.docx.AddParagraph",
      "title": "Add Paragraph",
      "namespace": "lib.docx",
      "description": "Adds a paragraph of text to the document\n    document, docx, text, format",
      "inputs": [
        {
          "name": "document",
          "type": "document",
          "description": "The document to add the paragraph to",
          "required": false,
          "default": {
            "type": "document",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "text",
          "type": "str",
          "description": "The paragraph text",
          "required": false,
          "default": ""
        },
        {
          "name": "alignment",
          "type": "enum",
          "description": "Text alignment",
          "required": false,
          "default": "LEFT"
        },
        {
          "name": "bold",
          "type": "bool",
          "description": "Make text bold",
          "required": false,
          "default": false
        },
        {
          "name": "italic",
          "type": "bool",
          "description": "Make text italic",
          "required": false,
          "default": false
        },
        {
          "name": "font_size",
          "type": "int",
          "description": "Font size in points",
          "required": false,
          "default": 12
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "document"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/docx/addparagraph",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/docx/addparagraph.md"
    },
    {
      "type": "lib.docx.AddTable",
      "title": "Add Table",
      "namespace": "lib.docx",
      "description": "Adds a table to the document\n    document, docx, table, format",
      "inputs": [
        {
          "name": "document",
          "type": "document",
          "description": "The document to add the table to",
          "required": false,
          "default": {
            "type": "document",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "data",
          "type": "dataframe",
          "description": "The data to add to the table",
          "required": false,
          "default": {
            "type": "dataframe",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null,
            "columns": null
          }
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "document"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/docx/addtable",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/docx/addtable.md"
    },
    {
      "type": "lib.docx.CreateDocument",
      "title": "Create Document",
      "namespace": "lib.docx",
      "description": "Creates a new Word document\n    document, docx, file, create",
      "inputs": [],
      "outputs": [
        {
          "name": "output",
          "type": "document"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/docx/createdocument",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/docx/createdocument.md"
    },
    {
      "type": "lib.docx.LoadWordDocument",
      "title": "Load Word Document",
      "namespace": "lib.docx",
      "description": "Loads a Word document from disk\n    document, docx, file, load, input",
      "inputs": [
        {
          "name": "path",
          "type": "str",
          "description": "Path to the document to load",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "document"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/docx/loadworddocument",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/docx/loadworddocument.md"
    },
    {
      "type": "lib.docx.SaveDocument",
      "title": "Save Document",
      "namespace": "lib.docx",
      "description": "Writes the document to a file\n    document, docx, file, save, output",
      "inputs": [
        {
          "name": "document",
          "type": "document",
          "description": "The document to write",
          "required": false,
          "default": {
            "type": "document",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "path",
          "type": "file_path",
          "description": "The folder to write the document to.",
          "required": false,
          "default": {
            "type": "file_path",
            "path": ""
          }
        },
        {
          "name": "filename",
          "type": "str",
          "description": "\n        The filename to write the document to.\n        You can use time and date variables to create unique names:\n        %Y - Year\n        %m - Month\n        %d - Day\n        %H - Hour\n        %M - Minute\n        %S - Second\n        ",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/docx/savedocument",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/docx/savedocument.md"
    },
    {
      "type": "lib.docx.SetDocumentProperties",
      "title": "Set Document Properties",
      "namespace": "lib.docx",
      "description": "Sets document metadata properties\n    document, docx, metadata, properties",
      "inputs": [
        {
          "name": "document",
          "type": "document",
          "description": "The document to modify",
          "required": false,
          "default": {
            "type": "document",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "title",
          "type": "str",
          "description": "Document title",
          "required": false,
          "default": ""
        },
        {
          "name": "author",
          "type": "str",
          "description": "Document author",
          "required": false,
          "default": ""
        },
        {
          "name": "subject",
          "type": "str",
          "description": "Document subject",
          "required": false,
          "default": ""
        },
        {
          "name": "keywords",
          "type": "str",
          "description": "Document keywords",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "document"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/docx/setdocumentproperties",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/docx/setdocumentproperties.md"
    },
    {
      "type": "lib.epub.ExtractChapters",
      "title": "EPUB Extract Chapters",
      "namespace": "lib.epub",
      "description": "Extract each chapter as a separate text item with its title.\n    epub, ebook, chapters, split, text",
      "inputs": [],
      "outputs": [
        {
          "name": "output",
          "type": "list[dict]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/epub/epubextractchapters",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/epub/epubextractchapters.md"
    },
    {
      "type": "lib.epub.ExtractText",
      "title": "EPUB Extract Text",
      "namespace": "lib.epub",
      "description": "Extract plain text from an EPUB file by concatenating all chapters.\n    epub, ebook, text, extract, content",
      "inputs": [
        {
          "name": "chapter_separator",
          "type": "str",
          "description": "String inserted between chapters in the output",
          "required": false,
          "default": "\n\n"
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/epub/epubextracttext",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/epub/epubextracttext.md"
    },
    {
      "type": "lib.epub.Metadata",
      "title": "EPUB Metadata",
      "namespace": "lib.epub",
      "description": "Read metadata (title, author, language, publisher, etc.) from an EPUB file.\n    epub, ebook, metadata, title, author",
      "inputs": [],
      "outputs": [
        {
          "name": "output",
          "type": "dict"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/epub/epubmetadata",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/epub/epubmetadata.md"
    },
    {
      "type": "lib.epub.TableOfContents",
      "title": "EPUB Table of Contents",
      "namespace": "lib.epub",
      "description": "Get the table of contents (chapter titles, ids, hrefs) from an EPUB file.\n    epub, ebook, toc, chapters, contents",
      "inputs": [],
      "outputs": [
        {
          "name": "output",
          "type": "list[dict]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/epub/epubtableofcontents",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/epub/epubtableofcontents.md"
    },
    {
      "type": "lib.excel.AutoFitColumns",
      "title": "Auto Fit Columns",
      "namespace": "lib.excel",
      "description": "Automatically adjusts column widths to fit content.\n    excel, format, columns\n\n    Use cases:\n    - Improve spreadsheet readability\n    - Professional presentation",
      "inputs": [
        {
          "name": "workbook",
          "type": "excel",
          "description": "The Excel workbook to format",
          "required": false,
          "default": {
            "type": "excel",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "sheet_name",
          "type": "str",
          "description": "Target worksheet name",
          "required": false,
          "default": "Sheet1"
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "any"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/excel/autofitcolumns",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/excel/autofitcolumns.md"
    },
    {
      "type": "lib.excel.CreateWorkbook",
      "title": "Create Workbook",
      "namespace": "lib.excel",
      "description": "Creates a new Excel workbook.\n    excel, workbook, create\n\n    Use cases:\n    - Initialize new Excel files\n    - Start spreadsheet creation workflows",
      "inputs": [
        {
          "name": "sheet_name",
          "type": "str",
          "description": "Name for the first worksheet",
          "required": false,
          "default": "Sheet1"
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "excel"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/excel/createworkbook",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/excel/createworkbook.md"
    },
    {
      "type": "lib.excel.DataFrameToExcel",
      "title": "Data Frame To Excel",
      "namespace": "lib.excel",
      "description": "Writes a DataFrame to an Excel worksheet.\n    excel, dataframe, export\n\n    Use cases:\n    - Export data analysis results\n    - Create reports from data",
      "inputs": [
        {
          "name": "workbook",
          "type": "excel",
          "description": "The Excel workbook to write to",
          "required": false,
          "default": {
            "type": "excel",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "dataframe",
          "type": "dataframe",
          "description": "DataFrame to write",
          "required": false,
          "default": {
            "type": "dataframe",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null,
            "columns": null
          }
        },
        {
          "name": "sheet_name",
          "type": "str",
          "description": "Target worksheet name",
          "required": false,
          "default": "Sheet1"
        },
        {
          "name": "start_cell",
          "type": "str",
          "description": "Starting cell for data",
          "required": false,
          "default": "A1"
        },
        {
          "name": "include_header",
          "type": "bool",
          "description": "Include column headers",
          "required": false,
          "default": true
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "any"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/excel/dataframetoexcel",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/excel/dataframetoexcel.md"
    },
    {
      "type": "lib.excel.ExcelToDataFrame",
      "title": "Excel To Data Frame",
      "namespace": "lib.excel",
      "description": "Reads an Excel worksheet into a pandas DataFrame.\n    excel, dataframe, import\n\n    Use cases:\n    - Import Excel data for analysis\n    - Process spreadsheet contents",
      "inputs": [
        {
          "name": "workbook",
          "type": "excel",
          "description": "The Excel workbook to read from",
          "required": false,
          "default": {
            "type": "excel",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "sheet_name",
          "type": "str",
          "description": "Source worksheet name",
          "required": false,
          "default": "Sheet1"
        },
        {
          "name": "has_header",
          "type": "bool",
          "description": "First row contains headers",
          "required": false,
          "default": true
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "dataframe"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/excel/exceltodataframe",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/excel/exceltodataframe.md"
    },
    {
      "type": "lib.excel.FormatCells",
      "title": "Format Cells",
      "namespace": "lib.excel",
      "description": "Applies formatting to a range of cells.\n    excel, format, style\n\n    Use cases:\n    - Highlight important data\n    - Create professional looking reports",
      "inputs": [
        {
          "name": "workbook",
          "type": "excel",
          "description": "The Excel workbook to format",
          "required": false,
          "default": {
            "type": "excel",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "sheet_name",
          "type": "str",
          "description": "Target worksheet name",
          "required": false,
          "default": "Sheet1"
        },
        {
          "name": "cell_range",
          "type": "str",
          "description": "Cell range to format (e.g. 'A1:B10')",
          "required": false,
          "default": "A1:B10"
        },
        {
          "name": "bold",
          "type": "bool",
          "description": "Make text bold",
          "required": false,
          "default": false
        },
        {
          "name": "background_color",
          "type": "str",
          "description": "Background color in hex format (e.g. 'FFFF00' for yellow)",
          "required": false,
          "default": "FFFF00"
        },
        {
          "name": "text_color",
          "type": "str",
          "description": "Text color in hex format",
          "required": false,
          "default": "000000"
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "any"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/excel/formatcells",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/excel/formatcells.md"
    },
    {
      "type": "lib.excel.SaveWorkbook",
      "title": "Save Workbook",
      "namespace": "lib.excel",
      "description": "Saves an Excel workbook to disk.\n    excel, save, export\n\n    Use cases:\n    - Export final spreadsheet\n    - Save work in progress",
      "inputs": [
        {
          "name": "workbook",
          "type": "excel",
          "description": "The Excel workbook to save",
          "required": false,
          "default": {
            "type": "excel",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "folder",
          "type": "file_path",
          "description": "The folder to save the file to.",
          "required": false,
          "default": {
            "type": "file_path",
            "path": ""
          }
        },
        {
          "name": "filename",
          "type": "str",
          "description": "\n        The filename to save the file to.\n        You can use time and date variables to create unique names:\n        %Y - Year\n        %m - Month\n        %d - Day\n        %H - Hour\n        %M - Minute\n        %S - Second\n        ",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/excel/saveworkbook",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/excel/saveworkbook.md"
    },
    {
      "type": "lib.graphql.BatchQuery",
      "title": "GraphQL Batch Query",
      "namespace": "lib.graphql",
      "description": "Execute multiple GraphQL operations in a single batch request.\n    graphql, batch, query, mutation, api, bulk",
      "inputs": [
        {
          "name": "url",
          "type": "str",
          "description": "GraphQL API endpoint URL",
          "required": false,
          "default": ""
        },
        {
          "name": "queries_json",
          "type": "str",
          "description": "JSON array of {query, variables, operationName} objects",
          "required": false,
          "default": "[]"
        },
        {
          "name": "headers",
          "type": "str",
          "description": "Optional JSON object of additional HTTP headers",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "list"
        },
        {
          "name": "status",
          "type": "int"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/graphql/graphqlbatchquery",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/graphql/graphqlbatchquery.md"
    },
    {
      "type": "lib.graphql.Introspection",
      "title": "GraphQL Introspection",
      "namespace": "lib.graphql",
      "description": "Fetch the schema of a GraphQL endpoint via introspection query.\n    graphql, introspection, schema, types, api",
      "inputs": [
        {
          "name": "url",
          "type": "str",
          "description": "GraphQL API endpoint URL",
          "required": false,
          "default": ""
        },
        {
          "name": "headers",
          "type": "str",
          "description": "Optional JSON object of additional HTTP headers",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "dict"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/graphql/graphqlintrospection",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/graphql/graphqlintrospection.md"
    },
    {
      "type": "lib.graphql.Query",
      "title": "GraphQL Query",
      "namespace": "lib.graphql",
      "description": "Execute a GraphQL query or mutation against any endpoint.\n    graphql, query, mutation, api, post",
      "inputs": [
        {
          "name": "url",
          "type": "str",
          "description": "GraphQL API endpoint URL",
          "required": false,
          "default": ""
        },
        {
          "name": "query",
          "type": "str",
          "description": "GraphQL query or mutation string",
          "required": false,
          "default": ""
        },
        {
          "name": "variables",
          "type": "str",
          "description": "Optional JSON object of query variables",
          "required": false,
          "default": ""
        },
        {
          "name": "headers",
          "type": "str",
          "description": "Optional JSON object of additional HTTP headers",
          "required": false,
          "default": ""
        },
        {
          "name": "operation_name",
          "type": "str",
          "description": "Optional operation name for multi-operation documents",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "data",
          "type": "any"
        },
        {
          "name": "errors",
          "type": "list"
        },
        {
          "name": "status",
          "type": "int"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/graphql/graphqlquery",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/graphql/graphqlquery.md"
    },
    {
      "type": "lib.graphql.QueryWithAuth",
      "title": "GraphQL Query with Auth",
      "namespace": "lib.graphql",
      "description": "Execute a GraphQL query or mutation with Bearer token authentication.\n    graphql, query, mutation, api, auth, bearer, token",
      "inputs": [
        {
          "name": "url",
          "type": "str",
          "description": "GraphQL API endpoint URL",
          "required": false,
          "default": ""
        },
        {
          "name": "query",
          "type": "str",
          "description": "GraphQL query or mutation string",
          "required": false,
          "default": ""
        },
        {
          "name": "variables",
          "type": "str",
          "description": "Optional JSON object of query variables",
          "required": false,
          "default": ""
        },
        {
          "name": "headers",
          "type": "str",
          "description": "Optional JSON object of additional HTTP headers",
          "required": false,
          "default": ""
        },
        {
          "name": "operation_name",
          "type": "str",
          "description": "Optional operation name for multi-operation documents",
          "required": false,
          "default": ""
        },
        {
          "name": "auth_token",
          "type": "str",
          "description": "Bearer token, falls back to GRAPHQL_AUTH_TOKEN secret",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "data",
          "type": "any"
        },
        {
          "name": "errors",
          "type": "list"
        },
        {
          "name": "status",
          "type": "int"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/graphql/graphqlquerywithauth",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/graphql/graphqlquerywithauth.md"
    },
    {
      "type": "lib.grid.CombineImageGrid",
      "title": "Combine Image Grid",
      "namespace": "lib.grid",
      "description": "Combine a grid of image tiles into a single image.\n    image, grid, combine, tiles\n\n    Use cases:\n    - Reassemble processed image chunks\n    - Create composite images from smaller parts\n    - Merge tiled image data from distributed processing",
      "inputs": [
        {
          "name": "tiles",
          "type": "list[image]",
          "description": "List of image tiles to combine.",
          "required": false,
          "default": []
        },
        {
          "name": "columns",
          "type": "int",
          "description": "Number of columns in the grid.",
          "required": false,
          "default": 0
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/grid/combineimagegrid",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/grid/combineimagegrid.md"
    },
    {
      "type": "lib.grid.SliceImageGrid",
      "title": "Slice Image Grid",
      "namespace": "lib.grid",
      "description": "Slice an image into a grid of tiles.\n    image, grid, slice, tiles\n\n    Use cases:\n    - Prepare large images for processing in smaller chunks\n    - Create image puzzles or mosaic effects\n    - Distribute image processing tasks across multiple workers",
      "inputs": [
        {
          "name": "image",
          "type": "image",
          "description": "The image to slice into a grid.",
          "required": false,
          "default": {
            "type": "image",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "columns",
          "type": "int",
          "description": "Number of columns in the grid.",
          "required": false,
          "default": 0
        },
        {
          "name": "rows",
          "type": "int",
          "description": "Number of rows in the grid.",
          "required": false,
          "default": 0
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "list[image]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/grid/sliceimagegrid",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/grid/sliceimagegrid.md"
    },
    {
      "type": "lib.html.BaseUrl",
      "title": "Base Url",
      "namespace": "lib.html",
      "description": "Extract the base URL from a given URL.\n    url parsing, domain extraction, web utilities\n\n    Use cases:\n    - Get domain name from full URLs\n    - Clean up URLs for comparison\n    - Extract root website addresses\n    - Standardize URL formats",
      "inputs": [
        {
          "name": "url",
          "type": "str",
          "description": "The URL to extract the base from",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/html/baseurl",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/html/baseurl.md"
    },
    {
      "type": "lib.html.ExtractAudio",
      "title": "Extract Audio",
      "namespace": "lib.html",
      "description": "Extract audio elements from HTML content.\n    extract, audio, src\n\n    Use cases:\n    - Collect audio sources from web pages\n    - Analyze audio usage on websites\n    - Create audio playlists",
      "inputs": [
        {
          "name": "html",
          "type": "str",
          "description": "The HTML content to extract audio from.",
          "required": false,
          "default": ""
        },
        {
          "name": "base_url",
          "type": "str",
          "description": "The base URL of the page, used to resolve relative audio URLs.",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "audio",
          "type": "audio"
        },
        {
          "name": "audios",
          "type": "list"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/html/extractaudio",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/html/extractaudio.md"
    },
    {
      "type": "lib.html.ExtractImages",
      "title": "Extract Images",
      "namespace": "lib.html",
      "description": "Extract images from HTML content.\n    extract, images, src\n\n    Use cases:\n    - Collect images from web pages\n    - Analyze image usage on websites\n    - Create image galleries",
      "inputs": [
        {
          "name": "html",
          "type": "str",
          "description": "The HTML content to extract images from.",
          "required": false,
          "default": ""
        },
        {
          "name": "base_url",
          "type": "str",
          "description": "The base URL of the page, used to resolve relative image URLs.",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "image",
          "type": "image"
        },
        {
          "name": "images",
          "type": "list"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/html/extractimages",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/html/extractimages.md"
    },
    {
      "type": "lib.html.ExtractLinks",
      "title": "Extract Links",
      "namespace": "lib.html",
      "description": "Extract all links from HTML content with type classification.\n    extract, links, urls, web scraping, html\n\n    Use cases:\n    - Analyze website structure and navigation\n    - Discover related content and resources\n    - Build sitemaps and link graphs\n    - Find internal and external references\n    - Collect URLs for further processing",
      "inputs": [
        {
          "name": "html",
          "type": "str",
          "description": "The HTML content to extract links from.",
          "required": false,
          "default": ""
        },
        {
          "name": "base_url",
          "type": "str",
          "description": "The base URL of the page, used to determine internal/external links.",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "href",
          "type": "str"
        },
        {
          "name": "text",
          "type": "str"
        },
        {
          "name": "type",
          "type": "str"
        },
        {
          "name": "links",
          "type": "list"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/html/extractlinks",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/html/extractlinks.md"
    },
    {
      "type": "lib.html.ExtractMetadata",
      "title": "Extract Metadata",
      "namespace": "lib.html",
      "description": "Extract metadata from HTML content.\n    extract, metadata, seo\n\n    Use cases:\n    - Analyze SEO elements\n    - Gather page information\n    - Extract structured data",
      "inputs": [
        {
          "name": "html",
          "type": "str",
          "description": "The HTML content to extract metadata from.",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "title",
          "type": "str"
        },
        {
          "name": "description",
          "type": "str"
        },
        {
          "name": "keywords",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/html/extractmetadata",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/html/extractmetadata.md"
    },
    {
      "type": "lib.html.ExtractVideos",
      "title": "Extract Videos",
      "namespace": "lib.html",
      "description": "Extract videos from HTML content.\n    extract, videos, src\n\n    Use cases:\n    - Collect video sources from web pages\n    - Analyze video usage on websites\n    - Create video playlists",
      "inputs": [
        {
          "name": "html",
          "type": "str",
          "description": "The HTML content to extract videos from.",
          "required": false,
          "default": ""
        },
        {
          "name": "base_url",
          "type": "str",
          "description": "The base URL of the page, used to resolve relative video URLs.",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "video",
          "type": "video"
        },
        {
          "name": "videos",
          "type": "list"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/html/extractvideos",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/html/extractvideos.md"
    },
    {
      "type": "lib.html.HTMLToText",
      "title": "Convert HTML to Text",
      "namespace": "lib.html",
      "description": "Converts HTML to plain text by removing tags and decoding entities using BeautifulSoup.\n    html, text, convert\n\n    Use cases:\n    - Cleaning HTML content for text analysis\n    - Extracting readable content from web pages\n    - Preparing HTML data for natural language processing",
      "inputs": [
        {
          "name": "text",
          "type": "str",
          "description": "",
          "required": false,
          "default": ""
        },
        {
          "name": "preserve_linebreaks",
          "type": "bool",
          "description": "Convert block-level elements to newlines",
          "required": false,
          "default": true
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/html/converthtmltotext",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/html/converthtmltotext.md"
    },
    {
      "type": "lib.html.WebsiteContentExtractor",
      "title": "Website Content Extractor",
      "namespace": "lib.html",
      "description": "Extract main content from a website, removing navigation, ads, and other non-essential elements.\n    scrape, web scraping, content extraction, text analysis\n\n    Use cases:\n    - Clean web content for further analysis\n    - Extract article text from news websites\n    - Prepare web content for summarization",
      "inputs": [
        {
          "name": "html_content",
          "type": "str",
          "description": "The raw HTML content of the website.",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/html/websitecontentextractor",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/html/websitecontentextractor.md"
    },
    {
      "type": "lib.http.Delete",
      "title": "HTTP DELETE",
      "namespace": "lib.http",
      "description": "Send a DELETE request.\n    http, delete, remove, request, api",
      "inputs": [
        {
          "name": "url",
          "type": "str",
          "description": "URL to delete",
          "required": false,
          "default": ""
        },
        {
          "name": "headers",
          "type": "str",
          "description": "Optional JSON object of request headers",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "bool"
        },
        {
          "name": "status",
          "type": "int"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/http/httpdelete",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/http/httpdelete.md"
    },
    {
      "type": "lib.http.GetBytes",
      "title": "HTTP GET Bytes",
      "namespace": "lib.http",
      "description": "Download binary data from a URL.\n    http, get, bytes, binary, download, fetch",
      "inputs": [
        {
          "name": "url",
          "type": "str",
          "description": "URL to fetch",
          "required": false,
          "default": ""
        },
        {
          "name": "headers",
          "type": "str",
          "description": "Optional JSON object of request headers",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "bytes"
        },
        {
          "name": "status",
          "type": "int"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/http/httpgetbytes",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/http/httpgetbytes.md"
    },
    {
      "type": "lib.http.GetJSON",
      "title": "HTTP GET JSON",
      "namespace": "lib.http",
      "description": "Fetch and parse JSON from a URL.\n    http, get, json, fetch, request, api",
      "inputs": [
        {
          "name": "url",
          "type": "str",
          "description": "URL to fetch",
          "required": false,
          "default": ""
        },
        {
          "name": "headers",
          "type": "str",
          "description": "Optional JSON object of request headers",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "any"
        },
        {
          "name": "status",
          "type": "int"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/http/httpgetjson",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/http/httpgetjson.md"
    },
    {
      "type": "lib.http.GetText",
      "title": "HTTP GET Text",
      "namespace": "lib.http",
      "description": "Fetch text content from a URL.\n    http, get, text, fetch, request, api",
      "inputs": [
        {
          "name": "url",
          "type": "str",
          "description": "URL to fetch",
          "required": false,
          "default": ""
        },
        {
          "name": "headers",
          "type": "str",
          "description": "Optional JSON object of request headers",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        },
        {
          "name": "status",
          "type": "int"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/http/httpgettext",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/http/httpgettext.md"
    },
    {
      "type": "lib.http.Patch",
      "title": "HTTP PATCH",
      "namespace": "lib.http",
      "description": "Send a PATCH request with JSON body.\n    http, patch, update, request, api",
      "inputs": [
        {
          "name": "url",
          "type": "str",
          "description": "URL to patch",
          "required": false,
          "default": ""
        },
        {
          "name": "body",
          "type": "any",
          "description": "Request body (will be JSON-encoded)",
          "required": false,
          "default": null
        },
        {
          "name": "headers",
          "type": "str",
          "description": "Optional JSON object of request headers",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "any"
        },
        {
          "name": "status",
          "type": "int"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/http/httppatch",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/http/httppatch.md"
    },
    {
      "type": "lib.http.Post",
      "title": "HTTP POST",
      "namespace": "lib.http",
      "description": "Send a POST request with JSON body.\n    http, post, request, api, send",
      "inputs": [
        {
          "name": "url",
          "type": "str",
          "description": "URL to send to",
          "required": false,
          "default": ""
        },
        {
          "name": "body",
          "type": "any",
          "description": "Request body (will be JSON-encoded)",
          "required": false,
          "default": null
        },
        {
          "name": "headers",
          "type": "str",
          "description": "Optional JSON object of request headers",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "any"
        },
        {
          "name": "status",
          "type": "int"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/http/httppost",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/http/httppost.md"
    },
    {
      "type": "lib.http.Put",
      "title": "HTTP PUT",
      "namespace": "lib.http",
      "description": "Send a PUT request with JSON body.\n    http, put, update, request, api",
      "inputs": [
        {
          "name": "url",
          "type": "str",
          "description": "URL to update",
          "required": false,
          "default": ""
        },
        {
          "name": "body",
          "type": "any",
          "description": "Request body (will be JSON-encoded)",
          "required": false,
          "default": null
        },
        {
          "name": "headers",
          "type": "str",
          "description": "Optional JSON object of request headers",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "any"
        },
        {
          "name": "status",
          "type": "int"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/http/httpput",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/http/httpput.md"
    },
    {
      "type": "lib.image.channel.Merge",
      "title": "Channel Merge",
      "namespace": "lib.image.channel",
      "description": "Take RGB from one image and a selectable channel of another as the new alpha.\n    image, channels, merge, alpha",
      "inputs": [],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/image/channel/channelmerge",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/image/channel/channelmerge.md"
    },
    {
      "type": "lib.image.channel.Shuffle",
      "title": "Channel Shuffle",
      "namespace": "lib.image.channel",
      "description": "Permute RGBA channels. Each output channel picks any input channel (0=R, 1=G, 2=B, 3=A).\n    image, channels, swap, rgba",
      "inputs": [],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/image/channel/channelshuffle",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/image/channel/channelshuffle.md"
    },
    {
      "type": "lib.image.color.BrightnessContrast",
      "title": "Brightness / Contrast",
      "namespace": "lib.image.color",
      "description": "Additive brightness, multiplicative contrast around mid-gray.\n    image, color, brightness, contrast, levels",
      "inputs": [],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/image/color/brightnesscontrast",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/image/color/brightnesscontrast.md"
    },
    {
      "type": "lib.image.color.ChannelSplit",
      "title": "Channel Split",
      "namespace": "lib.image.color",
      "description": "Extract a single channel (R/G/B/A) as a grayscale image, preserving alpha.\n    image, color, channel, split, isolate",
      "inputs": [],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/image/color/channelsplit",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/image/color/channelsplit.md"
    },
    {
      "type": "lib.image.color.Exposure",
      "title": "Exposure",
      "namespace": "lib.image.color",
      "description": "Adjust exposure in stops (rgb *= 2^stops).\n    image, color, exposure, stops, ev",
      "inputs": [],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/image/color/exposure",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/image/color/exposure.md"
    },
    {
      "type": "lib.image.color.Grade",
      "title": "Color Grade",
      "namespace": "lib.image.color",
      "description": "Full colour-grade pass: brightness, contrast, saturation, hue, temperature, tint, shadows, highlights.\n    image, color, grade, color correction",
      "inputs": [],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/image/color/colorgrade",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/image/color/colorgrade.md"
    },
    {
      "type": "lib.image.color.HSB",
      "title": "HSB",
      "namespace": "lib.image.color",
      "description": "Hue rotation (degrees), saturation and brightness multipliers.\n    image, color, hue, saturation, brightness, hsb, hsv",
      "inputs": [],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/image/color/hsb",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/image/color/hsb.md"
    },
    {
      "type": "lib.image.color.Invert",
      "title": "Invert",
      "namespace": "lib.image.color",
      "description": "Invert RGB (1 - rgb), preserve alpha. Amount fades between passthrough and full invert.\n    image, color, invert, negative",
      "inputs": [],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/image/color/invert",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/image/color/invert.md"
    },
    {
      "type": "lib.image.color.Posterize",
      "title": "Posterize",
      "namespace": "lib.image.color",
      "description": "Quantize each channel to N levels.\n    image, color, posterize, quantize, levels",
      "inputs": [],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/image/color/posterize",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/image/color/posterize.md"
    },
    {
      "type": "lib.image.draw.AngularGradient",
      "title": "Angular Gradient",
      "namespace": "lib.image.draw",
      "description": "Sweep gradient around the canvas centre.\n    image, gradient, angular, conic, draw",
      "inputs": [],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/image/draw/angulargradient",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/image/draw/angulargradient.md"
    },
    {
      "type": "lib.image.draw.Checkerboard",
      "title": "Checkerboard",
      "namespace": "lib.image.draw",
      "description": "Two-color checkerboard with configurable cell size.\n    image, checkerboard, pattern, draw",
      "inputs": [],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/image/draw/checkerboard",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/image/draw/checkerboard.md"
    },
    {
      "type": "lib.image.draw.DiamondGradient",
      "title": "Diamond Gradient",
      "namespace": "lib.image.draw",
      "description": "Inner-to-outer diamond / square gradient.\n    image, gradient, diamond, draw",
      "inputs": [],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/image/draw/diamondgradient",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/image/draw/diamondgradient.md"
    },
    {
      "type": "lib.image.draw.LinearGradient",
      "title": "Linear Gradient",
      "namespace": "lib.image.draw",
      "description": "Two-stop linear gradient with angle and midpoint.\n    image, gradient, linear, draw",
      "inputs": [],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/image/draw/lineargradient",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/image/draw/lineargradient.md"
    },
    {
      "type": "lib.image.draw.RadialGradient",
      "title": "Radial Gradient",
      "namespace": "lib.image.draw",
      "description": "Inner-to-outer radial gradient centred on the canvas.\n    image, gradient, radial, draw",
      "inputs": [],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/image/draw/radialgradient",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/image/draw/radialgradient.md"
    },
    {
      "type": "lib.image.effects.Add",
      "title": "Add Blend",
      "namespace": "lib.image.effects",
      "description": "Additive composite of two images: out = source + over × gain.\n    image, add, blend, composite",
      "inputs": [],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/image/effects/addblend",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/image/effects/addblend.md"
    },
    {
      "type": "lib.image.effects.ColorOverlay",
      "title": "Color Overlay",
      "namespace": "lib.image.effects",
      "description": "Tint an image with a constant colour while preserving source coverage.\n    image, overlay, tint, layer effect",
      "inputs": [],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/image/effects/coloroverlay",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/image/effects/coloroverlay.md"
    },
    {
      "type": "lib.image.effects.DropShadow",
      "title": "Drop Shadow",
      "namespace": "lib.image.effects",
      "description": "Cast a soft drop shadow behind the source silhouette.\n    image, drop shadow, layer effect, blur",
      "inputs": [],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/image/effects/dropshadow",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/image/effects/dropshadow.md"
    },
    {
      "type": "lib.image.effects.Glow",
      "title": "Glow",
      "namespace": "lib.image.effects",
      "description": "Bloom / glow effect: bright-pass + blur + additive composite over source.\n    image, glow, bloom, layer effect, blur",
      "inputs": [],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/image/effects/glow",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/image/effects/glow.md"
    },
    {
      "type": "lib.image.effects.Outline",
      "title": "Outline",
      "namespace": "lib.image.effects",
      "description": "Draw a flat outline / stroke around the source silhouette.\n    image, outline, stroke, edge, layer effect",
      "inputs": [],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/image/effects/outline",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/image/effects/outline.md"
    },
    {
      "type": "lib.image.filter.GaussianBlur",
      "title": "Gaussian Blur",
      "namespace": "lib.image.filter",
      "description": "Separable two-pass gaussian blur (horizontal then vertical).\n    image, blur, gaussian, smooth, filter",
      "inputs": [],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/image/filter/gaussianblur",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/image/filter/gaussianblur.md"
    },
    {
      "type": "lib.image.filter.Pixelate",
      "title": "Pixelate",
      "namespace": "lib.image.filter",
      "description": "Average each N×N block to a single colour.\n    image, pixelate, mosaic, filter",
      "inputs": [],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/image/filter/pixelate",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/image/filter/pixelate.md"
    },
    {
      "type": "lib.image.filter.Threshold",
      "title": "Threshold",
      "namespace": "lib.image.filter",
      "description": "Smoothstep luminance threshold — keeps pixels above the cutoff, fades around it.\n    image, threshold, brightpass, filter",
      "inputs": [],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/image/filter/threshold",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/image/filter/threshold.md"
    },
    {
      "type": "lib.image.filter.UnsharpMask",
      "title": "Unsharp Mask",
      "namespace": "lib.image.filter",
      "description": "Sharpening via local-contrast boost. Amount controls strength, threshold suppresses noise.\n    image, sharpen, unsharp mask, filter, detail",
      "inputs": [],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/image/filter/unsharpmask",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/image/filter/unsharpmask.md"
    },
    {
      "type": "lib.image.filter.Vignette",
      "title": "Vignette",
      "namespace": "lib.image.filter",
      "description": "Radial darkening around the frame corners. Negative intensity brightens edges.\n    image, vignette, filter, lens",
      "inputs": [],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/image/filter/vignette",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/image/filter/vignette.md"
    },
    {
      "type": "lib.image.keyer.ChromaKey",
      "title": "Chroma Key",
      "namespace": "lib.image.keyer",
      "description": "Knock out pixels close to a key colour, with optional spill suppression.\n    image, chroma key, green screen, keying",
      "inputs": [],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/image/keyer/chromakey",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/image/keyer/chromakey.md"
    },
    {
      "type": "lib.image.keyer.LumaKey",
      "title": "Luma Key",
      "namespace": "lib.image.keyer",
      "description": "Keep pixels whose luminance falls inside [low, high] with smoothstep edges.\n    image, luma key, keying, brightness",
      "inputs": [],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/image/keyer/lumakey",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/image/keyer/lumakey.md"
    },
    {
      "type": "lib.image.mask.Apply",
      "title": "Apply Mask",
      "namespace": "lib.image.mask",
      "description": "Multiply a coverage mask (read from mask.a) into the source's alpha. RGB unchanged.\n    image, mask, apply, alpha",
      "inputs": [],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/image/mask/applymask",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/image/mask/applymask.md"
    },
    {
      "type": "lib.image.mask.FromImage",
      "title": "Mask From Image",
      "namespace": "lib.image.mask",
      "description": "Derive a mask from an image channel.\n    image, mask, alpha, channel\n\n    Modes: 0 alpha / 1 luminance / 2 R / 3 G / 4 B / 5 max channel.",
      "inputs": [],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/image/mask/maskfromimage",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/image/mask/maskfromimage.md"
    },
    {
      "type": "lib.image.mask.Invert",
      "title": "Invert Mask",
      "namespace": "lib.image.mask",
      "description": "Invert mask alpha (coverage → 1 − coverage).\n    image, mask, invert, alpha",
      "inputs": [],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/image/mask/invertmask",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/image/mask/invertmask.md"
    },
    {
      "type": "lib.image.warp.Affine",
      "title": "Affine",
      "namespace": "lib.image.warp",
      "description": "Apply an inverse 2×3 affine matrix. Each output UV maps to source (m00·u + m01·v + tx, m10·u + m11·v + ty).\n    image, affine, transform, matrix, warp",
      "inputs": [],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/image/warp/affine",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/image/warp/affine.md"
    },
    {
      "type": "lib.image.warp.CornerPin",
      "title": "Corner Pin",
      "namespace": "lib.image.warp",
      "description": "Perspective warp via an inverse 3×3 homography (H22 fixed at 1).\n    image, perspective, corner pin, homography, warp",
      "inputs": [],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/image/warp/cornerpin",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/image/warp/cornerpin.md"
    },
    {
      "type": "lib.image.warp.Displace",
      "title": "Displace",
      "namespace": "lib.image.warp",
      "description": "Per-pixel UV offset driven by a displacement map (R+G channels). Useful for ripples and glass.\n    image, displace, warp, ripple, distortion",
      "inputs": [],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/image/warp/displace",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/image/warp/displace.md"
    },
    {
      "type": "lib.image.warp.Offset",
      "title": "Offset",
      "namespace": "lib.image.warp",
      "description": "Translate the image by (dx, dy) UV units with selectable wrap.\n    image, offset, translate, shift",
      "inputs": [],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/image/warp/offset",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/image/warp/offset.md"
    },
    {
      "type": "lib.image.warp.Pad",
      "title": "Pad",
      "namespace": "lib.image.warp",
      "description": "Pad with empty / coloured space on each side. Output enlarges to fit.\n    image, pad, border, expand, frame",
      "inputs": [],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/image/warp/pad",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/image/warp/pad.md"
    },
    {
      "type": "lib.image.warp.PolarRemap",
      "title": "Polar Remap",
      "namespace": "lib.image.warp",
      "description": "Convert between rectangular and polar UV space. 0 rect→polar / 1 polar→rect.\n    image, polar, warp, kaleidoscope",
      "inputs": [],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/image/warp/polarremap",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/image/warp/polarremap.md"
    },
    {
      "type": "lib.image.warp.Spherize",
      "title": "Spherize",
      "namespace": "lib.image.warp",
      "description": "Fisheye lens distortion centred on the source. Positive bulges out, negative pinches in.\n    image, fisheye, spherize, warp, lens",
      "inputs": [],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/image/warp/spherize",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/image/warp/spherize.md"
    },
    {
      "type": "lib.image.warp.Tile",
      "title": "Tile",
      "namespace": "lib.image.warp",
      "description": "Tile the source N × M times across the same-sized canvas.\n    image, tile, repeat, pattern",
      "inputs": [],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/image/warp/tile",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/image/warp/tile.md"
    },
    {
      "type": "lib.mail.AddLabel",
      "title": "Add Label",
      "namespace": "lib.mail",
      "description": "Adds a label to a Gmail message.\n    email, gmail, label",
      "inputs": [
        {
          "name": "message_id",
          "type": "str",
          "description": "Message ID to label",
          "required": false,
          "default": ""
        },
        {
          "name": "label",
          "type": "str",
          "description": "Label to add to the message",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "bool"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/mail/addlabel",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/mail/addlabel.md"
    },
    {
      "type": "lib.mail.GmailSearch",
      "title": "Gmail Search",
      "namespace": "lib.mail",
      "description": "Searches Gmail using Gmail-specific search operators and yields matching emails.\n    email, gmail, search\n\n    Use cases:\n    - Search for emails based on specific criteria\n    - Retrieve emails from a specific sender\n    - Filter emails by subject, sender, or date",
      "inputs": [
        {
          "name": "from_address",
          "type": "str",
          "description": "Sender's email address to search for",
          "required": false,
          "default": ""
        },
        {
          "name": "to_address",
          "type": "str",
          "description": "Recipient's email address to search for",
          "required": false,
          "default": ""
        },
        {
          "name": "subject",
          "type": "str",
          "description": "Text to search for in email subject",
          "required": false,
          "default": ""
        },
        {
          "name": "body",
          "type": "str",
          "description": "Text to search for in email body",
          "required": false,
          "default": ""
        },
        {
          "name": "date_filter",
          "type": "enum",
          "description": "Date filter to search for",
          "required": false,
          "default": "SINCE_ONE_DAY"
        },
        {
          "name": "keywords",
          "type": "str",
          "description": "Custom keywords or labels to search for",
          "required": false,
          "default": ""
        },
        {
          "name": "folder",
          "type": "enum",
          "description": "Email folder to search in",
          "required": false,
          "default": "INBOX"
        },
        {
          "name": "text",
          "type": "str",
          "description": "General text to search for anywhere in the email",
          "required": false,
          "default": ""
        },
        {
          "name": "max_results",
          "type": "int",
          "description": "Maximum number of emails to return",
          "required": false,
          "default": 50
        }
      ],
      "outputs": [
        {
          "name": "email",
          "type": "dict"
        },
        {
          "name": "message_id",
          "type": "str"
        },
        {
          "name": "subject",
          "type": "str"
        },
        {
          "name": "sender",
          "type": "str"
        },
        {
          "name": "date",
          "type": "str"
        },
        {
          "name": "body",
          "type": "str"
        },
        {
          "name": "emails",
          "type": "list"
        },
        {
          "name": "message_ids",
          "type": "list"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/mail/gmailsearch",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/mail/gmailsearch.md"
    },
    {
      "type": "lib.mail.MoveToArchive",
      "title": "Move To Archive",
      "namespace": "lib.mail",
      "description": "Moves specified emails to Gmail archive.\n    email, gmail, archive",
      "inputs": [
        {
          "name": "message_id",
          "type": "str",
          "description": "Message ID to archive",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "bool"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/mail/movetoarchive",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/mail/movetoarchive.md"
    },
    {
      "type": "lib.mail.SendEmail",
      "title": "Send Email",
      "namespace": "lib.mail",
      "description": "Send a plain text email via SMTP.\n    email, smtp, send\n\n    Use cases:\n    - Send simple notification messages\n    - Automate email reports",
      "inputs": [
        {
          "name": "smtp_server",
          "type": "str",
          "description": "SMTP server hostname",
          "required": false,
          "default": "smtp.gmail.com"
        },
        {
          "name": "smtp_port",
          "type": "int",
          "description": "SMTP server port",
          "required": false,
          "default": 587
        },
        {
          "name": "username",
          "type": "str",
          "description": "SMTP username",
          "required": false,
          "default": ""
        },
        {
          "name": "password",
          "type": "str",
          "description": "SMTP password",
          "required": false,
          "default": ""
        },
        {
          "name": "from_address",
          "type": "str",
          "description": "Sender email address",
          "required": false,
          "default": ""
        },
        {
          "name": "to_address",
          "type": "str",
          "description": "Recipient email address",
          "required": false,
          "default": ""
        },
        {
          "name": "subject",
          "type": "str",
          "description": "Email subject",
          "required": false,
          "default": ""
        },
        {
          "name": "body",
          "type": "str",
          "description": "Email body",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "bool"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/mail/sendemail",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/mail/sendemail.md"
    },
    {
      "type": "lib.markdown.ExtractBulletLists",
      "title": "Extract Bullet Lists",
      "namespace": "lib.markdown",
      "description": "Extracts bulleted lists from markdown.\n    markdown, lists, bullets, extraction\n\n    Use cases:\n    - Extract unordered list items\n    - Analyze bullet point structures\n    - Convert bullet lists to structured data",
      "inputs": [
        {
          "name": "markdown",
          "type": "str",
          "description": "The markdown text to analyze",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "list[list[dict[str, str]]]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/markdown/extractbulletlists",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/markdown/extractbulletlists.md"
    },
    {
      "type": "lib.markdown.ExtractCodeBlocks",
      "title": "Extract Code Blocks",
      "namespace": "lib.markdown",
      "description": "Extracts code blocks and their languages from markdown.\n    markdown, code, extraction\n\n    Use cases:\n    - Extract code samples for analysis\n    - Collect programming examples\n    - Analyze code snippets in documentation",
      "inputs": [
        {
          "name": "markdown",
          "type": "str",
          "description": "The markdown text to analyze",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "list[dict[str, str]]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/markdown/extractcodeblocks",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/markdown/extractcodeblocks.md"
    },
    {
      "type": "lib.markdown.ExtractHeaders",
      "title": "Extract Headers",
      "namespace": "lib.markdown",
      "description": "Extracts headers and creates a document structure/outline.\n    markdown, headers, structure\n\n    Use cases:\n    - Generate table of contents\n    - Analyze document structure\n    - Extract main topics from documents",
      "inputs": [
        {
          "name": "markdown",
          "type": "str",
          "description": "The markdown text to analyze",
          "required": false,
          "default": ""
        },
        {
          "name": "max_level",
          "type": "int",
          "description": "Maximum header level to extract (1-6)",
          "required": false,
          "default": 6
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "list[dict[str, any]]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/markdown/extractheaders",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/markdown/extractheaders.md"
    },
    {
      "type": "lib.markdown.ExtractLinks",
      "title": "Extract Links",
      "namespace": "lib.markdown",
      "description": "Extracts all links from markdown text.\n    markdown, links, extraction\n\n    Use cases:\n    - Extract references and citations from academic documents\n    - Build link graphs from markdown documentation\n    - Analyze external resources referenced in markdown files",
      "inputs": [
        {
          "name": "markdown",
          "type": "str",
          "description": "The markdown text to analyze",
          "required": false,
          "default": ""
        },
        {
          "name": "include_titles",
          "type": "bool",
          "description": "Whether to include link titles in output",
          "required": false,
          "default": true
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "list[dict[str, str]]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/markdown/extractlinks",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/markdown/extractlinks.md"
    },
    {
      "type": "lib.markdown.ExtractNumberedLists",
      "title": "Extract Numbered Lists",
      "namespace": "lib.markdown",
      "description": "Extracts numbered lists from markdown.\n    markdown, lists, numbered, extraction\n\n    Use cases:\n    - Extract ordered list items\n    - Analyze enumerated structures\n    - Convert numbered lists to structured data",
      "inputs": [
        {
          "name": "markdown",
          "type": "str",
          "description": "The markdown text to analyze",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "list[list[str]]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/markdown/extractnumberedlists",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/markdown/extractnumberedlists.md"
    },
    {
      "type": "lib.markdown.ExtractTables",
      "title": "Extract Tables",
      "namespace": "lib.markdown",
      "description": "Extracts tables from markdown and converts them to structured data.\n    markdown, tables, data\n\n    Use cases:\n    - Extract tabular data from markdown\n    - Convert markdown tables to structured formats\n    - Analyze tabulated information",
      "inputs": [
        {
          "name": "markdown",
          "type": "str",
          "description": "The markdown text to analyze",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "dataframe"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/markdown/extracttables",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/markdown/extracttables.md"
    },
    {
      "type": "lib.nlp.ClassifyText",
      "title": "Classify Text",
      "namespace": "lib.nlp",
      "description": "Trains a Naive Bayes classifier and classifies text.\n    classify, categorize, naive bayes, machine learning, NLP\n\n    Use cases:\n    - Categorize text into predefined labels\n    - Build simple spam detection\n    - Classify customer support tickets\n    - Sort documents by topic",
      "inputs": [
        {
          "name": "text",
          "type": "str",
          "description": "Text to classify",
          "required": false,
          "default": ""
        },
        {
          "name": "training_data",
          "type": "list",
          "description": "Array of {text, label} objects for training the classifier",
          "required": false,
          "default": []
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        },
        {
          "name": "classifications",
          "type": "list"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/nlp/classifytext",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/nlp/classifytext.md"
    },
    {
      "type": "lib.nlp.ExtractEntities",
      "title": "Extract Entities",
      "namespace": "lib.nlp",
      "description": "Extracts named entities and parts of speech using compromise.\n    NER, named entities, parts of speech, NLP, text analysis\n\n    Use cases:\n    - Extract people, places, and organizations from text\n    - Identify nouns and verbs in sentences\n    - Build knowledge graphs from unstructured text\n    - Analyze text structure and content",
      "inputs": [
        {
          "name": "text",
          "type": "str",
          "description": "The text to extract entities from",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "people",
          "type": "list"
        },
        {
          "name": "places",
          "type": "list"
        },
        {
          "name": "organizations",
          "type": "list"
        },
        {
          "name": "numbers",
          "type": "list"
        },
        {
          "name": "nouns",
          "type": "list"
        },
        {
          "name": "verbs",
          "type": "list"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/nlp/extractentities",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/nlp/extractentities.md"
    },
    {
      "type": "lib.nlp.PhoneticMatch",
      "title": "Phonetic Match",
      "namespace": "lib.nlp",
      "description": "Computes phonetic codes for words using Soundex, Metaphone, or Double Metaphone.\n    phonetics, soundex, metaphone, fuzzy matching, NLP\n\n    Use cases:\n    - Find words that sound alike\n    - Build fuzzy name matching systems\n    - Implement spell correction suggestions\n    - Match names with different spellings",
      "inputs": [
        {
          "name": "text",
          "type": "str",
          "description": "The text containing words to compute phonetic codes for",
          "required": false,
          "default": ""
        },
        {
          "name": "algorithm",
          "type": "enum",
          "description": "Phonetic algorithm to use",
          "required": false,
          "default": "metaphone"
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        },
        {
          "name": "tokens",
          "type": "list"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/nlp/phoneticmatch",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/nlp/phoneticmatch.md"
    },
    {
      "type": "lib.nlp.SentimentAnalysis",
      "title": "Sentiment Analysis",
      "namespace": "lib.nlp",
      "description": "Analyzes sentiment of text using an AFINN-based analyzer.\n    sentiment, opinion, polarity, text analysis, NLP\n\n    Use cases:\n    - Determine positive or negative tone of text\n    - Analyze customer feedback sentiment\n    - Score product reviews\n    - Monitor social media sentiment",
      "inputs": [
        {
          "name": "text",
          "type": "str",
          "description": "The text to analyze for sentiment",
          "required": false,
          "default": ""
        },
        {
          "name": "language",
          "type": "enum",
          "description": "Language of the input text",
          "required": false,
          "default": "English"
        }
      ],
      "outputs": [
        {
          "name": "score",
          "type": "float"
        },
        {
          "name": "comparative",
          "type": "float"
        },
        {
          "name": "positive_words",
          "type": "list"
        },
        {
          "name": "negative_words",
          "type": "list"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/nlp/sentimentanalysis",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/nlp/sentimentanalysis.md"
    },
    {
      "type": "lib.nlp.Stem",
      "title": "Stem",
      "namespace": "lib.nlp",
      "description": "Stems words to their root form.\n    stem, root, morphology, NLP, text processing\n\n    Use cases:\n    - Reduce words to their base form for matching\n    - Normalize text for search indexing\n    - Prepare text for comparison and deduplication\n    - Improve text similarity matching",
      "inputs": [
        {
          "name": "text",
          "type": "str",
          "description": "The text containing words to stem",
          "required": false,
          "default": ""
        },
        {
          "name": "algorithm",
          "type": "enum",
          "description": "Stemming algorithm to use",
          "required": false,
          "default": "porter"
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        },
        {
          "name": "tokens",
          "type": "list"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/nlp/stem",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/nlp/stem.md"
    },
    {
      "type": "lib.nlp.TfIdf",
      "title": "TF-IDF",
      "namespace": "lib.nlp",
      "description": "Computes TF-IDF scores for terms across multiple documents.\n    tf-idf, term frequency, document frequency, text analysis, NLP\n\n    Use cases:\n    - Rank document relevance for a search query\n    - Identify important terms in a collection of documents\n    - Build keyword extraction pipelines\n    - Compare document similarity by term importance",
      "inputs": [
        {
          "name": "documents",
          "type": "list",
          "description": "List of text strings to compute TF-IDF across",
          "required": false,
          "default": []
        },
        {
          "name": "query",
          "type": "str",
          "description": "Term to compute TF-IDF for",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "list"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/nlp/tfidf",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/nlp/tfidf.md"
    },
    {
      "type": "lib.nlp.Tokenize",
      "title": "Tokenize",
      "namespace": "lib.nlp",
      "description": "Tokenizes text into words or sentences.\n    tokenize, split, words, sentences, NLP\n\n    Use cases:\n    - Break text into individual words for analysis\n    - Split text into sentences for processing\n    - Prepare text for further NLP operations\n    - Count words or sentences in text",
      "inputs": [
        {
          "name": "text",
          "type": "str",
          "description": "The text to tokenize",
          "required": false,
          "default": ""
        },
        {
          "name": "mode",
          "type": "enum",
          "description": "Tokenization mode: split into words or sentences",
          "required": false,
          "default": "word"
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "list"
        },
        {
          "name": "count",
          "type": "int"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/nlp/tokenize",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/nlp/tokenize.md"
    },
    {
      "type": "lib.notion.CreatePage",
      "title": "Notion Create Page",
      "namespace": "lib.notion",
      "description": "Create a new page in a Notion database or as a child of another page.\n    notion, page, create, add, api",
      "inputs": [
        {
          "name": "parent_id",
          "type": "str",
          "description": "The ID of the parent database or page",
          "required": false,
          "default": ""
        },
        {
          "name": "parent_type",
          "type": "str",
          "description": "Type of parent: \"database_id\" or \"page_id\"",
          "required": false,
          "default": "database_id"
        },
        {
          "name": "title",
          "type": "str",
          "description": "Title of the new page",
          "required": false,
          "default": ""
        },
        {
          "name": "title_property",
          "type": "str",
          "description": "Name of the database title column (default: Name). Only used for database parents.",
          "required": false,
          "default": "Name"
        },
        {
          "name": "properties_json",
          "type": "str",
          "description": "Optional extra properties as a JSON object (merged with title)",
          "required": false,
          "default": ""
        },
        {
          "name": "content_json",
          "type": "str",
          "description": "Optional children blocks as a JSON array",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "dict"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/notion/notioncreatepage",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/notion/notioncreatepage.md"
    },
    {
      "type": "lib.notion.GetPage",
      "title": "Notion Get Page",
      "namespace": "lib.notion",
      "description": "Retrieve a Notion page and its properties.\n    notion, page, get, read, api",
      "inputs": [
        {
          "name": "page_id",
          "type": "str",
          "description": "The ID of the Notion page to retrieve",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "dict"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/notion/notiongetpage",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/notion/notiongetpage.md"
    },
    {
      "type": "lib.notion.GetPageContent",
      "title": "Notion Get Page Content",
      "namespace": "lib.notion",
      "description": "Retrieve all blocks (content) of a Notion page.\n    notion, page, content, blocks, read, api",
      "inputs": [
        {
          "name": "page_id",
          "type": "str",
          "description": "The ID of the Notion page",
          "required": false,
          "default": ""
        },
        {
          "name": "page_size",
          "type": "int",
          "description": "Number of blocks to retrieve (max 100)",
          "required": false,
          "default": 100
        }
      ],
      "outputs": [
        {
          "name": "block",
          "type": "dict"
        },
        {
          "name": "blocks",
          "type": "list"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/notion/notiongetpagecontent",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/notion/notiongetpagecontent.md"
    },
    {
      "type": "lib.notion.QueryDatabase",
      "title": "Notion Query Database",
      "namespace": "lib.notion",
      "description": "Query a Notion database with optional filter and sort.\n    notion, database, query, filter, sort, api",
      "inputs": [
        {
          "name": "database_id",
          "type": "str",
          "description": "The ID of the Notion database to query",
          "required": false,
          "default": ""
        },
        {
          "name": "filter_json",
          "type": "str",
          "description": "Optional Notion filter object as JSON",
          "required": false,
          "default": ""
        },
        {
          "name": "sort_json",
          "type": "str",
          "description": "Optional Notion sorts array as JSON (array of sort objects)",
          "required": false,
          "default": ""
        },
        {
          "name": "page_size",
          "type": "int",
          "description": "Number of results to return (max 100)",
          "required": false,
          "default": 100
        }
      ],
      "outputs": [
        {
          "name": "result",
          "type": "dict"
        },
        {
          "name": "results",
          "type": "list"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/notion/notionquerydatabase",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/notion/notionquerydatabase.md"
    },
    {
      "type": "lib.notion.Search",
      "title": "Notion Search",
      "namespace": "lib.notion",
      "description": "Search across all pages and databases the Notion integration has access to.\n    notion, search, pages, databases, api",
      "inputs": [
        {
          "name": "query",
          "type": "str",
          "description": "Search query string",
          "required": false,
          "default": ""
        },
        {
          "name": "filter_type",
          "type": "str",
          "description": "Filter by object type: \"page\", \"database\", or empty for all",
          "required": false,
          "default": ""
        },
        {
          "name": "sort_direction",
          "type": "str",
          "description": "Sort direction: \"ascending\" or \"descending\"",
          "required": false,
          "default": "descending"
        },
        {
          "name": "page_size",
          "type": "int",
          "description": "Number of results to return (max 100)",
          "required": false,
          "default": 10
        }
      ],
      "outputs": [
        {
          "name": "result",
          "type": "dict"
        },
        {
          "name": "results",
          "type": "list"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/notion/notionsearch",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/notion/notionsearch.md"
    },
    {
      "type": "lib.notion.UpdatePage",
      "title": "Notion Update Page",
      "namespace": "lib.notion",
      "description": "Update properties of an existing Notion page.\n    notion, page, update, edit, modify, api",
      "inputs": [
        {
          "name": "page_id",
          "type": "str",
          "description": "The ID of the page to update",
          "required": false,
          "default": ""
        },
        {
          "name": "properties_json",
          "type": "str",
          "description": "JSON object of properties to update",
          "required": false,
          "default": ""
        },
        {
          "name": "archived",
          "type": "bool",
          "description": "Set to true to archive (soft-delete) the page",
          "required": false,
          "default": false
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "dict"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/notion/notionupdatepage",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/notion/notionupdatepage.md"
    },
    {
      "type": "lib.ocr.ExtractData",
      "title": "OCR Extract Data",
      "namespace": "lib.ocr",
      "description": "Run OCR on an image and return structured data: full text, mean confidence, and per-word boxes.\n    ocr, image, text, words, confidence, bounding boxes",
      "inputs": [],
      "outputs": [
        {
          "name": "output",
          "type": "dict"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/ocr/ocrextractdata",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/ocr/ocrextractdata.md"
    },
    {
      "type": "lib.ocr.ExtractText",
      "title": "OCR Extract Text",
      "namespace": "lib.ocr",
      "description": "Extract plain text from an image using Tesseract OCR.\n    ocr, image, text, recognition, tesseract",
      "inputs": [],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/ocr/ocrextracttext",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/ocr/ocrextracttext.md"
    },
    {
      "type": "lib.os.AbsolutePath",
      "title": "Absolute Path",
      "namespace": "lib.os",
      "description": "Return the absolute path of a file or directory.\n    files, path, absolute\n\n    Use cases:\n    - Convert relative paths to absolute\n    - Get full system path\n    - Resolve path references",
      "inputs": [
        {
          "name": "path",
          "type": "str",
          "description": "Path to convert to absolute",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/os/absolutepath",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/os/absolutepath.md"
    },
    {
      "type": "lib.os.AccessedTime",
      "title": "Accessed Time",
      "namespace": "lib.os",
      "description": "Get file last accessed timestamp.\n    files, metadata, accessed, time",
      "inputs": [
        {
          "name": "path",
          "type": "str",
          "description": "Path to file",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "datetime"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/os/accessedtime",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/os/accessedtime.md"
    },
    {
      "type": "lib.os.Basename",
      "title": "Basename",
      "namespace": "lib.os",
      "description": "Get the base name component of a file path.\n    files, path, basename\n\n    Use cases:\n    - Extract filename from full path\n    - Get file name without directory\n    - Process file names independently",
      "inputs": [
        {
          "name": "path",
          "type": "str",
          "description": "File path to get basename from",
          "required": false,
          "default": ""
        },
        {
          "name": "remove_extension",
          "type": "bool",
          "description": "Remove file extension from basename",
          "required": false,
          "default": false
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/os/basename",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/os/basename.md"
    },
    {
      "type": "lib.os.CopyFile",
      "title": "Copy File",
      "namespace": "lib.os",
      "description": "Copy a file from source to destination path.\n    files, copy, manage\n\n    Use cases:\n    - Create file backups\n    - Duplicate files for processing\n    - Copy files to new locations",
      "inputs": [
        {
          "name": "source_path",
          "type": "str",
          "description": "Source file path",
          "required": false,
          "default": ""
        },
        {
          "name": "destination_path",
          "type": "str",
          "description": "Destination file path",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/os/copyfile",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/os/copyfile.md"
    },
    {
      "type": "lib.os.CreateDirectory",
      "title": "Create Directory",
      "namespace": "lib.os",
      "description": "Create a new directory at specified path.\n    files, directory, create\n\n    Use cases:\n    - Set up directory structure for file organization\n    - Create output directories for processed files",
      "inputs": [
        {
          "name": "path",
          "type": "str",
          "description": "Directory path to create",
          "required": false,
          "default": ""
        },
        {
          "name": "exist_ok",
          "type": "bool",
          "description": "Don't error if directory already exists",
          "required": false,
          "default": true
        }
      ],
      "outputs": [],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/os/createdirectory",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/os/createdirectory.md"
    },
    {
      "type": "lib.os.CreatedTime",
      "title": "Created Time",
      "namespace": "lib.os",
      "description": "Get file creation timestamp.\n    files, metadata, created, time",
      "inputs": [
        {
          "name": "path",
          "type": "str",
          "description": "Path to file",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "datetime"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/os/createdtime",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/os/createdtime.md"
    },
    {
      "type": "lib.os.Dirname",
      "title": "Dirname",
      "namespace": "lib.os",
      "description": "Get the directory name component of a file path.\n    files, path, dirname\n\n    Use cases:\n    - Extract directory path from full path\n    - Get parent directory\n    - Process directory paths",
      "inputs": [
        {
          "name": "path",
          "type": "str",
          "description": "File path to get dirname from",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/os/dirname",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/os/dirname.md"
    },
    {
      "type": "lib.os.FileExists",
      "title": "File Exists",
      "namespace": "lib.os",
      "description": "Check if a file or directory exists at the specified path.\n    files, check, exists\n\n    Use cases:\n    - Validate file presence before processing\n    - Implement conditional logic based on file existence",
      "inputs": [
        {
          "name": "path",
          "type": "str",
          "description": "Path to check for existence",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "bool"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/os/fileexists",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/os/fileexists.md"
    },
    {
      "type": "lib.os.FileExtension",
      "title": "File Extension",
      "namespace": "lib.os",
      "description": "Get file extension.\n    files, metadata, extension",
      "inputs": [
        {
          "name": "path",
          "type": "str",
          "description": "Path to file",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/os/fileextension",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/os/fileextension.md"
    },
    {
      "type": "lib.os.FileName",
      "title": "File Name",
      "namespace": "lib.os",
      "description": "Get file name without path.\n    files, metadata, name",
      "inputs": [
        {
          "name": "path",
          "type": "str",
          "description": "Path to file",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/os/filename",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/os/filename.md"
    },
    {
      "type": "lib.os.FileNameMatch",
      "title": "File Name Match",
      "namespace": "lib.os",
      "description": "Match a filename against a pattern using Unix shell-style wildcards.\n    files, pattern, match, filter\n\n    Use cases:\n    - Filter files by name pattern\n    - Validate file naming conventions\n    - Match file extensions",
      "inputs": [
        {
          "name": "filename",
          "type": "str",
          "description": "Filename to check",
          "required": false,
          "default": ""
        },
        {
          "name": "pattern",
          "type": "str",
          "description": "Pattern to match against (e.g. *.txt, data_*.csv)",
          "required": false,
          "default": "*"
        },
        {
          "name": "case_sensitive",
          "type": "bool",
          "description": "Whether the pattern matching should be case-sensitive",
          "required": false,
          "default": true
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "bool"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/os/filenamematch",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/os/filenamematch.md"
    },
    {
      "type": "lib.os.FilterFileNames",
      "title": "Filter File Names",
      "namespace": "lib.os",
      "description": "Filter a list of filenames using Unix shell-style wildcards.\n    files, pattern, filter, list\n\n    Use cases:\n    - Filter multiple files by pattern\n    - Batch process files matching criteria\n    - Select files by extension",
      "inputs": [
        {
          "name": "filenames",
          "type": "list[str]",
          "description": "list of filenames to filter",
          "required": false,
          "default": []
        },
        {
          "name": "pattern",
          "type": "str",
          "description": "Pattern to filter by (e.g. *.txt, data_*.csv)",
          "required": false,
          "default": "*"
        },
        {
          "name": "case_sensitive",
          "type": "bool",
          "description": "Whether the pattern matching should be case-sensitive",
          "required": false,
          "default": true
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "list[str]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/os/filterfilenames",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/os/filterfilenames.md"
    },
    {
      "type": "lib.os.GetDirectory",
      "title": "Get Directory",
      "namespace": "lib.os",
      "description": "Get directory containing the file.\n    files, metadata, directory",
      "inputs": [
        {
          "name": "path",
          "type": "str",
          "description": "Path to file",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/os/getdirectory",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/os/getdirectory.md"
    },
    {
      "type": "lib.os.GetFileSize",
      "title": "Get File Size",
      "namespace": "lib.os",
      "description": "Get file size in bytes.\n    files, metadata, size",
      "inputs": [
        {
          "name": "path",
          "type": "str",
          "description": "Path to file",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "int"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/os/getfilesize",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/os/getfilesize.md"
    },
    {
      "type": "lib.os.GetPathInfo",
      "title": "Get Path Info",
      "namespace": "lib.os",
      "description": "Gets information about a path.\n    path, info, metadata\n\n    Use cases:\n    - Extract path components\n    - Parse file paths",
      "inputs": [
        {
          "name": "path",
          "type": "str",
          "description": "Path to analyze",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "dict"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/os/getpathinfo",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/os/getpathinfo.md"
    },
    {
      "type": "lib.os.IsDirectory",
      "title": "Is Directory",
      "namespace": "lib.os",
      "description": "Check if path is a directory.\n    files, metadata, type",
      "inputs": [
        {
          "name": "path",
          "type": "str",
          "description": "Path to check",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "bool"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/os/isdirectory",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/os/isdirectory.md"
    },
    {
      "type": "lib.os.IsFile",
      "title": "Is File",
      "namespace": "lib.os",
      "description": "Check if path is a file.\n    files, metadata, type",
      "inputs": [
        {
          "name": "path",
          "type": "str",
          "description": "Path to check",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "bool"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/os/isfile",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/os/isfile.md"
    },
    {
      "type": "lib.os.JoinPaths",
      "title": "Join Paths",
      "namespace": "lib.os",
      "description": "Joins path components.\n    path, join, combine\n\n    Use cases:\n    - Build file paths\n    - Create cross-platform paths",
      "inputs": [
        {
          "name": "paths",
          "type": "list[str]",
          "description": "Path components to join",
          "required": false,
          "default": []
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/os/joinpaths",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/os/joinpaths.md"
    },
    {
      "type": "lib.os.ListFiles",
      "title": "List Files",
      "namespace": "lib.os",
      "description": "list files in a directory matching a pattern.\n    files, list, directory\n\n    Use cases:\n    - Get files for batch processing\n    - Filter files by extension or pattern",
      "inputs": [
        {
          "name": "folder",
          "type": "str",
          "description": "Directory to scan",
          "required": false,
          "default": "~"
        },
        {
          "name": "pattern",
          "type": "str",
          "description": "File pattern to match (e.g. *.txt)",
          "required": false,
          "default": "*"
        },
        {
          "name": "include_subdirectories",
          "type": "bool",
          "description": "Search subdirectories",
          "required": false,
          "default": false
        }
      ],
      "outputs": [
        {
          "name": "file",
          "type": "str"
        },
        {
          "name": "files",
          "type": "list"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/os/listfiles",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/os/listfiles.md"
    },
    {
      "type": "lib.os.ModifiedTime",
      "title": "Modified Time",
      "namespace": "lib.os",
      "description": "Get file last modified timestamp.\n    files, metadata, modified, time",
      "inputs": [
        {
          "name": "path",
          "type": "str",
          "description": "Path to file",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "datetime"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/os/modifiedtime",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/os/modifiedtime.md"
    },
    {
      "type": "lib.os.MoveFile",
      "title": "Move File",
      "namespace": "lib.os",
      "description": "Move a file from source to destination path.\n    files, move, manage\n\n    Use cases:\n    - Organize files into directories\n    - Process and archive files\n    - Relocate completed files",
      "inputs": [
        {
          "name": "source_path",
          "type": "str",
          "description": "Source file path",
          "required": false,
          "default": ""
        },
        {
          "name": "destination_path",
          "type": "str",
          "description": "Destination file path",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/os/movefile",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/os/movefile.md"
    },
    {
      "type": "lib.os.NormalizePath",
      "title": "Normalize Path",
      "namespace": "lib.os",
      "description": "Normalizes a path.\n    path, normalize, clean\n\n    Use cases:\n    - Standardize paths\n    - Remove redundant separators",
      "inputs": [
        {
          "name": "path",
          "type": "str",
          "description": "Path to normalize",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/os/normalizepath",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/os/normalizepath.md"
    },
    {
      "type": "lib.os.OpenWorkspaceDirectory",
      "title": "Open Workspace Directory",
      "namespace": "lib.os",
      "description": "Open the workspace directory.\n    files, workspace, directory",
      "inputs": [],
      "outputs": [
        {
          "name": "output",
          "type": "none"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/os/openworkspacedirectory",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/os/openworkspacedirectory.md"
    },
    {
      "type": "lib.os.PathToString",
      "title": "Path To String",
      "namespace": "lib.os",
      "description": "Convert a FilePath object to a string.\n    files, path, string, convert\n\n    Use cases:\n    - Get raw string path from FilePath object\n    - Convert FilePath for string operations\n    - Extract path string for external use",
      "inputs": [
        {
          "name": "file_path",
          "type": "str",
          "description": "File path to convert to string",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/os/pathtostring",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/os/pathtostring.md"
    },
    {
      "type": "lib.os.ReadBinaryFile",
      "title": "Read Binary File",
      "namespace": "lib.os",
      "description": "Read a binary file from the workspace as base64-encoded string.\n    os, file, read, binary",
      "inputs": [
        {
          "name": "path",
          "type": "str",
          "description": "Relative path to file within workspace",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/os/readbinaryfile",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/os/readbinaryfile.md"
    },
    {
      "type": "lib.os.ReadTextFile",
      "title": "Read Text File",
      "namespace": "lib.os",
      "description": "Read a text file from the workspace.\n    os, file, read, text",
      "inputs": [
        {
          "name": "path",
          "type": "str",
          "description": "Relative path to file within workspace",
          "required": false,
          "default": ""
        },
        {
          "name": "encoding",
          "type": "str",
          "description": "Text encoding (utf-8, ascii, etc.)",
          "required": false,
          "default": "utf-8"
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/os/readtextfile",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/os/readtextfile.md"
    },
    {
      "type": "lib.os.RelativePath",
      "title": "Relative Path",
      "namespace": "lib.os",
      "description": "Return a relative path to a target from a start directory.\n    files, path, relative\n\n    Use cases:\n    - Create relative path references\n    - Generate portable paths\n    - Compare file locations",
      "inputs": [
        {
          "name": "target_path",
          "type": "str",
          "description": "Target path to convert to relative",
          "required": false,
          "default": ""
        },
        {
          "name": "start_path",
          "type": "str",
          "description": "Start path for relative conversion",
          "required": false,
          "default": "."
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/os/relativepath",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/os/relativepath.md"
    },
    {
      "type": "lib.os.ShowNotification",
      "title": "Show Notification",
      "namespace": "lib.os",
      "description": "Shows a system notification.\n    notification, system, alert\n\n    Use cases:\n    - Alert user of completed tasks\n    - Show process status\n    - Display important messages",
      "inputs": [
        {
          "name": "title",
          "type": "str",
          "description": "Title of the notification",
          "required": false,
          "default": ""
        },
        {
          "name": "message",
          "type": "str",
          "description": "Content of the notification",
          "required": false,
          "default": ""
        },
        {
          "name": "timeout",
          "type": "int",
          "description": "How long the notification should stay visible (in seconds)",
          "required": false,
          "default": 10
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "none"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/os/shownotification",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/os/shownotification.md"
    },
    {
      "type": "lib.os.SplitExtension",
      "title": "Split Extension",
      "namespace": "lib.os",
      "description": "Split a path into root and extension components.\n    files, path, extension, split\n\n    Use cases:\n    - Extract file extension\n    - Process filename without extension\n    - Handle file types",
      "inputs": [
        {
          "name": "path",
          "type": "str",
          "description": "Path to split",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "root",
          "type": "str"
        },
        {
          "name": "extension",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/os/splitextension",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/os/splitextension.md"
    },
    {
      "type": "lib.os.SplitPath",
      "title": "Split Path",
      "namespace": "lib.os",
      "description": "Split a path into directory and file components.\n    files, path, split\n\n    Use cases:\n    - Separate directory from filename\n    - Process path components separately\n    - Extract path parts",
      "inputs": [
        {
          "name": "path",
          "type": "str",
          "description": "Path to split",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "dirname",
          "type": "str"
        },
        {
          "name": "basename",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/os/splitpath",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/os/splitpath.md"
    },
    {
      "type": "lib.os.WorkspaceDirectory",
      "title": "Workspace Directory",
      "namespace": "lib.os",
      "description": "Get the workspace directory.\n    files, workspace, directory",
      "inputs": [],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/os/workspacedirectory",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/os/workspacedirectory.md"
    },
    {
      "type": "lib.os.WriteBinaryFile",
      "title": "Write Binary File",
      "namespace": "lib.os",
      "description": "Write binary data (base64-encoded) to a file in the workspace.\n    os, file, write, binary, save",
      "inputs": [
        {
          "name": "path",
          "type": "str",
          "description": "Relative path to file within workspace",
          "required": false,
          "default": ""
        },
        {
          "name": "content",
          "type": "str",
          "description": "Base64-encoded binary content to write",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/os/writebinaryfile",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/os/writebinaryfile.md"
    },
    {
      "type": "lib.os.WriteTextFile",
      "title": "Write Text File",
      "namespace": "lib.os",
      "description": "Write text to a file in the workspace.\n    os, file, write, text, save",
      "inputs": [
        {
          "name": "path",
          "type": "str",
          "description": "Relative path to file within workspace",
          "required": false,
          "default": ""
        },
        {
          "name": "content",
          "type": "str",
          "description": "Text content to write",
          "required": false,
          "default": ""
        },
        {
          "name": "encoding",
          "type": "str",
          "description": "Text encoding (utf-8, ascii, etc.)",
          "required": false,
          "default": "utf-8"
        },
        {
          "name": "append",
          "type": "bool",
          "description": "Append to file instead of overwriting",
          "required": false,
          "default": false
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/os/writetextfile",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/os/writetextfile.md"
    },
    {
      "type": "lib.pdf.ExtractMarkdown",
      "title": "PDF to Markdown",
      "namespace": "lib.pdf",
      "description": "Convert PDF to Markdown, inferring headings from font size.\n    pdf, markdown, convert, headings, structure",
      "inputs": [
        {
          "name": "start_page",
          "type": "int",
          "description": "First page (0-based)",
          "required": false,
          "default": 0
        },
        {
          "name": "end_page",
          "type": "int",
          "description": "Last page (-1 for all)",
          "required": false,
          "default": -1
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/pdf/pdftomarkdown",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/pdf/pdftomarkdown.md"
    },
    {
      "type": "lib.pdf.ExtractOcr",
      "title": "PDF Extract Text (OCR)",
      "namespace": "lib.pdf",
      "description": "Extract text from a PDF using OCR, suitable for scanned documents and image-based PDFs.\n    pdf, ocr, scan, text, extract, image-based",
      "inputs": [
        {
          "name": "start_page",
          "type": "int",
          "description": "First page (0-based)",
          "required": false,
          "default": 0
        },
        {
          "name": "end_page",
          "type": "int",
          "description": "Last page (-1 for all)",
          "required": false,
          "default": -1
        },
        {
          "name": "ocr_language",
          "type": "str",
          "description": "ISO 639-1 language code for OCR (e.g. en, fr, de, es)",
          "required": false,
          "default": "en"
        },
        {
          "name": "dpi",
          "type": "int",
          "description": "Rendering DPI for OCR — higher values improve accuracy on small text",
          "required": false,
          "default": 150
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/pdf/pdfextracttextocr",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/pdf/pdfextracttextocr.md"
    },
    {
      "type": "lib.pdf.ExtractStyledText",
      "title": "PDF Extract Styled Text",
      "namespace": "lib.pdf",
      "description": "Extract text spans with font name, size, bounding box, and color (always null; liteparse does not expose per-span color).\n    pdf, text, style, font, size, formatting, color",
      "inputs": [
        {
          "name": "start_page",
          "type": "int",
          "description": "First page (0-based)",
          "required": false,
          "default": 0
        },
        {
          "name": "end_page",
          "type": "int",
          "description": "Last page (-1 for all)",
          "required": false,
          "default": -1
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "list[dict]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/pdf/pdfextractstyledtext",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/pdf/pdfextractstyledtext.md"
    },
    {
      "type": "lib.pdf.ExtractTables",
      "title": "PDF Extract Tables",
      "namespace": "lib.pdf",
      "description": "Detect and extract tables from a PDF by analysing text layout.\n    pdf, tables, extract, data, rows, columns",
      "inputs": [
        {
          "name": "start_page",
          "type": "int",
          "description": "First page (0-based)",
          "required": false,
          "default": 0
        },
        {
          "name": "end_page",
          "type": "int",
          "description": "Last page (-1 for all)",
          "required": false,
          "default": -1
        },
        {
          "name": "y_tolerance",
          "type": "int",
          "description": "Pixel tolerance for grouping text into rows",
          "required": false,
          "default": 3
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "list[dict]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/pdf/pdfextracttables",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/pdf/pdfextracttables.md"
    },
    {
      "type": "lib.pdf.ExtractText",
      "title": "PDF Extract Text",
      "namespace": "lib.pdf",
      "description": "Extract plain text from a PDF, preserving line breaks based on layout position.\n    pdf, text, extract, read, content",
      "inputs": [
        {
          "name": "start_page",
          "type": "int",
          "description": "First page (0-based)",
          "required": false,
          "default": 0
        },
        {
          "name": "end_page",
          "type": "int",
          "description": "Last page (-1 for all)",
          "required": false,
          "default": -1
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/pdf/pdfextracttext",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/pdf/pdfextracttext.md"
    },
    {
      "type": "lib.pdf.ExtractTextBlocks",
      "title": "PDF Extract Text Blocks",
      "namespace": "lib.pdf",
      "description": "Extract text blocks with bounding boxes, useful for layout analysis.\n    pdf, text, blocks, layout, bbox, position",
      "inputs": [
        {
          "name": "start_page",
          "type": "int",
          "description": "First page (0-based)",
          "required": false,
          "default": 0
        },
        {
          "name": "end_page",
          "type": "int",
          "description": "Last page (-1 for all)",
          "required": false,
          "default": -1
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "list[dict]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/pdf/pdfextracttextblocks",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/pdf/pdfextracttextblocks.md"
    },
    {
      "type": "lib.pdf.PageCount",
      "title": "PDF Page Count",
      "namespace": "lib.pdf",
      "description": "Get the total number of pages in a PDF document.\n    pdf, pages, count, length",
      "inputs": [],
      "outputs": [
        {
          "name": "output",
          "type": "int"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/pdf/pdfpagecount",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/pdf/pdfpagecount.md"
    },
    {
      "type": "lib.pdf.PageMetadata",
      "title": "PDF Page Metadata",
      "namespace": "lib.pdf",
      "description": "Get dimensions and bounding box for each page.\n    pdf, metadata, pages, size, dimensions",
      "inputs": [
        {
          "name": "start_page",
          "type": "int",
          "description": "First page (0-based)",
          "required": false,
          "default": 0
        },
        {
          "name": "end_page",
          "type": "int",
          "description": "Last page (-1 for all)",
          "required": false,
          "default": -1
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "list[dict]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/pdf/pdfpagemetadata",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/pdf/pdfpagemetadata.md"
    },
    {
      "type": "lib.pdf.Pdftoppm",
      "title": "PDF Rasterize (pdftoppm)",
      "namespace": "lib.pdf",
      "description": "Rasterize PDF pages with poppler's pdftoppm. Higher fidelity than the PDFium-based Screenshot node for some PDFs and supports anti-aliasing controls.\n    pdf, pdftoppm, poppler, rasterize, render, image, pages",
      "inputs": [
        {
          "name": "start_page",
          "type": "int",
          "description": "First page to render (0-based)",
          "required": false,
          "default": 0
        },
        {
          "name": "end_page",
          "type": "int",
          "description": "Last page to render (-1 for all)",
          "required": false,
          "default": -1
        },
        {
          "name": "dpi",
          "type": "int",
          "description": "Rendering resolution in dots per inch",
          "required": false,
          "default": 150
        },
        {
          "name": "format",
          "type": "enum",
          "description": "Output image format",
          "required": false,
          "default": "png"
        },
        {
          "name": "scale_to",
          "type": "int",
          "description": "If > 0, scale the longest side to this many pixels (overrides DPI)",
          "required": false,
          "default": 0
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "list[image]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/pdf/pdfrasterizepdftoppm",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/pdf/pdfrasterizepdftoppm.md"
    },
    {
      "type": "lib.pdf.Screenshot",
      "title": "PDF Page Screenshot",
      "namespace": "lib.pdf",
      "description": "Render PDF pages as PNG images.\n    pdf, screenshot, render, image, pages, png",
      "inputs": [
        {
          "name": "start_page",
          "type": "int",
          "description": "First page to render (0-based)",
          "required": false,
          "default": 0
        },
        {
          "name": "end_page",
          "type": "int",
          "description": "Last page to render (-1 for all)",
          "required": false,
          "default": -1
        },
        {
          "name": "dpi",
          "type": "int",
          "description": "Rendering resolution in dots per inch",
          "required": false,
          "default": 150
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "list[image]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/pdf/pdfpagescreenshot",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/pdf/pdfpagescreenshot.md"
    },
    {
      "type": "lib.pdf.SearchText",
      "title": "PDF Search Text",
      "namespace": "lib.pdf",
      "description": "Search a PDF for a phrase and return each match with its page number and bounding box.\n    pdf, search, find, phrase, text, location, bbox",
      "inputs": [
        {
          "name": "phrase",
          "type": "str",
          "description": "Text phrase to search for",
          "required": false,
          "default": ""
        },
        {
          "name": "case_sensitive",
          "type": "bool",
          "description": "Whether the search is case-sensitive",
          "required": false,
          "default": false
        },
        {
          "name": "start_page",
          "type": "int",
          "description": "First page to search (0-based)",
          "required": false,
          "default": 0
        },
        {
          "name": "end_page",
          "type": "int",
          "description": "Last page to search (-1 for all)",
          "required": false,
          "default": -1
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "list[dict]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/pdf/pdfsearchtext",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/pdf/pdfsearchtext.md"
    },
    {
      "type": "lib.pptx.ExtractSlides",
      "title": "PPTX Extract Slides",
      "namespace": "lib.pptx",
      "description": "Extract text from each slide of a PowerPoint (.pptx) file as a list, preserving slide order.\n    pptx, powerpoint, slides, list, text",
      "inputs": [],
      "outputs": [
        {
          "name": "output",
          "type": "list[dict]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/pptx/pptxextractslides",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/pptx/pptxextractslides.md"
    },
    {
      "type": "lib.pptx.ExtractText",
      "title": "PPTX Extract Text",
      "namespace": "lib.pptx",
      "description": "Extract plain text from a PowerPoint (.pptx) file.\n    pptx, powerpoint, slides, text, extract",
      "inputs": [],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/pptx/pptxextracttext",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/pptx/pptxextracttext.md"
    },
    {
      "type": "lib.rss.ExtractFeedMetadata",
      "title": "Extract Feed Metadata",
      "namespace": "lib.rss",
      "description": "Extracts metadata from an RSS feed.\n    rss, metadata, feed\n\n    Use cases:\n    - Get feed information\n    - Validate feed details\n    - Extract feed metadata",
      "inputs": [
        {
          "name": "url",
          "type": "str",
          "description": "URL of the RSS feed",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "dict"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/rss/extractfeedmetadata",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/rss/extractfeedmetadata.md"
    },
    {
      "type": "lib.rss.FetchRSSFeed",
      "title": "Fetch RSS Feed",
      "namespace": "lib.rss",
      "description": "Fetches and parses an RSS feed from a URL.\n    rss, feed, network\n\n    Use cases:\n    - Monitor news feeds\n    - Aggregate content from multiple sources\n    - Process blog updates",
      "inputs": [
        {
          "name": "url",
          "type": "str",
          "description": "URL of the RSS feed to fetch",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "title",
          "type": "str"
        },
        {
          "name": "link",
          "type": "str"
        },
        {
          "name": "published",
          "type": "datetime"
        },
        {
          "name": "summary",
          "type": "str"
        },
        {
          "name": "author",
          "type": "str"
        },
        {
          "name": "items",
          "type": "list"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/rss/fetchrssfeed",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/rss/fetchrssfeed.md"
    },
    {
      "type": "lib.s3.CopyObject",
      "title": "S3 Copy Object",
      "namespace": "lib.s3",
      "description": "Copies an object within or between S3 buckets.\n    aws, s3, copy, duplicate, cloud, storage",
      "inputs": [
        {
          "name": "source_bucket",
          "type": "str",
          "description": "Source S3 bucket name",
          "required": false,
          "default": ""
        },
        {
          "name": "source_key",
          "type": "str",
          "description": "Source object key (path)",
          "required": false,
          "default": ""
        },
        {
          "name": "dest_bucket",
          "type": "str",
          "description": "Destination S3 bucket name",
          "required": false,
          "default": ""
        },
        {
          "name": "dest_key",
          "type": "str",
          "description": "Destination object key (path)",
          "required": false,
          "default": ""
        },
        {
          "name": "region",
          "type": "str",
          "description": "AWS region",
          "required": false,
          "default": "us-east-1"
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "bool"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/s3/s3copyobject",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/s3/s3copyobject.md"
    },
    {
      "type": "lib.s3.DeleteObject",
      "title": "S3 Delete Object",
      "namespace": "lib.s3",
      "description": "Deletes an object from an S3 bucket.\n    aws, s3, delete, remove, cloud, storage",
      "inputs": [
        {
          "name": "bucket",
          "type": "str",
          "description": "S3 bucket name",
          "required": false,
          "default": ""
        },
        {
          "name": "key",
          "type": "str",
          "description": "Object key (path) to delete",
          "required": false,
          "default": ""
        },
        {
          "name": "region",
          "type": "str",
          "description": "AWS region",
          "required": false,
          "default": "us-east-1"
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "bool"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/s3/s3deleteobject",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/s3/s3deleteobject.md"
    },
    {
      "type": "lib.s3.GetObject",
      "title": "S3 Get Object",
      "namespace": "lib.s3",
      "description": "Downloads an object's content as text from S3.\n    aws, s3, get, download, read, cloud, storage",
      "inputs": [
        {
          "name": "bucket",
          "type": "str",
          "description": "S3 bucket name",
          "required": false,
          "default": ""
        },
        {
          "name": "key",
          "type": "str",
          "description": "Object key (path) in the bucket",
          "required": false,
          "default": ""
        },
        {
          "name": "region",
          "type": "str",
          "description": "AWS region",
          "required": false,
          "default": "us-east-1"
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        },
        {
          "name": "content_type",
          "type": "str"
        },
        {
          "name": "size",
          "type": "int"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/s3/s3getobject",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/s3/s3getobject.md"
    },
    {
      "type": "lib.s3.GetPresignedUrl",
      "title": "S3 Get Presigned URL",
      "namespace": "lib.s3",
      "description": "Generates a presigned URL for temporary access to an S3 object.\n    aws, s3, presigned, url, share, cloud, storage",
      "inputs": [
        {
          "name": "bucket",
          "type": "str",
          "description": "S3 bucket name",
          "required": false,
          "default": ""
        },
        {
          "name": "key",
          "type": "str",
          "description": "Object key (path) in the bucket",
          "required": false,
          "default": ""
        },
        {
          "name": "expires_in",
          "type": "int",
          "description": "Expiry time in seconds",
          "required": false,
          "default": 3600
        },
        {
          "name": "region",
          "type": "str",
          "description": "AWS region",
          "required": false,
          "default": "us-east-1"
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/s3/s3getpresignedurl",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/s3/s3getpresignedurl.md"
    },
    {
      "type": "lib.s3.ListBuckets",
      "title": "S3 List Buckets",
      "namespace": "lib.s3",
      "description": "Lists all S3 buckets in the AWS account.\n    aws, s3, buckets, list, cloud, storage",
      "inputs": [
        {
          "name": "region",
          "type": "str",
          "description": "AWS region",
          "required": false,
          "default": "us-east-1"
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "list"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/s3/s3listbuckets",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/s3/s3listbuckets.md"
    },
    {
      "type": "lib.s3.ListObjects",
      "title": "S3 List Objects",
      "namespace": "lib.s3",
      "description": "Lists objects in an S3 bucket with optional prefix filter.\n    aws, s3, objects, list, cloud, storage, browse",
      "inputs": [
        {
          "name": "bucket",
          "type": "str",
          "description": "S3 bucket name",
          "required": false,
          "default": ""
        },
        {
          "name": "prefix",
          "type": "str",
          "description": "Optional key prefix to filter objects",
          "required": false,
          "default": ""
        },
        {
          "name": "max_keys",
          "type": "int",
          "description": "Maximum number of objects to return",
          "required": false,
          "default": 100
        },
        {
          "name": "region",
          "type": "str",
          "description": "AWS region",
          "required": false,
          "default": "us-east-1"
        }
      ],
      "outputs": [
        {
          "name": "object",
          "type": "dict"
        },
        {
          "name": "objects",
          "type": "list"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/s3/s3listobjects",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/s3/s3listobjects.md"
    },
    {
      "type": "lib.s3.PutObject",
      "title": "S3 Put Object",
      "namespace": "lib.s3",
      "description": "Uploads text content to an S3 object.\n    aws, s3, put, upload, write, cloud, storage",
      "inputs": [
        {
          "name": "bucket",
          "type": "str",
          "description": "S3 bucket name",
          "required": false,
          "default": ""
        },
        {
          "name": "key",
          "type": "str",
          "description": "Object key (path) in the bucket",
          "required": false,
          "default": ""
        },
        {
          "name": "body",
          "type": "str",
          "description": "Text content to upload",
          "required": false,
          "default": ""
        },
        {
          "name": "content_type",
          "type": "str",
          "description": "MIME type of the content",
          "required": false,
          "default": "text/plain"
        },
        {
          "name": "region",
          "type": "str",
          "description": "AWS region",
          "required": false,
          "default": "us-east-1"
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "bool"
        },
        {
          "name": "etag",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/s3/s3putobject",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/s3/s3putobject.md"
    },
    {
      "type": "lib.secret.GetSecret",
      "title": "Get Secret",
      "namespace": "lib.secret",
      "description": "Get a secret value from configuration.\n    secrets, credentials, configuration",
      "inputs": [
        {
          "name": "name",
          "type": "str",
          "description": "Secret key name",
          "required": false,
          "default": ""
        },
        {
          "name": "default",
          "type": "str",
          "description": "Default value if not found",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/secret/getsecret",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/secret/getsecret.md"
    },
    {
      "type": "lib.sqlite.CreateTable",
      "title": "Create Table",
      "namespace": "lib.sqlite",
      "description": "Create a new SQLite table with specified columns.\n    sqlite, database, table, create, schema\n\n    Use cases:\n    - Initialize database schema for flashcards\n    - Set up tables for persistent storage\n    - Create memory structures for agents",
      "inputs": [
        {
          "name": "database_name",
          "type": "str",
          "description": "Name of the SQLite database file",
          "required": false,
          "default": "memory.db"
        },
        {
          "name": "table_name",
          "type": "str",
          "description": "Name of the table to create",
          "required": false,
          "default": "flashcards"
        },
        {
          "name": "columns",
          "type": "record_type",
          "description": "Column definitions",
          "required": false,
          "default": {
            "type": "record_type",
            "columns": []
          }
        },
        {
          "name": "add_primary_key",
          "type": "bool",
          "description": "Automatically make first integer column PRIMARY KEY AUTOINCREMENT",
          "required": false,
          "default": true
        },
        {
          "name": "if_not_exists",
          "type": "bool",
          "description": "Only create table if it doesn't exist",
          "required": false,
          "default": true
        }
      ],
      "outputs": [
        {
          "name": "database_name",
          "type": "str"
        },
        {
          "name": "table_name",
          "type": "str"
        },
        {
          "name": "columns",
          "type": "record_type"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/sqlite/createtable",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/sqlite/createtable.md"
    },
    {
      "type": "lib.sqlite.Delete",
      "title": "Delete",
      "namespace": "lib.sqlite",
      "description": "Delete records from a SQLite table.\n    sqlite, database, delete, remove, drop\n\n    Use cases:\n    - Remove flashcards\n    - Delete agent memory\n    - Clean up old data",
      "inputs": [
        {
          "name": "database_name",
          "type": "str",
          "description": "Name of the SQLite database file",
          "required": false,
          "default": "memory.db"
        },
        {
          "name": "table_name",
          "type": "str",
          "description": "Name of the table to delete from",
          "required": false,
          "default": "flashcards"
        },
        {
          "name": "where",
          "type": "str",
          "description": "WHERE clause (without 'WHERE' keyword), e.g., 'id = 1'. REQUIRED for safety.",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "rows_affected",
          "type": "int"
        },
        {
          "name": "message",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/sqlite/delete",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/sqlite/delete.md"
    },
    {
      "type": "lib.sqlite.ExecuteSQL",
      "title": "Execute SQL",
      "namespace": "lib.sqlite",
      "description": "Execute arbitrary SQL statements for advanced operations.\n    sqlite, database, sql, execute, custom\n\n    Use cases:\n    - Complex queries with joins\n    - Aggregate functions (COUNT, SUM, AVG)\n    - Custom SQL operations",
      "inputs": [
        {
          "name": "database_name",
          "type": "str",
          "description": "Name of the SQLite database file",
          "required": false,
          "default": "memory.db"
        },
        {
          "name": "sql",
          "type": "str",
          "description": "SQL statement to execute",
          "required": false,
          "default": "SELECT * FROM flashcards"
        },
        {
          "name": "parameters",
          "type": "list[any]",
          "description": "Parameters for parameterized queries (use ? in SQL)",
          "required": false,
          "default": []
        }
      ],
      "outputs": [
        {
          "name": "rows_affected",
          "type": "int"
        },
        {
          "name": "last_row_id",
          "type": "int"
        },
        {
          "name": "message",
          "type": "str"
        },
        {
          "name": "rows",
          "type": "list[dict[str, any]]"
        },
        {
          "name": "count",
          "type": "int"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/sqlite/executesql",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/sqlite/executesql.md"
    },
    {
      "type": "lib.sqlite.GetDatabasePath",
      "title": "Get Database Path",
      "namespace": "lib.sqlite",
      "description": "Get the full path to a SQLite database file.\n    sqlite, database, path, location\n\n    Use cases:\n    - Reference database location\n    - Verify database exists\n    - Pass path to external tools",
      "inputs": [
        {
          "name": "database_name",
          "type": "str",
          "description": "Name of the SQLite database file",
          "required": false,
          "default": "memory.db"
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/sqlite/getdatabasepath",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/sqlite/getdatabasepath.md"
    },
    {
      "type": "lib.sqlite.Insert",
      "title": "Insert",
      "namespace": "lib.sqlite",
      "description": "Insert a record into a SQLite table.\n    sqlite, database, insert, add, record\n\n    Use cases:\n    - Add new flashcards to database\n    - Store agent observations\n    - Persist workflow results",
      "inputs": [
        {
          "name": "database_name",
          "type": "str",
          "description": "Name of the SQLite database file",
          "required": false,
          "default": "memory.db"
        },
        {
          "name": "table_name",
          "type": "str",
          "description": "Name of the table to insert into",
          "required": false,
          "default": "flashcards"
        },
        {
          "name": "data",
          "type": "dict[str, any]",
          "description": "Data to insert as dict (column: value)",
          "required": false,
          "default": {
            "content": "example"
          }
        }
      ],
      "outputs": [
        {
          "name": "row_id",
          "type": "int"
        },
        {
          "name": "rows_affected",
          "type": "int"
        },
        {
          "name": "message",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/sqlite/insert",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/sqlite/insert.md"
    },
    {
      "type": "lib.sqlite.Query",
      "title": "Query",
      "namespace": "lib.sqlite",
      "description": "Query records from a SQLite table.\n    sqlite, database, query, select, search, retrieve\n\n    Use cases:\n    - Retrieve flashcards for review\n    - Search agent memory\n    - Fetch stored data",
      "inputs": [
        {
          "name": "database_name",
          "type": "str",
          "description": "Name of the SQLite database file",
          "required": false,
          "default": "memory.db"
        },
        {
          "name": "table_name",
          "type": "str",
          "description": "Name of the table to query",
          "required": false,
          "default": "flashcards"
        },
        {
          "name": "where",
          "type": "str",
          "description": "WHERE clause (without 'WHERE' keyword), e.g., 'id = 1'",
          "required": false,
          "default": ""
        },
        {
          "name": "columns",
          "type": "record_type",
          "description": "Columns to select",
          "required": false,
          "default": {
            "type": "record_type",
            "columns": []
          }
        },
        {
          "name": "order_by",
          "type": "str",
          "description": "ORDER BY clause (without 'ORDER BY' keyword)",
          "required": false,
          "default": ""
        },
        {
          "name": "limit",
          "type": "int",
          "description": "Maximum number of rows to return (0 = no limit)",
          "required": false,
          "default": 0
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "list[dict[str, any]]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/sqlite/query",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/sqlite/query.md"
    },
    {
      "type": "lib.sqlite.Update",
      "title": "Update",
      "namespace": "lib.sqlite",
      "description": "Update records in a SQLite table.\n    sqlite, database, update, modify, change\n\n    Use cases:\n    - Update flashcard content\n    - Modify stored records\n    - Change agent memory",
      "inputs": [
        {
          "name": "database_name",
          "type": "str",
          "description": "Name of the SQLite database file",
          "required": false,
          "default": "memory.db"
        },
        {
          "name": "table_name",
          "type": "str",
          "description": "Name of the table to update",
          "required": false,
          "default": "flashcards"
        },
        {
          "name": "data",
          "type": "dict[str, any]",
          "description": "Data to update as dict (column: new_value)",
          "required": false,
          "default": {
            "content": "updated"
          }
        },
        {
          "name": "where",
          "type": "str",
          "description": "WHERE clause (without 'WHERE' keyword), e.g., 'id = 1'",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "rows_affected",
          "type": "int"
        },
        {
          "name": "message",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/sqlite/update",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/sqlite/update.md"
    },
    {
      "type": "lib.supabase.Delete",
      "title": "Delete",
      "namespace": "lib.supabase",
      "description": "Delete records from a Supabase table.\n    supabase, database, delete, remove",
      "inputs": [
        {
          "name": "table_name",
          "type": "str",
          "description": "Table to delete from",
          "required": false,
          "default": ""
        },
        {
          "name": "filters",
          "type": "list[tuple[str, enum, any]]",
          "description": "Filters to select rows to delete (required for safety)",
          "required": false,
          "default": []
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "dict[str, any]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/supabase/delete",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/supabase/delete.md"
    },
    {
      "type": "lib.supabase.Insert",
      "title": "Insert",
      "namespace": "lib.supabase",
      "description": "Insert record(s) into a Supabase table.\n    supabase, database, insert, add, record",
      "inputs": [
        {
          "name": "table_name",
          "type": "str",
          "description": "Table to insert into",
          "required": false,
          "default": ""
        },
        {
          "name": "records",
          "type": "union[list[dict[str, any]], dict[str, any]]",
          "description": "One or multiple rows to insert",
          "required": false,
          "default": []
        },
        {
          "name": "return_rows",
          "type": "bool",
          "description": "Return inserted rows (uses select('*'))",
          "required": false,
          "default": true
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "any"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/supabase/insert",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/supabase/insert.md"
    },
    {
      "type": "lib.supabase.RPC",
      "title": "RPC",
      "namespace": "lib.supabase",
      "description": "Call a PostgreSQL function via Supabase RPC.\n    supabase, database, rpc, function",
      "inputs": [
        {
          "name": "function",
          "type": "str",
          "description": "RPC function name",
          "required": false,
          "default": ""
        },
        {
          "name": "params",
          "type": "dict[str, any]",
          "description": "Function params",
          "required": false,
          "default": {}
        },
        {
          "name": "to_dataframe",
          "type": "bool",
          "description": "Return DataframeRef if result is a list of records",
          "required": false,
          "default": false
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "any"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/supabase/rpc",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/supabase/rpc.md"
    },
    {
      "type": "lib.supabase.Select",
      "title": "Select",
      "namespace": "lib.supabase",
      "description": "Query records from a Supabase table.\n    supabase, database, query, select",
      "inputs": [
        {
          "name": "table_name",
          "type": "str",
          "description": "Table to query",
          "required": false,
          "default": ""
        },
        {
          "name": "columns",
          "type": "record_type",
          "description": "Columns to select",
          "required": false,
          "default": {
            "type": "record_type",
            "columns": []
          }
        },
        {
          "name": "filters",
          "type": "list[tuple[str, enum, any]]",
          "description": "List of typed filters to apply",
          "required": false,
          "default": []
        },
        {
          "name": "order_by",
          "type": "str",
          "description": "Column to order by",
          "required": false,
          "default": ""
        },
        {
          "name": "descending",
          "type": "bool",
          "description": "Order direction",
          "required": false,
          "default": false
        },
        {
          "name": "limit",
          "type": "int",
          "description": "Max rows to return (0 = no limit)",
          "required": false,
          "default": 0
        },
        {
          "name": "to_dataframe",
          "type": "bool",
          "description": "Return a DataframeRef instead of list of dicts",
          "required": false,
          "default": false
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "any"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/supabase/select",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/supabase/select.md"
    },
    {
      "type": "lib.supabase.Update",
      "title": "Update",
      "namespace": "lib.supabase",
      "description": "Update records in a Supabase table.\n    supabase, database, update, modify, change",
      "inputs": [
        {
          "name": "table_name",
          "type": "str",
          "description": "Table to update",
          "required": false,
          "default": ""
        },
        {
          "name": "values",
          "type": "dict[str, any]",
          "description": "New values",
          "required": false,
          "default": {}
        },
        {
          "name": "filters",
          "type": "list[tuple[str, enum, any]]",
          "description": "Filters to select rows to update",
          "required": false,
          "default": []
        },
        {
          "name": "return_rows",
          "type": "bool",
          "description": "Return updated rows (uses select('*'))",
          "required": false,
          "default": true
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "any"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/supabase/update",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/supabase/update.md"
    },
    {
      "type": "lib.supabase.Upsert",
      "title": "Upsert",
      "namespace": "lib.supabase",
      "description": "Insert or update (upsert) records in a Supabase table.\n    supabase, database, upsert, merge",
      "inputs": [
        {
          "name": "table_name",
          "type": "str",
          "description": "Table to upsert into",
          "required": false,
          "default": ""
        },
        {
          "name": "records",
          "type": "union[list[dict[str, any]], dict[str, any]]",
          "description": "One or multiple rows to upsert",
          "required": false,
          "default": []
        },
        {
          "name": "return_rows",
          "type": "bool",
          "description": "Return upserted rows (uses select('*'))",
          "required": false,
          "default": true
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "any"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/supabase/upsert",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/supabase/upsert.md"
    },
    {
      "type": "lib.svg.Circle",
      "title": "Circle",
      "namespace": "lib.svg",
      "description": "Generate SVG circle element with customizable position, radius, and styling.\n    svg, shape, vector, circle\n\n    Use cases:\n    - Create circular shapes and icons\n    - Design buttons, badges, and indicators\n    - Build data visualizations like pie charts\n    - Create decorative elements and patterns",
      "inputs": [
        {
          "name": "cx",
          "type": "int",
          "description": "Center X coordinate",
          "required": false,
          "default": 0
        },
        {
          "name": "cy",
          "type": "int",
          "description": "Center Y coordinate",
          "required": false,
          "default": 0
        },
        {
          "name": "radius",
          "type": "int",
          "description": "Radius",
          "required": false,
          "default": 50
        },
        {
          "name": "fill",
          "type": "color",
          "description": "Fill color",
          "required": false,
          "default": {
            "type": "color",
            "value": "#000000"
          }
        },
        {
          "name": "stroke",
          "type": "color",
          "description": "Stroke color",
          "required": false,
          "default": {
            "type": "color",
            "value": "none"
          }
        },
        {
          "name": "stroke_width",
          "type": "int",
          "description": "Stroke width",
          "required": false,
          "default": 1
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "svg_element"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/svg/circle",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/svg/circle.md"
    },
    {
      "type": "lib.svg.ClipPath",
      "title": "Clip Path",
      "namespace": "lib.svg",
      "description": "Create clipping paths for SVG elements.\n    svg, clip, mask\n\n    Use cases:\n    - Mask parts of elements\n    - Create complex shapes through clipping\n    - Apply visual effects using masks",
      "inputs": [
        {
          "name": "clip_content",
          "type": "svg_element",
          "description": "SVG element to use as clip path",
          "required": false,
          "default": {
            "type": "svg_element",
            "name": "",
            "attributes": {},
            "content": null,
            "children": []
          }
        },
        {
          "name": "content",
          "type": "svg_element",
          "description": "SVG element to clip",
          "required": false,
          "default": {
            "type": "svg_element",
            "name": "",
            "attributes": {},
            "content": null,
            "children": []
          }
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "svg_element"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/svg/clippath",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/svg/clippath.md"
    },
    {
      "type": "lib.svg.Document",
      "title": "SVG Document",
      "namespace": "lib.svg",
      "description": "Combine SVG elements into a complete SVG document.\n    svg, document, combine\n\n    Use cases:\n    - Combine multiple SVG elements into a single document\n    - Set document-level properties like viewBox and dimensions\n    - Export complete SVG documents",
      "inputs": [
        {
          "name": "elements",
          "type": "list[svg_element]",
          "description": "List of SVG elements",
          "required": false,
          "default": []
        },
        {
          "name": "width",
          "type": "int",
          "description": "Document width",
          "required": false,
          "default": 800
        },
        {
          "name": "height",
          "type": "int",
          "description": "Document height",
          "required": false,
          "default": 600
        },
        {
          "name": "viewBox",
          "type": "str",
          "description": "SVG viewBox attribute",
          "required": false,
          "default": "0 0 800 600"
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "svg"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/svg/svgdocument",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/svg/svgdocument.md"
    },
    {
      "type": "lib.svg.DropShadow",
      "title": "Drop Shadow",
      "namespace": "lib.svg",
      "description": "Apply drop shadow filter effect to SVG elements for depth.\n    svg, filter, shadow, effects\n\n    Use cases:\n    - Add depth and elevation to elements\n    - Create realistic shadow effects\n    - Enhance visual hierarchy\n    - Improve element separation and readability",
      "inputs": [
        {
          "name": "std_deviation",
          "type": "float",
          "description": "Standard deviation for blur",
          "required": false,
          "default": 3
        },
        {
          "name": "dx",
          "type": "int",
          "description": "X offset for shadow",
          "required": false,
          "default": 2
        },
        {
          "name": "dy",
          "type": "int",
          "description": "Y offset for shadow",
          "required": false,
          "default": 2
        },
        {
          "name": "color",
          "type": "color",
          "description": "Color for shadow",
          "required": false,
          "default": {
            "type": "color",
            "value": "#000000"
          }
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "svg_element"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/svg/dropshadow",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/svg/dropshadow.md"
    },
    {
      "type": "lib.svg.Ellipse",
      "title": "Ellipse",
      "namespace": "lib.svg",
      "description": "Generate SVG ellipse element with customizable position, radii, and styling.\n    svg, shape, vector, ellipse\n\n    Use cases:\n    - Create oval shapes and organic forms\n    - Design speech bubbles and callouts\n    - Build data visualization elements\n    - Create decorative patterns and borders",
      "inputs": [
        {
          "name": "cx",
          "type": "int",
          "description": "Center X coordinate",
          "required": false,
          "default": 0
        },
        {
          "name": "cy",
          "type": "int",
          "description": "Center Y coordinate",
          "required": false,
          "default": 0
        },
        {
          "name": "rx",
          "type": "int",
          "description": "X radius",
          "required": false,
          "default": 100
        },
        {
          "name": "ry",
          "type": "int",
          "description": "Y radius",
          "required": false,
          "default": 50
        },
        {
          "name": "fill",
          "type": "color",
          "description": "Fill color",
          "required": false,
          "default": {
            "type": "color",
            "value": "#000000"
          }
        },
        {
          "name": "stroke",
          "type": "color",
          "description": "Stroke color",
          "required": false,
          "default": {
            "type": "color",
            "value": "none"
          }
        },
        {
          "name": "stroke_width",
          "type": "int",
          "description": "Stroke width",
          "required": false,
          "default": 1
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "svg_element"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/svg/ellipse",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/svg/ellipse.md"
    },
    {
      "type": "lib.svg.GaussianBlur",
      "title": "Gaussian Blur",
      "namespace": "lib.svg",
      "description": "Apply Gaussian blur filter effect to SVG elements.\n    svg, filter, blur, effects\n\n    Use cases:\n    - Create soft focus and depth effects\n    - Add subtle shadows and glows\n    - Simulate motion blur\n    - Soften edges in graphics",
      "inputs": [
        {
          "name": "std_deviation",
          "type": "float",
          "description": "Standard deviation for blur",
          "required": false,
          "default": 3
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "svg_element"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/svg/gaussianblur",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/svg/gaussianblur.md"
    },
    {
      "type": "lib.svg.Gradient",
      "title": "Gradient",
      "namespace": "lib.svg",
      "description": "Create linear or radial gradients for SVG elements.\n    svg, gradient, color\n\n    Use cases:\n    - Add smooth color transitions\n    - Create complex color effects\n    - Define reusable gradient definitions",
      "inputs": [
        {
          "name": "gradient_type",
          "type": "enum",
          "description": "Type of gradient",
          "required": false,
          "default": "linearGradient"
        },
        {
          "name": "x1",
          "type": "float",
          "description": "Start X position (linear) or center X (radial)",
          "required": false,
          "default": 0
        },
        {
          "name": "y1",
          "type": "float",
          "description": "Start Y position (linear) or center Y (radial)",
          "required": false,
          "default": 0
        },
        {
          "name": "x2",
          "type": "float",
          "description": "End X position (linear) or radius X (radial)",
          "required": false,
          "default": 100
        },
        {
          "name": "y2",
          "type": "float",
          "description": "End Y position (linear) or radius Y (radial)",
          "required": false,
          "default": 100
        },
        {
          "name": "color1",
          "type": "color",
          "description": "Start color of gradient",
          "required": false,
          "default": {
            "type": "color",
            "value": "#000000"
          }
        },
        {
          "name": "color2",
          "type": "color",
          "description": "End color of gradient",
          "required": false,
          "default": {
            "type": "color",
            "value": "#FFFFFF"
          }
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "svg_element"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/svg/gradient",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/svg/gradient.md"
    },
    {
      "type": "lib.svg.Line",
      "title": "Line",
      "namespace": "lib.svg",
      "description": "Generate SVG line element with customizable endpoints and styling.\n    svg, shape, vector, line\n\n    Use cases:\n    - Draw straight lines and connectors\n    - Create dividers and separators\n    - Build diagrams and flowcharts\n    - Design grid patterns and borders",
      "inputs": [
        {
          "name": "x1",
          "type": "int",
          "description": "Start X coordinate",
          "required": false,
          "default": 0
        },
        {
          "name": "y1",
          "type": "int",
          "description": "Start Y coordinate",
          "required": false,
          "default": 0
        },
        {
          "name": "x2",
          "type": "int",
          "description": "End X coordinate",
          "required": false,
          "default": 100
        },
        {
          "name": "y2",
          "type": "int",
          "description": "End Y coordinate",
          "required": false,
          "default": 100
        },
        {
          "name": "stroke",
          "type": "color",
          "description": "Stroke color",
          "required": false,
          "default": {
            "type": "color",
            "value": "#000000"
          }
        },
        {
          "name": "stroke_width",
          "type": "int",
          "description": "Stroke width",
          "required": false,
          "default": 1
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "svg_element"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/svg/line",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/svg/line.md"
    },
    {
      "type": "lib.svg.Path",
      "title": "Path",
      "namespace": "lib.svg",
      "description": "Generate SVG path element using path data commands.\n    svg, shape, vector, path\n\n    Use cases:\n    - Create complex curved and custom shapes\n    - Build logos and custom icons\n    - Design intricate patterns and illustrations\n    - Import path data from design tools",
      "inputs": [
        {
          "name": "path_data",
          "type": "str",
          "description": "SVG path data (d attribute)",
          "required": false,
          "default": ""
        },
        {
          "name": "fill",
          "type": "color",
          "description": "Fill color",
          "required": false,
          "default": {
            "type": "color",
            "value": "#000000"
          }
        },
        {
          "name": "stroke",
          "type": "color",
          "description": "Stroke color",
          "required": false,
          "default": {
            "type": "color",
            "value": "none"
          }
        },
        {
          "name": "stroke_width",
          "type": "int",
          "description": "Stroke width",
          "required": false,
          "default": 1
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "svg_element"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/svg/path",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/svg/path.md"
    },
    {
      "type": "lib.svg.Polygon",
      "title": "Polygon",
      "namespace": "lib.svg",
      "description": "Generate SVG polygon element with multiple vertices.\n    svg, shape, vector, polygon\n\n    Use cases:\n    - Create multi-sided shapes like triangles, pentagons, stars\n    - Build custom icons and symbols\n    - Design complex geometric patterns\n    - Create irregular shapes and forms",
      "inputs": [
        {
          "name": "points",
          "type": "str",
          "description": "Points in format 'x1,y1 x2,y2 x3,y3...'",
          "required": false,
          "default": ""
        },
        {
          "name": "fill",
          "type": "color",
          "description": "Fill color",
          "required": false,
          "default": {
            "type": "color",
            "value": "#000000"
          }
        },
        {
          "name": "stroke",
          "type": "color",
          "description": "Stroke color",
          "required": false,
          "default": {
            "type": "color",
            "value": "none"
          }
        },
        {
          "name": "stroke_width",
          "type": "int",
          "description": "Stroke width",
          "required": false,
          "default": 1
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "svg_element"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/svg/polygon",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/svg/polygon.md"
    },
    {
      "type": "lib.svg.Rect",
      "title": "Rectangle",
      "namespace": "lib.svg",
      "description": "Generate SVG rectangle element with customizable position, size, and styling.\n    svg, shape, vector, rectangle\n\n    Use cases:\n    - Create rectangular shapes in SVG documents\n    - Design borders, frames, and backgrounds\n    - Build user interface components\n    - Create geometric patterns and layouts",
      "inputs": [
        {
          "name": "x",
          "type": "int",
          "description": "X coordinate",
          "required": false,
          "default": 0
        },
        {
          "name": "y",
          "type": "int",
          "description": "Y coordinate",
          "required": false,
          "default": 0
        },
        {
          "name": "width",
          "type": "int",
          "description": "Width",
          "required": false,
          "default": 100
        },
        {
          "name": "height",
          "type": "int",
          "description": "Height",
          "required": false,
          "default": 100
        },
        {
          "name": "fill",
          "type": "color",
          "description": "Fill color",
          "required": false,
          "default": {
            "type": "color",
            "value": "#000000"
          }
        },
        {
          "name": "stroke",
          "type": "color",
          "description": "Stroke color",
          "required": false,
          "default": {
            "type": "color",
            "value": "none"
          }
        },
        {
          "name": "stroke_width",
          "type": "int",
          "description": "Stroke width",
          "required": false,
          "default": 1
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "svg_element"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/svg/rectangle",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/svg/rectangle.md"
    },
    {
      "type": "lib.svg.SVGToImage",
      "title": "SVG to Image",
      "namespace": "lib.svg",
      "description": "Create an SVG document and convert it to a raster image in one step.\n    svg, document, raster, convert\n\n    Use cases:\n    - Create and rasterize SVG documents in a single operation\n    - Generate image files from SVG elements\n    - Convert vector graphics to bitmap format with custom dimensions",
      "inputs": [
        {
          "name": "elements",
          "type": "list[svg_element]",
          "description": "List of SVG elements",
          "required": false,
          "default": []
        },
        {
          "name": "width",
          "type": "int",
          "description": "Document width",
          "required": false,
          "default": 800
        },
        {
          "name": "height",
          "type": "int",
          "description": "Document height",
          "required": false,
          "default": 600
        },
        {
          "name": "viewBox",
          "type": "str",
          "description": "SVG viewBox attribute",
          "required": false,
          "default": "0 0 800 600"
        },
        {
          "name": "scale",
          "type": "int",
          "description": "Scale factor for rasterization",
          "required": false,
          "default": 1
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/svg/svgtoimage",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/svg/svgtoimage.md"
    },
    {
      "type": "lib.svg.Text",
      "title": "Text",
      "namespace": "lib.svg",
      "description": "Add text elements to SVG.\n    svg, text, typography\n\n    Use cases:\n    - Add labels to vector graphics\n    - Create text-based logos\n    - Generate dynamic text content in SVGs",
      "inputs": [
        {
          "name": "text",
          "type": "str",
          "description": "Text content",
          "required": false,
          "default": ""
        },
        {
          "name": "x",
          "type": "int",
          "description": "X coordinate",
          "required": false,
          "default": 0
        },
        {
          "name": "y",
          "type": "int",
          "description": "Y coordinate",
          "required": false,
          "default": 0
        },
        {
          "name": "font_family",
          "type": "str",
          "description": "Font family",
          "required": false,
          "default": "Arial"
        },
        {
          "name": "font_size",
          "type": "int",
          "description": "Font size",
          "required": false,
          "default": 16
        },
        {
          "name": "fill",
          "type": "color",
          "description": "Text color",
          "required": false,
          "default": {
            "type": "color",
            "value": "#000000"
          }
        },
        {
          "name": "text_anchor",
          "type": "enum",
          "description": "Text anchor position",
          "required": false,
          "default": "start"
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "svg_element"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/svg/text",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/svg/text.md"
    },
    {
      "type": "lib.svg.Transform",
      "title": "Transform",
      "namespace": "lib.svg",
      "description": "Apply transformations to SVG elements.\n    svg, transform, animation\n\n    Use cases:\n    - Rotate, scale, or translate elements\n    - Create complex transformations\n    - Prepare elements for animation",
      "inputs": [
        {
          "name": "content",
          "type": "svg_element",
          "description": "SVG element to transform",
          "required": false,
          "default": {
            "type": "svg_element",
            "name": "",
            "attributes": {},
            "content": null,
            "children": []
          }
        },
        {
          "name": "translate_x",
          "type": "float",
          "description": "X translation",
          "required": false,
          "default": 0
        },
        {
          "name": "translate_y",
          "type": "float",
          "description": "Y translation",
          "required": false,
          "default": 0
        },
        {
          "name": "rotate",
          "type": "float",
          "description": "Rotation angle in degrees",
          "required": false,
          "default": 0
        },
        {
          "name": "scale_x",
          "type": "float",
          "description": "X scale factor",
          "required": false,
          "default": 1
        },
        {
          "name": "scale_y",
          "type": "float",
          "description": "Y scale factor",
          "required": false,
          "default": 1
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "svg_element"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/svg/transform",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/svg/transform.md"
    },
    {
      "type": "lib.tensorflow.CocoSsdDetect",
      "title": "TensorFlow COCO-SSD Detect",
      "namespace": "lib.tensorflow",
      "description": "Detect objects in an image using the COCO-SSD model from TensorFlow.js, returning class, score, and bounding box per detection.\n    tensorflow, object-detection, coco, ssd, bounding-box",
      "inputs": [
        {
          "name": "max_detections",
          "type": "int",
          "description": "Maximum number of detections to return",
          "required": false,
          "default": 20
        },
        {
          "name": "min_score",
          "type": "float",
          "description": "Minimum confidence score (0–1) to keep a detection",
          "required": false,
          "default": 0.5
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "list"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/tensorflow/tensorflowcocossddetect",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/tensorflow/tensorflowcocossddetect.md"
    },
    {
      "type": "lib.tensorflow.MobileNetClassify",
      "title": "TensorFlow MobileNet Classify",
      "namespace": "lib.tensorflow",
      "description": "Classify an image with the MobileNet ImageNet model from TensorFlow.js.\n    tensorflow, image, classification, mobilenet, imagenet",
      "inputs": [
        {
          "name": "top_k",
          "type": "int",
          "description": "Number of top predictions to return",
          "required": false,
          "default": 5
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "list"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/tensorflow/tensorflowmobilenetclassify",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/tensorflow/tensorflowmobilenetclassify.md"
    },
    {
      "type": "lib.tensorflow.MobileNetEmbedding",
      "title": "TensorFlow MobileNet Embedding",
      "namespace": "lib.tensorflow",
      "description": "Extract a fixed-length feature embedding from an image using the MobileNet penultimate layer.\n    tensorflow, image, embedding, features, mobilenet, transfer-learning",
      "inputs": [],
      "outputs": [
        {
          "name": "output",
          "type": "list"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/tensorflow/tensorflowmobilenetembedding",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/tensorflow/tensorflowmobilenetembedding.md"
    },
    {
      "type": "lib.tensorflow.Qna",
      "title": "TensorFlow BERT QnA",
      "namespace": "lib.tensorflow",
      "description": "Answer a natural-language question against a passage of context using the TensorFlow.js BERT QnA model.\n    tensorflow, qna, bert, nlp, extractive, reading comprehension",
      "inputs": [
        {
          "name": "question",
          "type": "str",
          "description": "Natural-language question to answer",
          "required": false,
          "default": ""
        },
        {
          "name": "passage",
          "type": "str",
          "description": "Passage of text to extract the answer from",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "list"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/tensorflow/tensorflowbertqna",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/tensorflow/tensorflowbertqna.md"
    },
    {
      "type": "lib.twilio.GetMessages",
      "title": "Get Messages",
      "namespace": "lib.twilio",
      "description": "List recent SMS/MMS messages from a Twilio account.\n    twilio, sms, messages, list, history\n\n    Use cases:\n    - Retrieve message history\n    - Monitor incoming messages\n    - Audit sent messages",
      "inputs": [
        {
          "name": "limit",
          "type": "int",
          "description": "Maximum number of messages to return (1-1000)",
          "required": false,
          "default": 20
        },
        {
          "name": "to",
          "type": "str",
          "description": "Filter by recipient phone number",
          "required": false,
          "default": ""
        },
        {
          "name": "from_number",
          "type": "str",
          "description": "Filter by sender phone number",
          "required": false,
          "default": ""
        },
        {
          "name": "date_sent",
          "type": "str",
          "description": "Filter by date sent (YYYY-MM-DD)",
          "required": false,
          "default": ""
        },
        {
          "name": "account_sid",
          "type": "str",
          "description": "Twilio Account SID (optional — falls back to TWILIO_ACCOUNT_SID secret)",
          "required": false,
          "default": ""
        },
        {
          "name": "auth_token",
          "type": "str",
          "description": "Twilio Auth Token (optional — falls back to TWILIO_AUTH_TOKEN secret)",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "message",
          "type": "dict"
        },
        {
          "name": "messages",
          "type": "list"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/twilio/getmessages",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/twilio/getmessages.md"
    },
    {
      "type": "lib.twilio.Lookup",
      "title": "Lookup Phone Number",
      "namespace": "lib.twilio",
      "description": "Look up phone number information using the Twilio Lookup API.\n    twilio, phone, lookup, carrier, number\n\n    Use cases:\n    - Validate phone numbers\n    - Get carrier information\n    - Determine phone number type (mobile, landline)",
      "inputs": [
        {
          "name": "phone_number",
          "type": "str",
          "description": "Phone number to look up in E.164 format (e.g. +15551234567)",
          "required": false,
          "default": ""
        },
        {
          "name": "account_sid",
          "type": "str",
          "description": "Twilio Account SID (optional — falls back to TWILIO_ACCOUNT_SID secret)",
          "required": false,
          "default": ""
        },
        {
          "name": "auth_token",
          "type": "str",
          "description": "Twilio Auth Token (optional — falls back to TWILIO_AUTH_TOKEN secret)",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "dict"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/twilio/lookupphonenumber",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/twilio/lookupphonenumber.md"
    },
    {
      "type": "lib.twilio.SendSMS",
      "title": "Send SMS",
      "namespace": "lib.twilio",
      "description": "Send an SMS message via the Twilio REST API.\n    twilio, sms, text, send, message\n\n    Use cases:\n    - Send notification texts\n    - Automate SMS alerts\n    - Send verification codes",
      "inputs": [
        {
          "name": "to",
          "type": "str",
          "description": "Recipient phone number in E.164 format (e.g. +15551234567)",
          "required": false,
          "default": ""
        },
        {
          "name": "from_number",
          "type": "str",
          "description": "Twilio phone number to send from in E.164 format (e.g. +15559876543)",
          "required": false,
          "default": ""
        },
        {
          "name": "body",
          "type": "str",
          "description": "The text content of the SMS message",
          "required": false,
          "default": ""
        },
        {
          "name": "account_sid",
          "type": "str",
          "description": "Twilio Account SID (optional — falls back to TWILIO_ACCOUNT_SID secret)",
          "required": false,
          "default": ""
        },
        {
          "name": "auth_token",
          "type": "str",
          "description": "Twilio Auth Token (optional — falls back to TWILIO_AUTH_TOKEN secret)",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "dict"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/twilio/sendsms",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/twilio/sendsms.md"
    },
    {
      "type": "lib.twilio.SendWhatsApp",
      "title": "Send WhatsApp",
      "namespace": "lib.twilio",
      "description": "Send a WhatsApp message via the Twilio REST API.\n    twilio, whatsapp, message, send\n\n    Use cases:\n    - Send WhatsApp notifications\n    - Automate WhatsApp customer messages\n    - Send rich media via WhatsApp",
      "inputs": [
        {
          "name": "to",
          "type": "str",
          "description": "Recipient phone number in E.164 format (e.g. +15551234567)",
          "required": false,
          "default": ""
        },
        {
          "name": "from_number",
          "type": "str",
          "description": "Twilio WhatsApp-enabled phone number in E.164 format (e.g. +15559876543)",
          "required": false,
          "default": ""
        },
        {
          "name": "body",
          "type": "str",
          "description": "The text content of the WhatsApp message",
          "required": false,
          "default": ""
        },
        {
          "name": "account_sid",
          "type": "str",
          "description": "Twilio Account SID (optional — falls back to TWILIO_ACCOUNT_SID secret)",
          "required": false,
          "default": ""
        },
        {
          "name": "auth_token",
          "type": "str",
          "description": "Twilio Auth Token (optional — falls back to TWILIO_AUTH_TOKEN secret)",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "dict"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/twilio/sendwhatsapp",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/twilio/sendwhatsapp.md"
    },
    {
      "type": "lib.validate.Email",
      "title": "Validate Email",
      "namespace": "lib.validate",
      "description": "Check whether a value is a syntactically valid email address.\n    validate, email, check",
      "inputs": [
        {
          "name": "value",
          "type": "str",
          "description": "",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "bool"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/validate/validateemail",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/validate/validateemail.md"
    },
    {
      "type": "lib.validate.IP",
      "title": "Validate IP Address",
      "namespace": "lib.validate",
      "description": "Check whether a value is a valid IPv4 or IPv6 address.\n    validate, ip, ipv4, ipv6, address, network",
      "inputs": [
        {
          "name": "value",
          "type": "str",
          "description": "",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "is_ip",
          "type": "bool"
        },
        {
          "name": "is_ipv4",
          "type": "bool"
        },
        {
          "name": "is_ipv6",
          "type": "bool"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/validate/validateipaddress",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/validate/validateipaddress.md"
    },
    {
      "type": "lib.validate.Sanitize",
      "title": "Sanitize String",
      "namespace": "lib.validate",
      "description": "HTML-escape, trim, and lowercase/normalise a string. Also emits the normalised email when applicable.\n    sanitize, escape, html, xss, clean, trim",
      "inputs": [
        {
          "name": "value",
          "type": "str",
          "description": "",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "escaped",
          "type": "str"
        },
        {
          "name": "trimmed",
          "type": "str"
        },
        {
          "name": "normalized_email",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/validate/sanitizestring",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/validate/sanitizestring.md"
    },
    {
      "type": "lib.validate.String",
      "title": "Validate String",
      "namespace": "lib.validate",
      "description": "Run several common string checks at once and return one bool per check.\n    validate, check, email, url, uuid, json, number",
      "inputs": [
        {
          "name": "value",
          "type": "str",
          "description": "",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "is_email",
          "type": "bool"
        },
        {
          "name": "is_url",
          "type": "bool"
        },
        {
          "name": "is_uuid",
          "type": "bool"
        },
        {
          "name": "is_json",
          "type": "bool"
        },
        {
          "name": "is_numeric",
          "type": "bool"
        },
        {
          "name": "is_alpha",
          "type": "bool"
        },
        {
          "name": "is_alphanumeric",
          "type": "bool"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/validate/validatestring",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/validate/validatestring.md"
    },
    {
      "type": "lib.validate.URL",
      "title": "Validate URL",
      "namespace": "lib.validate",
      "description": "Check whether a value is a syntactically valid absolute URL.\n    validate, url, link, check",
      "inputs": [
        {
          "name": "value",
          "type": "str",
          "description": "",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "bool"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/validate/validateurl",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/validate/validateurl.md"
    },
    {
      "type": "lib.video.download.YtDlpDownload",
      "title": "YouTube Downloader",
      "namespace": "lib.video.download",
      "description": "Download media from URLs using yt-dlp.\n    download, video, audio, youtube, media, yt-dlp, metadata, subtitles\n\n    Use cases:\n    - Download videos from YouTube and other platforms\n    - Extract audio from video URLs\n    - Retrieve video/audio metadata without downloading\n    - Download subtitles and thumbnails",
      "inputs": [
        {
          "name": "url",
          "type": "str",
          "description": "URL of the media to download",
          "required": false,
          "default": ""
        },
        {
          "name": "mode",
          "type": "enum",
          "description": "Download mode: video, audio, or metadata only",
          "required": false,
          "default": "video"
        },
        {
          "name": "format_selector",
          "type": "str",
          "description": "yt-dlp format selector (e.g., 'best', 'bestvideo+bestaudio')",
          "required": false,
          "default": "best"
        },
        {
          "name": "container",
          "type": "str",
          "description": "Output container format (e.g., 'mp4', 'webm', 'auto')",
          "required": false,
          "default": "auto"
        },
        {
          "name": "subtitles",
          "type": "bool",
          "description": "Download subtitles if available",
          "required": false,
          "default": false
        },
        {
          "name": "thumbnail",
          "type": "bool",
          "description": "Download thumbnail if available",
          "required": false,
          "default": false
        },
        {
          "name": "overwrite",
          "type": "bool",
          "description": "Overwrite existing files",
          "required": false,
          "default": false
        },
        {
          "name": "rate_limit_kbps",
          "type": "int",
          "description": "Rate limit in KB/s (0 = unlimited)",
          "required": false,
          "default": 0
        },
        {
          "name": "timeout",
          "type": "int",
          "description": "Timeout in seconds",
          "required": false,
          "default": 600
        }
      ],
      "outputs": [
        {
          "name": "video",
          "type": "video"
        },
        {
          "name": "audio",
          "type": "audio"
        },
        {
          "name": "metadata",
          "type": "dict"
        },
        {
          "name": "subtitles",
          "type": "str"
        },
        {
          "name": "thumbnail",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/lib/video/download/youtubedownloader",
      "markdown_url": "https://docs.nodetool.ai/nodes/lib/video/download/youtubedownloader.md"
    },
    {
      "type": "messaging.discord.DiscordBotTrigger",
      "title": "Discord Bot Trigger",
      "namespace": "messaging.discord",
      "description": "Listen for Discord messages from a bot account and emit them as events.\n    discord, trigger, bot, messages, chat, events, listen",
      "inputs": [
        {
          "name": "max_events",
          "type": "int",
          "description": "Maximum number of events to process (0 = unlimited)",
          "required": false,
          "default": 0
        },
        {
          "name": "token",
          "type": "str",
          "description": "Discord bot token",
          "required": false,
          "default": ""
        },
        {
          "name": "channel_id",
          "type": "str",
          "description": "Optional channel ID to filter messages",
          "required": false,
          "default": null
        },
        {
          "name": "allow_bot_messages",
          "type": "bool",
          "description": "Include messages authored by bots",
          "required": false,
          "default": false
        }
      ],
      "outputs": [
        {
          "name": "message_id",
          "type": "int"
        },
        {
          "name": "content",
          "type": "str"
        },
        {
          "name": "author",
          "type": "dict[str, any]"
        },
        {
          "name": "channel",
          "type": "dict[str, any]"
        },
        {
          "name": "guild",
          "type": "dict[str, any]"
        },
        {
          "name": "attachments",
          "type": "list[dict[str, any]]"
        },
        {
          "name": "timestamp",
          "type": "str"
        },
        {
          "name": "source",
          "type": "str"
        },
        {
          "name": "event_type",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/messaging/discord/discordbottrigger",
      "markdown_url": "https://docs.nodetool.ai/nodes/messaging/discord/discordbottrigger.md"
    },
    {
      "type": "messaging.discord.DiscordSendMessage",
      "title": "Discord Send Message",
      "namespace": "messaging.discord",
      "description": "Send a message to a Discord channel using a bot token.\n    discord, send, message, bot, channel, chat, notify",
      "inputs": [
        {
          "name": "token",
          "type": "str",
          "description": "Discord bot token",
          "required": false,
          "default": ""
        },
        {
          "name": "channel_id",
          "type": "str",
          "description": "Target channel ID",
          "required": false,
          "default": ""
        },
        {
          "name": "content",
          "type": "str",
          "description": "Message content",
          "required": false,
          "default": ""
        },
        {
          "name": "tts",
          "type": "bool",
          "description": "Send as text-to-speech",
          "required": false,
          "default": false
        },
        {
          "name": "embeds",
          "type": "list[dict[str, any]]",
          "description": "Embeds as Discord embed dictionaries",
          "required": false,
          "default": null
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "dict[str, any]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/messaging/discord/discordsendmessage",
      "markdown_url": "https://docs.nodetool.ai/nodes/messaging/discord/discordsendmessage.md"
    },
    {
      "type": "messaging.telegram.TelegramBotTrigger",
      "title": "Telegram Bot Trigger",
      "namespace": "messaging.telegram",
      "description": "Listen for Telegram messages using long polling and emit them as events.\n    telegram, trigger, bot, messages, chat, events, listen",
      "inputs": [
        {
          "name": "max_events",
          "type": "int",
          "description": "Maximum number of events to process (0 = unlimited)",
          "required": false,
          "default": 0
        },
        {
          "name": "token",
          "type": "str",
          "description": "Telegram bot token",
          "required": false,
          "default": ""
        },
        {
          "name": "chat_id",
          "type": "int",
          "description": "Optional chat ID to filter messages",
          "required": false,
          "default": null
        },
        {
          "name": "allow_bot_messages",
          "type": "bool",
          "description": "Include messages authored by bots",
          "required": false,
          "default": false
        },
        {
          "name": "include_edited_messages",
          "type": "bool",
          "description": "Include edited messages",
          "required": false,
          "default": false
        },
        {
          "name": "poll_timeout_seconds",
          "type": "int",
          "description": "Long polling timeout in seconds",
          "required": false,
          "default": 30
        },
        {
          "name": "poll_interval_seconds",
          "type": "float",
          "description": "Delay between polling requests",
          "required": false,
          "default": 0.2
        }
      ],
      "outputs": [
        {
          "name": "update_id",
          "type": "int"
        },
        {
          "name": "update_type",
          "type": "str"
        },
        {
          "name": "message_id",
          "type": "int"
        },
        {
          "name": "text",
          "type": "str"
        },
        {
          "name": "caption",
          "type": "str"
        },
        {
          "name": "entities",
          "type": "list[dict[str, any]]"
        },
        {
          "name": "chat",
          "type": "dict[str, any]"
        },
        {
          "name": "from_user",
          "type": "dict[str, any]"
        },
        {
          "name": "attachments",
          "type": "list[dict[str, any]]"
        },
        {
          "name": "timestamp",
          "type": "str"
        },
        {
          "name": "source",
          "type": "str"
        },
        {
          "name": "event_type",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/messaging/telegram/telegrambottrigger",
      "markdown_url": "https://docs.nodetool.ai/nodes/messaging/telegram/telegrambottrigger.md"
    },
    {
      "type": "messaging.telegram.TelegramSendMessage",
      "title": "Telegram Send Message",
      "namespace": "messaging.telegram",
      "description": "Send a message to a Telegram chat using a bot token.\n    telegram, send, message, bot, chat, notify",
      "inputs": [
        {
          "name": "token",
          "type": "str",
          "description": "Telegram bot token",
          "required": false,
          "default": ""
        },
        {
          "name": "chat_id",
          "type": "int",
          "description": "Target chat ID",
          "required": false,
          "default": 0
        },
        {
          "name": "text",
          "type": "str",
          "description": "Message text",
          "required": false,
          "default": ""
        },
        {
          "name": "parse_mode",
          "type": "str",
          "description": "Optional parse mode (MarkdownV2 or HTML)",
          "required": false,
          "default": ""
        },
        {
          "name": "disable_web_page_preview",
          "type": "bool",
          "description": "Disable link previews",
          "required": false,
          "default": false
        },
        {
          "name": "disable_notification",
          "type": "bool",
          "description": "Send silently",
          "required": false,
          "default": false
        },
        {
          "name": "reply_to_message_id",
          "type": "int",
          "description": "Reply to a specific message ID",
          "required": false,
          "default": null
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "dict[str, any]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/messaging/telegram/telegramsendmessage",
      "markdown_url": "https://docs.nodetool.ai/nodes/messaging/telegram/telegramsendmessage.md"
    },
    {
      "type": "minimax.ImageToVideo",
      "title": "MiniMax Image to Video",
      "namespace": "minimax",
      "description": "",
      "inputs": [
        {
          "name": "model",
          "type": "enum",
          "description": "The MiniMax video model to use.",
          "required": false,
          "default": "MiniMax-Hailuo-02"
        },
        {
          "name": "image",
          "type": "image",
          "description": "The image to use as the first frame of the video.",
          "required": false,
          "default": {
            "type": "image",
            "uri": "",
            "asset_id": null,
            "data": null
          }
        },
        {
          "name": "prompt",
          "type": "str",
          "description": "",
          "required": false,
          "default": ""
        },
        {
          "name": "duration",
          "type": "int",
          "description": "Video duration in seconds.",
          "required": false,
          "default": 6
        },
        {
          "name": "resolution",
          "type": "enum",
          "description": "Output resolution.",
          "required": false,
          "default": "768P"
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "video"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/minimax/minimaximagetovideo",
      "markdown_url": "https://docs.nodetool.ai/nodes/minimax/minimaximagetovideo.md"
    },
    {
      "type": "minimax.MusicGeneration",
      "title": "MiniMax Music Generation",
      "namespace": "minimax",
      "description": "",
      "inputs": [
        {
          "name": "prompt",
          "type": "str",
          "description": "Describe the style, mood, genre, and instrumentation of the music.",
          "required": false,
          "default": "An upbeat pop song with bright synths and a catchy chorus"
        },
        {
          "name": "lyrics",
          "type": "str",
          "description": "",
          "required": false,
          "default": "[Verse]\nWalking down the city street\n[Chorus]\nThis is our moment, shining bright"
        },
        {
          "name": "model",
          "type": "enum",
          "description": "The MiniMax music model to use.",
          "required": false,
          "default": "music-2.6"
        },
        {
          "name": "format",
          "type": "enum",
          "description": "Output audio format.",
          "required": false,
          "default": "mp3"
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "audio"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/minimax/minimaxmusicgeneration",
      "markdown_url": "https://docs.nodetool.ai/nodes/minimax/minimaxmusicgeneration.md"
    },
    {
      "type": "minimax.TextToImage",
      "title": "MiniMax Text to Image",
      "namespace": "minimax",
      "description": "",
      "inputs": [
        {
          "name": "model",
          "type": "str",
          "description": "The MiniMax image model to use.",
          "required": false,
          "default": "image-01"
        },
        {
          "name": "prompt",
          "type": "str",
          "description": "Text prompt describing the desired image.",
          "required": false,
          "default": "A cat holding a sign that says hello world"
        },
        {
          "name": "negative_prompt",
          "type": "str",
          "description": "Describe what to avoid in the image.",
          "required": false,
          "default": ""
        },
        {
          "name": "aspect_ratio",
          "type": "enum",
          "description": "Aspect ratio of the generated image.",
          "required": false,
          "default": "1:1"
        },
        {
          "name": "prompt_optimizer",
          "type": "bool",
          "description": "Let MiniMax automatically refine the prompt before generating.",
          "required": false,
          "default": true
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/minimax/minimaxtexttoimage",
      "markdown_url": "https://docs.nodetool.ai/nodes/minimax/minimaxtexttoimage.md"
    },
    {
      "type": "minimax.TextToSpeech",
      "title": "MiniMax Text to Speech",
      "namespace": "minimax",
      "description": "",
      "inputs": [
        {
          "name": "text",
          "type": "str",
          "description": "The text to convert to speech (up to 10,000 characters).",
          "required": false,
          "default": "Hello, how are you?"
        },
        {
          "name": "voice_id",
          "type": "str",
          "description": "",
          "required": true
        },
        {
          "name": "model",
          "type": "enum",
          "description": "The MiniMax speech model to use.",
          "required": false,
          "default": "speech-2.6-hd"
        },
        {
          "name": "emotion",
          "type": "enum",
          "description": "Emotional tone of the speech. 'auto' lets the model decide from the text.",
          "required": false,
          "default": "auto"
        },
        {
          "name": "speed",
          "type": "float",
          "description": "Speech speed multiplier.",
          "required": false,
          "default": 1
        },
        {
          "name": "volume",
          "type": "float",
          "description": "Output volume.",
          "required": false,
          "default": 1
        },
        {
          "name": "pitch",
          "type": "int",
          "description": "Pitch shift in semitones.",
          "required": false,
          "default": 0
        },
        {
          "name": "language_boost",
          "type": "enum",
          "description": "Bias pronunciation toward a language. 'auto' autodetects from the text.",
          "required": false,
          "default": "auto"
        },
        {
          "name": "format",
          "type": "enum",
          "description": "Output audio format.",
          "required": false,
          "default": "mp3"
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "audio"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/minimax/minimaxtexttospeech",
      "markdown_url": "https://docs.nodetool.ai/nodes/minimax/minimaxtexttospeech.md"
    },
    {
      "type": "minimax.TextToVideo",
      "title": "MiniMax Text to Video",
      "namespace": "minimax",
      "description": "",
      "inputs": [
        {
          "name": "model",
          "type": "enum",
          "description": "The MiniMax video model to use.",
          "required": false,
          "default": "MiniMax-Hailuo-02"
        },
        {
          "name": "prompt",
          "type": "str",
          "description": "",
          "required": false,
          "default": "A cat playing with a ball of yarn"
        },
        {
          "name": "duration",
          "type": "int",
          "description": "Video duration in seconds.",
          "required": false,
          "default": 6
        },
        {
          "name": "resolution",
          "type": "enum",
          "description": "Output resolution.",
          "required": false,
          "default": "768P"
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "video"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/minimax/minimaxtexttovideo",
      "markdown_url": "https://docs.nodetool.ai/nodes/minimax/minimaxtexttovideo.md"
    },
    {
      "type": "minimax.Voice",
      "title": "MiniMax Voice",
      "namespace": "minimax",
      "description": "",
      "inputs": [
        {
          "name": "voice",
          "type": "enum",
          "description": "MiniMax system voice to use.",
          "required": true
        }
      ],
      "outputs": [
        {
          "name": "voice_id",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/minimax/minimaxvoice",
      "markdown_url": "https://docs.nodetool.ai/nodes/minimax/minimaxvoice.md"
    },
    {
      "type": "mistral.embeddings.Embedding",
      "title": "Embedding",
      "namespace": "mistral.embeddings",
      "description": "Generate vector embeddings using Mistral AI.\n    mistral, embeddings, vectors, semantic, similarity, search\n\n    Uses Mistral AI's embedding model to create dense vector representations of text.\n    These vectors capture semantic meaning, enabling:\n    - Semantic search\n    - Text clustering\n    - Document classification\n    - Recommendation systems\n    - Measuring text similarity\n\n    Requires a Mistral API key.",
      "inputs": [
        {
          "name": "input",
          "type": "str",
          "description": "The text to embed",
          "required": false,
          "default": ""
        },
        {
          "name": "model",
          "type": "enum",
          "description": "The embedding model to use",
          "required": false,
          "default": "mistral-embed"
        },
        {
          "name": "chunk_size",
          "type": "int",
          "description": "Size of text chunks for embedding",
          "required": false,
          "default": 4096
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "list"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/mistral/embeddings/embedding",
      "markdown_url": "https://docs.nodetool.ai/nodes/mistral/embeddings/embedding.md"
    },
    {
      "type": "mistral.text.ChatComplete",
      "title": "Chat Complete",
      "namespace": "mistral.text",
      "description": "Generate text using Mistral AI's chat completion models.\n    mistral, chat, ai, text generation, llm, completion\n\n    Uses Mistral AI's chat models to generate responses from prompts.\n    Requires a Mistral API key.\n\n    Use cases:\n    - Generate text responses to prompts\n    - Build conversational AI applications\n    - Code generation with Codestral\n    - Multi-modal understanding with Pixtral",
      "inputs": [
        {
          "name": "model",
          "type": "enum",
          "description": "The Mistral model to use for generation",
          "required": false,
          "default": "mistral-small-latest"
        },
        {
          "name": "prompt",
          "type": "str",
          "description": "The prompt for text generation",
          "required": false,
          "default": ""
        },
        {
          "name": "system_prompt",
          "type": "str",
          "description": "Optional system prompt to guide the model's behavior",
          "required": false,
          "default": ""
        },
        {
          "name": "temperature",
          "type": "float",
          "description": "Sampling temperature. Higher values make output more random.",
          "required": false,
          "default": 0.7
        },
        {
          "name": "max_tokens",
          "type": "int",
          "description": "Maximum number of tokens to generate",
          "required": false,
          "default": 1024
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/mistral/text/chatcomplete",
      "markdown_url": "https://docs.nodetool.ai/nodes/mistral/text/chatcomplete.md"
    },
    {
      "type": "mistral.text.CodeComplete",
      "title": "Code Complete",
      "namespace": "mistral.text",
      "description": "Generate code using Mistral AI's Codestral model.\n    mistral, code, codestral, ai, programming, completion\n\n    Uses Mistral AI's Codestral model specifically designed for code generation.\n    Supports fill-in-the-middle (FIM) for code completion tasks.\n    Requires a Mistral API key.\n\n    Use cases:\n    - Generate code from natural language descriptions\n    - Complete partial code snippets\n    - Fill in code between prefix and suffix\n    - Automated code generation for various programming languages",
      "inputs": [
        {
          "name": "prompt",
          "type": "str",
          "description": "The prompt or code prefix for generation",
          "required": false,
          "default": ""
        },
        {
          "name": "suffix",
          "type": "str",
          "description": "Optional suffix for fill-in-the-middle completion",
          "required": false,
          "default": ""
        },
        {
          "name": "temperature",
          "type": "float",
          "description": "Sampling temperature. Lower values for code generation.",
          "required": false,
          "default": 0
        },
        {
          "name": "max_tokens",
          "type": "int",
          "description": "Maximum number of tokens to generate",
          "required": false,
          "default": 2048
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/mistral/text/codecomplete",
      "markdown_url": "https://docs.nodetool.ai/nodes/mistral/text/codecomplete.md"
    },
    {
      "type": "mistral.vision.ImageToText",
      "title": "Image To Text",
      "namespace": "mistral.vision",
      "description": "Analyze images and generate text descriptions using Mistral AI's Pixtral models.\n    mistral, pixtral, vision, image, ocr, analysis, multimodal\n\n    Uses Mistral AI's Pixtral vision models to understand and describe images.\n    Can perform OCR, image analysis, and answer questions about images.\n    Requires a Mistral API key.\n\n    Use cases:\n    - Extract text from images (OCR)\n    - Describe image contents\n    - Answer questions about images\n    - Analyze charts and diagrams\n    - Document understanding",
      "inputs": [
        {
          "name": "image",
          "type": "image",
          "description": "The image to analyze",
          "required": false,
          "default": {
            "type": "image",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "prompt",
          "type": "str",
          "description": "The prompt/question about the image",
          "required": false,
          "default": "Describe this image in detail."
        },
        {
          "name": "model",
          "type": "enum",
          "description": "The Pixtral model to use for vision tasks",
          "required": false,
          "default": "pixtral-large-latest"
        },
        {
          "name": "temperature",
          "type": "float",
          "description": "Sampling temperature for response generation",
          "required": false,
          "default": 0.3
        },
        {
          "name": "max_tokens",
          "type": "int",
          "description": "Maximum number of tokens to generate",
          "required": false,
          "default": 1024
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/mistral/vision/imagetotext",
      "markdown_url": "https://docs.nodetool.ai/nodes/mistral/vision/imagetotext.md"
    },
    {
      "type": "mistral.vision.OCR",
      "title": "OCR",
      "namespace": "mistral.vision",
      "description": "Extract text from images using Mistral AI's Pixtral models.\n    mistral, pixtral, ocr, text extraction, document, image\n\n    Specialized node for optical character recognition (OCR) using Pixtral.\n    Optimized for extracting text content from documents, screenshots, and images.\n    Requires a Mistral API key.\n\n    Use cases:\n    - Extract text from scanned documents\n    - Read text from screenshots\n    - Digitize printed materials\n    - Extract data from forms and receipts",
      "inputs": [
        {
          "name": "image",
          "type": "image",
          "description": "The image to extract text from",
          "required": false,
          "default": {
            "type": "image",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "model",
          "type": "enum",
          "description": "The Pixtral model to use for OCR",
          "required": false,
          "default": "pixtral-large-latest"
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/mistral/vision/ocr",
      "markdown_url": "https://docs.nodetool.ai/nodes/mistral/vision/ocr.md"
    },
    {
      "type": "nodetool.agents.Agent",
      "title": "Agent",
      "namespace": "nodetool.agents",
      "description": "Chat with an LLM: send a prompt (plus optional images or audio), call tools, and stream back the response.\n    agent, llm, chat, text-generation, tools, streaming",
      "inputs": [
        {
          "name": "model",
          "type": "language_model",
          "description": "Model to use for execution",
          "required": false,
          "default": {
            "type": "language_model",
            "provider": "empty",
            "id": "",
            "name": "",
            "path": null,
            "supported_tasks": []
          }
        },
        {
          "name": "mode",
          "type": "enum",
          "description": "How the agent runs.\n\n• loop: standard tool‑calling loop — the LLM responds to the prompt and may iteratively call the connected tools until it produces a final answer. Use this for chat, Q&A, and most tool‑using tasks.\n• plan: the LLM first drafts a multi‑step task plan from the objective, then executes the steps in dependency order (independent steps run in parallel). Best for longer, structured jobs with clear sub‑tasks.",
          "required": false,
          "default": "loop"
        },
        {
          "name": "system",
          "type": "str",
          "description": "Instructions that define the agent's persona, role, tone, and global behaviour. Sent to the model as the system message at the start of every run, before any history or user prompt. Use it for things that should always hold (e.g. \"You are a senior Python reviewer. Reply in Markdown.\"). Leave the prompt itself for the per‑run task.",
          "required": false,
          "default": "You are a friendly assistant"
        },
        {
          "name": "prompt",
          "type": "str",
          "description": "The user message for this run — the actual question, task, or content the agent should act on. Appended after the system prompt and conversation history as the latest user turn. Any connected Image or Audio inputs are attached to this message. In plan and multi-agent modes this is treated as the objective for planning.",
          "required": false,
          "default": ""
        },
        {
          "name": "tools",
          "type": "list[tool_name]",
          "description": "Tools to enable for the agent. Select workspace tools (read_file, write_file, list_directory) to enable file operations.",
          "required": false,
          "default": []
        },
        {
          "name": "image",
          "type": "list[image]",
          "description": "Images to attach to the prompt. Wire a list[image] source to send several at once, or a single Image (auto-wrapped into a one-item list). Each image becomes a separate block in the user message sent to the provider.",
          "required": false,
          "default": []
        },
        {
          "name": "audio",
          "type": "list[audio]",
          "description": "Audio clips to attach to the prompt. Wire a list[audio] source to send several at once, or a single Audio (auto-wrapped into a one-item list). Each clip becomes a separate block in the user message sent to the provider.",
          "required": false,
          "default": []
        },
        {
          "name": "history",
          "type": "list[message]",
          "description": "Prior conversation turns to include before the current prompt, in chronological order (oldest first). Each item is a Message with a role (user/assistant/tool) and content. Use this to supply ad‑hoc context — for example, few‑shot examples, a previous chat transcript piped in from another node, or the messages output of an upstream Agent. Inserted between the system prompt and the new user prompt. If a Thread ID is also set, history loaded from the thread comes first, then this list, then the current prompt.",
          "required": false,
          "default": []
        },
        {
          "name": "thread_id",
          "type": "str",
          "description": "Identifier for a persistent conversation thread. When set, the agent loads all earlier messages stored under this ID before this turn and saves the new user message, assistant reply, and any tool messages back to it — giving the agent long‑term memory across runs and across nodes that share the same ID. Leave empty for a stateless one‑shot call. Use the Create Thread node to mint a fresh ID, or wire in the same string from upstream to continue an existing conversation.",
          "required": false,
          "default": ""
        },
        {
          "name": "max_tokens",
          "type": "int",
          "description": "Upper bound on generated tokens per response, including visible output and any reasoning/thinking tokens used by reasoning models. Higher values allow longer answers and more thinking headroom but cost more and take longer; very low values may truncate reasoning or the final answer. Typical values: 1024 for short answers, 8192–16384 for normal agent use, 32k+ for long-form or heavy reasoning. Must be within the chosen model's context window.",
          "required": true
        },
        {
          "name": "max_turns",
          "type": "int",
          "description": "Upper bound on agentic turns — one turn is a model call plus any tool execution it triggers. Caps both the AgentNode tool-loop iteration count and the provider's internal multi-turn budget (e.g. Claude Agent SDK). Raise for long sandbox sessions; lower to fail fast on runaway loops.",
          "required": false,
          "default": 100
        }
      ],
      "outputs": [
        {
          "name": "text",
          "type": "str"
        },
        {
          "name": "chunk",
          "type": "chunk"
        },
        {
          "name": "thinking",
          "type": "chunk"
        },
        {
          "name": "audio",
          "type": "audio"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/agents/agent",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/agents/agent.md"
    },
    {
      "type": "nodetool.agents.BrowserAgent",
      "title": "Browser Agent",
      "namespace": "nodetool.agents",
      "description": "Browse the web to fetch pages, extract data, and automate navigation from a prompt.\n    agent, browser, web, scrape, extraction, automation",
      "inputs": [
        {
          "name": "model",
          "type": "language_model",
          "description": "Model used for free-form browsing tasks.",
          "required": false,
          "default": {
            "type": "language_model",
            "provider": "empty",
            "id": "",
            "name": "",
            "path": null,
            "supported_tasks": []
          }
        },
        {
          "name": "prompt",
          "type": "str",
          "description": "Prompt for browser navigation/extraction.",
          "required": false,
          "default": ""
        },
        {
          "name": "timeout_seconds",
          "type": "int",
          "description": "Maximum runtime for agent execution.",
          "required": false,
          "default": 150
        },
        {
          "name": "max_output_chars",
          "type": "int",
          "description": "Maximum serialized output chars before truncation.",
          "required": false,
          "default": 180000
        }
      ],
      "outputs": [
        {
          "name": "text",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/agents/browseragent",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/agents/browseragent.md"
    },
    {
      "type": "nodetool.agents.Classifier",
      "title": "Classifier",
      "namespace": "nodetool.agents",
      "description": "Classify text into predefined or dynamic categories using LLM.\n    classification, nlp, categorization\n\n    Use cases:\n    - Sentiment analysis\n    - Topic classification\n    - Intent detection\n    - Content categorization",
      "inputs": [
        {
          "name": "system_prompt",
          "type": "str",
          "description": "The system prompt for the classifier",
          "required": false,
          "default": "\nYou are a precise classifier.\n\nGoal\n- Select exactly one category from the list provided by the user.\n\nOutput format (MANDATORY)\n- Return ONLY a single JSON object with this exact schema and nothing else:\n  {\"category\": \"<one-of-the-allowed-categories>\"}\n- No prose, no Markdown, no code fences, no explanations, no extra keys.\n\nSelection criteria\n- Choose the single best category that captures the main intent of the text.\n- If multiple categories seem plausible, pick the most probable one; do not return multiple.\n- If none fit perfectly, choose the closest allowed category. If the list includes \"Other\" or \"Unknown\", prefer it when appropriate.\n- Be robust to casing, punctuation, emojis, and minor typos. Handle negation correctly (e.g., \"not spam\" ≠ spam).\n- Never invent categories that are not in the provided list.\n\nBehavior\n- Be deterministic for the same input.\n- Do not ask clarifying questions; make the best choice with what's given.\n"
        },
        {
          "name": "model",
          "type": "language_model",
          "description": "Model to use for classification",
          "required": false,
          "default": {
            "type": "language_model",
            "provider": "empty",
            "id": "",
            "name": "",
            "path": null,
            "supported_tasks": []
          }
        },
        {
          "name": "text",
          "type": "str",
          "description": "Text to classify",
          "required": false,
          "default": ""
        },
        {
          "name": "image",
          "type": "image",
          "description": "Optional image to classify in context",
          "required": false,
          "default": {
            "type": "image",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "audio",
          "type": "audio",
          "description": "Optional audio to classify in context",
          "required": false,
          "default": {
            "type": "audio",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "categories",
          "type": "list[str]",
          "description": "List of possible categories. If empty, LLM will determine categories.",
          "required": false,
          "default": []
        },
        {
          "name": "max_tokens",
          "type": "int",
          "description": "The maximum number of tokens to generate.",
          "required": false,
          "default": 256
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/agents/classifier",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/agents/classifier.md"
    },
    {
      "type": "nodetool.agents.ClaudeCodeAgent",
      "title": "Claude Code Agent",
      "namespace": "nodetool.agents",
      "description": "",
      "inputs": [
        {
          "name": "prompt",
          "type": "str",
          "description": "Instructions for this agent (its role/task). Combined with `input` when both are set.",
          "required": false,
          "default": ""
        },
        {
          "name": "input",
          "type": "str",
          "description": "Hand-off text from an upstream agent (wire another node's `text` output here). Appended after the prompt.",
          "required": false,
          "default": ""
        },
        {
          "name": "session_name",
          "type": "str",
          "description": "tmux session name. Empty: auto-generated. With `keep_session`, reusing the same name continues the same Claude conversation across runs.",
          "required": false,
          "default": ""
        },
        {
          "name": "keep_session",
          "type": "bool",
          "description": "Leave the tmux session (and Claude conversation) running after the turn completes, so follow-up prompts share context.",
          "required": false,
          "default": false
        },
        {
          "name": "model",
          "type": "str",
          "description": "Optional model override passed as --model (e.g. opus, sonnet).",
          "required": false,
          "default": ""
        },
        {
          "name": "system_prompt",
          "type": "str",
          "description": "Optional text passed as --append-system-prompt (e.g. 'You are a strict code reviewer').",
          "required": false,
          "default": ""
        },
        {
          "name": "extra_args",
          "type": "str",
          "description": "Extra CLI arguments appended verbatim to the claude command.",
          "required": false,
          "default": ""
        },
        {
          "name": "command",
          "type": "str",
          "description": "Claude Code binary to launch.",
          "required": false,
          "default": "claude"
        },
        {
          "name": "timeout_seconds",
          "type": "int",
          "description": "Maximum time to wait for the agent to finish the turn.",
          "required": false,
          "default": 900
        },
        {
          "name": "quiet_period_seconds",
          "type": "float",
          "description": "How long the session log must stay quiet (with the terminal idle) before the turn counts as finished.",
          "required": false,
          "default": 3
        }
      ],
      "outputs": [
        {
          "name": "text",
          "type": "str"
        },
        {
          "name": "chunk",
          "type": "chunk"
        },
        {
          "name": "transcript",
          "type": "str"
        },
        {
          "name": "session_id",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/agents/claudecodeagent",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/agents/claudecodeagent.md"
    },
    {
      "type": "nodetool.agents.CreateThread",
      "title": "Create Thread",
      "namespace": "nodetool.agents",
      "description": "Create a new conversation thread and return its ID.\n    threads, chat, conversation, context\n\n    Use this to seed a thread_id that downstream Agent nodes can reuse for\n    persistent history across the graph or multiple runs.",
      "inputs": [
        {
          "name": "title",
          "type": "str",
          "description": "Optional title for the new thread",
          "required": false,
          "default": "Agent Conversation"
        },
        {
          "name": "thread_id",
          "type": "str",
          "description": "Optional custom thread ID. If provided and owned by the user, it will be reused; otherwise a new thread is created.",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "thread_id",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/agents/createthread",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/agents/createthread.md"
    },
    {
      "type": "nodetool.agents.DocumentAgent",
      "title": "Document Agent",
      "namespace": "nodetool.agents",
      "description": "Read, analyze, and convert documents to Markdown from a prompt.\n    agent, document, analysis, conversion, markdown",
      "inputs": [
        {
          "name": "model",
          "type": "language_model",
          "description": "Model used for free-form document tasks.",
          "required": false,
          "default": {
            "type": "language_model",
            "provider": "empty",
            "id": "",
            "name": "",
            "path": null,
            "supported_tasks": []
          }
        },
        {
          "name": "prompt",
          "type": "str",
          "description": "Prompt describing the document task.",
          "required": false,
          "default": ""
        },
        {
          "name": "timeout_seconds",
          "type": "int",
          "description": "Maximum runtime for agent execution.",
          "required": false,
          "default": 120
        },
        {
          "name": "max_output_chars",
          "type": "int",
          "description": "Maximum serialized output chars before truncation.",
          "required": false,
          "default": 150000
        }
      ],
      "outputs": [
        {
          "name": "text",
          "type": "str"
        },
        {
          "name": "document",
          "type": "document"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/agents/documentagent",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/agents/documentagent.md"
    },
    {
      "type": "nodetool.agents.DocxAgent",
      "title": "DOCX Agent",
      "namespace": "nodetool.agents",
      "description": "Create Word (.docx) documents from a plain-language description.\n    agent, docx, word, document",
      "inputs": [
        {
          "name": "model",
          "type": "language_model",
          "description": "Model used for DOCX creation planning and execution.",
          "required": false,
          "default": {
            "type": "language_model",
            "provider": "empty",
            "id": "",
            "name": "",
            "path": null,
            "supported_tasks": []
          }
        },
        {
          "name": "prompt",
          "type": "str",
          "description": "Prompt describing what DOCX to create.",
          "required": false,
          "default": ""
        },
        {
          "name": "timeout_seconds",
          "type": "int",
          "description": "Maximum runtime for agent execution.",
          "required": false,
          "default": 300
        },
        {
          "name": "max_output_chars",
          "type": "int",
          "description": "Maximum serialized output chars before truncation.",
          "required": false,
          "default": 220000
        }
      ],
      "outputs": [
        {
          "name": "document",
          "type": "document"
        },
        {
          "name": "text",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/agents/docxagent",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/agents/docxagent.md"
    },
    {
      "type": "nodetool.agents.EmailAgent",
      "title": "Email Agent",
      "namespace": "nodetool.agents",
      "description": "Read, send, and process email over IMAP and SMTP from a prompt.\n    agent, email, imap, smtp, messaging",
      "inputs": [
        {
          "name": "model",
          "type": "language_model",
          "description": "Model used for task planning and execution reasoning.",
          "required": false,
          "default": {
            "type": "language_model",
            "provider": "empty",
            "id": "",
            "name": "",
            "path": null,
            "supported_tasks": []
          }
        },
        {
          "name": "prompt",
          "type": "str",
          "description": "Prompt describing the requested task.",
          "required": false,
          "default": ""
        },
        {
          "name": "timeout_seconds",
          "type": "int",
          "description": "Maximum runtime for agent execution.",
          "required": false,
          "default": 180
        },
        {
          "name": "max_output_chars",
          "type": "int",
          "description": "Maximum serialized output chars before truncation.",
          "required": false,
          "default": 200000
        }
      ],
      "outputs": [
        {
          "name": "text",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/agents/emailagent",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/agents/emailagent.md"
    },
    {
      "type": "nodetool.agents.EnhancePrompt",
      "title": "Enhance Prompt",
      "namespace": "nodetool.agents",
      "description": "Rewrite a rough draft into a clearer, more detailed prompt using an LLM, with streaming output.\n    text, prompt, prompt-engineering, llm, rewrite, streaming\n\n    Turn a short or vague idea into an effective prompt:\n    - Add specificity, structure, and missing detail\n    - Tune the result for the target model (text, image, video, audio, code)\n    - Preserve the original intent while removing ambiguity\n    - Stream the improved prompt as it is written",
      "inputs": [
        {
          "name": "system_prompt",
          "type": "str",
          "description": "The system prompt that guides how prompts are enhanced",
          "required": true
        },
        {
          "name": "model",
          "type": "language_model",
          "description": "Model to use for enhancing the prompt",
          "required": false,
          "default": {
            "type": "language_model",
            "provider": "empty",
            "id": "",
            "name": "",
            "path": null,
            "supported_tasks": []
          }
        },
        {
          "name": "prompt",
          "type": "str",
          "description": "The draft prompt to enhance",
          "required": false,
          "default": ""
        },
        {
          "name": "target",
          "type": "enum",
          "description": "What the enhanced prompt is for. Tailors the rewrite to the target model: general purpose, a text/LLM model, or an image, video, audio, or code generation model.",
          "required": false,
          "default": "general"
        }
      ],
      "outputs": [
        {
          "name": "text",
          "type": "str"
        },
        {
          "name": "chunk",
          "type": "chunk"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/agents/enhanceprompt",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/agents/enhanceprompt.md"
    },
    {
      "type": "nodetool.agents.Extractor",
      "title": "Extractor",
      "namespace": "nodetool.agents",
      "description": "Extract structured data from text content using LLM providers.\n    data-extraction, structured-data, nlp, parsing\n\n    Specialized for extracting structured information:\n    - Converting unstructured text into structured data\n    - Identifying and extracting specific fields from documents\n    - Parsing text according to predefined schemas\n    - Creating structured records from natural language content",
      "inputs": [
        {
          "name": "system_prompt",
          "type": "str",
          "description": "The system prompt for the data extractor",
          "required": false,
          "default": "\nYou are a precise structured data extractor.\n\nGoal\n- Extract exactly the fields described in <JSON_SCHEMA> from the content in <TEXT> (and any attached media).\n\nOutput format (MANDATORY)\n- Output exactly ONE fenced code block labeled json containing ONLY the JSON object:\n\n  ```json\n  { ...single JSON object matching <JSON_SCHEMA>... }\n  ```\n\n- No additional prose before or after the block.\n\nExtraction rules\n- Use only information found in <TEXT> or attached media. Do not invent facts.\n- Preserve source values; normalize internal whitespace and trim leading/trailing spaces.\n- If a required field is missing or not explicitly stated, return the closest reasonable default consistent with its type:\n  - string: \"\"\n  - number: 0\n  - boolean: false\n  - array/object: empty value of that type (only if allowed by the schema)\n- Dates/times: prefer ISO 8601 when the schema type is string and the value represents a date/time.\n- If multiple candidates exist, choose the most precise and unambiguous one.\n\nValidation\n- Ensure the final JSON validates against <JSON_SCHEMA> exactly.\n"
        },
        {
          "name": "model",
          "type": "language_model",
          "description": "Model to use for data extraction",
          "required": false,
          "default": {
            "type": "language_model",
            "provider": "empty",
            "id": "",
            "name": "",
            "path": null,
            "supported_tasks": []
          }
        },
        {
          "name": "text",
          "type": "str",
          "description": "The text to extract data from",
          "required": false,
          "default": ""
        },
        {
          "name": "image",
          "type": "image",
          "description": "Optional image to assist extraction",
          "required": false,
          "default": {
            "type": "image",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "audio",
          "type": "audio",
          "description": "Optional audio to assist extraction",
          "required": false,
          "default": {
            "type": "audio",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "max_tokens",
          "type": "int",
          "description": "The maximum number of tokens to generate.",
          "required": false,
          "default": 1024
        }
      ],
      "outputs": [],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/agents/extractor",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/agents/extractor.md"
    },
    {
      "type": "nodetool.agents.FfmpegAgent",
      "title": "FFmpeg Agent",
      "namespace": "nodetool.agents",
      "description": "Edit, convert, and package audio and video with FFmpeg from a prompt.\n    agent, ffmpeg, media, video, audio, convert",
      "inputs": [
        {
          "name": "model",
          "type": "language_model",
          "description": "Model used for media prompts.",
          "required": false,
          "default": {
            "type": "language_model",
            "provider": "empty",
            "id": "",
            "name": "",
            "path": null,
            "supported_tasks": []
          }
        },
        {
          "name": "audio",
          "type": "list[audio]",
          "description": "Optional audio inputs for media reasoning tasks. Accepts a list, or a single Audio (auto-wrapped).",
          "required": false,
          "default": []
        },
        {
          "name": "video",
          "type": "list[video]",
          "description": "Optional video inputs for media reasoning tasks. Accepts a list, or a single Video (auto-wrapped).",
          "required": false,
          "default": []
        },
        {
          "name": "prompt",
          "type": "str",
          "description": "Prompt for media task execution.",
          "required": false,
          "default": ""
        },
        {
          "name": "timeout_seconds",
          "type": "int",
          "description": "Maximum runtime for agent execution.",
          "required": false,
          "default": 180
        },
        {
          "name": "max_output_chars",
          "type": "int",
          "description": "Maximum serialized output chars before truncation.",
          "required": false,
          "default": 200000
        }
      ],
      "outputs": [
        {
          "name": "video",
          "type": "video"
        },
        {
          "name": "audio",
          "type": "audio"
        },
        {
          "name": "text",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/agents/ffmpegagent",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/agents/ffmpegagent.md"
    },
    {
      "type": "nodetool.agents.FilesystemAgent",
      "title": "Filesystem Agent",
      "namespace": "nodetool.agents",
      "description": "Inspect and transform files and folders in the workspace from a prompt.\n    agent, filesystem, files, folders, io",
      "inputs": [
        {
          "name": "model",
          "type": "language_model",
          "description": "Model used for task planning and execution reasoning.",
          "required": false,
          "default": {
            "type": "language_model",
            "provider": "empty",
            "id": "",
            "name": "",
            "path": null,
            "supported_tasks": []
          }
        },
        {
          "name": "prompt",
          "type": "str",
          "description": "Prompt describing the requested task.",
          "required": false,
          "default": ""
        },
        {
          "name": "timeout_seconds",
          "type": "int",
          "description": "Maximum runtime for agent execution.",
          "required": false,
          "default": 180
        },
        {
          "name": "max_output_chars",
          "type": "int",
          "description": "Maximum serialized output chars before truncation.",
          "required": false,
          "default": 200000
        }
      ],
      "outputs": [
        {
          "name": "text",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/agents/filesystemagent",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/agents/filesystemagent.md"
    },
    {
      "type": "nodetool.agents.GitAgent",
      "title": "Git Agent",
      "namespace": "nodetool.agents",
      "description": "Inspect a Git repository and manage changes from a prompt.\n    agent, git, repository, version-control",
      "inputs": [
        {
          "name": "model",
          "type": "language_model",
          "description": "Model used for task planning and execution reasoning.",
          "required": false,
          "default": {
            "type": "language_model",
            "provider": "empty",
            "id": "",
            "name": "",
            "path": null,
            "supported_tasks": []
          }
        },
        {
          "name": "prompt",
          "type": "str",
          "description": "Prompt describing the requested task.",
          "required": false,
          "default": ""
        },
        {
          "name": "timeout_seconds",
          "type": "int",
          "description": "Maximum runtime for agent execution.",
          "required": false,
          "default": 180
        },
        {
          "name": "max_output_chars",
          "type": "int",
          "description": "Maximum serialized output chars before truncation.",
          "required": false,
          "default": 200000
        }
      ],
      "outputs": [
        {
          "name": "text",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/agents/gitagent",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/agents/gitagent.md"
    },
    {
      "type": "nodetool.agents.HtmlAgent",
      "title": "HTML Agent",
      "namespace": "nodetool.agents",
      "description": "Build HTML pages and static sites from a plain-language description.\n    agent, html, web, template, static-site",
      "inputs": [
        {
          "name": "model",
          "type": "language_model",
          "description": "Model used for HTML generation planning/execution.",
          "required": false,
          "default": {
            "type": "language_model",
            "provider": "empty",
            "id": "",
            "name": "",
            "path": null,
            "supported_tasks": []
          }
        },
        {
          "name": "prompt",
          "type": "str",
          "description": "Prompt describing HTML to create.",
          "required": false,
          "default": ""
        },
        {
          "name": "timeout_seconds",
          "type": "int",
          "description": "Maximum runtime for agent execution.",
          "required": false,
          "default": 180
        },
        {
          "name": "max_output_chars",
          "type": "int",
          "description": "Maximum serialized output chars before truncation.",
          "required": false,
          "default": 180000
        }
      ],
      "outputs": [
        {
          "name": "html",
          "type": "html"
        },
        {
          "name": "text",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/agents/htmlagent",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/agents/htmlagent.md"
    },
    {
      "type": "nodetool.agents.HttpApiAgent",
      "title": "HTTP API Agent",
      "namespace": "nodetool.agents",
      "description": "Call REST and GraphQL APIs and handle the responses from a prompt.\n    agent, http, api, rest, graphql",
      "inputs": [
        {
          "name": "model",
          "type": "language_model",
          "description": "Model used for API planning and response interpretation.",
          "required": false,
          "default": {
            "type": "language_model",
            "provider": "empty",
            "id": "",
            "name": "",
            "path": null,
            "supported_tasks": []
          }
        },
        {
          "name": "prompt",
          "type": "str",
          "description": "Prompt describing the HTTP API task.",
          "required": false,
          "default": ""
        },
        {
          "name": "timeout_seconds",
          "type": "int",
          "description": "Maximum runtime for agent execution.",
          "required": false,
          "default": 180
        },
        {
          "name": "max_output_chars",
          "type": "int",
          "description": "Maximum serialized output chars before truncation.",
          "required": false,
          "default": 200000
        }
      ],
      "outputs": [
        {
          "name": "text",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/agents/httpapiagent",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/agents/httpapiagent.md"
    },
    {
      "type": "nodetool.agents.ImageAgent",
      "title": "Image Agent",
      "namespace": "nodetool.agents",
      "description": "Analyze and transform images with a vision model from a prompt.\n    agent, image, vision, transform, analysis",
      "inputs": [
        {
          "name": "model",
          "type": "language_model",
          "description": "Model used for image prompts.",
          "required": false,
          "default": {
            "type": "language_model",
            "provider": "empty",
            "id": "",
            "name": "",
            "path": null,
            "supported_tasks": []
          }
        },
        {
          "name": "image",
          "type": "list[image]",
          "description": "Optional image inputs for image reasoning tasks. Accepts a list, or a single Image (auto-wrapped).",
          "required": false,
          "default": []
        },
        {
          "name": "prompt",
          "type": "str",
          "description": "Prompt describing the image task.",
          "required": false,
          "default": ""
        },
        {
          "name": "timeout_seconds",
          "type": "int",
          "description": "Maximum runtime for agent execution.",
          "required": false,
          "default": 90
        },
        {
          "name": "max_output_chars",
          "type": "int",
          "description": "Maximum serialized output chars before truncation.",
          "required": false,
          "default": 120000
        }
      ],
      "outputs": [
        {
          "name": "image",
          "type": "image"
        },
        {
          "name": "text",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/agents/imageagent",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/agents/imageagent.md"
    },
    {
      "type": "nodetool.agents.LiveBrowserAgent",
      "title": "Live Browser Agent",
      "namespace": "nodetool.agents",
      "description": "Control your own logged-in Chrome through the Nodetool browser extension.\n    agent, browser, live, automation, extension, media\n\n    Use cases:\n    - Automate media-generation websites\n    - Save generated images and videos as assets\n    - Upload your assets into other sites",
      "inputs": [
        {
          "name": "model",
          "type": "language_model",
          "description": "Model used to plan and drive the live browser session.",
          "required": false,
          "default": {
            "type": "language_model",
            "provider": "empty",
            "id": "",
            "name": "",
            "path": null,
            "supported_tasks": []
          }
        },
        {
          "name": "prompt",
          "type": "str",
          "description": "What to do in the live browser (natural language).",
          "required": false,
          "default": ""
        },
        {
          "name": "timeout_seconds",
          "type": "int",
          "description": "Maximum runtime for the agent session.",
          "required": false,
          "default": 300
        }
      ],
      "outputs": [
        {
          "name": "text",
          "type": "str"
        },
        {
          "name": "chunk",
          "type": "chunk"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/agents/livebrowseragent",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/agents/livebrowseragent.md"
    },
    {
      "type": "nodetool.agents.MediaAgent",
      "title": "Media Agent",
      "namespace": "nodetool.agents",
      "description": "Analyze audio and video with a model from a prompt.\n    agent, media, audio, video, analysis",
      "inputs": [
        {
          "name": "model",
          "type": "language_model",
          "description": "Model used for media prompts.",
          "required": false,
          "default": {
            "type": "language_model",
            "provider": "empty",
            "id": "",
            "name": "",
            "path": null,
            "supported_tasks": []
          }
        },
        {
          "name": "audio",
          "type": "list[audio]",
          "description": "Optional audio inputs for media reasoning tasks. Accepts a list, or a single Audio (auto-wrapped).",
          "required": false,
          "default": []
        },
        {
          "name": "video",
          "type": "list[video]",
          "description": "Optional video inputs for media reasoning tasks. Accepts a list, or a single Video (auto-wrapped).",
          "required": false,
          "default": []
        },
        {
          "name": "prompt",
          "type": "str",
          "description": "Prompt for media task execution.",
          "required": false,
          "default": ""
        },
        {
          "name": "timeout_seconds",
          "type": "int",
          "description": "Maximum runtime for agent execution.",
          "required": false,
          "default": 180
        },
        {
          "name": "max_output_chars",
          "type": "int",
          "description": "Maximum serialized output chars before truncation.",
          "required": false,
          "default": 200000
        }
      ],
      "outputs": [
        {
          "name": "video",
          "type": "video"
        },
        {
          "name": "audio",
          "type": "audio"
        },
        {
          "name": "text",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/agents/mediaagent",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/agents/mediaagent.md"
    },
    {
      "type": "nodetool.agents.PdfLibAgent",
      "title": "PDF-lib Agent",
      "namespace": "nodetool.agents",
      "description": "Create and edit PDF files from a plain-language description.\n    agent, pdf, document, edit",
      "inputs": [
        {
          "name": "model",
          "type": "language_model",
          "description": "Model used for PDF task planning and execution reasoning.",
          "required": false,
          "default": {
            "type": "language_model",
            "provider": "empty",
            "id": "",
            "name": "",
            "path": null,
            "supported_tasks": []
          }
        },
        {
          "name": "document",
          "type": "document",
          "description": "Optional PDF/document input for transformation or analysis.",
          "required": false,
          "default": {
            "type": "document",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "prompt",
          "type": "str",
          "description": "Prompt describing the PDF processing task.",
          "required": false,
          "default": ""
        },
        {
          "name": "timeout_seconds",
          "type": "int",
          "description": "Maximum runtime for agent execution.",
          "required": false,
          "default": 300
        },
        {
          "name": "max_output_chars",
          "type": "int",
          "description": "Maximum serialized output chars before truncation.",
          "required": false,
          "default": 220000
        }
      ],
      "outputs": [
        {
          "name": "document",
          "type": "document"
        },
        {
          "name": "text",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/agents/pdflibagent",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/agents/pdflibagent.md"
    },
    {
      "type": "nodetool.agents.PptxAgent",
      "title": "PPTX Agent",
      "namespace": "nodetool.agents",
      "description": "Generate PowerPoint (.pptx) slide decks from a plain-language description.\n    agent, pptx, powerpoint, slides",
      "inputs": [
        {
          "name": "model",
          "type": "language_model",
          "description": "Model used for PPTX planning and generation reasoning.",
          "required": false,
          "default": {
            "type": "language_model",
            "provider": "empty",
            "id": "",
            "name": "",
            "path": null,
            "supported_tasks": []
          }
        },
        {
          "name": "document",
          "type": "document",
          "description": "Optional source PPTX/document input.",
          "required": false,
          "default": {
            "type": "document",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "prompt",
          "type": "str",
          "description": "Prompt describing PPTX task.",
          "required": false,
          "default": ""
        },
        {
          "name": "timeout_seconds",
          "type": "int",
          "description": "Maximum runtime for agent execution.",
          "required": false,
          "default": 300
        },
        {
          "name": "max_output_chars",
          "type": "int",
          "description": "Maximum serialized output chars before truncation.",
          "required": false,
          "default": 220000
        }
      ],
      "outputs": [
        {
          "name": "document",
          "type": "document"
        },
        {
          "name": "text",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/agents/pptxagent",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/agents/pptxagent.md"
    },
    {
      "type": "nodetool.agents.ShellAgent",
      "title": "Shell Agent",
      "namespace": "nodetool.agents",
      "description": "Run shell commands to carry out a task you describe in plain language.\n    agent, shell, bash, terminal, automation",
      "inputs": [
        {
          "name": "model",
          "type": "language_model",
          "description": "Model used for task planning and execution reasoning.",
          "required": false,
          "default": {
            "type": "language_model",
            "provider": "empty",
            "id": "",
            "name": "",
            "path": null,
            "supported_tasks": []
          }
        },
        {
          "name": "prompt",
          "type": "str",
          "description": "Prompt describing the requested task.",
          "required": false,
          "default": ""
        },
        {
          "name": "timeout_seconds",
          "type": "int",
          "description": "Maximum runtime for agent execution.",
          "required": false,
          "default": 180
        },
        {
          "name": "max_output_chars",
          "type": "int",
          "description": "Maximum serialized output chars before truncation.",
          "required": false,
          "default": 200000
        }
      ],
      "outputs": [
        {
          "name": "text",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/agents/shellagent",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/agents/shellagent.md"
    },
    {
      "type": "nodetool.agents.SpreadsheetAgent",
      "title": "Spreadsheet Agent",
      "namespace": "nodetool.agents",
      "description": "Process and analyze CSV and Excel spreadsheets from a prompt.\n    agent, spreadsheet, csv, xlsx, tabular",
      "inputs": [
        {
          "name": "model",
          "type": "language_model",
          "description": "Model used for task planning and execution reasoning.",
          "required": false,
          "default": {
            "type": "language_model",
            "provider": "empty",
            "id": "",
            "name": "",
            "path": null,
            "supported_tasks": []
          }
        },
        {
          "name": "prompt",
          "type": "str",
          "description": "Prompt describing the requested task.",
          "required": false,
          "default": ""
        },
        {
          "name": "timeout_seconds",
          "type": "int",
          "description": "Maximum runtime for agent execution.",
          "required": false,
          "default": 180
        },
        {
          "name": "max_output_chars",
          "type": "int",
          "description": "Maximum serialized output chars before truncation.",
          "required": false,
          "default": 200000
        }
      ],
      "outputs": [
        {
          "name": "text",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/agents/spreadsheetagent",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/agents/spreadsheetagent.md"
    },
    {
      "type": "nodetool.agents.SQLiteAgent",
      "title": "SQLite Agent",
      "namespace": "nodetool.agents",
      "description": "Query and analyze a SQLite database using plain-language requests.\n    agent, database, sqlite, sql, query",
      "inputs": [
        {
          "name": "model",
          "type": "language_model",
          "description": "Model used for optional agent reasoning over query results.",
          "required": false,
          "default": {
            "type": "language_model",
            "provider": "empty",
            "id": "",
            "name": "",
            "path": null,
            "supported_tasks": []
          }
        },
        {
          "name": "prompt",
          "type": "str",
          "description": "Prompt for data query/transform task.",
          "required": false,
          "default": ""
        },
        {
          "name": "timeout_seconds",
          "type": "int",
          "description": "Maximum runtime for agent execution.",
          "required": false,
          "default": 120
        },
        {
          "name": "max_output_chars",
          "type": "int",
          "description": "Maximum serialized output chars before truncation.",
          "required": false,
          "default": 200000
        },
        {
          "name": "db_path",
          "type": "str",
          "description": "Path to SQLite database relative to workspace.",
          "required": false,
          "default": "memory.db"
        },
        {
          "name": "allow_mutation",
          "type": "bool",
          "description": "Allow INSERT/UPDATE/DELETE/DDL statements when enabled.",
          "required": false,
          "default": false
        }
      ],
      "outputs": [
        {
          "name": "text",
          "type": "str"
        },
        {
          "name": "json",
          "type": "dict[str, any]"
        },
        {
          "name": "dataframe",
          "type": "dataframe"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/agents/sqliteagent",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/agents/sqliteagent.md"
    },
    {
      "type": "nodetool.agents.Summarizer",
      "title": "Summarizer",
      "namespace": "nodetool.agents",
      "description": "Generate concise summaries of text content using LLM providers with streaming output.\n    text, summarization, nlp, content, streaming\n\n    Specialized for creating high-quality summaries with real-time streaming:\n    - Condensing long documents into key points\n    - Creating executive summaries with live output\n    - Extracting main ideas from text as they're generated\n    - Maintaining factual accuracy while reducing length",
      "inputs": [
        {
          "name": "system_prompt",
          "type": "str",
          "description": "The system prompt for the summarizer",
          "required": false,
          "default": "\n        You are an expert summarizer. Your task is to create clear, accurate, and concise summaries using Markdown for structuring.\n        Follow these guidelines:\n        1. Identify and include only the most important information.\n        2. Maintain factual accuracy - do not add or modify information.\n        3. Use clear, direct language.\n        4. Keep the summary brief and to the point.\n        "
        },
        {
          "name": "model",
          "type": "language_model",
          "description": "Model to use for summarization",
          "required": false,
          "default": {
            "type": "language_model",
            "provider": "empty",
            "id": "",
            "name": "",
            "path": null,
            "supported_tasks": []
          }
        },
        {
          "name": "text",
          "type": "str",
          "description": "The text to summarize",
          "required": false,
          "default": ""
        },
        {
          "name": "image",
          "type": "image",
          "description": "Optional image to condition the summary",
          "required": false,
          "default": {
            "type": "image",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "audio",
          "type": "audio",
          "description": "Optional audio to condition the summary",
          "required": false,
          "default": {
            "type": "audio",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "max_sentences",
          "type": "int",
          "description": "Approximate number of sentences for the summary.",
          "required": false,
          "default": 3
        }
      ],
      "outputs": [
        {
          "name": "text",
          "type": "str"
        },
        {
          "name": "chunk",
          "type": "chunk"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/agents/summarizer",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/agents/summarizer.md"
    },
    {
      "type": "nodetool.agents.SupabaseAgent",
      "title": "Supabase Agent",
      "namespace": "nodetool.agents",
      "description": "Query a Supabase database with plain-language requests (read-only SELECT).\n    agent, database, supabase, sql, query",
      "inputs": [
        {
          "name": "model",
          "type": "language_model",
          "description": "Model used for optional agent reasoning over query results.",
          "required": false,
          "default": {
            "type": "language_model",
            "provider": "empty",
            "id": "",
            "name": "",
            "path": null,
            "supported_tasks": []
          }
        },
        {
          "name": "prompt",
          "type": "str",
          "description": "Prompt for data query/transform task.",
          "required": false,
          "default": ""
        },
        {
          "name": "timeout_seconds",
          "type": "int",
          "description": "Maximum runtime for agent execution.",
          "required": false,
          "default": 120
        },
        {
          "name": "max_output_chars",
          "type": "int",
          "description": "Maximum serialized output chars before truncation.",
          "required": false,
          "default": 200000
        }
      ],
      "outputs": [
        {
          "name": "text",
          "type": "str"
        },
        {
          "name": "json",
          "type": "dict[str, any]"
        },
        {
          "name": "dataframe",
          "type": "dataframe"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/agents/supabaseagent",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/agents/supabaseagent.md"
    },
    {
      "type": "nodetool.agents.VectorStoreAgent",
      "title": "Vector Store Agent",
      "namespace": "nodetool.agents",
      "description": "Index documents and run similarity search for RAG from a prompt.\n    agent, vectorstore, embeddings, rag, retrieval",
      "inputs": [
        {
          "name": "model",
          "type": "language_model",
          "description": "Model used for task planning and execution reasoning.",
          "required": false,
          "default": {
            "type": "language_model",
            "provider": "empty",
            "id": "",
            "name": "",
            "path": null,
            "supported_tasks": []
          }
        },
        {
          "name": "prompt",
          "type": "str",
          "description": "Prompt describing the requested task.",
          "required": false,
          "default": ""
        },
        {
          "name": "timeout_seconds",
          "type": "int",
          "description": "Maximum runtime for agent execution.",
          "required": false,
          "default": 180
        },
        {
          "name": "max_output_chars",
          "type": "int",
          "description": "Maximum serialized output chars before truncation.",
          "required": false,
          "default": 200000
        }
      ],
      "outputs": [
        {
          "name": "text",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/agents/vectorstoreagent",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/agents/vectorstoreagent.md"
    },
    {
      "type": "nodetool.agents.YtDlpDownloaderAgent",
      "title": "yt-dlp Downloader Agent",
      "namespace": "nodetool.agents",
      "description": "Download videos from YouTube, Bilibili, Twitter, and other sites.\n    agent, media, yt-dlp, downloader, youtube, video",
      "inputs": [
        {
          "name": "model",
          "type": "language_model",
          "description": "Model used for yt-dlp planning and execution reasoning.",
          "required": false,
          "default": {
            "type": "language_model",
            "provider": "empty",
            "id": "",
            "name": "",
            "path": null,
            "supported_tasks": []
          }
        },
        {
          "name": "prompt",
          "type": "str",
          "description": "Prompt describing what to download.",
          "required": false,
          "default": ""
        },
        {
          "name": "url",
          "type": "str",
          "description": "Optional explicit video URL to download.",
          "required": false,
          "default": ""
        },
        {
          "name": "output_dir",
          "type": "str",
          "description": "Workspace-relative output directory for downloads.",
          "required": false,
          "default": "downloads/yt-dlp"
        },
        {
          "name": "timeout_seconds",
          "type": "int",
          "description": "Maximum runtime for agent execution.",
          "required": false,
          "default": 300
        },
        {
          "name": "max_output_chars",
          "type": "int",
          "description": "Maximum serialized output chars before truncation.",
          "required": false,
          "default": 220000
        }
      ],
      "outputs": [
        {
          "name": "video",
          "type": "video"
        },
        {
          "name": "text",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/agents/ytdlpdownloaderagent",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/agents/ytdlpdownloaderagent.md"
    },
    {
      "type": "nodetool.audio.AudioMixer",
      "title": "Audio Mixer",
      "namespace": "nodetool.audio",
      "description": "Mix multiple audio tracks together. Add tracks dynamically with the “add audio input” button; wire a Gain node upstream of any track that needs a different level.\n    audio, mix, combine, blend, layer, add, overlay",
      "inputs": [],
      "outputs": [
        {
          "name": "output",
          "type": "audio"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/audio/audiomixer",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/audio/audiomixer.md"
    },
    {
      "type": "nodetool.audio.ChunkToAudio",
      "title": "Chunk To Audio",
      "namespace": "nodetool.audio",
      "description": "Converts audio chunks from an input stream into AudioRef objects.\n    audio, stream, chunk, convert",
      "inputs": [
        {
          "name": "chunk",
          "type": "chunk",
          "description": "Stream of audio chunks",
          "required": false,
          "default": {
            "type": "chunk",
            "node_id": null,
            "thread_id": null,
            "workflow_id": null,
            "content_type": "text",
            "content": "",
            "content_metadata": {},
            "done": false,
            "thinking": false
          }
        }
      ],
      "outputs": [
        {
          "name": "audio",
          "type": "audio"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/audio/chunktoaudio",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/audio/chunktoaudio.md"
    },
    {
      "type": "nodetool.audio.Concat",
      "title": "Concatenate Audio",
      "namespace": "nodetool.audio",
      "description": "Concatenates audio files together. Add inputs dynamically with the “add audio input” button, or wire a list of audio into a single input.\n    audio, edit, join, +",
      "inputs": [],
      "outputs": [
        {
          "name": "output",
          "type": "audio"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/audio/concatenateaudio",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/audio/concatenateaudio.md"
    },
    {
      "type": "nodetool.audio.ConcatList",
      "title": "Concatenate Audio List",
      "namespace": "nodetool.audio",
      "description": "Concatenates multiple audio files together in sequence.\n    audio, edit, join, multiple, +",
      "inputs": [
        {
          "name": "audio_files",
          "type": "list[audio]",
          "description": "List of audio files to concatenate in sequence.",
          "required": false,
          "default": []
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "audio"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/audio/concatenateaudiolist",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/audio/concatenateaudiolist.md"
    },
    {
      "type": "nodetool.audio.CreateSilence",
      "title": "Create Silence",
      "namespace": "nodetool.audio",
      "description": "Creates a silent audio file with a specified duration.\n    audio, silence, empty",
      "inputs": [
        {
          "name": "duration",
          "type": "float",
          "description": "The duration of the silence in seconds.",
          "required": false,
          "default": 1
        },
        {
          "name": "sample_rate",
          "type": "int",
          "description": "Sample rate of the generated silence in Hz.",
          "required": false,
          "default": 44100
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "audio"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/audio/createsilence",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/audio/createsilence.md"
    },
    {
      "type": "nodetool.audio.FadeIn",
      "title": "Fade In",
      "namespace": "nodetool.audio",
      "description": "Applies a fade-in effect to the beginning of an audio file.\n    audio, edit, transition",
      "inputs": [
        {
          "name": "audio",
          "type": "audio",
          "description": "The audio file to apply fade-in to.",
          "required": false,
          "default": {
            "type": "audio",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "duration",
          "type": "float",
          "description": "Duration of the fade-in effect in seconds.",
          "required": false,
          "default": 1
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "audio"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/audio/fadein",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/audio/fadein.md"
    },
    {
      "type": "nodetool.audio.FadeOut",
      "title": "Fade Out",
      "namespace": "nodetool.audio",
      "description": "Applies a fade-out effect to the end of an audio file.\n    audio, edit, transition",
      "inputs": [
        {
          "name": "audio",
          "type": "audio",
          "description": "The audio file to apply fade-out to.",
          "required": false,
          "default": {
            "type": "audio",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "duration",
          "type": "float",
          "description": "Duration of the fade-out effect in seconds.",
          "required": false,
          "default": 1
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "audio"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/audio/fadeout",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/audio/fadeout.md"
    },
    {
      "type": "nodetool.audio.GetAudioInfo",
      "title": "Get Audio Info",
      "namespace": "nodetool.audio",
      "description": "Extract metadata from an audio file: duration, sample rate, channels, format.\n    audio, info, metadata, duration, sample_rate, channels, format",
      "inputs": [
        {
          "name": "audio",
          "type": "audio",
          "description": "The audio to inspect.",
          "required": false,
          "default": {
            "type": "audio",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        }
      ],
      "outputs": [
        {
          "name": "duration",
          "type": "float"
        },
        {
          "name": "sample_rate",
          "type": "int"
        },
        {
          "name": "channels",
          "type": "int"
        },
        {
          "name": "format",
          "type": "str"
        },
        {
          "name": "size_bytes",
          "type": "int"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/audio/getaudioinfo",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/audio/getaudioinfo.md"
    },
    {
      "type": "nodetool.audio.LoadAudioAssets",
      "title": "Load Audio Assets",
      "namespace": "nodetool.audio",
      "description": "Load audio files from an asset folder.\n    load, audio, file, import",
      "inputs": [
        {
          "name": "folder",
          "type": "folder",
          "description": "The asset folder to load the audio files from.",
          "required": false,
          "default": {
            "type": "folder",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        }
      ],
      "outputs": [
        {
          "name": "audio",
          "type": "audio"
        },
        {
          "name": "name",
          "type": "str"
        },
        {
          "name": "audios",
          "type": "list"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/audio/loadaudioassets",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/audio/loadaudioassets.md"
    },
    {
      "type": "nodetool.audio.LoadAudioFile",
      "title": "Load Audio File",
      "namespace": "nodetool.audio",
      "description": "Read an audio file from disk.\n    audio, input, load, file",
      "inputs": [
        {
          "name": "path",
          "type": "str",
          "description": "Path to the audio file to read",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "audio"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/audio/loadaudiofile",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/audio/loadaudiofile.md"
    },
    {
      "type": "nodetool.audio.LoadAudioFolder",
      "title": "Load Audio Folder",
      "namespace": "nodetool.audio",
      "description": "Load all audio files from a folder, optionally including subfolders.\n    audio, load, folder, files",
      "inputs": [
        {
          "name": "folder",
          "type": "str",
          "description": "Folder to scan for audio files",
          "required": false,
          "default": ""
        },
        {
          "name": "include_subdirectories",
          "type": "bool",
          "description": "Include audio in subfolders",
          "required": false,
          "default": false
        },
        {
          "name": "extensions",
          "type": "list[str]",
          "description": "Audio file extensions to include",
          "required": false,
          "default": [
            ".mp3",
            ".wav",
            ".flac",
            ".ogg",
            ".m4a",
            ".aac"
          ]
        }
      ],
      "outputs": [
        {
          "name": "audio",
          "type": "audio"
        },
        {
          "name": "path",
          "type": "str"
        },
        {
          "name": "audios",
          "type": "list"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/audio/loadaudiofolder",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/audio/loadaudiofolder.md"
    },
    {
      "type": "nodetool.audio.MonoToStereo",
      "title": "Mono To Stereo",
      "namespace": "nodetool.audio",
      "description": "Converts a mono audio signal to stereo.\n    audio, convert, channels",
      "inputs": [
        {
          "name": "audio",
          "type": "audio",
          "description": "The mono audio file to convert.",
          "required": false,
          "default": {
            "type": "audio",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "audio"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/audio/monotostereo",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/audio/monotostereo.md"
    },
    {
      "type": "nodetool.audio.Normalize",
      "title": "Normalize",
      "namespace": "nodetool.audio",
      "description": "Normalizes the volume of an audio file.\n    audio, fix, dynamics, volume",
      "inputs": [
        {
          "name": "audio",
          "type": "audio",
          "description": "The audio file to normalize.",
          "required": false,
          "default": {
            "type": "audio",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "audio"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/audio/normalize",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/audio/normalize.md"
    },
    {
      "type": "nodetool.audio.OverlayAudio",
      "title": "Overlay Audio",
      "namespace": "nodetool.audio",
      "description": "Overlays two audio files together.\n    audio, edit, transform",
      "inputs": [
        {
          "name": "a",
          "type": "audio",
          "description": "The first audio file.",
          "required": false,
          "default": {
            "type": "audio",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "b",
          "type": "audio",
          "description": "The second audio file.",
          "required": false,
          "default": {
            "type": "audio",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "audio"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/audio/overlayaudio",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/audio/overlayaudio.md"
    },
    {
      "type": "nodetool.audio.realtime.AudioOutput",
      "title": "Audio Out",
      "namespace": "nodetool.audio.realtime",
      "description": "Plays a realtime audio chunk stream — the patch's speaker.\n    audio, stream, chunk, realtime, output, speaker, monitor\n\n    Passes every chunk through verbatim; the editor picks the chunks up from the live stream and plays them as they arrive. Terminate any synth patch or streaming effect chain here to hear it.\n\n    Use cases:\n    - Monitor a live modular synth patch\n    - Hear streaming TTS or effects output as it renders\n    - Audition a chain before recording it with ChunksToAudio",
      "inputs": [
        {
          "name": "chunk",
          "type": "chunk",
          "description": "Stream of PCM16LE audio chunks to play.",
          "required": true
        }
      ],
      "outputs": [
        {
          "name": "chunk",
          "type": "chunk"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/audio/realtime/audioout",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/audio/realtime/audioout.md"
    },
    {
      "type": "nodetool.audio.realtime.AudioToChunks",
      "title": "Audio To Chunks",
      "namespace": "nodetool.audio.realtime",
      "description": "Slices an audio file into a stream of fixed-duration PCM16 chunks.\n    audio, stream, chunk, realtime\n\n    Use cases:\n    - Feed batch audio into realtime/streaming nodes\n    - Simulate a live audio feed from a recording\n    - Drive streaming effects and transcription nodes",
      "inputs": [
        {
          "name": "audio",
          "type": "audio",
          "description": "The audio file to slice into chunks (must be WAV).",
          "required": false,
          "default": {
            "type": "audio",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "chunk_duration",
          "type": "float",
          "description": "Duration of each emitted chunk in seconds.",
          "required": false,
          "default": 0.25
        }
      ],
      "outputs": [
        {
          "name": "chunk",
          "type": "chunk"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/audio/realtime/audiotochunks",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/audio/realtime/audiotochunks.md"
    },
    {
      "type": "nodetool.audio.realtime.ChunksToAudio",
      "title": "Chunks To Audio",
      "namespace": "nodetool.audio.realtime",
      "description": "Accumulates a stream of PCM16 audio chunks into a single audio file.\n    audio, stream, chunk, realtime, accumulate\n\n    Use cases:\n    - Capture the output of streaming TTS or effects as a file\n    - Terminate a realtime audio chain with a playable result\n    - Record a processed live feed",
      "inputs": [
        {
          "name": "chunk",
          "type": "chunk",
          "description": "Stream of PCM16LE audio chunks to accumulate.",
          "required": true
        }
      ],
      "outputs": [
        {
          "name": "audio",
          "type": "audio"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/audio/realtime/chunkstoaudio",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/audio/realtime/chunkstoaudio.md"
    },
    {
      "type": "nodetool.audio.realtime.StreamingGain",
      "title": "Streaming Gain",
      "namespace": "nodetool.audio.realtime",
      "description": "Applies a gain (volume adjustment) to each chunk of a realtime audio stream.\n    audio, stream, chunk, realtime, effect, volume\n\n    Use cases:\n    - Adjust the level of a live audio feed\n    - Balance streaming sources before mixing\n    - Attenuate or boost streaming TTS output",
      "inputs": [
        {
          "name": "chunk",
          "type": "chunk",
          "description": "Stream of PCM16LE audio chunks to process.",
          "required": true
        },
        {
          "name": "gain_db",
          "type": "float",
          "description": "Gain to apply in decibels. Positive values increase volume, negative values decrease it.",
          "required": false,
          "default": 0
        }
      ],
      "outputs": [
        {
          "name": "chunk",
          "type": "chunk"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/audio/realtime/streaminggain",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/audio/realtime/streaminggain.md"
    },
    {
      "type": "nodetool.audio.realtime.StreamingHighPass",
      "title": "Streaming High Pass",
      "namespace": "nodetool.audio.realtime",
      "description": "Applies a high-pass filter to a realtime audio stream, keeping filter state across chunks.\n    audio, stream, chunk, realtime, effect, equalizer\n\n    Use cases:\n    - Remove rumble from a live microphone feed\n    - Clean up the low end of streaming audio\n    - Thin out streaming sources before mixing",
      "inputs": [
        {
          "name": "chunk",
          "type": "chunk",
          "description": "Stream of PCM16LE audio chunks to process.",
          "required": true
        },
        {
          "name": "cutoff_frequency_hz",
          "type": "float",
          "description": "The cutoff frequency of the high-pass filter in Hz.",
          "required": false,
          "default": 80
        },
        {
          "name": "q",
          "type": "float",
          "description": "Filter resonance (quality factor).",
          "required": true
        }
      ],
      "outputs": [
        {
          "name": "chunk",
          "type": "chunk"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/audio/realtime/streaminghighpass",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/audio/realtime/streaminghighpass.md"
    },
    {
      "type": "nodetool.audio.realtime.StreamingLowPass",
      "title": "Streaming Low Pass",
      "namespace": "nodetool.audio.realtime",
      "description": "Applies a low-pass filter to a realtime audio stream, keeping filter state across chunks.\n    audio, stream, chunk, realtime, effect, equalizer\n\n    Use cases:\n    - Soften a live audio feed\n    - Remove high-frequency noise from streaming audio\n    - Create realtime dub-style effects",
      "inputs": [
        {
          "name": "chunk",
          "type": "chunk",
          "description": "Stream of PCM16LE audio chunks to process.",
          "required": true
        },
        {
          "name": "cutoff_frequency_hz",
          "type": "float",
          "description": "The cutoff frequency of the low-pass filter in Hz.",
          "required": false,
          "default": 5000
        },
        {
          "name": "q",
          "type": "float",
          "description": "Filter resonance (quality factor).",
          "required": true
        }
      ],
      "outputs": [
        {
          "name": "chunk",
          "type": "chunk"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/audio/realtime/streaminglowpass",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/audio/realtime/streaminglowpass.md"
    },
    {
      "type": "nodetool.audio.RemoveSilence",
      "title": "Remove Silence",
      "namespace": "nodetool.audio",
      "description": "Removes or shortens silence in an audio file with smooth transitions.\n    audio, edit, clean",
      "inputs": [
        {
          "name": "audio",
          "type": "audio",
          "description": "The audio file to process.",
          "required": false,
          "default": {
            "type": "audio",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "min_length",
          "type": "int",
          "description": "Minimum length of silence to be processed (in milliseconds).",
          "required": false,
          "default": 200
        },
        {
          "name": "threshold",
          "type": "int",
          "description": "Silence threshold in dB (relative to full scale). Higher values detect more silence.",
          "required": false,
          "default": -40
        },
        {
          "name": "reduction_factor",
          "type": "float",
          "description": "Factor to reduce silent parts (0.0 to 1.0). 0.0 keeps silence as is, 1.0 removes it completely.",
          "required": false,
          "default": 1
        },
        {
          "name": "crossfade",
          "type": "int",
          "description": "Duration of crossfade in milliseconds to apply between segments for smooth transitions.",
          "required": false,
          "default": 10
        },
        {
          "name": "min_silence_between_parts",
          "type": "int",
          "description": "Minimum silence duration in milliseconds to maintain between non-silent segments",
          "required": false,
          "default": 100
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "audio"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/audio/removesilence",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/audio/removesilence.md"
    },
    {
      "type": "nodetool.audio.Repeat",
      "title": "Repeat",
      "namespace": "nodetool.audio",
      "description": "Loops an audio file a specified number of times.\n    audio, edit, repeat",
      "inputs": [
        {
          "name": "audio",
          "type": "audio",
          "description": "The audio file to loop.",
          "required": false,
          "default": {
            "type": "audio",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "loops",
          "type": "int",
          "description": "Number of times to loop the audio. Minimum 1 (plays once), maximum 100.",
          "required": false,
          "default": 2
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "audio"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/audio/repeat",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/audio/repeat.md"
    },
    {
      "type": "nodetool.audio.Reverse",
      "title": "Reverse",
      "namespace": "nodetool.audio",
      "description": "Reverses an audio file.\n    audio, edit, transform",
      "inputs": [
        {
          "name": "audio",
          "type": "audio",
          "description": "The audio file to reverse.",
          "required": false,
          "default": {
            "type": "audio",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "audio"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/audio/reverse",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/audio/reverse.md"
    },
    {
      "type": "nodetool.audio.SaveAudio",
      "title": "Save Audio Asset",
      "namespace": "nodetool.audio",
      "description": "Save an audio file to a specified asset folder.\n    audio, folder, name",
      "inputs": [
        {
          "name": "audio",
          "type": "audio",
          "description": "",
          "required": false,
          "default": {
            "type": "audio",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "folder",
          "type": "folder",
          "description": "The asset folder to save the audio file to. ",
          "required": false,
          "default": {
            "type": "folder",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "name",
          "type": "str",
          "description": "\n        The name of the audio file.\n        You can use time and date variables to create unique names:\n        %Y - Year\n        %m - Month\n        %d - Day\n        %H - Hour\n        %M - Minute\n        %S - Second\n        ",
          "required": false,
          "default": "%Y-%m-%d-%H-%M-%S.wav"
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "audio"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/audio/saveaudioasset",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/audio/saveaudioasset.md"
    },
    {
      "type": "nodetool.audio.SaveAudioFile",
      "title": "Save Audio File",
      "namespace": "nodetool.audio",
      "description": "Write an audio file to disk.\n    audio, output, save, file\n\n    The filename can include time and date variables:\n    %Y - Year, %m - Month, %d - Day\n    %H - Hour, %M - Minute, %S - Second\n\n    Supported formats: mp3, wav, ogg, flac, aac, m4a",
      "inputs": [
        {
          "name": "audio",
          "type": "audio",
          "description": "The audio to save",
          "required": false,
          "default": {
            "type": "audio",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "folder",
          "type": "str",
          "description": "Folder where the file will be saved",
          "required": false,
          "default": ""
        },
        {
          "name": "filename",
          "type": "str",
          "description": "\n        Name of the file to save.\n        You can use time and date variables to create unique names:\n        %Y - Year\n        %m - Month\n        %d - Day\n        %H - Hour\n        %M - Minute\n        %S - Second\n        ",
          "required": false,
          "default": ""
        },
        {
          "name": "FORMAT_MAP",
          "type": "dict[str, str]",
          "description": "",
          "required": false,
          "default": {
            ".mp3": "mp3",
            ".wav": "wav",
            ".ogg": "ogg",
            ".flac": "flac",
            ".aac": "adts",
            ".m4a": "ipod"
          }
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "audio"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/audio/saveaudiofile",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/audio/saveaudiofile.md"
    },
    {
      "type": "nodetool.audio.SliceAudio",
      "title": "Slice Audio",
      "namespace": "nodetool.audio",
      "description": "Extracts a section of an audio file.\n    audio, edit, trim",
      "inputs": [
        {
          "name": "audio",
          "type": "audio",
          "description": "The audio file.",
          "required": false,
          "default": {
            "type": "audio",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "start",
          "type": "float",
          "description": "The start time in seconds.",
          "required": false,
          "default": 0
        },
        {
          "name": "end",
          "type": "float",
          "description": "The end time in seconds. 0 or less slices to the end.",
          "required": false,
          "default": 1
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "audio"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/audio/sliceaudio",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/audio/sliceaudio.md"
    },
    {
      "type": "nodetool.audio.StereoToMono",
      "title": "Stereo To Mono",
      "namespace": "nodetool.audio",
      "description": "Converts a stereo audio signal to mono.\n    audio, convert, channels",
      "inputs": [
        {
          "name": "audio",
          "type": "audio",
          "description": "The stereo audio file to convert.",
          "required": false,
          "default": {
            "type": "audio",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "method",
          "type": "str",
          "description": "Method to use for conversion: 'average', 'left', or 'right'.",
          "required": false,
          "default": "average"
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "audio"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/audio/stereotomono",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/audio/stereotomono.md"
    },
    {
      "type": "nodetool.audio.synth.ADSR",
      "title": "ADSR",
      "namespace": "nodetool.audio.synth",
      "description": "ADSR envelope generator driven by a gate CV stream.\n    cv, synthesis, envelope, adsr, modular\n\n    Gate edges (threshold 0.5) are detected at exact sample offsets inside chunks; attack/decay/release run as exponential one-pole segments counted in samples, so timing is sample-accurate without any clock. Emits one envelope chunk per gate chunk (same frame count). Retriggering mid-release continues from the current level.\n\n    Use cases:\n    - Amplitude envelope via VCA cv\n    - Filter envelope via VCF cutoff_cv\n    - Click-free gating of any signal",
      "inputs": [
        {
          "name": "gate",
          "type": "cv",
          "description": "Gate CV stream — values ≥ 0.5 count as gate-high.",
          "required": true
        },
        {
          "name": "attack",
          "type": "float",
          "description": "Attack time in seconds.",
          "required": false,
          "default": 0.01
        },
        {
          "name": "decay",
          "type": "float",
          "description": "Decay time in seconds.",
          "required": false,
          "default": 0.1
        },
        {
          "name": "sustain",
          "type": "float",
          "description": "Sustain level (0–1).",
          "required": false,
          "default": 0.7
        },
        {
          "name": "release",
          "type": "float",
          "description": "Release time in seconds.",
          "required": false,
          "default": 0.3
        }
      ],
      "outputs": [
        {
          "name": "cv",
          "type": "cv"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/audio/synth/adsr",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/audio/synth/adsr.md"
    },
    {
      "type": "nodetool.audio.synth.Attenuverter",
      "title": "Attenuverter",
      "namespace": "nodetool.audio.synth",
      "description": "Scales and offsets a CV (or audio) stream: out = in * scale + offset.\n    cv, synthesis, utility, attenuverter, modular\n\n    Negative scale inverts the signal. The Swiss-army CV utility — adapt an LFO's range to a pitch input, invert an envelope, add a constant bias.\n\n    Use cases:\n    - Reduce LFO depth before a pitch input\n    - Invert an envelope for ducking\n    - Add a DC offset to centre a modulation",
      "inputs": [
        {
          "name": "signal",
          "type": "cv",
          "description": "Input CV or audio stream.",
          "required": true
        },
        {
          "name": "scale",
          "type": "float",
          "description": "Multiplier; negative values invert.",
          "required": false,
          "default": 1
        },
        {
          "name": "offset",
          "type": "float",
          "description": "Constant added after scaling.",
          "required": false,
          "default": 0
        }
      ],
      "outputs": [
        {
          "name": "cv",
          "type": "cv"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/audio/synth/attenuverter",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/audio/synth/attenuverter.md"
    },
    {
      "type": "nodetool.audio.synth.Gate",
      "title": "Gate",
      "namespace": "nodetool.audio.synth",
      "description": "Generates a repeating on/off gate CV pattern — the patch's master clock.\n    cv, synthesis, gate, trigger, clock, modular\n\n    Emits `amplitude` for on_duration seconds, 0 for off_duration, cycling wall-clock paced until the run is stopped. Drive an ADSR with it; every node downstream is sample-aligned to it by construction and paced with it.\n\n    Use cases:\n    - Trigger envelopes rhythmically\n    - Master clock for clocked LFOs and sample & hold\n    - Heartbeat of a live patch",
      "inputs": [
        {
          "name": "on_duration",
          "type": "float",
          "description": "Gate-high time per cycle in seconds.",
          "required": false,
          "default": 0.25
        },
        {
          "name": "off_duration",
          "type": "float",
          "description": "Gate-low time per cycle in seconds.",
          "required": false,
          "default": 0.25
        },
        {
          "name": "amplitude",
          "type": "float",
          "description": "Gate-high output level.",
          "required": false,
          "default": 1
        },
        {
          "name": "sample_rate",
          "type": "int",
          "description": "Output sample rate in Hz.",
          "required": true
        }
      ],
      "outputs": [
        {
          "name": "cv",
          "type": "cv"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/audio/synth/gate",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/audio/synth/gate.md"
    },
    {
      "type": "nodetool.audio.synth.LFO",
      "title": "LFO",
      "namespace": "nodetool.audio.synth",
      "description": "Low-frequency oscillator emitting a control-voltage stream.\n    cv, synthesis, lfo, modulation, modular\n\n    Output is offset + depth * wave(phase). With a clock patched, emits one chunk per clock chunk (sample-aligned) and resets phase on each clock rising edge; otherwise free-runs wall-clock paced until the run is stopped.\n\n    Use cases:\n    - Vibrato/tremolo via Oscillator fm or VCA cv\n    - Filter sweeps via VCF cutoff_cv\n    - Slow parameter drift in generative patches",
      "inputs": [
        {
          "name": "clock",
          "type": "cv",
          "description": "Optional clock stream: drives chunk cadence; phase resets on each rising edge.",
          "required": true
        },
        {
          "name": "waveform",
          "type": "enum",
          "description": "LFO waveform.",
          "required": false,
          "default": "sine"
        },
        {
          "name": "rate_hz",
          "type": "float",
          "description": "LFO frequency in Hz.",
          "required": false,
          "default": 2
        },
        {
          "name": "depth",
          "type": "float",
          "description": "Output amplitude scale.",
          "required": false,
          "default": 1
        },
        {
          "name": "offset",
          "type": "float",
          "description": "Constant added to the output.",
          "required": false,
          "default": 0
        },
        {
          "name": "sample_rate",
          "type": "int",
          "description": "Free-run sample rate in Hz.",
          "required": true
        }
      ],
      "outputs": [
        {
          "name": "cv",
          "type": "cv"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/audio/synth/lfo",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/audio/synth/lfo.md"
    },
    {
      "type": "nodetool.audio.synth.Mixer",
      "title": "Mixer",
      "namespace": "nodetool.audio.synth",
      "description": "Sums up to four audio streams with per-input levels.\n    audio, synthesis, mixer, modular\n\n    Output = Σ level_i * in_i, emitted as soon as every still-open input can cover the frames; inputs that have ended contribute silence. The stream ends when all connected inputs end. Assumes matching sample rates and channel counts (no resampling).\n\n    Use cases:\n    - Combine oscillators into a richer voice\n    - Mix a dry signal with a filtered copy\n    - Sub-mix several synth voices",
      "inputs": [
        {
          "name": "in1",
          "type": "chunk",
          "description": "Audio input 1.",
          "required": true
        },
        {
          "name": "in2",
          "type": "chunk",
          "description": "Audio input 2.",
          "required": true
        },
        {
          "name": "in3",
          "type": "chunk",
          "description": "Audio input 3.",
          "required": true
        },
        {
          "name": "in4",
          "type": "chunk",
          "description": "Audio input 4.",
          "required": true
        },
        {
          "name": "level1",
          "type": "float",
          "description": "Gain for input 1.",
          "required": false,
          "default": 1
        },
        {
          "name": "level2",
          "type": "float",
          "description": "Gain for input 2.",
          "required": false,
          "default": 1
        },
        {
          "name": "level3",
          "type": "float",
          "description": "Gain for input 3.",
          "required": false,
          "default": 1
        },
        {
          "name": "level4",
          "type": "float",
          "description": "Gain for input 4.",
          "required": false,
          "default": 1
        }
      ],
      "outputs": [
        {
          "name": "chunk",
          "type": "chunk"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/audio/synth/mixer",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/audio/synth/mixer.md"
    },
    {
      "type": "nodetool.audio.synth.Oscillator",
      "title": "Oscillator",
      "namespace": "nodetool.audio.synth",
      "description": "Voltage-controlled oscillator generating sine, saw, square, triangle or noise audio.\n    audio, synthesis, oscillator, vco, modular\n\n    Pitch CV is volts/octave: freq = frequency * 2^cv (cv in octaves). With pitch_cv or fm patched, output follows that stream's chunk cadence (sample-aligned); otherwise it free-runs wall-clock paced until the run is stopped. Naive waveforms — saw/square alias at high frequencies.\n\n    Use cases:\n    - Sound source for a modular synth voice\n    - FM/vibrato via the fm input driven by an LFO\n    - Melodic sequences via a pitch CV stream",
      "inputs": [
        {
          "name": "pitch_cv",
          "type": "cv",
          "description": "Pitch control stream in octaves (volts/octave): freq = frequency * 2^cv. When patched, drives the output chunk cadence.",
          "required": true
        },
        {
          "name": "fm",
          "type": "cv",
          "description": "Linear frequency modulation stream: freq is multiplied by (1 + fm_amount * fm).",
          "required": true
        },
        {
          "name": "waveform",
          "type": "enum",
          "description": "Oscillator waveform.",
          "required": false,
          "default": "sine"
        },
        {
          "name": "frequency",
          "type": "float",
          "description": "Base frequency in Hz.",
          "required": false,
          "default": 220
        },
        {
          "name": "amplitude",
          "type": "float",
          "description": "Output amplitude (linear).",
          "required": false,
          "default": 0.8
        },
        {
          "name": "pulse_width",
          "type": "float",
          "description": "Duty cycle for the square waveform.",
          "required": false,
          "default": 0.5
        },
        {
          "name": "fm_amount",
          "type": "float",
          "description": "Depth of linear frequency modulation from the fm input.",
          "required": false,
          "default": 0
        },
        {
          "name": "sample_rate",
          "type": "int",
          "description": "Free-run sample rate in Hz.",
          "required": true
        }
      ],
      "outputs": [
        {
          "name": "chunk",
          "type": "chunk"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/audio/synth/oscillator",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/audio/synth/oscillator.md"
    },
    {
      "type": "nodetool.audio.synth.SampleHold",
      "title": "Sample & Hold",
      "namespace": "nodetool.audio.synth",
      "description": "Samples the signal input on each trigger rising edge and holds it.\n    cv, synthesis, sample-hold, modular\n\n    On a trigger rising edge (≥ 0.5) at sample k, the held value becomes signal[k]; the output is the held value every sample. The signal input drives chunk cadence; the trigger is frame-aligned with hold-last.\n\n    Use cases:\n    - Classic random-stepped CV (noise → signal, clock → trigger)\n    - Quantize an LFO into steps\n    - Freeze a modulation value on demand",
      "inputs": [
        {
          "name": "signal",
          "type": "cv",
          "description": "Stream to sample (drives chunk cadence).",
          "required": true
        },
        {
          "name": "trigger",
          "type": "cv",
          "description": "Sampling clock — samples on each rising edge (≥ 0.5).",
          "required": true
        }
      ],
      "outputs": [
        {
          "name": "cv",
          "type": "cv"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/audio/synth/samplehold",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/audio/synth/samplehold.md"
    },
    {
      "type": "nodetool.audio.synth.VCA",
      "title": "VCA",
      "namespace": "nodetool.audio.synth",
      "description": "Voltage-controlled amplifier: multiplies an audio stream by a CV stream.\n    audio, cv, synthesis, vca, amplifier, modular\n\n    Output = audio * gain * max(0, cv) per sample (negative CV is clamped — a VCA doesn't invert). The audio input drives chunk cadence; the CV is frame-aligned with hold-last when it lags or ends. With nothing patched into cv, acts as a plain gain.\n\n    Use cases:\n    - Shape a note with an ADSR envelope\n    - Tremolo via an LFO\n    - Sidechain-style ducking from any CV source",
      "inputs": [
        {
          "name": "audio",
          "type": "chunk",
          "description": "Audio chunk stream to amplify (drives chunk cadence).",
          "required": true
        },
        {
          "name": "cv",
          "type": "cv",
          "description": "Amplitude control stream; negative values clamp to 0.",
          "required": true
        },
        {
          "name": "gain",
          "type": "float",
          "description": "Constant gain multiplier.",
          "required": false,
          "default": 1
        }
      ],
      "outputs": [
        {
          "name": "chunk",
          "type": "chunk"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/audio/synth/vca",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/audio/synth/vca.md"
    },
    {
      "type": "nodetool.audio.synth.VCF",
      "title": "VCF",
      "namespace": "nodetool.audio.synth",
      "description": "Voltage-controlled filter: a biquad whose cutoff is modulated by a CV stream.\n    audio, cv, synthesis, vcf, filter, modular\n\n    Cutoff = cutoff_hz * 2^(cv * cv_amount) (volts/octave), recomputed every 64 samples (control rate); filter state persists across chunks so chunked output equals a single pass. The audio input drives chunk cadence; CV is frame-aligned with hold-last.\n\n    Use cases:\n    - Classic envelope filter sweeps (ADSR → cutoff_cv)\n    - Wah/auto-filter via an LFO\n    - Static tone shaping with nothing patched into cutoff_cv",
      "inputs": [
        {
          "name": "audio",
          "type": "chunk",
          "description": "Audio chunk stream to filter (drives chunk cadence).",
          "required": true
        },
        {
          "name": "cutoff_cv",
          "type": "cv",
          "description": "Cutoff modulation in octaves: cutoff = cutoff_hz * 2^(cv * cv_amount).",
          "required": true
        },
        {
          "name": "mode",
          "type": "enum",
          "description": "Filter mode.",
          "required": false,
          "default": "lowpass"
        },
        {
          "name": "cutoff_hz",
          "type": "float",
          "description": "Base cutoff frequency in Hz.",
          "required": false,
          "default": 1000
        },
        {
          "name": "q",
          "type": "float",
          "description": "Filter resonance (quality factor).",
          "required": true
        },
        {
          "name": "cv_amount",
          "type": "float",
          "description": "Octaves of cutoff shift per unit of CV.",
          "required": false,
          "default": 1
        }
      ],
      "outputs": [
        {
          "name": "chunk",
          "type": "chunk"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/audio/synth/vcf",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/audio/synth/vcf.md"
    },
    {
      "type": "nodetool.audio.TextToMusic",
      "title": "Text To Music",
      "namespace": "nodetool.audio",
      "description": "Generate music from a text prompt using any supported music provider (FAL, Replicate, KIE/Suno, MiniMax). Optionally supply lyrics for vocal models.\n    audio, generation, AI, text-to-music, music, song",
      "inputs": [
        {
          "name": "model",
          "type": "music_model",
          "description": "The text-to-music model to use",
          "required": false,
          "default": {
            "type": "music_model",
            "provider": "replicate",
            "id": "meta/musicgen",
            "name": "MusicGen",
            "path": null
          }
        },
        {
          "name": "prompt",
          "type": "str",
          "description": "Describe the style, mood, genre, and instrumentation",
          "required": false,
          "default": "An upbeat electronic track with a catchy melody and driving beat"
        },
        {
          "name": "lyrics",
          "type": "str",
          "description": "Optional song lyrics for vocal models (e.g. Suno, MiniMax). Leave empty for instrumental.",
          "required": false,
          "default": ""
        },
        {
          "name": "duration",
          "type": "float",
          "description": "Requested duration in seconds (providers clamp to their limits).",
          "required": false,
          "default": 8
        }
      ],
      "outputs": [
        {
          "name": "audio",
          "type": "audio"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/audio/texttomusic",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/audio/texttomusic.md"
    },
    {
      "type": "nodetool.audio.TextToSpeech",
      "title": "Text To Speech",
      "namespace": "nodetool.audio",
      "description": "Generate speech audio from text using any supported TTS provider. Automatically routes to the appropriate backend (OpenAI, HuggingFace, MLX).\n    audio, generation, AI, text-to-speech, tts, voice",
      "inputs": [
        {
          "name": "model",
          "type": "tts_model",
          "description": "The text-to-speech model to use",
          "required": false,
          "default": {
            "type": "tts_model",
            "provider": "openai",
            "id": "tts-1",
            "name": "TTS 1",
            "path": null,
            "voices": [
              "alloy",
              "echo",
              "fable",
              "onyx",
              "nova",
              "shimmer"
            ],
            "selected_voice": "alloy"
          }
        },
        {
          "name": "text",
          "type": "str",
          "description": "Text to convert to speech",
          "required": false,
          "default": "Hello! This is a text-to-speech demonstration."
        },
        {
          "name": "speed",
          "type": "float",
          "description": "Speech speed multiplier (0.25 to 4.0)",
          "required": false,
          "default": 1
        }
      ],
      "outputs": [
        {
          "name": "audio",
          "type": "audio"
        },
        {
          "name": "chunk",
          "type": "chunk"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/audio/texttospeech",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/audio/texttospeech.md"
    },
    {
      "type": "nodetool.audio.Trim",
      "title": "Trim",
      "namespace": "nodetool.audio",
      "description": "Trim an audio file to a specified duration.\n    audio, trim, cut",
      "inputs": [
        {
          "name": "audio",
          "type": "audio",
          "description": "The audio file to trim.",
          "required": false,
          "default": {
            "type": "audio",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "start",
          "type": "float",
          "description": "The start time of the trimmed audio in seconds.",
          "required": false,
          "default": 0
        },
        {
          "name": "end",
          "type": "float",
          "description": "The end time of the trimmed audio in seconds.",
          "required": false,
          "default": 0
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "audio"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/audio/trim",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/audio/trim.md"
    },
    {
      "type": "nodetool.code.Code",
      "title": "Code",
      "namespace": "nodetool.code",
      "description": "",
      "inputs": [
        {
          "name": "code",
          "type": "str",
          "description": "",
          "required": false,
          "default": "return {};"
        },
        {
          "name": "timeout",
          "type": "int",
          "description": "Max seconds before execution is aborted (0 = no limit).",
          "required": false,
          "default": 30
        }
      ],
      "outputs": [],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/code/code",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/code/code.md"
    },
    {
      "type": "nodetool.code.ExecuteBash",
      "title": "Execute Bash",
      "namespace": "nodetool.code",
      "description": "Executes Bash script with safety restrictions.\n    bash, shell, code, execute",
      "inputs": [
        {
          "name": "code",
          "type": "str",
          "description": "Bash script to execute as-is. Dynamic inputs are provided as env vars. Stdout lines are emitted on 'stdout'; stderr lines on 'stderr'.",
          "required": false,
          "default": ""
        },
        {
          "name": "image",
          "type": "enum",
          "description": "Docker image to use for execution",
          "required": false,
          "default": "ubuntu:22.04"
        },
        {
          "name": "execution_mode",
          "type": "enum",
          "description": "Execution mode: 'docker' or 'subprocess'",
          "required": false,
          "default": "docker"
        },
        {
          "name": "stdin",
          "type": "str",
          "description": "String to write to process stdin before any streaming input. Use newlines to separate lines.",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "stdout",
          "type": "str"
        },
        {
          "name": "stderr",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/code/executebash",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/code/executebash.md"
    },
    {
      "type": "nodetool.code.ExecuteCommand",
      "title": "Execute Command",
      "namespace": "nodetool.code",
      "description": "Executes a single shell command inside a Docker container.\n    command, execute, shell, bash, sh\n\n    IMPORTANT: Only enabled in non-production environments",
      "inputs": [
        {
          "name": "command",
          "type": "str",
          "description": "Single command to run via the selected shell. Stdout lines are emitted on 'stdout'; stderr lines on 'stderr'.",
          "required": false,
          "default": ""
        },
        {
          "name": "image",
          "type": "enum",
          "description": "Docker image to use for execution",
          "required": false,
          "default": "bash:5.2"
        },
        {
          "name": "execution_mode",
          "type": "enum",
          "description": "Execution mode: 'docker' or 'subprocess'",
          "required": false,
          "default": "docker"
        },
        {
          "name": "stdin",
          "type": "str",
          "description": "String to write to process stdin before any streaming input. Use newlines to separate lines.",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "stdout",
          "type": "str"
        },
        {
          "name": "stderr",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/code/executecommand",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/code/executecommand.md"
    },
    {
      "type": "nodetool.code.ExecuteJavaScript",
      "title": "Execute Java Script",
      "namespace": "nodetool.code",
      "description": "Executes JavaScript (Node.js) code with safety restrictions.\n    javascript, nodejs, code, execute",
      "inputs": [
        {
          "name": "code",
          "type": "str",
          "description": "JavaScript code to execute as-is under Node.js. Dynamic inputs are provided as local vars. Stdout lines are emitted on 'stdout'; stderr lines on 'stderr'.",
          "required": false,
          "default": ""
        },
        {
          "name": "image",
          "type": "enum",
          "description": "Docker image to use for execution",
          "required": false,
          "default": "node:22-alpine"
        },
        {
          "name": "execution_mode",
          "type": "enum",
          "description": "Execution mode: 'docker' or 'subprocess'",
          "required": false,
          "default": "docker"
        },
        {
          "name": "stdin",
          "type": "str",
          "description": "String to write to process stdin before any streaming input. Use newlines to separate lines.",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "stdout",
          "type": "str"
        },
        {
          "name": "stderr",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/code/executejavascript",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/code/executejavascript.md"
    },
    {
      "type": "nodetool.code.ExecuteLua",
      "title": "Execute Lua",
      "namespace": "nodetool.code",
      "description": "Executes Lua code with a local sandbox (no Docker).\n    lua, code, execute, sandbox",
      "inputs": [
        {
          "name": "code",
          "type": "str",
          "description": "Lua code to execute as-is in a restricted environment. Dynamic inputs are provided as variables. Stdout lines are emitted on 'stdout'; stderr lines on 'stderr'.",
          "required": false,
          "default": ""
        },
        {
          "name": "executable",
          "type": "enum",
          "description": "Lua executable to use",
          "required": false,
          "default": "lua"
        },
        {
          "name": "execution_mode",
          "type": "enum",
          "description": "Execution mode: 'docker' or 'subprocess'",
          "required": false,
          "default": "subprocess"
        },
        {
          "name": "timeout_seconds",
          "type": "int",
          "description": "Max seconds to allow execution before forced stop",
          "required": false,
          "default": 10
        },
        {
          "name": "stdin",
          "type": "str",
          "description": "String to write to process stdin before any streaming input. Use newlines to separate lines.",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "stdout",
          "type": "str"
        },
        {
          "name": "stderr",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/code/executelua",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/code/executelua.md"
    },
    {
      "type": "nodetool.code.ExecutePython",
      "title": "Execute Python",
      "namespace": "nodetool.code",
      "description": "Executes Python code with safety restrictions.\n    python, code, execute\n\n    Use cases:\n    - Run custom data transformations\n    - Prototype node functionality\n    - Debug and testing workflows\n\n    IMPORTANT: Only enabled in non-production environments",
      "inputs": [
        {
          "name": "code",
          "type": "str",
          "description": "Python code to execute as-is. Dynamic inputs are provided as local vars. Stdout lines are emitted on 'stdout'; stderr lines on 'stderr'.",
          "required": false,
          "default": ""
        },
        {
          "name": "image",
          "type": "enum",
          "description": "Docker image to use for execution",
          "required": false,
          "default": "python:3.11-slim"
        },
        {
          "name": "execution_mode",
          "type": "enum",
          "description": "Execution mode: 'docker' or 'subprocess'",
          "required": false,
          "default": "docker"
        },
        {
          "name": "stdin",
          "type": "str",
          "description": "String to write to process stdin before any streaming input. Use newlines to separate lines.",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "stdout",
          "type": "str"
        },
        {
          "name": "stderr",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/code/executepython",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/code/executepython.md"
    },
    {
      "type": "nodetool.code.ExecuteRuby",
      "title": "Execute Ruby",
      "namespace": "nodetool.code",
      "description": "Executes Ruby code with safety restrictions.\n    ruby, code, execute",
      "inputs": [
        {
          "name": "code",
          "type": "str",
          "description": "Ruby code to execute as-is. Dynamic inputs are provided as env vars. Stdout lines are emitted on 'stdout'; stderr lines on 'stderr'.",
          "required": false,
          "default": ""
        },
        {
          "name": "image",
          "type": "enum",
          "description": "Docker image to use for execution",
          "required": false,
          "default": "ruby:3.3-alpine"
        },
        {
          "name": "execution_mode",
          "type": "enum",
          "description": "Execution mode: 'docker' or 'subprocess'",
          "required": false,
          "default": "docker"
        },
        {
          "name": "stdin",
          "type": "str",
          "description": "String to write to process stdin before any streaming input. Use newlines to separate lines.",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "stdout",
          "type": "str"
        },
        {
          "name": "stderr",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/code/executeruby",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/code/executeruby.md"
    },
    {
      "type": "nodetool.code.RunBashCommand",
      "title": "Run Bash Command",
      "namespace": "nodetool.code",
      "description": "Executes a single Bash command and buffers the output.\n    bash, shell, code, execute, command\n\n    Use cases:\n    - Run a single Bash script or command\n    - Execute shell commands with buffered stdout/stderr output\n    - One-shot Bash execution without streaming\n\n    The command is executed once and the complete output is returned.",
      "inputs": [
        {
          "name": "command",
          "type": "str",
          "description": "Bash command to execute",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "stdout",
          "type": "str"
        },
        {
          "name": "stderr",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/code/runbashcommand",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/code/runbashcommand.md"
    },
    {
      "type": "nodetool.code.RunBashCommandDocker",
      "title": "Run Bash Command Docker",
      "namespace": "nodetool.code",
      "description": "Executes a single Bash command in Docker and buffers the output.\n    bash, shell, code, execute, command, docker",
      "inputs": [
        {
          "name": "command",
          "type": "str",
          "description": "Bash command to execute",
          "required": false,
          "default": ""
        },
        {
          "name": "image",
          "type": "enum",
          "description": "Docker image to use for execution",
          "required": false,
          "default": "ubuntu:22.04"
        }
      ],
      "outputs": [
        {
          "name": "stdout",
          "type": "str"
        },
        {
          "name": "stderr",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/code/runbashcommanddocker",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/code/runbashcommanddocker.md"
    },
    {
      "type": "nodetool.code.RunJavaScriptCommand",
      "title": "Run Java Script Command",
      "namespace": "nodetool.code",
      "description": "Executes a single JavaScript command and buffers the output.\n    javascript, nodejs, code, execute, command\n\n    Use cases:\n    - Run a single JavaScript script or command\n    - Execute JavaScript code with buffered stdout/stderr output\n    - One-shot JavaScript execution without streaming\n\n    The command is executed once and the complete output is returned.",
      "inputs": [
        {
          "name": "command",
          "type": "str",
          "description": "JavaScript command to execute",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "stdout",
          "type": "str"
        },
        {
          "name": "stderr",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/code/runjavascriptcommand",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/code/runjavascriptcommand.md"
    },
    {
      "type": "nodetool.code.RunJavaScriptCommandDocker",
      "title": "Run Java Script Command Docker",
      "namespace": "nodetool.code",
      "description": "Executes a single JavaScript command in Docker and buffers the output.\n    javascript, nodejs, code, execute, command, docker",
      "inputs": [
        {
          "name": "command",
          "type": "str",
          "description": "JavaScript command to execute",
          "required": false,
          "default": ""
        },
        {
          "name": "image",
          "type": "enum",
          "description": "Docker image to use for execution",
          "required": false,
          "default": "node:22-alpine"
        }
      ],
      "outputs": [
        {
          "name": "stdout",
          "type": "str"
        },
        {
          "name": "stderr",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/code/runjavascriptcommanddocker",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/code/runjavascriptcommanddocker.md"
    },
    {
      "type": "nodetool.code.RunLuaCommand",
      "title": "Run Lua Command",
      "namespace": "nodetool.code",
      "description": "Executes a single Lua command and buffers the output.\n    lua, code, execute, command, sandbox\n\n    Use cases:\n    - Run a single Lua script or command\n    - Execute Lua code with buffered stdout/stderr output\n    - One-shot Lua execution without streaming\n\n    The command is executed once and the complete output is returned.",
      "inputs": [
        {
          "name": "command",
          "type": "str",
          "description": "Lua command to execute",
          "required": false,
          "default": ""
        },
        {
          "name": "executable",
          "type": "enum",
          "description": "Lua executable to use",
          "required": false,
          "default": "lua"
        },
        {
          "name": "timeout_seconds",
          "type": "int",
          "description": "Max seconds to allow execution before forced stop",
          "required": false,
          "default": 10
        }
      ],
      "outputs": [
        {
          "name": "stdout",
          "type": "str"
        },
        {
          "name": "stderr",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/code/runluacommand",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/code/runluacommand.md"
    },
    {
      "type": "nodetool.code.RunLuaCommandDocker",
      "title": "Run Lua Command Docker",
      "namespace": "nodetool.code",
      "description": "Executes a single Lua command in Docker and buffers the output.\n    lua, code, execute, command, sandbox, docker",
      "inputs": [
        {
          "name": "command",
          "type": "str",
          "description": "Lua command to execute",
          "required": false,
          "default": ""
        },
        {
          "name": "image",
          "type": "enum",
          "description": "Docker image to use for execution",
          "required": false,
          "default": "nickblah/lua:5.2.4-luarocks-ubuntu"
        },
        {
          "name": "timeout_seconds",
          "type": "int",
          "description": "Max seconds to allow execution before forced stop",
          "required": false,
          "default": 10
        }
      ],
      "outputs": [
        {
          "name": "stdout",
          "type": "str"
        },
        {
          "name": "stderr",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/code/runluacommanddocker",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/code/runluacommanddocker.md"
    },
    {
      "type": "nodetool.code.RunPythonCommand",
      "title": "Run Python Command",
      "namespace": "nodetool.code",
      "description": "Executes a single Python command and buffers the output.\n    python, code, execute, command\n\n    Use cases:\n    - Run a single Python script or command\n    - Execute Python code with buffered stdout/stderr output\n    - One-shot Python execution without streaming\n\n    The command is executed once and the complete output is returned.\n    IMPORTANT: Only enabled in non-production environments",
      "inputs": [
        {
          "name": "command",
          "type": "str",
          "description": "Python command to execute",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "stdout",
          "type": "str"
        },
        {
          "name": "stderr",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/code/runpythoncommand",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/code/runpythoncommand.md"
    },
    {
      "type": "nodetool.code.RunPythonCommandDocker",
      "title": "Run Python Command Docker",
      "namespace": "nodetool.code",
      "description": "Executes a single Python command in Docker and buffers the output.\n    python, code, execute, command, docker",
      "inputs": [
        {
          "name": "command",
          "type": "str",
          "description": "Python command to execute",
          "required": false,
          "default": ""
        },
        {
          "name": "image",
          "type": "enum",
          "description": "Docker image to use for execution",
          "required": false,
          "default": "python:3.11-slim"
        }
      ],
      "outputs": [
        {
          "name": "stdout",
          "type": "str"
        },
        {
          "name": "stderr",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/code/runpythoncommanddocker",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/code/runpythoncommanddocker.md"
    },
    {
      "type": "nodetool.code.RunRubyCommand",
      "title": "Run Ruby Command",
      "namespace": "nodetool.code",
      "description": "Executes a single Ruby command and buffers the output.\n    ruby, code, execute, command\n\n    Use cases:\n    - Run a single Ruby script or command\n    - Execute Ruby code with buffered stdout/stderr output\n    - One-shot Ruby execution without streaming\n\n    The command is executed once and the complete output is returned.",
      "inputs": [
        {
          "name": "command",
          "type": "str",
          "description": "Ruby command to execute",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "stdout",
          "type": "str"
        },
        {
          "name": "stderr",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/code/runrubycommand",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/code/runrubycommand.md"
    },
    {
      "type": "nodetool.code.RunRubyCommandDocker",
      "title": "Run Ruby Command Docker",
      "namespace": "nodetool.code",
      "description": "Executes a single Ruby command in Docker and buffers the output.\n    ruby, code, execute, command, docker",
      "inputs": [
        {
          "name": "command",
          "type": "str",
          "description": "Ruby command to execute",
          "required": false,
          "default": ""
        },
        {
          "name": "image",
          "type": "enum",
          "description": "Docker image to use for execution",
          "required": false,
          "default": "ruby:3.3-alpine"
        }
      ],
      "outputs": [
        {
          "name": "stdout",
          "type": "str"
        },
        {
          "name": "stderr",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/code/runrubycommanddocker",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/code/runrubycommanddocker.md"
    },
    {
      "type": "nodetool.code.RunShellCommand",
      "title": "Run Shell Command",
      "namespace": "nodetool.code",
      "description": "Executes a single shell command and buffers the output.\n    command, execute, shell, bash, sh\n\n    Use cases:\n    - Run a single shell command\n    - Execute shell commands with buffered stdout/stderr output\n    - One-shot command execution without streaming\n\n    The command is executed once and the complete output is returned.\n    IMPORTANT: Only enabled in non-production environments",
      "inputs": [
        {
          "name": "command",
          "type": "str",
          "description": "Shell command to execute",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "stdout",
          "type": "str"
        },
        {
          "name": "stderr",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/code/runshellcommand",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/code/runshellcommand.md"
    },
    {
      "type": "nodetool.code.RunShellCommandDocker",
      "title": "Run Shell Command Docker",
      "namespace": "nodetool.code",
      "description": "Executes a single shell command in Docker and buffers the output.\n    command, execute, shell, bash, sh, docker",
      "inputs": [
        {
          "name": "command",
          "type": "str",
          "description": "Shell command to execute",
          "required": false,
          "default": ""
        },
        {
          "name": "image",
          "type": "enum",
          "description": "Docker image to use for execution",
          "required": false,
          "default": "bash:5.2"
        }
      ],
      "outputs": [
        {
          "name": "stdout",
          "type": "str"
        },
        {
          "name": "stderr",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/code/runshellcommanddocker",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/code/runshellcommanddocker.md"
    },
    {
      "type": "nodetool.compare.CompareImages",
      "title": "Compare Images",
      "namespace": "nodetool.compare",
      "description": "Compare two images side-by-side with an interactive slider.\n    image, compare, comparison, diff, before, after, slider\n\n    Use this node to visually compare:\n    - Before/after processing results\n    - Different model outputs\n    - Original vs edited images\n    - A/B testing of image variations",
      "inputs": [
        {
          "name": "image_a",
          "type": "image",
          "description": "First image (displayed on left/top)",
          "required": false,
          "default": {
            "type": "image",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "image_b",
          "type": "image",
          "description": "Second image (displayed on right/bottom)",
          "required": false,
          "default": {
            "type": "image",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "label_a",
          "type": "str",
          "description": "Label for the first image",
          "required": false,
          "default": "A"
        },
        {
          "name": "label_b",
          "type": "str",
          "description": "Label for the second image",
          "required": false,
          "default": "B"
        }
      ],
      "outputs": [
        {
          "name": "comparison",
          "type": "any"
        },
        {
          "name": "score",
          "type": "float"
        },
        {
          "name": "equal",
          "type": "bool"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/compare/compareimages",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/compare/compareimages.md"
    },
    {
      "type": "nodetool.constant.ASRModelConstant",
      "title": "ASR Model Constant",
      "namespace": "nodetool.constant",
      "description": "Represents an automatic speech recognition model constant in the workflow.\n    asr, speech, recognition, transcription, model\n\n    Use cases:\n    - Provide a fixed ASR model for transcription\n    - Set default ASR model for the workflow\n    - Configure model selection without user input",
      "inputs": [
        {
          "name": "value",
          "type": "asr_model",
          "description": "",
          "required": false,
          "default": null
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "asr_model"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/constant/asrmodelconstant",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/constant/asrmodelconstant.md"
    },
    {
      "type": "nodetool.constant.Audio",
      "title": "Audio",
      "namespace": "nodetool.constant",
      "description": "Represents an audio file constant in the workflow.\n    audio, file, mp3, wav\n\n    Use cases:\n    - Provide a fixed audio input for audio processing nodes\n    - Reference a specific audio file in the workflow\n    - Set default audio for testing or demonstration purposes",
      "inputs": [
        {
          "name": "value",
          "type": "audio",
          "description": "",
          "required": false,
          "default": {
            "type": "audio",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "audio"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/constant/audio",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/constant/audio.md"
    },
    {
      "type": "nodetool.constant.AudioList",
      "title": "Audio List",
      "namespace": "nodetool.constant",
      "description": "Represents a list of audio file constants in the workflow.\n    audios, sounds, audio files, collection\n\n    Use cases:\n    - Provide a fixed list of audio files for batch processing\n    - Reference multiple audio files in the workflow\n    - Set default audio list for testing or demonstration purposes",
      "inputs": [
        {
          "name": "value",
          "type": "list[audio]",
          "description": "List of audio references",
          "required": false,
          "default": null
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "list[audio]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/constant/audiolist",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/constant/audiolist.md"
    },
    {
      "type": "nodetool.constant.Bool",
      "title": "Bool",
      "namespace": "nodetool.constant",
      "description": "Represents a boolean constant in the workflow.\n    boolean, logic, flag\n\n    Use cases:\n    - Control flow decisions in conditional nodes\n    - Toggle features or behaviors in the workflow\n    - Set default boolean values for configuration",
      "inputs": [
        {
          "name": "value",
          "type": "bool",
          "description": "",
          "required": false,
          "default": false
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "bool"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/constant/bool",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/constant/bool.md"
    },
    {
      "type": "nodetool.constant.Constant",
      "title": "Constant",
      "namespace": "nodetool.constant",
      "description": "Base class for fixed-value nodes.\n    constant, parameter, default\n\n    Use cases:\n    - Provide static inputs to a workflow\n    - Hold configuration values\n    - Simplify testing with deterministic outputs",
      "inputs": [],
      "outputs": [],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/constant/constant",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/constant/constant.md"
    },
    {
      "type": "nodetool.constant.DataFrame",
      "title": "Data Frame",
      "namespace": "nodetool.constant",
      "description": "Represents a fixed DataFrame constant in the workflow.\n    table, data, dataframe, pandas\n\n    Use cases:\n    - Provide static data for analysis or processing\n    - Define lookup tables or reference data\n    - Set sample data for testing or demonstration",
      "inputs": [
        {
          "name": "value",
          "type": "dataframe",
          "description": "",
          "required": false,
          "default": {
            "type": "dataframe",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null,
            "columns": null
          }
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "dataframe"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/constant/dataframe",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/constant/dataframe.md"
    },
    {
      "type": "nodetool.constant.Date",
      "title": "Date",
      "namespace": "nodetool.constant",
      "description": "Make a date object from year, month, day.\n    date, make, create",
      "inputs": [
        {
          "name": "year",
          "type": "int",
          "description": "Year of the date",
          "required": false,
          "default": 1900
        },
        {
          "name": "month",
          "type": "int",
          "description": "Month of the date",
          "required": false,
          "default": 1
        },
        {
          "name": "day",
          "type": "int",
          "description": "Day of the date",
          "required": false,
          "default": 1
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "date"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/constant/date",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/constant/date.md"
    },
    {
      "type": "nodetool.constant.DateTime",
      "title": "Date Time",
      "namespace": "nodetool.constant",
      "description": "Make a datetime object from year, month, day, hour, minute, second.\n    datetime, make, create",
      "inputs": [
        {
          "name": "year",
          "type": "int",
          "description": "Year of the datetime",
          "required": false,
          "default": 1900
        },
        {
          "name": "month",
          "type": "int",
          "description": "Month of the datetime",
          "required": false,
          "default": 1
        },
        {
          "name": "day",
          "type": "int",
          "description": "Day of the datetime",
          "required": false,
          "default": 1
        },
        {
          "name": "hour",
          "type": "int",
          "description": "Hour of the datetime",
          "required": false,
          "default": 0
        },
        {
          "name": "minute",
          "type": "int",
          "description": "Minute of the datetime",
          "required": false,
          "default": 0
        },
        {
          "name": "second",
          "type": "int",
          "description": "Second of the datetime",
          "required": false,
          "default": 0
        },
        {
          "name": "millisecond",
          "type": "int",
          "description": "Millisecond of the datetime",
          "required": false,
          "default": 0
        },
        {
          "name": "tzinfo",
          "type": "str",
          "description": "Timezone of the datetime",
          "required": false,
          "default": "UTC"
        },
        {
          "name": "utc_offset",
          "type": "int",
          "description": "UTC offset of the datetime in minutes",
          "required": false,
          "default": 0
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "datetime"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/constant/datetime",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/constant/datetime.md"
    },
    {
      "type": "nodetool.constant.Dict",
      "title": "Dict",
      "namespace": "nodetool.constant",
      "description": "Represents a dictionary constant in the workflow.\n    dictionary, key-value, mapping\n\n    Use cases:\n    - Store configuration settings\n    - Provide structured data inputs\n    - Define parameter sets for other nodes",
      "inputs": [
        {
          "name": "value",
          "type": "dict[str, any]",
          "description": "",
          "required": false,
          "default": {}
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "dict[str, any]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/constant/dict",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/constant/dict.md"
    },
    {
      "type": "nodetool.constant.Document",
      "title": "Document",
      "namespace": "nodetool.constant",
      "description": "Represents a document constant in the workflow.\n    document, pdf, word, docx",
      "inputs": [
        {
          "name": "value",
          "type": "document",
          "description": "",
          "required": false,
          "default": {
            "type": "document",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "document"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/constant/document",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/constant/document.md"
    },
    {
      "type": "nodetool.constant.EmbeddingModelConstant",
      "title": "Embedding Model Constant",
      "namespace": "nodetool.constant",
      "description": "Represents an embedding model constant in the workflow.\n    embedding, model, vector, semantic\n\n    Use cases:\n    - Provide a fixed embedding model for vectorization\n    - Set default embedding model for the workflow\n    - Configure model selection without user input",
      "inputs": [
        {
          "name": "value",
          "type": "embedding_model",
          "description": "",
          "required": false,
          "default": null
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "embedding_model"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/constant/embeddingmodelconstant",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/constant/embeddingmodelconstant.md"
    },
    {
      "type": "nodetool.constant.Float",
      "title": "Float",
      "namespace": "nodetool.constant",
      "description": "Represents a floating-point number constant in the workflow.\n    number, decimal, float\n\n    Use cases:\n    - Set numerical parameters for calculations\n    - Define thresholds or limits\n    - Provide fixed numerical inputs for processing",
      "inputs": [
        {
          "name": "value",
          "type": "float",
          "description": "",
          "required": false,
          "default": 0
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "float"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/constant/float",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/constant/float.md"
    },
    {
      "type": "nodetool.constant.Image",
      "title": "Image",
      "namespace": "nodetool.constant",
      "description": "Represents an image file constant in the workflow.\n    picture, photo, image\n\n    Use cases:\n    - Provide a fixed image input for image processing nodes\n    - Reference a specific image file in the workflow\n    - Set default image for testing or demonstration purposes",
      "inputs": [
        {
          "name": "value",
          "type": "image",
          "description": "",
          "required": false,
          "default": {
            "type": "image",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/constant/image",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/constant/image.md"
    },
    {
      "type": "nodetool.constant.ImageList",
      "title": "Image List",
      "namespace": "nodetool.constant",
      "description": "Represents a list of image file constants in the workflow.\n    pictures, photos, images, collection\n\n    Use cases:\n    - Provide a fixed list of images for batch processing\n    - Reference multiple image files in the workflow\n    - Set default image list for testing or demonstration purposes",
      "inputs": [
        {
          "name": "value",
          "type": "list[image]",
          "description": "List of image references",
          "required": false,
          "default": null
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "list[image]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/constant/imagelist",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/constant/imagelist.md"
    },
    {
      "type": "nodetool.constant.ImageModelConstant",
      "title": "Image Model Constant",
      "namespace": "nodetool.constant",
      "description": "Represents an image generation model constant in the workflow.\n    image, model, ai, generation, diffusion\n\n    Use cases:\n    - Provide a fixed image model for generation\n    - Set default image model for the workflow\n    - Configure model selection without user input",
      "inputs": [
        {
          "name": "value",
          "type": "image_model",
          "description": "",
          "required": false,
          "default": null
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "image_model"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/constant/imagemodelconstant",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/constant/imagemodelconstant.md"
    },
    {
      "type": "nodetool.constant.ImageSize",
      "title": "Image Size",
      "namespace": "nodetool.constant",
      "description": "Represents a fixed image size constant in the workflow.\n    constant, image_size, resolution, width, height, dimensions\n\n    Use cases:\n    - Provide fixed output dimensions for image generation nodes\n    - Reference a standard resolution across the workflow\n    - Expose width and height as separate integer outputs",
      "inputs": [
        {
          "name": "value",
          "type": "image_size",
          "description": "",
          "required": false,
          "default": null
        }
      ],
      "outputs": [
        {
          "name": "image_size",
          "type": "image_size"
        },
        {
          "name": "width",
          "type": "int"
        },
        {
          "name": "height",
          "type": "int"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/constant/imagesize",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/constant/imagesize.md"
    },
    {
      "type": "nodetool.constant.Integer",
      "title": "Integer",
      "namespace": "nodetool.constant",
      "description": "Represents an integer constant in the workflow.\n    number, integer, whole\n\n    Use cases:\n    - Set numerical parameters for calculations\n    - Define counts, indices, or sizes\n    - Provide fixed numerical inputs for processing",
      "inputs": [
        {
          "name": "value",
          "type": "int",
          "description": "",
          "required": false,
          "default": 0
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "int"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/constant/integer",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/constant/integer.md"
    },
    {
      "type": "nodetool.constant.JSON",
      "title": "JSON",
      "namespace": "nodetool.constant",
      "description": "Represents a JSON constant in the workflow.\n    json, object, dictionary",
      "inputs": [
        {
          "name": "value",
          "type": "json",
          "description": "",
          "required": false,
          "default": {
            "type": "json",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "json"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/constant/json",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/constant/json.md"
    },
    {
      "type": "nodetool.constant.LanguageModelConstant",
      "title": "Language Model Constant",
      "namespace": "nodetool.constant",
      "description": "Represents a language model constant in the workflow.\n    llm, language, model, ai, chat, gpt\n\n    Use cases:\n    - Provide a fixed language model for chat or text generation\n    - Set default language model for the workflow\n    - Configure model selection without user input",
      "inputs": [
        {
          "name": "value",
          "type": "language_model",
          "description": "",
          "required": false,
          "default": null
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "language_model"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/constant/languagemodelconstant",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/constant/languagemodelconstant.md"
    },
    {
      "type": "nodetool.constant.List",
      "title": "List",
      "namespace": "nodetool.constant",
      "description": "Represents a list constant in the workflow.\n    array, sequence, collection\n\n    Use cases:\n    - Store multiple values of the same type\n    - Provide ordered data inputs\n    - Define sequences for iteration in other nodes",
      "inputs": [
        {
          "name": "value",
          "type": "list[any]",
          "description": "",
          "required": false,
          "default": []
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "list[any]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/constant/list",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/constant/list.md"
    },
    {
      "type": "nodetool.constant.Model3D",
      "title": "Model 3D",
      "namespace": "nodetool.constant",
      "description": "Represents a 3D model constant in the workflow.\n    3d, model, mesh, glb, obj, stl\n\n    Use cases:\n    - Provide a fixed 3D model input for processing nodes\n    - Reference a specific 3D model file in the workflow\n    - Set default 3D model for testing or demonstration purposes",
      "inputs": [
        {
          "name": "value",
          "type": "model_3d",
          "description": "",
          "required": false,
          "default": {
            "type": "model_3d",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null,
            "format": null,
            "material_file": null,
            "texture_files": []
          }
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "model_3d"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/constant/model3d",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/constant/model3d.md"
    },
    {
      "type": "nodetool.constant.Select",
      "title": "Select",
      "namespace": "nodetool.constant",
      "description": "Represents a selection from a predefined set of options in the workflow.\n    select, enum, dropdown, choice, options\n\n    Use cases:\n    - Choose from a fixed set of values\n    - Configure options for downstream nodes\n    - Provide enum-compatible inputs for nodes that expect specific values\n\n    The output is a string that can be connected to enum-typed inputs.",
      "inputs": [
        {
          "name": "value",
          "type": "str",
          "description": "The currently selected value.",
          "required": false,
          "default": ""
        },
        {
          "name": "options",
          "type": "list[str]",
          "description": "The list of available options to choose from.",
          "required": false,
          "default": []
        },
        {
          "name": "enum_type_name",
          "type": "str",
          "description": "The enum type name this select corresponds to (for type matching).",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/constant/select",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/constant/select.md"
    },
    {
      "type": "nodetool.constant.Sketch",
      "title": "Sketch",
      "namespace": "nodetool.constant",
      "description": "Layered sketch document for drawing, masking, and image composition.\n    sketch, drawing, canvas, paint, image editor\n\n    Use cases:\n    - Pass a sketch document between nodes\n    - Edit the sketch directly from the workflow canvas\n    - Expose flattened image, mask, and layer outputs for downstream nodes",
      "inputs": [
        {
          "name": "value",
          "type": "sketch",
          "description": "",
          "required": false,
          "default": {
            "type": "sketch",
            "id": null,
            "data": null
          }
        },
        {
          "name": "sketch_data",
          "type": "str",
          "description": "Serialized editor document (managed by the UI).",
          "required": false,
          "default": ""
        },
        {
          "name": "image",
          "type": "image",
          "description": "Flattened composite (filled when you edit in the UI).",
          "required": false,
          "default": {
            "type": "image",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "mask",
          "type": "image",
          "description": "Mask output when configured in the editor.",
          "required": false,
          "default": {
            "type": "image",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "layers",
          "type": "list",
          "description": "List of exposed layer image references.",
          "required": false,
          "default": []
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "sketch"
        },
        {
          "name": "image",
          "type": "image"
        },
        {
          "name": "mask",
          "type": "image"
        },
        {
          "name": "layers",
          "type": "list[image]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/constant/sketch",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/constant/sketch.md"
    },
    {
      "type": "nodetool.constant.String",
      "title": "String",
      "namespace": "nodetool.constant",
      "description": "Represents a string constant in the workflow.\n    text, string, characters\n\n    Use cases:\n    - Provide fixed text inputs for processing\n    - Define labels, identifiers, or names\n    - Set default text values for configuration",
      "inputs": [
        {
          "name": "value",
          "type": "str",
          "description": "",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/constant/string",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/constant/string.md"
    },
    {
      "type": "nodetool.constant.TextList",
      "title": "Text List",
      "namespace": "nodetool.constant",
      "description": "Represents a list of text strings in the workflow.\n    texts, strings, text collection\n\n    Use cases:\n    - Provide a fixed list of text strings for batch processing\n    - Reference multiple text values in the workflow\n    - Set default text list for testing or demonstration purposes",
      "inputs": [
        {
          "name": "value",
          "type": "list[str]",
          "description": "List of text strings",
          "required": false,
          "default": null
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "list[str]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/constant/textlist",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/constant/textlist.md"
    },
    {
      "type": "nodetool.constant.Timeline",
      "title": "Timeline",
      "namespace": "nodetool.constant",
      "description": "References a timeline sequence in the workflow.\n    timeline, video editor, sequence, clips, tracks\n\n    Use cases:\n    - Pass a timeline between nodes for video rendering or editing\n    - Open and edit the referenced timeline in the timeline editor\n    - Provide a fixed timeline input for downstream nodes",
      "inputs": [
        {
          "name": "value",
          "type": "timeline",
          "description": "",
          "required": false,
          "default": {
            "type": "timeline",
            "id": null,
            "data": null
          }
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "timeline"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/constant/timeline",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/constant/timeline.md"
    },
    {
      "type": "nodetool.constant.TTSModelConstant",
      "title": "TTS Model Constant",
      "namespace": "nodetool.constant",
      "description": "Represents a text-to-speech model constant in the workflow.\n    tts, speech, voice, model, audio\n\n    Use cases:\n    - Provide a fixed TTS model for speech synthesis\n    - Set default TTS model for the workflow\n    - Configure model selection without user input",
      "inputs": [
        {
          "name": "value",
          "type": "tts_model",
          "description": "",
          "required": false,
          "default": null
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "tts_model"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/constant/ttsmodelconstant",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/constant/ttsmodelconstant.md"
    },
    {
      "type": "nodetool.constant.Video",
      "title": "Video",
      "namespace": "nodetool.constant",
      "description": "Represents a video file constant in the workflow.\n    video, movie, mp4, file\n\n    Use cases:\n    - Provide a fixed video input for video processing nodes\n    - Reference a specific video file in the workflow\n    - Set default video for testing or demonstration purposes",
      "inputs": [
        {
          "name": "value",
          "type": "video",
          "description": "",
          "required": false,
          "default": {
            "type": "video",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null,
            "duration": null,
            "format": null
          }
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "video"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/constant/video",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/constant/video.md"
    },
    {
      "type": "nodetool.constant.VideoList",
      "title": "Video List",
      "namespace": "nodetool.constant",
      "description": "Represents a list of video file constants in the workflow.\n    videos, movies, clips, collection\n\n    Use cases:\n    - Provide a fixed list of videos for batch processing\n    - Reference multiple video files in the workflow\n    - Set default video list for testing or demonstration purposes",
      "inputs": [
        {
          "name": "value",
          "type": "list[video]",
          "description": "List of video references",
          "required": false,
          "default": null
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "list[video]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/constant/videolist",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/constant/videolist.md"
    },
    {
      "type": "nodetool.constant.VideoModelConstant",
      "title": "Video Model Constant",
      "namespace": "nodetool.constant",
      "description": "Represents a video generation model constant in the workflow.\n    video, model, ai, generation\n\n    Use cases:\n    - Provide a fixed video model for generation\n    - Set default video model for the workflow\n    - Configure model selection without user input",
      "inputs": [
        {
          "name": "value",
          "type": "video_model",
          "description": "",
          "required": false,
          "default": null
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "video_model"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/constant/videomodelconstant",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/constant/videomodelconstant.md"
    },
    {
      "type": "nodetool.control.Chunk",
      "title": "Chunk",
      "namespace": "nodetool.control",
      "description": "Group every N items into a list and emit as a batch. Trailing partial batch is emitted at end of stream.\n    chunk, batch, group, window, buffer, stream\n\n    Use cases:\n    - Batched LLM/API calls without giving up streaming\n    - Window-based aggregation\n    - Group rows for bulk inserts",
      "inputs": [
        {
          "name": "input_item",
          "type": "any",
          "description": "Streaming input — items are buffered into batches of size N.",
          "required": false,
          "default": null
        },
        {
          "name": "size",
          "type": "int",
          "description": "Number of items per batch.",
          "required": false,
          "default": 10
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "list[any]"
        },
        {
          "name": "index",
          "type": "int"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/control/chunk",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/control/chunk.md"
    },
    {
      "type": "nodetool.control.Collect",
      "title": "Collect",
      "namespace": "nodetool.control",
      "description": "Collect items until the end of the stream and return them as a list.\n    collector, aggregate, list, stream\n\n    Use cases:\n    - Gather results from multiple processing steps\n    - Collect streaming data into batches\n    - Aggregate outputs from parallel operations",
      "inputs": [
        {
          "name": "input_item",
          "type": "any",
          "description": "The input item to collect.",
          "required": false,
          "default": []
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "list[any]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/control/collect",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/control/collect.md"
    },
    {
      "type": "nodetool.control.Collection",
      "title": "Asset Collection",
      "namespace": "nodetool.control",
      "description": "A curated collection of assets of a single type. Streams each item one at a time for downstream processing.\n    collection, gallery, assets, curate, pick, winners, iterator, stream, batch\n\n    Use cases:\n    - Hand-pick the best generations and feed them to the next step\n    - Gather assets dropped from the asset panel, files, or generation history\n    - Drive a downstream pipeline with a fixed set of media",
      "inputs": [
        {
          "name": "items",
          "type": "list[any]",
          "description": "",
          "required": false,
          "default": []
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "any"
        },
        {
          "name": "index",
          "type": "int"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/control/assetcollection",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/control/assetcollection.md"
    },
    {
      "type": "nodetool.control.Count",
      "title": "Count",
      "namespace": "nodetool.control",
      "description": "Emit the total number of items when the stream ends.\n    count, length, size, total, fold, stream\n\n    Use cases:\n    - Report how many items a pipeline produced\n    - Measure stream throughput without buffering items\n    - Avoid collecting just to call .length",
      "inputs": [
        {
          "name": "input_item",
          "type": "any",
          "description": "Streaming input — items are counted but not forwarded.",
          "required": false,
          "default": null
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "int"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/control/count",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/control/count.md"
    },
    {
      "type": "nodetool.control.Cross",
      "title": "Cross",
      "namespace": "nodetool.control",
      "description": "Emit the cartesian product of two iteration sources within their common parent.\n    cross, cartesian, product, combine, pairs, matrix, stream, iterate\n\n    Use cases:\n    - Generate every combination of two input sets\n    - Build a grid of parameter combinations\n    - Pair each item of one stream with all items of another",
      "inputs": [
        {
          "name": "left",
          "type": "any",
          "description": "Left iteration source.",
          "required": false,
          "default": null
        },
        {
          "name": "right",
          "type": "any",
          "description": "Right iteration source.",
          "required": false,
          "default": null
        },
        {
          "name": "max_output_count",
          "type": "int",
          "description": "Maximum number of pairs to emit. Buffering both sides without a cap can blow memory.",
          "required": false,
          "default": 1024
        }
      ],
      "outputs": [
        {
          "name": "left",
          "type": "any"
        },
        {
          "name": "right",
          "type": "any"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/control/cross",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/control/cross.md"
    },
    {
      "type": "nodetool.control.Distinct",
      "title": "Distinct",
      "namespace": "nodetool.control",
      "description": "Drop duplicate items from a stream. Optional key expression for grouping.\n    distinct, unique, dedup, deduplicate, stream, set\n\n    Use cases:\n    - Deduplicate URLs, ids, or records\n    - Keep only the first sighting of each value\n    - Field-based dedup with a key expression",
      "inputs": [
        {
          "name": "input_item",
          "type": "any",
          "description": "Streaming input — duplicate items are dropped.",
          "required": false,
          "default": null
        },
        {
          "name": "key",
          "type": "str",
          "description": "Optional JavaScript expression for the dedup key. The item is bound to `item`. Examples: `item.id`, `item.url`. Empty means use the whole item.",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "any"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/control/distinct",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/control/distinct.md"
    },
    {
      "type": "nodetool.control.Drop",
      "title": "Drop",
      "namespace": "nodetool.control",
      "description": "Skip the first N items of a stream, pass the rest through.\n    drop, skip, head, stream, slice, offset\n\n    Use cases:\n    - Skip headers or warm-up items in a stream\n    - Pagination-style offsets\n    - Drop the first record from a CSV-like feed",
      "inputs": [
        {
          "name": "input_item",
          "type": "any",
          "description": "Streaming input — items after the first N are forwarded.",
          "required": false,
          "default": null
        },
        {
          "name": "n",
          "type": "int",
          "description": "Number of items to drop from the head of the stream.",
          "required": false,
          "default": 1
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "any"
        },
        {
          "name": "index",
          "type": "int"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/control/drop",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/control/drop.md"
    },
    {
      "type": "nodetool.control.DropWhile",
      "title": "Drop While",
      "namespace": "nodetool.control",
      "description": "Drop items while a predicate is truthy, then pass everything after.\n    drop, skip, while, predicate, stream, suffix\n\n    Use cases:\n    - Skip leading whitespace, headers, or warm-up\n    - Wait for a stream to enter a steady state\n    - Predicate-based version of Drop(N)",
      "inputs": [
        {
          "name": "input_item",
          "type": "any",
          "description": "Streaming input.",
          "required": false,
          "default": null
        },
        {
          "name": "predicate",
          "type": "str",
          "description": "JavaScript expression evaluated per item. The current value is bound to `item`. Items are dropped until the predicate first returns falsy; everything after is passed through.",
          "required": false,
          "default": "false"
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "any"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/control/dropwhile",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/control/dropwhile.md"
    },
    {
      "type": "nodetool.control.FilterCode",
      "title": "Filter (Code)",
      "namespace": "nodetool.control",
      "description": "Pass items through when a JavaScript predicate returns truthy.\n    filter, predicate, code, javascript, expression, stream, where\n\n    Use cases:\n    - Keep items matching arbitrary criteria (e.g. item.score > 0.5)\n    - Drop empty or malformed records\n    - Custom field-based filtering",
      "inputs": [
        {
          "name": "input_item",
          "type": "any",
          "description": "Streaming input — each item is tested against the predicate.",
          "required": false,
          "default": null
        },
        {
          "name": "predicate",
          "type": "str",
          "description": "JavaScript expression evaluated per item. The current value is bound to `item`. Examples: `item > 0`, `item.score > 0.5`, `typeof item === 'string'`.",
          "required": false,
          "default": "true"
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "any"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/control/filtercode",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/control/filtercode.md"
    },
    {
      "type": "nodetool.control.FilterEqual",
      "title": "Filter Equal",
      "namespace": "nodetool.control",
      "description": "Pass items through only when they equal a target value.\n    filter, equal, match, predicate, stream, where\n\n    Use cases:\n    - Keep only items matching a status, label, or category\n    - Drop sentinel/null markers from a stream\n    - Select rows by an exact id",
      "inputs": [
        {
          "name": "input_item",
          "type": "any",
          "description": "Streaming input — items pass through if they equal the target value.",
          "required": false,
          "default": null
        },
        {
          "name": "value",
          "type": "any",
          "description": "Target value. Items deep-equal to this are passed through.",
          "required": false,
          "default": null
        },
        {
          "name": "invert",
          "type": "bool",
          "description": "When true, pass items NOT equal to the target value.",
          "required": false,
          "default": false
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "any"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/control/filterequal",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/control/filterequal.md"
    },
    {
      "type": "nodetool.control.ForEach",
      "title": "For Each",
      "namespace": "nodetool.control",
      "description": "Iterate over a list and emit each item sequentially.\n    iterator, loop, list, sequence, repeat, enumerate, stream, collection\n\n    Use cases:\n    - Process each item of a collection in order\n    - Drive downstream nodes with individual elements",
      "inputs": [
        {
          "name": "input_list",
          "type": "list[any]",
          "description": "The list of items to iterate over.",
          "required": false,
          "default": []
        },
        {
          "name": "limit",
          "type": "int",
          "description": "",
          "required": false,
          "default": -1
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "any"
        },
        {
          "name": "index",
          "type": "int"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/control/foreach",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/control/foreach.md"
    },
    {
      "type": "nodetool.control.If",
      "title": "If",
      "namespace": "nodetool.control",
      "description": "Conditionally executes one of two branches based on a condition.\n    control, flow, condition, logic, else, true, false, switch, toggle, flow-control\n\n    Use cases:\n    - Branch workflow based on conditions\n    - Handle different cases in data processing\n    - Implement decision logic",
      "inputs": [
        {
          "name": "condition",
          "type": "bool",
          "description": "The condition to evaluate",
          "required": false,
          "default": false
        },
        {
          "name": "value",
          "type": "any",
          "description": "The value to pass to the next node",
          "required": false,
          "default": []
        }
      ],
      "outputs": [
        {
          "name": "if_true",
          "type": "any"
        },
        {
          "name": "if_false",
          "type": "any"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/control/if",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/control/if.md"
    },
    {
      "type": "nodetool.control.Last",
      "title": "Last",
      "namespace": "nodetool.control",
      "description": "Emit only the final item of a stream.\n    last, final, tail, fold, stream, reduce\n\n    Use cases:\n    - Keep the final answer from an agent token stream\n    - Pick the most recent item in a feed\n    - Cheap fold to a single value",
      "inputs": [
        {
          "name": "input_item",
          "type": "any",
          "description": "Streaming input — only the final value is forwarded.",
          "required": false,
          "default": null
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "any"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/control/last",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/control/last.md"
    },
    {
      "type": "nodetool.control.RepeatCount",
      "title": "Repeat Count",
      "namespace": "nodetool.control",
      "description": "Emit N sequential ticks without needing an input list.\n    repeat, loop, count, times, iterate, batch\n\n    Use cases:\n    - Run the same downstream step N times (e.g. generate N images from one prompt)\n    - Drive iteration by count instead of building a range list\n    - Pair with Collect to gather N results",
      "inputs": [
        {
          "name": "count",
          "type": "int",
          "description": "Number of ticks to emit (0 emits nothing).",
          "required": false,
          "default": 1
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "int"
        },
        {
          "name": "index",
          "type": "int"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/control/repeatcount",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/control/repeatcount.md"
    },
    {
      "type": "nodetool.control.RepeatValue",
      "title": "Repeat Value",
      "namespace": "nodetool.control",
      "description": "Emit the same value N times without building a list first.\n    repeat, loop, duplicate, scalar, batch, stream\n\n    Use cases:\n    - Run downstream steps N times with a wired prompt or parameter\n    - Repeat one image ref, text, or dict through a pipeline\n    - Pair with Collect to gather N results",
      "inputs": [
        {
          "name": "value",
          "type": "any",
          "description": "Single value to emit on each tick.",
          "required": false,
          "default": null
        },
        {
          "name": "count",
          "type": "int",
          "description": "Number of times to emit the value (0 emits nothing).",
          "required": false,
          "default": 1
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "any"
        },
        {
          "name": "index",
          "type": "int"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/control/repeatvalue",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/control/repeatvalue.md"
    },
    {
      "type": "nodetool.control.Reroute",
      "title": "Reroute",
      "namespace": "nodetool.control",
      "description": "Pass data through unchanged for tidier workflow layouts.\n    reroute, passthrough, organize, tidy, flow, connection, redirect\n\n    Use cases:\n    - Organize complex workflows by routing connections\n    - Create cleaner visual layouts\n    - Redirect data flow without modification",
      "inputs": [
        {
          "name": "input_value",
          "type": "any",
          "description": "Value to pass through unchanged",
          "required": false,
          "default": []
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "any"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/control/reroute",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/control/reroute.md"
    },
    {
      "type": "nodetool.control.Switch",
      "title": "Switch",
      "namespace": "nodetool.control",
      "description": "Multi-branch routing: match a value against cases and route to the matching output.\n    control, switch, match, case, branch, route, multi-branch, flow-control\n\n    Use cases:\n    - Route data based on string/number matching\n    - Implement multi-way branching logic\n    - Replace chains of If nodes",
      "inputs": [
        {
          "name": "value",
          "type": "any",
          "description": "The value to match against cases.",
          "required": false,
          "default": ""
        },
        {
          "name": "cases",
          "type": "list[any]",
          "description": "List of values to match against. The first match wins.",
          "required": false,
          "default": []
        },
        {
          "name": "input",
          "type": "any",
          "description": "The data to route to the matched output.",
          "required": false,
          "default": null
        }
      ],
      "outputs": [
        {
          "name": "matched",
          "type": "any"
        },
        {
          "name": "default",
          "type": "any"
        },
        {
          "name": "index",
          "type": "int"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/control/switch",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/control/switch.md"
    },
    {
      "type": "nodetool.control.Take",
      "title": "Take",
      "namespace": "nodetool.control",
      "description": "Pass through the first N items of a stream and stop.\n    take, head, limit, first, stream, slice, sample, truncate\n\n    Use cases:\n    - Test a pipeline on a small subset of inputs\n    - Cap expensive downstream work at N items\n    - Implement \"first N matches\" semantics over a stream",
      "inputs": [
        {
          "name": "input_item",
          "type": "any",
          "description": "Streaming input — each item is forwarded until the limit is reached.",
          "required": false,
          "default": null
        },
        {
          "name": "n",
          "type": "int",
          "description": "Number of items to take from the head of the stream.",
          "required": false,
          "default": 1
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "any"
        },
        {
          "name": "index",
          "type": "int"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/control/take",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/control/take.md"
    },
    {
      "type": "nodetool.control.TakeWhile",
      "title": "Take While",
      "namespace": "nodetool.control",
      "description": "Pass items through while a predicate is truthy. Stops at the first failure.\n    take, while, predicate, stream, prefix\n\n    Use cases:\n    - Stream until a sentinel/terminator is reached\n    - Process items while a confidence threshold holds\n    - Cleaner than counting when N is unknown up front",
      "inputs": [
        {
          "name": "input_item",
          "type": "any",
          "description": "Streaming input.",
          "required": false,
          "default": null
        },
        {
          "name": "predicate",
          "type": "str",
          "description": "JavaScript expression evaluated per item. The current value is bound to `item`. Stream stops at the first item where the predicate is falsy.",
          "required": false,
          "default": "true"
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "any"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/control/takewhile",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/control/takewhile.md"
    },
    {
      "type": "nodetool.control.Tap",
      "title": "Tap",
      "namespace": "nodetool.control",
      "description": "Passthrough that logs each item to the console as a side effect.\n    tap, log, debug, inspect, peek, side-effect, stream\n\n    Use cases:\n    - Inspect a streaming pipeline without altering it\n    - Add lightweight per-item logging\n    - Debug intermediate stages of a workflow",
      "inputs": [
        {
          "name": "input_item",
          "type": "any",
          "description": "Streaming input — forwarded unchanged after logging.",
          "required": false,
          "default": null
        },
        {
          "name": "label",
          "type": "str",
          "description": "Label printed alongside each logged item.",
          "required": false,
          "default": "tap"
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "any"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/control/tap",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/control/tap.md"
    },
    {
      "type": "nodetool.control.TryCatch",
      "title": "Try / Catch",
      "namespace": "nodetool.control",
      "description": "Fallback wrapper: passes the value through when present, or emits the fallback with error info when the value is null/undefined (e.g. an upstream step produced nothing).\n    control, error, fallback, default, null, missing, flow-control\n\n    Use cases:\n    - Provide fallback values when an upstream step produced no value\n    - Detect missing values in workflows\n    - Log error details for debugging",
      "inputs": [
        {
          "name": "value",
          "type": "any",
          "description": "The value to pass through. When null/undefined, the fallback is used.",
          "required": false,
          "default": null
        },
        {
          "name": "fallback",
          "type": "any",
          "description": "Value to return when the input value is null/undefined.",
          "required": false,
          "default": null
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "any"
        },
        {
          "name": "error",
          "type": "str"
        },
        {
          "name": "has_error",
          "type": "bool"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/control/trycatch",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/control/trycatch.md"
    },
    {
      "type": "nodetool.control.Zip",
      "title": "Zip",
      "namespace": "nodetool.control",
      "description": "Pair items from two independent iteration sources by matched index within the common parent.\n    zip, pair, combine, merge, join, index, stream, iterate\n\n    Use cases:\n    - Combine matching items from two parallel streams\n    - Pair inputs and outputs by position\n    - Merge two iteration sources into tuples",
      "inputs": [
        {
          "name": "left",
          "type": "any",
          "description": "Left iteration source.",
          "required": false,
          "default": null
        },
        {
          "name": "right",
          "type": "any",
          "description": "Right iteration source.",
          "required": false,
          "default": null
        },
        {
          "name": "max_unmatched_pairs",
          "type": "int",
          "description": "Maximum number of unmatched items to buffer before failing. §7.",
          "required": false,
          "default": 1024
        }
      ],
      "outputs": [
        {
          "name": "left",
          "type": "any"
        },
        {
          "name": "right",
          "type": "any"
        },
        {
          "name": "index",
          "type": "int"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/control/zip",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/control/zip.md"
    },
    {
      "type": "nodetool.data.AddColumn",
      "title": "Add Column",
      "namespace": "nodetool.data",
      "description": "Add list of values as new column to dataframe.\n    dataframe, column, list\n\n    Use cases:\n    - Incorporate external data into existing dataframe\n    - Add calculated results as new column\n    - Augment dataframe with additional features",
      "inputs": [
        {
          "name": "dataframe",
          "type": "dataframe",
          "description": "Dataframe object to add a new column to.",
          "required": false,
          "default": {
            "type": "dataframe",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null,
            "columns": null
          }
        },
        {
          "name": "column_name",
          "type": "str",
          "description": "The name of the new column to be added to the dataframe.",
          "required": false,
          "default": ""
        },
        {
          "name": "values",
          "type": "list[any]",
          "description": "A list of any type of elements which will be the new column's values.",
          "required": false,
          "default": []
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "dataframe"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/data/addcolumn",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/data/addcolumn.md"
    },
    {
      "type": "nodetool.data.Aggregate",
      "title": "Aggregate",
      "namespace": "nodetool.data",
      "description": "Aggregate dataframe by one or more columns.\n    aggregate, groupby, group, sum, mean, count, min, max, std, var, median, first, last\n\n    Use cases:\n    - Prepare data for aggregation operations\n    - Analyze data by categories\n    - Create summary statistics by groups",
      "inputs": [
        {
          "name": "dataframe",
          "type": "dataframe",
          "description": "The DataFrame to group.",
          "required": false,
          "default": {
            "type": "dataframe",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null,
            "columns": null
          }
        },
        {
          "name": "columns",
          "type": "str",
          "description": "Comma-separated column names to group by.",
          "required": false,
          "default": ""
        },
        {
          "name": "aggregation",
          "type": "str",
          "description": "Aggregation function: sum, mean, count, min, max, std, var, median, first, last",
          "required": false,
          "default": "sum"
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "dataframe"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/data/aggregate",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/data/aggregate.md"
    },
    {
      "type": "nodetool.data.Append",
      "title": "Append",
      "namespace": "nodetool.data",
      "description": "Append two dataframes along rows.\n    append, concat, rows\n\n    Use cases:\n    - Combine data from multiple time periods\n    - Merge datasets with same structure\n    - Aggregate data from different sources",
      "inputs": [
        {
          "name": "dataframe_a",
          "type": "dataframe",
          "description": "First DataFrame to be appended.",
          "required": false,
          "default": {
            "type": "dataframe",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null,
            "columns": null
          }
        },
        {
          "name": "dataframe_b",
          "type": "dataframe",
          "description": "Second DataFrame to be appended.",
          "required": false,
          "default": {
            "type": "dataframe",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null,
            "columns": null
          }
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "dataframe"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/data/append",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/data/append.md"
    },
    {
      "type": "nodetool.data.Describe",
      "title": "Describe",
      "namespace": "nodetool.data",
      "description": "Compute summary statistics for each numeric column: count, mean, std, min, 25%, 50%, 75%, max.\n    dataframe, statistics, describe, summary, stats, mean, std, min, max, quartile",
      "inputs": [
        {
          "name": "dataframe",
          "type": "dataframe",
          "description": "The dataframe to describe.",
          "required": false,
          "default": {
            "rows": []
          }
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "dataframe"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/data/describe",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/data/describe.md"
    },
    {
      "type": "nodetool.data.DropDuplicates",
      "title": "Drop Duplicates",
      "namespace": "nodetool.data",
      "description": "Remove duplicate rows from dataframe.\n    duplicates, unique, clean\n\n    Use cases:\n    - Clean dataset by removing redundant entries\n    - Ensure data integrity in analysis\n    - Prepare data for unique value operations",
      "inputs": [
        {
          "name": "df",
          "type": "dataframe",
          "description": "The input DataFrame.",
          "required": false,
          "default": {
            "type": "dataframe",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null,
            "columns": null
          }
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "dataframe"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/data/dropduplicates",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/data/dropduplicates.md"
    },
    {
      "type": "nodetool.data.DropNA",
      "title": "Drop NA",
      "namespace": "nodetool.data",
      "description": "Remove rows with NA values from dataframe.\n    na, missing, clean\n\n    Use cases:\n    - Clean dataset by removing incomplete entries\n    - Prepare data for analysis requiring complete cases\n    - Improve data quality for modeling",
      "inputs": [
        {
          "name": "df",
          "type": "dataframe",
          "description": "The input DataFrame.",
          "required": false,
          "default": {
            "type": "dataframe",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null,
            "columns": null
          }
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "dataframe"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/data/dropna",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/data/dropna.md"
    },
    {
      "type": "nodetool.data.ExtractColumn",
      "title": "Extract Column",
      "namespace": "nodetool.data",
      "description": "Convert dataframe column to list.\n    dataframe, column, list\n\n    Use cases:\n    - Extract data for use in other processing steps\n    - Prepare column data for plotting or analysis\n    - Convert categorical data to list for encoding",
      "inputs": [
        {
          "name": "dataframe",
          "type": "dataframe",
          "description": "The input dataframe.",
          "required": false,
          "default": {
            "type": "dataframe",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null,
            "columns": null
          }
        },
        {
          "name": "column_name",
          "type": "str",
          "description": "The name of the column to be converted to a list.",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "list[any]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/data/extractcolumn",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/data/extractcolumn.md"
    },
    {
      "type": "nodetool.data.FillNA",
      "title": "Fill NA",
      "namespace": "nodetool.data",
      "description": "Fill missing values in dataframe.\n    fillna, missing, impute\n\n    Use cases:\n    - Handle missing data\n    - Prepare data for analysis\n    - Improve data quality",
      "inputs": [
        {
          "name": "dataframe",
          "type": "dataframe",
          "description": "The DataFrame with missing values.",
          "required": false,
          "default": {
            "type": "dataframe",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null,
            "columns": null
          }
        },
        {
          "name": "value",
          "type": "any",
          "description": "Value to use for filling missing values.",
          "required": false,
          "default": 0
        },
        {
          "name": "method",
          "type": "str",
          "description": "Method for filling: value, forward, backward, mean, median",
          "required": false,
          "default": "value"
        },
        {
          "name": "columns",
          "type": "str",
          "description": "Comma-separated column names to fill. Leave empty for all columns.",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "dataframe"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/data/fillna",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/data/fillna.md"
    },
    {
      "type": "nodetool.data.Filter",
      "title": "Filter",
      "namespace": "nodetool.data",
      "description": "Filter dataframe based on condition.\n    filter, query, condition\n\n    Example conditions:\n    age > 30\n    age > 30 and salary < 50000\n    name == 'John Doe'\n    100 <= price <= 200\n    status in ['Active', 'Pending']\n    not (age < 18)\n\n    Use cases:\n    - Extract subset of data meeting specific criteria\n    - Remove outliers or invalid data points\n    - Focus analysis on relevant data segments",
      "inputs": [
        {
          "name": "df",
          "type": "dataframe",
          "description": "The DataFrame to filter.",
          "required": false,
          "default": {
            "type": "dataframe",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null,
            "columns": null
          }
        },
        {
          "name": "condition",
          "type": "str",
          "description": "The filtering condition to be applied to the DataFrame, e.g. column_name > 5.",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "dataframe"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/data/filter",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/data/filter.md"
    },
    {
      "type": "nodetool.data.FilterNone",
      "title": "Filter None",
      "namespace": "nodetool.data",
      "description": "Filters out None values from a stream.\n    filter, none, null, stream\n\n    Use cases:\n    - Clean data by removing null values\n    - Get only valid entries\n    - Remove placeholder values",
      "inputs": [
        {
          "name": "value",
          "type": "any",
          "description": "Input stream",
          "required": false,
          "default": []
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "any"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/data/filternone",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/data/filternone.md"
    },
    {
      "type": "nodetool.data.FindRow",
      "title": "Find Row",
      "namespace": "nodetool.data",
      "description": "Find the first row in a dataframe that matches a given condition.\n    filter, query, condition, single row\n\n    Example conditions:\n    age > 30\n    age > 30 and salary < 50000\n    name == 'John Doe'\n    100 <= price <= 200\n    status in ['Active', 'Pending']\n    not (age < 18)\n\n    Use cases:\n    - Retrieve specific record based on criteria\n    - Find first occurrence of a particular condition\n    - Extract single data point for further analysis",
      "inputs": [
        {
          "name": "df",
          "type": "dataframe",
          "description": "The DataFrame to search.",
          "required": false,
          "default": {
            "type": "dataframe",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null,
            "columns": null
          }
        },
        {
          "name": "condition",
          "type": "str",
          "description": "The condition to filter the DataFrame, e.g. 'column_name == value'.",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "dataframe"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/data/findrow",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/data/findrow.md"
    },
    {
      "type": "nodetool.data.ForEachRow",
      "title": "For Each Row",
      "namespace": "nodetool.data",
      "description": "Iterate over rows of a dataframe.\n    iterator, loop, dataframe, sequence, rows\n\n    Use cases:\n    - Process each row of a dataframe individually\n    - Trigger actions for every record in a dataset",
      "inputs": [
        {
          "name": "dataframe",
          "type": "dataframe",
          "description": "The input dataframe.",
          "required": false,
          "default": {
            "type": "dataframe",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null,
            "columns": null
          }
        }
      ],
      "outputs": [
        {
          "name": "row",
          "type": "dict"
        },
        {
          "name": "index",
          "type": "any"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/data/foreachrow",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/data/foreachrow.md"
    },
    {
      "type": "nodetool.data.FromList",
      "title": "From List",
      "namespace": "nodetool.data",
      "description": "Convert list of dicts to dataframe.\n    list, dataframe, convert\n\n    Use cases:\n    - Transform list data into structured dataframe\n    - Prepare list data for analysis or visualization\n    - Convert API responses to dataframe format",
      "inputs": [
        {
          "name": "values",
          "type": "list[any]",
          "description": "List of values to be converted, each value will be a row.",
          "required": false,
          "default": []
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "dataframe"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/data/fromlist",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/data/fromlist.md"
    },
    {
      "type": "nodetool.data.ImportCSV",
      "title": "Import CSV",
      "namespace": "nodetool.data",
      "description": "Convert CSV string to dataframe.\n    csv, dataframe, import\n\n    Use cases:\n    - Import CSV data from string input\n    - Convert CSV responses from APIs to dataframe",
      "inputs": [
        {
          "name": "csv_data",
          "type": "str",
          "description": "String input of CSV formatted text.",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "dataframe"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/data/importcsv",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/data/importcsv.md"
    },
    {
      "type": "nodetool.data.Join",
      "title": "Join",
      "namespace": "nodetool.data",
      "description": "Join two dataframes on specified column.\n    join, merge, column\n\n    Use cases:\n    - Combine data from related tables\n    - Enrich dataset with additional information\n    - Link data based on common identifiers",
      "inputs": [
        {
          "name": "dataframe_a",
          "type": "dataframe",
          "description": "First DataFrame to be merged.",
          "required": false,
          "default": {
            "type": "dataframe",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null,
            "columns": null
          }
        },
        {
          "name": "dataframe_b",
          "type": "dataframe",
          "description": "Second DataFrame to be merged.",
          "required": false,
          "default": {
            "type": "dataframe",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null,
            "columns": null
          }
        },
        {
          "name": "join_on",
          "type": "str",
          "description": "The column name on which to join the two dataframes.",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "dataframe"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/data/join",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/data/join.md"
    },
    {
      "type": "nodetool.data.JSONToDataframe",
      "title": "Convert JSON to DataFrame",
      "namespace": "nodetool.data",
      "description": "Transforms a JSON string into a pandas DataFrame.\n    json, dataframe, conversion\n\n    Use cases:\n    - Converting API responses to tabular format\n    - Preparing JSON data for analysis or visualization\n    - Structuring unstructured JSON data for further processing",
      "inputs": [
        {
          "name": "text",
          "type": "str",
          "description": "",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "dataframe"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/data/convertjsontodataframe",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/data/convertjsontodataframe.md"
    },
    {
      "type": "nodetool.data.LoadCSVAssets",
      "title": "Load CSV Assets",
      "namespace": "nodetool.data",
      "description": "Load dataframes from an asset folder.\n    load, dataframe, file, import\n\n    Use cases:\n    - Load multiple dataframes from a folder\n    - Process multiple datasets in sequence\n    - Batch import of data files",
      "inputs": [
        {
          "name": "folder",
          "type": "folder",
          "description": "The asset folder to load the dataframes from.",
          "required": false,
          "default": {
            "type": "folder",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        }
      ],
      "outputs": [
        {
          "name": "dataframe",
          "type": "dataframe"
        },
        {
          "name": "name",
          "type": "str"
        },
        {
          "name": "dataframes",
          "type": "list"
        },
        {
          "name": "names",
          "type": "list"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/data/loadcsvassets",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/data/loadcsvassets.md"
    },
    {
      "type": "nodetool.data.LoadCSVFile",
      "title": "Load CSVFile",
      "namespace": "nodetool.data",
      "description": "Load CSV file from file path.\n    csv, dataframe, import",
      "inputs": [
        {
          "name": "file_path",
          "type": "str",
          "description": "The path to the CSV file to load.",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "dataframe"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/data/loadcsvfile",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/data/loadcsvfile.md"
    },
    {
      "type": "nodetool.data.LoadCSVURL",
      "title": "Load CSVURL",
      "namespace": "nodetool.data",
      "description": "Load CSV file from URL.\n    csv, dataframe, import",
      "inputs": [
        {
          "name": "url",
          "type": "str",
          "description": "The URL of the CSV file to load.",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "dataframe"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/data/loadcsvurl",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/data/loadcsvurl.md"
    },
    {
      "type": "nodetool.data.Merge",
      "title": "Merge",
      "namespace": "nodetool.data",
      "description": "Merge two dataframes along columns.\n    merge, concat, columns\n\n    Use cases:\n    - Combine data from multiple sources\n    - Add new features to existing dataframe\n    - Merge time series data from different periods",
      "inputs": [
        {
          "name": "dataframe_a",
          "type": "dataframe",
          "description": "First DataFrame to be merged.",
          "required": false,
          "default": {
            "type": "dataframe",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null,
            "columns": null
          }
        },
        {
          "name": "dataframe_b",
          "type": "dataframe",
          "description": "Second DataFrame to be merged.",
          "required": false,
          "default": {
            "type": "dataframe",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null,
            "columns": null
          }
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "dataframe"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/data/merge",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/data/merge.md"
    },
    {
      "type": "nodetool.data.Pivot",
      "title": "Pivot",
      "namespace": "nodetool.data",
      "description": "Pivot dataframe to reshape data.\n    pivot, reshape, transform\n\n    Use cases:\n    - Transform long data to wide format\n    - Create cross-tabulation tables\n    - Reorganize data for visualization",
      "inputs": [
        {
          "name": "dataframe",
          "type": "dataframe",
          "description": "The DataFrame to pivot.",
          "required": false,
          "default": {
            "type": "dataframe",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null,
            "columns": null
          }
        },
        {
          "name": "index",
          "type": "str",
          "description": "Column name to use as index (rows).",
          "required": false,
          "default": ""
        },
        {
          "name": "columns",
          "type": "str",
          "description": "Column name to use as columns.",
          "required": false,
          "default": ""
        },
        {
          "name": "values",
          "type": "str",
          "description": "Column name to use as values.",
          "required": false,
          "default": ""
        },
        {
          "name": "aggfunc",
          "type": "str",
          "description": "Aggregation function: sum, mean, count, min, max, first, last",
          "required": false,
          "default": "sum"
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "dataframe"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/data/pivot",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/data/pivot.md"
    },
    {
      "type": "nodetool.data.Rename",
      "title": "Rename",
      "namespace": "nodetool.data",
      "description": "Rename columns in dataframe.\n    rename, columns, names\n\n    Use cases:\n    - Standardize column names\n    - Make column names more descriptive\n    - Prepare data for specific requirements",
      "inputs": [
        {
          "name": "dataframe",
          "type": "dataframe",
          "description": "The DataFrame to rename columns.",
          "required": false,
          "default": {
            "type": "dataframe",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null,
            "columns": null
          }
        },
        {
          "name": "rename_map",
          "type": "str",
          "description": "Column rename mapping in format: old1:new1,old2:new2",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "dataframe"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/data/rename",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/data/rename.md"
    },
    {
      "type": "nodetool.data.SaveCSVDataframeFile",
      "title": "Save CSVDataframe File",
      "namespace": "nodetool.data",
      "description": "Write a pandas DataFrame to a CSV file.\n    files, csv, write, output, save, file\n\n    The filename can include time and date variables:\n    %Y - Year, %m - Month, %d - Day\n    %H - Hour, %M - Minute, %S - Second",
      "inputs": [
        {
          "name": "dataframe",
          "type": "dataframe",
          "description": "DataFrame to write to CSV",
          "required": false,
          "default": {
            "type": "dataframe",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null,
            "columns": null
          }
        },
        {
          "name": "folder",
          "type": "str",
          "description": "Folder where the file will be saved",
          "required": false,
          "default": ""
        },
        {
          "name": "filename",
          "type": "str",
          "description": "Name of the CSV file to save. Supports strftime format codes.",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "dataframe"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/data/savecsvdataframefile",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/data/savecsvdataframefile.md"
    },
    {
      "type": "nodetool.data.SaveDataframe",
      "title": "Save Dataframe",
      "namespace": "nodetool.data",
      "description": "Save dataframe in specified folder.\n    csv, folder, save\n\n    Use cases:\n    - Export processed data for external use\n    - Create backups of dataframes",
      "inputs": [
        {
          "name": "df",
          "type": "dataframe",
          "description": "",
          "required": false,
          "default": {
            "type": "dataframe",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null,
            "columns": null
          }
        },
        {
          "name": "folder",
          "type": "folder",
          "description": "Name of the output folder.",
          "required": false,
          "default": {
            "type": "folder",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "name",
          "type": "str",
          "description": "\n        Name of the output file.\n        You can use time and date variables to create unique names:\n        %Y - Year\n        %m - Month\n        %d - Day\n        %H - Hour\n        %M - Minute\n        %S - Second\n        ",
          "required": false,
          "default": "output.csv"
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "dataframe"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/data/savedataframe",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/data/savedataframe.md"
    },
    {
      "type": "nodetool.data.Schema",
      "title": "Schema",
      "namespace": "nodetool.data",
      "description": "Define a schema for a dataframe.\n    schema, dataframe, create",
      "inputs": [
        {
          "name": "columns",
          "type": "record_type",
          "description": "The columns to use in the dataframe.",
          "required": false,
          "default": {
            "type": "record_type",
            "columns": []
          }
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "record_type"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/data/schema",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/data/schema.md"
    },
    {
      "type": "nodetool.data.SelectColumn",
      "title": "Select Column",
      "namespace": "nodetool.data",
      "description": "Select specific columns from dataframe.\n    dataframe, columns, filter\n\n    Use cases:\n    - Extract relevant features for analysis\n    - Reduce dataframe size by removing unnecessary columns\n    - Prepare data for specific visualizations or models",
      "inputs": [
        {
          "name": "dataframe",
          "type": "dataframe",
          "description": "a dataframe from which columns are to be selected",
          "required": false,
          "default": {
            "type": "dataframe",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null,
            "columns": null
          }
        },
        {
          "name": "columns",
          "type": "str",
          "description": "comma separated list of column names",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "dataframe"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/data/selectcolumn",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/data/selectcolumn.md"
    },
    {
      "type": "nodetool.data.Slice",
      "title": "Slice",
      "namespace": "nodetool.data",
      "description": "Slice a dataframe by rows using start and end indices.\n    slice, subset, rows\n\n    Use cases:\n    - Extract a specific range of rows from a large dataset\n    - Create training and testing subsets for machine learning\n    - Analyze data in smaller chunks",
      "inputs": [
        {
          "name": "dataframe",
          "type": "dataframe",
          "description": "The input dataframe to be sliced.",
          "required": false,
          "default": {
            "type": "dataframe",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null,
            "columns": null
          }
        },
        {
          "name": "start_index",
          "type": "int",
          "description": "The starting index of the slice (inclusive).",
          "required": false,
          "default": 0
        },
        {
          "name": "end_index",
          "type": "int",
          "description": "The ending index of the slice (exclusive). Use -1 to slice through the end; other negative values count back from the end (e.g. -2 drops the last two rows).",
          "required": false,
          "default": -1
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "dataframe"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/data/slice",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/data/slice.md"
    },
    {
      "type": "nodetool.data.SortByColumn",
      "title": "Sort By Column",
      "namespace": "nodetool.data",
      "description": "Sort dataframe by specified column.\n    sort, order, column\n\n    Use cases:\n    - Arrange data in ascending or descending order\n    - Identify top or bottom values in dataset\n    - Prepare data for rank-based analysis",
      "inputs": [
        {
          "name": "df",
          "type": "dataframe",
          "description": "",
          "required": false,
          "default": {
            "type": "dataframe",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null,
            "columns": null
          }
        },
        {
          "name": "column",
          "type": "str",
          "description": "The column to sort the DataFrame by.",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "dataframe"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/data/sortbycolumn",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/data/sortbycolumn.md"
    },
    {
      "type": "nodetool.data.ToList",
      "title": "To List",
      "namespace": "nodetool.data",
      "description": "Convert dataframe to list of dictionaries.\n    dataframe, list, convert\n\n    Use cases:\n    - Convert dataframe data for API consumption\n    - Transform data for JSON serialization\n    - Prepare data for document-based storage",
      "inputs": [
        {
          "name": "dataframe",
          "type": "dataframe",
          "description": "The input dataframe to convert.",
          "required": false,
          "default": {
            "type": "dataframe",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null,
            "columns": null
          }
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "list[dict]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/data/tolist",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/data/tolist.md"
    },
    {
      "type": "nodetool.document.ListDocuments",
      "title": "List Documents",
      "namespace": "nodetool.document",
      "description": "List documents in a directory.\n    files, list, directory",
      "inputs": [
        {
          "name": "folder",
          "type": "str",
          "description": "Directory to scan",
          "required": false,
          "default": "~"
        },
        {
          "name": "pattern",
          "type": "str",
          "description": "File pattern to match (e.g. *.txt)",
          "required": false,
          "default": "*"
        },
        {
          "name": "recursive",
          "type": "bool",
          "description": "Search subdirectories",
          "required": false,
          "default": false
        }
      ],
      "outputs": [
        {
          "name": "document",
          "type": "document"
        },
        {
          "name": "documents",
          "type": "list"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/document/listdocuments",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/document/listdocuments.md"
    },
    {
      "type": "nodetool.document.LoadDocumentFile",
      "title": "Load Document File",
      "namespace": "nodetool.document",
      "description": "Read a document from disk.\n    files, document, read, input, load, file",
      "inputs": [
        {
          "name": "path",
          "type": "str",
          "description": "Path to the document to read",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "document"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/document/loaddocumentfile",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/document/loaddocumentfile.md"
    },
    {
      "type": "nodetool.document.SaveDocumentFile",
      "title": "Save Document File",
      "namespace": "nodetool.document",
      "description": "Write a document to disk.\n    files, document, write, output, save, file\n\n    The filename can include time and date variables:\n    %Y - Year, %m - Month, %d - Day\n    %H - Hour, %M - Minute, %S - Second",
      "inputs": [
        {
          "name": "document",
          "type": "document",
          "description": "The document to save",
          "required": false,
          "default": {
            "type": "document",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "folder",
          "type": "str",
          "description": "Folder where the file will be saved",
          "required": false,
          "default": ""
        },
        {
          "name": "filename",
          "type": "str",
          "description": "Name of the file to save. Supports strftime format codes.",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/document/savedocumentfile",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/document/savedocumentfile.md"
    },
    {
      "type": "nodetool.document.SplitDocument",
      "title": "Split Document",
      "namespace": "nodetool.document",
      "description": "Split text semantically.\n    chroma, embedding, collection, RAG, index, text, markdown, semantic",
      "inputs": [
        {
          "name": "embed_model",
          "type": "language_model",
          "description": "Embedding model to use",
          "required": false,
          "default": {
            "type": "language_model",
            "provider": "ollama",
            "id": "embeddinggemma",
            "name": "",
            "path": null,
            "supported_tasks": []
          }
        },
        {
          "name": "document",
          "type": "document",
          "description": "Document ID to associate with the text content",
          "required": false,
          "default": {
            "type": "document",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "buffer_size",
          "type": "int",
          "description": "Buffer size for semantic splitting",
          "required": false,
          "default": 1
        },
        {
          "name": "threshold",
          "type": "int",
          "description": "Breakpoint percentile threshold for semantic splitting",
          "required": false,
          "default": 95
        }
      ],
      "outputs": [
        {
          "name": "text",
          "type": "str"
        },
        {
          "name": "source_id",
          "type": "str"
        },
        {
          "name": "start_index",
          "type": "int"
        },
        {
          "name": "chunks",
          "type": "list"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/document/splitdocument",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/document/splitdocument.md"
    },
    {
      "type": "nodetool.document.SplitHTML",
      "title": "Split HTML",
      "namespace": "nodetool.document",
      "description": "Split HTML content into semantic chunks based on HTML tags.\n    html, text, semantic, tags, parsing",
      "inputs": [
        {
          "name": "document",
          "type": "document",
          "description": "Document ID to associate with the HTML content",
          "required": false,
          "default": {
            "type": "document",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        }
      ],
      "outputs": [
        {
          "name": "text",
          "type": "str"
        },
        {
          "name": "source_id",
          "type": "str"
        },
        {
          "name": "start_index",
          "type": "int"
        },
        {
          "name": "chunks",
          "type": "list"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/document/splithtml",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/document/splithtml.md"
    },
    {
      "type": "nodetool.document.SplitJSON",
      "title": "Split JSON",
      "namespace": "nodetool.document",
      "description": "Split JSON content into semantic chunks.\n    json, parsing, semantic, structured",
      "inputs": [
        {
          "name": "document",
          "type": "document",
          "description": "Document ID to associate with the JSON content",
          "required": false,
          "default": {
            "type": "document",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "include_metadata",
          "type": "bool",
          "description": "Whether to include metadata in nodes",
          "required": false,
          "default": true
        },
        {
          "name": "include_prev_next_rel",
          "type": "bool",
          "description": "Whether to include prev/next relationships",
          "required": false,
          "default": true
        }
      ],
      "outputs": [
        {
          "name": "text",
          "type": "str"
        },
        {
          "name": "source_id",
          "type": "str"
        },
        {
          "name": "start_index",
          "type": "int"
        },
        {
          "name": "chunks",
          "type": "list"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/document/splitjson",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/document/splitjson.md"
    },
    {
      "type": "nodetool.document.SplitMarkdown",
      "title": "Split Markdown",
      "namespace": "nodetool.document",
      "description": "Splits markdown text by headers while preserving header hierarchy in metadata.\n    markdown, split, headers\n\n    Use cases:\n    - Splitting markdown documentation while preserving structure\n    - Processing markdown files for semantic search\n    - Creating context-aware chunks from markdown content",
      "inputs": [
        {
          "name": "document",
          "type": "document",
          "description": "",
          "required": false,
          "default": {
            "type": "document",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "headers_to_split_on",
          "type": "list[tuple[str, str]]",
          "description": "List of tuples containing (header_symbol, header_name)",
          "required": false,
          "default": [
            [
              "#",
              "Header 1"
            ],
            [
              "##",
              "Header 2"
            ],
            [
              "###",
              "Header 3"
            ]
          ]
        },
        {
          "name": "strip_headers",
          "type": "bool",
          "description": "Whether to remove headers from the output content",
          "required": false,
          "default": true
        },
        {
          "name": "return_each_line",
          "type": "bool",
          "description": "Whether to split into individual lines instead of header sections",
          "required": false,
          "default": false
        },
        {
          "name": "chunk_size",
          "type": "int",
          "description": "Optional maximum chunk size for further splitting",
          "required": false,
          "default": 1000
        },
        {
          "name": "chunk_overlap",
          "type": "int",
          "description": "Overlap size when using chunk_size",
          "required": false,
          "default": 30
        }
      ],
      "outputs": [
        {
          "name": "text",
          "type": "str"
        },
        {
          "name": "source_id",
          "type": "str"
        },
        {
          "name": "start_index",
          "type": "int"
        },
        {
          "name": "chunks",
          "type": "list"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/document/splitmarkdown",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/document/splitmarkdown.md"
    },
    {
      "type": "nodetool.document.SplitRecursively",
      "title": "Split Recursively",
      "namespace": "nodetool.document",
      "description": "Splits text recursively using LangChain's RecursiveCharacterTextSplitter.\n    text, split, chunks\n\n    Use cases:\n    - Splitting documents while preserving semantic relationships\n    - Creating chunks for language model processing\n    - Handling text in languages with/without word boundaries",
      "inputs": [
        {
          "name": "document",
          "type": "document",
          "description": "",
          "required": false,
          "default": {
            "type": "document",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "chunk_size",
          "type": "int",
          "description": "Maximum size of each chunk in characters",
          "required": false,
          "default": 1000
        },
        {
          "name": "chunk_overlap",
          "type": "int",
          "description": "Number of characters to overlap between chunks",
          "required": false,
          "default": 200
        },
        {
          "name": "separators",
          "type": "list[str]",
          "description": "List of separators to use for splitting, in order of preference",
          "required": false,
          "default": [
            "\n\n",
            "\n",
            "."
          ]
        }
      ],
      "outputs": [
        {
          "name": "text",
          "type": "str"
        },
        {
          "name": "source_id",
          "type": "str"
        },
        {
          "name": "start_index",
          "type": "int"
        },
        {
          "name": "chunks",
          "type": "list"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/document/splitrecursively",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/document/splitrecursively.md"
    },
    {
      "type": "nodetool.fake.ColorGrade",
      "title": "Color Grade (browser)",
      "namespace": "nodetool.fake",
      "description": "",
      "inputs": [
        {
          "name": "image",
          "type": "image",
          "description": "Source image to grade.",
          "required": true
        },
        {
          "name": "hue",
          "type": "float",
          "description": "",
          "required": false,
          "default": 0
        },
        {
          "name": "saturation",
          "type": "float",
          "description": "",
          "required": false,
          "default": 100
        },
        {
          "name": "brightness",
          "type": "float",
          "description": "",
          "required": false,
          "default": 100
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/fake/colorgradebrowser",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/fake/colorgradebrowser.md"
    },
    {
      "type": "nodetool.fake.GenerateImage",
      "title": "Fake Generate Image",
      "namespace": "nodetool.fake",
      "description": "",
      "inputs": [
        {
          "name": "prompt",
          "type": "str",
          "description": "Describes the image. Seeds the placeholder; no real model runs.",
          "required": false,
          "default": "a serene mountain lake at sunset"
        },
        {
          "name": "width",
          "type": "int",
          "description": "",
          "required": false,
          "default": 512
        },
        {
          "name": "height",
          "type": "int",
          "description": "",
          "required": false,
          "default": 512
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/fake/fakegenerateimage",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/fake/fakegenerateimage.md"
    },
    {
      "type": "nodetool.generators.ChartGenerator",
      "title": "Chart Generator",
      "namespace": "nodetool.generators",
      "description": "LLM Agent to create Plotly Express charts based on natural language descriptions.\n    llm, data visualization, charts\n\n    Use cases:\n    - Generating interactive charts from natural language descriptions\n    - Creating data visualizations with minimal configuration\n    - Converting data analysis requirements into visual representations",
      "inputs": [
        {
          "name": "model",
          "type": "language_model",
          "description": "The model to use for chart generation.",
          "required": false,
          "default": {
            "type": "language_model",
            "provider": "empty",
            "id": "",
            "name": "",
            "path": null,
            "supported_tasks": []
          }
        },
        {
          "name": "prompt",
          "type": "str",
          "description": "Natural language description of the desired chart",
          "required": false,
          "default": ""
        },
        {
          "name": "data",
          "type": "dataframe",
          "description": "The data to visualize",
          "required": false,
          "default": {
            "type": "dataframe",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null,
            "columns": null
          }
        },
        {
          "name": "max_tokens",
          "type": "int",
          "description": "The maximum number of tokens to generate.",
          "required": false,
          "default": 4096
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "chart_config"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/generators/chartgenerator",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/generators/chartgenerator.md"
    },
    {
      "type": "nodetool.generators.DataGenerator",
      "title": "Data Generator",
      "namespace": "nodetool.generators",
      "description": "LLM Agent to create a dataframe based on a user prompt.\n    llm, dataframe creation, data structuring\n\n    Use cases:\n    - Generating structured data from natural language descriptions\n    - Creating sample datasets for testing or demonstration\n    - Converting unstructured text into tabular format",
      "inputs": [
        {
          "name": "model",
          "type": "language_model",
          "description": "The model to use for data generation.",
          "required": false,
          "default": {
            "type": "language_model",
            "provider": "empty",
            "id": "",
            "name": "",
            "path": null,
            "supported_tasks": []
          }
        },
        {
          "name": "prompt",
          "type": "str",
          "description": "The user prompt",
          "required": false,
          "default": ""
        },
        {
          "name": "input_text",
          "type": "str",
          "description": "The input text to be analyzed by the agent.",
          "required": false,
          "default": ""
        },
        {
          "name": "max_tokens",
          "type": "int",
          "description": "The maximum number of tokens to generate.",
          "required": false,
          "default": 4096
        },
        {
          "name": "columns",
          "type": "record_type",
          "description": "The columns to use in the dataframe.",
          "required": false,
          "default": {
            "type": "record_type",
            "columns": []
          }
        }
      ],
      "outputs": [
        {
          "name": "record",
          "type": "dict"
        },
        {
          "name": "dataframe",
          "type": "dataframe"
        },
        {
          "name": "index",
          "type": "int"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/generators/datagenerator",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/generators/datagenerator.md"
    },
    {
      "type": "nodetool.generators.ListGenerator",
      "title": "List Generator",
      "namespace": "nodetool.generators",
      "description": "LLM Agent to create a stream of strings based on a user prompt.\n    llm, text streaming\n\n    Use cases:\n    - Generating text from natural language descriptions\n    - Streaming responses from an LLM",
      "inputs": [
        {
          "name": "model",
          "type": "language_model",
          "description": "The model to use for string generation.",
          "required": false,
          "default": {
            "type": "language_model",
            "provider": "empty",
            "id": "",
            "name": "",
            "path": null,
            "supported_tasks": []
          }
        },
        {
          "name": "prompt",
          "type": "str",
          "description": "The user prompt",
          "required": false,
          "default": ""
        },
        {
          "name": "input_text",
          "type": "str",
          "description": "The input text to be analyzed by the agent.",
          "required": false,
          "default": ""
        },
        {
          "name": "max_tokens",
          "type": "int",
          "description": "The maximum number of tokens to generate.",
          "required": false,
          "default": 4096
        }
      ],
      "outputs": [
        {
          "name": "item",
          "type": "str"
        },
        {
          "name": "index",
          "type": "int"
        },
        {
          "name": "output",
          "type": "list[str]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/generators/listgenerator",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/generators/listgenerator.md"
    },
    {
      "type": "nodetool.generators.StructuredOutputGenerator",
      "title": "Structured Output Generator",
      "namespace": "nodetool.generators",
      "description": "Generate structured JSON objects from instructions using LLM providers.\n    data-generation, structured-data, json, synthesis\n\n    Specialized for creating structured information:\n    - Generating JSON that follows dynamic schemas\n    - Fabricating records from requirements and guidance\n    - Simulating sample data for downstream workflows\n    - Producing consistent structured outputs for testing",
      "inputs": [
        {
          "name": "system_prompt",
          "type": "str",
          "description": "The system prompt guiding JSON generation.",
          "required": false,
          "default": "\nYou are a structured data generator focused on JSON outputs.\n\nGoal\n- Produce a high-quality JSON object that matches <JSON_SCHEMA> using the guidance in <INSTRUCTIONS> and any supplemental <CONTEXT>.\n\nOutput format (MANDATORY)\n- Output exactly ONE fenced code block labeled json containing ONLY the JSON object:\n\n  ```json\n  { ...single JSON object matching <JSON_SCHEMA>... }\n  ```\n\n- No additional prose before or after the block.\n\nGeneration rules\n- Invent plausible, internally consistent values when not explicitly provided.\n- Honor all constraints from <JSON_SCHEMA> (types, enums, ranges, formats).\n- Prefer ISO 8601 for dates/times when applicable.\n- Ensure numbers respect reasonable magnitudes and relationships described in <INSTRUCTIONS>.\n- Avoid referencing external sources; rely solely on the provided guidance.\n\nValidation\n- Ensure the final JSON validates against <JSON_SCHEMA> exactly.\n"
        },
        {
          "name": "model",
          "type": "language_model",
          "description": "Model to use for structured generation.",
          "required": false,
          "default": {
            "type": "language_model",
            "provider": "empty",
            "id": "",
            "name": "",
            "path": null,
            "supported_tasks": []
          }
        },
        {
          "name": "instructions",
          "type": "str",
          "description": "Detailed instructions for the structured output.",
          "required": false,
          "default": ""
        },
        {
          "name": "context",
          "type": "str",
          "description": "Optional context to ground the generation.",
          "required": false,
          "default": ""
        },
        {
          "name": "max_tokens",
          "type": "int",
          "description": "The maximum number of tokens to generate.",
          "required": false,
          "default": 4096
        },
        {
          "name": "image",
          "type": "list[image]",
          "description": "Optional images to include in the generation request. Accepts a list, or a single Image (auto-wrapped). Each becomes a separate block in the message sent to the provider.",
          "required": false,
          "default": []
        },
        {
          "name": "audio",
          "type": "list[audio]",
          "description": "Optional audio to include in the generation request. Accepts a list, or a single Audio (auto-wrapped). Each becomes a separate block in the message sent to the provider.",
          "required": false,
          "default": []
        }
      ],
      "outputs": [],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/generators/structuredoutputgenerator",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/generators/structuredoutputgenerator.md"
    },
    {
      "type": "nodetool.generators.SVGGenerator",
      "title": "SVGGenerator",
      "namespace": "nodetool.generators",
      "description": "LLM Agent to create SVG elements based on user prompts.\n    svg, generator, vector, graphics\n\n    Use cases:\n    - Creating vector graphics from text descriptions\n    - Generating scalable illustrations\n    - Creating custom icons and diagrams",
      "inputs": [
        {
          "name": "model",
          "type": "language_model",
          "description": "The language model to use for SVG generation.",
          "required": false,
          "default": {
            "type": "language_model",
            "provider": "empty",
            "id": "",
            "name": "",
            "path": null,
            "supported_tasks": []
          }
        },
        {
          "name": "prompt",
          "type": "str",
          "description": "The user prompt for SVG generation",
          "required": false,
          "default": ""
        },
        {
          "name": "image",
          "type": "list[image]",
          "description": "Images to use for generation. Accepts a list, or a single Image (auto-wrapped). Each becomes a separate block in the message sent to the provider.",
          "required": false,
          "default": []
        },
        {
          "name": "audio",
          "type": "list[audio]",
          "description": "Audio to use for generation. Accepts a list, or a single Audio (auto-wrapped). Each becomes a separate block in the message sent to the provider.",
          "required": false,
          "default": []
        },
        {
          "name": "max_tokens",
          "type": "int",
          "description": "The maximum number of tokens to generate.",
          "required": false,
          "default": 8192
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "list[svg_element]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/generators/svggenerator",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/generators/svggenerator.md"
    },
    {
      "type": "nodetool.image.BatchToList",
      "title": "Batch To List",
      "namespace": "nodetool.image",
      "description": "Convert an image batch to a list of image references.\n    batch, list, images, processing",
      "inputs": [
        {
          "name": "batch",
          "type": "image",
          "description": "The batch of images to convert.",
          "required": false,
          "default": {
            "type": "image",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "list[image]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/image/batchtolist",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/image/batchtolist.md"
    },
    {
      "type": "nodetool.image.Blur",
      "title": "Blur",
      "namespace": "nodetool.image",
      "description": "Blur an image — Box, Gaussian, or horizontal Motion variants.\n    image, blur, gaussian, box, motion, filter",
      "inputs": [
        {
          "name": "image",
          "type": "image",
          "description": "The image to blur.",
          "required": false,
          "default": {
            "type": "image",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "blur_type",
          "type": "str",
          "description": "Blur algorithm: gaussian (smooth), box (boxcar), motion (horizontal streak).",
          "required": false,
          "default": "gaussian"
        },
        {
          "name": "size",
          "type": "int",
          "description": "Blur amount (0 = none, 100 = max).",
          "required": false,
          "default": 5
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/image/blur",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/image/blur.md"
    },
    {
      "type": "nodetool.image.CanvasResize",
      "title": "Canvas Resize",
      "namespace": "nodetool.image",
      "description": "Expand the canvas around an image without scaling its pixels.\n    canvas, resize, pad, outpaint, expand",
      "inputs": [
        {
          "name": "image",
          "type": "image",
          "description": "The image to place on the expanded canvas.",
          "required": false,
          "default": {
            "type": "image",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "mode",
          "type": "enum",
          "description": "How to resize the canvas.",
          "required": false,
          "default": "padding"
        },
        {
          "name": "width",
          "type": "int",
          "description": "Target canvas width (fixed mode).",
          "required": false,
          "default": 512
        },
        {
          "name": "height",
          "type": "int",
          "description": "Target canvas height (fixed mode).",
          "required": false,
          "default": 512
        },
        {
          "name": "scale",
          "type": "float",
          "description": "Canvas scale factor relative to the source image.",
          "required": false,
          "default": 1.25
        },
        {
          "name": "padding_unit",
          "type": "enum",
          "description": "Whether padding values are pixels or percent of source size.",
          "required": false,
          "default": "px"
        },
        {
          "name": "top",
          "type": "float",
          "description": "Padding above the image.",
          "required": false,
          "default": 0
        },
        {
          "name": "bottom",
          "type": "float",
          "description": "Padding below the image.",
          "required": false,
          "default": 0
        },
        {
          "name": "left",
          "type": "float",
          "description": "Padding to the left of the image.",
          "required": false,
          "default": 0
        },
        {
          "name": "right",
          "type": "float",
          "description": "Padding to the right of the image.",
          "required": false,
          "default": 0
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/image/canvasresize",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/image/canvasresize.md"
    },
    {
      "type": "nodetool.image.Channels",
      "title": "Channels",
      "namespace": "nodetool.image",
      "description": "Extract a single channel from an image as a grayscale preview.\n    image, channel, red, green, blue, alpha, luminance",
      "inputs": [
        {
          "name": "image",
          "type": "image",
          "description": "The image to extract a channel from.",
          "required": false,
          "default": {
            "type": "image",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "channel",
          "type": "str",
          "description": "Which channel to extract.",
          "required": false,
          "default": "luminance"
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/image/channels",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/image/channels.md"
    },
    {
      "type": "nodetool.image.Compositor",
      "title": "Compositor",
      "namespace": "nodetool.image",
      "description": "Composite multiple image layers with per-layer opacity and blend mode.\n    image, compositor, blend, layers, mask",
      "inputs": [
        {
          "name": "layers",
          "type": "list",
          "description": "Per-layer state (positional): { opacity, blend_mode, visible, transform }.",
          "required": false,
          "default": []
        },
        {
          "name": "canvas_width",
          "type": "int",
          "description": "Composite canvas width in pixels. 0 → use the first visible layer's width.",
          "required": false,
          "default": 0
        },
        {
          "name": "canvas_height",
          "type": "int",
          "description": "Composite canvas height in pixels. 0 → use the first visible layer's height.",
          "required": false,
          "default": 0
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/image/compositor",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/image/compositor.md"
    },
    {
      "type": "nodetool.image.Crop",
      "title": "Crop",
      "namespace": "nodetool.image",
      "description": "Crop an image to specified coordinates.\n    image, crop",
      "inputs": [
        {
          "name": "image",
          "type": "image",
          "description": "The image to crop.",
          "required": false,
          "default": {
            "type": "image",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "left",
          "type": "int",
          "description": "The left coordinate.",
          "required": false,
          "default": 0
        },
        {
          "name": "top",
          "type": "int",
          "description": "The top coordinate.",
          "required": false,
          "default": 0
        },
        {
          "name": "right",
          "type": "int",
          "description": "The right coordinate.",
          "required": false,
          "default": 512
        },
        {
          "name": "bottom",
          "type": "int",
          "description": "The bottom coordinate.",
          "required": false,
          "default": 512
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/image/crop",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/image/crop.md"
    },
    {
      "type": "nodetool.image.Fit",
      "title": "Fit",
      "namespace": "nodetool.image",
      "description": "",
      "inputs": [
        {
          "name": "image",
          "type": "image",
          "description": "The image to fit.",
          "required": false,
          "default": {
            "type": "image",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "width",
          "type": "int",
          "description": "Width to fit to.",
          "required": false,
          "default": 512
        },
        {
          "name": "height",
          "type": "int",
          "description": "Height to fit to.",
          "required": false,
          "default": 512
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/image/fit",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/image/fit.md"
    },
    {
      "type": "nodetool.image.GetMetadata",
      "title": "Get Metadata",
      "namespace": "nodetool.image",
      "description": "Get metadata about the input image.\n    metadata, properties, analysis, information",
      "inputs": [
        {
          "name": "image",
          "type": "image",
          "description": "The input image.",
          "required": false,
          "default": {
            "type": "image",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        }
      ],
      "outputs": [
        {
          "name": "format",
          "type": "str"
        },
        {
          "name": "mode",
          "type": "str"
        },
        {
          "name": "width",
          "type": "int"
        },
        {
          "name": "height",
          "type": "int"
        },
        {
          "name": "channels",
          "type": "int"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/image/getmetadata",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/image/getmetadata.md"
    },
    {
      "type": "nodetool.image.ImagesToList",
      "title": "Images To List",
      "namespace": "nodetool.image",
      "description": "Convert all dynamic properties to a list of image references.\n    list, images, processing",
      "inputs": [],
      "outputs": [
        {
          "name": "output",
          "type": "list[image]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/image/imagestolist",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/image/imagestolist.md"
    },
    {
      "type": "nodetool.image.ImageToImage",
      "title": "Image To Image",
      "namespace": "nodetool.image",
      "description": "Transform images using text prompts with any supported image provider. Automatically routes to the appropriate backend (HuggingFace, FAL, MLX).\n    image, transformation, AI, image-to-image, i2i",
      "inputs": [
        {
          "name": "model",
          "type": "image_model",
          "description": "The image generation model to use",
          "required": false,
          "default": {
            "type": "image_model",
            "provider": "huggingface_fal_ai",
            "id": "fal-ai/flux/dev",
            "name": "FLUX.1 Dev",
            "path": null,
            "supported_tasks": []
          }
        },
        {
          "name": "image",
          "type": "list[image]",
          "description": "Input image(s) to transform. The first image is the primary subject; additional images are used as references by providers that support multi-image editing.",
          "required": false,
          "default": []
        },
        {
          "name": "prompt",
          "type": "str",
          "description": "Text prompt describing the desired transformation",
          "required": false,
          "default": "A photorealistic version of the input image"
        },
        {
          "name": "negative_prompt",
          "type": "str",
          "description": "Text prompt describing what to avoid",
          "required": false,
          "default": ""
        },
        {
          "name": "strength",
          "type": "float",
          "description": "How much to transform the input image (subtle = minor edit, strong = major edit)",
          "required": false,
          "default": 0.65
        },
        {
          "name": "aspect_ratio",
          "type": "str",
          "description": "Aspect ratio of the output image",
          "required": false,
          "default": "1:1"
        },
        {
          "name": "resolution",
          "type": "str",
          "description": "Output resolution (short edge in pixels)",
          "required": false,
          "default": "1K"
        },
        {
          "name": "scheduler",
          "type": "str",
          "description": "Scheduler to use (provider-specific)",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/image/imagetoimage",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/image/imagetoimage.md"
    },
    {
      "type": "nodetool.image.Levels",
      "title": "Levels",
      "namespace": "nodetool.image",
      "description": "Adjust input black point, gamma, and white point per RGB channel.\n    image, levels, color, tone, curves",
      "inputs": [
        {
          "name": "image",
          "type": "image",
          "description": "The image to adjust.",
          "required": false,
          "default": {
            "type": "image",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "r_black",
          "type": "int",
          "description": "Red channel input black point (0–255).",
          "required": false,
          "default": 0
        },
        {
          "name": "r_gamma",
          "type": "float",
          "description": "Red channel gamma (0.01–10).",
          "required": false,
          "default": 1
        },
        {
          "name": "r_white",
          "type": "int",
          "description": "Red channel input white point (0–255).",
          "required": false,
          "default": 255
        },
        {
          "name": "g_black",
          "type": "int",
          "description": "Green channel input black point (0–255).",
          "required": false,
          "default": 0
        },
        {
          "name": "g_gamma",
          "type": "float",
          "description": "Green channel gamma (0.01–10).",
          "required": false,
          "default": 1
        },
        {
          "name": "g_white",
          "type": "int",
          "description": "Green channel input white point (0–255).",
          "required": false,
          "default": 255
        },
        {
          "name": "b_black",
          "type": "int",
          "description": "Blue channel input black point (0–255).",
          "required": false,
          "default": 0
        },
        {
          "name": "b_gamma",
          "type": "float",
          "description": "Blue channel gamma (0.01–10).",
          "required": false,
          "default": 1
        },
        {
          "name": "b_white",
          "type": "int",
          "description": "Blue channel input white point (0–255).",
          "required": false,
          "default": 255
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/image/levels",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/image/levels.md"
    },
    {
      "type": "nodetool.image.LoadImageAssets",
      "title": "Load Image Assets",
      "namespace": "nodetool.image",
      "description": "Load images from an asset folder.\n    load, image, file, import",
      "inputs": [
        {
          "name": "folder",
          "type": "folder",
          "description": "The asset folder to load the images from.",
          "required": false,
          "default": {
            "type": "folder",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        }
      ],
      "outputs": [
        {
          "name": "image",
          "type": "image"
        },
        {
          "name": "name",
          "type": "str"
        },
        {
          "name": "images",
          "type": "list"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/image/loadimageassets",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/image/loadimageassets.md"
    },
    {
      "type": "nodetool.image.LoadImageFile",
      "title": "Load Image File",
      "namespace": "nodetool.image",
      "description": "Read an image file from disk.\n    image, input, load, file",
      "inputs": [
        {
          "name": "path",
          "type": "str",
          "description": "Path to the image file to read",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/image/loadimagefile",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/image/loadimagefile.md"
    },
    {
      "type": "nodetool.image.LoadImageFolder",
      "title": "Load Image Folder",
      "namespace": "nodetool.image",
      "description": "Load all images from a folder, optionally including subfolders.\n    image, load, folder, files",
      "inputs": [
        {
          "name": "folder",
          "type": "str",
          "description": "Folder to scan for images",
          "required": false,
          "default": ""
        },
        {
          "name": "include_subdirectories",
          "type": "bool",
          "description": "Include images in subfolders",
          "required": false,
          "default": false
        },
        {
          "name": "extensions",
          "type": "list[str]",
          "description": "Image file extensions to include",
          "required": false,
          "default": [
            ".png",
            ".jpg",
            ".jpeg",
            ".bmp",
            ".gif",
            ".webp",
            ".tiff"
          ]
        },
        {
          "name": "pattern",
          "type": "str",
          "description": "Pattern to match image files",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "image",
          "type": "image"
        },
        {
          "name": "path",
          "type": "str"
        },
        {
          "name": "images",
          "type": "list"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/image/loadimagefolder",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/image/loadimagefolder.md"
    },
    {
      "type": "nodetool.image.Painter",
      "title": "Painter",
      "namespace": "nodetool.image",
      "description": "Paint an alpha mask on top of an image and output the mask.\n    image, painter, mask, brush, paint",
      "inputs": [
        {
          "name": "image",
          "type": "image",
          "description": "Source image painted on (passed through to output).",
          "required": false,
          "default": {
            "type": "image",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "mask_data",
          "type": "str",
          "description": "Base64-encoded PNG of the painted alpha mask. Managed by the UI.",
          "required": false,
          "default": ""
        },
        {
          "name": "canvas_width",
          "type": "int",
          "description": "Width of the paint canvas in pixels. Overwritten by the source image's width when an image is set.",
          "required": false,
          "default": 512
        },
        {
          "name": "canvas_height",
          "type": "int",
          "description": "Height of the paint canvas in pixels. Overwritten by the source image's height when an image is set.",
          "required": false,
          "default": 512
        }
      ],
      "outputs": [
        {
          "name": "mask",
          "type": "image"
        },
        {
          "name": "image",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/image/painter",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/image/painter.md"
    },
    {
      "type": "nodetool.image.Paste",
      "title": "Paste",
      "namespace": "nodetool.image",
      "description": "Paste one image onto another at specified coordinates.\n    paste, composite, positioning, overlay",
      "inputs": [
        {
          "name": "image",
          "type": "image",
          "description": "The image to paste into.",
          "required": false,
          "default": {
            "type": "image",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "paste",
          "type": "image",
          "description": "The image to paste.",
          "required": false,
          "default": {
            "type": "image",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "left",
          "type": "int",
          "description": "The left coordinate.",
          "required": false,
          "default": 0
        },
        {
          "name": "top",
          "type": "int",
          "description": "The top coordinate.",
          "required": false,
          "default": 0
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/image/paste",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/image/paste.md"
    },
    {
      "type": "nodetool.image.Relight",
      "title": "Relight Image",
      "namespace": "nodetool.image",
      "description": "Re-light a subject according to a text prompt using any supported relighting provider.\n    image, relight, lighting, AI",
      "inputs": [
        {
          "name": "model",
          "type": "image_model",
          "description": "The relighting model to use",
          "required": false,
          "default": {
            "type": "image_model",
            "provider": "fal_ai",
            "id": "fal-ai/image-apps-v2/relighting",
            "name": "Relight",
            "path": null,
            "supported_tasks": []
          }
        },
        {
          "name": "image",
          "type": "image",
          "description": "Input image to relight",
          "required": false,
          "default": {
            "type": "image",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "prompt",
          "type": "str",
          "description": "Description of the desired lighting",
          "required": false,
          "default": "studio lighting from the left"
        },
        {
          "name": "negative_prompt",
          "type": "str",
          "description": "Text prompt describing what to avoid",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/image/relightimage",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/image/relightimage.md"
    },
    {
      "type": "nodetool.image.RemoveBackground",
      "title": "Remove Background",
      "namespace": "nodetool.image",
      "description": "Remove the background from an image, returning a cutout with transparency.\n    image, background, remove, matte, cutout, AI",
      "inputs": [
        {
          "name": "model",
          "type": "image_model",
          "description": "The background-removal model to use",
          "required": false,
          "default": {
            "type": "image_model",
            "provider": "fal_ai",
            "id": "fal-ai/bria/background/remove",
            "name": "Bria Background Remove",
            "path": null,
            "supported_tasks": []
          }
        },
        {
          "name": "image",
          "type": "image",
          "description": "Input image to remove the background from",
          "required": false,
          "default": {
            "type": "image",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/image/removebackground",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/image/removebackground.md"
    },
    {
      "type": "nodetool.image.Resize",
      "title": "Resize",
      "namespace": "nodetool.image",
      "description": "",
      "inputs": [
        {
          "name": "image",
          "type": "image",
          "description": "The image to resize.",
          "required": false,
          "default": {
            "type": "image",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "width",
          "type": "int",
          "description": "The target width.",
          "required": false,
          "default": 512
        },
        {
          "name": "height",
          "type": "int",
          "description": "The target height.",
          "required": false,
          "default": 512
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/image/resize",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/image/resize.md"
    },
    {
      "type": "nodetool.image.RotateAndFlip",
      "title": "Rotate & Flip",
      "namespace": "nodetool.image",
      "description": "Rotate and/or flip an image in a single step.\n    image, rotate, flip, mirror, orientation, transform",
      "inputs": [
        {
          "name": "image",
          "type": "image",
          "description": "The image to rotate and flip.",
          "required": false,
          "default": {
            "type": "image",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "angle",
          "type": "float",
          "description": "Rotation angle in degrees (clockwise).",
          "required": false,
          "default": 0
        },
        {
          "name": "flip_horizontal",
          "type": "bool",
          "description": "Mirror left/right.",
          "required": false,
          "default": false
        },
        {
          "name": "flip_vertical",
          "type": "bool",
          "description": "Mirror top/bottom.",
          "required": false,
          "default": false
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/image/rotateflip",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/image/rotateflip.md"
    },
    {
      "type": "nodetool.image.SaveImage",
      "title": "Save Image Asset",
      "namespace": "nodetool.image",
      "description": "Save an image to specified asset folder with customizable name format.\n    save, image, folder, naming",
      "inputs": [
        {
          "name": "image",
          "type": "image",
          "description": "The image to save.",
          "required": false,
          "default": {
            "type": "image",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "folder",
          "type": "folder",
          "description": "The asset folder to save the image in.",
          "required": false,
          "default": {
            "type": "folder",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "name",
          "type": "str",
          "description": "\n        Name of the output file.\n        You can use time and date variables to create unique names:\n        %Y - Year\n        %m - Month\n        %d - Day\n        %H - Hour\n        %M - Minute\n        %S - Second\n        ",
          "required": false,
          "default": "%Y-%m-%d_%H-%M-%S.png"
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/image/saveimageasset",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/image/saveimageasset.md"
    },
    {
      "type": "nodetool.image.SaveImageFile",
      "title": "Save Image File",
      "namespace": "nodetool.image",
      "description": "Write an image to disk.\n    image, output, save, file",
      "inputs": [
        {
          "name": "image",
          "type": "image",
          "description": "The image to save",
          "required": false,
          "default": {
            "type": "image",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "folder",
          "type": "str",
          "description": "Folder where the file will be saved",
          "required": false,
          "default": ""
        },
        {
          "name": "filename",
          "type": "str",
          "description": "\n        The name of the image file.\n        You can use time and date variables to create unique names:\n        %Y - Year\n        %m - Month\n        %d - Day\n        %H - Hour\n        %M - Minute\n        %S - Second\n        ",
          "required": false,
          "default": ""
        },
        {
          "name": "overwrite",
          "type": "bool",
          "description": "Overwrite the file if it already exists, otherwise file will be renamed",
          "required": false,
          "default": false
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/image/saveimagefile",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/image/saveimagefile.md"
    },
    {
      "type": "nodetool.image.Scale",
      "title": "Scale",
      "namespace": "nodetool.image",
      "description": "",
      "inputs": [
        {
          "name": "image",
          "type": "image",
          "description": "The image to scale.",
          "required": false,
          "default": {
            "type": "image",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "scale",
          "type": "float",
          "description": "The scale factor.",
          "required": false,
          "default": 1
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/image/scale",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/image/scale.md"
    },
    {
      "type": "nodetool.image.TextToImage",
      "title": "Text To Image",
      "namespace": "nodetool.image",
      "description": "Generate images from text prompts using any supported image provider. Automatically routes to the appropriate backend (HuggingFace, FAL, MLX).\n    image, generation, AI, text-to-image, t2i",
      "inputs": [
        {
          "name": "model",
          "type": "image_model",
          "description": "The image generation model to use",
          "required": false,
          "default": {
            "type": "image_model",
            "provider": "huggingface_fal_ai",
            "id": "fal-ai/flux/schnell",
            "name": "FLUX.1 Schnell",
            "path": null,
            "supported_tasks": []
          }
        },
        {
          "name": "prompt",
          "type": "str",
          "description": "Text prompt describing the desired image",
          "required": false,
          "default": "A cat holding a sign that says hello world"
        },
        {
          "name": "negative_prompt",
          "type": "str",
          "description": "Text prompt describing what to avoid in the image",
          "required": false,
          "default": ""
        },
        {
          "name": "aspect_ratio",
          "type": "str",
          "description": "Aspect ratio of the generated image",
          "required": false,
          "default": "1:1"
        },
        {
          "name": "resolution",
          "type": "str",
          "description": "Output resolution (short edge in pixels)",
          "required": false,
          "default": "1K"
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/image/texttoimage",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/image/texttoimage.md"
    },
    {
      "type": "nodetool.image.Upscale",
      "title": "Upscale Image",
      "namespace": "nodetool.image",
      "description": "Increase the resolution and detail of an image using any supported upscaling provider.\n    image, upscale, super-resolution, enhance, AI",
      "inputs": [
        {
          "name": "model",
          "type": "image_model",
          "description": "The upscaling model to use",
          "required": false,
          "default": {
            "type": "image_model",
            "provider": "fal_ai",
            "id": "fal-ai/clarity-upscaler",
            "name": "Clarity Upscaler",
            "path": null,
            "supported_tasks": []
          }
        },
        {
          "name": "image",
          "type": "image",
          "description": "Input image to upscale",
          "required": false,
          "default": {
            "type": "image",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "scale",
          "type": "int",
          "description": "Target magnification factor",
          "required": false,
          "default": 2
        },
        {
          "name": "prompt",
          "type": "str",
          "description": "Optional guidance prompt for creative upscalers",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/image/upscaleimage",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/image/upscaleimage.md"
    },
    {
      "type": "nodetool.image.Vectorize",
      "title": "Vectorize Image",
      "namespace": "nodetool.image",
      "description": "Convert a raster image into a scalable vector (SVG) using any supported vectorization provider.\n    image, vector, svg, vectorize, trace, AI",
      "inputs": [
        {
          "name": "model",
          "type": "image_model",
          "description": "The vectorization model to use",
          "required": false,
          "default": {
            "type": "image_model",
            "provider": "fal_ai",
            "id": "fal-ai/recraft/vectorize",
            "name": "Recraft Vectorize",
            "path": null,
            "supported_tasks": []
          }
        },
        {
          "name": "image",
          "type": "image",
          "description": "Input image to vectorize",
          "required": false,
          "default": {
            "type": "image",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "svg_element"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/image/vectorizeimage",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/image/vectorizeimage.md"
    },
    {
      "type": "nodetool.input.ASRModelInput",
      "title": "ASR Model Input",
      "namespace": "nodetool.input",
      "description": "Accepts an automatic speech recognition model as a parameter for workflows.\n    input, parameter, model, asr, transcription, speech",
      "inputs": [
        {
          "name": "name",
          "type": "str",
          "description": "The parameter name for the workflow.",
          "required": false,
          "default": ""
        },
        {
          "name": "value",
          "type": "asr_model",
          "description": "The speech recognition model to use as input.",
          "required": false,
          "default": {
            "type": "asr_model",
            "provider": "empty",
            "id": "",
            "name": "",
            "path": null
          }
        },
        {
          "name": "description",
          "type": "str",
          "description": "The description of the input for the workflow.",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "asr_model"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/input/asrmodelinput",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/input/asrmodelinput.md"
    },
    {
      "type": "nodetool.input.AssetFolderInput",
      "title": "Asset Folder Input",
      "namespace": "nodetool.input",
      "description": "Accepts an asset folder as a parameter for workflows.\n    input, parameter, folder, path, folderpath, local_folder, filesystem",
      "inputs": [
        {
          "name": "name",
          "type": "str",
          "description": "The parameter name for the workflow.",
          "required": false,
          "default": ""
        },
        {
          "name": "value",
          "type": "folder",
          "description": "The folder to use as input.",
          "required": false,
          "default": {
            "type": "folder",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "description",
          "type": "str",
          "description": "The description of the input for the workflow.",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "folder"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/input/assetfolderinput",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/input/assetfolderinput.md"
    },
    {
      "type": "nodetool.input.AudioInput",
      "title": "Audio Input",
      "namespace": "nodetool.input",
      "description": "Accepts a reference to an audio asset for workflows, specified by an 'AudioRef'.  An 'AudioRef' points to audio data that can be used for playback, transcription, analysis, or processing by audio-capable models.\n    input, parameter, audio, sound, voice, speech, asset",
      "inputs": [
        {
          "name": "name",
          "type": "str",
          "description": "The parameter name for the workflow.",
          "required": false,
          "default": ""
        },
        {
          "name": "value",
          "type": "audio",
          "description": "The audio to use as input.",
          "required": false,
          "default": {
            "type": "audio",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "description",
          "type": "str",
          "description": "The description of the input for the workflow.",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "audio"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/input/audioinput",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/input/audioinput.md"
    },
    {
      "type": "nodetool.input.AudioListInput",
      "title": "Audio List Input",
      "namespace": "nodetool.input",
      "description": "Accepts a list of audio references as a parameter for workflows.\n    input, parameter, audio, sound, voice, speech, asset, list",
      "inputs": [
        {
          "name": "name",
          "type": "str",
          "description": "The parameter name for the workflow.",
          "required": false,
          "default": ""
        },
        {
          "name": "value",
          "type": "list[audio]",
          "description": "The list of audio files to use as input.",
          "required": false,
          "default": []
        },
        {
          "name": "description",
          "type": "str",
          "description": "The description of the input for the workflow.",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "list[audio]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/input/audiolistinput",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/input/audiolistinput.md"
    },
    {
      "type": "nodetool.input.BooleanInput",
      "title": "Boolean Input",
      "namespace": "nodetool.input",
      "description": "Accepts a boolean (true/false) value as a parameter for workflows.  This input is used for binary choices, enabling or disabling features, or controlling conditional logic paths.\n    input, parameter, boolean, bool, toggle, switch, flag",
      "inputs": [
        {
          "name": "name",
          "type": "str",
          "description": "The parameter name for the workflow.",
          "required": false,
          "default": ""
        },
        {
          "name": "value",
          "type": "bool",
          "description": "",
          "required": false,
          "default": false
        },
        {
          "name": "description",
          "type": "str",
          "description": "The description of the input for the workflow.",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "bool"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/input/booleaninput",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/input/booleaninput.md"
    },
    {
      "type": "nodetool.input.ColorInput",
      "title": "Color Input",
      "namespace": "nodetool.input",
      "description": "Accepts a color value as a parameter for workflows.\n    input, parameter, color, color_picker, color_input",
      "inputs": [
        {
          "name": "name",
          "type": "str",
          "description": "The parameter name for the workflow.",
          "required": false,
          "default": ""
        },
        {
          "name": "value",
          "type": "color",
          "description": "The color to use as input.",
          "required": false,
          "default": {
            "type": "color",
            "value": null
          }
        },
        {
          "name": "description",
          "type": "str",
          "description": "The description of the input for the workflow.",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "color"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/input/colorinput",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/input/colorinput.md"
    },
    {
      "type": "nodetool.input.DataframeInput",
      "title": "Dataframe Input",
      "namespace": "nodetool.input",
      "description": "Accepts a reference to a dataframe asset for workflows.\n    input, parameter, dataframe, table, data",
      "inputs": [
        {
          "name": "name",
          "type": "str",
          "description": "The parameter name for the workflow.",
          "required": false,
          "default": ""
        },
        {
          "name": "value",
          "type": "dataframe",
          "description": "The dataframe to use as input.",
          "required": false,
          "default": {
            "type": "dataframe",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null,
            "columns": null
          }
        },
        {
          "name": "description",
          "type": "str",
          "description": "The description of the input for the workflow.",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "dataframe"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/input/dataframeinput",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/input/dataframeinput.md"
    },
    {
      "type": "nodetool.input.DocumentFileInput",
      "title": "Document File Input",
      "namespace": "nodetool.input",
      "description": "Accepts a local file path pointing to a document and converts it into a 'DocumentRef'.\n    input, parameter, document, file, path, local_file, load",
      "inputs": [
        {
          "name": "name",
          "type": "str",
          "description": "The parameter name for the workflow.",
          "required": false,
          "default": ""
        },
        {
          "name": "value",
          "type": "str",
          "description": "The path to the document file.",
          "required": false,
          "default": ""
        },
        {
          "name": "description",
          "type": "str",
          "description": "The description of the input for the workflow.",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "document",
          "type": "document"
        },
        {
          "name": "path",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/input/documentfileinput",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/input/documentfileinput.md"
    },
    {
      "type": "nodetool.input.DocumentInput",
      "title": "Document Input",
      "namespace": "nodetool.input",
      "description": "Accepts a reference to a document asset for workflows, specified by a 'DocumentRef'.  A 'DocumentRef' points to a structured document (e.g., PDF, DOCX, TXT) which can be processed or analyzed. This node is used when the workflow needs to operate on a document as a whole entity, potentially including its structure and metadata, rather than just raw text.\n    input, parameter, document, file, asset, reference\n\n    Use cases:\n    - Load a specific document (e.g., PDF, Word, text file) for content extraction or analysis.\n    - Pass a document to models that are designed to process specific document formats.\n    - Manage documents as distinct assets within a workflow.\n    - If you have a local file path and need to convert it to a 'DocumentRef', consider using 'DocumentFileInput'.",
      "inputs": [
        {
          "name": "name",
          "type": "str",
          "description": "The parameter name for the workflow.",
          "required": false,
          "default": ""
        },
        {
          "name": "value",
          "type": "document",
          "description": "The document to use as input.",
          "required": false,
          "default": {
            "type": "document",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "description",
          "type": "str",
          "description": "The description of the input for the workflow.",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "document"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/input/documentinput",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/input/documentinput.md"
    },
    {
      "type": "nodetool.input.EmbeddingModelInput",
      "title": "Embedding Model Input",
      "namespace": "nodetool.input",
      "description": "Accepts an embedding model as a parameter for workflows.\n    input, parameter, model, embedding, vector",
      "inputs": [
        {
          "name": "name",
          "type": "str",
          "description": "The parameter name for the workflow.",
          "required": false,
          "default": ""
        },
        {
          "name": "value",
          "type": "embedding_model",
          "description": "The embedding model to use as input.",
          "required": false,
          "default": {
            "type": "embedding_model",
            "provider": "empty",
            "id": "",
            "name": "",
            "dimensions": 0
          }
        },
        {
          "name": "description",
          "type": "str",
          "description": "The description of the input for the workflow.",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "embedding_model"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/input/embeddingmodelinput",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/input/embeddingmodelinput.md"
    },
    {
      "type": "nodetool.input.FilePathInput",
      "title": "File Path Input",
      "namespace": "nodetool.input",
      "description": "Accepts a local filesystem path (to a file or directory) as input for workflows.\n    input, parameter, path, filepath, directory, local_file, filesystem",
      "inputs": [
        {
          "name": "name",
          "type": "str",
          "description": "The parameter name for the workflow.",
          "required": false,
          "default": ""
        },
        {
          "name": "value",
          "type": "str",
          "description": "The path to use as input.",
          "required": false,
          "default": ""
        },
        {
          "name": "description",
          "type": "str",
          "description": "The description of the input for the workflow.",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/input/filepathinput",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/input/filepathinput.md"
    },
    {
      "type": "nodetool.input.FloatInput",
      "title": "Float Input",
      "namespace": "nodetool.input",
      "description": "Accepts a floating-point number as a parameter for workflows, typically constrained by a minimum and maximum value.  This input allows for precise numeric settings, such as adjustments, scores, or any value requiring decimal precision.\n    input, parameter, float, number, decimal, range",
      "inputs": [
        {
          "name": "name",
          "type": "str",
          "description": "The parameter name for the workflow.",
          "required": false,
          "default": ""
        },
        {
          "name": "value",
          "type": "float",
          "description": "",
          "required": false,
          "default": 0
        },
        {
          "name": "description",
          "type": "str",
          "description": "The description of the input for the workflow.",
          "required": false,
          "default": ""
        },
        {
          "name": "min",
          "type": "float",
          "description": "",
          "required": false,
          "default": 0
        },
        {
          "name": "max",
          "type": "float",
          "description": "",
          "required": false,
          "default": 99999
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "float"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/input/floatinput",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/input/floatinput.md"
    },
    {
      "type": "nodetool.input.FolderPathInput",
      "title": "Folder Path Input",
      "namespace": "nodetool.input",
      "description": "Accepts a folder path as a parameter for workflows.\n    input, parameter, folder, path, folderpath, local_folder, filesystem",
      "inputs": [
        {
          "name": "name",
          "type": "str",
          "description": "The parameter name for the workflow.",
          "required": false,
          "default": ""
        },
        {
          "name": "value",
          "type": "str",
          "description": "The folder path to use as input.",
          "required": false,
          "default": ""
        },
        {
          "name": "description",
          "type": "str",
          "description": "The description of the input for the workflow.",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/input/folderpathinput",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/input/folderpathinput.md"
    },
    {
      "type": "nodetool.input.HuggingFaceModelInput",
      "title": "Hugging Face Model Input",
      "namespace": "nodetool.input",
      "description": "Accepts a Hugging Face model as a parameter for workflows.\n    input, parameter, model, huggingface, hugging_face, model_name",
      "inputs": [
        {
          "name": "name",
          "type": "str",
          "description": "The parameter name for the workflow.",
          "required": false,
          "default": ""
        },
        {
          "name": "value",
          "type": "hf.model",
          "description": "The Hugging Face model to use as input.",
          "required": false,
          "default": {
            "type": "hf.model",
            "repo_id": "",
            "path": null,
            "variant": null,
            "allow_patterns": null,
            "ignore_patterns": null
          }
        },
        {
          "name": "description",
          "type": "str",
          "description": "The description of the input for the workflow.",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "hf.model"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/input/huggingfacemodelinput",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/input/huggingfacemodelinput.md"
    },
    {
      "type": "nodetool.input.ImageInput",
      "title": "Image Input",
      "namespace": "nodetool.input",
      "description": "Accepts a reference to an image asset for workflows, specified by an 'ImageRef'.  An 'ImageRef' points to image data that can be used for display, analysis, or processing by vision models.\n    input, parameter, image, picture, graphic, visual, asset",
      "inputs": [
        {
          "name": "name",
          "type": "str",
          "description": "The parameter name for the workflow.",
          "required": false,
          "default": ""
        },
        {
          "name": "value",
          "type": "image",
          "description": "The image to use as input.",
          "required": false,
          "default": {
            "type": "image",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "description",
          "type": "str",
          "description": "The description of the input for the workflow.",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/input/imageinput",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/input/imageinput.md"
    },
    {
      "type": "nodetool.input.ImageListInput",
      "title": "Image List Input",
      "namespace": "nodetool.input",
      "description": "Accepts a list of image references as a parameter for workflows.\n    input, parameter, image, picture, graphic, visual, asset, list",
      "inputs": [
        {
          "name": "name",
          "type": "str",
          "description": "The parameter name for the workflow.",
          "required": false,
          "default": ""
        },
        {
          "name": "value",
          "type": "list[image]",
          "description": "The list of images to use as input.",
          "required": false,
          "default": []
        },
        {
          "name": "description",
          "type": "str",
          "description": "The description of the input for the workflow.",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "list[image]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/input/imagelistinput",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/input/imagelistinput.md"
    },
    {
      "type": "nodetool.input.ImageModelInput",
      "title": "Image Model Input",
      "namespace": "nodetool.input",
      "description": "Accepts an image generation model as a parameter for workflows.\n    input, parameter, model, image, generation",
      "inputs": [
        {
          "name": "name",
          "type": "str",
          "description": "The parameter name for the workflow.",
          "required": false,
          "default": ""
        },
        {
          "name": "value",
          "type": "image_model",
          "description": "The image generation model to use as input.",
          "required": false,
          "default": {
            "type": "image_model",
            "provider": "empty",
            "id": "",
            "name": "",
            "path": null,
            "supported_tasks": []
          }
        },
        {
          "name": "description",
          "type": "str",
          "description": "The description of the input for the workflow.",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "image_model"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/input/imagemodelinput",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/input/imagemodelinput.md"
    },
    {
      "type": "nodetool.input.ImageSizeInput",
      "title": "Image Size Input",
      "namespace": "nodetool.input",
      "description": "Accepts image dimensions as a parameter for workflows.\n    input, parameter, image_size, resolution, width, height, dimensions",
      "inputs": [
        {
          "name": "name",
          "type": "str",
          "description": "The parameter name for the workflow.",
          "required": false,
          "default": ""
        },
        {
          "name": "value",
          "type": "image_size",
          "description": "The image size to use as input.",
          "required": false,
          "default": null
        },
        {
          "name": "description",
          "type": "str",
          "description": "The description of the input for the workflow.",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "image_size"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/input/imagesizeinput",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/input/imagesizeinput.md"
    },
    {
      "type": "nodetool.input.IntegerInput",
      "title": "Integer Input",
      "namespace": "nodetool.input",
      "description": "Accepts an integer (whole number) as a parameter for workflows, typically constrained by a minimum and maximum value.  This input is used for discrete numeric values like counts, indices, or iteration limits.\n    input, parameter, integer, number, count, index, whole_number",
      "inputs": [
        {
          "name": "name",
          "type": "str",
          "description": "The parameter name for the workflow.",
          "required": false,
          "default": ""
        },
        {
          "name": "value",
          "type": "int",
          "description": "",
          "required": false,
          "default": 0
        },
        {
          "name": "description",
          "type": "str",
          "description": "The description of the input for the workflow.",
          "required": false,
          "default": ""
        },
        {
          "name": "min",
          "type": "int",
          "description": "",
          "required": false,
          "default": 0
        },
        {
          "name": "max",
          "type": "int",
          "description": "",
          "required": false,
          "default": 99999
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "int"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/input/integerinput",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/input/integerinput.md"
    },
    {
      "type": "nodetool.input.LanguageModelInput",
      "title": "Language Model Input",
      "namespace": "nodetool.input",
      "description": "Accepts a language model as a parameter for workflows.\n    input, parameter, model, language, model_name",
      "inputs": [
        {
          "name": "name",
          "type": "str",
          "description": "The parameter name for the workflow.",
          "required": false,
          "default": ""
        },
        {
          "name": "value",
          "type": "language_model",
          "description": "The language model to use as input.",
          "required": false,
          "default": {
            "type": "language_model",
            "provider": "empty",
            "id": "",
            "name": "",
            "path": null,
            "supported_tasks": []
          }
        },
        {
          "name": "description",
          "type": "str",
          "description": "The description of the input for the workflow.",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "language_model"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/input/languagemodelinput",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/input/languagemodelinput.md"
    },
    {
      "type": "nodetool.input.MessageDeconstructor",
      "title": "Message Deconstructor",
      "namespace": "nodetool.input",
      "description": "Deconstructs a chat message object into its individual fields.\n    extract, decompose, message, fields, chat\n\n    Use cases:\n    - Extract specific fields from a message (e.g., role, content, thread_id).\n    - Access message metadata for workflow logic.\n    - Process different parts of a message separately.",
      "inputs": [
        {
          "name": "value",
          "type": "message",
          "description": "The message object to deconstruct.",
          "required": false,
          "default": {
            "type": "message",
            "id": null,
            "workflow_id": null,
            "graph": null,
            "thread_id": null,
            "tools": null,
            "tool_call_id": null,
            "role": "",
            "name": null,
            "content": null,
            "tool_calls": null,
            "collections": null,
            "input_files": null,
            "created_at": null,
            "provider": null,
            "model": null,
            "agent_execution_id": null,
            "execution_event_type": null,
            "workflow_target": null,
            "workflow_message_input_name": null,
            "workflow_messages_input_name": null
          }
        }
      ],
      "outputs": [
        {
          "name": "id",
          "type": "str"
        },
        {
          "name": "thread_id",
          "type": "str"
        },
        {
          "name": "role",
          "type": "str"
        },
        {
          "name": "text",
          "type": "str"
        },
        {
          "name": "image",
          "type": "image"
        },
        {
          "name": "audio",
          "type": "audio"
        },
        {
          "name": "model",
          "type": "language_model"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/input/messagedeconstructor",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/input/messagedeconstructor.md"
    },
    {
      "type": "nodetool.input.MessageInput",
      "title": "Message Input",
      "namespace": "nodetool.input",
      "description": "Accepts a chat message object for workflows.\n    input, parameter, message, chat, conversation",
      "inputs": [
        {
          "name": "name",
          "type": "str",
          "description": "The parameter name for the workflow.",
          "required": false,
          "default": ""
        },
        {
          "name": "value",
          "type": "message",
          "description": "The message object containing role, content, and metadata.",
          "required": false,
          "default": {
            "type": "message",
            "id": null,
            "workflow_id": null,
            "graph": null,
            "thread_id": null,
            "tools": null,
            "tool_call_id": null,
            "role": "",
            "name": null,
            "content": null,
            "tool_calls": null,
            "collections": null,
            "input_files": null,
            "created_at": null,
            "provider": null,
            "model": null,
            "agent_execution_id": null,
            "execution_event_type": null,
            "workflow_target": null,
            "workflow_message_input_name": null,
            "workflow_messages_input_name": null
          }
        },
        {
          "name": "description",
          "type": "str",
          "description": "The description of the input for the workflow.",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "message"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/input/messageinput",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/input/messageinput.md"
    },
    {
      "type": "nodetool.input.MessageListInput",
      "title": "Message List Input",
      "namespace": "nodetool.input",
      "description": "Accepts a list of chat message objects for workflows.\n    input, parameter, messages, chat, conversation, history",
      "inputs": [
        {
          "name": "name",
          "type": "str",
          "description": "The parameter name for the workflow.",
          "required": false,
          "default": ""
        },
        {
          "name": "value",
          "type": "list[message]",
          "description": "The list of message objects representing chat history.",
          "required": false,
          "default": []
        },
        {
          "name": "description",
          "type": "str",
          "description": "The description of the input for the workflow.",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "list[message]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/input/messagelistinput",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/input/messagelistinput.md"
    },
    {
      "type": "nodetool.input.Model3DInput",
      "title": "Model 3D Input",
      "namespace": "nodetool.input",
      "description": "Accepts a reference to a 3D model asset for workflows, specified by a 'Model3DRef'.\n    A 'Model3DRef' points to 3D model data that can be used for visualization, processing,\n    or conversion by 3D-capable nodes.\n    input, parameter, 3d, model, mesh, obj, glb, stl, ply, asset",
      "inputs": [
        {
          "name": "name",
          "type": "str",
          "description": "The parameter name for the workflow.",
          "required": false,
          "default": ""
        },
        {
          "name": "value",
          "type": "model_3d",
          "description": "The 3D model to use as input.",
          "required": false,
          "default": {
            "type": "model_3d",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null,
            "format": null,
            "material_file": null,
            "texture_files": []
          }
        },
        {
          "name": "description",
          "type": "str",
          "description": "The description of the input for the workflow.",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "model_3d"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/input/model3dinput",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/input/model3dinput.md"
    },
    {
      "type": "nodetool.input.RealtimeAudioInput",
      "title": "Realtime Audio Input",
      "namespace": "nodetool.input",
      "description": "Accepts streaming audio data for workflows.\n    input, parameter, audio, sound, voice, speech, asset",
      "inputs": [
        {
          "name": "name",
          "type": "str",
          "description": "The parameter name for the workflow.",
          "required": false,
          "default": "audio"
        },
        {
          "name": "value",
          "type": "audio",
          "description": "The audio to use as input.",
          "required": false,
          "default": {
            "type": "audio",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "description",
          "type": "str",
          "description": "The description of the input for the workflow.",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "chunk",
          "type": "chunk"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/input/realtimeaudioinput",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/input/realtimeaudioinput.md"
    },
    {
      "type": "nodetool.input.SelectInput",
      "title": "Select Input",
      "namespace": "nodetool.input",
      "description": "Accepts a selection from a predefined set of options as a parameter for workflows.\n    input, parameter, select, enum, dropdown, choice, options\n\n    Use cases:\n    - Let users choose from a fixed set of values in app mode\n    - Configure enum-like options for downstream nodes\n    - Provide dropdown selection for workflow parameters\n\n    The output is a string that can be connected to enum-typed inputs.",
      "inputs": [
        {
          "name": "name",
          "type": "str",
          "description": "The parameter name for the workflow.",
          "required": false,
          "default": ""
        },
        {
          "name": "value",
          "type": "str",
          "description": "The currently selected value.",
          "required": false,
          "default": ""
        },
        {
          "name": "description",
          "type": "str",
          "description": "The description of the input for the workflow.",
          "required": false,
          "default": ""
        },
        {
          "name": "options",
          "type": "list[str]",
          "description": "The list of available options to choose from.",
          "required": false,
          "default": []
        },
        {
          "name": "enum_type_name",
          "type": "str",
          "description": "The enum type name this select corresponds to (for type matching).",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/input/selectinput",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/input/selectinput.md"
    },
    {
      "type": "nodetool.input.StringInput",
      "title": "String Input",
      "namespace": "nodetool.input",
      "description": "Accepts a string value as a parameter for workflows.\n    input, parameter, string, text, label, name, value\n\n    Use cases:\n    - Define a name for an entity or process.\n    - Specify a label for a component or output.\n    - Enter a short keyword or search term.\n    - Provide a simple configuration value (e.g., an API key, a model name).\n    - If you need to input multi-line text or the content of a file, use 'DocumentFileInput'.",
      "inputs": [
        {
          "name": "name",
          "type": "str",
          "description": "The parameter name for the workflow.",
          "required": false,
          "default": ""
        },
        {
          "name": "value",
          "type": "str",
          "description": "",
          "required": false,
          "default": ""
        },
        {
          "name": "description",
          "type": "str",
          "description": "The description of the input for the workflow.",
          "required": false,
          "default": ""
        },
        {
          "name": "max_length",
          "type": "int",
          "description": "Maximum number of characters allowed. Use 0 for unlimited.",
          "required": false,
          "default": 0
        },
        {
          "name": "line_mode",
          "type": "str",
          "description": "Controls whether the UI should render the input as single-line or multiline.",
          "required": false,
          "default": "single_line"
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/input/stringinput",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/input/stringinput.md"
    },
    {
      "type": "nodetool.input.StringListInput",
      "title": "String List Input",
      "namespace": "nodetool.input",
      "description": "Accepts a list of strings as a parameter for workflows.\n    input, parameter, string, text, label, name, value",
      "inputs": [
        {
          "name": "name",
          "type": "str",
          "description": "The parameter name for the workflow.",
          "required": false,
          "default": ""
        },
        {
          "name": "value",
          "type": "list[str]",
          "description": "The list of strings to use as input.",
          "required": false,
          "default": []
        },
        {
          "name": "description",
          "type": "str",
          "description": "The description of the input for the workflow.",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "list[str]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/input/stringlistinput",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/input/stringlistinput.md"
    },
    {
      "type": "nodetool.input.TextListInput",
      "title": "Text List Input",
      "namespace": "nodetool.input",
      "description": "Accepts a list of text strings as a parameter for workflows.\n    input, parameter, text, string, list",
      "inputs": [
        {
          "name": "name",
          "type": "str",
          "description": "The parameter name for the workflow.",
          "required": false,
          "default": ""
        },
        {
          "name": "value",
          "type": "list[str]",
          "description": "The list of text strings to use as input.",
          "required": false,
          "default": []
        },
        {
          "name": "description",
          "type": "str",
          "description": "The description of the input for the workflow.",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "list[str]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/input/textlistinput",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/input/textlistinput.md"
    },
    {
      "type": "nodetool.input.TTSModelInput",
      "title": "TTS Model Input",
      "namespace": "nodetool.input",
      "description": "Accepts a text-to-speech model as a parameter for workflows.\n    input, parameter, model, tts, speech, voice",
      "inputs": [
        {
          "name": "name",
          "type": "str",
          "description": "The parameter name for the workflow.",
          "required": false,
          "default": ""
        },
        {
          "name": "value",
          "type": "tts_model",
          "description": "The text-to-speech model to use as input.",
          "required": false,
          "default": {
            "type": "tts_model",
            "provider": "empty",
            "id": "",
            "name": "",
            "path": null,
            "voices": [],
            "selected_voice": ""
          }
        },
        {
          "name": "description",
          "type": "str",
          "description": "The description of the input for the workflow.",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "tts_model"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/input/ttsmodelinput",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/input/ttsmodelinput.md"
    },
    {
      "type": "nodetool.input.VideoInput",
      "title": "Video Input",
      "namespace": "nodetool.input",
      "description": "Accepts a reference to a video asset for workflows, specified by a 'VideoRef'.  A 'VideoRef' points to video data that can be used for playback, analysis, frame extraction, or processing by video-capable models.\n    input, parameter, video, movie, clip, visual, asset",
      "inputs": [
        {
          "name": "name",
          "type": "str",
          "description": "The parameter name for the workflow.",
          "required": false,
          "default": ""
        },
        {
          "name": "value",
          "type": "video",
          "description": "The video to use as input.",
          "required": false,
          "default": {
            "type": "video",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null,
            "duration": null,
            "format": null
          }
        },
        {
          "name": "description",
          "type": "str",
          "description": "The description of the input for the workflow.",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "video"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/input/videoinput",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/input/videoinput.md"
    },
    {
      "type": "nodetool.input.VideoListInput",
      "title": "Video List Input",
      "namespace": "nodetool.input",
      "description": "Accepts a list of video references as a parameter for workflows.\n    input, parameter, video, movie, clip, visual, asset, list",
      "inputs": [
        {
          "name": "name",
          "type": "str",
          "description": "The parameter name for the workflow.",
          "required": false,
          "default": ""
        },
        {
          "name": "value",
          "type": "list[video]",
          "description": "The list of videos to use as input.",
          "required": false,
          "default": []
        },
        {
          "name": "description",
          "type": "str",
          "description": "The description of the input for the workflow.",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "list[video]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/input/videolistinput",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/input/videolistinput.md"
    },
    {
      "type": "nodetool.input.VideoModelInput",
      "title": "Video Model Input",
      "namespace": "nodetool.input",
      "description": "Accepts a video generation model as a parameter for workflows.\n    input, parameter, model, video, generation",
      "inputs": [
        {
          "name": "name",
          "type": "str",
          "description": "The parameter name for the workflow.",
          "required": false,
          "default": ""
        },
        {
          "name": "value",
          "type": "video_model",
          "description": "The video generation model to use as input.",
          "required": false,
          "default": {
            "type": "video_model",
            "provider": "empty",
            "id": "",
            "name": "",
            "path": null,
            "supported_tasks": []
          }
        },
        {
          "name": "description",
          "type": "str",
          "description": "The description of the input for the workflow.",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "video_model"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/input/videomodelinput",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/input/videomodelinput.md"
    },
    {
      "type": "nodetool.list.Range",
      "title": "Range",
      "namespace": "nodetool.list",
      "description": "Build a list of integers like Python range(start, stop, step).\n    list, range, sequence, numbers, index, enumerate\n\n    Use cases:\n    - Generate [0, 1, ..., N-1] for iteration with For Each\n    - Produce numbered indices for batch naming or sequencing\n    - Create arithmetic sequences with custom start, stop, and step",
      "inputs": [
        {
          "name": "start",
          "type": "int",
          "description": "First value (inclusive).",
          "required": false,
          "default": 0
        },
        {
          "name": "stop",
          "type": "int",
          "description": "Exclusive end. When -1 (default), uses Count instead to produce [0, 1, ..., count-1].",
          "required": false,
          "default": -1
        },
        {
          "name": "count",
          "type": "int",
          "description": "Used when Stop is -1. Produces [0, 1, ..., count-1].",
          "required": false,
          "default": 10
        },
        {
          "name": "step",
          "type": "int",
          "description": "Increment between values.",
          "required": false,
          "default": 1
        },
        {
          "name": "max_output_length",
          "type": "int",
          "description": "Maximum number of integers to produce.",
          "required": true
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "list[int]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/list/range",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/list/range.md"
    },
    {
      "type": "nodetool.list.RepeatEach",
      "title": "Repeat Each",
      "namespace": "nodetool.list",
      "description": "Repeat each list item consecutively N times.\n    list, repeat, duplicate, interleave, expand\n\n    Use cases:\n    - Generate multiple variants per input item\n    - [A, B, C] × 2 → [A, A, B, B, C, C]\n    - Feed expanded lists into For Each",
      "inputs": [
        {
          "name": "input_list",
          "type": "list[any]",
          "description": "List whose items are repeated individually.",
          "required": false,
          "default": []
        },
        {
          "name": "times",
          "type": "int",
          "description": "How many times to repeat each item.",
          "required": false,
          "default": 1
        },
        {
          "name": "max_output_length",
          "type": "int",
          "description": "Maximum number of items in the output list.",
          "required": true
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "list[any]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/list/repeateach",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/list/repeateach.md"
    },
    {
      "type": "nodetool.list.RepeatValue",
      "title": "Repeat Value",
      "namespace": "nodetool.list",
      "description": "Duplicate a single value into a list N times.\n    list, repeat, duplicate, fill, scalar, constant\n\n    Use cases:\n    - Build [v, v, v] from one prompt or parameter before For Each\n    - Expand a scalar into a list for list-typed inputs\n    - v × 3 → [v, v, v]",
      "inputs": [
        {
          "name": "value",
          "type": "any",
          "description": "Single value to repeat.",
          "required": false,
          "default": null
        },
        {
          "name": "times",
          "type": "int",
          "description": "How many copies to produce.",
          "required": false,
          "default": 1
        },
        {
          "name": "max_output_length",
          "type": "int",
          "description": "Maximum number of items in the output list.",
          "required": true
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "list[any]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/list/repeatvalue",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/list/repeatvalue.md"
    },
    {
      "type": "nodetool.list.Tile",
      "title": "Tile List",
      "namespace": "nodetool.list",
      "description": "Repeat an entire list end-to-end N times.\n    list, repeat, tile, cycle, loop, concatenate\n\n    Use cases:\n    - Run the same item sequence multiple times before For Each\n    - Duplicate a prompt list for batch generation\n    - [A, B, C] × 3 → [A, B, C, A, B, C, A, B, C]",
      "inputs": [
        {
          "name": "input_list",
          "type": "list[any]",
          "description": "List to repeat.",
          "required": false,
          "default": []
        },
        {
          "name": "times",
          "type": "int",
          "description": "How many times to repeat the full list.",
          "required": false,
          "default": 1
        },
        {
          "name": "max_output_length",
          "type": "int",
          "description": "Maximum number of items in the output list.",
          "required": true
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "list[any]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/list/tilelist",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/list/tilelist.md"
    },
    {
      "type": "nodetool.model3d.Boolean3D",
      "title": "Boolean 3D",
      "namespace": "nodetool.model3d",
      "description": "Perform boolean operations on 3D meshes.\n    3d, mesh, model, boolean, union, difference, intersection, combine, subtract\n\n    Current limits:\n    - First honest pass supports GLB triangle meshes only\n    - Boolean output preserves geometry, not full material/attribute fidelity\n\n    Use cases:\n    - Combine multiple objects (union)\n    - Cut holes in objects (difference)\n    - Find overlapping regions (intersection)\n    - Hard-surface modeling operations\n    - 3D printing preparation",
      "inputs": [
        {
          "name": "model_a",
          "type": "model_3d",
          "description": "First 3D model (base)",
          "required": true
        },
        {
          "name": "model_b",
          "type": "model_3d",
          "description": "Second 3D model (tool)",
          "required": true
        },
        {
          "name": "operation",
          "type": "enum",
          "description": "Boolean operation to perform",
          "required": false,
          "default": "union"
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "model_3d"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/model3d/boolean3d",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/model3d/boolean3d.md"
    },
    {
      "type": "nodetool.model3d.CenterMesh",
      "title": "Center Mesh",
      "namespace": "nodetool.model3d",
      "description": "Center a mesh at the origin.\n    3d, mesh, model, center, origin, align\n\n    Use cases:\n    - Center models for consistent positioning\n    - Prepare models for rotation\n    - Align multiple models",
      "inputs": [
        {
          "name": "model",
          "type": "model_3d",
          "description": "The 3D model to center",
          "required": true
        },
        {
          "name": "use_centroid",
          "type": "bool",
          "description": "Use geometric centroid (True) or bounding box center (False)",
          "required": false,
          "default": true
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "model_3d"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/model3d/centermesh",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/model3d/centermesh.md"
    },
    {
      "type": "nodetool.model3d.Decimate",
      "title": "Decimate",
      "namespace": "nodetool.model3d",
      "description": "Reduce polygon count while preserving shape using meshoptimizer-backed simplification.\n    3d, mesh, model, decimate, simplify, reduce, polygon, optimize, LOD\n\n    Set target_vertices > 0 to target an exact vertex count instead of a ratio.\n\n    Use cases:\n    - Create level-of-detail (LOD) versions\n    - Optimize models for real-time rendering\n    - Reduce file size for web deployment\n    - Prepare models for mobile/VR applications",
      "inputs": [
        {
          "name": "model",
          "type": "model_3d",
          "description": "The 3D model to decimate",
          "required": true
        },
        {
          "name": "target_ratio",
          "type": "float",
          "description": "Target ratio of faces to keep (0.5 = 50% reduction). Ignored when target_vertices is set.",
          "required": false,
          "default": 0.5
        },
        {
          "name": "target_vertices",
          "type": "int",
          "description": "Approximate target vertex count. Overrides target_ratio when > 0.",
          "required": false,
          "default": 0
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "model_3d"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/model3d/decimate",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/model3d/decimate.md"
    },
    {
      "type": "nodetool.model3d.ExtractLargestComponent",
      "title": "Extract Largest Component",
      "namespace": "nodetool.model3d",
      "description": "Keep only the largest disconnected triangle component of a 3D mesh.\n    3d, mesh, model, cleanup, component, connected, floater, islands\n\n    Current limits:\n    - First honest pass supports GLB triangle geometry only\n    - Output rebuilds triangle geometry and does not preserve all original attributes/material setup\n\n    Use cases:\n    - Remove disconnected floaters from AI-generated meshes\n    - Keep the primary object from noisy geometry\n    - Clean up multi-island outputs before downstream processing",
      "inputs": [
        {
          "name": "model",
          "type": "model_3d",
          "description": "The 3D model to clean up",
          "required": true
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "model_3d"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/model3d/extractlargestcomponent",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/model3d/extractlargestcomponent.md"
    },
    {
      "type": "nodetool.model3d.FlipNormals",
      "title": "Flip Normals",
      "namespace": "nodetool.model3d",
      "description": "Flip all face normals of a mesh.\n    3d, mesh, model, normals, flip, invert, inside_out\n\n    Use cases:\n    - Fix inside-out meshes\n    - Invert normals for specific rendering effects\n    - Repair meshes from incompatible software",
      "inputs": [
        {
          "name": "model",
          "type": "model_3d",
          "description": "The 3D model to process",
          "required": true
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "model_3d"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/model3d/flipnormals",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/model3d/flipnormals.md"
    },
    {
      "type": "nodetool.model3d.FormatConverter",
      "title": "Format Converter",
      "namespace": "nodetool.model3d",
      "description": "Convert a 3D model between supported formats.\n    3d, mesh, model, convert, format, glb, gltf, export\n\n    Currently supported conversions: glb → gltf. Other targets are not yet implemented.\n\n    Use cases:\n    - Convert GLB to textual glTF for inspection\n    - Export models as glTF for tool compatibility",
      "inputs": [
        {
          "name": "model",
          "type": "model_3d",
          "description": "The 3D model to convert",
          "required": true
        },
        {
          "name": "output_format",
          "type": "enum",
          "description": "Target format for conversion. Currently only glb → gltf is supported.",
          "required": false,
          "default": "glb"
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "model_3d"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/model3d/formatconverter",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/model3d/formatconverter.md"
    },
    {
      "type": "nodetool.model3d.GetModel3DMetadata",
      "title": "Get Model 3D Metadata",
      "namespace": "nodetool.model3d",
      "description": "Get metadata about a 3D model.\n    3d, mesh, model, metadata, info, properties\n\n    Use cases:\n    - Get vertex and face counts for processing decisions\n    - Analyze model properties\n    - Gather information for model cataloging",
      "inputs": [
        {
          "name": "model",
          "type": "model_3d",
          "description": "The 3D model to analyze",
          "required": true
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "dict"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/model3d/getmodel3dmetadata",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/model3d/getmodel3dmetadata.md"
    },
    {
      "type": "nodetool.model3d.ImageTo3D",
      "title": "Image To 3D",
      "namespace": "nodetool.model3d",
      "description": "Generate 3D models from images using AI providers (Meshy, Rodin).\n    3d, generation, AI, image-to-3d, i3d, mesh, reconstruction\n\n    Use cases:\n    - Convert product photos to 3D models\n    - Create 3D assets from concept art\n    - Generate 3D characters from drawings\n    - Reconstruct objects from images",
      "inputs": [
        {
          "name": "model",
          "type": "model_3d_model",
          "description": "The 3D generation model to use",
          "required": true
        },
        {
          "name": "image",
          "type": "image",
          "description": "Input image to convert to 3D",
          "required": true
        },
        {
          "name": "prompt",
          "type": "str",
          "description": "Optional text prompt to guide the 3D generation",
          "required": false,
          "default": ""
        },
        {
          "name": "output_format",
          "type": "enum",
          "description": "Output format for the 3D model",
          "required": false,
          "default": "glb"
        },
        {
          "name": "seed",
          "type": "int",
          "description": "Random seed for reproducibility (-1 for random)",
          "required": false,
          "default": -1
        },
        {
          "name": "timeout_seconds",
          "type": "int",
          "description": "Timeout in seconds for API calls (0 = use provider default)",
          "required": false,
          "default": 600
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "model_3d"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/model3d/imageto3d",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/model3d/imageto3d.md"
    },
    {
      "type": "nodetool.model3d.LoadModel3DFile",
      "title": "Load Model 3D File",
      "namespace": "nodetool.model3d",
      "description": "Load a 3D model file from disk.\n    3d, mesh, model, input, load, file, obj, glb, stl, ply\n\n    Use cases:\n    - Load 3D models for processing\n    - Import meshes from CAD software\n    - Read 3D assets for a workflow",
      "inputs": [
        {
          "name": "path",
          "type": "str",
          "description": "Path to the 3D model file to read",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "model_3d"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/model3d/loadmodel3dfile",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/model3d/loadmodel3dfile.md"
    },
    {
      "type": "nodetool.model3d.MergeMeshes",
      "title": "Merge Meshes",
      "namespace": "nodetool.model3d",
      "description": "Merge multiple meshes into a single GLB scene.\n    3d, mesh, model, merge, combine, concatenate\n\n    Current limits:\n    - First honest pass supports GLB input only\n    - This node performs scene merge, not boolean union\n\n    Use cases:\n    - Combine multiple parts into one model\n    - Merge imported components\n    - Prepare models for downstream processing",
      "inputs": [
        {
          "name": "models",
          "type": "list[model_3d]",
          "description": "List of 3D models to merge",
          "required": false,
          "default": []
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "model_3d"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/model3d/mergemeshes",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/model3d/mergemeshes.md"
    },
    {
      "type": "nodetool.model3d.NormalizeModel3D",
      "title": "Normalize Model 3D",
      "namespace": "nodetool.model3d",
      "description": "Normalize a 3D model with explicit axis cleanup, centering, optional uniform scaling, and optional ground placement.\n    3d, mesh, model, normalize, center, scale, orient, ground\n\n    Current limits:\n    - First honest pass supports GLB geometry cleanup only\n    - Axis normalization is explicit (`keep`, `z_to_y`, `y_to_z`), not auto-detected\n\n    Use cases:\n    - Standardize imported GLB orientation\n    - Fit meshes into a predictable size box\n    - Center models before downstream processing\n    - Place meshes onto a chosen ground axis",
      "inputs": [
        {
          "name": "model",
          "type": "model_3d",
          "description": "The 3D model to normalize",
          "required": true
        },
        {
          "name": "center_mode",
          "type": "enum",
          "description": "How to center the model before optional scaling",
          "required": false,
          "default": "bounds"
        },
        {
          "name": "axis_preset",
          "type": "enum",
          "description": "Explicit orientation normalization preset",
          "required": false,
          "default": "keep"
        },
        {
          "name": "scale_to_size",
          "type": "bool",
          "description": "Scale the model uniformly so its longest bounds dimension matches the target size",
          "required": false,
          "default": true
        },
        {
          "name": "target_size",
          "type": "float",
          "description": "Longest bounds dimension after optional uniform scaling",
          "required": false,
          "default": 1
        },
        {
          "name": "place_on_ground",
          "type": "bool",
          "description": "Translate the mesh so the chosen ground axis minimum becomes zero",
          "required": false,
          "default": true
        },
        {
          "name": "ground_axis",
          "type": "enum",
          "description": "Axis treated as the up/ground direction for placement",
          "required": false,
          "default": "y"
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "model_3d"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/model3d/normalizemodel3d",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/model3d/normalizemodel3d.md"
    },
    {
      "type": "nodetool.model3d.RecalculateNormals",
      "title": "Recalculate Normals",
      "namespace": "nodetool.model3d",
      "description": "Recalculate mesh normals for proper shading.\n    3d, mesh, model, normals, fix, shading, smooth, flat, faces\n\n    Use cases:\n    - Fix inverted or broken normals\n    - Switch between smooth and flat shading\n    - Repair imported meshes with bad normals\n    - Prepare models for rendering",
      "inputs": [
        {
          "name": "model",
          "type": "model_3d",
          "description": "The 3D model to process",
          "required": true
        },
        {
          "name": "mode",
          "type": "enum",
          "description": "Shading mode: smooth, flat, or auto (uses mesh default)",
          "required": false,
          "default": "auto"
        },
        {
          "name": "fix_winding",
          "type": "bool",
          "description": "Fix inconsistent face winding (inverted faces)",
          "required": false,
          "default": true
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "model_3d"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/model3d/recalculatenormals",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/model3d/recalculatenormals.md"
    },
    {
      "type": "nodetool.model3d.RepairMesh",
      "title": "Repair Mesh",
      "namespace": "nodetool.model3d",
      "description": "Apply conservative mesh cleanup passes to remove obviously broken GLB triangle geometry.\n    3d, mesh, model, repair, cleanup, weld, degenerate, duplicate\n\n    Current limits:\n    - First honest pass supports GLB triangle geometry only\n    - Repair is intentionally conservative: near-duplicate vertex merge plus degenerate-face removal\n    - Output rebuilds triangle geometry and does not preserve all original attributes/material setup\n\n    Use cases:\n    - Clean up noisy AI-generated meshes before export\n    - Weld tiny duplicate seams in simple geometry\n    - Remove zero-area or collapsed triangles",
      "inputs": [
        {
          "name": "model",
          "type": "model_3d",
          "description": "The 3D model to repair",
          "required": true
        },
        {
          "name": "merge_duplicate_vertices",
          "type": "bool",
          "description": "Merge exact or near-duplicate vertices before other cleanup",
          "required": false,
          "default": true
        },
        {
          "name": "remove_degenerate_faces",
          "type": "bool",
          "description": "Drop triangles with repeated vertices or near-zero area",
          "required": false,
          "default": true
        },
        {
          "name": "position_tolerance",
          "type": "float",
          "description": "Tolerance used for near-duplicate vertex welding and degenerate checks",
          "required": false,
          "default": 0.0001
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "model_3d"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/model3d/repairmesh",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/model3d/repairmesh.md"
    },
    {
      "type": "nodetool.model3d.SaveModel3D",
      "title": "Save Model3D Asset",
      "namespace": "nodetool.model3d",
      "description": "Save a 3D model to an asset folder with customizable name format.\n    save, 3d, mesh, model, folder, naming, asset\n\n    Use cases:\n    - Save generated 3D models with timestamps\n    - Organize outputs into specific folders\n    - Create backups of processed models",
      "inputs": [
        {
          "name": "model",
          "type": "model_3d",
          "description": "The 3D model to save.",
          "required": true
        },
        {
          "name": "folder",
          "type": "folder",
          "description": "The asset folder to save the 3D model in.",
          "required": true
        },
        {
          "name": "name",
          "type": "str",
          "description": "\n        Name of the output file.\n        You can use time and date variables to create unique names:\n        %Y - Year\n        %m - Month\n        %d - Day\n        %H - Hour\n        %M - Minute\n        %S - Second\n        ",
          "required": false,
          "default": "%Y-%m-%d_%H-%M-%S.glb"
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "model_3d"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/model3d/savemodel3dasset",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/model3d/savemodel3dasset.md"
    },
    {
      "type": "nodetool.model3d.SaveModel3DFile",
      "title": "Save Model 3D File",
      "namespace": "nodetool.model3d",
      "description": "Save a 3D model to disk.\n    3d, mesh, model, output, save, file, export\n\n    Use cases:\n    - Save processed 3D models\n    - Export meshes to different formats\n    - Archive 3D model results",
      "inputs": [
        {
          "name": "model",
          "type": "model_3d",
          "description": "The 3D model to save",
          "required": true
        },
        {
          "name": "folder",
          "type": "str",
          "description": "Folder where the file will be saved",
          "required": false,
          "default": ""
        },
        {
          "name": "filename",
          "type": "str",
          "description": "\n        The name of the 3D model file.\n        You can use time and date variables to create unique names:\n        %Y - Year\n        %m - Month\n        %d - Day\n        %H - Hour\n        %M - Minute\n        %S - Second\n        ",
          "required": false,
          "default": ""
        },
        {
          "name": "overwrite",
          "type": "bool",
          "description": "Overwrite the file if it already exists, otherwise file will be renamed",
          "required": false,
          "default": false
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "model_3d"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/model3d/savemodel3dfile",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/model3d/savemodel3dfile.md"
    },
    {
      "type": "nodetool.model3d.TextTo3D",
      "title": "Text To 3D",
      "namespace": "nodetool.model3d",
      "description": "Generate 3D models from text prompts using AI providers (Meshy, Rodin).\n    3d, generation, AI, text-to-3d, t3d, mesh, create\n\n    Use cases:\n    - Create 3D models from text descriptions\n    - Generate game assets from prompts\n    - Prototype 3D concepts quickly\n    - Create 3D content for AR/VR",
      "inputs": [
        {
          "name": "model",
          "type": "model_3d_model",
          "description": "The 3D generation model to use",
          "required": true
        },
        {
          "name": "prompt",
          "type": "str",
          "description": "Text description of the 3D model to generate",
          "required": false,
          "default": ""
        },
        {
          "name": "negative_prompt",
          "type": "str",
          "description": "Elements to avoid in the generated model",
          "required": false,
          "default": ""
        },
        {
          "name": "art_style",
          "type": "str",
          "description": "Art style for the model (e.g., 'realistic', 'cartoon', 'low-poly')",
          "required": false,
          "default": ""
        },
        {
          "name": "output_format",
          "type": "enum",
          "description": "Output format for the 3D model",
          "required": false,
          "default": "glb"
        },
        {
          "name": "enable_textures",
          "type": "bool",
          "description": "Generate PBR textures after shape generation (Meshy only; adds a second API call)",
          "required": false,
          "default": true
        },
        {
          "name": "seed",
          "type": "int",
          "description": "Random seed for reproducibility (-1 for random)",
          "required": false,
          "default": -1
        },
        {
          "name": "timeout_seconds",
          "type": "int",
          "description": "Timeout in seconds for API calls (0 = use provider default)",
          "required": false,
          "default": 600
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "model_3d"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/model3d/textto3d",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/model3d/textto3d.md"
    },
    {
      "type": "nodetool.model3d.Transform3D",
      "title": "Transform 3D",
      "namespace": "nodetool.model3d",
      "description": "Apply translation, rotation, and scaling to a 3D model.\n    3d, mesh, model, transform, translate, rotate, scale, move\n\n    Use cases:\n    - Position models in 3D space\n    - Scale models to specific dimensions\n    - Rotate models for proper orientation",
      "inputs": [
        {
          "name": "model",
          "type": "model_3d",
          "description": "The 3D model to transform",
          "required": true
        },
        {
          "name": "translate_x",
          "type": "float",
          "description": "Translation along X axis",
          "required": false,
          "default": 0
        },
        {
          "name": "translate_y",
          "type": "float",
          "description": "Translation along Y axis",
          "required": false,
          "default": 0
        },
        {
          "name": "translate_z",
          "type": "float",
          "description": "Translation along Z axis",
          "required": false,
          "default": 0
        },
        {
          "name": "rotate_x",
          "type": "float",
          "description": "Rotation around X axis in degrees",
          "required": false,
          "default": 0
        },
        {
          "name": "rotate_y",
          "type": "float",
          "description": "Rotation around Y axis in degrees",
          "required": false,
          "default": 0
        },
        {
          "name": "rotate_z",
          "type": "float",
          "description": "Rotation around Z axis in degrees",
          "required": false,
          "default": 0
        },
        {
          "name": "scale_x",
          "type": "float",
          "description": "Scale factor along X axis",
          "required": false,
          "default": 1
        },
        {
          "name": "scale_y",
          "type": "float",
          "description": "Scale factor along Y axis",
          "required": false,
          "default": 1
        },
        {
          "name": "scale_z",
          "type": "float",
          "description": "Scale factor along Z axis",
          "required": false,
          "default": 1
        },
        {
          "name": "uniform_scale",
          "type": "float",
          "description": "Uniform scale factor (applied after axis scales)",
          "required": false,
          "default": 1
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "model_3d"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/model3d/transform3d",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/model3d/transform3d.md"
    },
    {
      "type": "nodetool.output.Output",
      "title": "Output",
      "namespace": "nodetool.output",
      "description": "Generic output node for any type.\n    output, result, sink, return",
      "inputs": [
        {
          "name": "name",
          "type": "str",
          "description": "The parameter name for the workflow.",
          "required": false,
          "default": ""
        },
        {
          "name": "value",
          "type": "any",
          "description": "The value of the output.",
          "required": false,
          "default": null
        },
        {
          "name": "description",
          "type": "str",
          "description": "The description of the output for the workflow.",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "any"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/output/output",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/output/output.md"
    },
    {
      "type": "nodetool.sandbox.SandboxFile",
      "title": "SandboxFile",
      "namespace": "nodetool.sandbox",
      "description": "Read, write, search, and replace files inside a sandbox session.\n    sandbox, file, read, write, search, replace, edit",
      "inputs": [
        {
          "name": "workspace_dir",
          "type": "str",
          "description": "Optional sandbox workspace directory.",
          "required": false,
          "default": ""
        },
        {
          "name": "action",
          "type": "enum",
          "description": "File action to execute.",
          "required": false,
          "default": "read"
        },
        {
          "name": "params",
          "type": "dict",
          "description": "Action parameters validated by the sandbox file tool.",
          "required": false,
          "default": {}
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "dict[str, any]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/sandbox/sandboxfile",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/sandbox/sandboxfile.md"
    },
    {
      "type": "nodetool.sandbox.SandboxShell",
      "title": "SandboxShell",
      "namespace": "nodetool.sandbox",
      "description": "Execute shell commands in an isolated sandbox session.\n    sandbox, shell, command, terminal, bash, execute, isolated",
      "inputs": [
        {
          "name": "workspace_dir",
          "type": "str",
          "description": "Optional sandbox workspace directory.",
          "required": false,
          "default": ""
        },
        {
          "name": "command",
          "type": "str",
          "description": "Shell command to execute in the sandbox.",
          "required": false,
          "default": ""
        },
        {
          "name": "wait_seconds",
          "type": "float",
          "description": "If greater than 0, wait this long for output after launching command.",
          "required": false,
          "default": 1
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        },
        {
          "name": "running",
          "type": "bool"
        },
        {
          "name": "exit_code",
          "type": "union[int, none]"
        },
        {
          "name": "timed_out",
          "type": "bool"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/sandbox/sandboxshell",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/sandbox/sandboxshell.md"
    },
    {
      "type": "nodetool.sketch.CreateSketch",
      "title": "Create Sketch",
      "namespace": "nodetool.sketch",
      "description": "Create a new sketch document from an image, ready to edit in the sketch editor.\n    sketch, create, image, editor, handoff\n\n    Use cases:\n    - Hand a generated image to the sketch editor for manual touch-up\n    - Start a paint-over from a photo or render\n    - Round-trip: generate, refine by hand, feed back into the workflow",
      "inputs": [
        {
          "name": "image",
          "type": "image",
          "description": "The image to place on the sketch's base layer.",
          "required": false,
          "default": {
            "type": "image",
            "uri": "",
            "asset_id": null,
            "data": null
          }
        },
        {
          "name": "name",
          "type": "str",
          "description": "Name of the new sketch document.",
          "required": false,
          "default": "Untitled sketch"
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "sketch"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/sketch/createsketch",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/sketch/createsketch.md"
    },
    {
      "type": "nodetool.sketch.RenderSketch",
      "title": "Render Sketch",
      "namespace": "nodetool.sketch",
      "description": "Render a sketch document to a flat image (plus its mask layer when one is set).\n    sketch, render, flatten, image, mask\n\n    Use cases:\n    - Use a hand-drawn sketch as input for image generation (img2img, ControlNet-style guidance)\n    - Produce an inpainting mask painted in the sketch editor\n    - Turn editor compositions into workflow images without manual exporting",
      "inputs": [
        {
          "name": "sketch",
          "type": "sketch",
          "description": "The sketch document to render.",
          "required": false,
          "default": {
            "type": "sketch",
            "id": null,
            "data": null
          }
        }
      ],
      "outputs": [
        {
          "name": "image",
          "type": "image"
        },
        {
          "name": "mask",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/sketch/rendersketch",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/sketch/rendersketch.md"
    },
    {
      "type": "nodetool.sketch.SketchLayers",
      "title": "Sketch Layers",
      "namespace": "nodetool.sketch",
      "description": "Extract each visible layer of a sketch document as a separate image.\n    sketch, layers, split, extract\n\n    Use cases:\n    - Process foreground/background layers through different pipelines\n    - Batch-restyle each layer of a composition independently\n    - Feed named layers into compositing or animation nodes",
      "inputs": [
        {
          "name": "sketch",
          "type": "sketch",
          "description": "The sketch document to split into layer images.",
          "required": false,
          "default": {
            "type": "sketch",
            "id": null,
            "data": null
          }
        }
      ],
      "outputs": [
        {
          "name": "layers",
          "type": "list[image]"
        },
        {
          "name": "names",
          "type": "list[str]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/sketch/sketchlayers",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/sketch/sketchlayers.md"
    },
    {
      "type": "nodetool.test.Add",
      "title": "Add",
      "namespace": "nodetool.test",
      "description": "Adds two numbers",
      "inputs": [
        {
          "name": "a",
          "type": "int",
          "description": "",
          "required": false,
          "default": 0
        },
        {
          "name": "b",
          "type": "int",
          "description": "",
          "required": false,
          "default": 0
        }
      ],
      "outputs": [],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/test/add",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/test/add.md"
    },
    {
      "type": "nodetool.test.ConditionalErrorProcessor",
      "title": "Conditional Error Processor",
      "namespace": "nodetool.test",
      "description": "Throws only if shouldFail is true",
      "inputs": [
        {
          "name": "shouldFail",
          "type": "bool",
          "description": "",
          "required": false,
          "default": false
        },
        {
          "name": "message",
          "type": "str",
          "description": "",
          "required": false,
          "default": "conditional error"
        }
      ],
      "outputs": [],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/test/conditionalerrorprocessor",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/test/conditionalerrorprocessor.md"
    },
    {
      "type": "nodetool.test.Constant",
      "title": "Constant",
      "namespace": "nodetool.test",
      "description": "Outputs a constant value",
      "inputs": [
        {
          "name": "value",
          "type": "any",
          "description": "",
          "required": false,
          "default": null
        }
      ],
      "outputs": [],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/test/constant",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/test/constant.md"
    },
    {
      "type": "nodetool.test.ErrorNode",
      "title": "Error Node",
      "namespace": "nodetool.test",
      "description": "Always throws an error",
      "inputs": [
        {
          "name": "message",
          "type": "str",
          "description": "",
          "required": false,
          "default": "Node error"
        }
      ],
      "outputs": [],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/test/errornode",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/test/errornode.md"
    },
    {
      "type": "nodetool.test.FloatInput",
      "title": "Float Input",
      "namespace": "nodetool.test",
      "description": "Source node that emits a float",
      "inputs": [
        {
          "name": "value",
          "type": "int",
          "description": "",
          "required": false,
          "default": 0
        }
      ],
      "outputs": [],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/test/floatinput",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/test/floatinput.md"
    },
    {
      "type": "nodetool.test.FormatText",
      "title": "Format Text",
      "namespace": "nodetool.test",
      "description": "Formats text by replacing {{ text }} in a template",
      "inputs": [
        {
          "name": "template",
          "type": "str",
          "description": "",
          "required": false,
          "default": "Hello, {{ text }}"
        },
        {
          "name": "text",
          "type": "str",
          "description": "",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/test/formattext",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/test/formattext.md"
    },
    {
      "type": "nodetool.test.FullStreamingNode",
      "title": "Full Streaming Node",
      "namespace": "nodetool.test",
      "description": "Both streaming input and output",
      "inputs": [
        {
          "name": "count",
          "type": "int",
          "description": "",
          "required": false,
          "default": 2
        }
      ],
      "outputs": [],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/test/fullstreamingnode",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/test/fullstreamingnode.md"
    },
    {
      "type": "nodetool.test.IntAccumulator",
      "title": "Int Accumulator",
      "namespace": "nodetool.test",
      "description": "Accumulates integer inputs and tracks execution count",
      "inputs": [
        {
          "name": "value",
          "type": "int",
          "description": "",
          "required": false,
          "default": 0
        }
      ],
      "outputs": [],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/test/intaccumulator",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/test/intaccumulator.md"
    },
    {
      "type": "nodetool.test.IntInput",
      "title": "Int Input",
      "namespace": "nodetool.test",
      "description": "Source node that emits an integer",
      "inputs": [
        {
          "name": "value",
          "type": "int",
          "description": "",
          "required": false,
          "default": 0
        }
      ],
      "outputs": [],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/test/intinput",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/test/intinput.md"
    },
    {
      "type": "nodetool.test.ListSumProcessor",
      "title": "List Sum Processor",
      "namespace": "nodetool.test",
      "description": "Sums an array of numbers",
      "inputs": [
        {
          "name": "values",
          "type": "list[int]",
          "description": "",
          "required": false,
          "default": []
        }
      ],
      "outputs": [],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/test/listsumprocessor",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/test/listsumprocessor.md"
    },
    {
      "type": "nodetool.test.Multiply",
      "title": "Multiply",
      "namespace": "nodetool.test",
      "description": "Multiplies two numbers",
      "inputs": [
        {
          "name": "a",
          "type": "int",
          "description": "",
          "required": false,
          "default": 1
        },
        {
          "name": "b",
          "type": "int",
          "description": "",
          "required": false,
          "default": 1
        }
      ],
      "outputs": [],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/test/multiply",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/test/multiply.md"
    },
    {
      "type": "nodetool.test.MultiTriggerController",
      "title": "Multi Trigger Controller",
      "namespace": "nodetool.test",
      "description": "Emits N RunEvents via __control__ handle",
      "inputs": [
        {
          "name": "count",
          "type": "int",
          "description": "",
          "required": false,
          "default": 3
        },
        {
          "name": "threshold",
          "type": "float",
          "description": "",
          "required": false,
          "default": 0.5
        }
      ],
      "outputs": [],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/test/multitriggercontroller",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/test/multitriggercontroller.md"
    },
    {
      "type": "nodetool.test.Passthrough",
      "title": "Passthrough",
      "namespace": "nodetool.test",
      "description": "Passes input value through unchanged",
      "inputs": [
        {
          "name": "value",
          "type": "any",
          "description": "",
          "required": false,
          "default": null
        }
      ],
      "outputs": [],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/test/passthrough",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/test/passthrough.md"
    },
    {
      "type": "nodetool.test.SilentNode",
      "title": "Silent Node",
      "namespace": "nodetool.test",
      "description": "Runs but emits no output",
      "inputs": [],
      "outputs": [],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/test/silentnode",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/test/silentnode.md"
    },
    {
      "type": "nodetool.test.SimpleController",
      "title": "Simple Controller",
      "namespace": "nodetool.test",
      "description": "Emits one RunEvent via __control__ handle",
      "inputs": [
        {
          "name": "threshold",
          "type": "float",
          "description": "",
          "required": false,
          "default": 0.8
        },
        {
          "name": "mode",
          "type": "str",
          "description": "",
          "required": false,
          "default": "normal"
        }
      ],
      "outputs": [],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/test/simplecontroller",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/test/simplecontroller.md"
    },
    {
      "type": "nodetool.test.SlowNode",
      "title": "Slow Node",
      "namespace": "nodetool.test",
      "description": "Delays for a given number of milliseconds",
      "inputs": [
        {
          "name": "delayMs",
          "type": "int",
          "description": "",
          "required": false,
          "default": 100
        }
      ],
      "outputs": [],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/test/slownode",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/test/slownode.md"
    },
    {
      "type": "nodetool.test.StopEventController",
      "title": "Stop Event Controller",
      "namespace": "nodetool.test",
      "description": "Emits a StopEvent via __control__ handle",
      "inputs": [],
      "outputs": [],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/test/stopeventcontroller",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/test/stopeventcontroller.md"
    },
    {
      "type": "nodetool.test.StreamingCounter",
      "title": "Streaming Counter",
      "namespace": "nodetool.test",
      "description": "Streams integers from 0 to count-1",
      "inputs": [
        {
          "name": "count",
          "type": "int",
          "description": "",
          "required": false,
          "default": 3
        },
        {
          "name": "start",
          "type": "int",
          "description": "",
          "required": false,
          "default": 0
        }
      ],
      "outputs": [],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/test/streamingcounter",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/test/streamingcounter.md"
    },
    {
      "type": "nodetool.test.StreamingInputProcessor",
      "title": "Streaming Input Processor",
      "namespace": "nodetool.test",
      "description": "Streaming input node – called once with empty inputs",
      "inputs": [],
      "outputs": [],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/test/streaminginputprocessor",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/test/streaminginputprocessor.md"
    },
    {
      "type": "nodetool.test.StringConcat",
      "title": "String Concat",
      "namespace": "nodetool.test",
      "description": "Concatenates strings",
      "inputs": [
        {
          "name": "a",
          "type": "str",
          "description": "",
          "required": false,
          "default": ""
        },
        {
          "name": "b",
          "type": "str",
          "description": "",
          "required": false,
          "default": ""
        },
        {
          "name": "separator",
          "type": "str",
          "description": "",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/test/stringconcat",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/test/stringconcat.md"
    },
    {
      "type": "nodetool.test.StringInput",
      "title": "String Input",
      "namespace": "nodetool.test",
      "description": "Source node that emits a string",
      "inputs": [
        {
          "name": "value",
          "type": "str",
          "description": "",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/test/stringinput",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/test/stringinput.md"
    },
    {
      "type": "nodetool.test.ThresholdProcessor",
      "title": "Threshold Processor",
      "namespace": "nodetool.test",
      "description": "Checks if a value exceeds a threshold",
      "inputs": [
        {
          "name": "value",
          "type": "int",
          "description": "",
          "required": false,
          "default": 0
        },
        {
          "name": "threshold",
          "type": "float",
          "description": "",
          "required": false,
          "default": 0.5
        },
        {
          "name": "mode",
          "type": "str",
          "description": "",
          "required": false,
          "default": "normal"
        }
      ],
      "outputs": [],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/test/thresholdprocessor",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/test/thresholdprocessor.md"
    },
    {
      "type": "nodetool.text.AutomaticSpeechRecognition",
      "title": "Automatic Speech Recognition",
      "namespace": "nodetool.text",
      "description": "Transcribe audio to text using automatic speech recognition models.\n    audio, speech, recognition, transcription, ASR, whisper",
      "inputs": [
        {
          "name": "model",
          "type": "asr_model",
          "description": "",
          "required": false,
          "default": {
            "type": "asr_model",
            "provider": "fal_ai",
            "id": "openai/whisper-large-v3",
            "name": "",
            "path": null
          }
        },
        {
          "name": "audio",
          "type": "audio",
          "description": "The audio to transcribe",
          "required": false,
          "default": {
            "type": "audio",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "language",
          "type": "str",
          "description": "Language of the audio (ISO 639-1 code, empty for auto-detect)",
          "required": false,
          "default": ""
        },
        {
          "name": "prompt",
          "type": "str",
          "description": "Optional prompt to guide the transcription",
          "required": false,
          "default": ""
        },
        {
          "name": "temperature",
          "type": "float",
          "description": "Sampling temperature for the transcription model",
          "required": false,
          "default": 0
        }
      ],
      "outputs": [
        {
          "name": "text",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/text/automaticspeechrecognition",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/text/automaticspeechrecognition.md"
    },
    {
      "type": "nodetool.text.CapitalizeText",
      "title": "Capitalize Text",
      "namespace": "nodetool.text",
      "description": "Capitalizes only the first character.\n    text, transform, capitalize, format\n\n    Use cases:\n    - Formatting short labels or sentences\n    - Cleaning up LLM output before UI rendering\n    - Quickly fixing lowercase starts after concatenation",
      "inputs": [
        {
          "name": "text",
          "type": "str",
          "description": "",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/text/capitalizetext",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/text/capitalizetext.md"
    },
    {
      "type": "nodetool.text.Chunk",
      "title": "Split Text into Chunks",
      "namespace": "nodetool.text",
      "description": "Splits text into chunks of specified word length.\n    text, chunk, split",
      "inputs": [
        {
          "name": "text",
          "type": "str",
          "description": "",
          "required": false,
          "default": ""
        },
        {
          "name": "length",
          "type": "int",
          "description": "",
          "required": false,
          "default": 100
        },
        {
          "name": "overlap",
          "type": "int",
          "description": "",
          "required": false,
          "default": 0
        },
        {
          "name": "separator",
          "type": "str",
          "description": "",
          "required": false,
          "default": " "
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "list[str]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/text/splittextintochunks",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/text/splittextintochunks.md"
    },
    {
      "type": "nodetool.text.CollapseWhitespace",
      "title": "Collapse Whitespace",
      "namespace": "nodetool.text",
      "description": "Collapses consecutive whitespace into single separators.\n    text, whitespace, normalize, clean, remove",
      "inputs": [
        {
          "name": "text",
          "type": "str",
          "description": "",
          "required": false,
          "default": ""
        },
        {
          "name": "preserve_newlines",
          "type": "bool",
          "description": "Keep newline characters instead of replacing them",
          "required": false,
          "default": false
        },
        {
          "name": "replacement",
          "type": "str",
          "description": "String used to replace whitespace runs",
          "required": false,
          "default": " "
        },
        {
          "name": "trim_edges",
          "type": "bool",
          "description": "Strip whitespace before collapsing",
          "required": false,
          "default": true
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/text/collapsewhitespace",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/text/collapsewhitespace.md"
    },
    {
      "type": "nodetool.text.Collect",
      "title": "Collect Text",
      "namespace": "nodetool.text",
      "description": "Collects streaming text inputs into a single concatenated string.\n    text, collect, stream, aggregate",
      "inputs": [
        {
          "name": "input_item",
          "type": "str",
          "description": "Text to collect.",
          "required": false,
          "default": ""
        },
        {
          "name": "separator",
          "type": "str",
          "description": "Separator between collected items.",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/text/collecttext",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/text/collecttext.md"
    },
    {
      "type": "nodetool.text.Compare",
      "title": "Compare Text",
      "namespace": "nodetool.text",
      "description": "Compares two text values and reports ordering.\n    text, compare, equality, sort, equals, =\n\n    Use cases:\n    - Checking if two strings are identical before branching\n    - Determining lexical order for sorting or deduplication\n    - Normalizing casing/spacing before compares",
      "inputs": [
        {
          "name": "text_a",
          "type": "str",
          "description": "",
          "required": false,
          "default": ""
        },
        {
          "name": "text_b",
          "type": "str",
          "description": "",
          "required": false,
          "default": ""
        },
        {
          "name": "case_sensitive",
          "type": "bool",
          "description": "Compare without lowercasing",
          "required": false,
          "default": true
        },
        {
          "name": "trim_whitespace",
          "type": "bool",
          "description": "Strip leading/trailing whitespace before comparing",
          "required": false,
          "default": false
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/text/comparetext",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/text/comparetext.md"
    },
    {
      "type": "nodetool.text.Concat",
      "title": "Concat",
      "namespace": "nodetool.text",
      "description": "Concatenates text inputs into a single output. Add inputs dynamically with the “add text input” button, or wire a list of strings into a single input.\n    +, text, combine, add, concatenate, merge, join, append",
      "inputs": [],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/text/concat",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/text/concat.md"
    },
    {
      "type": "nodetool.text.Contains",
      "title": "Contains Text",
      "namespace": "nodetool.text",
      "description": "Checks if text contains a specified substring.\n    text, compare, validate, substring, string",
      "inputs": [
        {
          "name": "text",
          "type": "str",
          "description": "",
          "required": false,
          "default": ""
        },
        {
          "name": "substring",
          "type": "str",
          "description": "",
          "required": false,
          "default": ""
        },
        {
          "name": "search_values",
          "type": "list[str]",
          "description": "Optional list of additional substrings to check",
          "required": false,
          "default": []
        },
        {
          "name": "case_sensitive",
          "type": "bool",
          "description": "",
          "required": false,
          "default": true
        },
        {
          "name": "match_mode",
          "type": "enum",
          "description": "ANY requires one match, ALL needs every value, NONE ensures none",
          "required": false,
          "default": "any"
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "bool"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/text/containstext",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/text/containstext.md"
    },
    {
      "type": "nodetool.text.CountTokens",
      "title": "Count Tokens",
      "namespace": "nodetool.text",
      "description": "Counts the number of tokens in text using tiktoken.\n    text, tokens, count, encoding",
      "inputs": [
        {
          "name": "text",
          "type": "str",
          "description": "",
          "required": false,
          "default": ""
        },
        {
          "name": "encoding",
          "type": "enum",
          "description": "The tiktoken encoding to use for token counting",
          "required": false,
          "default": "cl100k_base"
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "int"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/text/counttokens",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/text/counttokens.md"
    },
    {
      "type": "nodetool.text.Embedding",
      "title": "Embedding",
      "namespace": "nodetool.text",
      "description": "Generate vector representations of text using any supported embedding provider (OpenAI, Gemini, Mistral).\n    embeddings, similarity, search, clustering, classification, vectors, semantic\n\n    Use cases:\n    - Semantic search and recommendation\n    - Text clustering and classification\n    - Anomaly detection\n    - Measuring text similarity and diversity",
      "inputs": [
        {
          "name": "model",
          "type": "embedding_model",
          "description": "The embedding model to use",
          "required": false,
          "default": {
            "type": "embedding_model",
            "provider": "openai",
            "id": "text-embedding-3-small",
            "name": "Text Embedding 3 Small",
            "dimensions": 0
          }
        },
        {
          "name": "input",
          "type": "str",
          "description": "The text to embed",
          "required": false,
          "default": ""
        },
        {
          "name": "chunk_size",
          "type": "int",
          "description": "Size of text chunks for embedding (used when input exceeds model limits)",
          "required": false,
          "default": 4096
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "list"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/text/embedding",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/text/embedding.md"
    },
    {
      "type": "nodetool.text.EndsWith",
      "title": "Ends With",
      "namespace": "nodetool.text",
      "description": "Checks if text ends with a specified suffix.\n    text, check, suffix, compare, validate, substring, string\n\n    Use cases:\n    - Validating file extensions\n    - Checking string endings\n    - Filtering text based on ending content",
      "inputs": [
        {
          "name": "text",
          "type": "str",
          "description": "",
          "required": false,
          "default": ""
        },
        {
          "name": "suffix",
          "type": "str",
          "description": "",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "bool"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/text/endswith",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/text/endswith.md"
    },
    {
      "type": "nodetool.text.Equals",
      "title": "Equals",
      "namespace": "nodetool.text",
      "description": "Checks if two text inputs are equal.\n    text, compare, equals, match, =",
      "inputs": [
        {
          "name": "text_a",
          "type": "str",
          "description": "",
          "required": false,
          "default": ""
        },
        {
          "name": "text_b",
          "type": "str",
          "description": "",
          "required": false,
          "default": ""
        },
        {
          "name": "case_sensitive",
          "type": "bool",
          "description": "Disable lowercasing before compare",
          "required": false,
          "default": true
        },
        {
          "name": "trim_whitespace",
          "type": "bool",
          "description": "Strip leading/trailing whitespace prior to comparison",
          "required": false,
          "default": false
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "bool"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/text/equals",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/text/equals.md"
    },
    {
      "type": "nodetool.text.Extract",
      "title": "Extract Text",
      "namespace": "nodetool.text",
      "description": "Extracts a substring from input text.\n    text, extract, substring",
      "inputs": [
        {
          "name": "text",
          "type": "str",
          "description": "",
          "required": false,
          "default": ""
        },
        {
          "name": "start",
          "type": "int",
          "description": "",
          "required": false,
          "default": 0
        },
        {
          "name": "end",
          "type": "int",
          "description": "",
          "required": false,
          "default": 0
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/text/extracttext",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/text/extracttext.md"
    },
    {
      "type": "nodetool.text.ExtractJSON",
      "title": "Extract JSON",
      "namespace": "nodetool.text",
      "description": "Extracts data from JSON using JSONPath expressions.\n    json, extract, jsonpath",
      "inputs": [
        {
          "name": "text",
          "type": "str",
          "description": "",
          "required": false,
          "default": ""
        },
        {
          "name": "json_path",
          "type": "str",
          "description": "",
          "required": false,
          "default": "$.*"
        },
        {
          "name": "find_all",
          "type": "bool",
          "description": "",
          "required": false,
          "default": false
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "any"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/text/extractjson",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/text/extractjson.md"
    },
    {
      "type": "nodetool.text.ExtractRegex",
      "title": "Extract Regex Groups",
      "namespace": "nodetool.text",
      "description": "Extracts substrings matching regex groups from text.\n    text, regex, extract\n\n    Use cases:\n    - Extracting structured data (e.g., dates, emails) from unstructured text\n    - Parsing specific patterns in log files or documents\n    - Isolating relevant information from complex text formats",
      "inputs": [
        {
          "name": "text",
          "type": "str",
          "description": "",
          "required": false,
          "default": ""
        },
        {
          "name": "regex",
          "type": "str",
          "description": "",
          "required": false,
          "default": ""
        },
        {
          "name": "dotall",
          "type": "bool",
          "description": "",
          "required": false,
          "default": false
        },
        {
          "name": "ignorecase",
          "type": "bool",
          "description": "",
          "required": false,
          "default": false
        },
        {
          "name": "multiline",
          "type": "bool",
          "description": "",
          "required": false,
          "default": false
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "list[str]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/text/extractregexgroups",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/text/extractregexgroups.md"
    },
    {
      "type": "nodetool.text.FilterRegexString",
      "title": "Filter Regex String",
      "namespace": "nodetool.text",
      "description": "Filters a stream of strings using regular expressions.\n    filter, regex, pattern, text, stream",
      "inputs": [
        {
          "name": "value",
          "type": "str",
          "description": "Input string stream",
          "required": false,
          "default": ""
        },
        {
          "name": "pattern",
          "type": "str",
          "description": "The regular expression pattern to match against.",
          "required": false,
          "default": ""
        },
        {
          "name": "full_match",
          "type": "bool",
          "description": "Whether to match the entire string or find pattern anywhere in string",
          "required": false,
          "default": false
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/text/filterregexstring",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/text/filterregexstring.md"
    },
    {
      "type": "nodetool.text.FilterString",
      "title": "Filter String",
      "namespace": "nodetool.text",
      "description": "Filters a stream of strings based on various criteria.\n    filter, strings, text, stream",
      "inputs": [
        {
          "name": "value",
          "type": "str",
          "description": "Input string stream",
          "required": false,
          "default": ""
        },
        {
          "name": "filter_type",
          "type": "enum",
          "description": "The type of filter to apply",
          "required": false,
          "default": "contains"
        },
        {
          "name": "criteria",
          "type": "str",
          "description": "The filtering criteria (text to match or length as string)",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/text/filterstring",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/text/filterstring.md"
    },
    {
      "type": "nodetool.text.FindAllRegex",
      "title": "Find All Regex Matches",
      "namespace": "nodetool.text",
      "description": "Finds all regex matches in text as separate substrings.\n    text, regex, find",
      "inputs": [
        {
          "name": "text",
          "type": "str",
          "description": "",
          "required": false,
          "default": ""
        },
        {
          "name": "regex",
          "type": "str",
          "description": "",
          "required": false,
          "default": ""
        },
        {
          "name": "dotall",
          "type": "bool",
          "description": "",
          "required": false,
          "default": false
        },
        {
          "name": "ignorecase",
          "type": "bool",
          "description": "",
          "required": false,
          "default": false
        },
        {
          "name": "multiline",
          "type": "bool",
          "description": "",
          "required": false,
          "default": false
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "list[str]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/text/findallregexmatches",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/text/findallregexmatches.md"
    },
    {
      "type": "nodetool.text.HasLength",
      "title": "Check Length",
      "namespace": "nodetool.text",
      "description": "Checks if text length meets specified conditions.\n    text, check, length, compare, validate, whitespace, string",
      "inputs": [
        {
          "name": "text",
          "type": "str",
          "description": "",
          "required": false,
          "default": ""
        },
        {
          "name": "min_length",
          "type": "int",
          "description": "",
          "required": false,
          "default": 0
        },
        {
          "name": "max_length",
          "type": "int",
          "description": "",
          "required": false,
          "default": 0
        },
        {
          "name": "exact_length",
          "type": "int",
          "description": "",
          "required": false,
          "default": 0
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "bool"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/text/checklength",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/text/checklength.md"
    },
    {
      "type": "nodetool.text.HtmlToText",
      "title": "HTML to Text",
      "namespace": "nodetool.text",
      "description": "Converts HTML content to plain text using html2text.\n    html, convert, text, parse, extract",
      "inputs": [
        {
          "name": "html",
          "type": "str",
          "description": "HTML content to convert",
          "required": false,
          "default": ""
        },
        {
          "name": "base_url",
          "type": "str",
          "description": "Base URL for resolving relative links",
          "required": false,
          "default": ""
        },
        {
          "name": "body_width",
          "type": "int",
          "description": "Width for text wrapping",
          "required": false,
          "default": 1000
        },
        {
          "name": "ignore_images",
          "type": "bool",
          "description": "Whether to ignore image tags",
          "required": false,
          "default": true
        },
        {
          "name": "ignore_mailto_links",
          "type": "bool",
          "description": "Whether to ignore mailto links",
          "required": false,
          "default": true
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/text/htmltotext",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/text/htmltotext.md"
    },
    {
      "type": "nodetool.text.IndexOf",
      "title": "Index Of",
      "namespace": "nodetool.text",
      "description": "Finds the position of a substring in text.\n    text, search, find, substring",
      "inputs": [
        {
          "name": "text",
          "type": "str",
          "description": "",
          "required": false,
          "default": ""
        },
        {
          "name": "substring",
          "type": "str",
          "description": "",
          "required": false,
          "default": ""
        },
        {
          "name": "case_sensitive",
          "type": "bool",
          "description": "",
          "required": false,
          "default": true
        },
        {
          "name": "start_index",
          "type": "int",
          "description": "Index to begin the search from",
          "required": false,
          "default": 0
        },
        {
          "name": "end_index",
          "type": "int",
          "description": "Optional exclusive end index for the search",
          "required": false,
          "default": 0
        },
        {
          "name": "search_from_end",
          "type": "bool",
          "description": "Use the last occurrence instead of the first",
          "required": false,
          "default": false
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "int"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/text/indexof",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/text/indexof.md"
    },
    {
      "type": "nodetool.text.IsEmpty",
      "title": "Is Empty",
      "namespace": "nodetool.text",
      "description": "Checks if text is empty or contains only whitespace.\n    text, check, empty, compare, validate, whitespace, string",
      "inputs": [
        {
          "name": "text",
          "type": "str",
          "description": "",
          "required": false,
          "default": ""
        },
        {
          "name": "trim_whitespace",
          "type": "bool",
          "description": "",
          "required": false,
          "default": true
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "bool"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/text/isempty",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/text/isempty.md"
    },
    {
      "type": "nodetool.text.Join",
      "title": "Join",
      "namespace": "nodetool.text",
      "description": "Joins a list of strings into a single string using a specified separator.\n    text, join, combine, concatenate, merge, list",
      "inputs": [
        {
          "name": "strings",
          "type": "list[str]",
          "description": "The list of strings to join.",
          "required": false,
          "default": []
        },
        {
          "name": "separator",
          "type": "str",
          "description": "Separator between items.",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/text/join",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/text/join.md"
    },
    {
      "type": "nodetool.text.Length",
      "title": "Measure Length",
      "namespace": "nodetool.text",
      "description": "Measures text length as characters, words, or lines.\n    text, analyze, length, count",
      "inputs": [
        {
          "name": "text",
          "type": "str",
          "description": "",
          "required": false,
          "default": ""
        },
        {
          "name": "measure",
          "type": "enum",
          "description": "Choose whether to count characters, words, or lines",
          "required": false,
          "default": "characters"
        },
        {
          "name": "trim_whitespace",
          "type": "bool",
          "description": "Strip whitespace before counting",
          "required": false,
          "default": false
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "int"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/text/measurelength",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/text/measurelength.md"
    },
    {
      "type": "nodetool.text.LoadTextAssets",
      "title": "Load Text Assets",
      "namespace": "nodetool.text",
      "description": "Load text files from an asset folder.\n    load, text, file, import",
      "inputs": [
        {
          "name": "folder",
          "type": "folder",
          "description": "The asset folder to load the text files from.",
          "required": false,
          "default": {
            "type": "folder",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        }
      ],
      "outputs": [
        {
          "name": "text",
          "type": "text"
        },
        {
          "name": "name",
          "type": "str"
        },
        {
          "name": "texts",
          "type": "list"
        },
        {
          "name": "names",
          "type": "list"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/text/loadtextassets",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/text/loadtextassets.md"
    },
    {
      "type": "nodetool.text.LoadTextFolder",
      "title": "Load Text Folder",
      "namespace": "nodetool.text",
      "description": "Load all text files from a folder, optionally including subfolders.\n    text, load, folder, files",
      "inputs": [
        {
          "name": "folder",
          "type": "str",
          "description": "Folder to scan for text files",
          "required": false,
          "default": ""
        },
        {
          "name": "include_subdirectories",
          "type": "bool",
          "description": "Include text files in subfolders",
          "required": false,
          "default": false
        },
        {
          "name": "extensions",
          "type": "list[str]",
          "description": "Text file extensions to include",
          "required": false,
          "default": [
            ".txt",
            ".csv",
            ".json",
            ".xml",
            ".md",
            ".html",
            ".pdf"
          ]
        },
        {
          "name": "pattern",
          "type": "str",
          "description": "Pattern to match text files",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "text",
          "type": "str"
        },
        {
          "name": "path",
          "type": "str"
        },
        {
          "name": "texts",
          "type": "list"
        },
        {
          "name": "paths",
          "type": "list"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/text/loadtextfolder",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/text/loadtextfolder.md"
    },
    {
      "type": "nodetool.text.PadText",
      "title": "Pad Text",
      "namespace": "nodetool.text",
      "description": "Pads text to a target length.\n    text, pad, length, format",
      "inputs": [
        {
          "name": "text",
          "type": "str",
          "description": "",
          "required": false,
          "default": ""
        },
        {
          "name": "length",
          "type": "int",
          "description": "",
          "required": false,
          "default": 0
        },
        {
          "name": "pad_character",
          "type": "str",
          "description": "Single character to use for padding",
          "required": false,
          "default": " "
        },
        {
          "name": "direction",
          "type": "enum",
          "description": "Where padding should be applied",
          "required": false,
          "default": "right"
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/text/padtext",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/text/padtext.md"
    },
    {
      "type": "nodetool.text.ParseJSON",
      "title": "Parse JSON String",
      "namespace": "nodetool.text",
      "description": "Parses a JSON string into a Python object.\n    json, parse, convert",
      "inputs": [
        {
          "name": "text",
          "type": "str",
          "description": "",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "any"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/text/parsejsonstring",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/text/parsejsonstring.md"
    },
    {
      "type": "nodetool.text.Prompt",
      "title": "Prompt",
      "namespace": "nodetool.text",
      "description": "Compose a prompt string with named variables. Add variables via the Add Variable button; reference them in the prompt as {{ variable }} (or {variable}). Supports filters: {{ var|upper }}, {{ var|lower }}, {{ var|capitalize }}, {{ var|title }}, {{ var|trim }}, {{ var|truncate(n) }}, {{ var|default(val) }}.\n    prompt, text, template, variable, llm, agent",
      "inputs": [
        {
          "name": "prompt",
          "type": "str",
          "description": "Prompt text. Reference variables with {{ name }} or {name}.",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/text/prompt",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/text/prompt.md"
    },
    {
      "type": "nodetool.text.RegexMatch",
      "title": "Find Regex Matches",
      "namespace": "nodetool.text",
      "description": "Find all matches of a regex pattern in text.\n    regex, search, pattern, match\n\n    Use cases:\n    - Extract specific patterns from text\n    - Validate text against patterns\n    - Find all occurrences of a pattern",
      "inputs": [
        {
          "name": "text",
          "type": "str",
          "description": "Text to search in",
          "required": false,
          "default": ""
        },
        {
          "name": "pattern",
          "type": "str",
          "description": "Regular expression pattern",
          "required": false,
          "default": ""
        },
        {
          "name": "group",
          "type": "int",
          "description": "Capture group to extract (0 for full match)",
          "required": false,
          "default": 0
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "list[str]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/text/findregexmatches",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/text/findregexmatches.md"
    },
    {
      "type": "nodetool.text.RegexReplace",
      "title": "Replace with Regex",
      "namespace": "nodetool.text",
      "description": "Replace text matching a regex pattern.\n    regex, replace, substitute\n\n    Use cases:\n    - Clean or standardize text\n    - Remove unwanted patterns\n    - Transform text formats",
      "inputs": [
        {
          "name": "text",
          "type": "str",
          "description": "Text to perform replacements on",
          "required": false,
          "default": ""
        },
        {
          "name": "pattern",
          "type": "str",
          "description": "Regular expression pattern",
          "required": false,
          "default": ""
        },
        {
          "name": "replacement",
          "type": "str",
          "description": "Replacement text",
          "required": false,
          "default": ""
        },
        {
          "name": "count",
          "type": "int",
          "description": "Maximum replacements (0 for unlimited)",
          "required": false,
          "default": 0
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/text/replacewithregex",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/text/replacewithregex.md"
    },
    {
      "type": "nodetool.text.RegexSplit",
      "title": "Split with Regex",
      "namespace": "nodetool.text",
      "description": "Split text using a regex pattern as delimiter.\n    regex, split, tokenize\n\n    Use cases:\n    - Parse structured text\n    - Extract fields from formatted strings\n    - Tokenize text",
      "inputs": [
        {
          "name": "text",
          "type": "str",
          "description": "Text to split",
          "required": false,
          "default": ""
        },
        {
          "name": "pattern",
          "type": "str",
          "description": "Regular expression pattern to split on",
          "required": false,
          "default": ""
        },
        {
          "name": "maxsplit",
          "type": "int",
          "description": "Maximum number of splits (0 for unlimited)",
          "required": false,
          "default": 0
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "list[str]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/text/splitwithregex",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/text/splitwithregex.md"
    },
    {
      "type": "nodetool.text.RegexValidate",
      "title": "Validate with Regex",
      "namespace": "nodetool.text",
      "description": "Check if text matches a regex pattern.\n    regex, validate, check\n\n    Use cases:\n    - Validate input formats (email, phone, etc)\n    - Check text structure\n    - Filter text based on patterns",
      "inputs": [
        {
          "name": "text",
          "type": "str",
          "description": "Text to validate",
          "required": false,
          "default": ""
        },
        {
          "name": "pattern",
          "type": "str",
          "description": "Regular expression pattern",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "bool"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/text/validatewithregex",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/text/validatewithregex.md"
    },
    {
      "type": "nodetool.text.RemovePunctuation",
      "title": "Remove Punctuation",
      "namespace": "nodetool.text",
      "description": "Removes punctuation characters from text.\n    text, cleanup, punctuation, normalize",
      "inputs": [
        {
          "name": "text",
          "type": "str",
          "description": "",
          "required": false,
          "default": ""
        },
        {
          "name": "replacement",
          "type": "str",
          "description": "String to insert where punctuation was removed",
          "required": false,
          "default": ""
        },
        {
          "name": "punctuation",
          "type": "str",
          "description": "Characters that should be removed or replaced",
          "required": false,
          "default": "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~"
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/text/removepunctuation",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/text/removepunctuation.md"
    },
    {
      "type": "nodetool.text.Replace",
      "title": "Replace Text",
      "namespace": "nodetool.text",
      "description": "Replaces a substring in a text with another substring.\n    text, replace, substitute\n\n    Use cases:\n    - Correcting or updating specific text patterns\n    - Sanitizing or normalizing text data\n    - Implementing simple text transformations",
      "inputs": [
        {
          "name": "text",
          "type": "str",
          "description": "The input text.",
          "required": false,
          "default": ""
        },
        {
          "name": "old",
          "type": "str",
          "description": "Substring to find.",
          "required": false,
          "default": ""
        },
        {
          "name": "new_value",
          "type": "str",
          "description": "Replacement string.",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/text/replacetext",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/text/replacetext.md"
    },
    {
      "type": "nodetool.text.SaveText",
      "title": "Save Text",
      "namespace": "nodetool.text",
      "description": "Saves input text to a file in the assets folder.\n    text, save, file\n\n    Use cases:\n    - Persisting processed text results\n    - Creating text files for downstream nodes or external use\n    - Archiving text data within the workflow",
      "inputs": [
        {
          "name": "text",
          "type": "str",
          "description": "",
          "required": false,
          "default": ""
        },
        {
          "name": "folder",
          "type": "folder",
          "description": "Name of the output folder.",
          "required": false,
          "default": {
            "type": "folder",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "name",
          "type": "str",
          "description": "\n        Name of the output file.\n        You can use time and date variables to create unique names:\n        %Y - Year\n        %m - Month\n        %d - Day\n        %H - Hour\n        %M - Minute\n        %S - Second\n        ",
          "required": false,
          "default": "%Y-%m-%d-%H-%M-%S.txt"
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "text"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/text/savetext",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/text/savetext.md"
    },
    {
      "type": "nodetool.text.SaveTextFile",
      "title": "Save Text File",
      "namespace": "nodetool.text",
      "description": "Saves input text to a file in the assets folder.\n    text, save, file",
      "inputs": [
        {
          "name": "text",
          "type": "str",
          "description": "",
          "required": false,
          "default": ""
        },
        {
          "name": "folder",
          "type": "str",
          "description": "Path to the output folder.",
          "required": false,
          "default": ""
        },
        {
          "name": "name",
          "type": "str",
          "description": "\n        Name of the output file.\n        You can use time and date variables to create unique names:\n        %Y - Year\n        %m - Month\n        %d - Day\n        %H - Hour\n        %M - Minute\n        %S - Second\n        ",
          "required": false,
          "default": "%Y-%m-%d-%H-%M-%S.txt"
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "text"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/text/savetextfile",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/text/savetextfile.md"
    },
    {
      "type": "nodetool.text.Slice",
      "title": "Slice Text",
      "namespace": "nodetool.text",
      "description": "Slices text using Python's slice notation (start:stop:step).\n    text, slice, substring\n\n    Use cases:\n    - Extracting specific portions of text with flexible indexing\n    - Reversing text using negative step\n    - Taking every nth character with step parameter\n\n    Examples:\n    - start=0, stop=5: first 5 characters\n    - start=-5: last 5 characters\n    - step=2: every second character\n    - step=-1: reverse the text",
      "inputs": [
        {
          "name": "text",
          "type": "str",
          "description": "",
          "required": false,
          "default": ""
        },
        {
          "name": "start",
          "type": "int",
          "description": "",
          "required": false,
          "default": 0
        },
        {
          "name": "stop",
          "type": "int",
          "description": "",
          "required": false,
          "default": 0
        },
        {
          "name": "step",
          "type": "int",
          "description": "",
          "required": false,
          "default": 1
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/text/slicetext",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/text/slicetext.md"
    },
    {
      "type": "nodetool.text.Slugify",
      "title": "Slugify",
      "namespace": "nodetool.text",
      "description": "Converts text into a slug suitable for URLs or IDs.\n    text, slug, normalize, id",
      "inputs": [
        {
          "name": "text",
          "type": "str",
          "description": "",
          "required": false,
          "default": ""
        },
        {
          "name": "separator",
          "type": "str",
          "description": "",
          "required": false,
          "default": "-"
        },
        {
          "name": "lowercase",
          "type": "bool",
          "description": "",
          "required": false,
          "default": true
        },
        {
          "name": "allow_unicode",
          "type": "bool",
          "description": "Keep unicode letters instead of converting to ASCII",
          "required": false,
          "default": false
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/text/slugify",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/text/slugify.md"
    },
    {
      "type": "nodetool.text.Split",
      "title": "Split Text",
      "namespace": "nodetool.text",
      "description": "Separates text into a list of strings based on a specified delimiter.\n    text, split, tokenize",
      "inputs": [
        {
          "name": "text",
          "type": "str",
          "description": "",
          "required": false,
          "default": ""
        },
        {
          "name": "delimiter",
          "type": "str",
          "description": "",
          "required": false,
          "default": ","
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "list[str]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/text/splittext",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/text/splittext.md"
    },
    {
      "type": "nodetool.text.StartsWith",
      "title": "Starts With",
      "namespace": "nodetool.text",
      "description": "Checks if text starts with a specified prefix.\n    text, check, prefix, compare, validate, substring, string\n\n    Use cases:\n    - Validating string prefixes\n    - Filtering text based on starting content\n    - Checking file name patterns",
      "inputs": [
        {
          "name": "text",
          "type": "str",
          "description": "",
          "required": false,
          "default": ""
        },
        {
          "name": "prefix",
          "type": "str",
          "description": "",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "bool"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/text/startswith",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/text/startswith.md"
    },
    {
      "type": "nodetool.text.StripAccents",
      "title": "Strip Accents",
      "namespace": "nodetool.text",
      "description": "Removes accent marks while keeping base characters.\n    text, cleanup, accents, normalize",
      "inputs": [
        {
          "name": "text",
          "type": "str",
          "description": "",
          "required": false,
          "default": ""
        },
        {
          "name": "preserve_non_ascii",
          "type": "bool",
          "description": "Keep non-ASCII characters that are not accents",
          "required": false,
          "default": true
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/text/stripaccents",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/text/stripaccents.md"
    },
    {
      "type": "nodetool.text.SurroundWith",
      "title": "Surround With",
      "namespace": "nodetool.text",
      "description": "Wraps text with the provided prefix and suffix.\n    text, format, surround, decorate",
      "inputs": [
        {
          "name": "text",
          "type": "str",
          "description": "",
          "required": false,
          "default": ""
        },
        {
          "name": "prefix",
          "type": "str",
          "description": "",
          "required": false,
          "default": ""
        },
        {
          "name": "suffix",
          "type": "str",
          "description": "",
          "required": false,
          "default": ""
        },
        {
          "name": "skip_if_wrapped",
          "type": "bool",
          "description": "Do not add duplicates if the text is already wrapped",
          "required": false,
          "default": true
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/text/surroundwith",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/text/surroundwith.md"
    },
    {
      "type": "nodetool.text.Template",
      "title": "Template",
      "namespace": "nodetool.text",
      "description": "Uses template syntax to format strings with variables. Supports {{ variable }} and {variable} patterns.\n    text, template, formatting, format, combine, concatenate, variable, replace\n\n    Use cases:\n    - Generating personalized messages\n    - Creating parameterized queries\n    - Formatting text with variable inputs",
      "inputs": [
        {
          "name": "string",
          "type": "str",
          "description": "Template string with {{ variable }} or {variable} placeholders.",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/text/template",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/text/template.md"
    },
    {
      "type": "nodetool.text.ToLowercase",
      "title": "To Lowercase",
      "namespace": "nodetool.text",
      "description": "Converts text to lowercase.\n    text, transform, lowercase, format",
      "inputs": [
        {
          "name": "text",
          "type": "str",
          "description": "",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/text/tolowercase",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/text/tolowercase.md"
    },
    {
      "type": "nodetool.text.ToString",
      "title": "To String",
      "namespace": "nodetool.text",
      "description": "Converts any input value to its string representation.\n    text, string, convert, repr, str, cast",
      "inputs": [
        {
          "name": "value",
          "type": "any",
          "description": "The value to convert to string.",
          "required": false,
          "default": ""
        },
        {
          "name": "mode",
          "type": "enum",
          "description": "Conversion mode: 'str' for normal string, 'repr' for JSON-quoted representation.",
          "required": false,
          "default": "str"
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/text/tostring",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/text/tostring.md"
    },
    {
      "type": "nodetool.text.ToTitlecase",
      "title": "To Title Case",
      "namespace": "nodetool.text",
      "description": "Converts text to title case.\n    text, transform, titlecase, format\n\n    Use cases:\n    - Cleaning user provided titles before display\n    - Normalizing headings in generated documents\n    - Making list entries easier to scan",
      "inputs": [
        {
          "name": "text",
          "type": "str",
          "description": "",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/text/totitlecase",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/text/totitlecase.md"
    },
    {
      "type": "nodetool.text.ToUppercase",
      "title": "To Uppercase",
      "namespace": "nodetool.text",
      "description": "Converts text to uppercase.\n    text, transform, uppercase, format",
      "inputs": [
        {
          "name": "text",
          "type": "str",
          "description": "",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/text/touppercase",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/text/touppercase.md"
    },
    {
      "type": "nodetool.text.TrimWhitespace",
      "title": "Trim Whitespace",
      "namespace": "nodetool.text",
      "description": "Trims whitespace from the start and/or end of text.\n    text, whitespace, clean, remove",
      "inputs": [
        {
          "name": "text",
          "type": "str",
          "description": "",
          "required": false,
          "default": ""
        },
        {
          "name": "trim_start",
          "type": "bool",
          "description": "",
          "required": false,
          "default": true
        },
        {
          "name": "trim_end",
          "type": "bool",
          "description": "",
          "required": false,
          "default": true
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/text/trimwhitespace",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/text/trimwhitespace.md"
    },
    {
      "type": "nodetool.text.TruncateText",
      "title": "Truncate Text",
      "namespace": "nodetool.text",
      "description": "Truncates text to a maximum length.\n    text, truncate, length, clip",
      "inputs": [
        {
          "name": "text",
          "type": "str",
          "description": "",
          "required": false,
          "default": ""
        },
        {
          "name": "max_length",
          "type": "int",
          "description": "",
          "required": false,
          "default": 100
        },
        {
          "name": "ellipsis",
          "type": "str",
          "description": "Optional suffix appended when truncation occurs",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/text/truncatetext",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/text/truncatetext.md"
    },
    {
      "type": "nodetool.timeline.AddClips",
      "title": "Add Clips To Timeline",
      "namespace": "nodetool.timeline",
      "description": "Append media to a timeline sequence as clips (videos and images on the video track, audio on the audio track). Creates a new timeline when none is given.\n    timeline, clips, append, assemble, storyboard\n\n    Use cases:\n    - Assemble generated shots into an editable rough cut\n    - Turn a storyboard's images into an animatic\n    - Add a generated voiceover or soundtrack under an edit",
      "inputs": [
        {
          "name": "timeline",
          "type": "timeline",
          "description": "Timeline to append to. Leave empty to create a new timeline.",
          "required": false,
          "default": {
            "type": "timeline",
            "id": null,
            "data": null
          }
        },
        {
          "name": "clips",
          "type": "list",
          "description": "Media to append: image, video, and audio references.",
          "required": false,
          "default": []
        },
        {
          "name": "name",
          "type": "str",
          "description": "Name for the timeline when a new one is created.",
          "required": false,
          "default": "Untitled video"
        },
        {
          "name": "image_duration_ms",
          "type": "int",
          "description": "Clip duration for still images, in milliseconds.",
          "required": false,
          "default": 3000
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "timeline"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/timeline/addclipstotimeline",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/timeline/addclipstotimeline.md"
    },
    {
      "type": "nodetool.timeline.RenderTimeline",
      "title": "Render Timeline",
      "namespace": "nodetool.timeline",
      "description": "Render a timeline sequence to a video (rough cut: clips are concatenated in start order, audio tracks are mixed in at their offsets).\n    timeline, render, video, export, cut\n\n    Use cases:\n    - Turn an edit assembled in the timeline editor into a shareable video\n    - Feed a rough cut into captioning, review, or upload nodes\n    - Automate exports of timelines built by other workflow nodes",
      "inputs": [
        {
          "name": "timeline",
          "type": "timeline",
          "description": "The timeline sequence to render.",
          "required": false,
          "default": {
            "type": "timeline",
            "id": null,
            "data": null
          }
        },
        {
          "name": "include_audio",
          "type": "bool",
          "description": "Mix audio-track clips into the rendered video.",
          "required": false,
          "default": true
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "video"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/timeline/rendertimeline",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/timeline/rendertimeline.md"
    },
    {
      "type": "nodetool.timeline.Transcript",
      "title": "Timeline Transcript",
      "namespace": "nodetool.timeline",
      "description": "Extract the transcript of a timeline sequence as text.\n    timeline, transcript, text, script, voiceover\n\n    Use cases:\n    - Summarize or rewrite an edit's narration with an LLM\n    - Generate titles, descriptions, or chapters from the spoken script\n    - Translate a voiceover script before re-recording with TTS",
      "inputs": [
        {
          "name": "timeline",
          "type": "timeline",
          "description": "The timeline sequence to read the transcript from.",
          "required": false,
          "default": {
            "type": "timeline",
            "id": null,
            "data": null
          }
        }
      ],
      "outputs": [
        {
          "name": "text",
          "type": "str"
        },
        {
          "name": "lines",
          "type": "list[str]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/timeline/timelinetranscript",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/timeline/timelinetranscript.md"
    },
    {
      "type": "nodetool.triggers.FileWatchTrigger",
      "title": "File Watch Trigger",
      "namespace": "nodetool.triggers",
      "description": "",
      "inputs": [
        {
          "name": "max_events",
          "type": "int",
          "description": "Maximum number of events to process (0 = unlimited)",
          "required": false,
          "default": 0
        },
        {
          "name": "path",
          "type": "str",
          "description": "Path to watch (file or directory)",
          "required": false,
          "default": "."
        },
        {
          "name": "recursive",
          "type": "bool",
          "description": "Watch subdirectories recursively",
          "required": false,
          "default": false
        },
        {
          "name": "patterns",
          "type": "list[str]",
          "description": "File patterns to watch (e.g., ['*.txt', '*.json'])",
          "required": false,
          "default": [
            "*"
          ]
        },
        {
          "name": "ignore_patterns",
          "type": "list[str]",
          "description": "File patterns to ignore",
          "required": false,
          "default": []
        },
        {
          "name": "events",
          "type": "list[str]",
          "description": "Types of events to watch for",
          "required": false,
          "default": [
            "created",
            "modified",
            "deleted",
            "moved"
          ]
        },
        {
          "name": "debounce_seconds",
          "type": "float",
          "description": "Debounce time to avoid duplicate events",
          "required": false,
          "default": 0.5
        }
      ],
      "outputs": [
        {
          "name": "event",
          "type": "str"
        },
        {
          "name": "path",
          "type": "str"
        },
        {
          "name": "dest_path",
          "type": "str"
        },
        {
          "name": "is_directory",
          "type": "bool"
        },
        {
          "name": "timestamp",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/triggers/filewatchtrigger",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/triggers/filewatchtrigger.md"
    },
    {
      "type": "nodetool.triggers.IntervalTrigger",
      "title": "Interval Trigger",
      "namespace": "nodetool.triggers",
      "description": "",
      "inputs": [
        {
          "name": "max_events",
          "type": "int",
          "description": "Maximum number of events to process (0 = unlimited)",
          "required": false,
          "default": 0
        },
        {
          "name": "interval_seconds",
          "type": "float",
          "description": "Interval between triggers in seconds",
          "required": false,
          "default": 60
        },
        {
          "name": "initial_delay_seconds",
          "type": "float",
          "description": "Delay before the first trigger fires",
          "required": false,
          "default": 0
        },
        {
          "name": "emit_on_start",
          "type": "bool",
          "description": "Whether to emit an event immediately on start",
          "required": false,
          "default": true
        },
        {
          "name": "include_drift_compensation",
          "type": "bool",
          "description": "Compensate for execution time to maintain accurate intervals",
          "required": false,
          "default": true
        }
      ],
      "outputs": [
        {
          "name": "tick",
          "type": "int"
        },
        {
          "name": "elapsed_seconds",
          "type": "float"
        },
        {
          "name": "interval_seconds",
          "type": "float"
        },
        {
          "name": "timestamp",
          "type": "str"
        },
        {
          "name": "source",
          "type": "str"
        },
        {
          "name": "event_type",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/triggers/intervaltrigger",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/triggers/intervaltrigger.md"
    },
    {
      "type": "nodetool.triggers.ManualTrigger",
      "title": "Manual Trigger",
      "namespace": "nodetool.triggers",
      "description": "",
      "inputs": [
        {
          "name": "max_events",
          "type": "int",
          "description": "Maximum number of events to process (0 = unlimited)",
          "required": false,
          "default": 0
        },
        {
          "name": "name",
          "type": "str",
          "description": "Name for this trigger (used in API calls)",
          "required": false,
          "default": "manual_trigger"
        },
        {
          "name": "timeout_seconds",
          "type": "float",
          "description": "Timeout waiting for events (None = wait forever)",
          "required": false,
          "default": null
        }
      ],
      "outputs": [
        {
          "name": "data",
          "type": "any"
        },
        {
          "name": "timestamp",
          "type": "str"
        },
        {
          "name": "source",
          "type": "str"
        },
        {
          "name": "event_type",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/triggers/manualtrigger",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/triggers/manualtrigger.md"
    },
    {
      "type": "nodetool.triggers.Wait",
      "title": "Wait",
      "namespace": "nodetool.triggers",
      "description": "",
      "inputs": [
        {
          "name": "timeout_seconds",
          "type": "int",
          "description": "Seconds to wait before continuing (0 = no wait)",
          "required": false,
          "default": 0
        },
        {
          "name": "input",
          "type": "any",
          "description": "Input data to pass through to the output after waiting",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "data",
          "type": "any"
        },
        {
          "name": "resumed_at",
          "type": "str"
        },
        {
          "name": "waited_seconds",
          "type": "float"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/triggers/wait",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/triggers/wait.md"
    },
    {
      "type": "nodetool.triggers.WebhookTrigger",
      "title": "Webhook Trigger",
      "namespace": "nodetool.triggers",
      "description": "",
      "inputs": [
        {
          "name": "max_events",
          "type": "int",
          "description": "Maximum number of events to process (0 = unlimited)",
          "required": false,
          "default": 0
        },
        {
          "name": "port",
          "type": "int",
          "description": "Port to listen on for webhook requests",
          "required": false,
          "default": 8080
        },
        {
          "name": "path",
          "type": "str",
          "description": "URL path to listen on",
          "required": false,
          "default": "/webhook"
        },
        {
          "name": "host",
          "type": "str",
          "description": "Host address to bind to. Use '0.0.0.0' to listen on all interfaces.",
          "required": false,
          "default": "127.0.0.1"
        },
        {
          "name": "methods",
          "type": "list[str]",
          "description": "HTTP methods to accept",
          "required": false,
          "default": [
            "POST"
          ]
        },
        {
          "name": "secret",
          "type": "str",
          "description": "Optional secret for validating requests (checks X-Webhook-Secret header)",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "body",
          "type": "any"
        },
        {
          "name": "headers",
          "type": "dict[str, any]"
        },
        {
          "name": "query",
          "type": "dict[str, any]"
        },
        {
          "name": "method",
          "type": "str"
        },
        {
          "name": "path",
          "type": "str"
        },
        {
          "name": "timestamp",
          "type": "str"
        },
        {
          "name": "source",
          "type": "str"
        },
        {
          "name": "event_type",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/triggers/webhooktrigger",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/triggers/webhooktrigger.md"
    },
    {
      "type": "nodetool.variable.GetVariable",
      "title": "Get Variable",
      "namespace": "nodetool.variable",
      "description": "",
      "inputs": [
        {
          "name": "name",
          "type": "str",
          "description": "Name of the variable channel to read.",
          "required": false,
          "default": ""
        },
        {
          "name": "trigger",
          "type": "any",
          "description": "",
          "required": false,
          "default": null
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "any"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/variable/getvariable",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/variable/getvariable.md"
    },
    {
      "type": "nodetool.variable.SetVariable",
      "title": "Set Variable",
      "namespace": "nodetool.variable",
      "description": "",
      "inputs": [
        {
          "name": "name",
          "type": "str",
          "description": "Name of the variable channel to publish the value on.",
          "required": false,
          "default": ""
        },
        {
          "name": "value",
          "type": "any",
          "description": "Value to publish. Passed through unchanged to the output.",
          "required": false,
          "default": null
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "any"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/variable/setvariable",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/variable/setvariable.md"
    },
    {
      "type": "nodetool.video.AddAudio",
      "title": "Add Audio",
      "namespace": "nodetool.video",
      "description": "Add an audio track to a video, replacing or mixing with existing audio.\n    video, audio, soundtrack, merge",
      "inputs": [
        {
          "name": "video",
          "type": "video",
          "description": "The input video to add audio to.",
          "required": false,
          "default": {
            "type": "video",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null,
            "duration": null,
            "format": null
          }
        },
        {
          "name": "audio",
          "type": "audio",
          "description": "The audio file to add to the video.",
          "required": false,
          "default": {
            "type": "audio",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "volume",
          "type": "float",
          "description": "Volume adjustment for the added audio. 1.0 is original volume.",
          "required": false,
          "default": 1
        },
        {
          "name": "mix",
          "type": "bool",
          "description": "If True, mix new audio with existing. If False, replace existing audio.",
          "required": false,
          "default": false
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "video"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/video/addaudio",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/video/addaudio.md"
    },
    {
      "type": "nodetool.video.AddSubtitles",
      "title": "Add Subtitles",
      "namespace": "nodetool.video",
      "description": "Add subtitles to a video.\n    video, subtitles, text, caption",
      "inputs": [
        {
          "name": "video",
          "type": "video",
          "description": "The input video to add subtitles to.",
          "required": false,
          "default": {
            "type": "video",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null,
            "duration": null,
            "format": null
          }
        },
        {
          "name": "chunks",
          "type": "list[audio_chunk]",
          "description": "Audio chunks to add as subtitles.",
          "required": false,
          "default": []
        },
        {
          "name": "font",
          "type": "font",
          "description": "The font to use.",
          "required": false,
          "default": {
            "type": "font",
            "name": "",
            "source": "system",
            "url": "",
            "weight": "regular"
          }
        },
        {
          "name": "align",
          "type": "enum",
          "description": "Vertical alignment of subtitles.",
          "required": false,
          "default": "bottom"
        },
        {
          "name": "font_size",
          "type": "int",
          "description": "The font size.",
          "required": false,
          "default": 24
        },
        {
          "name": "font_color",
          "type": "color",
          "description": "The font color.",
          "required": false,
          "default": {
            "type": "color",
            "value": "#FFFFFF"
          }
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "video"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/video/addsubtitles",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/video/addsubtitles.md"
    },
    {
      "type": "nodetool.video.Blur",
      "title": "Blur",
      "namespace": "nodetool.video",
      "description": "Apply a blur effect to a video.\n    video, blur, smooth, soften",
      "inputs": [
        {
          "name": "video",
          "type": "video",
          "description": "The input video to apply blur effect.",
          "required": false,
          "default": {
            "type": "video",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null,
            "duration": null,
            "format": null
          }
        },
        {
          "name": "strength",
          "type": "float",
          "description": "The strength of the blur effect. Higher values create a stronger blur.",
          "required": false,
          "default": 5
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "video"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/video/blur",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/video/blur.md"
    },
    {
      "type": "nodetool.video.ChromaKey",
      "title": "Chroma Key",
      "namespace": "nodetool.video",
      "description": "Apply chroma key (green screen) effect to a video. The MP4 output has no alpha channel, so the keyed-out area renders black — composite it over a background with the Overlay node.\n    video, chroma key, green screen, compositing",
      "inputs": [
        {
          "name": "video",
          "type": "video",
          "description": "The input video to apply chroma key effect.",
          "required": false,
          "default": {
            "type": "video",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null,
            "duration": null,
            "format": null
          }
        },
        {
          "name": "key_color",
          "type": "color",
          "description": "The color to key out (e.g., '#00FF00' for green).",
          "required": false,
          "default": {
            "type": "color",
            "value": "#00FF00"
          }
        },
        {
          "name": "similarity",
          "type": "float",
          "description": "Similarity threshold for the key color.",
          "required": false,
          "default": 0.3
        },
        {
          "name": "blend",
          "type": "float",
          "description": "Blending of the keyed area edges.",
          "required": false,
          "default": 0.1
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "video"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/video/chromakey",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/video/chromakey.md"
    },
    {
      "type": "nodetool.video.ColorBalance",
      "title": "Color Balance",
      "namespace": "nodetool.video",
      "description": "Adjust the color balance of a video.\n    video, color, balance, adjustment",
      "inputs": [
        {
          "name": "video",
          "type": "video",
          "description": "The input video to adjust color balance.",
          "required": false,
          "default": {
            "type": "video",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null,
            "duration": null,
            "format": null
          }
        },
        {
          "name": "red_adjust",
          "type": "float",
          "description": "Red channel adjustment factor.",
          "required": false,
          "default": 1
        },
        {
          "name": "green_adjust",
          "type": "float",
          "description": "Green channel adjustment factor.",
          "required": false,
          "default": 1
        },
        {
          "name": "blue_adjust",
          "type": "float",
          "description": "Blue channel adjustment factor.",
          "required": false,
          "default": 1
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "video"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/video/colorbalance",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/video/colorbalance.md"
    },
    {
      "type": "nodetool.video.Concat",
      "title": "Concatenate Video",
      "namespace": "nodetool.video",
      "description": "Concatenate multiple video files into a single video, including audio when available. Add inputs dynamically with the “add video input” button, or wire a list of videos into a single input.\n    video, concat, merge, combine, audio, +",
      "inputs": [],
      "outputs": [
        {
          "name": "output",
          "type": "video"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/video/concatenatevideo",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/video/concatenatevideo.md"
    },
    {
      "type": "nodetool.video.Denoise",
      "title": "Denoise",
      "namespace": "nodetool.video",
      "description": "Apply noise reduction to a video.\n    video, denoise, clean, enhance",
      "inputs": [
        {
          "name": "video",
          "type": "video",
          "description": "The input video to denoise.",
          "required": false,
          "default": {
            "type": "video",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null,
            "duration": null,
            "format": null
          }
        },
        {
          "name": "strength",
          "type": "float",
          "description": "Strength of the denoising effect. Higher values mean more denoising.",
          "required": false,
          "default": 5
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "video"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/video/denoise",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/video/denoise.md"
    },
    {
      "type": "nodetool.video.ExtractAudio",
      "title": "Extract Audio",
      "namespace": "nodetool.video",
      "description": "Separate and extract audio track from a video file.\n    video, audio, extract, separate, split",
      "inputs": [
        {
          "name": "video",
          "type": "video",
          "description": "The input video to separate.",
          "required": false,
          "default": {
            "type": "video",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null,
            "duration": null,
            "format": null
          }
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "audio"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/video/extractaudio",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/video/extractaudio.md"
    },
    {
      "type": "nodetool.video.ExtractFrame",
      "title": "Extract Video Frame",
      "namespace": "nodetool.video",
      "description": "Extract a single frame from a video at a specific time position.\n    video, frame, extract, screenshot, thumbnail, capture",
      "inputs": [
        {
          "name": "video",
          "type": "video",
          "description": "The input video to extract a frame from.",
          "required": false,
          "default": {
            "type": "video",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null,
            "duration": null,
            "format": null
          }
        },
        {
          "name": "time",
          "type": "float",
          "description": "Time position in seconds to extract the frame from.",
          "required": false,
          "default": 0
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/video/extractvideoframe",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/video/extractvideoframe.md"
    },
    {
      "type": "nodetool.video.ForEachFrame",
      "title": "For Each Frame",
      "namespace": "nodetool.video",
      "description": "Extract frames from a video file using OpenCV.\n    video, frames, extract, sequence",
      "inputs": [
        {
          "name": "video",
          "type": "video",
          "description": "The input video to extract frames from.",
          "required": false,
          "default": {
            "type": "video",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null,
            "duration": null,
            "format": null
          }
        },
        {
          "name": "start",
          "type": "int",
          "description": "The frame to start extracting from.",
          "required": false,
          "default": 0
        },
        {
          "name": "end",
          "type": "int",
          "description": "The frame to stop extracting from.",
          "required": false,
          "default": -1
        }
      ],
      "outputs": [
        {
          "name": "frame",
          "type": "image"
        },
        {
          "name": "index",
          "type": "int"
        },
        {
          "name": "fps",
          "type": "float"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/video/foreachframe",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/video/foreachframe.md"
    },
    {
      "type": "nodetool.video.Fps",
      "title": "Fps",
      "namespace": "nodetool.video",
      "description": "Get the frames per second (FPS) of a video file.\n    video, analysis, frames, fps",
      "inputs": [
        {
          "name": "video",
          "type": "video",
          "description": "The input video to analyze for FPS.",
          "required": false,
          "default": {
            "type": "video",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null,
            "duration": null,
            "format": null
          }
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "float"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/video/fps",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/video/fps.md"
    },
    {
      "type": "nodetool.video.FrameToVideo",
      "title": "Frame To Video",
      "namespace": "nodetool.video",
      "description": "Combine a sequence of frames into a single video file.\n    video, frames, combine, sequence",
      "inputs": [
        {
          "name": "frame",
          "type": "image",
          "description": "Collect input frames",
          "required": false,
          "default": {
            "type": "image",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "fps",
          "type": "float",
          "description": "The FPS of the output video.",
          "required": false,
          "default": 30
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "video"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/video/frametovideo",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/video/frametovideo.md"
    },
    {
      "type": "nodetool.video.GetVideoInfo",
      "title": "Get Video Info",
      "namespace": "nodetool.video",
      "description": "Get metadata about a video file including duration, resolution, frame rate, and codec.\n    video, info, metadata, duration, resolution, fps, codec, analysis",
      "inputs": [
        {
          "name": "video",
          "type": "video",
          "description": "The input video to analyze.",
          "required": false,
          "default": {
            "type": "video",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null,
            "duration": null,
            "format": null
          }
        }
      ],
      "outputs": [
        {
          "name": "duration",
          "type": "float"
        },
        {
          "name": "width",
          "type": "int"
        },
        {
          "name": "height",
          "type": "int"
        },
        {
          "name": "fps",
          "type": "float"
        },
        {
          "name": "frame_count",
          "type": "int"
        },
        {
          "name": "codec",
          "type": "str"
        },
        {
          "name": "has_audio",
          "type": "bool"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/video/getvideoinfo",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/video/getvideoinfo.md"
    },
    {
      "type": "nodetool.video.ImageToVideo",
      "title": "Image To Video",
      "namespace": "nodetool.video",
      "description": "Animate static images into video with AI-powered motion using any supported video provider.\n    video, image-to-video, i2v, animation, ai, generation, sora, veo",
      "inputs": [
        {
          "name": "image",
          "type": "list[image]",
          "description": "Input image(s) to animate. The first image is the primary frame; additional images are used as references by providers that support multi-image input.",
          "required": false,
          "default": []
        },
        {
          "name": "model",
          "type": "video_model",
          "description": "The video generation model to use",
          "required": false,
          "default": {
            "type": "video_model",
            "provider": "gemini",
            "id": "veo-3.1-generate-preview",
            "name": "Veo 3.1 Preview",
            "path": null,
            "supported_tasks": []
          }
        },
        {
          "name": "prompt",
          "type": "str",
          "description": "Optional text prompt to guide the video animation",
          "required": false,
          "default": ""
        },
        {
          "name": "negative_prompt",
          "type": "str",
          "description": "Text prompt describing what to avoid in the video",
          "required": false,
          "default": ""
        },
        {
          "name": "aspect_ratio",
          "type": "str",
          "description": "Aspect ratio for the video",
          "required": false,
          "default": "16:9"
        },
        {
          "name": "resolution",
          "type": "str",
          "description": "Video resolution",
          "required": false,
          "default": "1080p"
        },
        {
          "name": "duration",
          "type": "int",
          "description": "Video duration in seconds",
          "required": false,
          "default": 4
        },
        {
          "name": "timeout_seconds",
          "type": "int",
          "description": "Timeout in seconds for API calls (0 = use provider default)",
          "required": false,
          "default": 0
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "video"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/video/imagetovideo",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/video/imagetovideo.md"
    },
    {
      "type": "nodetool.video.LipSync",
      "title": "Lip Sync",
      "namespace": "nodetool.video",
      "description": "Drive a face in a video to match speech in an audio track using any supported lip-sync provider.\n    video, lip-sync, lipsync, talking-head, dubbing, AI",
      "inputs": [
        {
          "name": "model",
          "type": "video_model",
          "description": "The lip-sync model to use",
          "required": false,
          "default": {
            "type": "video_model",
            "provider": "fal_ai",
            "id": "fal-ai/sync-lipsync/v2",
            "name": "Sync Lipsync V2",
            "path": null,
            "supported_tasks": []
          }
        },
        {
          "name": "video",
          "type": "video",
          "description": "The input video containing the face to drive",
          "required": false,
          "default": {
            "type": "video",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "audio",
          "type": "audio",
          "description": "The audio track the mouth motion should follow",
          "required": false,
          "default": {
            "type": "audio",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "video"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/video/lipsync",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/video/lipsync.md"
    },
    {
      "type": "nodetool.video.LoadVideoAssets",
      "title": "Load Video Folder",
      "namespace": "nodetool.video",
      "description": "Load video files from an asset folder.\n    load, video, file, import",
      "inputs": [
        {
          "name": "folder",
          "type": "folder",
          "description": "The asset folder to load the video files from.",
          "required": false,
          "default": {
            "type": "folder",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        }
      ],
      "outputs": [
        {
          "name": "video",
          "type": "video"
        },
        {
          "name": "name",
          "type": "str"
        },
        {
          "name": "videos",
          "type": "list"
        },
        {
          "name": "names",
          "type": "list"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/video/loadvideofolder",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/video/loadvideofolder.md"
    },
    {
      "type": "nodetool.video.LoadVideoFile",
      "title": "Load Video File",
      "namespace": "nodetool.video",
      "description": "Read a video file from disk.\n    video, input, load, file",
      "inputs": [
        {
          "name": "path",
          "type": "str",
          "description": "Path to the video file to read",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "video"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/video/loadvideofile",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/video/loadvideofile.md"
    },
    {
      "type": "nodetool.video.Overlay",
      "title": "Overlay",
      "namespace": "nodetool.video",
      "description": "Overlay one video on top of another, including audio overlay when available.\n    video, overlay, composite, picture-in-picture, audio",
      "inputs": [
        {
          "name": "main_video",
          "type": "video",
          "description": "The main (background) video.",
          "required": false,
          "default": {
            "type": "video",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null,
            "duration": null,
            "format": null
          }
        },
        {
          "name": "overlay_video",
          "type": "video",
          "description": "The video to overlay on top.",
          "required": false,
          "default": {
            "type": "video",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null,
            "duration": null,
            "format": null
          }
        },
        {
          "name": "x",
          "type": "int",
          "description": "X-coordinate for overlay placement.",
          "required": false,
          "default": 0
        },
        {
          "name": "y",
          "type": "int",
          "description": "Y-coordinate for overlay placement.",
          "required": false,
          "default": 0
        },
        {
          "name": "scale",
          "type": "float",
          "description": "Scale factor for the overlay video.",
          "required": false,
          "default": 1
        },
        {
          "name": "overlay_audio_volume",
          "type": "float",
          "description": "Volume of the overlay audio relative to the main audio.",
          "required": false,
          "default": 0.5
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "video"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/video/overlay",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/video/overlay.md"
    },
    {
      "type": "nodetool.video.Resize",
      "title": "Resize",
      "namespace": "nodetool.video",
      "description": "Resize a video to a specific width and height.\n    video, resize, scale, dimensions",
      "inputs": [
        {
          "name": "video",
          "type": "video",
          "description": "The input video to resize.",
          "required": false,
          "default": {
            "type": "video",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null,
            "duration": null,
            "format": null
          }
        },
        {
          "name": "width",
          "type": "int",
          "description": "The target width. Use -1 to maintain aspect ratio.",
          "required": false,
          "default": -1
        },
        {
          "name": "height",
          "type": "int",
          "description": "The target height. Use -1 to maintain aspect ratio.",
          "required": false,
          "default": -1
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "video"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/video/resize",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/video/resize.md"
    },
    {
      "type": "nodetool.video.Reverse",
      "title": "Reverse",
      "namespace": "nodetool.video",
      "description": "Reverse the playback of a video.\n    video, reverse, backwards, effect",
      "inputs": [
        {
          "name": "video",
          "type": "video",
          "description": "The input video to reverse.",
          "required": false,
          "default": {
            "type": "video",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null,
            "duration": null,
            "format": null
          }
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "video"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/video/reverse",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/video/reverse.md"
    },
    {
      "type": "nodetool.video.Rotate",
      "title": "Rotate",
      "namespace": "nodetool.video",
      "description": "Rotate a video by a specified angle.\n    video, rotate, orientation, transform",
      "inputs": [
        {
          "name": "video",
          "type": "video",
          "description": "The input video to rotate.",
          "required": false,
          "default": {
            "type": "video",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null,
            "duration": null,
            "format": null
          }
        },
        {
          "name": "angle",
          "type": "float",
          "description": "The angle of rotation in degrees.",
          "required": false,
          "default": 0
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "video"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/video/rotate",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/video/rotate.md"
    },
    {
      "type": "nodetool.video.Saturation",
      "title": "Saturation",
      "namespace": "nodetool.video",
      "description": "Adjust the color saturation of a video.\n    video, saturation, color, enhance",
      "inputs": [
        {
          "name": "video",
          "type": "video",
          "description": "The input video to adjust saturation.",
          "required": false,
          "default": {
            "type": "video",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null,
            "duration": null,
            "format": null
          }
        },
        {
          "name": "saturation",
          "type": "float",
          "description": "Saturation level. 1.0 is original, <1 decreases saturation, >1 increases saturation.",
          "required": false,
          "default": 1
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "video"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/video/saturation",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/video/saturation.md"
    },
    {
      "type": "nodetool.video.SaveVideo",
      "title": "Save Video Asset",
      "namespace": "nodetool.video",
      "description": "Save a video to an asset folder.\n    video, save, file, output",
      "inputs": [
        {
          "name": "video",
          "type": "video",
          "description": "The video to save.",
          "required": false,
          "default": {
            "type": "video",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null,
            "duration": null,
            "format": null
          }
        },
        {
          "name": "folder",
          "type": "folder",
          "description": "The asset folder to save the video in.",
          "required": false,
          "default": {
            "type": "folder",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "name",
          "type": "str",
          "description": "\n        Name of the output video.\n        You can use time and date variables to create unique names:\n        %Y - Year\n        %m - Month\n        %d - Day\n        %H - Hour\n        %M - Minute\n        %S - Second\n        ",
          "required": false,
          "default": "%Y-%m-%d-%H-%M-%S.mp4"
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "video"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/video/savevideoasset",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/video/savevideoasset.md"
    },
    {
      "type": "nodetool.video.SaveVideoFile",
      "title": "Save Video File",
      "namespace": "nodetool.video",
      "description": "Write a video file to disk.\n    video, output, save, file\n\n    The filename can include time and date variables:\n    %Y - Year, %m - Month, %d - Day\n    %H - Hour, %M - Minute, %S - Second",
      "inputs": [
        {
          "name": "video",
          "type": "video",
          "description": "The video to save",
          "required": false,
          "default": {
            "type": "video",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null,
            "duration": null,
            "format": null
          }
        },
        {
          "name": "folder",
          "type": "str",
          "description": "Folder where the file will be saved",
          "required": false,
          "default": ""
        },
        {
          "name": "filename",
          "type": "str",
          "description": "\n        Name of the file to save.\n        You can use time and date variables to create unique names:\n        %Y - Year\n        %m - Month\n        %d - Day\n        %H - Hour\n        %M - Minute\n        %S - Second\n        ",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "video"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/video/savevideofile",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/video/savevideofile.md"
    },
    {
      "type": "nodetool.video.SetSpeed",
      "title": "Set Speed",
      "namespace": "nodetool.video",
      "description": "Adjust the playback speed of a video.\n    video, speed, tempo, time",
      "inputs": [
        {
          "name": "video",
          "type": "video",
          "description": "The input video to adjust speed.",
          "required": false,
          "default": {
            "type": "video",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null,
            "duration": null,
            "format": null
          }
        },
        {
          "name": "speed_factor",
          "type": "float",
          "description": "The speed adjustment factor. Values > 1 speed up, < 1 slow down.",
          "required": false,
          "default": 1
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "video"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/video/setspeed",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/video/setspeed.md"
    },
    {
      "type": "nodetool.video.Sharpness",
      "title": "Sharpness",
      "namespace": "nodetool.video",
      "description": "Adjust the sharpness of a video.\n    video, sharpen, enhance, detail",
      "inputs": [
        {
          "name": "video",
          "type": "video",
          "description": "The input video to sharpen.",
          "required": false,
          "default": {
            "type": "video",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null,
            "duration": null,
            "format": null
          }
        },
        {
          "name": "luma_amount",
          "type": "float",
          "description": "Amount of sharpening to apply to luma (brightness) channel.",
          "required": false,
          "default": 1
        },
        {
          "name": "chroma_amount",
          "type": "float",
          "description": "Amount of sharpening to apply to chroma (color) channels.",
          "required": false,
          "default": 0.5
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "video"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/video/sharpness",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/video/sharpness.md"
    },
    {
      "type": "nodetool.video.Stabilize",
      "title": "Stabilize",
      "namespace": "nodetool.video",
      "description": "Apply video stabilization to reduce camera shake and jitter.\n    video, stabilize, smooth, shake-reduction",
      "inputs": [
        {
          "name": "video",
          "type": "video",
          "description": "The input video to stabilize.",
          "required": false,
          "default": {
            "type": "video",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null,
            "duration": null,
            "format": null
          }
        },
        {
          "name": "smoothing",
          "type": "float",
          "description": "Smoothing strength. Higher values result in smoother but potentially more cropped video.",
          "required": false,
          "default": 10
        },
        {
          "name": "crop_black",
          "type": "bool",
          "description": "Whether to crop black borders that may appear after stabilization.",
          "required": false,
          "default": true
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "video"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/video/stabilize",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/video/stabilize.md"
    },
    {
      "type": "nodetool.video.TextToVideo",
      "title": "Text To Video",
      "namespace": "nodetool.video",
      "description": "Generate videos from text prompts using any supported video provider. Automatically routes to the appropriate backend (Gemini Veo, HuggingFace).\n    video, generation, AI, text-to-video, t2v",
      "inputs": [
        {
          "name": "model",
          "type": "video_model",
          "description": "The video generation model to use",
          "required": false,
          "default": {
            "type": "video_model",
            "provider": "gemini",
            "id": "veo-3.1-generate-preview",
            "name": "Veo 3.1 Preview",
            "path": null,
            "supported_tasks": []
          }
        },
        {
          "name": "prompt",
          "type": "str",
          "description": "Text prompt describing the desired video",
          "required": false,
          "default": "A cat playing with a ball of yarn"
        },
        {
          "name": "negative_prompt",
          "type": "str",
          "description": "Text prompt describing what to avoid in the video",
          "required": false,
          "default": ""
        },
        {
          "name": "aspect_ratio",
          "type": "str",
          "description": "Aspect ratio for the video",
          "required": false,
          "default": "16:9"
        },
        {
          "name": "resolution",
          "type": "str",
          "description": "Video resolution",
          "required": false,
          "default": "1080p"
        },
        {
          "name": "duration",
          "type": "int",
          "description": "Video duration in seconds",
          "required": false,
          "default": 8
        },
        {
          "name": "timeout_seconds",
          "type": "int",
          "description": "Timeout in seconds for API calls (0 = use provider default)",
          "required": false,
          "default": 0
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "video"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/video/texttovideo",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/video/texttovideo.md"
    },
    {
      "type": "nodetool.video.Transition",
      "title": "Transition",
      "namespace": "nodetool.video",
      "description": "Create a transition effect between two videos, including audio transition when available.\n    video, transition, effect, merge, audio",
      "inputs": [
        {
          "name": "video_a",
          "type": "video",
          "description": "The first video in the transition.",
          "required": false,
          "default": {
            "type": "video",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null,
            "duration": null,
            "format": null
          }
        },
        {
          "name": "video_b",
          "type": "video",
          "description": "The second video in the transition.",
          "required": false,
          "default": {
            "type": "video",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null,
            "duration": null,
            "format": null
          }
        },
        {
          "name": "transition_type",
          "type": "enum",
          "description": "Type of transition effect",
          "required": false,
          "default": "fade"
        },
        {
          "name": "duration",
          "type": "float",
          "description": "Duration of the transition effect in seconds.",
          "required": false,
          "default": 1
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "video"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/video/transition",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/video/transition.md"
    },
    {
      "type": "nodetool.video.Trim",
      "title": "Trim",
      "namespace": "nodetool.video",
      "description": "Trim a video to a specific start and end time.\n    video, trim, cut, segment",
      "inputs": [
        {
          "name": "video",
          "type": "video",
          "description": "The input video to trim.",
          "required": false,
          "default": {
            "type": "video",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null,
            "duration": null,
            "format": null
          }
        },
        {
          "name": "start_time",
          "type": "float",
          "description": "The start time in seconds for the trimmed video.",
          "required": false,
          "default": 0
        },
        {
          "name": "end_time",
          "type": "float",
          "description": "The end time in seconds for the trimmed video. Use -1 for the end of the video.",
          "required": false,
          "default": -1
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "video"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/video/trim",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/video/trim.md"
    },
    {
      "type": "nodetool.video.VideoToVideo",
      "title": "Video To Video",
      "namespace": "nodetool.video",
      "description": "Restyle or edit an existing video with a text prompt using any supported video provider.\n    video, video-to-video, v2v, restyle, style-transfer, AI",
      "inputs": [
        {
          "name": "model",
          "type": "video_model",
          "description": "The video-to-video model to use",
          "required": false,
          "default": {
            "type": "video_model",
            "provider": "fal_ai",
            "id": "fal-ai/ltx-2-19b/distilled/video-to-video",
            "name": "LTX Video To Video",
            "path": null,
            "supported_tasks": []
          }
        },
        {
          "name": "video",
          "type": "video",
          "description": "The input video to transform",
          "required": false,
          "default": {
            "type": "video",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "prompt",
          "type": "str",
          "description": "Text prompt describing the desired transformation",
          "required": false,
          "default": ""
        },
        {
          "name": "negative_prompt",
          "type": "str",
          "description": "Text prompt describing what to avoid",
          "required": false,
          "default": ""
        },
        {
          "name": "strength",
          "type": "float",
          "description": "How much to transform the input video",
          "required": false,
          "default": 0.6
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "video"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/video/videotovideo",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/video/videotovideo.md"
    },
    {
      "type": "nodetool.workflows.base_node.Preview",
      "title": "Preview",
      "namespace": "nodetool.workflows.base_node",
      "description": "Preview values inside the workflow graph",
      "inputs": [
        {
          "name": "value",
          "type": "any",
          "description": "",
          "required": false,
          "default": null
        },
        {
          "name": "name",
          "type": "str",
          "description": "",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/workflows/base_node/preview",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/workflows/base_node/preview.md"
    },
    {
      "type": "nodetool.workflows.subgraph.Subgraph",
      "title": "Subgraph",
      "namespace": "nodetool.workflows.subgraph",
      "description": "Execute an inline sub-graph as an isolated workflow. Inputs/outputs are derived from inner Input/Output nodes.",
      "inputs": [
        {
          "name": "graph",
          "type": "dict",
          "description": "",
          "required": false,
          "default": {
            "nodes": [],
            "edges": []
          }
        }
      ],
      "outputs": [],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/workflows/subgraph/subgraph",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/workflows/subgraph/subgraph.md"
    },
    {
      "type": "nodetool.workflows.workflow_node.Workflow",
      "title": "Workflow",
      "namespace": "nodetool.workflows.workflow_node",
      "description": "Execute a sub-workflow. Select a workflow to populate its inputs and outputs dynamically.",
      "inputs": [
        {
          "name": "workflow_id",
          "type": "str",
          "description": "",
          "required": false,
          "default": ""
        },
        {
          "name": "workflow_json",
          "type": "dict",
          "description": "",
          "required": false,
          "default": {}
        }
      ],
      "outputs": [],
      "documentation_url": "https://docs.nodetool.ai/nodes/nodetool/workflows/workflow_node/workflow",
      "markdown_url": "https://docs.nodetool.ai/nodes/nodetool/workflows/workflow_node/workflow.md"
    },
    {
      "type": "openai.agents.RealtimeAgent",
      "title": "Realtime Agent",
      "namespace": "openai.agents",
      "description": "",
      "inputs": [
        {
          "name": "model",
          "type": "enum",
          "description": "",
          "required": false,
          "default": "gpt-4o-mini-realtime-preview"
        },
        {
          "name": "system",
          "type": "str",
          "description": "System instructions for the realtime session",
          "required": true
        },
        {
          "name": "chunk",
          "type": "chunk",
          "description": "The audio chunk to use as input.",
          "required": false,
          "default": {
            "type": "chunk",
            "node_id": null,
            "thread_id": null,
            "workflow_id": null,
            "content_type": "text",
            "content": "",
            "content_metadata": {},
            "done": false,
            "thinking": false
          }
        },
        {
          "name": "voice",
          "type": "enum",
          "description": "The voice for the audio output",
          "required": false,
          "default": "alloy"
        },
        {
          "name": "speed",
          "type": "float",
          "description": "The speed of the model’s spoken response",
          "required": false,
          "default": 1
        },
        {
          "name": "temperature",
          "type": "float",
          "description": "The temperature for the response",
          "required": false,
          "default": 0.8
        }
      ],
      "outputs": [
        {
          "name": "chunk",
          "type": "chunk"
        },
        {
          "name": "audio",
          "type": "audio"
        },
        {
          "name": "text",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/openai/agents/realtimeagent",
      "markdown_url": "https://docs.nodetool.ai/nodes/openai/agents/realtimeagent.md"
    },
    {
      "type": "openai.agents.RealtimeTranscription",
      "title": "Realtime Transcription",
      "namespace": "openai.agents",
      "description": "",
      "inputs": [
        {
          "name": "model",
          "type": "enum",
          "description": "The realtime model to use.",
          "required": false,
          "default": "gpt-4o-mini-realtime-preview"
        },
        {
          "name": "chunk",
          "type": "chunk",
          "description": "Audio chunk input stream (base64-encoded PCM16 audio).",
          "required": false,
          "default": {
            "type": "chunk",
            "node_id": null,
            "thread_id": null,
            "workflow_id": null,
            "content_type": "audio",
            "content": "",
            "content_metadata": {},
            "done": false,
            "thinking": false
          }
        },
        {
          "name": "system",
          "type": "str",
          "description": "System instructions (optional)",
          "required": false,
          "default": ""
        },
        {
          "name": "temperature",
          "type": "float",
          "description": "Decoding temperature",
          "required": false,
          "default": 0.8
        }
      ],
      "outputs": [
        {
          "name": "text",
          "type": "str"
        },
        {
          "name": "chunk",
          "type": "chunk"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/openai/agents/realtimetranscription",
      "markdown_url": "https://docs.nodetool.ai/nodes/openai/agents/realtimetranscription.md"
    },
    {
      "type": "openai.audio.TextToSpeech",
      "title": "Text To Speech",
      "namespace": "openai.audio",
      "description": "Converts text to speech using OpenAI TTS models.\n    audio, tts, text-to-speech, voice, synthesis",
      "inputs": [
        {
          "name": "model",
          "type": "enum",
          "description": "",
          "required": false,
          "default": "tts-1"
        },
        {
          "name": "voice",
          "type": "enum",
          "description": "",
          "required": false,
          "default": "alloy"
        },
        {
          "name": "input",
          "type": "str",
          "description": "",
          "required": false,
          "default": ""
        },
        {
          "name": "speed",
          "type": "float",
          "description": "",
          "required": false,
          "default": 1
        },
        {
          "name": "instructions",
          "type": "str",
          "description": "Steer the voice's tone, emotion, and delivery (gpt-4o-mini-tts only).",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "audio"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/openai/audio/texttospeech",
      "markdown_url": "https://docs.nodetool.ai/nodes/openai/audio/texttospeech.md"
    },
    {
      "type": "openai.audio.Transcribe",
      "title": "Transcribe",
      "namespace": "openai.audio",
      "description": "Converts speech to text using OpenAI's speech-to-text API.\n    audio, transcription, speech-to-text, stt, whisper",
      "inputs": [
        {
          "name": "model",
          "type": "enum",
          "description": "The model to use for transcription.",
          "required": false,
          "default": "whisper-1"
        },
        {
          "name": "audio",
          "type": "audio",
          "description": "The audio file to transcribe (max 25 MB).",
          "required": false,
          "default": {
            "type": "audio",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "language",
          "type": "enum",
          "description": "The language of the input audio",
          "required": false,
          "default": "auto_detect"
        },
        {
          "name": "timestamps",
          "type": "bool",
          "description": "Whether to return timestamps for the generated text.",
          "required": false,
          "default": false
        },
        {
          "name": "prompt",
          "type": "str",
          "description": "Optional text to guide the model's style or continue a previous audio segment.",
          "required": false,
          "default": ""
        },
        {
          "name": "temperature",
          "type": "float",
          "description": "The sampling temperature between 0 and 1. Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic.",
          "required": false,
          "default": 0
        }
      ],
      "outputs": [
        {
          "name": "text",
          "type": "str"
        },
        {
          "name": "words",
          "type": "list[audio_chunk]"
        },
        {
          "name": "segments",
          "type": "list[audio_chunk]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/openai/audio/transcribe",
      "markdown_url": "https://docs.nodetool.ai/nodes/openai/audio/transcribe.md"
    },
    {
      "type": "openai.audio.Translate",
      "title": "Translate",
      "namespace": "openai.audio",
      "description": "Translates speech in audio to English text.\n    audio, translation, speech-to-text, localization",
      "inputs": [
        {
          "name": "audio",
          "type": "audio",
          "description": "The audio file to translate.",
          "required": false,
          "default": {
            "type": "audio",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "temperature",
          "type": "float",
          "description": "The temperature to use for the translation.",
          "required": false,
          "default": 0
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/openai/audio/translate",
      "markdown_url": "https://docs.nodetool.ai/nodes/openai/audio/translate.md"
    },
    {
      "type": "openai.image.CreateImage",
      "title": "Create Image",
      "namespace": "openai.image",
      "description": "Generates images from textual descriptions.\n    image, t2i, tti, text-to-image, create, generate, picture, photo, art, drawing, illustration",
      "inputs": [
        {
          "name": "prompt",
          "type": "str",
          "description": "The prompt to use.",
          "required": false,
          "default": ""
        },
        {
          "name": "model",
          "type": "enum",
          "description": "The model to use for image generation.",
          "required": false,
          "default": "gpt-image-1"
        },
        {
          "name": "size",
          "type": "enum",
          "description": "The size of the image to generate.",
          "required": false,
          "default": "1024x1024"
        },
        {
          "name": "background",
          "type": "enum",
          "description": "The background of the image to generate.",
          "required": false,
          "default": "auto"
        },
        {
          "name": "quality",
          "type": "enum",
          "description": "The quality of the image to generate.",
          "required": false,
          "default": "high"
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/openai/image/createimage",
      "markdown_url": "https://docs.nodetool.ai/nodes/openai/image/createimage.md"
    },
    {
      "type": "openai.image.EditImage",
      "title": "Edit Image",
      "namespace": "openai.image",
      "description": "Edit images using OpenAI's gpt-image-1 model.\n    image, edit, modify, transform, inpaint, outpaint, variation\n\n    Takes an input image and a text prompt to generate a modified version.\n    Can be used for inpainting, outpainting, style transfer, and image modification.\n    Optionally accepts a mask to specify which areas to edit.",
      "inputs": [
        {
          "name": "image",
          "type": "image",
          "description": "The image to edit.",
          "required": false,
          "default": {
            "type": "image",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "mask",
          "type": "image",
          "description": "Optional mask image. White areas will be edited, black areas preserved.",
          "required": false,
          "default": {
            "type": "image",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "prompt",
          "type": "str",
          "description": "The prompt describing the desired edit.",
          "required": false,
          "default": ""
        },
        {
          "name": "model",
          "type": "enum",
          "description": "The model to use for image editing.",
          "required": false,
          "default": "gpt-image-1"
        },
        {
          "name": "size",
          "type": "enum",
          "description": "The size of the output image.",
          "required": false,
          "default": "1024x1024"
        },
        {
          "name": "quality",
          "type": "enum",
          "description": "The quality of the generated image.",
          "required": false,
          "default": "high"
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/openai/image/editimage",
      "markdown_url": "https://docs.nodetool.ai/nodes/openai/image/editimage.md"
    },
    {
      "type": "openai.image.ImageVariation",
      "title": "Image Variation",
      "namespace": "openai.image",
      "description": "Generate variations of an input image using OpenAI's image variations API.\n    image, variation, remix, generate, alternative, dall-e\n\n    Takes a square PNG image and produces a new image that is a variation of it.\n    No text prompt is used — the model riffs on the source image directly.",
      "inputs": [
        {
          "name": "image",
          "type": "image",
          "description": "The source image to generate variations from (square PNG).",
          "required": false,
          "default": {
            "type": "image",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "size",
          "type": "enum",
          "description": "The size of the generated image.",
          "required": false,
          "default": "1024x1024"
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/openai/image/imagevariation",
      "markdown_url": "https://docs.nodetool.ai/nodes/openai/image/imagevariation.md"
    },
    {
      "type": "openai.text.Embedding",
      "title": "Embedding",
      "namespace": "openai.text",
      "description": "Generate vector representations of text for semantic analysis.\n    embeddings, similarity, search, clustering, classification\n\n    Uses OpenAI's embedding models to create dense vector representations of text.\n    These vectors capture semantic meaning, enabling:\n    - Semantic search\n    - Text clustering\n    - Document classification\n    - Recommendation systems\n    - Anomaly detection\n    - Measuring text similarity and diversity",
      "inputs": [
        {
          "name": "input",
          "type": "str",
          "description": "",
          "required": false,
          "default": ""
        },
        {
          "name": "model",
          "type": "enum",
          "description": "",
          "required": false,
          "default": "text-embedding-3-small"
        },
        {
          "name": "chunk_size",
          "type": "int",
          "description": "",
          "required": false,
          "default": 4096
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "list"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/openai/text/embedding",
      "markdown_url": "https://docs.nodetool.ai/nodes/openai/text/embedding.md"
    },
    {
      "type": "openai.text.Moderation",
      "title": "Moderation",
      "namespace": "openai.text",
      "description": "Check text content for potential policy violations using OpenAI's moderation API.\n    moderation, safety, content, filter, policy, harmful, toxic\n\n    Uses OpenAI's moderation models to detect potentially harmful content including:\n    - Hate speech\n    - Harassment\n    - Self-harm content\n    - Sexual content\n    - Violence\n    - Graphic violence\n\n    Returns flagged status and category scores for comprehensive content analysis.",
      "inputs": [
        {
          "name": "input",
          "type": "str",
          "description": "The text content to check for policy violations.",
          "required": false,
          "default": ""
        },
        {
          "name": "model",
          "type": "enum",
          "description": "The moderation model to use.",
          "required": false,
          "default": "omni-moderation-latest"
        }
      ],
      "outputs": [
        {
          "name": "flagged",
          "type": "bool"
        },
        {
          "name": "categories",
          "type": "dict[str, bool]"
        },
        {
          "name": "category_scores",
          "type": "dict[str, float]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/openai/text/moderation",
      "markdown_url": "https://docs.nodetool.ai/nodes/openai/text/moderation.md"
    },
    {
      "type": "openai.text.WebSearch",
      "title": "Web Search",
      "namespace": "openai.text",
      "description": "Search the web with OpenAI's web-search models to answer queries from current information.\n    openai, web, search, internet, browsing, current, realtime",
      "inputs": [
        {
          "name": "query",
          "type": "str",
          "description": "The search query to execute.",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/openai/text/websearch",
      "markdown_url": "https://docs.nodetool.ai/nodes/openai/text/websearch.md"
    },
    {
      "type": "reve.CreateImage",
      "title": "Create Image",
      "namespace": "reve",
      "description": "",
      "inputs": [
        {
          "name": "prompt",
          "type": "str",
          "description": "Text description of the image to generate (max 2560 chars).",
          "required": false,
          "default": ""
        },
        {
          "name": "aspect_ratio",
          "type": "enum",
          "description": "Proportions of the generated image.",
          "required": false,
          "default": "3:2"
        },
        {
          "name": "version",
          "type": "enum",
          "description": "Model version to use.",
          "required": false,
          "default": "latest"
        },
        {
          "name": "postprocessing",
          "type": "enum",
          "description": "Optional postprocessing operation applied to the result.",
          "required": false,
          "default": "none"
        },
        {
          "name": "test_time_scaling",
          "type": "int",
          "description": "Effort multiplier for quality (1-15). Higher costs more.",
          "required": false,
          "default": 1
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/reve/createimage",
      "markdown_url": "https://docs.nodetool.ai/nodes/reve/createimage.md"
    },
    {
      "type": "reve.EditImage",
      "title": "Edit Image",
      "namespace": "reve",
      "description": "",
      "inputs": [
        {
          "name": "image",
          "type": "image",
          "description": "The reference image to edit.",
          "required": false,
          "default": {
            "type": "image",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "edit_instruction",
          "type": "str",
          "description": "How to modify the image (max 2560 chars).",
          "required": false,
          "default": ""
        },
        {
          "name": "aspect_ratio",
          "type": "enum",
          "description": "Output proportions. 'none' keeps the reference image's aspect ratio.",
          "required": false,
          "default": "none"
        },
        {
          "name": "version",
          "type": "enum",
          "description": "Model version to use.",
          "required": false,
          "default": "latest"
        },
        {
          "name": "postprocessing",
          "type": "enum",
          "description": "Optional postprocessing operation applied to the result.",
          "required": false,
          "default": "none"
        },
        {
          "name": "test_time_scaling",
          "type": "int",
          "description": "Effort multiplier for quality (1-15). Higher costs more.",
          "required": false,
          "default": 1
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/reve/editimage",
      "markdown_url": "https://docs.nodetool.ai/nodes/reve/editimage.md"
    },
    {
      "type": "reve.RemixImage",
      "title": "Remix Image",
      "namespace": "reve",
      "description": "",
      "inputs": [
        {
          "name": "prompt",
          "type": "str",
          "description": "",
          "required": false,
          "default": ""
        },
        {
          "name": "reference_images",
          "type": "list",
          "description": "1-6 reference images to remix.",
          "required": false,
          "default": []
        },
        {
          "name": "aspect_ratio",
          "type": "enum",
          "description": "Output proportions. 'none' lets the model choose the aspect ratio.",
          "required": false,
          "default": "none"
        },
        {
          "name": "version",
          "type": "enum",
          "description": "Model version to use.",
          "required": false,
          "default": "latest"
        },
        {
          "name": "postprocessing",
          "type": "enum",
          "description": "Optional postprocessing operation applied to the result.",
          "required": false,
          "default": "none"
        },
        {
          "name": "test_time_scaling",
          "type": "int",
          "description": "Effort multiplier for quality (1-15). Higher costs more.",
          "required": false,
          "default": 1
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/reve/remiximage",
      "markdown_url": "https://docs.nodetool.ai/nodes/reve/remiximage.md"
    },
    {
      "type": "search.google.GoogleFinance",
      "title": "Google Finance",
      "namespace": "search.google",
      "description": "Retrieve financial market data and stock information from Google Finance.\n    google, finance, stocks, market, serp, trading",
      "inputs": [
        {
          "name": "query",
          "type": "str",
          "description": "Stock symbol or company name to search for",
          "required": false,
          "default": ""
        },
        {
          "name": "window",
          "type": "str",
          "description": "Time window for financial data (e.g., '1d', '5d', '1m', '3m', '6m', '1y', '5y')",
          "required": false,
          "default": ""
        }
      ],
      "outputs": [
        {
          "name": "results",
          "type": "dict[str, any]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/search/google/googlefinance",
      "markdown_url": "https://docs.nodetool.ai/nodes/search/google/googlefinance.md"
    },
    {
      "type": "search.google.GoogleImages",
      "title": "Google Images",
      "namespace": "search.google",
      "description": "Search Google Images to find visual content or perform reverse image search.\n    google, images, serp, visual, reverse, search",
      "inputs": [
        {
          "name": "keyword",
          "type": "str",
          "description": "Search query or keyword for images",
          "required": false,
          "default": ""
        },
        {
          "name": "image_url",
          "type": "str",
          "description": "URL of image for reverse image search",
          "required": false,
          "default": ""
        },
        {
          "name": "num_results",
          "type": "int",
          "description": "Maximum number of image results to return",
          "required": false,
          "default": 20
        }
      ],
      "outputs": [
        {
          "name": "results",
          "type": "list[image]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/search/google/googleimages",
      "markdown_url": "https://docs.nodetool.ai/nodes/search/google/googleimages.md"
    },
    {
      "type": "search.google.GoogleJobs",
      "title": "Google Jobs",
      "namespace": "search.google",
      "description": "Search Google Jobs for employment opportunities and job listings.\n    google, jobs, employment, careers, serp, hiring",
      "inputs": [
        {
          "name": "query",
          "type": "str",
          "description": "Job title, skills, or company name to search for",
          "required": false,
          "default": ""
        },
        {
          "name": "location",
          "type": "str",
          "description": "Geographic location for job search",
          "required": false,
          "default": ""
        },
        {
          "name": "num_results",
          "type": "int",
          "description": "Maximum number of job results to return",
          "required": false,
          "default": 10
        }
      ],
      "outputs": [
        {
          "name": "results",
          "type": "list[job_result]"
        },
        {
          "name": "text",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/search/google/googlejobs",
      "markdown_url": "https://docs.nodetool.ai/nodes/search/google/googlejobs.md"
    },
    {
      "type": "search.google.GoogleLens",
      "title": "Google Lens",
      "namespace": "search.google",
      "description": "Analyze images using Google Lens to find visual matches and related content.\n    google, lens, visual, image, search, serp, identify",
      "inputs": [
        {
          "name": "image_url",
          "type": "str",
          "description": "URL of the image to analyze with Google Lens",
          "required": false,
          "default": ""
        },
        {
          "name": "num_results",
          "type": "int",
          "description": "Maximum number of visual search results to return",
          "required": false,
          "default": 10
        }
      ],
      "outputs": [],
      "documentation_url": "https://docs.nodetool.ai/nodes/search/google/googlelens",
      "markdown_url": "https://docs.nodetool.ai/nodes/search/google/googlelens.md"
    },
    {
      "type": "search.google.GoogleMaps",
      "title": "Google Maps",
      "namespace": "search.google",
      "description": "Search Google Maps for places, businesses, and get location details.\n    google, maps, places, locations, serp, geography",
      "inputs": [
        {
          "name": "query",
          "type": "str",
          "description": "Place name, address, or location query",
          "required": false,
          "default": ""
        },
        {
          "name": "num_results",
          "type": "int",
          "description": "Maximum number of map results to return",
          "required": false,
          "default": 10
        }
      ],
      "outputs": [
        {
          "name": "results",
          "type": "list[local_result]"
        },
        {
          "name": "text",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/search/google/googlemaps",
      "markdown_url": "https://docs.nodetool.ai/nodes/search/google/googlemaps.md"
    },
    {
      "type": "search.google.GoogleNews",
      "title": "Google News",
      "namespace": "search.google",
      "description": "Search Google News to retrieve current news articles and headlines.\n    google, news, serp, articles, journalism",
      "inputs": [
        {
          "name": "keyword",
          "type": "str",
          "description": "Search query or keyword for news articles",
          "required": false,
          "default": ""
        },
        {
          "name": "num_results",
          "type": "int",
          "description": "Maximum number of news results to return",
          "required": false,
          "default": 10
        }
      ],
      "outputs": [
        {
          "name": "results",
          "type": "list[news_result]"
        },
        {
          "name": "text",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/search/google/googlenews",
      "markdown_url": "https://docs.nodetool.ai/nodes/search/google/googlenews.md"
    },
    {
      "type": "search.google.GoogleSearch",
      "title": "Google Search",
      "namespace": "search.google",
      "description": "Search Google to retrieve organic search results from the web.\n    google, search, serp, web, query",
      "inputs": [
        {
          "name": "keyword",
          "type": "str",
          "description": "Search query or keyword to search for",
          "required": false,
          "default": ""
        },
        {
          "name": "num_results",
          "type": "int",
          "description": "Maximum number of results to return",
          "required": false,
          "default": 10
        }
      ],
      "outputs": [
        {
          "name": "results",
          "type": "list[organic_result]"
        },
        {
          "name": "text",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/search/google/googlesearch",
      "markdown_url": "https://docs.nodetool.ai/nodes/search/google/googlesearch.md"
    },
    {
      "type": "search.google.GoogleShopping",
      "title": "Google Shopping",
      "namespace": "search.google",
      "description": "Search Google Shopping for products with filters and pricing information.\n    google, shopping, products, ecommerce, serp, prices",
      "inputs": [
        {
          "name": "query",
          "type": "str",
          "description": "Product name or description to search for",
          "required": false,
          "default": ""
        },
        {
          "name": "country",
          "type": "str",
          "description": "Country code for shopping search (e.g., 'us', 'uk', 'ca')",
          "required": false,
          "default": "us"
        },
        {
          "name": "min_price",
          "type": "int",
          "description": "Minimum price filter for products",
          "required": false,
          "default": 0
        },
        {
          "name": "max_price",
          "type": "int",
          "description": "Maximum price filter for products",
          "required": false,
          "default": 0
        },
        {
          "name": "condition",
          "type": "str",
          "description": "Product condition filter (e.g., 'new', 'used', 'refurbished')",
          "required": false,
          "default": ""
        },
        {
          "name": "sort_by",
          "type": "str",
          "description": "Sort order for results (e.g., 'price_low_to_high', 'price_high_to_low', 'review_score')",
          "required": false,
          "default": ""
        },
        {
          "name": "num_results",
          "type": "int",
          "description": "Maximum number of shopping results to return",
          "required": false,
          "default": 10
        }
      ],
      "outputs": [
        {
          "name": "results",
          "type": "list[shopping_result]"
        },
        {
          "name": "text",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/search/google/googleshopping",
      "markdown_url": "https://docs.nodetool.ai/nodes/search/google/googleshopping.md"
    },
    {
      "type": "transformers.AudioClassification",
      "title": "Audio Classification",
      "namespace": "transformers",
      "description": "",
      "inputs": [
        {
          "name": "audio",
          "type": "audio",
          "description": "Audio clip to classify.",
          "required": false,
          "default": {
            "type": "audio"
          }
        },
        {
          "name": "model",
          "type": "any",
          "description": "Transformers.js model (ONNX-compatible).",
          "required": true
        },
        {
          "name": "top_k",
          "type": "int",
          "description": "Number of top labels to return.",
          "required": false,
          "default": 5
        },
        {
          "name": "sampling_rate",
          "type": "int",
          "description": "Sampling rate (Hz) used when decoding the audio.",
          "required": true
        },
        {
          "name": "dtype",
          "type": "enum",
          "description": "Model dtype / quantization level.",
          "required": false,
          "default": "auto"
        },
        {
          "name": "device",
          "type": "enum",
          "description": "Inference device.",
          "required": false,
          "default": "auto"
        }
      ],
      "outputs": [
        {
          "name": "label",
          "type": "str"
        },
        {
          "name": "score",
          "type": "float"
        },
        {
          "name": "results",
          "type": "list"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/transformers/audioclassification",
      "markdown_url": "https://docs.nodetool.ai/nodes/transformers/audioclassification.md"
    },
    {
      "type": "transformers.AutomaticSpeechRecognition",
      "title": "Automatic Speech Recognition",
      "namespace": "transformers",
      "description": "",
      "inputs": [
        {
          "name": "audio",
          "type": "audio",
          "description": "Audio clip to transcribe.",
          "required": false,
          "default": {
            "type": "audio"
          }
        },
        {
          "name": "model",
          "type": "any",
          "description": "Transformers.js model (ONNX-compatible).",
          "required": true
        },
        {
          "name": "language",
          "type": "str",
          "description": "Optional language hint for multilingual models (e.g. 'english').",
          "required": false,
          "default": ""
        },
        {
          "name": "task",
          "type": "enum",
          "description": "Whether to transcribe in source language or translate to English.",
          "required": false,
          "default": "transcribe"
        },
        {
          "name": "return_timestamps",
          "type": "bool",
          "description": "Return per-chunk timestamps alongside the transcript.",
          "required": false,
          "default": false
        },
        {
          "name": "dtype",
          "type": "enum",
          "description": "Model dtype / quantization level.",
          "required": false,
          "default": "auto"
        },
        {
          "name": "device",
          "type": "enum",
          "description": "Inference device.",
          "required": false,
          "default": "auto"
        }
      ],
      "outputs": [
        {
          "name": "text",
          "type": "str"
        },
        {
          "name": "chunks",
          "type": "list"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/transformers/automaticspeechrecognition",
      "markdown_url": "https://docs.nodetool.ai/nodes/transformers/automaticspeechrecognition.md"
    },
    {
      "type": "transformers.FeatureExtraction",
      "title": "Feature Extraction (Embeddings)",
      "namespace": "transformers",
      "description": "",
      "inputs": [
        {
          "name": "text",
          "type": "str",
          "description": "Text to embed.",
          "required": false,
          "default": "Hello world"
        },
        {
          "name": "model",
          "type": "any",
          "description": "Transformers.js model (ONNX-compatible).",
          "required": true
        },
        {
          "name": "pooling",
          "type": "enum",
          "description": "Pooling strategy applied to the token embeddings.",
          "required": false,
          "default": "mean"
        },
        {
          "name": "normalize",
          "type": "bool",
          "description": "L2-normalize the resulting embedding.",
          "required": false,
          "default": true
        },
        {
          "name": "dtype",
          "type": "enum",
          "description": "Model dtype / quantization level.",
          "required": false,
          "default": "auto"
        },
        {
          "name": "device",
          "type": "enum",
          "description": "Inference device.",
          "required": false,
          "default": "auto"
        }
      ],
      "outputs": [
        {
          "name": "embedding",
          "type": "list"
        },
        {
          "name": "dim",
          "type": "int"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/transformers/featureextractionembeddings",
      "markdown_url": "https://docs.nodetool.ai/nodes/transformers/featureextractionembeddings.md"
    },
    {
      "type": "transformers.FillMask",
      "title": "Fill Mask",
      "namespace": "transformers",
      "description": "",
      "inputs": [
        {
          "name": "text",
          "type": "str",
          "description": "Text containing a single mask token (e.g. [MASK] or <mask>).",
          "required": false,
          "default": "The quick brown [MASK] jumps over the lazy dog."
        },
        {
          "name": "model",
          "type": "any",
          "description": "Transformers.js model (ONNX-compatible).",
          "required": true
        },
        {
          "name": "top_k",
          "type": "int",
          "description": "Number of candidate fill-ins to return.",
          "required": false,
          "default": 5
        },
        {
          "name": "dtype",
          "type": "enum",
          "description": "Model dtype / quantization level.",
          "required": false,
          "default": "auto"
        },
        {
          "name": "device",
          "type": "enum",
          "description": "Inference device.",
          "required": false,
          "default": "auto"
        }
      ],
      "outputs": [
        {
          "name": "top",
          "type": "str"
        },
        {
          "name": "results",
          "type": "list"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/transformers/fillmask",
      "markdown_url": "https://docs.nodetool.ai/nodes/transformers/fillmask.md"
    },
    {
      "type": "transformers.ImageClassification",
      "title": "Image Classification",
      "namespace": "transformers",
      "description": "",
      "inputs": [
        {
          "name": "image",
          "type": "image",
          "description": "Image to classify.",
          "required": false,
          "default": {
            "type": "image"
          }
        },
        {
          "name": "model",
          "type": "any",
          "description": "Transformers.js model (ONNX-compatible).",
          "required": true
        },
        {
          "name": "top_k",
          "type": "int",
          "description": "Number of top labels to return.",
          "required": false,
          "default": 5
        },
        {
          "name": "dtype",
          "type": "enum",
          "description": "Model dtype / quantization level.",
          "required": false,
          "default": "auto"
        },
        {
          "name": "device",
          "type": "enum",
          "description": "Inference device.",
          "required": false,
          "default": "auto"
        }
      ],
      "outputs": [
        {
          "name": "label",
          "type": "str"
        },
        {
          "name": "score",
          "type": "float"
        },
        {
          "name": "results",
          "type": "list"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/transformers/imageclassification",
      "markdown_url": "https://docs.nodetool.ai/nodes/transformers/imageclassification.md"
    },
    {
      "type": "transformers.ImageToText",
      "title": "Image to Text (Captioning)",
      "namespace": "transformers",
      "description": "",
      "inputs": [
        {
          "name": "image",
          "type": "image",
          "description": "Image to caption.",
          "required": false,
          "default": {
            "type": "image"
          }
        },
        {
          "name": "model",
          "type": "any",
          "description": "Transformers.js model (ONNX-compatible).",
          "required": true
        },
        {
          "name": "max_new_tokens",
          "type": "int",
          "description": "Maximum number of tokens in the caption.",
          "required": false,
          "default": 50
        },
        {
          "name": "dtype",
          "type": "enum",
          "description": "Model dtype / quantization level.",
          "required": false,
          "default": "auto"
        },
        {
          "name": "device",
          "type": "enum",
          "description": "Inference device.",
          "required": false,
          "default": "auto"
        }
      ],
      "outputs": [
        {
          "name": "text",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/transformers/imagetotextcaptioning",
      "markdown_url": "https://docs.nodetool.ai/nodes/transformers/imagetotextcaptioning.md"
    },
    {
      "type": "transformers.ObjectDetection",
      "title": "Object Detection",
      "namespace": "transformers",
      "description": "",
      "inputs": [
        {
          "name": "image",
          "type": "image",
          "description": "Image to run detection on.",
          "required": false,
          "default": {
            "type": "image"
          }
        },
        {
          "name": "model",
          "type": "any",
          "description": "Transformers.js model (ONNX-compatible).",
          "required": true
        },
        {
          "name": "threshold",
          "type": "float",
          "description": "Minimum confidence score required to keep a detection.",
          "required": false,
          "default": 0.9
        },
        {
          "name": "percentage",
          "type": "bool",
          "description": "Return bounding boxes as fractions of image size.",
          "required": false,
          "default": true
        },
        {
          "name": "dtype",
          "type": "enum",
          "description": "Model dtype / quantization level.",
          "required": false,
          "default": "auto"
        },
        {
          "name": "device",
          "type": "enum",
          "description": "Inference device.",
          "required": false,
          "default": "auto"
        }
      ],
      "outputs": [
        {
          "name": "detections",
          "type": "list"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/transformers/objectdetection",
      "markdown_url": "https://docs.nodetool.ai/nodes/transformers/objectdetection.md"
    },
    {
      "type": "transformers.QuestionAnswering",
      "title": "Question Answering",
      "namespace": "transformers",
      "description": "",
      "inputs": [
        {
          "name": "question",
          "type": "str",
          "description": "The question to answer.",
          "required": false,
          "default": "What is the capital of France?"
        },
        {
          "name": "context",
          "type": "str",
          "description": "The passage that contains the answer.",
          "required": false,
          "default": "Paris is the capital and most populous city of France."
        },
        {
          "name": "model",
          "type": "any",
          "description": "Transformers.js model (ONNX-compatible).",
          "required": true
        },
        {
          "name": "top_k",
          "type": "int",
          "description": "Number of candidate answers to return.",
          "required": false,
          "default": 1
        },
        {
          "name": "dtype",
          "type": "enum",
          "description": "Model dtype / quantization level.",
          "required": false,
          "default": "auto"
        },
        {
          "name": "device",
          "type": "enum",
          "description": "Inference device.",
          "required": false,
          "default": "auto"
        }
      ],
      "outputs": [
        {
          "name": "answer",
          "type": "str"
        },
        {
          "name": "score",
          "type": "float"
        },
        {
          "name": "start",
          "type": "int"
        },
        {
          "name": "end",
          "type": "int"
        },
        {
          "name": "results",
          "type": "list"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/transformers/questionanswering",
      "markdown_url": "https://docs.nodetool.ai/nodes/transformers/questionanswering.md"
    },
    {
      "type": "transformers.Summarization",
      "title": "Summarization",
      "namespace": "transformers",
      "description": "",
      "inputs": [
        {
          "name": "text",
          "type": "str",
          "description": "The text to summarize.",
          "required": false,
          "default": ""
        },
        {
          "name": "model",
          "type": "any",
          "description": "Transformers.js model (ONNX-compatible).",
          "required": true
        },
        {
          "name": "max_length",
          "type": "int",
          "description": "Maximum number of tokens in the generated summary.",
          "required": false,
          "default": 130
        },
        {
          "name": "min_length",
          "type": "int",
          "description": "Minimum number of tokens in the generated summary.",
          "required": false,
          "default": 30
        },
        {
          "name": "do_sample",
          "type": "bool",
          "description": "Sample tokens instead of greedy decoding.",
          "required": false,
          "default": false
        },
        {
          "name": "dtype",
          "type": "enum",
          "description": "Model dtype / quantization level.",
          "required": false,
          "default": "auto"
        },
        {
          "name": "device",
          "type": "enum",
          "description": "Inference device.",
          "required": false,
          "default": "auto"
        }
      ],
      "outputs": [
        {
          "name": "summary",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/transformers/summarization",
      "markdown_url": "https://docs.nodetool.ai/nodes/transformers/summarization.md"
    },
    {
      "type": "transformers.TextClassification",
      "title": "Text Classification",
      "namespace": "transformers",
      "description": "",
      "inputs": [
        {
          "name": "text",
          "type": "str",
          "description": "The text to classify.",
          "required": false,
          "default": "I love this product!"
        },
        {
          "name": "model",
          "type": "any",
          "description": "Transformers.js model (ONNX-compatible).",
          "required": true
        },
        {
          "name": "top_k",
          "type": "int",
          "description": "Number of top labels to return (1 returns the best label).",
          "required": false,
          "default": 1
        },
        {
          "name": "dtype",
          "type": "enum",
          "description": "Model dtype / quantization level.",
          "required": false,
          "default": "auto"
        },
        {
          "name": "device",
          "type": "enum",
          "description": "Inference device.",
          "required": false,
          "default": "auto"
        }
      ],
      "outputs": [
        {
          "name": "label",
          "type": "str"
        },
        {
          "name": "score",
          "type": "float"
        },
        {
          "name": "results",
          "type": "list"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/transformers/textclassification",
      "markdown_url": "https://docs.nodetool.ai/nodes/transformers/textclassification.md"
    },
    {
      "type": "transformers.TextGeneration",
      "title": "Text Generation",
      "namespace": "transformers",
      "description": "",
      "inputs": [
        {
          "name": "prompt",
          "type": "str",
          "description": "Prompt for the language model.",
          "required": false,
          "default": "Once upon a time"
        },
        {
          "name": "model",
          "type": "any",
          "description": "Transformers.js model (ONNX-compatible).",
          "required": true
        },
        {
          "name": "max_new_tokens",
          "type": "int",
          "description": "Maximum number of tokens to generate after the prompt.",
          "required": false,
          "default": 128
        },
        {
          "name": "temperature",
          "type": "float",
          "description": "Sampling temperature (1.0 = neutral).",
          "required": false,
          "default": 1
        },
        {
          "name": "top_p",
          "type": "float",
          "description": "Nucleus sampling probability mass (1.0 = disabled).",
          "required": false,
          "default": 1
        },
        {
          "name": "top_k",
          "type": "int",
          "description": "Limit sampling to the K most likely tokens.",
          "required": false,
          "default": 50
        },
        {
          "name": "do_sample",
          "type": "bool",
          "description": "Sample tokens instead of greedy decoding.",
          "required": false,
          "default": true
        },
        {
          "name": "repetition_penalty",
          "type": "float",
          "description": "Penalty applied to repeated tokens (>1 discourages repetition).",
          "required": false,
          "default": 1
        },
        {
          "name": "dtype",
          "type": "enum",
          "description": "Model dtype / quantization level.",
          "required": false,
          "default": "auto"
        },
        {
          "name": "device",
          "type": "enum",
          "description": "Inference device.",
          "required": false,
          "default": "auto"
        }
      ],
      "outputs": [
        {
          "name": "text",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/transformers/textgeneration",
      "markdown_url": "https://docs.nodetool.ai/nodes/transformers/textgeneration.md"
    },
    {
      "type": "transformers.TextToSpeech",
      "title": "Text to Speech",
      "namespace": "transformers",
      "description": "",
      "inputs": [
        {
          "name": "text",
          "type": "str",
          "description": "Text to synthesize.",
          "required": false,
          "default": "Hello, this is a test of text to speech."
        },
        {
          "name": "model",
          "type": "any",
          "description": "Transformers.js model (ONNX-compatible).",
          "required": true
        },
        {
          "name": "speaker_embeddings",
          "type": "str",
          "description": "Optional speaker embedding URL (required by SpeechT5; ignored by other models).",
          "required": false,
          "default": "https://huggingface.co/datasets/Xenova/transformers.js-docs/resolve/main/speaker_embeddings.bin"
        },
        {
          "name": "voice",
          "type": "enum",
          "description": "Voice ID for Kokoro models (English only in kokoro-js v1.2.x). af_*=American female, am_*=American male, bf_*=British female, bm_*=British male. Ignored by other TTS models.",
          "required": false,
          "default": "af_heart"
        },
        {
          "name": "dtype",
          "type": "enum",
          "description": "Model dtype / quantization level.",
          "required": false,
          "default": "auto"
        },
        {
          "name": "device",
          "type": "enum",
          "description": "Inference device.",
          "required": false,
          "default": "auto"
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "audio"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/transformers/texttospeech",
      "markdown_url": "https://docs.nodetool.ai/nodes/transformers/texttospeech.md"
    },
    {
      "type": "transformers.TokenClassification",
      "title": "Token Classification (NER)",
      "namespace": "transformers",
      "description": "",
      "inputs": [
        {
          "name": "text",
          "type": "str",
          "description": "Text to extract entities from.",
          "required": false,
          "default": "My name is Sarah and I live in London."
        },
        {
          "name": "model",
          "type": "any",
          "description": "Transformers.js model (ONNX-compatible).",
          "required": true
        },
        {
          "name": "aggregation_strategy",
          "type": "enum",
          "description": "How to merge subword tokens into entity spans.",
          "required": false,
          "default": "simple"
        },
        {
          "name": "dtype",
          "type": "enum",
          "description": "Model dtype / quantization level.",
          "required": false,
          "default": "auto"
        },
        {
          "name": "device",
          "type": "enum",
          "description": "Inference device.",
          "required": false,
          "default": "auto"
        }
      ],
      "outputs": [
        {
          "name": "entities",
          "type": "list"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/transformers/tokenclassificationner",
      "markdown_url": "https://docs.nodetool.ai/nodes/transformers/tokenclassificationner.md"
    },
    {
      "type": "transformers.Translation",
      "title": "Translation",
      "namespace": "transformers",
      "description": "",
      "inputs": [
        {
          "name": "text",
          "type": "str",
          "description": "Source text to translate.",
          "required": false,
          "default": "Hello, how are you?"
        },
        {
          "name": "model",
          "type": "any",
          "description": "Transformers.js model (ONNX-compatible).",
          "required": true
        },
        {
          "name": "src_lang",
          "type": "str",
          "description": "Source language code understood by the model (e.g. NLLB BCP-47 codes).",
          "required": false,
          "default": "eng_Latn"
        },
        {
          "name": "tgt_lang",
          "type": "str",
          "description": "Target language code understood by the model.",
          "required": false,
          "default": "fra_Latn"
        },
        {
          "name": "max_length",
          "type": "int",
          "description": "Maximum number of tokens in the translation.",
          "required": false,
          "default": 256
        },
        {
          "name": "dtype",
          "type": "enum",
          "description": "Model dtype / quantization level.",
          "required": false,
          "default": "auto"
        },
        {
          "name": "device",
          "type": "enum",
          "description": "Inference device.",
          "required": false,
          "default": "auto"
        }
      ],
      "outputs": [
        {
          "name": "translation",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/transformers/translation",
      "markdown_url": "https://docs.nodetool.ai/nodes/transformers/translation.md"
    },
    {
      "type": "transformers.ZeroShotClassification",
      "title": "Zero-Shot Classification",
      "namespace": "transformers",
      "description": "",
      "inputs": [
        {
          "name": "text",
          "type": "str",
          "description": "Text to classify.",
          "required": false,
          "default": "I have a problem with my iphone that needs to be resolved asap."
        },
        {
          "name": "candidate_labels",
          "type": "str",
          "description": "Comma-separated list of candidate labels.",
          "required": false,
          "default": "urgent, not urgent, phone, tablet, computer"
        },
        {
          "name": "multi_label",
          "type": "bool",
          "description": "Allow multiple labels to be true simultaneously.",
          "required": false,
          "default": false
        },
        {
          "name": "model",
          "type": "any",
          "description": "Transformers.js model (ONNX-compatible).",
          "required": true
        },
        {
          "name": "hypothesis_template",
          "type": "str",
          "description": "Template used to construct the entailment hypothesis.",
          "required": false,
          "default": "This example is {}."
        },
        {
          "name": "dtype",
          "type": "enum",
          "description": "Model dtype / quantization level.",
          "required": false,
          "default": "auto"
        },
        {
          "name": "device",
          "type": "enum",
          "description": "Inference device.",
          "required": false,
          "default": "auto"
        }
      ],
      "outputs": [
        {
          "name": "label",
          "type": "str"
        },
        {
          "name": "score",
          "type": "float"
        },
        {
          "name": "labels",
          "type": "list"
        },
        {
          "name": "scores",
          "type": "list"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/transformers/zeroshotclassification",
      "markdown_url": "https://docs.nodetool.ai/nodes/transformers/zeroshotclassification.md"
    },
    {
      "type": "transformers.ZeroShotImageClassification",
      "title": "Zero-Shot Image Classification",
      "namespace": "transformers",
      "description": "",
      "inputs": [
        {
          "name": "image",
          "type": "image",
          "description": "Image to classify.",
          "required": false,
          "default": {
            "type": "image"
          }
        },
        {
          "name": "candidate_labels",
          "type": "str",
          "description": "Comma-separated list of candidate labels.",
          "required": false,
          "default": "a photo of a cat, a photo of a dog, a photo of a bird"
        },
        {
          "name": "model",
          "type": "any",
          "description": "Transformers.js model (ONNX-compatible).",
          "required": true
        },
        {
          "name": "dtype",
          "type": "enum",
          "description": "Model dtype / quantization level.",
          "required": false,
          "default": "auto"
        },
        {
          "name": "device",
          "type": "enum",
          "description": "Inference device.",
          "required": false,
          "default": "auto"
        }
      ],
      "outputs": [
        {
          "name": "label",
          "type": "str"
        },
        {
          "name": "score",
          "type": "float"
        },
        {
          "name": "results",
          "type": "list"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/transformers/zeroshotimageclassification",
      "markdown_url": "https://docs.nodetool.ai/nodes/transformers/zeroshotimageclassification.md"
    },
    {
      "type": "vector.Collection",
      "title": "Collection",
      "namespace": "vector",
      "description": "Get or create a named vector database collection for storing embeddings.\n    vector, embedding, collection, RAG, get, create",
      "inputs": [
        {
          "name": "name",
          "type": "str",
          "description": "The name of the collection to create",
          "required": false,
          "default": ""
        },
        {
          "name": "embedding_model",
          "type": "llama_model",
          "description": "Model to use for embedding, search for nomic-embed-text and download it",
          "required": false,
          "default": {
            "type": "llama_model",
            "name": "",
            "repo_id": "",
            "modified_at": "",
            "size": 0,
            "digest": "",
            "details": {}
          }
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "collection"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/vector/collection",
      "markdown_url": "https://docs.nodetool.ai/nodes/vector/collection.md"
    },
    {
      "type": "vector.Count",
      "title": "Count",
      "namespace": "vector",
      "description": "Count the number of documents in a collection.\n    vector, embedding, collection, RAG",
      "inputs": [
        {
          "name": "collection",
          "type": "collection",
          "description": "The collection to count",
          "required": false,
          "default": {
            "type": "collection",
            "name": ""
          }
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "int"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/vector/count",
      "markdown_url": "https://docs.nodetool.ai/nodes/vector/count.md"
    },
    {
      "type": "vector.GetDocuments",
      "title": "Get Documents",
      "namespace": "vector",
      "description": "Get documents from a collection.\n    vector, embedding, collection, RAG, retrieve",
      "inputs": [
        {
          "name": "collection",
          "type": "collection",
          "description": "The collection to get",
          "required": false,
          "default": {
            "type": "collection",
            "name": ""
          }
        },
        {
          "name": "ids",
          "type": "list[str]",
          "description": "The ids of the documents to get",
          "required": false,
          "default": []
        },
        {
          "name": "limit",
          "type": "int",
          "description": "The limit of the documents to get",
          "required": false,
          "default": 100
        },
        {
          "name": "offset",
          "type": "int",
          "description": "The offset of the documents to get",
          "required": false,
          "default": 0
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "list[str]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/vector/getdocuments",
      "markdown_url": "https://docs.nodetool.ai/nodes/vector/getdocuments.md"
    },
    {
      "type": "vector.HybridSearch",
      "title": "Hybrid Search",
      "namespace": "vector",
      "description": "Hybrid search combining semantic and keyword-based search for better retrieval. Uses reciprocal rank fusion to combine results from both methods.\n    vector, RAG, query, semantic, text, similarity",
      "inputs": [
        {
          "name": "collection",
          "type": "collection",
          "description": "The collection to query",
          "required": false,
          "default": {
            "type": "collection",
            "name": ""
          }
        },
        {
          "name": "text",
          "type": "str",
          "description": "The text to query",
          "required": false,
          "default": ""
        },
        {
          "name": "n_results",
          "type": "int",
          "description": "The number of final results to return",
          "required": false,
          "default": 5
        },
        {
          "name": "k_constant",
          "type": "float",
          "description": "Constant for reciprocal rank fusion (default: 60.0)",
          "required": false,
          "default": 60
        },
        {
          "name": "min_keyword_length",
          "type": "int",
          "description": "Minimum length for keyword tokens",
          "required": false,
          "default": 3
        }
      ],
      "outputs": [
        {
          "name": "ids",
          "type": "list[str]"
        },
        {
          "name": "documents",
          "type": "list[str]"
        },
        {
          "name": "metadatas",
          "type": "list[dict]"
        },
        {
          "name": "distances",
          "type": "list[float]"
        },
        {
          "name": "scores",
          "type": "list[float]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/vector/hybridsearch",
      "markdown_url": "https://docs.nodetool.ai/nodes/vector/hybridsearch.md"
    },
    {
      "type": "vector.IndexAggregatedText",
      "title": "Index Aggregated Text",
      "namespace": "vector",
      "description": "Index multiple text chunks at once with aggregated embeddings from Ollama.\n    vector, embedding, collection, RAG, index, text, chunk, batch, ollama",
      "inputs": [
        {
          "name": "collection",
          "type": "collection",
          "description": "The collection to index",
          "required": false,
          "default": {
            "type": "collection",
            "name": ""
          }
        },
        {
          "name": "document",
          "type": "str",
          "description": "The document to index",
          "required": false,
          "default": ""
        },
        {
          "name": "document_id",
          "type": "str",
          "description": "The document ID to associate with the text",
          "required": false,
          "default": ""
        },
        {
          "name": "metadata",
          "type": "dict",
          "description": "The metadata to associate with the text",
          "required": false,
          "default": {}
        },
        {
          "name": "text_chunks",
          "type": "list[union[text_chunk, str]]",
          "description": "List of text chunks to index",
          "required": false,
          "default": []
        },
        {
          "name": "aggregation",
          "type": "enum",
          "description": "The aggregation method to use for the embeddings.",
          "required": false,
          "default": "mean"
        }
      ],
      "outputs": [],
      "documentation_url": "https://docs.nodetool.ai/nodes/vector/indexaggregatedtext",
      "markdown_url": "https://docs.nodetool.ai/nodes/vector/indexaggregatedtext.md"
    },
    {
      "type": "vector.IndexEmbedding",
      "title": "Index Embedding",
      "namespace": "vector",
      "description": "Index a single embedding vector into a collection with optional metadata. Creates a searchable entry that can be queried for similarity matching.\n    vector, index, embedding, storage, RAG",
      "inputs": [
        {
          "name": "collection",
          "type": "collection",
          "description": "The collection to index",
          "required": false,
          "default": {
            "type": "collection",
            "name": ""
          }
        },
        {
          "name": "embedding",
          "type": "list",
          "description": "The embedding to index",
          "required": false,
          "default": {
            "type": "list",
            "value": null,
            "dtype": "<i8",
            "shape": [
              1
            ]
          }
        },
        {
          "name": "index_id",
          "type": "union[str, list[str]]",
          "description": "The ID to associate with the embedding",
          "required": false,
          "default": ""
        },
        {
          "name": "metadata",
          "type": "union[dict, list[dict]]",
          "description": "The metadata to associate with the embedding",
          "required": false,
          "default": {}
        }
      ],
      "outputs": [],
      "documentation_url": "https://docs.nodetool.ai/nodes/vector/indexembedding",
      "markdown_url": "https://docs.nodetool.ai/nodes/vector/indexembedding.md"
    },
    {
      "type": "vector.IndexImage",
      "title": "Index Image",
      "namespace": "vector",
      "description": "Index a list of image assets or files.\n    vector, embedding, collection, RAG, index, image, batch",
      "inputs": [
        {
          "name": "collection",
          "type": "collection",
          "description": "The collection to index",
          "required": false,
          "default": {
            "type": "collection",
            "name": ""
          }
        },
        {
          "name": "image",
          "type": "image",
          "description": "The image asset to index",
          "required": false,
          "default": {
            "type": "image",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "index_id",
          "type": "str",
          "description": "The ID to associate with the image, defaults to the URI of the image",
          "required": false,
          "default": ""
        },
        {
          "name": "metadata",
          "type": "dict",
          "description": "The metadata to associate with the image",
          "required": false,
          "default": {}
        },
        {
          "name": "upsert",
          "type": "bool",
          "description": "Whether to upsert the images",
          "required": false,
          "default": false
        }
      ],
      "outputs": [],
      "documentation_url": "https://docs.nodetool.ai/nodes/vector/indeximage",
      "markdown_url": "https://docs.nodetool.ai/nodes/vector/indeximage.md"
    },
    {
      "type": "vector.IndexString",
      "title": "Index String",
      "namespace": "vector",
      "description": "Index a string with a Document ID to a collection.\n    vector, embedding, collection, RAG, index, text, string",
      "inputs": [
        {
          "name": "collection",
          "type": "collection",
          "description": "The collection to index",
          "required": false,
          "default": {
            "type": "collection",
            "name": ""
          }
        },
        {
          "name": "text",
          "type": "str",
          "description": "Text content to index",
          "required": false,
          "default": ""
        },
        {
          "name": "document_id",
          "type": "str",
          "description": "Document ID to associate with the text content",
          "required": false,
          "default": ""
        },
        {
          "name": "metadata",
          "type": "dict",
          "description": "The metadata to associate with the text",
          "required": false,
          "default": {}
        }
      ],
      "outputs": [],
      "documentation_url": "https://docs.nodetool.ai/nodes/vector/indexstring",
      "markdown_url": "https://docs.nodetool.ai/nodes/vector/indexstring.md"
    },
    {
      "type": "vector.IndexTextChunk",
      "title": "Index Text Chunk",
      "namespace": "vector",
      "description": "Index a single text chunk.\n    vector, embedding, collection, RAG, index, text, chunk",
      "inputs": [
        {
          "name": "collection",
          "type": "collection",
          "description": "The collection to index",
          "required": false,
          "default": {
            "type": "collection",
            "name": ""
          }
        },
        {
          "name": "document_id",
          "type": "str",
          "description": "The document ID to associate with the text chunk",
          "required": false,
          "default": ""
        },
        {
          "name": "text",
          "type": "str",
          "description": "The text to index",
          "required": false,
          "default": ""
        },
        {
          "name": "metadata",
          "type": "dict",
          "description": "The metadata to associate with the text chunk",
          "required": false,
          "default": {}
        }
      ],
      "outputs": [],
      "documentation_url": "https://docs.nodetool.ai/nodes/vector/indextextchunk",
      "markdown_url": "https://docs.nodetool.ai/nodes/vector/indextextchunk.md"
    },
    {
      "type": "vector.Peek",
      "title": "Peek",
      "namespace": "vector",
      "description": "Peek at the documents in a collection.\n    vector, embedding, collection, RAG, preview",
      "inputs": [
        {
          "name": "collection",
          "type": "collection",
          "description": "The collection to peek",
          "required": false,
          "default": {
            "type": "collection",
            "name": ""
          }
        },
        {
          "name": "limit",
          "type": "int",
          "description": "The limit of the documents to peek",
          "required": false,
          "default": 100
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "list[str]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/vector/peek",
      "markdown_url": "https://docs.nodetool.ai/nodes/vector/peek.md"
    },
    {
      "type": "vector.QueryImage",
      "title": "Query Image",
      "namespace": "vector",
      "description": "Query the index for similar images.\n    vector, RAG, query, image, search, similarity",
      "inputs": [
        {
          "name": "collection",
          "type": "collection",
          "description": "The collection to query",
          "required": false,
          "default": {
            "type": "collection",
            "name": ""
          }
        },
        {
          "name": "image",
          "type": "image",
          "description": "The image to query",
          "required": false,
          "default": {
            "type": "image",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "n_results",
          "type": "int",
          "description": "The number of results to return",
          "required": false,
          "default": 1
        }
      ],
      "outputs": [
        {
          "name": "ids",
          "type": "list[str]"
        },
        {
          "name": "documents",
          "type": "list[str]"
        },
        {
          "name": "metadatas",
          "type": "list[dict]"
        },
        {
          "name": "distances",
          "type": "list[float]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/vector/queryimage",
      "markdown_url": "https://docs.nodetool.ai/nodes/vector/queryimage.md"
    },
    {
      "type": "vector.QueryText",
      "title": "Query Text",
      "namespace": "vector",
      "description": "Query the index for similar text.\n    vector, RAG, query, text, search, similarity",
      "inputs": [
        {
          "name": "collection",
          "type": "collection",
          "description": "The collection to query",
          "required": false,
          "default": {
            "type": "collection",
            "name": ""
          }
        },
        {
          "name": "text",
          "type": "str",
          "description": "The text to query",
          "required": false,
          "default": ""
        },
        {
          "name": "n_results",
          "type": "int",
          "description": "The number of results to return",
          "required": false,
          "default": 1
        }
      ],
      "outputs": [
        {
          "name": "ids",
          "type": "list[str]"
        },
        {
          "name": "documents",
          "type": "list[str]"
        },
        {
          "name": "metadatas",
          "type": "list[dict]"
        },
        {
          "name": "distances",
          "type": "list[float]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/vector/querytext",
      "markdown_url": "https://docs.nodetool.ai/nodes/vector/querytext.md"
    },
    {
      "type": "vector.RemoveOverlap",
      "title": "Remove Overlap",
      "namespace": "vector",
      "description": "Removes overlapping words between consecutive strings in a list. Splits text into words and matches word sequences for more accurate overlap detection.\n    vector, RAG, query, text, processing, overlap, deduplication",
      "inputs": [
        {
          "name": "documents",
          "type": "list[str]",
          "description": "List of strings to process for overlap removal",
          "required": false,
          "default": []
        },
        {
          "name": "min_overlap_words",
          "type": "int",
          "description": "Minimum number of words that must overlap to be considered",
          "required": false,
          "default": 2
        }
      ],
      "outputs": [
        {
          "name": "documents",
          "type": "list[str]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/vector/removeoverlap",
      "markdown_url": "https://docs.nodetool.ai/nodes/vector/removeoverlap.md"
    },
    {
      "type": "xai.image.GenerateImage",
      "title": "Generate Image",
      "namespace": "xai.image",
      "description": "Generate images from text using xAI's Grok image models.\n    xai, grok, image, t2i, text-to-image, create, generate, picture, art\n\n    Uses xAI's OpenAI-compatible image generations endpoint. The model\n    automatically revises the prompt; the revised prompt is returned as a\n    second output. Requires an xAI API key.",
      "inputs": [
        {
          "name": "prompt",
          "type": "str",
          "description": "The prompt describing the image to generate.",
          "required": false,
          "default": ""
        },
        {
          "name": "model",
          "type": "str",
          "description": "The Grok image model to use (e.g. grok-2-image, grok-imagine-image).",
          "required": false,
          "default": "grok-2-image"
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "image"
        },
        {
          "name": "revised_prompt",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/xai/image/generateimage",
      "markdown_url": "https://docs.nodetool.ai/nodes/xai/image/generateimage.md"
    },
    {
      "type": "xai.text.ChatComplete",
      "title": "Chat Complete",
      "namespace": "xai.text",
      "description": "Generate text using xAI's Grok chat completion models.\n    xai, grok, chat, ai, text generation, llm, completion\n\n    Uses xAI's Grok models to generate responses from prompts via the\n    OpenAI-compatible chat completions endpoint. Requires an xAI API key.\n\n    Use cases:\n    - Generate text responses to prompts\n    - Build conversational AI applications\n    - Summarize, rewrite, and classify text\n    - Reasoning tasks with Grok models",
      "inputs": [
        {
          "name": "model",
          "type": "str",
          "description": "The Grok model to use (e.g. grok-4, grok-4.3, grok-3, grok-3-mini).",
          "required": false,
          "default": "grok-4"
        },
        {
          "name": "prompt",
          "type": "str",
          "description": "The prompt for text generation",
          "required": false,
          "default": ""
        },
        {
          "name": "system_prompt",
          "type": "str",
          "description": "Optional system prompt to guide the model's behavior",
          "required": false,
          "default": ""
        },
        {
          "name": "temperature",
          "type": "float",
          "description": "Sampling temperature. Higher values make output more random.",
          "required": false,
          "default": 0.7
        },
        {
          "name": "max_tokens",
          "type": "int",
          "description": "Maximum number of tokens to generate",
          "required": false,
          "default": 1024
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/xai/text/chatcomplete",
      "markdown_url": "https://docs.nodetool.ai/nodes/xai/text/chatcomplete.md"
    },
    {
      "type": "xai.text.WebSearch",
      "title": "Web Search",
      "namespace": "xai.text",
      "description": "Answer questions using Grok with xAI Live Search over the web and X.\n    xai, grok, search, web, live, realtime, citations\n\n    Uses xAI's Live Search (search_parameters) so Grok can pull in\n    real-time information from the web and X to answer the query.\n    Requires an xAI API key.\n\n    Use cases:\n    - Answer questions about current events\n    - Research with up-to-date sources\n    - Summarize recent news",
      "inputs": [
        {
          "name": "model",
          "type": "str",
          "description": "The Grok model to use for the search query.",
          "required": false,
          "default": "grok-4"
        },
        {
          "name": "query",
          "type": "str",
          "description": "The question to research using live web/X search.",
          "required": false,
          "default": ""
        },
        {
          "name": "search_mode",
          "type": "enum",
          "description": "auto lets Grok decide when to search, on forces search, off disables it.",
          "required": false,
          "default": "auto"
        },
        {
          "name": "max_results",
          "type": "int",
          "description": "Maximum number of search results to consider.",
          "required": false,
          "default": 10
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        },
        {
          "name": "citations",
          "type": "list[str]"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/xai/text/websearch",
      "markdown_url": "https://docs.nodetool.ai/nodes/xai/text/websearch.md"
    },
    {
      "type": "xai.vision.ImageToText",
      "title": "Image To Text",
      "namespace": "xai.vision",
      "description": "Analyze images and generate text using xAI's Grok vision models.\n    xai, grok, vision, image, ocr, analysis, multimodal\n\n    Uses Grok's multimodal models to understand and describe images via the\n    OpenAI-compatible chat completions endpoint. Can perform OCR, image\n    analysis, and answer questions about images. Requires an xAI API key.\n\n    Use cases:\n    - Describe image contents\n    - Answer questions about images\n    - Extract text from images (OCR)\n    - Analyze charts and diagrams",
      "inputs": [
        {
          "name": "image",
          "type": "image",
          "description": "The image to analyze",
          "required": false,
          "default": {
            "type": "image",
            "uri": "",
            "asset_id": null,
            "data": null,
            "metadata": null
          }
        },
        {
          "name": "prompt",
          "type": "str",
          "description": "The prompt/question about the image",
          "required": false,
          "default": "Describe this image in detail."
        },
        {
          "name": "model",
          "type": "str",
          "description": "The Grok vision model to use (e.g. grok-2-vision-1212, grok-4).",
          "required": false,
          "default": "grok-2-vision-1212"
        },
        {
          "name": "temperature",
          "type": "float",
          "description": "Sampling temperature for response generation",
          "required": false,
          "default": 0.3
        },
        {
          "name": "max_tokens",
          "type": "int",
          "description": "Maximum number of tokens to generate",
          "required": false,
          "default": 1024
        }
      ],
      "outputs": [
        {
          "name": "output",
          "type": "str"
        }
      ],
      "documentation_url": "https://docs.nodetool.ai/nodes/xai/vision/imagetotext",
      "markdown_url": "https://docs.nodetool.ai/nodes/xai/vision/imagetotext.md"
    }
  ]
}
