Releases: SomeOddCodeGuy/WilmerAI
Release list
v0.7 - Preset overhaul, example user overhaul, user-wide variables, and more
June 2026
New Features
-
Preset Overhaul — Endpoints now embed a
presetSamplersblock written in a single canonical sampler vocabulary instead of maintaining per-backend per-user preset files, removing the need for every user to maintain folders full of presets. This change does not remove Wilmer's ability to keep user-extended presets for an ApiType. The mappings from canonical sampler names to each backend's native API fields live in the ApiType configs (samplerFieldMap) and can be extended. Additionally, an extension preset file can be named viaappendPresetName: it is deep-merged on top of the samplers Wilmer generates, as the highest-precedence layer, right before the request is sent. Anything new you put there is added to the payload; anything that collides with a generated key overrides it (nested objects likechat_template_kwargsmerge key-by-key, while scalars and arrays such asstopare replaced wholesale). Note this file is sent in the backend's native field names and is not translated, unlikepresetSamplers. So you have two paths to get new/custom samplers to the backend: extend the canonical-to-native mappings in the ApiType config, or drop them straight into an append preset file. -
Overhaul of Example Config Files — Removed most of the large
_archivedconfig trees (they can still be found in git) and the hundreds of redundant per-user preset files, consolidating examples around reusable shared folders (_shared,_shared_discussionid,_shared_manual_cot,_simple_router_no_memory) and a single minimal_example_presetper ApiType. Example users were reduced to a small set (chat-ui*,_simple_router_no_memory, vector-memory and file-memory assistants), which also serve as the first examples to exercise the pre-existing shared endpoint/workflow folder settings.
2a. Added manual chain-of-thought workflows for models that tend to overthink in reasoning mode (e.g. Qwen3.6 27b, Gemini 4 31b). These run the model with native thinking disabled and drive the reasoning steps through the workflow instead, which returns results faster than leaving reasoning mode on.
-
User-Wide Workflow Variables — New
userWideWorkflowVariablesblock in the user config that lets you define a variable and inject it into every workflow that user runs, resolvable as a workflow variable like {agentNOutput}. -
Per-Endpoint Failover — Endpoints can now declare a
backupEndpointNamethat Wilmer fails over to when the primary errors. When a backup is configured, retries against the primary are suppressed (suppress_retries) so it fails over fast instead of burning the urllib3 backoff loop. Streaming requests fail over only before the first token reaches the client; once tokens are flowing the original error is re-raised. -
Endpoint-Level Concurrency Mode — A new
--concurrency-levelflag picks betweenwilmer(default: Wilmer's existing ingress-gate behavior) andendpoint(new this release). Inwilmermode, unchanged from prior releases, a single instance-wide gate is held for the whole request at ingress (the WSGI middleware). With the default limit of one, only one front-end request runs at a time: if Wilmer is already processing a request, new requests queue and wait their turn rather than being turned away; they only get a 503 if they wait past the acquire timeout (15 minutes by default). The newendpointmode lifts that ingress gate and enforces the limit only around the outbound LLM calls themselves. It's NOT per-endpoint locks, but rather is one gate shared across all endpoint calls. For example: frontend 1 sends a request and is mid-way through an LLM call on one of its workflow nodes; frontend 2 sends a request during this time. Frontend 2 gets processed right up to the point where it needs to make an LLM call; that's when it stops and queues. When frontend 1's in-flight LLM call finishes, frontend 2's queued call goes. If frontend 1's request needs more LLM calls after that, the next one queues until frontend 2's completes. Back and forth. They run "concurrently" in much the same way a single-threaded CPU runs applications "concurrently" — by weaving the LLM calls together. -
Endpoint Context Window Clamp — In order to try to avoid prompts/system prompts overflowing and getting truncated at the LLM level, a new option (opt-in only) "Clamp"ing system was introduced that will try to reduce down the amount of the conversation dictionary sent to the LLM, overriding variable choices where necessary. With this on, everything from appended messages to the variables like chat_user_prompt_last_* will attempt to estimate and truncate messages based on the size of the rest of the prompt it will be attached to. This system relies on Wilmer's deliberately conservative token estimation, so its trimming is approximate rather than exact. Opt-in via
clampPromptToContextWindow(default off), resolved per node as node > endpoint > user config. It drops whole messages only (starting from the oldest and never truncates message content) and always keeps at least the single most recent message (logging a warning if even that overflows). A companionwilmerContextEstimationLevel(conservative/balanced/aggressive/xaggressive) allows you to manually calibrate Wilmer's deliberately conservative token estimator per endpoint; the same multiplier also tunes vector/file memory chunk sizing and the context compactor's budgets. This is because older models like Llama 2 lined up pretty closely to Wilmer's estimation, but more modern models have much more efficient tokenizers, so Wilmer greatly overestimates the number of tokens by default; an example would be Wilmer thinking something is 30k tokens when it's actually 18k tokens per the model. By modifying thewilmerContextEstimationLevelon the endpoint, you can try to get the estimation closer to what the model really uses. -
MCP Tool Calling Node — New
MCPToolCallworkflow node that calls MCP servers over stdio, SSE, and streamable-HTTP transports. Servers are configured in a newPublic/Configs/MCPServers/directory (example configs provided for all three transports). The node is deterministic and author-driven (the LLM is not in the loop): the config names a server, a tool, and a JSON arguments object. It discovers the server's tools, executes the configured tool call, and returns the result into the workflow, where it is available to downstream nodes as that node's{agentNOutput}variable. Requires Python 3.11+. -
WebFetch and CurlCommand Nodes — Two new nodes for outbound HTTP from within a workflow.
WebFetchretrieves a URL and optionally strips HTML to text;CurlCommandruns a curl command via subprocess for full control over headers, methods, and proxies. Both are backed by a new SSRF guard (Middleware/utilities/network_security_utils.py), opt-in per node viablockPrivateAddresses(rejects any non-globally-routable target — loopback, RFC1918, link-local incl. the169.254.169.254metadata endpoint, plus CGNAT100.64.0.0/10and the TEST-NET ranges) andallowedHosts(host allowlist); both also constrain redirects (WebFetchre-validates each hop in-process;CurlCommandpins--max-redirs 0). TheCurlCommandguard is option-aware — it walks the argument list, resolves schemeless arguments (which curl would default tohttp://), and validates them post-resolution, so an obvious169.254.169.254/...target is caught. Note thatCurlCommand's guard is best-effort: it validates in Python but hands the raw string to thecurlbinary, which re-parses the URL and re-resolves DNS itself, so alternate IP encodings, URL-parser divergence, and DNS rebinding can still slip past. For untrusted/conversation-derived URLs, preferWebFetch, which parses and resolves with the same stack it connects with (rebinding aside). -
Moved Vector Memory DBs to DiscussionId folders — Vector memory databases are now co-located inside the per-discussion folder rather than a single working-directory-relative file. A legacy fallback probes the old pre-refactor paths, but only in single-user mode, to avoid cross-user data bleed. No migration or deletion of existing data occurs.
-
Can Set Locations of Public, Logging and SqlLite Directories from Command Line — New CLI flags
--PublicDirectory,--LoggingDirectory,--UserLevelSqlLiteDirectory, and--DiscussionDirectoryallow overriding where Wilmer reads configs and writes logs, SQLite databases, and discussion files. Default storage locations are now pinned to the install directory instead of being current-working-directory relative, with legacy stickiness so an existing install that already has data in the old locations keeps using them. -
GetCustomFile Head/Tail and SaveCustomFile Append —
GetCustomFilecan now return just the first or last N lines of a file (head/tail) instead of the whole file, andSaveCustomFilesupports an append mode in addition to overwrite. -
Tool-Result Conversation Rendering — Extends the existing
includeToolCallsInConversationsetting (the flag itself is unchanged from a prior release) to render tool-result turns, not just assistant tool calls. When the setting is on, messages withrole: "tool"in the conversation are surfaced into a node's conversation variables with a[Tool Result: <name>]prefix, and both the tool name and content are brace-escaped so result payloads containing literal{}can't break the downstreamstr.format()pass. This makes prior tool-result turns sent by an agentic client visible to LLM nodes, alongside the already-supported[Tool Call: ...]rendering of assistant tool calls. (This is independent of how a workflow's own MCPToolCall result is consumed — that flows through{agentNOutput}, not the conversation array.)
Bug Fixes
- *Streaming Termination Killing Post-Stream Nodes...
v0.62.3
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.
v0.62.2
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.
0.62.1 - Tool Calling
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.
v0.62 - Tool Calling
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.
v0.61 - Dependabot update
What's Changed
- Bump cryptography from 46.0.5 to 46.0.6 by @dependabot[bot] in #86
New Contributors
- @dependabot[bot] made their first contribution in #86
Full Changelog: v0.6...v0.61
v0.6 - Multi-user improvements, more memory and consistency improvements, and lots of bug fixes
v0.6 - March 2026
Major New Features
-
ContextCompactor Workflow Node — New node type that summarizes conversation messages into two rolling summaries (Old + Oldest) using token-based windowing. Separate from the memory system; designed for recency-aware conversation compaction. Uses XML-style tags and configurable via a settings file.
-
Automatic Memory Condensation — Optional condensation layer for file-based memories. After enough new memories accumulate (configurable threshold), the oldest batch is LLM-summarized into a single condensed entry, reducing file bloat over long conversations.
-
Per-Message Image Association — Major refactor replacing synthetic
{"role": "images"}messages with a per-message"images"key. Images now stay associated with their originating message from ingestion through to LLM dispatch. Includes OpenAI multimodal content parsing on ingestion. -
Claude API Image Support — Full image support for the Claude handler. Supports base64, data URIs, and HTTP URLs. Uses PIL/Pillow for format detection (optional, falls back to JPEG). Images placed before text per Anthropic recommendation.
-
Per-User Encryption — When an API key is provided via
Authorization: Bearer, files are stored in isolated per-key directories. Optional Fernet encryption (AES-128-CBC + HMAC-SHA256, PBKDF2 key derivation) can be enabled per user. Transparent plaintext-to-encrypted migration. Includes a re-keying script. -
Multi-User Support — A single WilmerAI instance can now serve multiple users via repeated
--Userflags. Full per-user isolation: per-user config reads, request-scoped user identification, per-user log directories, aggregated models/tags endpoints. -
WSGI Concurrency Limiting Middleware — New
--concurrency(default: 1) and--concurrency-timeout(default: 900s) CLI flags on all entry points. Requests exceeding the limit queue until a slot opens or timeout (503). Implemented at the WSGI layer so the semaphore holds across streaming responses.
Bug Fixes
-
SillyTavern Streaming Hang — Fixed streaming hang when using SillyTavern as a front end.
-
Open WebUI Streaming Error — Restored JSON heartbeat format (was changed to bare newline, causing JSONDecodeError in Open WebUI's NDJSON parser).
-
Memory Generation Stalling — Fixed memory generation never triggering after the first run due to empty-message hash collision when front-end injects Author's Note with only a
[DiscussionId]tag. -
GetCurrentMemoryFromFile Returning Wrong Data — Was sharing a code path with
GetCurrentSummaryFromFileand returning rolling chat summary instead of memory chunks. Now correctly returns memory chunks. -
Image Lookback Default Regression — Restored default lookback window from 5 back to 10 (was silently halved).
-
Multi-Word Prefix Detection in Streaming — Fixed
StreamingResponseHandlerfailing to strip multi-word response prefixes (e.g., "AI: "). -
Data URI Stripping Before LLM Dispatch — Hardened image key stripping to cover all image formats when
llm_takes_imagesis False.
Hardening and Security
-
Dependency Pinning — All dependencies pinned to exact versions (
==) to mitigate supply chain attacks. Updated several packages includingrequests(CVE fix),cryptography(reverted to 46.0.5, pre-supply-chain-attack window). -
Thread Safety — Per-discussion locks in timestamp service, context compactor, and RAG tool. Thread-safe globals via
threading.local(). Lock dictionaries capped at 500 with LRU eviction. Atomic file writes (temp + rename). -
Sensitive Logging / Prompt Redaction — New
sensitive_logging_utilsmodule. All log statements exposing user content converted to redactable versions. Redaction activates when encryption is enabled orredactLogOutput: true. -
JSON Parsing Hardening — Incoming API handlers now use
get_json(force=True, silent=True)returning 400 instead of unhandled 500 on invalid JSON. -
Configurable Categorization Retries — Removed hardcoded 4-retry loop; now configurable via
maxCategorizationAttempts(default: 1).
Code Quality
-
Optimized variable generation — Conversation-slice variables only computed when referenced in the prompt.
-
Lazy-load
time_context_summary— Skips file I/O when the variable isn't referenced.
v0.5 - Better message variables for prompts, some new nodes, and memory fixes
Summary
NOTE: This introduces new variables to help deprecate variables like "chat_user_prompt_last_twenty". I'm not getting rid of those, for backwards compatibility purposes, but going forward we don't need them as much.
New Workflow Nodes
- JsonExtractor node: extracts fields from JSON in LLM responses without an additional LLM call
- TagTextExtractor node: extracts content between XML/HTML-style tags without an additional LLM call
Configurable Prompt Variables
- nMessagesToIncludeInVariable: node property to control how many messages are included in chat/templated prompt variables
- estimatedTokensToIncludeInVariable: token-budget-based message selection, accumulates recent messages up to a token limit
- minMessagesInVariable + maxEstimatedTokensInVariable: combo mode pulling a minimum message count then filling up to a token budget
Token Estimation
- Recalibrated rough_estimate_token_length word ratio (1.538 -> 1.35 tokens/word)
- Added configurable safety_margin parameter (default 1.10)
Memory System Fixes
- Fixed file_exists check that was permanently disabling message-threshold triggers for new conversations
- Fixed off-by-one in trigger comparisons (> to >=)
- Added HTTP session cleanup via close() to prevent keep-alive connections from blocking llama.cpp slots
- Split timeouts into (connect, read) tuples
- Added diagnostic logging for memory trigger decisions
Code Quality
- Fixed bare except clauses to except Exception in cancellation paths
- Added prompt-aware info logging for configurable variable slicing
Example Workflow Configs
- Updated all example workflow JSON files to use new configurable variable syntax
v0.4.1 - Small hotfix for memories
What's Changed
- Corrected an issue with memory system due to recent change removing the imagespecific handlers. by @SomeOddCodeGuy in #82
v0.4 - Workflow collections, bug fixes, test UI, and some simplification
What's Changed
- Fix oldest message chunk being silently discarded in memory generation
- Fix incorrect new message count causing duplicate processing of memorized messages
- Fix pytest.ini test path case sensitivity
Features:
- Add shared workflow collections and workflow selection via API model field (/v1/models and /api/tags endpoints)
- Add workflow node execution summary logging with timing info
- Add workflowConfigsSubDirectoryOverride for shared workflow folders
- Add sharedWorkflowsSubDirectoryOverride for custom shared folder names
- Add {Discussion_Id} and {YYYY_MM_DD} variables for file paths
- Add variable substitution support for maxResponseSizeInTokens
- Add web-based setup wizard (setup_wizard_web.py) (this is a WIP and may be temporary/replaced)
- Add vector memory resumability with per-chunk hash logging
Refactors:
- Consolidated image handlers into standard handlers (remove ~700 lines)
- Standardize preset/workflow naming convention (hyphenated)
- Archive legacy workflows to _archive subdirectories
- Add pre-configured shared workflow folders
Simplification:
- Updated preset names to match endpoint names. Now it makes more sense, as you can more easily use presets to make sure each endpoint gets the appropriate settings.
- The _example_general_workflow is the one stop shop for example productivity workflows, and thanks to the custom workflow system its easier to spin more off easily. You can just drop new folders into _shared within workflows and suddenly have new workflows available to you as models. I'll make a video about this later.
- Dropped the imagespecific handlers. Finally. Those were something I did early on and I just kept putting off dealing with them, but they always annoyed me. Regular handlers have the image frameworks added in, if they support it.
Tests:
- Update tests for corrected memory hash behavior
- Added tests for new workflow override features