Files
windmill/system_prompts/base/resources.md
hugocasa ede4103b00 feat: share AI guidance with the CLI skills and lint flow groups (#11397)
* feat: lint AI agent tool names and flow groups in wmill lint

* refactor: assemble chat and CLI AI guidance from one topic table

* feat: share flow groups, reuse and pipeline guidance with the CLI skills

* feat: share raw app, data table and secret guidance between chat and CLI

* docs: document the shared AI guidance source for contributors

* fix: keep wmill lint running on flows with malformed collections

* fix: reject skill descriptions that are not plain YAML text

* fix: tighten fence typos, script base scope and app prompt order

* fix: skip tool name checks on agent steps linked to a saved agent

* fix: catch any misspelled prompt fence and soften the tool name claim

* fix: align cli eval harness with the files and steps wmill init adds

* fix: drop cli eval checks that expect unrequested deploy commands

* fix: list ansible as mainless and c# Main in script base guidance
2026-09-29 14:47:42 +02:00

294 lines
6.5 KiB
Markdown

# Windmill Resources
Resources store credentials and configuration for external services.
<!-- cli-only -->
## File Format
Resource files use the pattern: `{path}.resource.json`
Example: `f/databases/postgres_prod.resource.json`
<!-- /cli-only -->
## Resource Structure
```json
{
"value": {
"host": "db.example.com",
"port": 5432,
"user": "admin",
"password": "$var:g/all/db_password",
"dbname": "production"
},
"description": "Production PostgreSQL database",
"resource_type": "postgresql"
}
```
## Required Fields
- `value` - Object containing the resource configuration
- `resource_type` - Name of the resource type (e.g., "postgresql", "slack")
## Variable References
Reference variables in resource values:
```json
{
"value": {
"api_key": "$var:g/all/api_key",
"secret": "$var:u/admin/secret"
}
}
```
**Reference formats:**
- `$var:g/all/name` - Global variable
- `$var:u/username/name` - User variable
- `$var:f/folder/name` - Folder variable
## Secrets
Never put a secret (password, API key, token) inline in a resource value. Store it in a secret variable and reference that variable as `$var:<path>`.
- `$var:<path>` is a reference, not a value: it resolves to the variable's value at run time. Never invent a value for a variable.
- A resource that references a variable needs the variable to exist first, so create or deploy the variable before the resource.
<!-- cli-only -->
- A secret's plaintext never goes in a file of the repo: a `.variable.yaml` holding it would be committed. Ask the user to create the secret on the workspace instead, e.g. `wmill variable add '<value>' <path>` (a secret by default), then reference it by path.
<!-- /cli-only -->
## Resource References
Reference other resources:
```json
{
"value": {
"database": "$res:f/databases/postgres"
}
}
```
## Passing a Resource or Variable as a Run Argument
A script or flow argument typed as a resource (schema `format: resource-<type>`) is passed as
the **bare string** `$res:<path>` — the whole argument value. Same for a variable, with
`$var:<path>`. This applies everywhere job arguments are supplied: `wmill script run/preview`,
`wmill flow run/preview`, the `runScriptByPath` / `runFlowByPath` API, a schedule's `args`, a
trigger's configured static args.
```json
{
"db": "$res:f/databases/postgres_prod",
"api_token": "$var:g/all/api_token"
}
```
The reference is resolved when the job runs, under the job's run-as identity — the caller for an
ordinary run, but the configured principal for a schedule, a trigger, or a runnable set to run on
behalf of someone else. The run fails if that identity cannot read the referenced resource or
variable.
**Never wrap it in an object.** The resolver only rewrites a JSON value that *is* a string
starting with `$res:` / `$var:`; keys are never inspected. These are all wrong and are passed
through to the script unchanged:
```json
{ "db": { "$res": "f/databases/postgres_prod" } }
{ "db": { "resource": "f/databases/postgres_prod" } }
{ "db": "f/databases/postgres_prod" }
```
The string may sit anywhere a string can — a top-level argument, a nested object field
(`{ "gh_auth": { "token": "$var:g/all/gh_token" } }`), or an array element (array elements are
walked only while nested at most two levels deep, and only for arrays of at most 1000 items).
The prefix must be on the string itself.
## Common Resource Types
### PostgreSQL
```json
{
"resource_type": "postgresql",
"value": {
"host": "localhost",
"port": 5432,
"user": "postgres",
"password": "$var:g/all/pg_password",
"dbname": "windmill",
"sslmode": "prefer"
}
}
```
### MySQL
```json
{
"resource_type": "mysql",
"value": {
"host": "localhost",
"port": 3306,
"user": "root",
"password": "$var:g/all/mysql_password",
"database": "myapp"
}
}
```
### Slack
```json
{
"resource_type": "slack",
"value": {
"token": "$var:g/all/slack_token"
}
}
```
### AWS S3
```json
{
"resource_type": "s3",
"value": {
"bucket": "my-bucket",
"region": "us-east-1",
"accessKeyId": "$var:g/all/aws_access_key",
"secretAccessKey": "$var:g/all/aws_secret_key"
}
}
```
### HTTP/API
```json
{
"resource_type": "http",
"value": {
"baseUrl": "https://api.example.com",
"headers": {
"Authorization": "Bearer $var:g/all/api_token"
}
}
}
```
### Kafka
```json
{
"resource_type": "kafka",
"value": {
"brokers": "broker1:9092,broker2:9092",
"sasl_mechanism": "PLAIN",
"security_protocol": "SASL_SSL",
"username": "$var:g/all/kafka_user",
"password": "$var:g/all/kafka_password"
}
}
```
### NATS
```json
{
"resource_type": "nats",
"value": {
"servers": ["nats://localhost:4222"],
"user": "$var:g/all/nats_user",
"password": "$var:g/all/nats_password"
}
}
```
### MQTT
```json
{
"resource_type": "mqtt",
"value": {
"host": "mqtt.example.com",
"port": 8883,
"username": "$var:g/all/mqtt_user",
"password": "$var:g/all/mqtt_password",
"tls": true
}
}
```
## Custom Resource Types
Create custom resource types with JSON Schema:
```json
{
"name": "custom_api",
"schema": {
"type": "object",
"properties": {
"base_url": {"type": "string", "format": "uri"},
"api_key": {"type": "string"},
"timeout": {"type": "integer", "default": 30}
},
"required": ["base_url", "api_key"]
},
"description": "Custom API connection"
}
```
Save as: `custom_api.resource-type.json`
## OAuth Resources
OAuth resources are managed through the Windmill UI and marked:
```json
{
"is_oauth": true,
"account": 123
}
```
OAuth tokens are automatically refreshed by Windmill.
## Using Resources in Scripts
### TypeScript (Bun/Deno)
```typescript
export async function main(db: RT.Postgresql) {
// db contains the resource values
const { host, port, user, password, dbname } = db;
}
```
### Python
```python
class postgresql(TypedDict):
host: str
port: int
user: str
password: str
dbname: str
def main(db: postgresql):
# db contains the resource values
pass
```
<!-- cli-only -->
## CLI Commands
```bash
# List resources
wmill resource list
# List resource types with schemas
wmill resource-type list --schema
# Get specific resource type schema
wmill resource-type get postgresql
# Deploy resources to the workspace — destructive to remote state, so only run when
# the user explicitly asks to deploy/publish/push. Depending on how the repo is wired,
# deploy via `git push` or `wmill sync push` (see the Deploying section in AGENTS.wmill.md).
wmill sync push
```
<!-- /cli-only -->