AionUi story-roleplay
Parse and apply character cards and world info files in multiple formats (PNG, WebP, JSON), fully compatible with SillyTavern format. Supports automatic parsing, keyword triggering, and dynamic updates.
git clone https://github.com/iOfficeAI/AionUi
T=$(mktemp -d) && git clone --depth=1 https://github.com/iOfficeAI/AionUi "$T" && mkdir -p ~/.claude/skills && cp -r "$T/src/process/resources/skills/story-roleplay" ~/.claude/skills/iofficeai-aionui-story-roleplay && rm -rf "$T"
src/process/resources/skills/story-roleplay/SKILL.mdStory Roleplay Skills
Parse and apply character cards and world info files for immersive story roleplay experiences. Fully compatible with SillyTavern formats.
⚠️ Core Constraints (Must Follow)
- 🚫 ABSOLUTELY FORBIDDEN: Guessing PNG/WebP image content, must use parser tool to extract data
- ✅ MUST EXECUTE: Prioritize copying preset tool (
), create only if not foundskills/story-roleplay/scripts/ - ⚠️ LAST RESORT: When creating scripts, use complete code at end of file, version must be
(do not use1.0.0
)^
Common: Parser Tool Usage Workflow
Quick Path (Try First)
Step 1: Copy Preset Tool
Try in the following order until successful:
-
Method 1 (Highest Priority): Relative path (if workspace is under project root):
cp skills/story-roleplay/scripts/parse-character-card.js . && cp skills/story-roleplay/scripts/package.json . -
Method 2: Search upward for project root (up to 5 levels):
for dir in . .. ../.. ../../.. ../../../.. ../../../../..; do if [ -f "$dir/skills/story-roleplay/scripts/parse-character-card.js" ]; then cp "$dir/skills/story-roleplay/scripts/parse-character-card.js" . cp "$dir/skills/story-roleplay/scripts/package.json" . break fi done -
Method 3: Global search (exclude temp directories):
SCRIPT_PATH=$(find ~ -name "parse-character-card.js" -path "*/skills/story-roleplay/scripts/*" ! -path "*/temp*" ! -path "*/*-temp*" ! -path "*/.webpack/*" 2>/dev/null | head -1) if [ -n "$SCRIPT_PATH" ]; then SCRIPT_DIR=$(dirname "$SCRIPT_PATH") cp "$SCRIPT_DIR/parse-character-card.js" . cp "$SCRIPT_DIR/package.json" . fi -
Verify: Confirm files copied
ls parse-character-card.js package.json- If files don't exist, continue to next method or use fallback option
Step 2: Install Dependencies
npm install
- Wait for completion, check if
was creatednode_modules - If fails: Check network/permission/Node.js environment
Step 3: Execute Parser
# Character card node parse-character-card.js <image-path> <output-json-path> # World info node parse-character-card.js <image-path> <output-json-path> --world-info
Important:
- ✅ Must provide output path as second argument
- ❌ Do not use stdout redirection (
)> - Use quotes if filename contains Chinese characters or spaces
Examples:
node parse-character-card.js character.png character.json node parse-character-card.js "薇娜丽丝.png" character.json node parse-character-card.js world-info.png world-info.json --world-info
Step 4: Verify Results
- Check output: Should see "Successfully extracted data to: <path>"
- Verify JSON file exists and format is correct
- If fails:
- Check error message (script will output specific error)
- Common errors:
- "PNG metadata does not contain any text chunks" → Image may not be a valid SillyTavern character card
- "Required dependencies not found" → Need to run
firstnpm install - "Image file not found" → Check if image path is correct
- ABSOLUTELY CANNOT guess or fabricate information, must report error clearly
Fallback Option (Last Resort)
If all above methods fail (possibly due to system permission issues), creating script files is allowed:
- Create
(see "Fallback Code" section at end of file)package.json - Create
(see "Fallback Code" section at end of file)parse-character-card.js
Prerequisite: Must have tried all finding methods and all failed.
Character Card Parser
Triggers: character card, 角色卡, load character, 加载角色, parse character, 解析角色卡
Description: Parse character card files in multiple formats, including PNG, WebP image formats and JSON file format.
Supported Formats
1. PNG Image Format (SillyTavern Standard)
- Data location: In PNG tEXt chunks
- Keywords:
(v2) orchara
(v3)ccv3 - Encoding: Base64-encoded JSON string
Processing: Use common parser tool workflow (see above), use character card command format when executing.
2. WebP Image Format (SillyTavern Compatible)
- Data location: In WebP EXIF/XMP metadata or text chunks
- Keywords:
(v2) orchara
(v3)ccv3
Processing:
- Recommended: Convert WebP to PNG first, then use PNG parser tool
- Or try using PNG parser tool (if WebP contains similar metadata structure)
- If conversion or parsing not possible, prompt user to provide JSON format or re-export from SillyTavern
3. JSON File Format
Standard Format (Tavern Card V2/V3):
- Includes:
,name
,description
,personality
,scenario
,first_messystem_prompt - Optional:
(character knowledge base)character_book - Supports simplified format (direct fields, no nested structure)
Processing: Read and parse directly (simplest, preferred)
Parsing Steps
Important: PNG/WebP images must use parser tool, guessing content is forbidden
-
Detect file format:
- JSON files: Read and parse directly (simplest, preferred)
- PNG/WebP files: Use common parser tool workflow (see above)
-
Extract character information:
: Character namename
: Character descriptiondescription
: Personality traitspersonality
: Scenario settingscenario
: First message (used as opening)first_mes
: System prompt (character behavior rules)system_prompt
: Character knowledge base (similar to world info)character_book
-
Apply character information:
- Use character's system_prompt as behavior rules
- Use first_mes as conversation opening
- Apply character_book entries to conversation
-
Save as JSON format (after parsing images):
- After successfully parsing PNG/WebP images, automatically convert to JSON format
- Save as
in workspacecharacter.json - Preserve all original data from image
Best Practices
- Prefer JSON format (easiest to parse, no additional tools needed)
- PNG format: Must use parser tool, guessing content is forbidden
- WebP format: Convert to PNG then use parser tool, or use JSON format
- Error handling: When parsing fails, must provide clear error message, absolutely cannot guess or fabricate character information
- Always save parsed images as JSON format for easier viewing and editing
World Info Parser
Triggers: world info, 世界信息, world tree, 世界树, load world info, 加载世界信息
Description: Parse and apply world info files, implementing keyword trigger mechanism. Supports JSON files and PNG/WebP image formats (with embedded world info data).
Supported Formats
1. JSON File Format
{ "name": "World Name", "entries": [ { "keys": ["keyword1", "keyword2"], "content": "Content to inject when triggered", "priority": 100, "enabled": true } ] }
2. PNG Image Format (SillyTavern Compatible)
- Data location: In PNG tEXt chunks
- Keyword:
(SillyTavern standard)naidata - Encoding: Base64-encoded JSON string
Processing: Use common parser tool workflow (see above), use
--world-info flag when executing.
3. WebP Image Format (SillyTavern Compatible)
Processing:
- Recommended: Convert WebP to PNG first, then use PNG parser
- If conversion fails, suggest user use JSON format or re-export from SillyTavern
Field Descriptions
: Keyword array, triggers when these words appear in conversationkeys
: Content to inject when triggeredcontent
: Priority (higher number = higher priority)priority
: Whether enabled (true/false)enabled
Trigger Mechanism
- Keyword detection: Monitor conversation content, detect if it contains world info keywords
- Content injection: When keywords appear, integrate corresponding content into response, sorted by priority
- Natural integration: Do not insert world info content awkwardly, naturally integrate into conversation and narrative
Parsing Steps
-
Detect file format:
- JSON files: Read and parse directly (simplest, preferred)
- PNG/WebP files: Use common parser tool workflow (see above), use
flag--world-info
-
Extract world info:
- Read output JSON file
- Parse JSON, extract
arrayentries - Verify JSON structure is correct (must contain
field)entries
-
Save as JSON format (after parsing images):
- After successfully parsing PNG/WebP images, automatically convert to JSON format
- Save as
in workspaceworld-info.json
Best Practices
- Prefer JSON format (easiest to parse, no additional tools needed)
- PNG format: Use same parser tool as character cards (with
flag)--world-info - WebP format: Recommend converting to PNG or using JSON format
- Keywords should be specific and meaningful, avoid overly broad keywords
- Always save parsed images as JSON format for easier viewing and editing
Character Book Handler
Triggers: character book, 角色知识库, character entry, 角色条目
Description: Handle character_book (character knowledge base) in character cards, similar to world info but bound to specific character.
Character Book Format
character_book field in character card:
: Character knowledge base namename
: Entry array, each entry containsentries
,keys
,content
,priorityenabled
Processing
- When loading character card: Extract character_book field, parse entries array, apply together with character information
- During conversation: Detect keywords in character_book, inject relevant content when keywords appear
- Priority: character_book entries usually have higher priority than world info
Best Practices
- character_book is for character-specific knowledge
- World info is for general world settings
- Both can be used together, but pay attention to priority
File Detection and Loading Workflow
Automatic Detection
-
Scan workspace:
- Find character card files:
,character.png
,character.webp
,character.json*.character.json - Find world info files:
,world-info.png
,world-info.webp
,world-info.jsonworld.json
- Find character card files:
-
Format recognition and parsing:
- JSON files: Read directly
- PNG/WebP images: Use common parser tool workflow (see above)
-
Apply parsed results:
- Apply parsed results to conversation context
- After successfully parsing images, automatically save as JSON format
Character Card and World Info Creation
When no files exist (Important: Must actively guide user):
-
Active guidance process:
- Step 1: Ask about story type and background setting
- Step 2: Ask about character details (type, personality, background, speaking style)
- Step 3: Ask about world setting (rules, locations, special settings, etc.)
-
Confirm information: Summarize user-provided information, wait for user confirmation before creating files
-
Create files:
- After confirmation, create
with all character informationcharacter.json - If world-building elements mentioned, create
with relevant entriesworld-info.json
- After confirmation, create
Creation format:
- Character card: Use Tavern Card V2/V3 standard format, include all essential fields
- World info: Create entries for key concepts, locations, rules, use meaningful keywords
Manual Loading
Users can manually load via:
- "Load character card: character.png"
- "Read world info: world-info.json"
- "Use this character: [upload file]"
Compatibility
This skill is fully compatible with SillyTavern formats:
- ✅ PNG image format (embedded JSON, SillyTavern standard) - for character cards and world info
- ✅ WebP image format (embedded JSON, SillyTavern compatible) - for character cards and world info
- ✅ JSON file format (Tavern Card V2/V3) - for character cards and world info
- ✅ World info format (PNG/WebP images use keyword
)naidata - ✅ Character Book (character knowledge base)
Fallback Code (For Last Resort Use)
Important: The following code should only be used when all path finding methods have failed. Prioritize using copy methods.
package.json
{ "name": "story-roleplay-parser", "version": "1.0.0", "description": "Parser tools for character cards and world info", "main": "parse-character-card.js", "scripts": { "parse": "node parse-character-card.js" }, "dependencies": { "png-chunks-extract": "1.0.0", "png-chunk-text": "1.0.0" } }
parse-character-card.js
Complete code reference:
skills/story-roleplay/scripts/parse-character-card.js
Key features:
- Extract character card data from PNG images (keywords:
orchara
)ccv3 - Extract world info data from PNG images (keyword:
)naidata - Support Base64 decoding and JSON validation
- Complete error handling and user-friendly error messages
If file is not accessible, can create based on following logic:
- Use
to extract PNG chunkspng-chunks-extract - Use
to decode tEXt chunkspng-chunk-text - Find keywords (
/chara
for character cards,ccv3
for world info)naidata - Base64 decode and validate JSON format