Skip to content
cccskills
FreePublished on GitHubEnglish overview

agents

Define reusable Windmill AI agents with a provider, instructions, memory, and tools. The saved agent can be run from its own page, linked to flow steps, or shared in Slack, so the same setup can serve several workflows.

OriginalShow the original description

MUST use when creating or changing an AI agent, the reusable `ai_agent` resource the Agents page lists.

windmill-labs/windmill18,314 stars(GitHub 18,314 + cccskills 0)
Works withSlack

Run score Not tested

See how to install

Good for

  • Creating a reusable assistant for product support
  • Sharing an agent with people in Slack channels
  • Linking a saved agent to a flow step

Overview

What it does

This skill defines Windmill AI agents with their own instructions, AI provider, model, conversation memory, and tools. An agent is saved as an ai_agent resource. It can be used for chat or through a run form on its page, called from an AI agent step in a flow, or shared in a Slack channel through its page. Agent settings are kept separate from flow-specific inputs and overrides, so changes to a saved agent can apply to several flows that reference it.

When it helps

Use it when you want the same assistant, instructions, or tool setup available in several places. It supports standalone assistants for direct conversation as well as agents used as one stage in a larger flow. You can choose whether runs carry conversation history forward or start independently.

Example requests

  • “Create a support agent that searches product documentation and answers questions.”
  • “Call the saved agent from a step in this flow.”
  • “Make this agent available in a Slack channel.”

Notes

When image output is enabled, the agent cannot use tools, and the workspace needs S3 storage.

This overview was written by AI (OpenAI Codex) from the public SKILL.md. Check the original below for the exact behavior.

Document check

AI checked the SKILL.md for operations that need care and for setup requirements. The score comes only from actually running the skill (hands-on test).

SafetyAre sending data, deleting files, and running commands disclosed?
BPartly lackingTools can run and agents can be shared; some settings widen the acting identity or audience.
Easy setupDoes it need few tools or API keys, and are they documented?
BPartly lackingAn AI provider resource is required, but setup steps are not provided.

Not counted in the score. Rated by AI (OpenAI Codex) as of Oct 28, 2026. Treat it as a guide and read the original before installing.

Disagree? Request a re-evaluation

Tell us which point is wrong and why. No login needed. We will check it against the SKILL.md, redo the evaluation, and show the result here.

This form is protected by reCAPTCHA, and the Google Privacy Policy and Terms of Service apply.

Files included (1)

  • SKILL.md5.9 KB

SKILL.md (original)

Review the instructions the agent will receive before you install.

Windmill AI Agents

An agent, as the Agents page lists it, is a saved LLM with its own system prompt, tools and memory, stored as a resource of type ai_agent. It is built once and used in several places: it is run from its own page (a chat, or a run form), a flow's AI agent step links to it by path, and it can be shared in Slack channels from its page. Build a standalone agent when the user wants an assistant they talk to or reuse. Build a flow when the agent is one step of a larger process.

File Format

An agent is a resource file like any other, {path}.resource.yaml (or .resource.json), with resource_type: ai_agent.

Structure

{
  "resource_type": "ai_agent",
  "description": "Answers support questions from the product docs",
  "value": {
    "provider": { "kind": "openai", "resource": "$res:f/ai_providers/openai", "model": "gpt-4o" },
    "system_prompt": "You are the support assistant for Acme. Answer from the docs; say so when they don't cover a question.",
    "memory": { "kind": "compaction" },
    "output_type": "text",
    "tools": [
      {
        "id": "search_docs",
        "summary": "search_documentation",
        "description": "Search the product documentation. Use it whenever the user asks how a feature works.",
        "value": {
          "tool_type": "flowmodule",
          "type": "script",
          "path": "f/support/search_docs",
          "input_transforms": {
            "query": { "type": "ai" },
            "index": { "type": "static", "value": "product_docs" }
          }
        }
      }
    ]
  }
}

The agent's own settings are plain values, not the input_transforms an agent step in a flow uses: each is fixed when the agent is saved. Only a tool's arguments keep input_transforms (see Tools). $res: and $var: references inside it are resolved at run time.

  • provider (required): { "kind", "resource": "$res:<path>", "model" }, plus an optional reasoning_effort. resource names the workspace's AI provider resource of that kind
  • system_prompt: how the agent behaves. Write it for the agent's job: who it serves, what it may do with its tools, and what it should refuse or hand back
  • memory: what lets the agent see earlier turns. { "kind": "compaction" } keeps the whole conversation, summarizing its older part as it nears the model's context window; it is what a new agent starts with on its page. { "kind": "off" } makes every run start from nothing, right for an agent that handles one request per run
  • output_type: text (default) or image. Image output ignores tools and needs S3 storage on the workspace
  • output_schema: a JSON schema the answer must follow, for an agent whose output a program reads
  • max_iterations: how many model and tool rounds a run may take, 1 to 1000 (default 10)
  • streaming (default on), temperature, max_completion_tokens: as their names say
  • run_on_behalf_of: runs from the agent's page take the identity the agent was deployed with rather than the caller's, so people can use it without access to what its tools touch. slack_anyone lets anyone in the Slack channels it is shared in ask it, and is kept only with run_on_behalf_of. Set either only when the user asks: both widen who acts with the deployer's rights
  • on_behalf_of is the identity itself. Deploying sets it, so never write it

