DeepSeek Harness Plugin Hub

发布与管理完整 Harness Profiles,发现适合你的插件。

探索

插件目录环境预设文档中心动态

社区

发布插件联系我们报告问题

相关链接

Plugin Hub GitHubDeepSeek Harness 官方项目系统状态隐私说明
© 2026 DeepSeek Harness Plugin HubPowered byPaxTech

独立、非官方社区项目,与 DeepSeek 官方无隶属、授权或背书关系。

Xiaoyi — DeepSeek Harness 插件(DSH Plugin)
DeepSeek Harness Plugin Hub
ProfilesPlugins分类动态文档登录管理 Profiles
ProfilesPlugins分类动态文档登录
← Plugins
X

dsh-xiaoyi

Xiaoyi

一个 DSH(DeepSeek Harness)主机插件,可将 OpenClaw 模式下的 Huawei XiaoYi 连接到本地 DSH 会话。不依赖任何第三方组件,采用手写的精简 RFC6455 WebSocket 客户端。

插件会安装到这里;不确定时保持 web。

npx -y @deepseek-ai/dsh plugin --profile web add github:HangZhouXi/dsh-xiaoyi#921ebcf8c24e7a493036e1b99637c15c51f059ed
README兼容性版本

兼容性与来源证明

Xiaoyi 以 dsh-xiaoyi 发布,当前版本为 0.1.2。Plugin Hub 会校验它的 manifest,并保存精确安装来源,便于复现安装结果。

DSH 兼容范围
*
运行环境
any
发布来源
github
Registry 更新时间
2026/10/10

版本

0.1.2stable
2026/10/10

相关插件

正在加载相关插件…

最新版
0.1.2
DSH
*
HMR
重启进程
Tree shaking
未声明可安全裁剪
解包体积
未提供
文件数
未提供
Surface
any
许可证
MIT
发布源
github
GitHub
★ 0
周下载
0
最近提交
2026/10/10
查看源码 ↗
README Badge

点击下方 Badge 复制 Markdown,粘贴到 README 即可。

这是你的 Plugin?认领权益 · 优先安全扫描

验证 package.json 声明的 GitHub 仓库,即可管理这个公开页面。认领后,Hub 会优先安排当前版本的安全扫描,并在通过后公开展示结果。

认领这个 Plugin →
报告问题

相关插件

继续浏览 integrations-communication 分类下经过校验的插件。

Acp App@deepseek-ai/dsh-acp-appdsh ACP 配置文件包:基于 dsh-base 的仅限自动化的 JSON-RPC stdio 和进程生命周期管理Ab Publishdsh-ab-publish浏览器自动化发布工具,可登录任意网站并发布内容,整合为一个可发布的插件包Ab Wechat Scrapedsh-ab-wechat-scrape--- description: "树外 wechat_scrape 工具:获取微信公众号文章,过滤推广区块,并将每篇文章保存为 Markdown 文件,供此机器的 dsh 配置文件维护者使用。" kind: "package-reference" ---Remote Web Ui@linxin666/dsh-remote-web-ui通过扫码配对访问 dsh Web GUI,共享一个官方界面:设置按钮旁的二维码可将手机和 PC 配对到同一个 Web GUI(手机采用竖屏触控适配层,PC 使用完整桌面界面),通过一次性令牌和 r

README

dsh-xiaoyi

English | 简体中文

A DSH (DeepSeek Harness) host plugin that connects Huawei XiaoYi in OpenClaw mode to your local DSH session — voice, text and images from your phone reach the agent running on your own machine.

This is not a standalone chatbot. XiaoYi is only the entry point; what it connects to is your local DSH session (same tools, same working directory). There is no second agent.

Huawei XiaoYi on your phone  (anywhere)
   │  voice / text / images
   ▼
Huawei Cloud  wss://hag.cloud.huawei.com/openclaw/v1/ws/link
   │  long-lived connection (AK/SK auth + 30s heartbeat)
   ▼
