Connects a Feishu self-built app over WebSocket, routes each chat to an independent DSH agent session, and streams replies through a Card JSON 2.0 card with plain-text fallback.
Install
# from a prebuilt release tarball
dsh plugin --profile web add "https://github.com/andyfan1094/dsh-feishu/releases/download/v0.2.2/dsh-feishu-0.2.2.tgz"
# from GitHub (first run asks for allowBuilds approval — follow the hint, retry)
dsh plugin --profile web add github:andyfan1094/dsh-feishu
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
中文文档 | English
Standalone Feishu self-built app integration for DSH.
What it does
- Receives Feishu text and rich text (post) messages over the official WebSocket long connection; links and mentions are kept, while an embedded image is downloaded and preserved as an image input. Other media remains a readable placeholder.
- Downloads image messages through the official resource API into a local media directory, saves them through DSH's attachment service, and sends native
{ type: 'image', attachment }content blocks to the selected agent model. Failed downloads or attachment admission degrade to a path-based vision prompt or plain-text notice. - Creates or resumes one independent top-level DSH agent/session per Feishu chatId; it never reuses a Web conversation.
- Attaches every current and persisted
session-feishu*session to the real DSH workspace that owns itscwd. New sessions receive飞书 · <first meaningful message>titles; generic greetings begin as飞书会话and upgrade when meaningful text arrives, while existing manual titles remain untouched. - Follows the DSH default model by default, or uses a Feishu-specific provider, model, and model-declared reasoning effort.
- Composes each Feishu Agent from a configurable Agent preset (
cordisby default), inheriting the Host file sandbox and approval policy. - Adds an OK emoji reaction to the original Feishu message as the immediate acknowledgement.
- Falls back to a short text acknowledgement if the reaction API is unavailable.
- Opens a Feishu Card JSON 2.0 streaming card at
turn/startwith a blue header. Status, notation-sized plain-text tool progress, the Markdown answer, and the separatedhr+ notation-sized metadata row use independent elements. Tool-only events never resend the answer element, while cumulative answer updates preserve CardKit's prefix-streaming behavior so only the new suffix is animated. A one-second footer-only heartbeat keeps model, reasoning effort, and elapsed time current and stops on completion, cancellation, errors, and disposal. - Falls back to ordinary text when CardKit streaming APIs are unavailable or fail, so the final answer is not lost.
- Tolerates the DSH startup race where a configured model adapter registers after this plugin: the Feishu WebSocket starts immediately and session creation waits briefly for
NO_ADAPTERto clear. - Sends errors and disposed-session notices back to the same chat.
- Uses the configured Feishu application API, so no custom group webhook is required.
Screenshots

Install
Download the newest dsh-feishu-*.tgz from Releases and add it to the profile:
dsh plugin --profile web add D:\downloads\dsh-feishu-0.2.0.tgz
Restart the DSH Web host after installation, then complete the profile configuration below.
For local development, install from a checkout instead:
dsh plugin --profile web add link:D:/项目/dsh-feishu
Profile configuration
Add the plugin to the profile bundle list and configure the row in the profile patch. The shipped bundle row is disabled until credentials are configured:
- id: dsh-feishu
config:
enabled: true
appId: cli_xxx
appSecret: your-secret
allowUsers:
- ou_xxx
ack: true
ackReaction: OK
provider: ''
model: ''
reasoningEffort: ''
agentPreset: cordis
The allowUsers list is required for business messages. An empty list rejects all users.
Leave both provider and model empty to follow the current DSH default selection. The Web panel reads reasoning efforts from llm.resolveModelInfo(provider, model) and only offers efforts the selected model declares.
Changing provider, model, reasoning effort, or Agent preset disposes every live Feishu Agent. The update is transactional: if the replacement bridge cannot start, the stored configuration and prior bridge are restored. Session ids use a v2 configuration fingerprint, so legacy sessions without meta.agentPreset remain preserved but are not resumed under a different tool composition; the next Feishu message creates or resumes the matching v2 session.
Commands
- /status shows this Feishu chat's independent session and its actual provider, model, reasoning effort, and Agent preset.
- /stop cancels this Feishu chat's session task.
- /help shows the command list.
The plugin has a Host integration and a Web configuration panel. It uses session/event and agent/* Host events, registers loopback-only /api/dsh-feishu/* routes, and does not modify DSH core source.
Links
More in this category
xmanrui/dsh-im★ 1636
Connect IM bots to DeepSeek Harness via QR codes or bot credentials (9 channels: Feishu, WeChat, DingTalk, WeCom, QQ, Slack, Telegram, Discord, and WhatsApp).
shaobeichen/dsh-pocket★ 1558
Remote phone access to the DSH Web UI: scan a QR code for LAN or public (cloudflared tunnel) access with real-time sync, a mobile-adaptive layout, and a settings tab.
inclusionAI/Avernet#deepseek-harness-channel-bcn★ 677
Connects DeepSeek Harness to Avernet's Bot Collaboration Network over WebSocket V2, with automatic onboarding, isolated agent sessions, tool-call events, and multi-bot routing tools.
omdsh-dev/dsh-notification★ 85
Desktop notifications for turn completions, with per-outcome controls and keyword rules.
whyihaveyou/dsh-suite#plugin-notify★ 56
IM webhook and local notifications on turn completion, errors, or approval (Feishu/WeCom/DingTalk/Slack/Discord/custom).
omdsh-dev/dsh-lark★ 55
Lark/Feishu bot channel for DeepSeek Harness: each chat drives its own agent, and tool approvals, model questions, and plan reviews return as cards answered by a button or a reply. Switch workspace and model from the chat (`/cd`, `/model`, `/new`), and run several bots that keep separate sessions and can hand turns to each other in one group.
Community comments
Comments are public GitHub Discussions. Loading them connects to GitHub and Giscus; a GitHub account is required to post.