Skip to content
Back to skills

212 Workflows 5e8f8d55

ASecurity

WilmerAI's core logic is driven by a node-based workflow engine. A workflow is a JSON file that defines a sequence of operations, called nodes, that are executed in order to process a user's prompt. This system allows for the creation of complex, multi-step behaviors by chaining together different Large Language Models (LLMs), custom tools, and memory systems. This guide provides a straightforward overview of how to construct and understand WilmerAI workflows. -----

  • 9 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added October 11, 2026
ai-agentspythongonodeapidatabasebackend

Works with

  • api

Security analysis

A100/100

Pro scans all 2 files and shows the line behind each finding

Scanned October 11, 2026

npx -y skills add tools-only/X-Skills --skill 212-workflows_5e8f8d55 --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of 212 Workflows 5e8f8d55?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for 212 Workflows 5e8f8d55
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/tools-only-212-workflows-5e8f8d55/badge)](https://www.skillsdirectory.com/skills/tools-only-212-workflows-5e8f8d55)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
### **Feature Guide: The WilmerAI Workflow Engine**

WilmerAI's core logic is driven by a node-based workflow engine. A workflow is a JSON file that defines a sequence of
operations, called nodes, that are executed in order to process a user's prompt. This system allows for the creation of
complex, multi-step behaviors by chaining together different Large Language Models (LLMs), custom tools, and memory
systems.

This guide provides a straightforward overview of how to construct and understand WilmerAI workflows.

-----

## The Core Components of a Workflow

A workflow's functionality is defined by three primary concepts: the workflow file itself, the nodes within it, and the
system for passing data between those nodes.

### 1\. The Workflow File

A workflow is defined as a JSON object. This structure contains a required `nodes` key, which holds the list of
operations to be executed. Any other top-level keys in the object are automatically registered as custom variables that
can be used throughout the workflow.

**Example Workflow Structure (`MyWorkflow.json`):**

```json
{
  "persona": "You are a helpful and creative AI assistant.",
  "nodes": [
    {
      "title": "First Node: Gather Data",
      "type": "VectorMemorySearch",
      "endpointName": "Creative-Fast-Endpoint"
    },
    {
      "title": "Second Node: Respond to User",
      "type": "Standard",
      "systemPrompt": "{persona}",
      "prompt": "Based on this information: {agent1Output}\n\nPlease answer the user's question.",
      "endpointName": "Creative-Fast-Endpoint",
      "returnToUser": true
    }
  ]
}
```

In this example, `persona` is a custom variable.

### 2\. Nodes

A **node** is a single JSON object within the `nodes` list that represents one step in the process. Each node has a
`type` that determines its function, such as calling an LLM (`Standard`), running a Python script (`PythonModule`), or
executing another workflow (`CustomWorkflow`).

Key properties for a node include:

* **`title`**: A descriptive name for the node.
* **`type`**: The functional type of the node, which determines what it does.
* **`endpointName`**: Specifies which LLM backend to use if the node needs to make a model call.
* **`returnToUser`**: A boolean (`true`/`false`). Only one node in a workflow can be designated as the **responder** by
  setting this to `true`. Its output is what gets sent back to the user.

### 3\. Data Flow Between Nodes

The engine provides a simple mechanism for passing data between nodes. The string output of any node is automatically
captured in a variable named `{agent#Output}`, where `#` corresponds to the node's position (1-indexed) in the `nodes`
list.

* The output of the **1st node** is available as **`{agent1Output}`**.
* The output of the **2nd node** is available as **`{agent2Output}`**.
* And so on.

Any subsequent node can use these variables in its configuration to build upon the results of previous steps. In the
example above, the second node uses `{agent1Output}` in its `prompt` to incorporate the data retrieved by the first
node.

-----

## The Variable System

Workflows have access to a variable system that allows for dynamic content. These variables can be used in specific text
fields within a node, such as `prompt`, `systemPrompt`, and `filepath`.

* **Custom Variables**: As shown previously, any key-value pair defined at the root of the workflow JSON object becomes
  a reusable variable (e.g., `{persona}`).

* **Node Output Variables**: The `{agent#Output}` variables that pass data sequentially between nodes.

* **Built-in System Variables**: The system provides a set of pre-populated variables for accessing contextual
  information. Key examples include:

    * **Date & Time**: `{todays_date_pretty}` (e.g., "September 1, 2025"), `{current_time_24h}` (e.g., "18:41").
    * **Conversation History**: Variables for accessing recent turns, such as `{chat_user_prompt_last_one}` or
      `{templated_user_prompt_last_ten}`.
    * **Full Conversation**: The `{messages}` variable provides the entire conversation history as a list of objects,
      which is particularly useful when combined with Jinja2 templating for complex logic.

* **Jinja2 Templating**: For more advanced conditional logic or loops within a prompt, you can enable the Jinja2 engine
  by adding `"jinja2": true` to a node's configuration.

-----

## A Catalog of Node Types

The workflow engine supports a variety of node types, each handled by a dedicated class. Below is a summary of the
available node categories and some key examples.

#### **Core & Utility Nodes**

* **`Standard`**: The most common type; makes a direct call to an LLM.
* **`PythonModule`**: Executes a custom Python script and returns its string output.
* **`GetCustomFile`**: Reads the content of a local text file. Supports variables in the filepath, including
  `{Discussion_Id}` and `{YYYY_MM_DD}` for dynamic paths.
* **`SaveCustomFile`**: Saves a string to a local text file. Supports variables in both `filepath` and `content`.
* **`ImageProcessor`**: Generates a text description for an image supplied by the user.
* **`StaticResponse`**: Responds back with a hardcoded string that is defined on the node itself.

-----

#### **Data Extraction Nodes**

* **`JsonExtractor`**: Extracts a specific field from a JSON string. Automatically handles markdown code block wrappers
  (` ```json ` or ` ``` `). Returns the field value as a string; nested objects/arrays are returned as JSON strings.
* **`TagTextExtractor`**: Extracts content from XML/HTML-style tags (e.g., `<answer>...</answer>`) within a text
  string. Returns the content between the first matching opening and closing tags.

-----

#### **Workflow Orchestration Nodes**

* **`CustomWorkflow`**: Executes another, separate workflow file, allowing for modular and reusable logic.
* **`ConditionalCustomWorkflow`**: Runs one of several sub-workflows based on the value of a variable.

-----

#### **Memory System Nodes**

This category contains nodes for creating, retrieving, and managing conversation memories.

**Memory Creators**

* **`QualityMemory`**: The primary and **only recommended node for creating memories**. It analyzes recent conversation
  history and, if thresholds are met, generates and saves new memories to storage (either vector DB or `.jsonl` file).
  This node produces **no direct output** (`{agent#Output}` is empty) and is designed to run as a background task,
  typically at the end of a workflow, to avoid delaying the user's response.
* **`RecentMemory`**: A dual-function node that first blocks execution to create memories and then retrieves
  them. It is **not recommended for use** due to its inefficient, blocking behavior.

**Memory Retrievers**

* **`VectorMemorySearch`**: The primary tool for Retrieval-Augmented Generation (RAG). It performs a relevance-based
  search against the vector memory database. It requires a string of keywords in its `input` field, **separated by a
  semicolon (`;`)**. It returns an aggregated string of the most relevant memory summaries. Requires an active
  `discussionId`.
* **`RecentMemorySummarizerTool`**: The primary retriever for file-based memories (`.jsonl`). It fetches the most recent
  memory chunks. It can operate in a stateless mode (pulling from recent chat history) if no `discussionId` is active.
* **`FullChatSummary`**: Retrieves the "rolling summary" of the entire conversation. By default, it first triggers the
  `QualityMemory` creation process, which can cause significant delays. Setting the property `"isManualConfig": true`
  disables this behavior, making it a fast, read-only operation.
* **`GetCurrentSummaryFromFile`**: A simple and fast "dumb reader." Its only function is to read the contents of the
  summary file directly, without performing any staleness checks or updates.

**Low-Level Memory Tools**

* **`chatSummarySummarizer`**: A low-level node for iteratively updating the rolling chat summary. It processes new
  memories in batches and uses the special placeholders `[CHAT_SUMMARY]` and `[LATEST_MEMORIES]` in its prompts to
  manage the update loop.

-----

#### **Specialized & Search Nodes**

* **`OfflineWikiApi...`**: A set of nodes for querying a local Wikipedia database.
* **`SlowButQualityRAG`**: A specialized tool for a high-quality Retrieval-Augmented Generation process.

-----

## Putting It All Together: A Practical Example

The following workflow demonstrates how these components work together. It defines a persona, uses one node to retrieve
relevant facts from memory, and a second node to synthesize those facts into a response for the user.

```json
{
  "persona": "You are a helpful AI assistant who always uses retrieved facts to inform your answers.",
  "nodes": [
    {
      "title": "Gather Relevant Memories",
      "type": "VectorMemorySearch",
      "input": "{chat_user_prompt_last_one}",
      "limit": 3
    },
    {
      "title": "Respond to User Using Memories",
      "type": "Standard",
      "systemPrompt": "{persona}",
      "prompt": "Based on the following relevant information:\n\n---\n{agent1Output}\n---\n\nPlease answer the user's most recent question.",
      "endpointName": "Ollama-Endpoint-Default",
      "returnToUser": true
    },
    {
      "title": "(In Background) Update memories with the latest turn",
      "type": "QualityMemory"
    }
  ]
}
```

1. A custom variable `persona` is defined.
2. The first node (`VectorMemorySearch`) runs a search using the user's last prompt as input. Its output (the retrieved
   memories) is stored in the `{agent1Output}` variable.
3. The second node (`Standard`) runs. It is the **responder** (`"returnToUser": true`). It uses both the `{persona}`
   variable and the `{agent1Output}` variable to construct a final prompt for the LLM. The LLM's response is then sent
   to the user.
4. The third node (`QualityMemory`) runs last. It has no output and does not delay the response to the user. It analyzes
   the conversation that just occurred and creates a new memory chunk if necessary.

Files in this skill

  • README.md904 B
  • skill.md9.8 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.