🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

人格化伴侣插件 wanghehe123/dsh-Friend

DeepSeek Harness
wanghehe12381 天前有提交已提供中文文档扫描:含敏感能力

给 AI 装上 Live2D 形象、语音与本地记忆陪你工作

27.5/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/9/16 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add wanghehe123/dsh-Friend
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么[目录]—
dsh 原生插件 · tool
暂无时间戳·判据 →
装得上吗[实装验证]✓
本站已真实安装成功
非静态推断
L4 · 真实安装等级说明 →
数据截至 2026/09/27·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/04·判据 →
还在维护吗[仓库]—
更新放缓:最近一次提交在 81 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →

可信度证据

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

读写/删除本地文件发起外部网络请求
查看扫描证据(共 131 处,展示前 108 条)
  • 写入本地文件
    packages/dsh-friend-growth/src/atomic.ts:49
    await mkdir(directory, { recursive: true })
  • 写入本地文件
    packages/dsh-friend-growth/src/atomic.ts:52
    await writeFile(tmpPath, contents, 'utf8')
  • 写入本地文件
    packages/dsh-friend-growth/src/atomic.ts:56
    await rename(tmpPath, filePath)
  • 删除本地文件
    packages/dsh-friend-growth/src/atomic.ts:58
    await rm(tmpPath, { force: true }).catch(() => undefined)
  • 读取本地文件
    packages/dsh-friend-growth/src/commit.ts:171
    return await readFile(path, 'utf8')
  • 读取本地文件
    packages/dsh-friend-growth/src/memory-md.ts:121
    return await readFile(path, 'utf8')
  • 读取本地文件
    packages/dsh-friend-growth/src/store.ts:142
    entries = await readdir(root, { withFileTypes: true })
  • 写入本地文件
    packages/dsh-friend-growth/src/store.ts:160
    await mkdir(this.batchDir(input.batchId), { recursive: true })
  • 写入本地文件
    packages/dsh-friend-growth/src/store.ts:214
    await mkdir(join(this.batchDir(batchId), 'expand'), { recursive: true })
  • 读取本地文件
    packages/dsh-friend-growth/src/store.ts:256
    entries = await readdir(dir)
  • 读取本地文件
    packages/dsh-friend-growth/src/store.ts:299
    const raw = await readFile(path, 'utf8')
  • 读取本地文件
    packages/dsh-friend-growth/src/store.ts:314
    await stat(path)
  • 写入本地文件
    packages/dsh-friend-memory/src/atomic.ts:49
    await mkdir(directory, { recursive: true })
  • 写入本地文件
    packages/dsh-friend-memory/src/atomic.ts:52
    await writeFile(tmpPath, contents, 'utf8')
  • 写入本地文件
    packages/dsh-friend-memory/src/atomic.ts:56
    await rename(tmpPath, filePath)
  • 删除本地文件
    packages/dsh-friend-memory/src/atomic.ts:58
    await rm(tmpPath, { force: true }).catch(() => undefined)
  • 读取本地文件
    packages/dsh-friend-memory/src/auto-summary.ts:201
    const raw = await readFile(watermarkPath(store.dataDir, store.slug), 'utf8')
  • 读取本地文件
    packages/dsh-friend-memory/src/import-kokoro.ts:91
    const sourceMtimeMs = (await stat(dbPath)).mtimeMs
  • 读取本地文件
    packages/dsh-friend-memory/src/import-kokoro.ts:112
    const afterMtime = (await stat(dbPath)).mtimeMs
  • 写入本地文件
    packages/dsh-friend-memory/src/import-kokoro.ts:256
    await mkdir(dest, { recursive: true })
  • 读取本地文件
    packages/dsh-friend-memory/src/import-kokoro.ts:276
    const finalMtime = (await stat(dbPath)).mtimeMs
  • 读取本地文件
    packages/dsh-friend-memory/src/import-kokoro.ts:392
    const raw = await readFile(importMarkPath(dataDir), 'utf8')
  • 读取本地文件
    packages/dsh-friend-memory/src/import-kokoro.ts:409
    const parsed: unknown = JSON.parse(await readFile(path, 'utf8'))
  • 读取本地文件
    packages/dsh-friend-memory/src/import-kokoro.ts:421
    return await readFile(path, 'utf8')
  • 读取本地文件
    packages/dsh-friend-memory/src/retriever.ts:108
    const raw = await readFile(absolute, 'utf8')
  • 读取本地文件
    packages/dsh-friend-memory/src/retriever.ts:139
    return sliceLines(await readFile(absolute, 'utf8'), range)
  • 读取本地文件
    packages/dsh-friend-memory/src/retriever.ts:272
    raw = await readFile(file, 'utf8')
  • 读取本地文件
    packages/dsh-friend-memory/src/retriever.ts:377
    const entries = await readdir(current, { withFileTypes: true })
  • 读取本地文件
    packages/dsh-friend-memory/src/retriever.ts:393
    const info = await stat(path)
  • 读取本地文件
    packages/dsh-friend-memory/src/retriever.ts:404
    return (await stat(path)).isDirectory()
  • 读取本地文件
    packages/dsh-friend-memory/src/routes.ts:57
    const text = await readFile(absolute, 'utf8')
  • 读取本地文件
    packages/dsh-friend-memory/src/routes.ts:151
    entries = await readdir(root, { withFileTypes: true })
  • 读取本地文件
    packages/dsh-friend-memory/src/routes.ts:169
    if ((await stat(absolute)).isFile()) {
  • 读取本地文件
    packages/dsh-friend-memory/src/store.ts:287
    const entries = await readdir(root, { withFileTypes: true })
  • 写入本地文件
    packages/dsh-friend-memory/src/store.ts:298
    await mkdir(destDir, { recursive: true })
  • 写入本地文件
    packages/dsh-friend-memory/src/store.ts:300
    await rename(from, to)
  • 删除本地文件
    packages/dsh-friend-memory/src/store.ts:319
    await rm(oldest, { force: true })
  • 写入本地文件
    packages/dsh-friend-memory/src/store.ts:324
    await rename(from, memoryBackupPath(this.dataDir, this.slug, index + 1))
  • 写入本地文件
    packages/dsh-friend-memory/src/store.ts:328
    await copyFile(live, newest)
  • 读取本地文件
    packages/dsh-friend-memory/src/store.ts:339
    const contents = await readFile(backup, 'utf8')
  • 读取本地文件
    packages/dsh-friend-memory/src/store.ts:509
    const entries = await readdir(current, { withFileTypes: true })
  • 读取本地文件
    packages/dsh-friend-memory/src/store.ts:530
    return await readFile(path, 'utf8')
  • 读取本地文件
    packages/dsh-friend-memory/src/store.ts:541
    await stat(path)
  • 写入本地文件
    packages/dsh-friend-persona/src/presets.ts:105
    await mkdir(destRoot, { recursive: true })
  • 写入本地文件
    packages/dsh-friend-persona/src/presets.ts:110
    await mkdir(dirname(to), { recursive: true })
  • 读取本地文件
    packages/dsh-friend-persona/src/sections.ts:182
    const raw = readFileSync(personaFilePath(dataDir, slug), 'utf8')
  • 读取本地文件
    packages/dsh-friend-persona/src/sections.ts:192
    const raw = readFileSync(beliefsFilePath(dataDir, slug), 'utf8')
  • 读取本地文件
    packages/dsh-friend-persona/src/store.ts:80
    const entries = await readdir(root, { withFileTypes: true })
  • 读取本地文件
    packages/dsh-friend-persona/src/store.ts:98
    return { slug, ...readPersonaFile(await readFile(filePath, 'utf8')) }
  • 写入本地文件
    packages/dsh-friend-persona/src/store.ts:106
    await mkdir(this.charactersDir(), { recursive: true })
  • 写入本地文件
    packages/dsh-friend-persona/src/store.ts:108
    await mkdir(join(this.charactersDir(), slug), { recursive: true })
  • 删除本地文件递归
    packages/dsh-friend-persona/src/store.ts:128
    await rm(dir, { recursive: true, force: true })
  • 写入本地文件
    packages/dsh-friend-persona/src/store.ts:146
    await mkdir(join(this.charactersDir(), DEFAULT_PERSONA_SLUG), { recursive: true })
  • 读取本地文件
    packages/dsh-friend-persona/src/store.ts:155
    const entries = await readdir(root, { withFileTypes: true })
  • 写入本地文件
    packages/dsh-friend-persona/src/store.ts:173
    await mkdir(directory, { recursive: true })
  • 写入本地文件
    packages/dsh-friend-persona/src/store.ts:176
    await writeFile(tmpPath, serializePersona(persona), 'utf8')
  • 写入本地文件
    packages/dsh-friend-persona/src/store.ts:177
    await rename(tmpPath, filePath)
  • 删除本地文件
    packages/dsh-friend-persona/src/store.ts:179
    await rm(tmpPath, { force: true }).catch(() => undefined)
  • 读取本地文件
    packages/dsh-friend-persona/src/store.ts:186
    await stat(path)
  • 读取本地文件
    packages/dsh-friend-settings/src/characters.ts:24
    entries = await readdir(root, { withFileTypes: true })
  • 读取本地文件
    packages/dsh-friend-settings/src/characters.ts:37
    const raw = JSON.parse(await readFile(personaPath, 'utf8')) as unknown
  • 读取本地文件
    packages/dsh-friend-settings/src/characters.ts:59
    const raw = JSON.parse(await readFile(personaFilePath(dataDir, safe), 'utf8')) as unknown
  • 写入本地文件
    packages/dsh-friend-settings/src/characters.ts:77
    await mkdir(dir, { recursive: true })
  • 写入本地文件
    packages/dsh-friend-settings/src/characters.ts:90
    await writeFile(personaFilePath(dataDir, safe), `${JSON.stringify(body, null, 2)}\n`, 'utf8')
  • 读取本地文件
    packages/dsh-friend-settings/src/export-zip.ts:29
    entries.push({ name, data: new Uint8Array(await readFile(absolute)) })
  • 读取本地文件
    packages/dsh-friend-settings/src/export-zip.ts:76
    entries = await readdir(current, { withFileTypes: true })
  • 发起网络请求
    packages/dsh-friend-settings/src/update-check.ts:65
    const response = await fetch(url, {
  • 读取本地文件
    packages/dsh-friend-stage/src/index.ts:762
    const file = await readFile(filePath)
  • 读取本地文件
    packages/dsh-friend-stage/src/models.ts:123
    if (typeof fromEnv === 'string' && fromEnv.length > 0 && existsSync(fromEnv)) {
  • 读取本地文件
    packages/dsh-friend-stage/src/models.ts:129
    if (existsSync(candidate)) return candidate
  • 读取本地文件
    packages/dsh-friend-stage/src/models.ts:170
    const document = parseModel3Json(await readFile(join(staging, model3Relative), 'utf8'))
  • 写入本地文件
    packages/dsh-friend-stage/src/models.ts:173
    await mkdir(dirname(dest), { recursive: true })
  • 删除本地文件递归
    packages/dsh-friend-stage/src/models.ts:174
    await rm(dest, { recursive: true, force: true })
  • 删除本地文件递归
    packages/dsh-friend-stage/src/models.ts:178
    await rm(staging, { recursive: true, force: true })
  • 删除本地文件递归
    packages/dsh-friend-stage/src/models.ts:237
    await rm(target, { recursive: true, force: true })
  • 读取本地文件
    packages/dsh-friend-stage/src/models.ts:258
    const model3 = await readFile(join(dataRoot, model.model3Relative), 'utf8')
  • 读取本地文件
    packages/dsh-friend-stage/src/models.ts:266
    const raw = await readFile(mapPath, 'utf8')
  • 读取本地文件
    packages/dsh-friend-stage/src/models.ts:269
    const model3 = await readFile(join(dataRoot, model.model3Relative), 'utf8')
  • 写入本地文件
    packages/dsh-friend-stage/src/models.ts:315
    await writeFile(mapPath, `${JSON.stringify(map, null, 2)}\n`, 'utf8')
  • 写入本地文件
    packages/dsh-friend-stage/src/models.ts:322
    await mkdir(dirname(dest), { recursive: true })
  • 删除本地文件递归
    packages/dsh-friend-stage/src/models.ts:323
    await rm(dest, { recursive: true, force: true })
  • 删除本地文件递归
    packages/dsh-friend-stage/src/models.ts:335
    await rm(staging, { recursive: true, force: true })
  • 写入本地文件
    packages/dsh-friend-stage/src/models.ts:446
    await rename(nested, holding)
  • 写入本地文件
    packages/dsh-friend-stage/src/models.ts:448
    await rename(join(holding, name), join(staging, name))
  • 删除本地文件递归
    packages/dsh-friend-stage/src/models.ts:450
    await rm(holding, { recursive: true, force: true })
  • 写入本地文件
    packages/dsh-friend-stage/src/models.ts:511
    await mkdir(dirname(path), { recursive: true })
  • 发起网络请求
    packages/dsh-friend-stage/src/overlay.ts:598
    return fetch(input, init)
  • 写入本地文件
    packages/dsh-friend-tts/src/cache.ts:95
    await mkdir(directory, { recursive: true })
  • 读取本地文件
    packages/dsh-friend-tts/src/cache.ts:101
    names = await readdir(directory)
  • 读取本地文件
    packages/dsh-friend-tts/src/cache.ts:112
    const meta = JSON.parse(await readFile(join(directory, name), 'utf8')) as CacheMeta
  • 读取本地文件
    packages/dsh-friend-tts/src/cache.ts:117
    const audio = await readFile(join(directory, `${id}.audio`))
  • 删除本地文件
    packages/dsh-friend-tts/src/cache.ts:156
    await rm(join(directory, `${id}.json`), { force: true })
  • 删除本地文件
    packages/dsh-friend-tts/src/cache.ts:157
    await rm(join(directory, `${id}.audio`), { force: true })
  • 写入本地文件
    packages/dsh-friend-tts/src/cache.ts:164
    await mkdir(directory, { recursive: true })
  • 写入本地文件
    packages/dsh-friend-tts/src/cache.ts:172
    await writeFile(join(directory, `${entry.id}.audio`), entry.audio)
  • 写入本地文件
    packages/dsh-friend-tts/src/cache.ts:173
    await writeFile(join(directory, `${entry.id}.json`), JSON.stringify(meta))
  • 读取本地文件
    shared/client-inject-align.test.ts:44
    await access(path)
  • 读取本地文件
    shared/client-inject-align.test.ts:83
    const entries = await readdir(PACKAGES_DIR, { withFileTypes: true })
  • 读取本地文件
    shared/client-inject-align.test.ts:90
    const manifest = JSON.parse(await readFile(manifestPath, 'utf8')) as ClientManifest
  • 读取本地文件
    shared/package-boundary.test.ts:62
    entries = await readdir(dir, { withFileTypes: true })
  • 读取本地文件
    shared/package-boundary.test.ts:98
    const pkgEntries = await readdir(PACKAGES_DIR, { withFileTypes: true })
  • 读取本地文件
    shared/package-boundary.test.ts:106
    const source = await readFile(file, 'utf8')
  • 读取本地文件
    shared/tsdown.client.test.ts:54
    return JSON.parse(await readFile(manifestPath, 'utf8')) as Awaited<
  • 读取本地文件
    shared/tsdown.client.test.ts:67
    const dirs = await readdir(packagesDir, { withFileTypes: true })
  • 读取本地文件
    shared/tsdown.client.test.ts:73
    if (!existsSync(manifestPath)) continue
  • 读取本地文件
    shared/tsdown.client.test.ts:74
    const manifest = JSON.parse(await readFile(manifestPath, 'utf8')) as {
  • 读取本地文件
    shared/tsdown.client.test.ts:314
    const runtimePayload = await readFile(
  • 读取本地文件
    shared/tsdown.client.test.ts:326
    const present = packages.filter((pkg) => existsSync(pkg.clientJs))
扫描于 2026/11/4(0 天前) · 范围 全包扫描 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

社区实装还没有人打卡 · 装过的第一个就是你
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-client-connection@deepseek-ai/dsh-client-runtime@deepseek-ai/dsh-client-ui-conversation@deepseek-ai/dsh-client-ui-slots@deepseek-ai/dsh-host-webserver@deepseek-ai/dsh-settings@deepseek-ai/schemastery
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • Live2D形象展示
  • 语音交互
  • 本地记忆存储

人格化伴侣插件 for DeepSeek Harness:角色卡、语音、Live2D、本地记忆与工作陪伴。

README

由 DeepSeek 最新模型翻译生成
dsh-Friend · DeepSeek Harness 人格化伴侣 dsh-Friend 是 DeepSeek Harness(DSH)的人格化伴侣插件:人设卡、语音对话、Live2D 舞台、本机记忆、成长故事、工作陪伴。挂在现有 dsh web 上,一条命令装齐。 衍生自 Kokoro Engine(MIT, © 2026 chyinan)。 dsh-Friend 主界面 Live2D 舞台 打开 /friend/pet,或看 dsh web 右下角的悬浮层。配置中心 → 形象 → 当前 Live2D 切换模型。 源码或 npm 安装后自带 奶龙(Cubism 4.2 / moc v4)。官方 Hiyori 要在本机同意条款后下载,不进仓库。也可以导入自己的 Cubism zip(需含 model3.json,上限 200 MB)。 表情按钮:平静、笑、尴尬、难过、惊讶、困倦、生气。回复里的 [expr:smile] 会驱动形象,不会出现在悬浮气泡和朗读里。 | 独立舞台 | 形象选择 | | Live2D 舞台 | 形象设置 | Cubism 5.3(moc v5+)目前画不出来,请用 SDK 4.2 导出。奶龙已是 moc v4。
展开完整文档(README 剩余 1 节)
dsh-Friend · DeepSeek Harness 人格化伴侣

dsh-Friend 是 DeepSeek Harness(DSH)的人格化伴侣插件:人设卡、语音对话、Live2D 舞台、本机记忆、成长故事、工作陪伴。挂在现有 dsh web 上,一条命令装齐。

衍生自 Kokoro Engine(MIT, © 2026 chyinan)。

dsh-Friend 主界面

Live2D 舞台

打开 /friend/pet,或看 dsh web 右下角的悬浮层。配置中心 → 形象 → 当前 Live2D 切换模型。

源码或 npm 安装后自带 奶龙(Cubism 4.2 / moc v4)。官方 Hiyori 要在本机同意条款后下载,不进仓库。也可以导入自己的 Cubism zip(需含 model3.json,上限 200 MB)。

表情按钮:平静、笑、尴尬、难过、惊讶、困倦、生气。回复里的 [expr:smile] 会驱动形象,不会出现在悬浮气泡和朗读里。

| 独立舞台 | 形象选择 |
| Live2D 舞台 | 形象设置 |

Cubism 5.3(moc v5+)目前画不出来,请用 SDK 4.2 导出。奶龙已是 moc v4。

奶龙 runtime 在仓库 models/naiwa-live2d/naiwa-live2d-v3-sdk4.2-runtime.zip,首次挂载解压到本机 vendor/nailong/。

人设

配置中心「人设」改名字、称呼、性格、背景、说话风格。Live2D 不在这张卡上选,统一走「形象」。支持多角色和酒馆卡导入。

人设

语音合成

配置中心「语音合成」选引擎、试听、调语速和自动朗读。

| 引擎 | 说明 |
| Edge | 不用 key,晓晓 / 云希等 |
| 百炼 | 阿里云 Qwen-TTS / CosyVoice(dashscope) |
| MiniMax | 官方 t2a_v2 |
| OpenAI 兼容 | 实现了 /audio/speech 的网关 |
| 浏览器 | speechSynthesis |

舞台指示默认不朗读。API key 只存在 host settings。

语音合成

语音输入

配置中心「语音输入」:

- 引擎:Chrome Web Speech,或自定义 ASR 端点
- 模式:按住说话、开关切换、自动监听
- 识别完可自动发给伴侣;打开「说话时打断朗读」后,开口会停掉当前 TTS

语音输入

Safari 没有可用的 Web Speech,请配自定义 ASR 端点。

记忆与成长

记忆写在本机 Markdown:MEMORY.md、memory/YYYY-MM-DD.md、USER.md。可以空闲自动小结,按钟点蒸馏到长期记忆。

成长是三步向导:基础设定 → 模拟人生 → 草稿审核后再写入记忆。也可以单独打开 /friend/growth。

成长向导

工作陪伴

只看会话事件的类型、时长和成败,不读文件内容和用户正文。档位:仅动作、动作 + 气泡、再加语音。可设安静时段和冷却。

「悬浮与桌面」能弹出独立窗口(Document PiP 或 window.open)。可选薄壳:

cd apps/friend-shell && cargo run

dsh 没起来时显示引导页,起来后切到 /friend/pet。

设置

设置 → dsh-Friend 是总开关。「打开配置中心」进入分区小窗,地址是 #/friend/config/,刷新还停在当前分区。

设置卡片

| 分区 | 内容 |
| 模型 | 对话 / 小结 / 成长,可继承 dsh 当前模型 |
| 人设 | 角色卡 |
| 语音合成 | TTS 引擎与试听 |
| 语音输入 | ASR 引擎、模式、快捷键 |
| 形象 | 当前 Live2D、导入 zip、帧率 |
| 记忆 | 开关、小结、蒸馏时刻 |
| 成长 | 三步向导 |
| 工作陪伴 | 反应档位与冷却 |
| 悬浮与桌面 | 位置、弹出、壳心跳 |
| 数据与关于 | 导出 zip(不含 cache/、vendor/) |

安装

DSH 插件通过 dsh plugin 装进 profile(dsh web 对应 web)。推荐装聚合包 @wishp3/dsh-friend-all,一个包装齐全部子包。

方式一:从 npm 安装(推荐)

插件已发布到 npm(@wishp3 scope):

dsh plugin --profile web add @wishp3/dsh-friend-all@0.1.0

装完重启 dsh web。

版本钉在当前发布版 0.1.0。升级时把 @0.1.0 换成新版本号。

如果这个 profile 以前跑过 link-profile,先把 ~/.dsh/profiles/web/cordis.patch.yml 恢复成 [],再装 npm 包。两套清单叠在一起会报 duplicate loader entry id。

方式二:从 GitHub 仓库安装(改代码调试)

包已经在 npm 上,仓库安装只给本地改代码用(需要 Node.js >= 22 与 pnpm)。本机 pnpm 11 没有 TTY 时会退出,先:

export CI=true

1. 克隆仓库
git clone https://github.com/wanghehe123/dsh-Friend.git
cd dsh-Friend

2. 安装依赖并构建
pnpm install
pnpm -r build

3. 把全家桶链接进 web profile
node scripts/link-profile.mjs
dsh plugin --profile web add link:$(pwd)/packages/dsh-friend-all

4. 重启 dsh web
dsh web

profile 目录不是 pnpm workspace,聚合包里的 workspace:* 会回退拉 npm。
改本地代码必须先跑 node scripts/link-profile.mjs,否则改的是已发布包,不是这份仓库的 lib/。

逐步说明见 docs/dev-loop.md。

单独安装某个插件

不想装全家桶时,可以按包名单独装:

dsh plugin --profile web add @wishp3/dsh-friend-stage # Live2D 舞台
dsh plugin --profile web add @wishp3/dsh-friend-persona # 人设
dsh plugin --profile web add @wishp3/dsh-friend-tts # 语音合成
dsh plugin --profile web add @wishp3/dsh-friend-asr # 语音输入
dsh plugin --profile web add @wishp3/dsh-friend-memory # 记忆
dsh plugin --profile web add @wishp3/dsh-friend-growth # 成长
dsh plugin --profile web add @wishp3/dsh-friend-reactions # 工作陪伴
dsh plugin --profile web add @wishp3/dsh-friend-settings # 配置中心

单独装时请同时装 @wishp3/dsh-friend-shared,以及你用到的包之间的依赖(例如舞台会用到 ASR)。不确定就装聚合包。

验证与卸载

重启 dsh web 之后:

- 设置导航出现 dsh-Friend
- GET http://127.0.0.1:3080/friend/pet 返回 200
- 形象列表里能看到奶龙和 Hiyori

也可以 dsh --profile web --dump-config 看插件层在不在。侧边栏或悬浮层没出来,多半是装完没重启。

卸载:dsh plugin --profile web remove @wishp3/dsh-friend-all,然后重启。开发链接用 node scripts/link-profile.mjs --unlink。

开发

export CI=true
pnpm test
pnpm typecheck
node scripts/aggregate.mjs --check
node scripts/release-scan.mjs --pack

壳:cd apps/friend-shell && cargo test。发布说明:docs/release.md。

来源与版权

| 部分 | 来源 | 许可 |
| 插件逻辑 | 衍生自 Kokoro Engine | MIT(chyinan;本项目追加版权行) |
| Hiyori FREE / Cubism Core | Live2D 官方 | 用户同意条款后本机下载,不进仓库 |
| 本仓库其余源码 | wanghehe123 | MIT |

友情链接

- dsh-web-ui —— DSH Web UI 插件与皮肤集合
- dshfind —— DeepSeek Harness 学习与分享社区
- deepseek-plugin-store —— 社区插件商店
- dsh-pet —— 官方工作台吉祥物
- dsh-plugin topic

Star 历史

Star History Chart
预览分享卡片长什么样 ↓wanghehe123/dsh-Friend
分享 · DeepSeek Harness Hub
wanghehe123/dsh-Friend

给 AI 装上 Live2D 形象、语音与本地记忆陪你工作

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部