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

智能体角色扮演 Firefox2100/dsh-agentic-roleplay

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

让 AI 主持并扮演角色,陪你推进持久剧情

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

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

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

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:待复验
是什么
dsh 原生插件 · tool
装得上吗
曾在 dsh 0.2.0-rc.2 下真实安装成功,但当前 dsh 已更新至 0.2.1-rc.5,本站尚未在新版下复验
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 19 天前
档位由哪些信号合成

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 55 处,展示前 50 条)
  • 读取本地文件
    eval/audit.mjs:18
    const { dimensions } = JSON.parse(readFileSync(file, 'utf8'))
  • 发起网络请求
    eval/audit.mjs:110
    const response = await fetch(`${url.replace(/ +$/, '')}/chat/completions`, {
  • 写入本地文件
    eval/audit.mjs:155
    if (out !== undefined) writeFileSync(out, `${JSON.stringify(report, null, 2)}\n`)
  • 删除本地文件递归
    eval/audit.test.mjs:44
    after(() => { server.close(); rmSync(folder, { recursive: true, force: true }) })
  • 执行外部命令固定命令
    eval/fidelity.mjs:162
    const readLog = (file) => execFileSync('/usr/bin/zstd', ['-dc', file], { maxBuffer: 1 << 30 }).toString('utf8').split('\n').filter(Boolean).map(line =
  • 读取本地文件
    eval/fidelity.mjs:171
    const logs = readdirSync(sessions).flatMap(folder => readdirSync(join(sessions, folder)).filter(name => existsSync(join(sessions, folder, name, 'sessi
  • 读取本地文件
    eval/fidelity.mjs:171
    const logs = readdirSync(sessions).flatMap(folder => readdirSync(join(sessions, folder)).filter(name => existsSync(join(sessions, folder, name, 'sessi
  • 读取本地文件
    eval/lib.mjs:15
    const text = JSON.parse(readFileSync(join(starters, folder, 'world.json'), 'utf8')).opening_message
  • 发起网络请求
    eval/lib.mjs:24
    const login = await fetch(url, { redirect: 'manual' })
  • 发起网络请求
    eval/lib.mjs:31
    const response = await fetch(`${this.base}/roleplay-api${path}`, { ...init, headers: { ...init.headers, cookie: this.cookie, 'content-type': 'applicat
  • 执行外部命令固定命令
    eval/lib.mjs:131
    const ends = execFileSync('zstd', ['-dc', file], { maxBuffer: 1 << 30 }).toString('utf8').split('\n').filter(Boolean).map(line => JSON.parse(line)).fi
  • 执行外部命令固定命令
    eval/lib.mjs:140
    const rows = execFileSync('zstd', ['-dc', file], { maxBuffer: 1 << 30 }).toString('utf8').split('\n').filter(Boolean).map(line => JSON.parse(line))
  • 读取本地文件
    eval/lib.mjs:157
    for (const folder of readdirSync(root)) {
  • 读取本地文件
    eval/lib.mjs:159
    if (existsSync(file)) return file
  • 发起网络请求
    eval/player.mjs:60
    const response = await fetch(`${this.url}/chat/completions`, {
  • 读取本地文件
    eval/run.mjs:22
    for (const file of readdirSync(join(here, 'scenarios')).filter(name => name.endsWith('.mjs')).sort()) {
  • 写入本地文件
    eval/run.mjs:104
    mkdirSync(join(here, 'results'), { recursive: true })
  • 写入本地文件
    eval/run.mjs:106
    writeFileSync(file, `${JSON.stringify(report, null, 2)}\n`)
  • 读取本地文件
    eval/run.mjs:115
    const baseline = JSON.parse(readFileSync(baselineFile, 'utf8'))
  • 读取本地文件
    packages/dsh-agentic-roleplay-core/src/doctor.ts:46
    if (id === undefined || !isSessionId(id) || !existsSync(sessionDatabase(sessionsDir(), id))) return undefined
  • 读取本地文件
    packages/dsh-agentic-roleplay-core/src/doctor.ts:68
    return id !== undefined && isSessionId(id) && existsSync(sessionDatabase(sessionsDir(), id)) ? liveSettings(sessionFolder(sessionsDir(), id)).prompts.
  • 读取本地文件
    packages/dsh-agentic-roleplay-core/src/index.ts:165
    const lorebookLibrary = new Lorebooks({ root: () => root.path, authoring: lorebookAuthoring, importMessage: lorebookImportMessage, get maxUploadBytes(
  • 读取本地文件
    packages/dsh-agentic-roleplay-core/src/index.ts:311
    }, archive: id => archiveSession({ agent, sessionsDir: deps.sessionsDir }, id), restore: id => restoreSession({ agent, sessionsDir: deps.sessionsDir }
  • 读取本地文件
    packages/dsh-agentic-roleplay-core/src/index.ts:311
    }, archive: id => archiveSession({ agent, sessionsDir: deps.sessionsDir }, id), restore: id => restoreSession({ agent, sessionsDir: deps.sessionsDir }
  • 读取本地文件
    packages/dsh-agentic-roleplay-core/src/index.ts:318
    if (!isSessionId(id) || !existsSync(sessionDatabase(sessionsDir, id))) throw new SessionNotFoundError(`there is no session "${id}"`)
  • 读取本地文件
    packages/dsh-agentic-roleplay-core/src/index.ts:355
    if (!isSessionId(id) || !existsSync(sessionDatabase(sessionsDir(), id))) throw new SessionNotFoundError(`no session "${id}"`)
  • 读取本地文件
    packages/dsh-agentic-roleplay-core/src/lorebook-authoring.ts:33
    return directory !== undefined && existsSync(join(directory, 'lore')) && readdirSync(join(directory, 'lore')).length > 0
  • 读取本地文件
    packages/dsh-agentic-roleplay-core/src/lorebook-authoring.ts:33
    return directory !== undefined && existsSync(join(directory, 'lore')) && readdirSync(join(directory, 'lore')).length > 0
  • 读取本地文件
    packages/dsh-agentic-roleplay-core/src/preset-authoring.ts:29
    return preset !== undefined && existsSync(join(presetDirectory(library(), preset), PROMPTS_FOLDER))
  • 写入本地文件
    packages/dsh-roleplay-state/src/sessions.ts:42
    mkdirSync(sessionsDir, { recursive: true })
  • 写入本地文件
    packages/dsh-roleplay-state/src/sessions.ts:44
    mkdirSync(folder)
  • 删除本地文件递归
    packages/dsh-roleplay-state/src/sessions.ts:52
    rmSync(folder, { recursive: true, force: true })
  • 删除本地文件递归
    packages/dsh-roleplay-state/src/sessions.ts:64
    rmSync(sessionFolder(sessionsDir, id), { recursive: true, force: true })
  • 读取本地文件
    packages/dsh-roleplay-state/src/sessions.ts:87
    ids = readdirSync(sessionsDir, { withFileTypes: true }).filter(entry => entry.isDirectory() && isSessionId(entry.name)).map(entry => entry.name)
  • 读取本地文件
    packages/dsh-roleplay-state/src/sessions.ts:127
    if (!existsSync(snapshotPath(sessionsDir, fromId, name))) throw new NotFoundError(`session ${fromId} has no snapshot "${name}"`)
  • 写入本地文件
    packages/dsh-roleplay-state/src/sessions.ts:130
    mkdirSync(target)
  • 写入本地文件
    packages/dsh-roleplay-state/src/sessions.ts:137
    if ('snapshot' in source) copyFileSync(snapshotPath(sessionsDir, fromId, source.snapshot), file)
  • 写入本地文件
    packages/dsh-roleplay-state/src/sessions.ts:139
    if (existsSync(join(from, 'settings.json'))) copyFileSync(join(from, 'settings.json'), join(target, 'settings.json'))
  • 读取本地文件
    packages/dsh-roleplay-state/src/sessions.ts:139
    if (existsSync(join(from, 'settings.json'))) copyFileSync(join(from, 'settings.json'), join(target, 'settings.json'))
  • 写入本地文件
    packages/dsh-roleplay-state/src/sessions.ts:140
    if (options.keep.length > 0) mkdirSync(join(target, SNAPSHOT_FOLDER))
  • 删除本地文件递归
    packages/dsh-roleplay-state/src/sessions.ts:145
    rmSync(target, { recursive: true, force: true })
  • 删除本地文件
    packages/dsh-roleplay-state/src/sessions.ts:164
    rmSync(aside, { force: true })
  • 读取本地文件
    packages/dsh-roleplay-state/src/sessions.ts:173
    return readdirSync(join(sessionFolder(sessionsDir, id), SNAPSHOT_FOLDER)).filter(file => file.endsWith('.sqlite')).map(file => file.slice(0, -'.sqlite
  • 删除本地文件
    packages/dsh-roleplay-state/src/sessions.ts:181
    rmSync(snapshotPath(sessionsDir, id, name), { force: true })
  • 读取本地文件
    packages/dsh-roleplay-state/src/sessions.ts:191
    if (!existsSync(source)) throw new NotFoundError(`session ${id} has no snapshot "${name}"`)
  • 删除本地文件
    packages/dsh-roleplay-state/src/sessions.ts:195
    for (const sidecar of ['-wal', '-shm', '-journal']) rmSync(`${database}${sidecar}`, { force: true })
  • 读取本地文件
    packages/dsh-roleplay-state/src/sessions.ts:206
    if (!existsSync(database)) return undefined
  • 读取本地文件
    packages/dsh-roleplay-state/src/store.ts:351
    if (location !== ':memory:' && !existsSync(location)) throw new NotFoundError(`no session database at ${location}`)
  • 读取本地文件
    packages/dsh-roleplay-state/src/store.ts:381
    if (existsSync(target)) return
  • 写入本地文件
    packages/dsh-roleplay-state/src/store.ts:382
    mkdirSync(dirname(target), { recursive: true })
扫描于 2026/10/31(1 天前) · 范围 全包扫描 · 来源 GitHub 仓库

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

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

DeepSeek Harness 的智能体角色扮演套件

README

由 DeepSeek 最新模型翻译生成
DSH Agentic Roleplay 为 DeepSeek Harness 打造的持久化、智能体驱动的角色扮演。这个包提供游戏主持人循环、自主角色智能体、持久的世界与会话状态、创作工具、多媒体服务,以及专用的角色扮演界面。 本项目由 Firefox2100 独立维护,不是 DeepSeek Harness 官方项目。 文档 - English documentation - 简体中文文档 - 安装 - 世界创作 - 世界格式 - 插件开发 - 维护者指南 包 | 包 | 作用 | | @dsh-agentic-roleplay/all | 可安装的完整包,包含全部体验。 | | @dsh-agentic-roleplay/core | 界面、编排、创作、媒体,以及文件系统集成。 | | @dsh-agentic-roleplay/state | 独立的 DSH 服务,负责会话数据库、仓库、回忆,以及面向模型的记录工具。 | | dsh-roleplay-model | 私有的规范模型包,打包进已发布的插件。 | 安装 把完整包安装到 DSH 配置档: dsh plugin --profile <profile> add @dsh-agentic-roleplay/all 重启配置档,然后在 Settings → Role Play 下配置存储根目录。
展开完整文档(README 剩余 1 节)
DSH Agentic Roleplay

为 DeepSeek Harness 打造的持久化、智能体驱动的角色扮演。这个包提供游戏主持人循环、自主角色智能体、持久的世界与会话状态、创作工具、多媒体服务,以及专用的角色扮演界面。

本项目由 Firefox2100 独立维护,不是 DeepSeek Harness 官方项目。

文档

- English documentation
- 简体中文文档
- 安装
- 世界创作
- 世界格式
- 插件开发
- 维护者指南

包

| 包 | 作用 |
| @dsh-agentic-roleplay/all | 可安装的完整包,包含全部体验。 |
| @dsh-agentic-roleplay/core | 界面、编排、创作、媒体,以及文件系统集成。 |
| @dsh-agentic-roleplay/state | 独立的 DSH 服务,负责会话数据库、仓库、回忆,以及面向模型的记录工具。 |
| dsh-roleplay-model | 私有的规范模型包,打包进已发布的插件。 |

安装

把完整包安装到 DSH 配置档:

dsh plugin --profile <profile> add @dsh-agentic-roleplay/all

重启配置档,然后在 Settings → Role Play 下配置存储根目录。AI 功能由兼容的服务商插件提供,详见 AI services。

开发

pnpm install
pnpm run typecheck
pnpm run test
pnpm run build

需要 Node.js 22 或更高版本,以及 pnpm。改动持久化数据、智能体循环、提示词或 DSH 集成之前,请先看维护者指南。

协议

GPL-3.0-only
预览分享卡片长什么样 ↓Firefox2100/dsh-agentic-roleplay
分享 · DeepSeek Harness Hub
Firefox2100/dsh-agentic-roleplay

让 AI 主持并扮演角色,陪你推进持久剧情

回到顶部