Major New Features
-
End-to-End Tool Call Passthrough — Full tool calling support across all LLM handlers (Claude, OpenAI, Ollama) with both streaming and non-streaming paths. Frontend API handlers extract
toolsandtool_choicefrom incoming requests, thread them through the workflow pipeline, and forward them to backend LLM handlers. Backend handlers parse tool call data from LLM responses and return it through the response pipeline to the frontend client. A newallowToolsboolean on workflow node configs (defaultfalse) gates which nodes forward tools, so memory nodes, summarizers, and categorizers silently suppress tool calls during internal processing. OpenAI format is used as the internal standard; Claude and Ollama handlers convert to/from their native formats. Streaming tool call chunks bypass all text processing (prefix stripping, think-block removal, group-chat reconstruction) and are emitted directly as SSE. -
DelimitedChunker Workflow Node — New node type that splits content on a delimiter and returns the first N (head) or last N (tail) chunks, rejoined with the same delimiter. Useful for trimming logs, CSV rows, or section-separated documents. Configurable via
content,delimiter,mode("head"/"tail"), andcountproperties. Supports variable substitution in both content and delimiter fields. -
Conversation Variable Formatting Controls — Two new formatting options for
chat_user_prompt_*workflow variables. Node-leveladdUserAssistantTags(boolean) prependsUser:/Assistant:/System:role prefixes to each message in conversation variable strings. User-levelseparateConversationInVariables(boolean) withconversationSeparationDelimiter(string) replaces the default newline between messages with a custom delimiter. -
Node-Level Image Controls — Standard nodes can now control image passthrough via
acceptImages(boolean, preserves images on conversation messages sent to the LLM) andmaxImagesToSend(integer, limits total images sent keeping the most recent; 0 = no limit). Images are trimmed oldest-first. -
/v1/chat/completionsVersioned Route — Added/v1/chat/completionsas the primary versioned route for the OpenAI-compatible API. The existing/chat/completionsis kept as an alias for backward compatibility.
Bug Fixes
-
Curly Brace Escaping in Agent Outputs/Inputs — Fixed
str.format()crashes when agent outputs, agent inputs, or enriched tool call text contain literal curly braces (e.g., JSON from tool calls or files loaded by GetCustomFile). Uses a two-pass sentinel-escaping system: literal braces in variable values are replaced with sentinel tokens before formatting, then restored afterward. -
Category Matching With Underscores — Fixed
_match_categoryfailing to match category keys containing underscores (e.g.,NEW_INSTRUCTION). The existing code stripped punctuation (including underscores) from the LLM output but compared against raw keys. Both sides are now normalized before comparison.
Code Quality
- Numeric Config Field Resolution — Replaced ad-hoc
maxResponseSizeInTokensvariable resolution with a table-driven_resolve_numeric_config_fields()method that handles all ~30 integer config fields and 1 float field in a single pass at the start of node processing.
Bug Fix Pt 2
-
Concurrency Limiting — Fixed issue where the concurrency issue was stopping GET endpoints from responding, so models wouldn't load in frontends while another call was going through. Now only POST endpoints, which hit the LLM APIs should be limited.
-
Dependabot Bumps — Dependabot bumped a couple of dependency versions for CVEs.