AI-powered assistant for Apache JMeter
πͺ Why "Feather Wand"? My kids named it after a Bluey episode, where a simple feather becomes a magical wand that turns the ordinary into something special. That's exactly what this plugin does for your JMeter workflow.
- Features
- Installation
- Configuration
- Special Commands
- Streaming
- Response Chime
- AI CLI Terminal
- API Setup
- Roadmap & Issues
- Disclaimer
| π€ Multi-Model Chat | Talk to Claude, OpenAI, Google Gemini, DeepSeek, or Ollama β all inside JMeter. |
| β‘ Real-Time Streaming | Watch AI responses appear token-by-token with a Stop button to cancel anytime. |
| π₯οΈ AI CLI Terminal | Run Claude Code, OpenAI Codex, OpenCode, or Antigravity directly in JMeter. |
| π§Ή Smart Refactoring | Right-click in the JSR223 editor to refactor, format, or inject functions with AI. |
| π Context-Aware Commands | @this, @optimize, @lint, @wrap, @code, @usage β each tailored to your test plan. |
| π Audio Chime | Optional sound notification when AI finishes responding. |
| π§ Model Filtering | Only chat-compatible models appear in the dropdown β no audio/TTS clutter. |
| βοΈ Fully Configurable | Customize prompts, temperature, tokens, history, timeouts, and more via JMeter properties. |
1. Install JMeter Plugins Manager β https://jmeter-plugins.org/
2. Restart JMeter
3. Open Plugins Manager β Available Plugins
4. Search for "feather wand"
5. Select it β Apply Changes and Restart JMeter
1. Download the latest JAR from Releases
2. Drop it into JMeter's lib/ext directory
3. Copy jmeter-ai-sample.properties into jmeter.properties (or user.properties)
4. Add your API key(s) and restart JMeter
See Releases for the latest JAR.
Copy jmeter-ai-sample.properties into your jmeter.properties or user.properties and adjust the values below.
| Property | Description | Default |
|---|---|---|
jmeter.ai.streaming.enabled |
Stream AI responses token-by-token | true |
jmeter.ai.response.chime |
Play a chime when AI finishes | false |
jmeter.ai.refactoring.enabled |
Enable JSR223 editor AI refactoring | true |
jmeter.ai.service.type |
Default AI service for refactoring | anthropic |
Anthropic (Claude)
| Property | Description | Default |
|---|---|---|
anthropic.api.key |
Claude API key | Required |
claude.default.model |
Default model | claude-sonnet-4-6 |
claude.temperature |
Temperature (0.0-1.0) | 0.5 |
claude.max.tokens |
Max response tokens | 1024 |
claude.max.history.size |
Conversation history size | 10 |
claude.system.prompt |
System prompt | See sample file |
anthropic.log.level |
Logging (info/debug) |
(empty) |
OpenAI
| Property | Description | Default |
|---|---|---|
openai.api.key |
OpenAI API key | Required |
openai.default.model |
Default model | gpt-4o |
openai.temperature |
Temperature (0.0-1.0) | 0.5 |
openai.max.tokens |
Max response tokens | 1024 |
openai.max.history.size |
Conversation history size | 10 |
openai.system.prompt |
System prompt | See sample file |
openai.log.level |
Logging (INFO/DEBUG) |
(empty) |
Google Gemini
| Property | Description | Default |
|---|---|---|
google.api.key |
Google AI API key | Required |
google.default.model |
Default model | gemini-2.5-flash |
google.temperature |
Temperature (0.0-1.0) | 0.7 |
google.max.tokens |
Max response tokens | 4096 |
google.max.history.size |
Conversation history size | 10 |
google.system.prompt |
System prompt | See sample file |
Ollama (Local)
| Property | Description | Default |
|---|---|---|
ollama.host |
Server host | http://localhost |
ollama.port |
Server port | 11434 |
ollama.default.model |
Default model | deepseek-r1:1.5b |
ollama.temperature |
Temperature (0.0-1.0) | 0.5 |
ollama.max.history.size |
Conversation history size | 10 |
ollama.thinking.mode |
Extended thinking (ENABLED/DISABLED) |
DISABLED |
ollama.thinking.level |
Thinking depth (LOW/MEDIUM/HIGH) |
MEDIUM |
ollama.request.timeout.seconds |
Request timeout | 120 |
ollama.system.prompt |
System prompt | See sample file |
β οΈ Ifollama.thinking.mode=ENABLED, raiseollama.request.timeout.secondsto at least300.
| Property | Description | Default |
|---|---|---|
jmeter.ai.terminal.claudecode.enabled |
Enable the embedded terminal | true |
jmeter.ai.terminal.claudecode.path |
Full path to claude binary |
(auto-detect) |
jmeter.ai.terminal.copilot.enabled |
Enable GitHub Copilot CLI | false |
jmeter.ai.terminal.copilot.path |
Full path to copilot binary |
(auto-detect) |
jmeter.ai.terminal.antigravity.enabled |
Enable Antigravity CLI | false |
Prerequisite CLIs
| CLI | Binary | Install Guide |
|---|---|---|
| Claude Code | claude |
Docs |
| OpenAI Codex | codex |
Repo |
| GitHub Copilot | copilot |
Docs |
| OpenCode | opencode |
Repo |
| Antigravity | agy |
Site |
Each service supports its own *.system.prompt property β tweak them in your properties file to focus the AI on specific JMeter topics or team conventions.
Type any of these directly in the chat box. All commands are context-aware and work with the currently selected test-plan element.
| Command | What it does | Example |
|---|---|---|
@this |
Describe the selected element and suggest best practices. | How do I configure @this? |
@optimize |
Analyze the selected element and suggest performance tweaks. | @optimize or optimize this sampler |
@lint |
Auto-rename elements for consistency. Undo/redo supported. | @lint rename elements in PascalCase |
@wrap |
Group HTTP samplers under Transaction Controllers. | @wrap (select a Thread Group first) |
@code |
Extract the last AI code block into the JSR223 editor. | @code |
@usage |
Show token-usage stats and recent conversation history. | @usage |
- Run it after importing a recorded test plan to clean up generic names.
- Use it before sharing plans with your team.
- Apply custom rules:
@lint rename based on the URL.
@wrap uses pattern matching (not AI) to group related HTTP samplers under Transaction Controllers, preserving child elements and hierarchy. Great for imported or recorded plans.
All five AI services support real-time streaming out of the box. Responses appear token-by-token as they are generated.
| Control | What it does |
|---|---|
| Stop | Appears next to the Send button during streaming β click to cancel mid-response. |
Disable streaming:
jmeter.ai.streaming.enabled=falseGet an audible cue when the AI finishes responding so you can multitask across windows.
jmeter.ai.response.chime=trueThe bundled WAV plays from src/main/resources/org/qainsights/jmeter/ai/sound/jmeter-chime.wav with an MP3 fallback.
An embedded interactive terminal (JediTerm) that brings agentic AI CLIs directly into JMeter.
Supported CLIs: Claude Code Β· OpenAI Codex Β· OpenCode Β· Antigravity
How it works
- Install one or more CLIs on your
PATH. - Feather Wand auto-detects them on startup.
- Pick a CLI from the dropdown in the terminal header.
- The terminal receives your open
.jmxcontext via an auto-generatedCLAUDE.md. - Use natural language to run tests, parse JTL files, refactor scripts, and more.
Buttons
- Reload β refresh the test plan from disk.
- Ctx β resend the current test-plan context.
Architecture
Built on an Adapter Pattern: AiCliAdapter β BaseCliAdapter β concrete adapters (ClaudeCodeCliAdapter, OpenAiCodexCliAdapter, ...). To add a new CLI, implement AiCliAdapter and register it in detectAvailableClis().
β οΈ Caution: AI CLIs can execute commands and modify files. Review each CLI's documentation before enabling.
| Provider | Steps | Property |
|---|---|---|
| Claude | Sign up at anthropic.com β create API key | anthropic.api.key |
| OpenAI | Sign up at platform.openai.com β create API key | openai.api.key |
| Gemini | Sign in at Google AI Studio β Get API Key | google.api.key |
| Ollama | Install from ollama.com β ollama pull llama3.1 |
No key needed |
Set jmeter.ai.service.type=ollama to switch to a local model. All other providers work side-by-side; just pick the model from the UI dropdown.
Feather Wand automatically hides non-chat models so you only see useful options:
- OpenAI β hides audio, TTS, whisper, davinci, search, realtime, and instruct models.
- Claude β shows only the latest available models.
- Gemini β shows only
gemini-*andgemma-*chat models.
Default models: claude-sonnet-4-6 Β· gpt-4o Β· gemini-2.5-flash Β· deepseek-chat Β· deepseek-r1:1.5b
Found a bug or have an idea? Open an issue.
See what's next on the project board.
- Verify everything β AI can hallucinate. Double-check critical suggestions before production runs.
- Backup first β Save your
.jmxbefore letting AI refactor it. - Test in staging β Validate changes in a safe environment.
- Watch costs β Token usage adds up. Use
@usageto keep an eye on it. - No secrets in chat β Never paste credentials or proprietary code into the chat box.
Feather Wand is an assistant, not a replacement for engineering judgment.