This plugin  (runs inside the DSH host process)
   │
   ▼
DSH session  xiaoyi-listen-*

Prerequisites

This is not plug-and-play. Before installing, make sure you have all three:

#RequirementNotes
1A DSH hostDSH = DeepSeek Harness. This is a host-side plugin; without a host it cannot run.
2XiaoYi Open Platform credentials (OpenClaw mode)You need AK / SK / agentId. These are Huawei Cloud developer credentials you must apply for yourself on the XiaoYi Open Platform.
3Node.js ≥ 20The code uses the built-in fetch / FormData / Blob. Developed on Node 24.

If you cannot obtain item 2, you can still read this repository as a protocol reference implementation — index.js implements the XiaoYi/OpenClaw handshake, auth, heartbeat and JSON-RPC message exchange in full.

Where do AK / SK / agentId come from?

They are issued by Huawei. This project cannot create them for you and cannot tell you whether your account is eligible. You have to apply for them yourself:

  1. Register a Huawei developer account and complete real-name verification — https://developer.huawei.com/consumer/cn/register/
  2. Sign in to the XiaoYi Open Platform and create an agent — https://developer.huawei.com/consumer/cn/hag/hagindex.html#/ When creating it, choose the OpenClaw mode. Other modes are not compatible with this plugin.
  3. Take the values from the agent's detail page:
    • agentId — shown in the AgentCard block;
    • AK / SK — under Credentials → New credential. The SK is displayed only once, so copy it immediately.
  4. Add your own Huawei account to the agent's test whitelist. Until the agent is published, only whitelisted accounts can reach it; it takes effect after a few minutes.
  5. Official documentation for this mode — https://developer.huawei.com/consumer/cn/doc/doccenter-celia/openclaw-0000002518410344

Menu names, entry points and the review process are decided entirely by Huawei and may change at any time. If a step above no longer matches what you see, follow Huawei's own documentation rather than this file. This plugin only consumes the three credentials. It never asks Huawei for anything else on your behalf.


Features

  • Zero third-party dependencies. Only Node built-ins are used, including a hand-written minimal WebSocket client (RFC6455 client side: text frames, fragmentation reassembly, ping/pong, and handshake verification). Fewer packages in the plugin tree means fewer chances that one failed package takes the whole host down.
  • Complete protocol implementation. Auth signing, init handshake, heartbeat with stale-connection detection, JSON-RPC 2.0 streaming, and control messages (clearContext / tasks/cancel).
  • Inbound attachments. Images and files sent from XiaoYi are downloaded to disk, and their local paths are handed to the agent in the session (ready for read_image / read).
  • Outbound online files (experimental). Send local files back to XiaoYi (the protocol only accepts public https URLs; supports a local tunnel or a third-party image host). See the direction table below — this direction is not reliable.
  • Session reuse. On a cold start the plugin resumes the existing session instead of opening a new conversation every time.

What can travel in each direction

DirectionSupport
Phone → this plugin
(what you send to XiaoYi)
Text, voice (transcribed) and images/files all work. Attachments are downloaded to ~/.dsh/xiaoyi/media/ and their local paths are handed to the agent.
This plugin → phone
(what you get back in XiaoYi)
Text works — the reply body, plus anything sent with xiaoyi_send. Pushing an image or file back to the phone is unreliable: the protocol accepts only a public https URL, and the XiaoYi client is not guaranteed to render the file part. Treat xiaoyi_send_photo as experimental.

In short: the inbound direction is the reliable one. If your workflow depends on images or files arriving on your phone, do not rely on it.


Installation

1. Place the source

Put this directory anywhere you keep plugins. The conventional location is:

~/.dsh/plugin-sources/dsh-xiaoyi

2. Register it in your profile

Option A (recommended, one command):

# install from the GitHub repository
dsh plugin --profile web add git+https://github.com/HangZhouXi/dsh-xiaoyi

# or from npm (after it is published there)
dsh plugin --profile web add dsh-xiaoyi

Option B (edit by hand):

