Personalization for the agent: a Web UI panel (about-you, reply style & tone, traits for headings/lists and emoji, output language, custom instructions) and `/soul` commands, with nickname/occupation/bio/style/traits/language compiled into a system prompt and re-injected into active sessions. Exposes `soulConfig` for other plugins and a `set_persona` tool the agent can call.
Install
# from npm (prebuilt)
dsh plugin --profile web add dsh-soul
# from GitHub (first run asks for allowBuilds approval — follow the hint, retry)
dsh plugin --profile web add github:Aliuyanfeng/dsh-soul
Any plugin you install runs third-party code with your own permissions — it can read your files, use your credentials, and reach the network, and tool approvals don’t sandbox it. GitHub-sourced plugins also run build scripts at install time — pnpm blocks those until you allow them, so an install can stop with ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED or ERR_PNPM_IGNORED_BUILDS; dsh prints the exact key to add under allowBuilds in your profile’s pnpm-workspace.yaml, and the install works on the next run. Allowing a build is a trust decision: only install sources you trust, and pin a commit (github:owner/repo#sha).
README
dsh-soul
A personalization plugin for DeepSeek Harness (DSH). Configure your agent's nickname, reply style, tone, and custom instructions.
Features
- Personalization settings page in the Web UI
- Localized settings UI (English/Chinese, follows the interface language), dirty tracking (save disabled when unchanged), save-result toasts, and a read-only "active prompt" viewer
- Enable or disable personalization
- "About you": set your nickname, occupation and bio so replies fit your background
- Combined style & tone option:
professional,casual,humorous,roast,efficient - Trait fine-tuning (layered on top of style & tone):
- Headings & lists:
default,more(clear formatting with headings and lists),less(more paragraph text) - Emoji:
default,more(frequent emoji usage),less(minimal emoji usage)
- Headings & lists:
- Output language (agent reply language +
/soulcommand output language): Chinese or English - The compiled system prompt follows the output language (English descriptions when
language=en) - Custom instructions
- Agent-callable tool
set_personato let the model adjust persona during a conversation - Named personas: save the current config under a name and switch with one click (save / use / list / delete, in both the Web UI and slash commands)
set_personaconfirmation mode (requireToolConfirmation): agent persona changes take effect only after/soul confirm- Composer light trail: while the agent is replying, a light trail loops around the composer border (default color
#679EFE)- Color: preset swatches, a color picker, or a hex input (e.g.
#679EFE) - Flow speed: slow / normal / fast (default slow, 4.8s / 3.6s / 2.4s); trail thickness: thin / normal / thick (default thin, 1.5 / 2.5 / 4 px)
- The trail advances at constant speed along the border and fades into a tail; it sits exactly on the composer border, never producing a double line
- The settings page shows a live preview that follows color / speed / thickness; automatically disabled under "reduce motion"
- Color: preset swatches, a color picker, or a hex input (e.g.
/soul setkey=value field updates- Configuration persisted to disk
- Input validation: field whitelist, types, length limits (nickname/occupation 50, bio 500, custom instructions 2000 chars), enum and hex-color checks; invalid or oversized fields reject the whole write
- Configuration synced to all active agents after every update
- Change detection: the prompt is refreshed and sessions injected only when a behavior-affecting field actually changed — appearance-only config (composer light trail) is persisted without injecting anything
Installation
dsh plugin --profile web add dsh-soul
dsh plugin --profile web update dsh-soul
The plugin is registered via cordis.patch.yml:
- insert:
- id: soul
name: dsh-soul
Compatibility
The plugin ships no DSH runtime packages; the host provides them all. DSH validates peerDependencies before loading, comparing against the DSH runtime version (the version of @deepseek-ai/dsh-app-boot), not the individual packages' versions:
| Package | Range |
|---|---|
@deepseek-ai/dsh-llm |
>=0.1.1-rc.2 <0.3.0-0 |
@deepseek-ai/dsh-tools |
>=0.1.0-rc.6 <0.3.0-0 |
@deepseek-ai/cordis |
^4.0.1 || ^4.0.5-alpha.1 |
So DSH 0.1.x and 0.2.x are supported, prereleases included. Run npm run verify:compat to check the declaration against your environment.
If DSH reports "dsh-soul@x.y.z is incompatible with DSH a.b.c", the plugin predates that DSH version — updating it is enough:
dsh plugin --profile web update dsh-soul
Screenshots
Settings page (About you + Traits)

Settings page (Traits + Output language + Custom instructions)

/soul command prompt

/soul command output (set nickname, show, enable, disable, reset)

Usage
After starting DSH, open the Personalization section on the settings page, edit the configuration and click Save Settings.
Slash commands are also available:
/soul show Show current configuration (confirmation mode & persona count)
/soul set k=v Change config fields (e.g. /soul set style=humorous language=en; trail: trailColor=#679EFE trailSpeed=fast trailWidth=thick)
/soul save <name> Save the current config as a persona
/soul use <name> Apply a persona
/soul list List personas (✔ marks the active match)
/soul del <name> Delete a persona (delete / rm aliases)
/soul confirm Apply the pending persona proposal (confirmation mode)
/soul reject Discard the pending persona proposal
/soul reset Reset configuration (keeps the persona library)
/soul enable Enable personalization
/soul disable Disable personalization
/soul Bob Set nickname
Once saved, the configuration is synced to all active agents and takes effect on the next request in the current session; no-op saves inject nothing.
The agent can also use the set_persona tool to adjust your persona (nickname, style & tone, traits, reply language, custom instructions). The model only invokes this tool when you explicitly ask to change how it addresses or responds to you. With Require confirmation for persona changes (requireToolConfirmation) enabled, tool changes come back as a pending proposal and take effect only after /soul confirm (or are discarded by /soul reject).
Configuration File
The configuration is stored in the DSH user data directory:
soul-config.json
Example:
{
"enabled": true,
"nickname": "Bob",
"occupation": "Software Engineer",
"bio": "Interested in programming and technology",
"style": "professional",
"language": "en",
"customInstructions": "Be concise and lead with the conclusion.",
"requireToolConfirmation": false,
"trailEnabled": true,
"trailColor": "#679EFE",
"trailSpeed": "slow",
"trailWidth": "thin"
}
Personas are stored in the same file under the personas field: name → persona field snapshot (nickname / occupation / bio / style / traits / language / custom instructions) + updatedAt. Persona library changes never touch the active config; a persona is applied to the config (and synced to sessions) only when used.
Composer light trail fields: trailEnabled (on/off, default true), trailColor (6-digit hex, stored uppercase, default #679EFE), trailSpeed (slow / normal / fast, default slow), trailWidth (thin / normal / thick, default thin). These are appearance-only: they are persisted but never enter the system prompt and never trigger a session injection.
Length limits: nickname / occupation 50 chars, bio 500 chars, custom instructions 2000 chars; the color must be #rrggbb. Unknown fields are dropped; invalid or oversized fields reject the whole write (HTTP returns 400 with per-field error details).
How It Works
The plugin compiles the nickname, style, tone and custom instructions into a system prompt via compilePrompt() and registers it with DSH:
spCtx.systemPrompt.section({
name: 'soul:persona',
order: 0,
text: () => compilePrompt(configCache || DEFAULT_CONFIG)
})
After each update, the plugin iterates over all active agents and calls agent.inject() with a standard UserMessage:
agent.inject(createUserMessage({
content: [{ type: 'text', text: prompt }],
source: {
kind: 'plugin',
plugin: 'dsh-soul',
form: 'snapshot',
sections: [{ name: 'soul:persona', text: prompt }]
}
}))
agent.inject() places the latest configuration into the agent's pending context so it takes effect on the next request. It does not trigger a new request and does not modify message history.
License
MIT License
Links
More in this category
zhu1090093659/dsh-web#packages/dsh-task-board★ 8405
Task board for the dsh web GUI: a sidebar multi-column kanban whose cards run in real DSH agent sessions and can also be scheduled with cron expressions, executed host-side even with the browser closed.
zhu1090093659/dsh-web#packages/dsh-web-all★ 8405
Plugin and skin collection for the DSH Web UI: task board, Git graph, right-side panel, remote mobile UI, pet, live token stats, and a skin center.
ccch1mneyyy/dsh-TUI★ 4088
Claude Code-style full-screen terminal UI: pixel-whale header, live status line, and streaming thought expansion.
MeteorNOX/DeepSeek-Balance-Whale-Widget★ 4076
A fixed-corner whale widget for the DSH web GUI — balance, today's usage and per-turn cost with peak/off-peak pricing, editable balance-alert and daily-budget bubbles, a module-based custom bubble queue with A/B weighted choices and random lines or images, 30+ vendor templates (OpenAI, OpenRouter, Kimi, SiliconFlow, Ark, Zhipu, MiniMax and more) with per-model balance and subscription quota, plus task-end sound, imported audio, custom roles and a resource manager. Local-only, no telemetry.
omdsh-dev/DSH-better-sidebar★ 4009
Full sidebar workbench with file rendering and editing, terminal, Git, and subagents; third-party plugins can register new tabs.
Devin-AXIS/deepseek-design#deepseek-idesign★ 1423
Visual design studio for websites, app prototypes, posters, cards, reports, and magazines, with templates, direct element editing, selection-aware AI draft handoff, and export.
Community comments
Comments are public GitHub Discussions. Loading them connects to GitHub and Giscus; a GitHub account is required to post.