一键导入
st-audit
Audit current SillyTavern config — explain settings, surface non-defaults, recommend changes for a goal. Read-only.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Audit current SillyTavern config — explain settings, surface non-defaults, recommend changes for a goal. Read-only.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Search, download, and mine prompts from Civitai for Forge
Bake a completed RP arc into a SillyTavern lorebook as persistent memory. Run after each arc concludes.
Build ST image gen prompt — booru tags from chat scene
Convert a SillyTavern character into a user persona — or create a new persona from scratch with --new. Migrates/builds visuals, lorebook link, avatar.
Onboard a SillyTavern character — set SD visual baseline + audit. Optional: redistribute card fields, generate expressions, build lorebook.
Drain the home-server local-Forge image-ticket queue with deep Forge expertise (NoobAI, ADetailer, ControlNet, img2img, per-seed loops). USE on 'fulfill the image queue', 'process gen tickets', 'gen-fulfill', 'drain the forge queue', 'resolve image requests', or after gen-art queued a Forge ticket. The ONLY place the hub's Forge expertise lives.
| name | st-audit |
| model | sonnet |
| description | Audit current SillyTavern config — explain settings, surface non-defaults, recommend changes for a goal. Read-only. |
| argument-hint | [<setting-key> | goal "<text>"] |
| allowed-tools | Bash, Read, mcp__st__st_get_settings, mcp__st__st_save_settings_path |
Read-only audit of SillyTavern configuration. Surfaces what's currently configured, why each knob matters, and what to change for a given goal. Does NOT modify anything — feeds context into conversation so user decides next move.
Why this exists: ST has 100KB+ settings.json + 10+ extensions, each with sub-config. Most users don't know which knobs are load-bearing vs cargo-cult. This skill closes the discovery gap.
Usage:
/st-audit # full sweep, grouped by domain
/st-audit <setting-key> # explain one setting (current value + what it does + safe range)
/st-audit goal "<natural language>" # goal-driven: list relevant settings + recommendations
ST_DATA = /home/haint/Projects/home-server/sillytavern/data/default-user
SETTINGS = $ST_DATA/settings.json # fallback only; prefer mcp__st__st_get_settings
PLAYBOOK = /home/haint/Projects/home-server/sillytavern/PROMPT-PLAYBOOK.md
PROMPT-PLAYBOOK.md — 33 verified gotchas, the canonical local knowledge base. Always cite gotcha number when relevant.mcp__st__st_get_settings() — current state (ground truth). Works while ST runs (no file-lock risk). Falls back to Read SETTINGS if MCP unavailable (ST container down)./home/node/app/public/scripts/extensions/<name>/index.js via podman exec if needed).If knowledge sources conflict → live settings wins for "current value", playbook wins for "why it matters".
/st-audit no args)Read each domain via path-based MCP calls (full-tree read returns 70KB+, exceeds Claude's MCP token cap). Each call returns a JSON string of the subtree at that path.
import json
# Per-domain reads (compose a full audit without ever loading the full tree)
sd = json.loads(mcp__st__st_get_settings(path="extension_settings.sd"))
memory = json.loads(mcp__st__st_get_settings(path="extension_settings.memory"))
conn_mgr = json.loads(mcp__st__st_get_settings(path="extension_settings.connectionManager"))
power_user = json.loads(mcp__st__st_get_settings(path="power_user"))
ext_all = json.loads(mcp__st__st_get_settings(path="extension_settings"))
# Disabled extensions are stored per-extension as <extension>.disabled (true/false),
# not aggregated at a single key. Walk extension_settings for {disabled: true} entries.
disabled_exts = [k for k, v in ext_all.items() if isinstance(v, dict) and v.get("disabled") is True]
Produce a grouped report. Skip categories where everything is at default — focus attention on non-defaults.
[1] Image Generation (extension_settings.sd)
source — Forge URL backendsampler (expect Euler for NoobAI, NOT Euler a)scheduler (expect karras)steps, scale (CFG)prompt_prefix (must start with quality tags)prompts['4'] — Mode 4 template length + first linecharacter_prompts — count entries + list keyscharacter_negative_prompts — count entries[2] Memory / Summary (extension_settings.memory)
source (main = uses primary LLM, extras = separate)prompt_builder (0=DEFAULT/generateQuietPrompt, 1=RAW_BLOCKING, 2=RAW_NON_BLOCKING)SkipWIAN (true = exclude WIAN from summary prompt)promptInterval (0 = manual-only, N = auto every N messages)position, depth, role (where summary injects)promptWords (max summary length)[3] Connection Profiles (extension_settings.connectionManager.profiles)
extension_settings.connectionManager.selectedProfile)[4] RP Behavior (power_user.*)
instruct.preset_name + instruct.enabledcontext.preset (context template)max_context, response_lengthprefer_character_prompt / prefer_character_jailbreakuser_avatar (active persona)[5] Extensions State
extension_settings.<name>.disabled — list every extension with disabled: trueLALib (slash command lib), GuidedGenerations-Extension, memory[6] Quick Replies (quickReplyApi.config.setList)
[7] Persona (power_user.personas, power_user.persona_descriptions)
## ST Config Audit — [date]
### 🟢 Image Gen
- sampler: Euler ✓ (correct for NoobAI epsilon-pred)
- scheduler: karras ✓
- steps: 30 ✓ (>=28 required, gotcha 5.X)
- scale: 5 ✓ (CFG 4-5 for NoobAI)
- prompt_prefix: "masterpiece, best quality..." ✓
- Mode 4 template: 2144 chars (v8.2 — 5 hard rules only)
- char_prompts: 4 entries [Naoko, Parasite, Helena Lin, Klee]
### 🟡 Memory/Summary
- source: main ✓ (uses primary LLM)
- prompt_builder: 1 (RAW_BLOCKING) ✓ (gotcha 5.33)
- SkipWIAN: true ✓
- promptInterval: 0 ✓ (manual-only, gotcha 5.33)
- position: ?, depth: ?, role: ?
### 🔴 Extensions
- DISABLED: GuidedGenerations-Extension (diagnostic state, can re-enable)
- ENABLED: LALib ✓ (required for /dom workaround)
### Connection Profiles
| Name | Preset | Model | API |
|------|--------|-------|-----|
| ... | ... | ... | ... |
Active: DeepSeek daily
### Findings
- Non-default values: N
- Settings flagged: M
- Suggested next checks: [...]
Use 🟢 (looks correct), 🟡 (notable but intentional), 🔴 (worth attention).
/st-audit <key>)Parse <key> — accept dot-path (sd.sampler) or last segment (prompt_builder matches extension_settings.memory.prompt_builder).
If ambiguous (multiple matches) → list candidates, ask user to disambiguate.
## Setting: extension_settings.memory.prompt_builder
**Current value**: 1 (RAW_BLOCKING)
**What it does**: Controls which generation path the Summarize extension uses.
- 0 (DEFAULT) → generateQuietPrompt → routes through prompt manager → injects WIAN, persona, char defs into summary prompt
- 1 (RAW_BLOCKING) → generateRaw → bypasses prompt manager → clean summary prompt only ✓ recommended
- 2 (RAW_NON_BLOCKING) → generateRaw async → faster but less reliable for long chats
**Why current value matters**: Setting 0 caused WIAN contamination in Magnum's summary output (gotcha 5.33). Switched to 1 to route through generateRaw.
**Depends on / affects**:
- Pairs with `SkipWIAN: true` (redundant safety — RAW_BLOCKING already bypasses WIAN)
- If you switch back to 0, restore SkipWIAN check
**Source**: PROMPT-PLAYBOOK.md gotcha 5.33; ST source `/home/node/app/public/scripts/extensions/memory/index.js:507`
**Safe to change**: Only if changing summary architecture. Current value is load-bearing.
/st-audit goal "<text>")Parse natural language goal. Match against known goal categories:
| Goal pattern | Relevant settings |
|---|---|
| "image gen quality" / "ảnh đẹp hơn" | sd.sampler, scheduler, steps, scale, prompt_prefix, char_prompts, Mode 4 template |
| "summary clean" / "summary không bị bẩn" | memory.prompt_builder, SkipWIAN, promptInterval, source |
| "RP voice" / "ít interrupt" / "tone" | instruct preset, context preset, char card PHI, AN, model temperature |
| "model switching" / "profile" | connectionManager.profiles, selectedProfile, /profile slash command |
| "function calling" / "tool calling" | enableFunctionCalling, model api support, prompts |
| "context window" / "token budget" | max_context, response_length, summary depth, lorebook entry budgets |
| "persona setup" / "user persona" | power_user.personas, persona_descriptions, user_avatar, linked lorebook |
| "lorebook" / "world info" | worlds/*.json, character lorebook linkage, depth, position, scanDepth |
For each match, output:
## Goal: "summary không bị bẩn"
Matched category: Memory/Summary
### Current state
- prompt_builder: 1 (RAW_BLOCKING) ✓
- SkipWIAN: true ✓
- promptInterval: 0 (manual-only) ✓
- source: main ✓
### Status
**Already optimized.** All 4 load-bearing settings match recommended values from gotcha 5.33.
### If still seeing problems
- Check active model — DeepSeek tends to write prose-style continuations even with RAW_BLOCKING (RP-tuned). Switch to Magnum profile via QR `[📝 Summary]` button.
- Check chat metadata — old `extra.memory` entries from prior bad summaries can contaminate next regen. Inspect `chats/<char>/<chat>.jsonl`.
### Reference
PROMPT-PLAYBOOK.md gotcha 5.33; section 8.1 (Summary Workflow)
Embedded so skill works without re-reading PROMPT-PLAYBOOK every invocation. Update this list when new gotchas added.
Image gen knobs
masterpiece, best quality, newest, absurdres, highres,prompts['4']. Current: v8.2, 2144 chars, 5 hard rules. Magnum picks tags from booru training..png (gotcha: getCharaFilename() strips ext)Memory/Summary
extra.memory chat metadata → contaminates next regen. Clear it before retry.STscript / Slash commands
is_send_press lock → /summarize via QR pipe silent fails (gotcha 5.33)/dom action=click "#memory_force_summarize" bypasses lock via native DOM event/profile timeout=5000 <name> — needs delay before next commandExtensions
data/default-user/extensions/, NOT public/extensions/third-party/ (legacy path)/dom, /regex, /runc, /db, /fetch, etc.Persona vs Character
persona_descriptions[avatar].description textpower_user.user_avatar (filename of avatar PNG)power_user.persona_descriptions[avatar].lorebookFor any mode:
Read live state:
import json
with open("/home/haint/Projects/home-server/sillytavern/data/default-user/settings.json") as f:
s = json.load(f)
Read PROMPT-PLAYBOOK.md (skim relevant sections only — file is ~700 lines):
Cross-reference current value vs recommended:
Output report (markdown table or structured sections, scannable)
NEVER modify settings.json — this skill is read-only by design.
| Case | Handling |
|---|---|
| settings.json not found | ST data not at expected path. Check container running, paths correct. |
| ST container running while reading | Safe — read-only. But warn that values may change if user edits via UI mid-audit. |
| Setting key ambiguous in mode 2 | List candidates, ask user to pick. |
| Goal text doesn't match any category | Show available categories, ask user to rephrase or pick closest. |
| PROMPT-PLAYBOOK.md missing | Skill still works using built-in knowledge above; note playbook unavailable. |
/st-setup, /st-persona, /st-arc-save) or direct edits with confirmation.When to revisit MCP server: only if specific pain emerges that direct-file + skills can't cover.