Edit ~/.dsh/profiles/web/package.json:

{
  "dsh": {
    "profile": {
      "bundles": [
        // ...
        "dsh-xiaoyi"          // ← add to bundles
      ]
    }
  },
  "dependencies": {
    // ...
    "dsh-xiaoyi": "git+file:///C:/Users/<you>/.dsh/plugin-sources/dsh-xiaoyi"
  }
}

A plain local path dependency also works: "dsh-xiaoyi": "file:../../plugin-sources/dsh-xiaoyi".

3. Install and cold-start

dsh plugin --profile web install

Then cold-start the DSH host. (Host-side plugins are not applied by hot reload — a cold start is required.)

4. Provide credentials

Edit ~/.dsh/xiaoyi/state.json:

{
  "enabled": true,
  "ak": "XiaoYi Open Platform AK",
  "sk": "XiaoYi Open Platform SK",
  "agentId": "agentId of your OpenClaw-mode agent",
  "wsUrl": "wss://hag.cloud.huawei.com/openclaw/v1/ws/link",
  "sessionId": "",
  "cwd": "C:\\Users\\<you>\\Desktop",
  "publicBaseUrl": "",
  "imageHost": ""
}
FieldPurpose
enabledMaster switch. false disconnects the channel.
ak / sk / agentIdXiaoYi Open Platform credentials. All three are required.
wsUrlWebSocket endpoint. Leave as the default unless Huawei changes it.
sessionIdThe DSH session to reuse. Normally written by the plugin itself.
cwdWorking directory for the session. Must be writable.
publicBaseUrlOnly for outbound files in local mode: the public https base URL of your tunnel.
imageHostOptional default publisher for outbound files. Set "catbox" to make catbox.moe the default; leave empty to stay local-only.

You can also let the agent configure these at runtime with the xiaoyi_set tool (changes take effect immediately and reconnect).

Log file: ~/.dsh/xiaoyi/xiaoyi.log


Agent tools

ToolPurpose
xiaoyi_statusChannel status: whether credentials are complete, whether the WebSocket is connected, the listening session id, queue length, last error, message counters.
xiaoyi_setUpdate credentials / switch (ak, sk, agentId, wsUrl, enabled). Takes effect immediately on the live connection.
xiaoyi_sendPush a short message to the current XiaoYi conversation (useful as a long-task completion notice).
xiaoyi_send_photoSend a local image or file to XiaoYi (the protocol only accepts public https; see "Outbound files" below).
xiaoyi_reconnectForce a disconnect and reconnect (after changing credentials, or when the link looks stale).

HTTP routes

PathPurpose
GET /xiaoyi/stateJSON status.
GET /xiaoyi/connectStart the channel and make sure the listening session is ready.
GET /xiaoyi/disconnectStop the channel.
GET /xiaoyi/public/<filename>Serves published outbound files. Filenames carry a random component and are not guessable.

Protocol summary

Verified against the published artifacts of @ynhcj/xiaoyi. This project does not depend on that package.

StageDetail
Endpointwss://hag.cloud.huawei.com/openclaw/v1/ws/link
Auth headersx-access-key=AK, x-sign=Base64(HMAC-SHA256(SK, ts)), x-ts=milliseconds, x-agent-id=agentId
Handshake{"msgType":"clawd_bot_init","agentId":"..."}
HeartbeatEvery 30s {"msgType":"heartbeat","agentId":"...","timestamp":...} plus a protocol-level ping
InboundJSON-RPC 2.0, method="message/stream"; sessionId=params.sessionId, taskId=params.id, messageId=top-level id; text in params.message.parts[kind=text].text, attachments in parts[kind=file].file{name,mimeType,uri}
Outbound{"msgType":"agent_response", agentId, sessionId, taskId, msgDetail:"<JSON-RPC string>"}
Outbound frame kindsresult.kind="status-update" (acknowledge with state=working), result.kind="artifact-update" (the body, closed with lastChunk=true, final=true)
ControlclearContext / tasks/cancel / action="clear" → reply with the matching JSON-RPC response

