Preface¶
Doing “image pairing” in chat-type agents is awkward in several places: the image library is scattered everywhere, images lack structured tags, and agents can only guess which image fits the context based on filenames. To pair an image for a certain emotion, you first have to know if it’s in the library, where it is, and if it can be sent. dsh-sticker-hub, maintained by lunchyspring, aims to solve this—turning stickers into a local, taggable, searchable, and directly sendable resource library, integrated into DeepSeek Harness (DSH).
Its positioning is clear: the plugin itself carries no images and no keys. Which repository to pull images from, which vision model to use for tagging, and who pays for the inference are all decided on your own machine. This article compiles installation and usage based on practical information from the GitHub README.
What is this¶
One sentence: A local sticker library plugin for DSH, providing tagging, semantic search, automatic image matching, “sticker battle” mode in group chats, and GUI inline images.
- Maintainer: lukcyspring
- Category: Fun Dress-up (labeled by SkillHub community directory)
- Features: MIT License, pure JS with no runtime dependencies, Node ≥ 20
- Repository: https://github.com/lukcyspring/dsh-sticker-hub
- Directory Page: https://www.skillhub.cn/plugins/lukcyspring/dsh-sticker-hub
What it can do¶
The capability table from the README is as follows:
| Capability | Description |
|---|---|
| Local Gallery | A directory + a index-all.md table, human-readable and git-manageable |
| Tagging | Uses your configured vision model to generate “name / emotion / tags / when to use” for new images |
| Search | Find images by the meaning you want to express, with duplicate filtering |
| Send | Delegates to any “send file” tool (default is QQ’s qqbot_send_file), no text returned |
| Battle | Switch / trigger word / continuous burst of three images; enter if any condition is met, after which only images are returned |
| GUI Inline Images | Display stickers directly in the chat window, no need for QQ / IM channels |
| Settings Page | Modify directly in the DSH interface “Settings → Sticker Library”, no restart needed |
Several points worth expanding on:
- The plugin registers a read-only image route.
sticker_showconcatenates the address into an absolute same-origin address and returns markdown, so images appear directly in the chat window without going through the IM file channel. The route only accepts loopback addresses, and the path is locked within the gallery directory. - Once “Sticker Battle” is entered, only images are returned without text; as soon as you start typing, the round ends. How does it know you are sending an image? The channel plugin saves incoming images as local files and passes the path to the agent. The agent then calls
sticker_learnorsticker_search+sticker_send. - Using
[sticker:name]in the reply body is the recommended usage: writing[sticker:transform]in the reply text causes the channel layer to split it into a text segment followed by an image segment and send them in order. If the name cannot be found, it falls back to a random image from the same emotion category; if neither matches, the tag is discarded rather than forcing a match.
Three Prerequisites¶
- DSH is installed and running: Desktop or CLI, Node ≥ 20, able to open settings and install plugins (to
~/.dsh/profiles/<name>/). - Connect an IM channel that can send/receive images (QQ recommended). The QQ process is: register developer on q.qq.com -> create bot application -> note AppID & AppSecret -> add test group in sandbox config -> install
@tencent-connect/dsh-qqbotin DSH -> scan to bind. You can use the plugin without QQ, tools and search work normally, but you can’t send images (sticker_sendwill return the file path). - Configure a vision model. Only needed for “automatically tagging new images”. Any OpenAI-compatible endpoint works. README gives examples for OpenAI, DMXAPI proxy, and local ollama. It is not recommended to write the key in the plugin config; put it in a one-line text file and fill the path into
keyFile.
Installation¶
README provides three installation methods:
# Method A: Install directly from GitHub
dsh plugin --profile desktop add github:lukcyspring/dsh-sticker-hub
# Method B: From a local directory (development, changes take effect immediately)
cd ~/.dsh/profiles/desktop
npm install /path/to/dsh-sticker-hub --no-save
# Method C: After publishing to npm
dsh plugin --profile desktop add dsh-sticker-hub
After installation, restart DSH, and a “Sticker Library” page will appear in the settings.
Note from README: DSH plugins must appear in both
dependenciesanddsh.profile.bundlesin the profile’spackage.json. Adding only the dependency without bundles will cause the host to not load it.
Pulling the Gallery and Tagging¶
The resources/ in the plugin repository comes with a ready-made structure: 18 example stickers, and a tag table of 614 (deduplicated) items, including file / name / emotion / tags / when to send. Check: The full gallery is not published with the npm package and needs to be cloned from the repo; the 18 images in resources/gallery/ are distributed with the repo, while the other 596 images only have tags and are pulled from upstream.
The CLI for pulling images and tagging is as follows:
node bin/sticker-hub.mjs pull # Pull all
node bin/sticker-hub.mjs pull dsh-meme # Pull only one
node bin/sticker-hub.mjs stats # See how many images there are
node bin/sticker-hub.mjs tag --limit 20 # Try 20 first to check quality
node bin/sticker-hub.mjs tag # Full tag
Images are placed in ~/.dsh/sticker-hub/library/gallery/, with only one layer and deduplicated by content hash; the index is library/index-all.md. You can directly drop your own images into the gallery directory; sending them in QQ will also automatically add them to the library via sticker_learn.
Two tips for tagging quality: For GIFs, extract three frames to create a composite image before sending to the model; sending only the middle frame often causes the model to misinterpret the action. Write tags describing “what is happening” rather than “who it looks like”; keep only one or two character names, as actions are what the search will actually hit.
Tools Provided¶
| Tool | Function |
|---|---|
sticker_search |
Find candidates by meaning, returns name / emotion / tags / when to use |
sticker_send |
Pick an image and send, defaults to returning only the path, the caller uses the send file tool to send it |
sticker_learn |
Add an image to the library and tag it |
sticker_battle |
Battle switch / toggle / check status / record a “received image” |
sticker_stats |
How large the library is, how dense the tags are, if battle is on |
sticker_show |
Inline display of an image in the GUI chat window |
The shortest path: Install plugin -> Fill gallery directory in settings page -> node bin/sticker-hub.mjs pull -> tag -> Say “send a slacking off sticker” in the chat.
Settings Page and FAQ¶
“Settings → Sticker Library” provides the battle switch, trigger words, spam threshold, gallery directory (default ~/.dsh/sticker-hub/library), vision Base URL / model / key file path, and displays library size and counts from each source in real-time. Changes take effect immediately without restart.
Common issues listed in README: “Gallery is empty” is usually because pull wasn’t run or libraryDir is incorrect; “Vision not configured” is usually because the model wasn’t filled or keyFile path is wrong; “Vision HTTP 400” is usually because the image is too large (default limit 8 MB) or the GIF wasn’t frame-extracted; failing to send images is usually because the channel doesn’t have a file sending tool or the file isn’t in an allowed directory.
Use Cases and Notes¶
Suitable for developers who want to do chat image pairing and sticker interaction in DSH, especially those already using the QQ bot channel. The plugin runs with the permissions of the current dsh process. Before installing, check the source code and license: the code is MIT, but images follow the licenses of their respective upstream sources. README’s ATTRIBUTION.md records the license for each source. Before republishing the gallery, check the other READMEs. The “Big Fat Fish” series (265 images) is CC BY-NC 4.0, do not use commercially.
Additionally, patches for the outbound interception hard mode and the [sticker:] channel integration method are in docs/HARD-MODE.md and docs/MARKER.md respectively. Both modify the dist of the channel plugin, so upgrades will overwrite them; use at your own discretion.
Uninstall:
dsh plugin --profile desktop remove dsh-sticker-hub
rm -rf ~/.dsh/sticker-hub # Gallery and state, delete only after confirming
Summary¶
The value of dsh-sticker-hub lies in treating stickers as a structured, searchable, and manageable local resource rather than a pile of scattered image files. The library is local, the model is yours to configure, the licenses are clear, and you need the QQ channel to play “Battle”, but you can view inline images in the GUI even without it.
Directory Page: https://www.skillhub.cn/plugins/lukcyspring/dsh-sticker-hub
GitHub: https://github.com/lukcyspring/dsh-sticker-hub