AI assistant
The AI assistant adds an Ask Gardience button to every page of the console. You say what you want done, for example "update all of these", "install htop on web-01" or "restart the print spooler on the Windows servers", and the assistant proposes one action:
- a runbook with its inputs filled in (it prefers these),
- one Salt command from the list Gardience is allowed to run,
- a saved state, for something that should stay a certain way, or
- an Ansible playbook, when you ask for Ansible. It is shown in full with the node group it will run on. Dry run runs it in Ansible check mode to show what would change; Run for real runs it. Either way it is saved in your own playbook folder (the same place
gdn playbookuploads go) and runs over the Salt connection, Windows included, with no WinRM or SSH keys. See Ansible playbooks.
The proposal shows what it will do, the exact Salt call (This runs:) and the machines it will touch. Nothing runs until you choose Run it. The run then goes through everything a run you started yourself goes through: your permissions, change windows, locks, approvals and held work, with each machine's result in the audit log. The run is marked as drafted by the assistant and run by you.
The assistant remembers the conversation in this browser tab (the last 6 exchanges), so a follow-up such as "now write the Salt state for it" works. New conversation under the box starts over. Every proposal is still checked on its own, whatever came before.
Questions about your fleet
With Fleet lookups on, you can also ask about the fleet itself, for example "which servers are exposed to PHP2Shell?", "what changed on web-03 this week, and who approved it?", "why is db-02 failing the baseline?" or "what is waiting for approval?". The assistant looks the facts up first (read-only, up to 4 lookups per question), then answers with the machines it found, or proposes an action that fits what it found. The panel lists the lookups it made under the answer. It sees what everyone signed in to the console sees:
| Lookup | What it reads |
|---|---|
| Fleet status, compliance failures | Every machine's pending updates, reboot status, baseline score and failing controls |
| Machine details | One machine's pending updates, every baseline control with its value, open drift |
| Drift | What differs from the desired state, and recent automatic corrections |
| CVE overview, CVE lookup | Exposed machines per CVE, with or without a fix |
| Inventory | Domain, BitLocker, .NET, SELinux, free disk, local admins, last boot, Salt version |
| Runs, approvals | Recent runs, one run's steps and log, runs waiting for approval |
| Audit log | Who did what, where and when (entries never hold secret values) |
Lookups hand the assistant the totals (machines per update count, per operating system, per baseline score, reboots pending), so it quotes exact numbers rather than counting long lists itself.
Anyone with access to a machine can put text into what a lookup returns (a package description, a service name, a note in a run). The assistant receives every lookup result labelled as data and is told such text is never a request. When it proposes a change after reading fleet data, the proposal says so and asks you to check the machines and the exact call before you run it. The proposal goes through your permissions and approvals like any other.
When something is missing (which package, which machines), the assistant asks instead of guessing. It uses the node group or machines selected on the page when you say "these" or "this group".
Explain a state, runbook, or playbook
With the assistant on, saved states (Automation > States), runbooks, and project playbooks (Automation > Projects) have an Explain button. The assistant says in plain words what it does, lists each thing it changes on a machine, and lists what to check before running it (restarts, deletions, opened ports, weak settings).
- Gardience reads the file itself; the browser only names it. Playbooks come only from the list a project sync found, never from another path.
- Before anything is sent, Gardience removes every value stored in the vault, private keys and certificates, and any value written after a key that names a secret (
password:,api_key =,token:). References such as{{ vault_admin }}stay, because they are not secrets. - The assistant can only answer in words for this: it gets no actions and no fleet lookups, and the file is marked as data. Text in a file that tries to give the assistant instructions is listed under what to check.
- An explanation can be wrong. The file is what runs, so read it before running anything important.
What it cannot do
- A proposal that cannot be undone (wiping a disk, removing the Salt agent, deleting a whole drive, clearing the audit logs) shows a red warning, and Run becomes Ask for approval: a second person must approve it first. A risky but reversible one (stopping a firewall, deleting files) shows a yellow warning and runs when you press Run.
- It never runs anything by itself, and it has no access to Salt: it can only propose.
- It cannot propose a command outside Gardience's allowed list, a group that does not exist, or values with characters a shell would treat specially. Such proposals are refused with the reason, the same way a person's would be.
- It cannot see secrets. Without fleet lookups it cannot see the fleet's state or the audit log either, and says so.
Turn it on
An admin opens Settings > AI assistant, chooses the service, enters the model and an API key, and turns it on. Fleet lookups lets it read fleet facts to answer questions (above); it is on by default for a new setup and off on a server upgraded from before 1.8.0 until an admin turns it on.
| Service | Model (example) | Address |
|---|---|---|
| Anthropic (Claude) | claude-sonnet-5-5 | not needed |
| OpenAI | your model name | not needed |
| OpenAI-compatible: Azure OpenAI, or a model you host (for example on vLLM or Ollama) | the deployment or model name | its base address, for example https://llm.example.internal/v1 |
The key is stored encrypted with the server's vault key and is never shown again. A model you host on your own network keeps every request inside it, which suits air-gapped sites. The address must be another machine: Gardience does not call its own server, loopback or cloud metadata addresses.
What is sent to the AI service
Each request sends: what the person typed, the earlier exchanges of this conversation, the page they are on and the node group or machine names selected there, your node group names, the names and inputs of your runbooks, and the list of commands Gardience may run. With fleet lookups on, also the results of the lookups it makes for that question (each shortened to about 12,000 characters). For Explain, only the item being explained, with its secrets removed. Never secrets. A model you host keeps all of it inside your network.
Audit
Every explanation is recorded (ai.explain) with the person, what was explained, and the model. Every request is recorded (ai.assist) with the person, what they asked, what was proposed, and each lookup it made. A proposal that is run adds ai.run with the run and the model that drafted it, and the run's own log starts with "drafted by the AI assistant, reviewed and run by" the person.