Outbound files (xiaoyi_send_photo)

The Part sent back to the client is { url, filename, mediaType } — only public https URLs are accepted; there is no "upload bytes" interface. Hence two modes:

modeBehaviourPrivacy
local (default)The file is copied to ~/.dsh/xiaoyi/public/ and served by this plugin's own route; pair it with a tunnel (e.g. localhost.run) and point state.publicBaseUrl at it.The file never leaves your machine (except through your tunnel).
catboxUploads to the third-party host catbox.moe.The file is sent to a third party. Must be requested explicitly.

local mode requires state.publicBaseUrl; without it the tool returns an error and never silently falls back to an image host.


Security and privacy

  • Credentials stay local. They live in ~/.dsh/xiaoyi/state.json, which is excluded by .gitignore. They are never committed and never logged (the log only records whether a value is present).
  • Inbound attachments are protected against SSRF. The inbound uri comes from an external message and is treated as untrusted input. Only http/https is allowed. Every hop of a redirect chain is checked before it is fetched (redirect: 'manual'), and each host is judged two ways: structurally, and by what it actually resolves to. IPv6 addresses are parsed into bytes rather than compared as strings, so equivalent spellings cannot slip through. Blocked ranges: loopback, private, link-local, unique-local, multicast, site-local, IPv4-mapped (::ffff:a.b.c.d), NAT64, 6to4 and Teredo — including cloud metadata endpoints such as 169.254.169.254.
  • Attachments are size-capped. 50 MB per file, read as a stream, so a lying content-length cannot exhaust memory.
  • Published URLs are unguessable. Filenames include 8 random bytes.
  • ⚠️ The HTTP routes themselves have no authentication. /xiaoyi/state and /xiaoyi/public/* are reachable by anyone who can reach the port. Do not expose the DSH port directly to the internet; if you use a tunnel, prefer one with authentication or an unguessable hostname.

Known limitations

  • A file or image cannot be pushed back to the phone reliably. The protocol only accepts a public https URL for outbound files, and whether the XiaoYi client renders the resulting file part is outside this project's control. Text replies are unaffected.
  • Outbound attachments must use a public URL. This is a protocol constraint, not a shortcut in the implementation.
  • Inbound attachment URLs are pre-signed and expire in roughly 30 minutes, so they must be fetched immediately. This plugin does exactly that; if a download fails, the link has most likely expired.
  • The media/ directory is never cleaned automatically. Prune ~/.dsh/xiaoyi/media/ yourself periodically.
  • Platform-side policies may change. OpenClaw mode, endpoints and field names can be adjusted by Huawei at any time; long-term availability is not guaranteed.

Uninstall

  1. Remove dsh-xiaoyi from bundles and dependencies in ~/.dsh/profiles/web/package.json.
  2. dsh plugin --profile web install
  3. Cold-start the host.
  4. For a complete cleanup, delete ~/.dsh/xiaoyi/ (it contains credentials and logs).

Troubleshooting

SymptomWhat to check
Nothing happens after installingDid you cold-start? Host-side plugins are not applied by hot reload.
status reports ready:falseOne of AK / SK / agentId is missing.
Cannot connect, lastError mentions a handshake failureIs wsUrl correct? Can the machine reach hag.cloud.huawei.com:443?
Connects then keeps reconnectingLook for "stale connection" in the log; if nothing (including pong) arrives for over 90 seconds the plugin reconnects on purpose.
XiaoYi messages get no replyCheck ~/.dsh/xiaoyi/xiaoyi.log and confirm in the host log that the plugin loaded.
Reply says the DSH session is not readyThe very first request after a host start has to create the session; send the message again shortly after.
Sent images do not arriveThis direction is unreliable by design — see "What can travel in each direction". The protocol also requires a public https URL, so check publicBaseUrl and whether your tunnel is still alive.

License

MIT

Disclaimer

Please read DISCLAIMER.md before use.