Duotail Waterwheel front end AI test agent. Home page: https://waterwheel.duotail.com/
4.6K
Duotail Waterwheel Docker Image contains a harnessed AI agent capable of complicated frontend web testing.
For how to config and use this image, please see documents at https://waterwheel.duotail.com/
The script to create this docker image can be found at https://github.com/taodong/duotail-greenhouse/tree/main/waterwheel
| Variable | Description | Default |
|---|---|---|
ENABLE_PLAYWRIGHT_MCP | Enable Playwright MCP | true |
FIREWALL_DEBUG | Enable firewall debug logs | false |
ENABLE_EMAIL_MCP | Enable Email MCP | true |
MAIL_HOST | The SMTP host to send email to | localhost |
MAIL_PORT | The SMTP port to send email to | 25 |
MAILHOG_URL | The Mailhog URL to check received emails | http://localhost:8025 |
EMAIL_PERM_FILE | The email permission file | /agent/instructions/email-permissions.yaml |
ENABLE_PLAYWRIGHT_MCPshould always be true for the agent to work properly.
We recommend to keep
ENABLE_EMAIL_MCP=trueto restrict the agent's ability in email sending. Please updateToolssection in/agent/config/system.prompt.mdif turn off the email mcp.
| Parameter | Description | Default |
|---|---|---|
AI_PROVIDER | AI provider name: anthropic, openai, gemini or deepseek | anthropic |
AI_MODEL | AI model name | — |
AI_API_KEY | AI API key | — |
AI_MAX_TOKENS | Max tokens for a single response | 8192 |
AI_TEMPERATURE | Temperature (0.0 for strict QA/Logic, 0.7 for creative) | 0.0 |
GLOBAL_CONTEXT | Path to a JSON file of global variables/URLs injected into the system prompt | /agent/instructions/global_context.json |
EXTRA_INSTRUCTION | Path to a Markdown file whose content is appended to the system prompt; ignored if the file does not exist | /agent/instructions/extra-instructions.md |
SKILLS_DIR | Directory of user <skill-name>/SKILL.md skill folders (same layout as Anthropic's Agent Skills); the model loads a skill's full instructions on demand via the load_skill tool. Ignored if the directory does not exist or is empty. Point it at a different folder to swap skills without editing task files. | /agent/skills |
PRESET_CONTEXT | Path to a JSON file of preset context values seeded into the context store before any task runs; ignored if the file does not exist | /agent/instructions/preset-context.json |
TEST_RUN_TIMEOUT | Maximum total duration (in seconds) for the entire test run before it is stopped with status timeout | 7200 (2 hours) |
STEP_TIMEOUT_SEC | Maximum duration (in seconds) the agent may idle without receiving an LLM response per step before the task is marked failed | 120 (2 minutes) |
MAX_SNAPSHOTS_HISTORY | Maximum number of recent browser_snapshot tool results to keep in LLM message history; negative values are treated as 2; 0 blocks direct browser_snapshot calls at runtime (use take_verification_snapshot instead) | 2 |
CONTEXT_COMPRESSION | Enables message compression flow (planning + history compaction after complete_verification); evaluates to true only when set to true (case-insensitive) | false |
COMPRESSION_DEBUG | Emits one compression debug log right before the next LLM call after a compression; evaluates to true only when set to true (case-insensitive) | false |
COMPRESSION_DEBUG_INCLUDE_REQUEST | When COMPRESSION_DEBUG=true, logs the compressed messages (summary and continue prompt) instead of the compact summary mode | false |
COMPRESSION_THRESHOLD_MIN | Initial input token threshold for compression eligibility; non-positive values fall back to 12500. Requires CONTEXT_COMPRESSION=true. | 12500 |
COMPRESSION_THRESHOLD_LEAP | Step size for advancing the compression threshold after each compression; non-positive values fall back to 5000. Requires CONTEXT_COMPRESSION=true. | 5000 |
LARGE_CONTENT_THRESHOLD | UTF-8 byte threshold for large content guards in API logging and snapshot retention; non-positive values fall back to 10000 | 10000 |
RATE_LIMIT_RETRY | Maximum number of allowed rate-limit retries per task; negative values allow unlimited retries | 1 |
MAX_ITERATIONS | Maximum number of LLM call iterations per task before the loop is forcibly stopped | 300 |
ENABLE_API_LOGGING | Enables LLM API request/response logging to /agent/outputs/api-log.json; evaluates to true only when set to true (case-insensitive) | false |
MAXIMUM_RESTRICTED_TOOL_USAGE | Maximum number of cumulative calls to restricted tools (see restricted-tools below) allowed between verified progress checkpoints (a successful complete_verification or update_context_map). When the count exceeds this limit the task fails immediately. 0 or negative values disable the guard. The counter resets to 0 at the start of each task. | 3 |
The following parameters are defined in config/agent-config.json and cannot be overridden via environment variables. Editing the file takes effect without a code change.
| Key | Description | Type | Default |
|---|---|---|---|
restricted-tools | List of tool names whose calls increment the restricted tool usage counter (see MAXIMUM_RESTRICTED_TOOL_USAGE above). | string[] | ["browser_run_code_unsafe"] |
id-enforced-tools | Map of tool name to the list of input field names whose values must be normalized before dispatch. When a field value contains =, only the substring after the last = is kept (e.g. aria-ref=e42 → e42). Fields with no = are passed through unchanged. Applies to MCP tool calls only; an empty object disables normalization. | Record<string, string[]> | {"browser_click":["target"],"browser_fill_form":["ref"]} |
Playwright MCP server provides browser automation capabilites.
A simple MCP server sends test emails through Spring boot mail and receives emails through a given Mailhog url. There is no active configuratoin check for this MCP. Test task fail only when the agent tries email operations while the MCP isn't properly configured.
Content type
Image
Digest
sha256:4f0f9e93a…
Size
1.5 GB
Last updated
3 days ago
docker pull taojdcn/duotail-waterwheel:latest-mac