Node reference
All 128 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. It has no run input — the platform starts it.
entryExitWorkflow exit point. Receives the final result and returns it to the user (or as an API response). The optional files input (one or more file references) 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. It has no run output — the scenario ends here.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 the agent's 'Agent extensions' input.
json_parserLLMLanguage model configuration (provider + model + temperature). Does not run on its own — connects to an AI Agent, LLM Response or Structured Output LLM through their Model port. It is not a step of its own: it has no run input or output.llmLLM ResponseSends a message to the LLM and streams the response. A simpler option than AI Agent — no tools, a single call. Takes its model from the Model port. Conversation history is a Messages array on the Message port: wire the Chat History node's output there and the model receives every message, the last one being the current turn.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 input value becomes a role=user message; if an incoming input is a Messages array, it is unpacked and inserted in place. The node waits for the inputs that start it; a value on an input that only carries data is taken only if its source has already run — set the order with a connection from the source's Success output. The history from Chat History already contains the current message: there is no need to add the Entry message to it.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. Takes its model from the Model port. A Messages array on the Message port (e.g. from Chat History) reaches the model whole.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 the connected tools and returns a response. Takes its model from the Model port. 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 it by name, the chain of inner nodes runs ('Tool arguments' output → … → 'Tool response' input), 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 (iternaWidget.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. Connects to the agent's 'Agent extensions' input.
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. Connects to the agent's 'Agent extensions' input.agent_skillsConversation Memory
Buffer MemoryAccumulates conversation history from this scenario's OWN past runs: empty on the first turn, filled as the conversation goes on. To read messages written in the chat before this scenario existed, use the Chat History node. Connects to the AI Agent's Memory input. LLM Response has no memory input — its conversation history comes from a Chat History node wired into its Message port. Storage scope: thread (between messages), session (within an execution) or call (one-off).
buffer_memoryChat HistoryReads THIS chat's conversation as a Messages array — including messages written before the scenario was built: the source is the saved chat messages keyed by (workflow_id, session), written by the platform itself. This is the primary way to give a bot memory of past turns; the memory nodes (Buffer/Window/Summary Memory), by contrast, only accumulate their own runs and are empty on the first turn. The last message of the array is the current one: the platform records it before the scenario starts. Wire the output into LLM Response's Message port (the model gets the whole conversation) or read it in a template. A node that takes this output must run after Chat History: either this output is the only thing connected to it, or draw a connection to it from the Success output. Bounded by limit. 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's 'Agent extensions' input.chat_history_toolSummary MemoryStores the history of this workflow's OWN past runs, compressing older messages via LLM; empty on the first turn — to read a conversation written before the workflow was built, use the Chat History node. The LLM can be taken from the connected agent or wired separately into the Model port.summary_memoryWindow MemoryStores the last N messages from this workflow's OWN past runs (sliding window); empty on the first turn — to read a conversation written before the workflow was built, use the Chat History node. 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 search: selects an existing knowledge base. Connects to the 'Knowledge base' port of RAG Query and KB Write and supplies kb_id, top_k, the score threshold and the context window (metadata filters are combined with the node's own). 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 to the agent's 'Agent extensions' input. 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: the model and how many fragments to keep. 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 → TextRecognises speech from an audio file and returns the text. The voice message that started the scenario arrives as an attachment on the Entry node's Message output — connect that output straight to the Audio input. The model and its parameters are picked in the node's settings.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: an ordered list of conditions ({{ }}), each with its own output. The first condition that is true wins; if none is, the branch named in 'Default branch' ('default' unless changed) runs.switchIteration
FilterIterates over the array from the 'Array' input. Runs the body for each element; the value arriving at 'Keep item?' 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 eachIterates over the array from the 'Array' input, one element at a time. For each element it runs the body between the 'Item' output and the 'End of pass' input. The value arriving at 'End of pass' is not read, so the node is for actions, not for building a new array (Map does that).for_eachMapIterates over the array from the 'Array' input. For each element it runs the body and collects the value from the 'Item value' input 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 and 'End of pass' ports are pure exec (no data is passed). Done returns the original input, not what the body computed. The optional 'Stop reason' port says why the loop ended: condition_false or max_iterations.while_loopSynchronization
MergeCombines a separate run input and a value input into one output that both starts the next step and carries the value. Fires on the incoming run and takes the last value from the value input.
mergeSplitSplits an input that both starts the step and carries a value into two outputs: the run queue and the value itself. Makes the separation an explicit element of the scenario.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 hands the value on to other nodes. It is not a step of its own: it has no run input or output.
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 arrives on the «Input» port, the second argument on 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 dot 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 or $.user.name (the leading $. is optional). Array indexes are NOT supported — use code_javascript for $.items[0].x.json_setCode
DataFrame I/O
ConvertUniversal payload converter: json ↔ dataframe ↔ csv. Choose the source and target type.
convertRead CSVReads a CSV file from the workspace's file store (or a connected one, e.g. 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 workspace's file store (or a connected one) into a DataFrame. Supports selecting a sheet by name or index.df_read_xlsxWrite CSVWrites a DataFrame to a CSV file in the workspace's file store (or a connected one). Overwrites the target file if it exists.df_write_csvWrite XLSXWrites a DataFrame to an Excel file (xlsx) in the workspace's file store (or a connected one). 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. Reads and writes files in the workspace's file store; the file_store port is needed only for an external store.
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 object {docs, count}: the documents found are in docs, so a loop over the result is built on output.docs.db_findDB Find OneFirst document matching the filter. Returns an object {doc, found}: doc is the document or null, found says whether one was found.db_find_oneDB InsertInserts a document (or an array of documents, which is inserted in bulk) 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 to the agent's 'Agent extensions' input.
fetch_webpageHTTP RequestPerforms an HTTP request (GET/POST/PUT/PATCH/DELETE/HEAD) and returns the response status, headers and body. Supports JSON/text/form bodies, a form with files (multipart) and a whole file as the body, bearer/basic/custom-header auth, and templates in the URL, headers and body. The response can be saved as a file in the workspace files and passed on through the File port.http_requestMCP ToolAn MCP tool via a saved workspace connection (URL, auth, mode, tool).mcp_toolWeb SearchSearches the web and returns both the model's answer and the sources themselves with text excerpts. Works as a regular scenario step (the Query port) and as an AI agent tool on the 'Agent extensions' input. The search engine is the model's built-in one, or Exa/Parallel/Perplexity.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. Connection: an Email connection node on the 'Email connection' port, or a saved connection picked in the node itself (the port wins). Connects to the agent's 'Agent extensions' input.email_toolFetch EmailsFetches emails from a mailbox by criteria (UNSEEN, ALL, FROM ...). Returns a list of emails with headers and body. Connection: an Email connection node on the 'Email connection' port, or a saved connection picked in the node itself (the port wins).fetch_emailsSend EmailSends an email: recipient, subject, body (plain text or HTML). Runs deterministically (not as an agent tool). Connection: an Email connection node on the 'Email connection' port, or a saved connection picked in the node itself (the port wins).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. The connection comes from the node's own CalDAV connection field or from a node wired to the CalDAV connection port.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_writeWebDAV 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 connection' 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 connection' 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. Uses the bot this workflow is deployed to; set 'Connection source' to 'External connection' to pick a different bot through the 'Telegram connection' port.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 connection' 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. Uses the bot this workflow is deployed to; set 'Connection source' to 'External connection' to pick a different bot through the 'Telegram connection' port.telegram_forwardTelegram Get FileDownloads a Telegram attachment by file_id and stores it as a file reference 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 }}). Not for the current message: the attachment of the message that started this run already arrives on the Entry node's Message output — wire that straight into Speech → Text or the model. The Bot API serves files up to 20 MB only. Uses the bot this workflow is deployed to; set 'Connection source' to 'External connection' to pick a different bot through the 'Telegram connection' port.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). This is the group's history, not the current message: the message that started this run — with its voice note, photo or document — arrives on the Entry node's Message output; wire that straight into Speech → Text or the model.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 connection' 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. Uses the bot this workflow is deployed to; set 'Connection source' to 'External connection' to pick a different bot through the 'Telegram connection' port.telegram_moderateTelegram Search MessagesSearches the recorded Telegram messages by whole words, without word forms. 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. Uses the bot this workflow is deployed to; set 'Connection source' to 'External connection' to pick a different bot through the 'Telegram connection' port. Moderation and administration also need admin rights on the bot. Connects to the agent's 'Agent extensions' input.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. Connection: a Bitrix24 connection node on the 'Bitrix24 connection' port, or a saved connection picked in the node itself (the port wins). method and params (a JSON object) support {{ }} templates. A Bitrix24 error fails the node — wire the Error output to handle it in the scenario.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). Connection: an amoCRM connection node on the 'amoCRM connection' port, or a saved connection picked in the node itself (the port wins). The method is picked from a list; path and body support templates. An amoCRM error (401, 404, timeout) fails the node — wire the Error output to handle it in the scenario.amocrm_rest_callVK
VK Chat InfoInformation about a conversation and its members. Actions: conversation (metadata), members (the exact list — requires the community to hold the 'administrator' access level inside that conversation), known_members (an APPROXIMATE roster from our own observations: people who never posted are missing, because VK does not report them to a community). known_members answers from our tables and needs no connection.
vk_chat_infoVK ConfigSelects a saved VK connection (community/user access_token) from the workspace. Credentials are configured in workspace settings, not in the graph.vk_configVK Forward MessageRelays messages to another VK chat. forward — with the source named (VK does not allow suppressing it). copy — rebuilds the message: text and attachments arrive without naming where they came from. The classic moderation shape is 'archive first, delete second': copy the offending message into a log conversation BEFORE removing it. A blank From means the chat of the running turn.vk_forwardVK Get FileDownloads a VK message attachment and stores it as a file reference usable by an LLM/vision node or for sending back. Takes a conversation_message_id from the recorded history ({{ nodes.vk_history_1.rows[0].platform_message_ref }}): VK's links expire, so the history keeps an attachment reference rather than a URL and the message is re-read for a fresh link.vk_get_fileVK Conversation HistoryReads the recorded history of a VK chat: the messages the bot observed in a conversation or a direct chat, including those that never triggered a scenario. Needs both the 'record history' switch in the deployment AND the 'access to all correspondence' level for the community inside that conversation — otherwise the bot simply never sees the messages. A blank Peer ID means the chat of the running turn. Outputs: Messages (for LLMs), Records (raw rows: platform_message_ref — the message number within the conversation, attachments) and Transcript (plain text).vk_historyVK KeyboardSends a message carrying buttons, or attaches buttons to the bot's reply for this turn. A button carries command/args — tapping one re-runs the workflow with trigger.vk.payload.command / args. The VK client reports every turn whether it can draw buttons: when it cannot, the text is still delivered and the output says keyboard_sent=false.vk_keyboardVK ModerateModeration actions inside a VK conversation: delete messages, remove a member, pin or unpin. There is no ban and no mute here — VK has no such methods for a conversation. Requires the community to be an administrator of the conversation. A blank Peer ID means the chat of the running turn.vk_moderateVK Search HistorySearches the recorded VK history. Scope: this chat only, or every chat the workspace has observed. Searches strictly what the bot managed to record — VK is not queried. Outputs: Matches (rows) and Transcript.vk_searchSend VK MessageSends a message via the VK API (messages.send). Connection: a VK connection node on the 'VK connection' port, or a saved connection picked in the node itself (the port wins). peer_id and text are set in the config (templates supported). A VK error fails the node — wire the Error output to handle it in the scenario.vk_send_messageVK ToolsTool for an AI Agent: one bounded entry point to a VK chat — reading (history, search, conversation, members) and moderation (delete, remove, pin, unpin). Each action is enabled separately, and the tool list the model sees is narrowed 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. There is no ban, mute or admin promotion: VK has no such methods for a conversation. Moderation requires the community to be an administrator of the conversation. Connects to the agent's 'Agent extensions' input.vk_tools