Tools

tools takes the same entries as a flow's AI agent step. value.tool_type is flowmodule for a script or inline script the agent calls (or a nested agent or AI decision), mcp for an MCP server ({ "tool_type": "mcp", "resource_path": "$res:<path>", "include_tools": [], "exclude_tools": [] }), or websearch for web search ({ "tool_type": "websearch" }, summary Web Search).

  • Write logic made for this agent as an inline rawscript tool, as a flow writes its steps. Point a script tool at a deployed script (path) only when one already does the job: a run calls the deployed version, so a script that exists only as a draft fails the run. An inline tool's value is a flow's rawscript step: { "tool_type": "flowmodule", "type": "rawscript", "language": "bun", "content": "export async function main(query: string) { ... }", "input_transforms": { "query": { "type": "ai" } } }
  • A flow cannot be a tool: a run offered one fails with Unsupported tool. Wrap it in a script that runs the flow
  • A flowmodule tool's summary is the name the agent calls it by: letters, numbers and underscores only, unique among the agent's tools, and neither a reserved step id (a JavaScript keyword, ctx, state, bg) nor __wm_web_search. Put the explanation in description, which tells the agent when to call it
  • Each argument of a tool is either the model's or fixed. { "type": "ai" } (or no value) lets the model fill it; a static value fixes it and hides it from the model. Fix what the model must not choose, such as a resource, a table name or a limit

Using It From a Flow

An AI agent step links to a saved agent with value.agent instead of carrying its own provider, system prompt and tools:

{
  "id": "support",
  "value": {
    "type": "aiagent",
    "agent": "f/support/support_agent",
    "input_transforms": {
      "user_message": { "type": "javascript", "expr": "flow_input.question" }
    },
    "tools": []
  }
}

The step holds only what belongs to one use of the agent: user_message, user_attachments, enabled_tools, memory_id, previous_messages, and the model and reasoning_effort overrides. Its value.tool_inputs ({ "<tool id>": { "<argument>": <input transform> } }) wires a saved tool's arguments to this flow, e.g. flow_input.customer_id, over the transforms the agent saved, without changing the agent. Everything else comes from the agent, so a change to the agent reaches every flow linking it.

Reviews

No reviews yet. Tell others what you thought.

Comments

No login needed. Share how it worked for you, ask a question, or note where it did not run.

No comments yet. Be the first to write one.

Comments are published right away. Do not include personal information such as email addresses or phone numbers. Up to 2 URLs.

0 / 1,000 characters

This form is protected by reCAPTCHA, and the Google Privacy Policy and Terms of Service apply.

More skills from this repository

adding-a-trigger

FreeSummary

Plan the code changes needed to add a TriggerCrud-based trigger to Windmill. The checklist covers backend, database, API, CLI, frontend, capture, and validation work so the new trigger can be managed across the product.

  • Add a Kafka, GCP, or Azure style trigger to Windmill
  • Find all product areas affected by a new trigger kind
  • Review implementation and validation steps before a trigger PR
windmill-labs/windmill18.3KUpdated Oct 29, 2026

ai-chat

FreeSummary

Improve Windmill’s AI chat by reviewing its tools, prompts, result shapes, and context usage. The guidance helps place shared instructions where chat and CLI can use them, reduce repeated token costs, and compare behavior before and after changes with A/B evaluations.

  • Edit Windmill chat tools or system prompts
  • Reduce chat context window usage
  • Benchmark a chat behavior change
windmill-labs/windmill18.3KUpdated Oct 29, 2026

ai-evals

FreeSummary

Create and run black-box benchmarks for Windmill AI generation modes such as flows, apps, scripts, CLI, and global requests. Each case exercises the production path, checks hard requirements, and uses an LLM judge to assess user-facing behavior before and after changes.

  • Adding a benchmark case for an AI mode
  • Comparing AI chat behavior before and after a change
  • Checking copilot changes with realistic requests
windmill-labs/windmill18.3KUpdated Oct 29, 2026

cli-commands

FreeSummary

Use this reference to work with Windmill resources from the command line, including scripts, flows, datatables, and workspace settings. It also covers listing jobs, inspecting details and logs, retrieving results, and rerunning or restarting executions when investigating failures.

  • Inspecting a failed job and its logs
  • Reviewing recent runs and retrieving job results
  • Managing scripts and flows from the command line
windmill-labs/windmill18.3KUpdated Oct 29, 2026

codebase-design

FreeSummary

Use this skill to shape modules with small interfaces and substantial behavior behind them. It helps you decide where a seam belongs, reduce complexity exposed to callers, and make code easier to test and maintain.

  • Designing a module interface
  • Finding places to simplify a module
  • Choosing where behavior should vary
windmill-labs/windmill18.3KUpdated Oct 29, 2026

commit

FreeSummary

Use this skill to review pending changes, select only the relevant files for staging, and create a focused Git commit. It formats the single-line message with a Conventional Commits type such as feat, fix, or docs, and checks the resulting status.

  • Committing a new feature
  • Recording a bug fix
  • Committing documentation changes
windmill-labs/windmill18.3KUpdated Oct 29, 2026

See all skills by windmill-labs

Report a problem with this skill