Introduction

Building a conversational agent in DeepSeek Harness (DSH) often involves letting users upload images or having the model directly output image URLs. The former relies on the model’s image input capability, while the latter can trigger compliance checks and may not reliably display images in chat bubbles. If you want a setup where “the interface shows images, but the model reads and writes text,” you need a mechanism that links meme indexing, sending conventions, and frontend rendering.

dsh-meme (formerly dsh-expression) is a meme plugin for DSH, categorized as “fun customization,” maintained by yyh-001. It has 54 stars and 4 forks on GitHub, is published to npm, and is MIT licensed. Below, we introduce what problems it solves, how to install it, and how to use it daily.

What It Is

dsh-meme is a meme plugin for DeepSeek Harness, designed with the principle of being “findable, sendable, and learnable”:

  • The model uses send_meme to sample candidates by emotion bucket, writes [meme: description] into its reply; the frontend renders the corresponding image in the chat bubble based on the description.
  • Users can click the 😊 icon in the input field to select and send images from a floating panel, similar to QQ or WeChat.
  • When a user says “learn,” learn_meme can add the most recent attachment to the library, automatically identifying its category and description.
  • The settings page manages the meme library, allowing upload, editing, export, and import of ZIP files. Two built-in libraries are ready to use out of the box.

The plugin depends only on node:sqlite and has no other third-party runtime dependencies. Its internal plugin ID remains dsh-expression for compatibility with the old package name.

Core Features

Text Token Image Sending

The interface displays meme images, but the model receives and outputs [meme: description] without URLs or markdown image syntax. This avoids triggering DSH’s image compliance checks. Think, trace, and tool calls remain plain text, while only chat bubbles display images. Quote differences ("" / "") are normalized before matching.

Emotion-Based Sampling

send_meme randomly samples several captions from six emotion buckets for the model to choose from:

Bucket Name Meaning
happy Happy, cute, adorable, affectionate
angry Angry
sad Sad, speechless, pleading
shy Shy
confused Confused, surprised
daily Daily (sleeping, working, good morning, etc.)

If not satisfied, you can switch emotions or search for more within the same tag.

AI Auto-Learning

learn_meme defaults to adding the user’s most recent attachment (no need to specify an attachment ID), but you can also pass attachmentId or imageUrl. Automatic image recognition depends on whether the current default model supports image input; if not, you can manually specify the tag and caption.

Meme Library Management & Switching

Two built-in libraries are included and ready to use without configuration:

  • official-001 (Official meme pack 1, 92 images) — default out of the box
  • dafeiyu-001 (Da Fei Yu, 49 whale-girl chibi images)

Switch between libraries via the “Current Library” dropdown in settings. The plugin scans built-in memes/* and subdirectories under the “Scan Directory” (default ~/.dsh/meme-packs) that contain index.db. Importing a ZIP places it in the scan directory and switches immediately. Settings are saved in ~/.dsh/dsh-expression.json and persist through plugin upgrades.

The settings page also supports: changing the scan path, exporting/importing library ZIPs, uploading and editing (category/description/keywords), and filtering/searching by category in Chinese.

One-Click Image Sending from Input Box

The 😊 button on the left of the chat input field opens a floating panel where you can search or browse thumbnails. Clicking an image sends [meme: description] directly, without needing the model to do it.

Installation & Setup

Published to npm as dsh-meme (current version 0.1.39), install it into any DSH profile (e.g., ~/.dsh/profiles/web/) with a single command:

dsh plugin --profile web add dsh-meme
# Equivalent to:
pnpm add dsh-meme

The old package name dsh-expression is deprecated; please use dsh-meme.

You can also install from GitHub or locally:

pnpm add github:yyh-001/dsh-meme
# Or
pnpm add file:/path/to/dsh-meme

Requires Node.js >= 20. pnpm has a default safety period of about 24 hours for new packages; recently published versions might be silently rolled back to older versions. If urgent, add dsh-meme to minimumReleaseAgeExclude in pnpm-workspace.yaml.

Community directory page: SkillHub — yyh-001/dsh-meme. SkillHub is an independent community site with no official affiliation to DeepSeek or High-Flyer.

Typical Usage

After installation, users can request images in natural language, and the model follows the tool chain:

User: Send a speechless meme
Model: send_meme tag=sad → random captions → append [meme: ...] to reply
Frontend: Renders image based on description, displayed as a meme in chat

Common model-side calls:

send_meme tag=sad limit=8          # Random 8 from sad bucket, pick one to append
send_meme tag=happy                # Happy/cute
learn_meme                         # Add most recent user image
learn_meme imageUrl="https://…"    # Add any image URL

Three conventions for the model (see send_meme tool description for full details):

  1. Write the entire [meme: description] from candidates exactly into the reply, without adding URLs or converting to markdown images.
  2. If no match, switch emotions or reply with text—don’t force send.
  3. Keep replies brief and let the image speak for itself—don’t repeat or describe the image content.

Sharing & Extending Libraries

Share with friends: Export a library from the settings page to get dsh-meme-pack-date.zip. The recipient can import it in their settings page for automatic switching. Must use the ZIP exported by the plugin; the “Download ZIP” on GitHub contains source code and will fail to import.

Host on a promo page: Unzip the exported package (containing index.db, manifest.json, memes/), create a new GitHub repository with the root files, add a previews/ folder with 6–12 thumbnails, and tag the repository with dsh-meme-pack. Promo page: yyh-001.github.io/dsh-meme.

Can be combined with plugins like dsh-companion for persona, memory, and messaging channels; image-sending capability is provided by dsh-meme.

Use Cases & Notes

Who it’s for: Developers and users who want to reliably send memes in DSH Web chats, use text tokens to bypass image compliance checks, or need local meme library management and learning.

Pre-use notes:

  • The plugin runs with the current DSH process permissions; review the source code and MIT license before installing.
  • learn_meme automatic image recognition relies on the model’s image input capability.
  • The built-in official-001 upstream anka-afk/astrbot-meme-pack-official-01 does not provide an explicit LICENSE; personal use is fine, but for public redistribution, retain the source attribution in manifest.json.
  • Fine-grained tags (e.g., baka, sleep) exist on disk, but the model primarily recognizes the six emotion buckets; when captions don’t match, the frontend normalizes quotes before matching.

Feedback and discussion: QQ group 993579665.

Conclusion

dsh-meme integrates meme indexing, sending conventions, and frontend rendering with DSH: models write [meme: description], users can also click 😊 to select and send images, and new memes can be learned to expand the library. With zero third-party dependencies, two built-in libraries, and a settings page for switching and sharing, it’s ideal for Harness scenarios where you want to “trade memes like in a chat app.”