基于 DeepSeek Harness 的非官方 Android AI 助手,支持语音交互、手机操作、本地记忆与知识库。
36.5/100
综合分
2
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/11/3 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
自动兼容检查未通过:缺少 main/exports/bin 入口声明;仓库 package.json 标记 private,未发布到 npm,需从源码安装;安装清单取自 core/package.json。以下命令仍可尝试,但可能失败。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add skynit/DSHX该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:需留意
是什么
dsh 原生插件 · tool
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 1 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
⚠︎ 实装验证未通过(unknown · 2026/10/26) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查需源码安装缺少 main/exports/bin 入口声明;仓库 package.json 标记 private,未发布到 npm,需从源码安装;安装清单取自 core/package.json
展开查看检查明细 ↓
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
✗npm 包dshx-core(未发布到 npm,仅可源码安装)
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖要求 0.2.1-rc.2 · 最新 0.2.1-rc.5 兼容
✗入口文件缺少入口声明
源码安装时若 pnpm 拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑。
验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/11/3 07:16:04
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件读取剪贴板或密钥环境变量发起外部网络请求
查看扫描证据(共 363 处,展示前 83 条)
- 读取本地文件core/assistant.mjs:11
try { settings = JSON.parse(await readFile(join(directory, 'settings.json'), 'utf8')); } - 写入本地文件core/assistant.mjs:46
mkdirSync(directory, { recursive: true, mode: 0o700 }); - 发起网络请求core/assistant.mjs:290
const response = await globalThis.fetch(...args); - 读取密钥环境变量core/host.mjs:319
token: process.env.DSHX_POLICY_TOKEN, - 写入本地文件core/knowledge-model.mjs:170
await mkdir(directory, { recursive: true, mode: 0o700 }); - 写入本地文件core/knowledge-model.mjs:171
await appendFile(path.join(directory, 'usage.jsonl'), `${JSON.stringify(event)}\n`, { mode: 0o600 }); - 写入本地文件core/knowledge-search.mjs:254
await mkdir(path.dirname(filename), { recursive: true, mode: 0o700 }); - 写入本地文件core/knowledge-search.mjs:258
await rename(temporary, filename); - 读取本地文件core/knowledge-search.mjs:263
if ((await stat(filename)).size > maxBytes) throw modelFailure('INDEX'); - 读取本地文件core/knowledge-search.mjs:264
return JSON.parse(await readFile(filename, 'utf8')); - 读取本地文件core/knowledge-search.mjs:360
const metadataBytes = await readFile(path.join(directory, 'records.json')); - 读取本地文件core/knowledge-search.mjs:362
if (!Number.isSafeInteger(expectedBytes) || expectedBytes > 128 * 1024 * 1024 || (await stat(path.join(directory, 'vectors.f32'))).size !== expectedBy - 读取本地文件core/knowledge-search.mjs:363
const bytes = await readFile(path.join(directory, 'vectors.f32')); - 读取本地文件core/knowledge-search.mjs:388
const metadataBytes = await readFile(path.join(directory, 'records.json')); - 写入本地文件core/knowledge-search.mjs:463
await mkdir(directory, { recursive: true, mode: 0o700 }); - 读取本地文件core/knowledge-store.mjs:267
const info = await fs.lstat(current); - 写入本地文件core/knowledge-store.mjs:278
try { await fs.mkdir(target, { mode: 0o700 }); } catch (cause) { if (cause.code !== 'EEXIST') throw cause; } - 读取本地文件core/knowledge-store.mjs:279
const info = await fs.lstat(target); - 删除本地文件core/knowledge-store.mjs:326
await fs.rm(target, { recursive: true, force: true }); - 写入本地文件core/knowledge-store.mjs:331
await fs.mkdir(this.root, { recursive: true, mode: 0o700 }); - 读取本地文件core/knowledge-store.mjs:332
const info = await fs.lstat(this.root); - 读取本地文件core/knowledge-store.mjs:333
if (!info.isDirectory() || info.isSymbolicLink() || await fs.realpath(this.root) !== this.root) fail('READ'); - 读取本地文件core/knowledge-store.mjs:1092
try { await fs.lstat(this.path(target)); fail('CONFLICT'); } catch (cause) { if (cause.code !== 'ENOENT') throw cause; } - 写入本地文件core/knowledge-store.mjs:1093
await fs.rename(this.path(stage), this.path(target)); await this.sync(`sources/${source.id}`); await this.sync('sources'); - 读取本地文件core/knowledge-store.mjs:1379
try { await fs.lstat(this.path(target)); fail('CONFLICT'); } catch (cause) { if (cause.code !== 'ENOENT') throw cause; } - 写入本地文件core/knowledge-store.mjs:1381
await fs.rename(this.path(stage), this.path(target)); await this.sync(`sources/${row.id}`); await this.sync('sources'); - 读取本地文件core/local-route.mjs:64
export const localRouter = createRouter(JSON.parse(readFileSync(new URL('./local-routes.json', import.meta.url), 'utf8'))); - 读取本地文件core/plugins.mjs:33
if ((await lstat(modules)).isSymbolicLink()) throw new Error('插件安装目录不能是外部链接'); - 读取本地文件core/plugins.mjs:34
root = await realpath(modules); - 读取本地文件core/plugins.mjs:39
const target = await realpath(path); - 读取本地文件core/plugins.mjs:46
const info = await stat(target); - 读取本地文件core/plugins.mjs:54
for (const entry of await readdir(target)) { - 读取本地文件core/plugins.mjs:65
const manifest = JSON.parse(await readFile(target, 'utf8')); - 执行外部命令来自配置/变量core/plugins.mjs:201
const child = spawn(process.execPath, [join(core, 'lib/node_modules', entry), ...args, ...fixed], { - 读取本地文件core/policy.mjs:63
const info = await lstat(target); - 读取本地文件core/policy.mjs:67
return realpath(target); - 读取本地文件core/policy.mjs:108
const root = await realpath(workspace); - 读取本地文件core/policy.mjs:115
try { canonical = join(await realpath(ancestor), ...missing); break; } - 读取本地文件core/policy.mjs:119
try { info = await lstat(ancestor); } - 读取本地文件core/recover.mjs:32
try { return await lstat(path); } catch (error) { if (error.code === 'ENOENT') return null; throw error; } - 读取本地文件core/recover.mjs:38
return parse(await readFile(path, 'utf8'), { maxAliasCount: 50 }) ?? []; - 读取本地文件core/recover.mjs:95
const template = parseDocument(await readFile(new URL(`./lib/node_modules/@deepseek-ai/dsh-web-app/presets/${id}.patch.yml`, import.meta.url), 'utf8') - 删除本地文件core/recover.mjs:151
} finally { await unlink(temporary).catch(error => { if (error.code !== 'ENOENT') throw error; }); } - 写入本地文件core/recover.mjs:159
await mkdir(path, { recursive: true }); - 写入本地文件core/recover.mjs:178
await mkdir(archive, { recursive: true }); - 写入本地文件core/recover.mjs:179
const move = async (base, name, label) => rename(join(base, name), join(archive, label)); - 读取本地文件core/recover.mjs:180
for (const name of await readdir(home)) if (name !== '.dsh') await move(home, name, `home-${name}`); - 读取本地文件core/recover.mjs:181
for (const name of await readdir(dsh)) { - 写入本地文件core/recover.mjs:189
await mkdir(profile, { recursive: true }); - 删除本地文件core/recover.mjs:193
await unlink(pending); - 读取本地文件core/specimen.mjs:269
if ((await realpath(path)) !== path || !(await lstat(path)).isFile() || (await lstat(path)).size > 20000) throw new Error(); - 读取本地文件core/specimen.mjs:269
if ((await realpath(path)) !== path || !(await lstat(path)).isFile() || (await lstat(path)).size > 20000) throw new Error(); - 读取本地文件core/specimen.mjs:270
const body = await readFile(path, 'utf8'); - 删除本地文件递归core/test.mjs:26
after(() => rm(directory, { recursive: true, force: true })); - 删除本地文件递归core/test.mjs:28
after(() => rm(workspace, { recursive: true, force: true })); - 读取本地文件core/test.mjs:54
assert.equal(result.workspace.path, await realpath(process.env.DSHX_WORKSPACE)); - 读取本地文件core/test.mjs:56
assert.equal((await stat(process.env.DSHX_WORKSPACE)).isDirectory(), true); - 写入本地文件core/test.mjs:60
await writeFile(join(project.path, 'notes.txt'), '保留工作文件'); - 读取本地文件core/test.mjs:67
assert.equal(await readFile(join(project.path, 'notes.txt'), 'utf8'), '保留工作文件'); - 读取本地文件core/test.mjs:72
assert.equal(await readFile(join(project.path, 'notes.txt'), 'utf8'), '保留工作文件'); - 写入本地文件core/test.mjs:83
await writeFile(target, '同名文件'); - 读取本地文件core/test.mjs:86
assert.equal(await readFile(target, 'utf8'), '同名文件'); - 删除本地文件core/test.mjs:90
await rm(target); - 写入本地文件core/test.mjs:91
await mkdir(target); - 写入本地文件core/test.mjs:92
await writeFile(join(target, 'notes.txt'), '已有内容'); - 读取本地文件core/test.mjs:96
assert.equal((await f.initialize()).workspace.path, await realpath(target)); - 写入本地文件core/test.mjs:110
const custom = join(dir, 'custom'); await mkdir(custom); - 写入本地文件core/test.mjs:145
await writeFile(join(dir, 'settings.json'), JSON.stringify(settings)); - 删除本地文件递归core/test.mjs:335
await rm(dir, { recursive: true, force: true }); - 发起网络请求core/test.mjs:488
await fetch(`${fixture.url}/models`); - 发起网络请求core/test.mjs:492
await fetch(`${fixture.url}/credentials/refresh`); - 发起网络请求core/test.mjs:642
fixture.collect(prepared.stream({ ...request('translator', undefined), ...prepared.config })) - 执行外部命令来自配置/变量core/test.mjs:703
const child = spawn(process.execPath, ['--input-type=module', '-e', source], { - 执行外部命令来自配置/变量core/test.mjs:736
const child = spawn(process.execPath, ['--input-type=module', '-e', source], { stdio: ['ignore', 'pipe', 'pipe'] }); - 删除本地文件core/test.mjs:790
await rm(ledger); - 执行外部命令来自配置/变量core/test.mjs:802
const result = spawnSync(git, args, { env, encoding: 'utf8', timeout: 10000 }); - 执行外部命令来自配置/变量core/test.mjs:828
const child = spawn(git, ['clone', `http://127.0.0.1:${server.address().port}/`, target], { env }); - 执行外部命令来自配置/变量core/test.mjs:844
const child = spawn(name.includes('/') ? name : join(core, 'bin', name), args, { - 删除本地文件core/test.mjs:880
await rm(original); - 读取密钥环境变量core/test.mjs:896
assert.ok(process.env.DSHX_TEST_TLS_CERT && process.env.DSHX_TEST_TLS_KEY, 'Provide the temporary localhost TLS certificate'); - 读取密钥环境变量core/test.mjs:897
const tls = createHttpsServer({ cert: await readFile(process.env.DSHX_TEST_TLS_CERT), key: await readFile(process.env.DSHX_TEST_TLS_KEY) }, - 执行外部命令来自配置/变量core/test.mjs:949
const run = (args, extra = {}) => spawnSync(name, args, { cwd, env: { ...env, ...extra }, encoding: 'utf8', timeout: 15000 }); - 读取密钥环境变量core/test.mjs:999
` User ${process.env.DSHX_TEST_SSH_USER}`, ` IdentityFile "${process.env.DSHX_TEST_SSH_KEY}"`,
扫描于 2026/11/2(1 天前) · 范围 全包扫描 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
README
由 DeepSeek 最新模型翻译生成DSHX
在 Android 上使用 DeepSeek 官方智能体引擎的 AI 助手。
文字与语音交互 · 手机工具 · 长期记忆 · 本机知识库
快速开始 · 工作原理 · 功能一览 · 使用场景 · 常见问题 · 说明文档
想让手机上的助手读取文件、操作应用,并在后续对话中使用你保存的偏好和资料?DSHX 将这些能力放进同一个 Android 应用,提供文字聊天、语音入口和原生管理页面。
DSHX 将 DeepSeek 官方 deepseek-harness(简称 dsh) 移植到 Android。dsh 是随应用提供、由应用启动的智能体引擎,负责模型请求、对话记录和工具调度;DSHX 的 Android 应用负责页面、引擎启停、系统权限及手机、本地语音等能力。普通对话使用你配置的模型服务,本机保存数据与本地模型各有独立用途。
[!NOTE]
当前版本为 0.1.3,开发调试版本,尚未完成正式发布验收。功能接入情况与真实模型、设备验证范围分别说明,见当前验证边界。
快速开始
设备要求
项目声明最低 Android 8.0(API 26,即 Android 系统接口版本),部分能力另有更高系统要求。
展开完整文档(README 剩余 1 节)
DSHX 在 Android 上使用 DeepSeek 官方智能体引擎的 AI 助手。 文字与语音交互 · 手机工具 · 长期记忆 · 本机知识库 快速开始 · 工作原理 · 功能一览 · 使用场景 · 常见问题 · 说明文档 想让手机上的助手读取文件、操作应用,并在后续对话中使用你保存的偏好和资料?DSHX 将这些能力放进同一个 Android 应用,提供文字聊天、语音入口和原生管理页面。 DSHX 将 DeepSeek 官方 deepseek-harness(简称 dsh) 移植到 Android。dsh 是随应用提供、由应用启动的智能体引擎,负责模型请求、对话记录和工具调度;DSHX 的 Android 应用负责页面、引擎启停、系统权限及手机、本地语音等能力。普通对话使用你配置的模型服务,本机保存数据与本地模型各有独立用途。 [!NOTE] 当前版本为 0.1.3,开发调试版本,尚未完成正式发布验收。功能接入情况与真实模型、设备验证范围分别说明,见当前验证边界。 快速开始 设备要求 项目声明最低 Android 8.0(API 26,即 Android 系统接口版本),部分能力另有更高系统要求。聊天页需要 Android System WebView 126 或更新版本:它是 Android 提供、由应用创建的网页容器,负责显示 dsh 的聊天页面,与处理请求的引擎分别运行。设备兼容性仍需按具体机型验证。 语音输入还需要手机安装并启用系统语音识别服务:它由系统或用户安装的语音应用提供,DSHX 通过 Android 标准接口调用,负责收音、判断讲话结束并返回文字;是否联网取决于该服务。它与 DSHX 自带、只负责检测唤醒短语的本机关键词模型分别工作。应用不再下载整句语音识别模型;播报使用在线服务,需要网络。 已有与设备架构匹配的 APK(Android 安装包)时,安装后直接进入启动并配置。从源码生成开发包时,按下面的步骤操作。 从源码构建 以下命令面向 Linux 开发机与 ARM64 手机,在仓库根目录执行。开发环境需要: - JDK 17:编译 Java/Kotlin 的工具集。 - Android SDK 36:Android 系统接口及构建工具;另安装 NDK 28.2.13676358 和 CMake 3.22.1,用于编译和组织 C/C++ 原生库。 - Python 3.11+、Node.js、npm、curl、dpkg-deb、readelf,以及 /usr/include/node/node_api.h 头文件。 在本地 local.properties 中填写实际 SDK 路径,例如 sdk.dir=/你的/Android/Sdk,该文件由 Git 忽略。必要时通过 ANDROID_NDK_HOME 指定 NDK 路径。准备好环境后执行: 准备语音运行库、唤醒资源和本机推理源码。 python3 tools/voice.py prepare 为 ARM64 手机生成 dsh 及 Android 适配运行包。 python3 tools/core.py build --abi arm64-v8a 按本机 JDK 位置调整 JAVA_HOME。 JAVA_HOME=/usr/lib/jvm/java-17-openjdk ./gradlew :app:assembleDebug 首次准备会联网下载锁定依赖,无需聊天模型密钥。生成的安装包位于 app/build/outputs/apk/debug/app-debug.apk。x86_64 模拟器需将运行包参数改为 --abi x86_64,再重新构建 APK;每个 APK 只包含所选架构的运行资源。 使用 adb(Android SDK 提供的设备连接与安装工具)时,连接设备并授权调试,只有一个目标设备时执行: adb devices adb install -r app/build/outputs/apk/debug/app-debug.apk 多设备选择、依赖准备和定向测试见构建、安装与验证。 启动并配置 1. 打开 DSHX,在“工作台”点击“启动 dsh”。应用校验并安装随包提供的运行文件,然后启动引擎。 2. 在工作台点击“页面导航”,选择“对话”,配置自己的模型服务地址、模型名称和所需凭据。云端模型需要联网,费用由所选服务决定。 3. 发送下面的消息,确认当前会话中出现实际模型回答: 你好,请用一句话介绍你能做什么。 4. 按需进入“设置”:在“语音交互”检查系统识别与播报,在“任务分工”配置可选的小模型,在“手机操作与权限”开启手机能力,在“助手与资料 → 知识库”管理资料、记忆、文件和技能。可选本机文字模型仍需下载并校验;播报默认使用 Edge TTS,也可配置火山语音合成或音频生成,无需下载播报模型。 引擎启动、聊天网页加载和模型回答是三个独立检查点。首次使用以实际收到回答为准。 工作原理 会话由 dsh 创建,保存一段对话与工具事件;工具是引擎注册给模型的命名操作,模型提出名称和参数后,由程序执行并把结果返回。Android 应用管理引擎运行,并通过本机通信连接交接手机操作等请求。 flowchart TD U[用户:文字或语音输入] --> A[Android 应用] A --> D[dsh:会话与工具调度] D <--> M[用户配置的模型服务] D <--> F[文件与命令工具] D <--> P[Android 手机能力] D <--> K[本机记忆与知识资料] A <--> V[语音与模型分工] 文字从聊天页面进入 dsh;语音由手机系统服务收音、识别后交给正式会话,有限的简单文字任务也可按规则交给本机小模型。dsh 请求配置的模型,收到工具调用后执行对应操作,再将结果交给模型继续处理,最终返回回答。语音页逐步显示回答,并把可朗读文字按短句交给所选播报服务;思考内容和工具参数不会进入播报。手机工具通过本机通信转交 Android 应用执行,执行前仍需检查能力开关与系统授权。 长期记忆保存用户管理或自动整理得到的偏好、事实和经验;知识库保存用户主动导入的参考资料。它们与完整对话记录分别存储,按需要提供有限背景或检索结果。谁创建各组件、请求如何流转以及数据如何保存,见术语与整体架构和典型执行流程。 功能一览 | 能力 | 当前用途 | 使用条件与说明 | | 文字聊天与助手设置 | 多轮对话,自定义助手名字、身份和回答要求 | 配置模型服务;界面 · 助手设置 | | 文件、命令与附件 | 读写文件、搜索内容、执行前台命令、交付附件,并保留用户手动终端 | 使用应用已有访问权限;文件与工具 | | 手机操作 | 28 个手机工具,覆盖应用查找、界面观察与操作、分享和设备能力 | 对应能力开关与系统授权;手机能力 | | 语音对话 | 系统语音识别、本机关键词唤醒、回答逐段播报,以及语音或按钮打断 | 需系统识别服务与麦克风权限;默认使用 Edge TTS,火山需自行配置凭据与开通服务,播报均需联网;语音说明 | | 任务分工 | 文字或语音中的简单任务使用默认本地、导入本地或在线模型;截图可单独指定图片模型 | 本机文字模型需下载或导入,截图理解需支持图片的服务;模型分工 | | 长期记忆 | 保存、管理和召回偏好、事实与经验,按需自动整理 | 长期记忆和自动整理默认关闭;记忆说明 | | 本机知识库 | 导入 UTF-8 编码的 Markdown、TXT,进行关键词与语义检索 | 关键词检索在本机,语义检索和摘要需另配服务;知识库 | | 备份与归档 | 分别导出会话数据和知识资料,用于恢复或迁移 | 两种格式覆盖不同数据;存储范围 · 归档说明 | | 微应用 | 在手机内让 dsh 创建带页面、逻辑和独立数据的应用,支持可选后台入口 | 在 DSHX 内打开;手机能力按需授权;微应用说明 | | 插件 | 复用官方插件安装、启用和工具扩展机制 | 需满足 Android 兼容与工具调用条件;插件说明 | Full(完全权限)是应用为有效会话提供的工具准入模式,只使用应用已有的访问权限;它不授予 root(系统最高权限),也不替代 Android 系统授权。 使用场景 以下是可以尝试的任务示例,执行效果取决于所选模型、实际资料和设备权限。 连续语音对话与打断 在“设置 → 语音交互”确认系统识别服务可用,并保存、试听播报设置。启动 dsh、配置聊天模型后,通过“页面导航 → 语音”开始对话,按提示授予麦克风权限,等页面显示“正在听”再说问题。 识别完成后立即显示你的文字,助手回答随后逐步补入,并按短句播报。“语音打断”默认开启:确认新的讲话内容后停止上一轮回答,并继续收取本次问题;也可点击麦克风“打断回答”。系统识别服务是否支持中间文字、扬声器回声及设备环境都会影响自动打断效果。结束语音或切换到文字对话会停止录音、合成与播放。火山音频生成服务需等待每段完整音频,延迟与 Edge 的分块播放不同。详见语音与播报。 整理文件并交付结果 读取我提供的这份笔记,整理为待办清单,保存成 Markdown 文件并交给我。 助手通过文件工具读取和写入,生成的文件可作为附件交付。文件访问、前台命令与用户直接操作的终端有不同入口,见文件与工具。 从自己的资料中查找答案 在知识库中导入一份包含备份步骤的 Markdown 笔记后,询问: 这份笔记中关于备份的步骤是什么?请给出资料引用。 关键词查找在本机执行;语义检索需用户指定的嵌入模型,把文字转成便于比较语义的一组数字,它与生成回答的模型用途不同。摘要也需单独配置。见知识资料与检索。 让助手协助操作手机 启用所需手机能力并完成系统授权后,可以尝试: 查找手机上可用的计算器应用,打开它,再告诉我当前页面有哪些可操作的控件。 应用查找只覆盖 Android 对 DSHX 可见的应用;读取控件需要有效的无障碍服务连接。无障碍服务由用户在系统设置中启用,向应用提供可见控件和允许的界面动作。见手机能力与操作流程。 常见问题 DSHX 能完全离线使用吗? 普通对话请求用户配置的模型服务。语音识别通过 Android 通用接口调用手机的系统服务,是否联网取决于该服务。有限简单文字任务可在对应文字模型准备好后本地执行。回答文字发送至用户选定的 Edge TTS 或火山引擎进行在线播报;本机小模型的任务范围见语音说明。 数据保存在手机上,还会发送给模型服务吗? 会话、附件、记忆、资料和下载的模型保存在应用私有目录。普通对话内容仍发送给所选模型服务;开启自动记忆整理后,相关对话片段可能发送给来源模型,知识嵌入和摘要也可能发送所选资料。长期记忆和自动整理默认关闭,相关服务按功能独立配置。见记忆、知识库和数据存储。 聊天页打不开,或页面能打开但没有回答,应该检查哪里? 先确认工作台中的 dsh 已启动,再检查 WebView 是否达到 126 或更新版本。页面可用但请求失败时,检查模型服务地址、模型名称、凭据与网络。见安装与首次对话验证。 为什么手机操作或语音功能不可用? 手机操作需要对应能力开关、系统授权;界面观察还需要无障碍服务连接。语音输入需要可用的系统识别服务和麦克风权限,可在“设置 → 语音交互”检查并进入系统设置;在线播报另需网络和可用的服务配置。本机关键词唤醒与可选文字模型分别准备,不再提供整句识别模型下载。见手机能力和语音说明。 备份包含全部应用数据吗? 会话备份和知识归档覆盖各自数据,两者均不包含模型密钥和独立长期记忆。卸载或清除数据前,先核对备份范围与迁移、恢复说明。 app、prototype 和 plan 分别是什么? app/ 是正式 Android 应用;core/ 保存引擎适配模块;tools/ 是开发机上的构建与准备脚本。prototype/ 是早期独立交互演示,p0/ 是仅本地保存的早期可行性材料,正式应用不依赖它们。docs/ 保存正式说明;plan/ 保存本地计划、调研和实施记录。p0/ 与 plan/ 均由 Git 忽略。见目录与架构和原型说明。 说明文档 从文档索引开始,按需要阅读: - 构建与使用: 开发环境、安装与定向验证、聊天界面、助手设置。 - 架构与运行: 术语和目录、典型执行流程、引擎生命周期、运行包安装、本机通信。 - 工具与扩展: 文件、命令和附件、手机能力、语音与本机小模型、插件兼容。 - 记忆与资料: 长期记忆、知识库、共享读取额度。 - 数据与来源: 存储和备份范围、迁移与归档、早期原型、技术来源与许可证。 贡献 修改前先阅读项目协作规范、架构说明和开发说明。功能和模块原理写入 docs/,计划、调研与过程记录保存在本地 plan/。 文档使用中文。提交信息采用 type(scope): 中文说明 格式:类型使用 feat、fix、docs、style、refactor、chore 等英文前缀,scope 使用英文标明涉及的模块,冒号后的说明与提交正文使用中文,例如 feat(knowledge): 增加文档导入、fix(phone): 处理无障碍服务断开、docs(readme): 整理项目说明。 验证只运行当前包或改动模块的定向测试,新增测试放入已有测试文件。构建、界面检查与真实模型验证分别报告。 致谢 感谢 DeepSeek 官方 deepseek-harness 提供智能体引擎、聊天网页和插件机制,以及 Soodok / DSH Mobile 的 Android 实践参考。依赖版本、语音模型和其他来源见技术来源与许可证。 许可证 项目自有源码采用 MIT License。参考项目的 MIT 许可原文 单独保留,第三方依赖和模型继续适用各自许可证。
预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
skynit/DSHX
基于 DeepSeek Harness 的非官方 Android AI 助手,支持语音交互、手机操作、本地记忆与知识库。
相关插件 · 工具 / 效率
破甲管控台kingcharleslzy-ai/dsh-purge
dsh-purge Community · DeepSeek Harness 社区维护版:宿主兼容、状态诊断、提示词管理、更新与本机备份回滚。基于小杨 / YuJunZhiXue 的 dsh-purge。
★ 4,173已汉化DeepSeek 客户端
74.4
网文长卷lingfengQAQ/webnovel-writer
基于 Claude Code 的长篇网文辅助创作系统,解决 AI 写作中的「遗忘」和「幻觉」问题,支持 200…
★ 7,636已汉化DSH
72.2
多智能体协作HKUDS/AutoSwarm
AutoSwarm: Unify Your Agents. Unify Your Context (Codex · Claude Code · DeepSeek Harness · Muse · Grok · WorkBuddy· nanobot · and more)
★ 2,349已汉化DSH
71.6
Vox 拼贴视频生成Alisa0808/vox-director
🎬 Vox Director拼贴动效导演
★ 2,129已汉化DSH
71.4
Agent 演化引擎Q00/ouroboros
智能体 OS:智能体自己变聪明,我们只守住底线:面试准入、分阶段评估、带预算的进化循环。MCP 服务器,14 种运行时:Claude Code、Codex CLI、Gemini CLI、OpenCode、Copilot、Kiro 等。
★ 6,308已汉化DSH
71.3
智能体运行框架路由HarnessRouter/harnessrouter
智能体运行框架的统一接口。
★ 3,897已汉化DSH
71.2
这是你的仓库?认领条目