Node reference
All 124 palette nodes, grouped exactly as the editor groups them: domain → group → node. How to read a node page.
Input / Output
Boundaries
EntryWorkflow entry point. Two OUTPUTS (does not pass through the raw envelope): output — for chat/telegram it is the message STRING, and with custom inputs (manual/API/editor run with an object without a message key) it is the ENTIRE input object → inputs.input.<field> directly; data — trigger context (trigger, chat.session_id, telegram.*; the webhook's structured payload is in data.webhook.payload). Get chat history via chat_history nodes. There must be exactly one. Has no exec_in.
entryExitWorkflow exit point. Receives the final result and returns it to the user (or as an API response). The optional files input (PT_FILE, multiple refs) returns files along with the response: external/webdav links are downloaded into the system store, files already ours are passed through without rewriting, and shown in chat (image/audio/attachment). There must be at least one. Supports response streaming. Has no exec_out.exitUI Output
AI
LLM
Json ParserAn extension tool for the agent: forces the LLM to respond in JSON format per a schema. Injects the schema into the system prompt and parses the response. Connects to an AI Agent via link_extension.
json_parserLLMLanguage model configuration (provider + model + temperature). Does not run on its own — connects to an AI Agent, LLM Response, or Structured Output LLM via link_llm. Has no exec_in/exec_out.llmLLM ResponseSends a message to the LLM and streams the response. A simpler option than AI Agent — no tools, a single call. Requires an LLM via link_llm. Supports a system prompt and chat history.llm_responseMessageBuilds a canonical message (role + text + attachments) from the text and files inputs. Use it when you need to pass a message with files to an LLM node, sub-workflow, or memory.messageMessagesAssembles an array of messages (Messages) from several inputs. Only the number of Message input ports is set in the config. Any data input becomes a role=user message; if an incoming input is a Messages array, it is unpacked and inserted in place. Barrier: waits for all connected inputs.messagesStructured Output LLMCalls an LLM and returns the response strictly in JSON format according to a given schema (structured output). Used when you need typed output rather than free text. Requires an LLM via link_llm.structured_output_llmAgents
Agent PlanTodo list for the agent: plan and check off tasks via tools. Stream to the Extra panel — 'Stream to Extra panel'; the stream port is hidden by default, enable 'Explicit Extra stream port' for an edge to the Extra Section.
agent_planAI AgentAutonomous agent with tool support. Receives a message, calls connected tools (tool_out) and returns a response. Requires an LLM node via link_llm. Optional: memory (conversation history), skills/extensions (tools).ai_agentToolsetCombines several tools (extension nodes) into a single output for connecting to an AI Agent. Handy when you need to group many tools and connect them through one agent port.toolsetWF toolWraps a subgraph as an agent tool. The agent calls WF Tool by name, the chain of inner nodes runs (port «Data»/input → … → port «Result»/result), and the result is returned to the agent. Lets you build reusable tools out of nodes.wf_toolWidget toolsAn agent extension: exposes to the LLM all JS functions declared in the widget embed code (flowWidget.defineFunction) as tools. When the model calls a tool, the visitor's browser runs the bound JS and returns the result. Works only in widget mode.widget_toolsAgent State
Agent MemoryLong-term structured agent memory: stores key-value data between calls. The agent can read, modify and delete values via built-in tools. Connected via link_extension.
agent_memoryAgent SkillsA set of skills for the agent: each skill is a set of instructions in the system prompt. The agent can activate/deactivate skills dynamically. Connected via link_extension.agent_skillsConversation Memory
Buffer MemoryStores the full conversation history without limits. Connects to an AI Agent or LLM Response via link_memory. Storage scope: thread (between messages), session (within an execution) or call (one-off).
buffer_memoryChat HistoryLoads the recent history of the current conversation as a Messages array, bounded by a message limit. The source is the saved chat messages keyed by (workflow_id, session). Works for both web chat and Telegram (bot turns are mirrored into the same table). By default it reads the current thread; you can override session_id.chat_historyChat History ToolA tool for the AI Agent: on call it returns the recent conversation history (a role: text transcript), bounded by a message limit. The source is the same as the Chat History node — the saved chat messages (web chat and Telegram). Connect it to the agent via tool_out → extensions.chat_history_toolSummary MemoryStores the conversation history, automatically compressing older messages via LLM summarization. The LLM can be taken from the connected agent or set separately via link_llm.summary_memoryWindow MemoryStores only the last N messages of the dialogue (sliding window). More predictable in context size than Buffer Memory. Configured via window_size.window_memoryRAG
Embed TextComputes a vector embedding for the input text. The model comes from a connected Embedding node or from the inline setting. The vector can be fed into RAG Query (search by a ready vector) or used in any pipeline.
embed_textEmbedding ModelEmbedding model configuration (analogous to the LLM node). Links to Embed Text. Does not perform computations itself.embeddingKB WriteAdds text to the knowledge base: chunking → embedding → vector store. By default creates a document (visible in the KB UI); optionally a raw mode without writing a document record.kb_writeKnowledge BaseKnowledge base configuration for RAG. Selects an existing KB from the system. Connects to RAG Query or RAG Tool via a data port. Does not perform the search itself.rag_kbRAG QueryPerforms a semantic search over the knowledge base and returns relevant context. Takes the query via the 'query' port and the KB via the 'kb' port. The result is passed to the LLM to generate an answer.rag_queryRAG ToolExposes the knowledge base as a tool for the AI Agent. The agent itself decides when to run the search. Connects via link_extension. Unlike RAG Query, it is invoked by the agent rather than deterministically.rag_toolRerankRe-ranks a list of chunks by relevance to the query via a cross-encoder reranker. Universal: composes with RAG Query, RRF Fusion, or any chunk source.rerankRerankerReranker configuration (Cohere/Jina/Voyage). Connects by link to the Rerank node. Performs no computation itself.rerank_configRRF FusionMerges several ranked lists of chunks using Reciprocal Rank Fusion (rank-only, independent of score scales). Waits for all incoming branches, then fuses. The basis of hybrid search.rrf_fusionMedia (Speech / Image / Video)
Generate ImageGenerate an image from text (text2img) or from text + an input image (img2img). Parameters (size/quality/n) depend on the selected model.
image_generateSpeech → TextTranscribes an audio file to text (STT). The model and its parameters are taken from the media catalog; the key comes from env or from a workspace OpenRouter connection.speech_to_textText → SpeechSynthesizes speech (an audio file) from text (TTS). Voice/format are parameters of the selected model from the media catalog.text_to_speechStream Observers
Catch OutputIntercepts the AI Agent's text output and streams it to the Extra panel (or chat). By default there is no stream port; enable "Explicit Extra stream port" to wire an edge to an Extra Section.
catch_outputCatch ThinkingIntercepts the agent's thinking tokens and streams them to the Extra panel. By default there is no stream port; enable "Explicit Extra stream port" for an explicit edge to an Extra Section.catch_thinkingCatch Tool CallIntercepts the agent's tool calls in real time and streams them to the Extra panel. By default there is no stream port; enable "Explicit Extra stream port" for an explicit edge to an Extra Section.catch_tool_callLogic & Flow
Branching
If / ElseConditional branching: evaluates an expression and routes execution to the 'true' or 'false' branch. The expression supports comparisons and access to node data: {{nodes.llm_1.output.score}} > 0.8.
ifSwitchMulti-way branching: evaluates an expression and selects one of several outputs by value (like switch/case). If the value matches none — the 'default' branch runs.switchIteration
FilterIterates over the JSON array from the ED port 'Input'. Runs a subgraph for each element; the value on the end port must be strictly a bool. On true the source element is kept in the output array; on false it is dropped. Order is preserved. The node result is the filtered array.
filterFor eachSequentially iterates over the JSON array from the ED port 'Input'. For each element it runs the subgraph between the item and end ports (like WF tool). The value on the end port is ignored; handy for side effects.for_eachMapIterates over a JSON array from the ED port 'Input'. For each element it runs the item→end subgraph and collects the raw value from the end port into an output array (order matches the input array). The node's result is that array itself. Optionally runs iterations in parallel with a concurrency limit.mapWhile LoopRepeats the loop body while the condition is true. The Start/End ports are pure exec (no data is passed). Done returns the original Input. The optional Status port explains the stop reason: condition_false or max_iterations.while_loopSynchronization
MergeCombines separate exec and data inputs into a single execute_data output. Fires on the incoming exec and takes the last value from the data input.
mergeSplitSplits a combined execute_data input into separate exec and data outputs. Makes the separation of execution flow and data an explicit element of the graph.splitWait allWaits for active incoming branches to finish and continues the flow. Counts only actually executed edges (skipped switch branches do not block). Aggregates data according to merge_mode (first / last / merge). stream_through forwards streaming branches' tokens straight to the exit without waiting for the barrier (the value is still aggregated per merge_mode).wait_allData
Values & State
ConstantStatic value (string, number, boolean). Computed once at workflow start and passes the value to other nodes via a data port. Has no exec_in/exec_out.
constTemplateBuilds text from a template with values substituted from other nodes: {{nodes.llm_1.output}}, {{inputs.message}}. Used to compose prompts, messages, and strings from dynamic data.templateVariableDeclares a variable with a name, type, and initial value. The variable can be session-scoped (lives within an execution) or thread-scoped (persisted in the DB between messages). Connects to VarSet for writing.varSet VariableWrites a new value to a variable (Var node). The «Input» port is the execution trigger and the data to write; «Var» is the reference to the Var node.var_setOperators
LogicLogic operation: a comparison (==, !=, >, <, >=, <=) or a boolean operation (and, or, not) over two values. Returns a boolean result. Often used before an If node.
logic_opMathMath operation over two values (A and B): addition, subtraction, multiplication, division, modulo, power. Inputs are connected via the data ports a and b.math_opString OpA string operation: concatenation, substring search, upper/lower case, trim, length, split by separator. The main string is the data leg of the «Input» port (ED), the second argument comes via the «B» port.string_opJSON
JSON MergeMerges two JSON objects: keys from B override keys from A. Supports deep (recursive) merge and shallow merge. Handy for combining data from different nodes.
json_mergeJSON SetSets a value at a JSONPath path in an object. Takes the source JSON (the 'json' port) and the new value (the 'value' port), and returns the modified object. Path format: $.user.name.json_setCode
DataFrame I/O
ConvertUniversal payload converter: json ↔ dataframe ↔ csv. Choose the source and target type.
convertRead CSVReads a CSV file from the connected file_store (WebDAV) and converts it into a DataFrame. Parameters: delimiter, encoding, header row.df_read_csvRead XLSXReads a sheet of an Excel file (xlsx) from the connected file_store into a DataFrame. Supports selecting a sheet by name or index.df_read_xlsxWrite CSVWrites a DataFrame to a CSV file in the connected file_store. Overwrites the target file if it exists.df_write_csvWrite XLSXWrites a DataFrame to an Excel file (xlsx) in the connected file_store. Overwrites the target file if it exists.df_write_xlsxDataFrame Ops
DataFrame ToolConnects a set of DataFrame tools to the AI Agent: CSV/XLSX loading, filtering, merging, aggregation, saving. Requires a connected file_store for read/write operations.
dataframe_toolDF ConcatSQL UNION ALL / column-stack: concatenates two DataFrames by rows or by columns.df_concatDF DistinctSQL SELECT DISTINCT: removes duplicates over a set of columns.df_drop_duplicatesDF Group BySQL GROUP BY + aggregations: specify the grouping columns and a list of aggregates (sum/mean/min/max/count/...).df_groupby_aggDF MergeSQL JOIN of two DataFrames: inner/left/right/outer/cross. Connect the left table to ``left`` and the right table to ``right``.df_mergeDF QuerySQL WHERE: filters DataFrame rows by an expression (``DataFrame.query`` syntax). Example: ``revenue > 1000 and country == 'DE'``.df_queryDF SelectSQL SELECT: selects/renames/drops columns. Each list row specifies source → alias or drop.df_selectDF SortSQL ORDER BY: sort by one or more columns.df_sortDF UpdateSQL UPDATE: sets column values of rows matching the predicate. If the predicate is empty, all rows are updated.df_updateDatabase
DB CountCounts the number of documents matching the filter.
db_countDB DeleteDeletes documents by filter. multi=true deletes all matches.db_deleteDB FindSearches documents by a MongoDB-style filter with sort/limit/skip/projection. Returns an array of documents.db_findDB Find OneFirst document matching the filter (or null).db_find_oneDB InsertInserts a document (or an array of documents when many=true) into a NoSQL store collection. Returns inserted_ids.db_insertDB UpdateUpdates documents matching the filter with a MongoDB-style update expression ($set, $inc, $push, ...). Supports upsert and multi.db_updateDiagnostics
Integrations
HTTP & Web
Fetch WebpageA web page fetching tool for the AI Agent: reads the content of a URL and returns text. The agent calls it to retrieve the content of specific pages. Connects via link_extension.
fetch_webpageHTTP RequestPerforms an HTTP request (GET/POST/PUT/PATCH/DELETE/HEAD) and returns the response status, headers and body. Supports JSON/text/form body, bearer/basic/custom-header auth, and templating of URL/headers/body via Jinja. SSRF protection — requests to private networks are blocked.http_requestMCP ToolAn MCP tool via a saved workspace connection (URL, auth, mode, tool).mcp_toolWeb Search (OpenRouter)Searches the web through OpenRouter and returns both the model's answer and the sources themselves with text excerpts. Works as a regular graph step (Query port) and as an AI Agent tool via link_extension. The search engine is the model provider's native one, or Exa/Parallel/Perplexity.openrouter_web_searchWeb SearchAn internet search tool for the AI Agent. The agent calls it automatically when it needs up-to-date information. Connected via link_extension (tool_out → agent).websearchEmail ConfigSelects a saved email connection of the workspace. Credentials are set in the workspace settings, not in the graph.
email_configEmail ToolExposes email operations (send, read, search) as tools for the AI Agent. Requires Email Config. Connects to the agent via link_extension.email_toolFetch EmailsFetches emails from a mailbox by criteria (UNSEEN, ALL, FROM ...). Returns a list of emails with headers and body. Requires Email Config.fetch_emailsSend EmailSends an email: recipient, subject, body (plain text or HTML). Runs deterministically (not as an agent tool). Requires Email Config via the 'email_config' port.send_emailCalendar
CalDAV ConfigSelect a saved CalDAV connection for the workspace. Credentials are in the workspace settings.
caldav_configDelete Calendar EventDELETE a calendar resource.calendar_delete_eventCalendar Free/BusyREPORT free-busy-query for given calendars.calendar_freebusyGet Calendar EventGET a single calendar resource (iCalendar).calendar_get_eventList CalendarsList calendar collections for the connected CalDAV account.calendar_list_calendarsCalendar MultigetREPORT calendar-multiget for a list of hrefs.calendar_multigetPatch Calendar EventRead-modify-write patch on first VEVENT in resource.calendar_patch_eventPut Calendar EventPUT iCalendar resource (create without etag, update with If-Match).calendar_put_eventCalendar QueryREPORT calendar-query for VEVENT or VTODO in a time range.calendar_queryCalendar SchedulePUT scheduling message (invite/reply/cancel) to configured outbox.calendar_scheduleCalendar ToolCalDAV tools for AI Agent. Requires calendar_store from caldav_config.calendar_toolFiles
File GlobList files matching a glob under the configured store root.
file_globFile ReadRead a text file from the file store.file_readFile ToolGives an AI Agent file tools (fs_glob, fs_read, fs_write). Works on this workspace's own store by default; set 'Connection source' to 'External connection' to point it at a store wired into the 'file_store' port. Read-only by default — tick fs_write to let the model create and overwrite files.file_toolFile WriteWrite or replace lines in a file in the file store.file_writeLocal FS Config (DEV ONLY)DEV ONLY. A local server folder as the file store for File Glob/Read/Write/Tool — the WebDAV Config counterpart on local disk. Disabled in production and restricted to LOCAL_FS_ALLOWED_ROOTS.local_fs_configWebDAV ConfigPicks a saved WebDAV connection of this workspace (Nextcloud, ownCloud, Yandex.Disk, …) as the store for File Glob/Read/Write/Tool. Credentials live in workspace settings, never on the node.webdav_configWS StoreThe current workspace's own file store — the same tree the Files tab browses. Wire it to File Glob/Read/Write/Tool; files written there show up in the Files tab. No credentials needed.ws_store_configTelegram
Send Telegram MessageSends a message to a Telegram chat. Uses the bot this workflow is deployed to; set 'Connection source' to 'External connection' to pick a different bot through the 'telegram_config' port. Chat ID and text come from the config (templates are supported); a blank Chat ID means the chat of the running Telegram turn. Files wired into the 'files' port are delivered after the text, one message each (document/photo/audio). Sending neither text nor files is an error, not a silent no-op.
send_telegram_messageTelegram ReactionPuts (action=set) or removes (action=clear) the bot's emoji reaction on a Telegram message. A blank Chat ID means the chat of the running turn; templates are supported. Uses the bot this workflow is deployed to; set 'Connection source' to 'External connection' to pick a different bot through the 'telegram_config' port.set_telegram_reactionTelegram Chat InfoInformation about a chat and its members. Actions: chat (metadata), member_count (the exact number of members), administrators (the exact list of admins), member (one user's status), known_members (an APPROXIMATE roster assembled from recorded observations — the Bot API cannot enumerate members, so lurkers are missing), bot_rights (what the bot itself may do: delete messages, ban). Requires a Telegram Config, except for known_members, which is answered from our own tables.telegram_chat_infoTelegram Manage ChatChat administration: title, description, read-only mode for everyone (mute_everyone/unmute_everyone via setChatPermissions), creating and revoking invite links, approving or declining join requests, and the 'typing…' status. The bot must be an administrator. Supports dry_run. Requires a Telegram Config.telegram_chat_manageTelegram ConfigPicks a saved Telegram bot from the workspace. The credentials live in the workspace settings, never in the graph — this node hands the resolved token to the action nodes through their 'telegram_config' port.telegram_configTelegram Forward MessageRelays a message to another chat: forward keeps the 'Forwarded from' header, copy re-sends the content without naming the source and can replace the caption. The classic moderation shape is 'archive before you delete' — copy the offending message into a log chat BEFORE removing it. Both chats accept a numeric id or @channelusername; a blank From chat means the chat of the running turn. Requires a Telegram Config.telegram_forwardTelegram Get FileDownloads a Telegram attachment by file_id and stores it as a file reference (PT_FILE) that can be fed to an LLM/vision node or back into Send Telegram Message. The file_id comes from the recorded history ({{ nodes.telegram_history_1.rows[0].media_file_id }}). The Bot API serves files up to 20 MB only. Requires a Telegram Config.telegram_get_fileTelegram Group HistoryReads the recorded history of a Telegram chat: the messages the bot observed in a group or channel, including those that never triggered a workflow. Needs both the 'record group history' switch in the deployment AND privacy mode disabled on the bot (or admin rights) — otherwise the bot simply never sees the messages. A blank Chat ID means the chat of the running turn. Outputs: Messages (for LLMs), Records (raw rows carrying message_id/file_id) and Transcript (plain text).telegram_historyTelegram Inline KeyboardSends a message carrying inline buttons, or attaches buttons to an existing message. Buttons carry command/args — tapping one re-runs the workflow with data.telegram.command / args / message_id. Uses the bot this workflow is deployed to; set 'Connection source' to 'External connection' to pick a different bot through the 'telegram_config' port. Target 'reply_message' attaches the buttons to the bot's reply for this turn, which is delivered at the end of the turn.telegram_inline_keyboardTelegram ModerateChat moderation: delete messages, ban/unban, mute/unmute, grant or revoke admin rights, pin/unpin. The bot must be an administrator holding the matching right (can_delete_messages / can_restrict_members / can_pin_messages). Own messages can only be deleted under 48 hours old; delete_messages is sent in batches of 100. Supports dry_run. Requires a Telegram Config.telegram_moderateTelegram Search MessagesSearches the recorded Telegram messages (full-text on PostgreSQL, substring on SQLite). It searches ONLY what the bot observed — the Bot API offers no history search at all. Scope 'This chat' uses the Chat ID, or the chat of the running turn when it is blank; scope 'Every observed chat' searches the whole workspace and must be chosen deliberately. Returns matches with message_id, author and date, newest first.telegram_searchTelegram ToolsTool for an AI Agent: one bounded entry point to a Telegram chat — reading (history/search/info), moderation (delete/ban/mute/pin) and administration (title/invites/join requests). Each action is enabled separately in enabled_actions, and the tool list the model sees is filtered further by the type of the current chat. The chat comes from the config or the running turn — the model does NOT choose it. Supports dry_run and a ceiling on ban/mute duration. promote/demote are never offered. Requires a Telegram Config, plus admin rights on the bot for moderation/administration. Connects to the agent through tool_out → extensions.telegram_toolsWidget
Bitrix24
Bitrix24 ConfigSelects a saved Bitrix24 connection (incoming webhook) from the workspace. Credentials are configured in workspace settings, not in the graph.
bitrix24_configBitrix24 REST CallGeneric call to a Bitrix24 REST API method (crm.lead.add, crm.deal.list, ...) via an incoming webhook. Requires Bitrix24 Config via the 'bitrix24_config' port. method and params (JSON object) support Jinja templates.bitrix24_rest_callamoCRM
amoCRM ConfigSelects a saved amoCRM connection (subdomain + long-lived API token) from the workspace. Credentials are configured in workspace settings, not in the graph.
amocrm_configamoCRM REST CallPerforms an arbitrary REST request to the amoCRM API v4 (leads/contacts/deals/tasks — any method). Requires amoCRM Config via the 'amocrm_config' port. method/path/body are set in the config (templates supported).amocrm_rest_callVK / VK Teams
VK ConfigSelects a saved VK connection (community/user access_token) from the workspace. Credentials are configured in workspace settings, not in the graph.
vk_configSend VK MessageSends a message via the VK API (messages.send). Requires VK Config via the 'vk_config' port. peer_id and text are set in the config (templates supported).vk_send_messageVK Teams ConfigSelects a saved VK Teams bot from the workspace. Credentials are configured in workspace settings, not in the graph.vk_teams_configSend VK Teams MessageSends a text message to a VK Teams chat. Requires VK Teams Config via the 'vk_teams_config' port. chat_id and text are set in the config (templates supported).vk_teams_send_message