odai 是面向 AI agent 的治理内核驱动的通用任务执行框架。
60.5/100
综合分
119
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/30 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
自动兼容检查未通过:缺少 main/exports/bin 入口声明;仓库 package.json 标记 private,未发布到 npm,需从源码安装。以下命令仍可尝试,但可能失败。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add orziz/odai该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:已验证
是什么
dsh 原生插件 · platform
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 4 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查需源码安装缺少 main/exports/bin 入口声明;仓库 package.json 标记 private,未发布到 npm,需从源码安装
展开查看检查明细 ↓
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
✗npm 包odai-workspace(未发布到 npm,仅可源码安装)
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖未声明 dsh 版本约束
✗入口文件缺少入口声明
源码安装时若 pnpm 拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑。
验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/29 17:40:28
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 121 处,展示前 111 条)
- 写入本地文件cli/src/index.mjs:594
await writeFile(args.lastMessage, `${message}\n`, "utf8"); - 读取本地文件dsh/agent/src/control-center-installer.mts:80
const parsedMetadata: unknown = JSON.parse(await readFile(resolve(packageRoot, "package.json"), "utf8")); - 读取本地文件dsh/agent/src/control-center-installer.mts:109
return await readFile(path); - 读取本地文件dsh/agent/src/control-center-installer.mts:193
root = await realpath(dirname(manifestPath)); - 读取本地文件dsh/agent/src/control-center-installer.mts:222
const presetMetadata: unknown = JSON.parse(await readFile(resolve(dirname(manifestPath), "preset/odai/package.json"), "utf8")); - 写入本地文件dsh/agent/src/control-center-installer.mts:339
await mkdir(root, { recursive: true }); - 写入本地文件dsh/agent/src/control-center-installer.mts:343
await mkdir(snapshotRoot, { recursive: true }); - 写入本地文件dsh/agent/src/control-center-installer.mts:348
if (file.content !== undefined) await writeFile(resolve(snapshotRoot, filename), file.content); - 写入本地文件dsh/agent/src/control-center-installer.mts:350
await writeFile(resolve(snapshotRoot, "snapshot.json"), `${JSON.stringify({ revision: snapshot.revision, files: states }, null, 2)}\n`, "utf8"); - 写入本地文件dsh/agent/src/control-center-installer.mts:352
await writeFile(resolve(root, "failure.txt"), `${failure}\n`, "utf8"); - 写入本地文件dsh/agent/src/control-center-installer.mts:420
await mkdir(lockRoot, { recursive: true, mode: 0o700 }); - 执行外部命令来自配置/变量dsh/agent/src/dsh-version.mts:50
return spawn(command_, args, options_) as TResult; - 读取本地文件dsh/agent/src/installer.mts:82
const parsedPackageMetadata: unknown = JSON.parse(await readFile(resolve(packageRoot, "package.json"), "utf8")); - 写入本地文件dsh/agent/src/installer.mts:127
await mkdir(requested, { recursive: true, mode: 0o700 }); - 读取本地文件dsh/agent/src/installer.mts:131
const canonical = await realpath(requested); - 写入本地文件dsh/agent/src/installer.mts:159
await mkdir(lockRoot, { recursive: true, mode: 0o700 }); - 写入本地文件dsh/agent/src/installer.mts:217
await mkdir(backupRoot, { recursive: true, mode: 0o700 }); - 写入本地文件dsh/agent/src/installer.mts:220
await rename(inspected.target, backup); - 读取本地文件dsh/agent/src/installer.mts:242
manifestSource = await readFile(resolve(target, MANIFEST_FILE)); - 读取本地文件dsh/agent/src/installer.mts:310
const entries = await readdir(base, { withFileTypes: true }); - 读取本地文件dsh/agent/src/installer.mts:325
return createHash("sha256").update(await readFile(path)).digest("hex"); - 读取本地文件dsh/agent/src/installer.mts:330
const stats = await lstat(path); - 写入本地文件dsh/agent/src/operation-lock.mts:12
mkdirSync(dirname(path), { recursive: true, mode: 0o700 }); - 删除本地文件dsh/agent/src/operation-lock.mts:31
rmSync(path, { force: true }); - 读取本地文件dsh/agent/src/operation-lock.mts:38
current = readFileSync(path, "utf8").trim(); - 删除本地文件dsh/agent/src/operation-lock.mts:43
rmSync(path); - 执行外部命令来自配置/变量dsh/npm-publish.mts:57
const result = spawnSync(command, args, { - 读取本地文件dsh/npm-publish.mts:144
const value: unknown = JSON.parse(readFileSync(resolve(directory, "package.json"), "utf8")); - 读取本地文件dsh/npm-publish.mts:253
if (!tarball.startsWith(`${root}${sep}`) || !existsSync(tarball)) { - 删除本地文件递归dsh/npm-publish.mts:261
rmSync(root, { recursive: true, force: true }); - 删除本地文件递归dsh/npm-publish.mts:327
rmSync(artifacts.root, { recursive: true, force: true }); - 读取本地文件dsh/release-artifacts.mts:20
return `sha512-${createHash("sha512").update(readFileSync(tarball)).digest("base64")}`; - 读取本地文件dsh/runtime/src/compaction-config.mts:118
text = readFileSync(configPath, "utf8"); - 写入本地文件dsh/runtime/src/compaction-config.mts:221
mkdirSync(dirname(configPath), { recursive: true, mode: 0o700 }); - 写入本地文件dsh/runtime/src/compaction-config.mts:225
writeFileSync(temporary, value, { encoding: "utf8", mode: 0o600, flag: "wx" }); - 写入本地文件dsh/runtime/src/compaction-config.mts:226
renameSync(temporary, configPath); - 删除本地文件dsh/runtime/src/compaction-config.mts:228
rmSync(temporary, { force: true }); - 写入本地文件dsh/runtime/src/compaction-config.mts:234
renameSync(configPath, `${configPath}.invalid-${Date.now()}-${randomUUID()}`); - 写入本地文件dsh/runtime/src/compaction-config.mts:258
copyFileSync(configPath, backupPath); - 删除本地文件dsh/runtime/src/compaction-config.mts:259
rmSync(configPath, { force: true }); - 删除本地文件dsh/runtime/src/compaction-config.mts:419
else rmSync(configPath, { force: true }); - 发起网络请求dsh/runtime/src/control-center-runtime.mts:56
register(route: { path: string; methods: string[]; requestBody: "buffered"; fetch(request: Request): Promise<Response> }): () => void | Promise<void>; - 发起网络请求dsh/runtime/src/control-center-runtime.mts:68
async fetch(request) { - 读取本地文件dsh/runtime/src/human-safety-continuity-store.mts:137
if (!existsSync(path)) return; - 读取本地文件dsh/runtime/src/human-safety-continuity-store.mts:138
if (lstatSync(path).isSymbolicLink()) throw new Error(`${label} must not be a symbolic link: ${path}`); - 读取本地文件dsh/runtime/src/human-safety-continuity-store.mts:147
if (existsSync(parent) && !lstatSync(parent).isDirectory()) { - 读取本地文件dsh/runtime/src/human-safety-continuity-store.mts:147
if (existsSync(parent) && !lstatSync(parent).isDirectory()) { - 读取本地文件dsh/runtime/src/human-safety-continuity-store.mts:150
if (existsSync(storePath) && !lstatSync(storePath).isFile()) { - 读取本地文件dsh/runtime/src/human-safety-continuity-store.mts:150
if (existsSync(storePath) && !lstatSync(storePath).isFile()) { - 写入本地文件dsh/runtime/src/human-safety-continuity-store.mts:230
mkdirSync(parent, { recursive: true, mode: 0o700 }); - 写入本地文件dsh/runtime/src/human-safety-continuity-store.mts:238
writeFileSync(fileDescriptor, `${JSON.stringify(value, null, 2)}\n`, { encoding: "utf8" }); - 写入本地文件dsh/runtime/src/human-safety-continuity-store.mts:245
renameSync(temporary, storePath); - 删除本地文件dsh/runtime/src/human-safety-continuity-store.mts:248
rmSync(temporary, { force: true }); - 删除本地文件dsh/runtime/src/human-safety-continuity-store.mts:286
rmSync(storePath, { force: true }); - 执行外部命令来自配置/变量dsh/runtime/src/local-cli-catalog.mts:24
execFile(command, cli === 'claude' ? ['--help'] : ['models'], { timeout: 15000, maxBuffer: 1024 * 1024, signal }, (error, stdout) => { - 执行外部命令固定命令dsh/runtime/src/local-cli-catalog.mts:35
const child = spawn('codex', ['app-server'], { stdio: ['pipe', 'pipe', 'pipe'] }); - 读取本地文件dsh/runtime/src/output-config.mts:98
text = readFileSync(configPath, "utf8"); - 写入本地文件dsh/runtime/src/output-config.mts:186
mkdirSync(dirname(configPath), { recursive: true, mode: 0o700 }); - 写入本地文件dsh/runtime/src/output-config.mts:190
writeFileSync(temporary, value, { encoding: "utf8", mode: 0o600, flag: "wx" }); - 写入本地文件dsh/runtime/src/output-config.mts:191
renameSync(temporary, configPath); - 删除本地文件dsh/runtime/src/output-config.mts:193
rmSync(temporary, { force: true }); - 写入本地文件dsh/runtime/src/output-config.mts:199
renameSync(configPath, `${configPath}.invalid-${Date.now()}-${randomUUID()}`); - 删除本地文件dsh/runtime/src/output-config.mts:410
else rmSync(configPath, { force: true }); - 读取本地文件dsh/runtime/src/research-packet.mts:149
const stats = statSync(sourcePath); - 读取本地文件dsh/runtime/src/research-packet.mts:154
const sourceLine = readFileSync(sourcePath, "utf8").split(/ ? /u)[fact.source.line - 1]; - 读取本地文件dsh/runtime/src/routing-config.mts:171
if (!existsSync(configPath)) { - 读取本地文件dsh/runtime/src/routing-config.mts:177
parsed = JSON.parse(readFileSync(configPath, "utf8")) as unknown; - 写入本地文件dsh/runtime/src/routing-config.mts:265
mkdirSync(dirname(configPath), { recursive: true, mode: 0o700 }); - 写入本地文件dsh/runtime/src/routing-config.mts:270
writeFileSync(temporary, value, { encoding: "utf8", mode: 0o600, flag: "wx" }); - 写入本地文件dsh/runtime/src/routing-config.mts:271
renameSync(temporary, configPath); - 删除本地文件dsh/runtime/src/routing-config.mts:273
rmSync(temporary, { force: true }); - 读取本地文件dsh/runtime/src/routing-config.mts:278
if (!existsSync(configPath)) return; - 写入本地文件dsh/runtime/src/routing-config.mts:279
renameSync(configPath, `${configPath}.invalid-${Date.now()}-${randomUUID()}`); - 写入本地文件dsh/runtime/src/routing-config.mts:300
copyFileSync(configPath, backupPath); - 读取本地文件dsh/runtime/src/runtime-config.mts:209
if (!existsSync(path)) throw new Error(`explicit Odai canonical skill not found: ${path}`); - 读取本地文件dsh/runtime/src/runtime-config.mts:217
const found = candidates.find((candidate) => existsSync(candidate)); - 读取本地文件dsh/runtime/src/semantic-memory-store.mts:192
function assertNoSymlink(path: string, label: string): void { if (existsSync(path) && lstatSync(path).isSymbolicLink()) throw new Error(`${label} must - 读取本地文件dsh/runtime/src/semantic-memory-store.mts:192
function assertNoSymlink(path: string, label: string): void { if (existsSync(path) && lstatSync(path).isSymbolicLink()) throw new Error(`${label} must - 读取本地文件dsh/runtime/src/semantic-memory-store.mts:196
if (existsSync(parent) && !lstatSync(parent).isDirectory()) throw new Error(`Odai memory directory is not a directory: ${parent}`); - 读取本地文件dsh/runtime/src/semantic-memory-store.mts:196
if (existsSync(parent) && !lstatSync(parent).isDirectory()) throw new Error(`Odai memory directory is not a directory: ${parent}`); - 读取本地文件dsh/runtime/src/semantic-memory-store.mts:197
if (existsSync(storePath) && !lstatSync(storePath).isFile()) throw new Error(`Odai memory store is not a regular file: ${storePath}`); - 读取本地文件dsh/runtime/src/semantic-memory-store.mts:197
if (existsSync(storePath) && !lstatSync(storePath).isFile()) throw new Error(`Odai memory store is not a regular file: ${storePath}`); - 写入本地文件dsh/runtime/src/semantic-memory-store.mts:227
mkdirSync(parent, { recursive: true, mode: 0o700 }); const identities = assertSafeStorePath(storePath); const temporary = `${storePath}.tmp-${process. - 写入本地文件dsh/runtime/src/semantic-memory-store.mts:228
try { let fd: number | undefined; try { fd = openSync(temporary, constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL | noFollow, 0o600); writeFi - 写入本地文件dsh/runtime/src/semantic-memory-store.mts:229
assertSafeStorePath(storePath); assertDirectoryIdentities(identities); renameSync(temporary, storePath); assertDirectoryIdentities(identities); - 删除本地文件dsh/runtime/src/semantic-memory-store.mts:230
} finally { rmSync(temporary, { force: true }); } - 删除本地文件dsh/runtime/src/semantic-memory-store.mts:244
try { assertSafeStorePath(storePath); assertDirectoryIdentities(identities); rmSync(storePath, { force: true }); assertDirectoryIdentities(identities) - 读取本地文件dsh/runtime/src/session-evidence.mts:152
if (!existsSync(path)) return []; - 读取本地文件dsh/runtime/src/session-evidence.mts:153
const text = readFileSync(path, "utf8"); - 写入本地文件dsh/runtime/src/session-evidence.mts:250
mkdirSync(root, { recursive: true, mode: 0o700 }); - 读取本地文件dsh/runtime/src/session-evidence.mts:257
const originalSize = existsSync(path) ? statSync(path).size : 0; - 读取本地文件dsh/runtime/src/session-evidence.mts:257
const originalSize = existsSync(path) ? statSync(path).size : 0; - 读取本地文件dsh/runtime/src/session-evidence.mts:289
const snapshot = statSync(path); - 读取本地文件dsh/runtime/src/skill-selector.mts:50
if (existsSync(resolve(current, ".git"))) return current; - 读取本地文件dsh/runtime/src/skill-selector.mts:159
if (!candidate.path || !existsSync(candidate.path)) continue; - 读取本地文件dsh/runtime/src/skill-source-config.mts:78
if (!existsSync(configPath)) return Object.freeze({ schemaVersion: STORE_SCHEMA_VERSION }); - 读取本地文件dsh/runtime/src/skill-source-config.mts:81
parsed = JSON.parse(readFileSync(configPath, "utf8")) as unknown; - 写入本地文件dsh/runtime/src/skill-source-config.mts:104
mkdirSync(dirname(configPath), { recursive: true, mode: 0o700 }); - 写入本地文件dsh/runtime/src/skill-source-config.mts:108
writeFileSync(temporary, value, { encoding: "utf8", mode: 0o600, flag: "wx" }); - 写入本地文件dsh/runtime/src/skill-source-config.mts:109
renameSync(temporary, configPath); - 删除本地文件dsh/runtime/src/skill-source-config.mts:111
rmSync(temporary, { force: true }); - 读取本地文件dsh/runtime/src/skill-source-config.mts:116
if (!existsSync(configPath)) return false; - 写入本地文件dsh/runtime/src/skill-source-config.mts:117
renameSync(configPath, `${configPath}.invalid-${Date.now()}-${randomUUID()}`); - 删除本地文件dsh/runtime/src/skill-source-config.mts:241
else rmSync(configPath, { force: true }); - 读取本地文件dsh/runtime/src/store-lock.mts:26
const value = readFileSync(lockPath, "utf8").trim(); - 删除本地文件dsh/runtime/src/store-lock.mts:58
rmSync(lockPath, { force: true }); - 删除本地文件dsh/runtime/src/store-lock.mts:68
rmSync(lockPath); - 写入本地文件dsh/runtime/src/store-lock.mts:86
renameSync(claimPath, displacedPath); - 删除本地文件dsh/runtime/src/store-lock.mts:103
if (displacedWasStale) rmSync(displacedPath, { force: true }); - 写入本地文件dsh/runtime/src/store-lock.mts:108
mkdirSync(dirname(path), { recursive: true, mode: 0o700 }); - 删除本地文件dsh/runtime/src/store-lock.mts:128
rmSync(lockPath);
扫描于 2026/11/2(1 天前) · 范围 全包扫描 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 对齐目标与事实
- 规划调度任务
- 治理执行到验收
AI 智能体通用任务治理框架:对齐目标与事实,规划和调度能力,守住授权与风险边界,治理任务执行到真实验收与交付。一套治理框架,用证据驱动规划、编排与可验证交付。
README
由 DeepSeek 最新模型翻译生成English · 中文
odai
odai 是面向 AI agent 的治理内核驱动的通用任务执行框架。
它把治理融入执行:对齐真实目标、事实、假设、授权、风险与验收,再选择最短充分路径、组合合适能力、行动、验证,并持续推进到真正可交付的结果;不会用僵硬流程替代模型判断。
一句话:你用 /odai 交任务;简单任务中治理近乎隐身,遇到模糊、复杂、风险或领域需求时再自动提升处理深度。
为什么用它
odai 适合想让 agent 自主推进、但不想让它带着虚假确定性乱冲的人。
它会帮助 agent:
- 只在缺口会改变目标、范围、授权、验收、风险或停止线时才问你
- 能从文件、命令、日志、测试或项目上下文补证的,先自己补证
- 让轻量任务保持轻量,不把每个请求都变成流程仪式
- 不把没测试、没调用、没审查、没验证的事情说成已经做过
- 按需组合专项技能和领域知识,而不是每一轮都塞满所有规则
- 复用宿主或项目已有记忆,只固化有来源、范围与失效条件的长期信息
- 对持续低落、自残或轻生倾向提前关怀和及时介入,不诊断、不贴标签、不因“还没有计划”而忽略,也不造成二次伤害
odai 之道
事由人定,路由实证;法随势变,成由验定;止于边界,成事而不妄为。
展开完整文档(README 剩余 1 节)
English · 中文 odai odai 是面向 AI agent 的治理内核驱动的通用任务执行框架。 它把治理融入执行:对齐真实目标、事实、假设、授权、风险与验收,再选择最短充分路径、组合合适能力、行动、验证,并持续推进到真正可交付的结果;不会用僵硬流程替代模型判断。 一句话:你用 /odai 交任务;简单任务中治理近乎隐身,遇到模糊、复杂、风险或领域需求时再自动提升处理深度。 为什么用它 odai 适合想让 agent 自主推进、但不想让它带着虚假确定性乱冲的人。 它会帮助 agent: - 只在缺口会改变目标、范围、授权、验收、风险或停止线时才问你 - 能从文件、命令、日志、测试或项目上下文补证的,先自己补证 - 让轻量任务保持轻量,不把每个请求都变成流程仪式 - 不把没测试、没调用、没审查、没验证的事情说成已经做过 - 按需组合专项技能和领域知识,而不是每一轮都塞满所有规则 - 复用宿主或项目已有记忆,只固化有来源、范围与失效条件的长期信息 - 对持续低落、自残或轻生倾向提前关怀和及时介入,不诊断、不贴标签、不因“还没有计划”而忽略,也不造成二次伤害 odai 之道 事由人定,路由实证;法随势变,成由验定;止于边界,成事而不妄为。 这不是诸家思想的拼盘,而是一条统一的判断准绳: - 成事:推进用户定义的事至经验证的可交付结果;会改变结果的反例、风险与更稳路径,要主动端出来。 - 不妄为:事实、用户决定与底线不可曲;无依据不定论,无授权不越界,无必要不造工作,发现不等于获准实施。 人和模型以共同成事为合作关系,而非单向命令与服从。用户提供意图、语境、价值取舍与不可接受结果;模型贡献判断、证据、创造与执行,主动质疑可疑前提并提出更优路径。双方以真实进展、坦诚的不确定与反馈校准理解和信任;目标取舍由用户决定,界内专业做法由模型自主,授权不是盲从,质疑也不是夺权。 odai 不是用户的回声,也不是规则的复读机。它以人的目的为方向、以事实和边界为约束,形成自己的判断与推荐,必要时坚持异议,也随证据改判。真实胜过讨好,有效胜过仪式,可靠结果胜过表面省事,长期信任胜过一轮表现。 模型的主动性只按净价值裁决。速度、质量、稳定、成本、泛用与实用都是围绕用户目标和事实权衡的结果,不再是一排并列口号,更不能替代真实交付。 行动标准 看得清、拿得稳、打得准、落得实、守得住、走得远。 看清真实目标、事实与缺口;拿稳授权、边界与风险;打中最窄充分路径;落到可验证的交付;守住用户决定、系统安全与事实;让结果经得起后续使用、维护和变化。 产品目标 让 agent 更快、更准、更好、更稳、更省、更轻、更广、更活、更有用、更实用。这些不是彼此独立的流程指标,而是围绕当前任务共同权衡的产品结果:只认净价值,不拿流程、文件数、token 或评测得分替代真实成事。 30 秒上手 安装独立治理技能: npx skills add https://github.com/orziz/odai --skill odai 当前源码候选把可选编排拆成了同级、可独立安装的技能: npx skills add https://github.com/orziz/odai --skill odai-orchestration odai-orchestration 单向依赖 odai,提供职责预设和宿主路由适配器;安装技能不会自动修改宿主配置。候选 DSH 包内置两者,未启用编排时治理仍独立工作。使用尚未发布的本地源码时,将仓库 URL 换为本地仓库路径。 然后用 /odai 交任务。支持 slash command 的客户端里,常规就是这种写法: /odai 更新新用户引导文案。 目标:让第一次使用的人更容易看懂。 材料:当前 app 文件和 README。 约束:先不要改行为;先给我文案方案和风险。 如果当前客户端不支持 slash command,用自然语言点名 odai 也可以。 你不需要记住内部结构,也不需要选择方法论。odai 会根据任务和项目证据自动判断处理深度、所需能力、领域知识和验证强度。 DeepSeek Harness 独立包 DSH 用户可以按需要独立安装两种形态: 对一个 profile 中的所有 agent preset 生效 dsh plugin --profile web add odai-dsh-plugin 安装可选择、按 session 生效的 Odai Agent preset npx odai-dsh-agent install 当前 0.3.3 源码候选以 DSH 0.2.1-rc.2 为最低支持基线。Agent 允许 >=0.2.1-rc.2(含后续预发布),双包 npm peer 保持开放(*);后续版本仍须具备兼容的宿主接口,放行不等于已经验证。更早 DSH 版本不再属于当前支持范围,已发布版本的历史兼容记录保留。Odai 自行维护 preset,保留现有能力,不要求照搬 Standard,也不自动添加其新增工具。Control Center 使用 Web 传输,非 Web 环境的治理仍独立可用。 正常安装、更新、卸载与 runtime 不检查或改写旧会话。DSH 会拒绝包含未知 Odai 事件的历史 v0 日志,即使事件带有 ignorable 标记;旧版仅补标记的 legacy-session-repair 入口已退役,不修改文件。新版支持不代表这些历史会话已经完成迁移。 Plugin 安装命令要求 pnpm 已在 PATH 中。两个包都已经包含 canonical Odai skill、共享 DSH runtime 与同一份中文 Control Center,不存在第三个包。Plugin 安装后直接提供 Control Center;Agent 的交互式 install 会说明现有 profile 的来源和版本,并在 [Y/n] 询问;直接回车、y 或 yes 确认,EOF、n、no 或其他文本不修改 Web profile。非交互安装必须显式传 --with-control-center 才会修改 profile。Plugin 与 Agent 可以独立安装,也允许同时安装;共存时由 Plugin 拥有唯一 Control Center 界面,两套 runtime 共享并去重治理、路由与 evidence 状态。现有 provider-neutral odai-cli 继续作为独立产品。 两个 DSH 包都默认使用软精简输出。用户可以显式切换到正常模式,或启用可选的经济模式:它在软精简基础上增加可调的 provider 输出 ceiling;用户只说“经济模式”而未给其他值时默认使用 500。该 ceiling 不会影响子代理、compaction、checkpoint 或内部上下文预算,provider 仍可能超过或忽略它。完整三档契约见 dsh/README.md。 完整、独立安装的 Odai skill 可以比两个 DSH 包更快更新,但不会自行改变默认来源。只有用户明确要求,Odai 才会把 skill source 切换为 auto 或 user:auto 可以选择兼容的项目 .dsh / .agents bundle 与较新的用户安装,user 则忽略项目根;部署显式路径始终优先。Plugin 与 Agent 刻意共存时按 agent / turn 共用同一份快照,prompt 治理与路由 role contract 不会选到不同 bundle。 可选 writer(写作)承接方向已定的起草、改写、翻译与本地化,只读回交成稿;creative 负责方向、构思与品味把关。未配置 writer 时 creative 照旧承接写作。writer 的 API 与本机 CLI 路由均只支持 child。 两个 DSH 包都不会自行选择 researcher、planner、reviewer、frontend、creative 或 writer 模型。六项职责均可按用户明确指定的 CLI 和模型使用本机 CLI,只支持只读 child;creative 在 API 路由上同样只支持 child,回交构思、候选或审查意见。用户只需自然地告诉 Odai,例如“规划用 provider/model,推理档 high”,模型就会为 Plugin 和 Agent 共用的机制持久化这项明确选择。之后正常交任务即可:不用说职责词,任务照样能完成;明确点名让某项已配置职责或其映射的模型来做时,会按指定时机照办,未完成时如实说明;其他请求仍由 runtime 从任务状态和证据缺口选择 direct、inline、same-turn 或 child;当前 controller 与 planner 同模型时不会重复调用,planner 回交后由 controller 继续已获授权的实施。总控负责整合、验证和最终交付;DSH 子代理保持只读,在明确委派补丁制作时可返回待应用补丁,研究、规划和审查仍遵守各自的较窄合同。真实任务需要某项尚未配置的职责时,Odai 会说明缺少哪一项并询问模型,而不会声称该路线已经运行。持久映射在 provider I/O 前正式校验;确定性坏映射备份后精确清理,额度、鉴权或网络故障只影响当次 fallback。 DSH 的心理与人身安全连续性不进入通用 semantic memory。只有用户明确要求,controller-only 工具才会把用户原文中的照护偏好、希望留意的信号、有效支持方式或自写安全计划保存到独立本地记录;用户可查看、导出、更正、逐条删除或物理清空,记录默认保留到用户执行删除。新会话只把它当历史照护偏好,不当成当前风险、诊断或隐藏评分,child agent 也拿不到这份记录。 包边界、来源优先级、自然语言配置与隔离环境真实安装共存验证见 dsh/README.md。 宿主能力路由 用户只在首次设置时说明“谁负责什么”,或让 odai 按宿主真实能力目录推荐映射。确认并安装后,项目持久保存这份映射;之后任何对话和操作仍只用 /odai 或自然语言交任务,不再声明模型、角色、规划模式或路由命令,也不需要观看内部交接。模型变化时原地更新一次映射即可。 总控是持续持有目标、全局状态、修正回路与最终交付的任务线程,不是每轮额外启动的一名角色。判断与验收是可选内部责任,不是用户工作流;实施始终由总控持有。同一能力足够就一把做完;其他映射责任确实能改变结果时,宿主取得该项有界贡献,再把唯一结果送回当前对话。可靠的无工具回答保持直答;后续对话自动承接最近交付和未决项,不要求用户重述。 这项路由受宿主能力约束,单靠 Skill 文本不能机械保证。宿主不能核实换档或委派时,odai 使用单一充分总控继续完成安全可做的部分,不虚构升档或下放。路由器不是普通使用的前置步骤;只有用户要求托管能力路由时才安装。 托管能力路由与下文项目护栏 Hooks 是两套机制。路由默认只注册宿主角色;Claude Code / Codex 显式开启 --named-dispatch 或 --lead-mode 时安装声明式路由 Hook,用于识别点名、写类工具前拦截和结束前催办;通过路由安装器 --uninstall --yes 卸载;项目护栏只执行项目明确声明的只读路径和验收命令,不负责模型路由。 受支持宿主的用户需要托管角色路由时,不用找路径、填写模型或手工合并配置;安装 skill 后直接说: /odai 为当前项目安装并验证能力路由。 odai 会从当前宿主的真实能力目录配置一个 controller 与 planner、reviewer,并可选配置 researcher、frontend、creative、writer,说明持久化影响并请求一次确认,然后安装并检查冲突。默认 auto 只注册能力:由总控承担完整交付,制作可按宿主权限有界委派,可选责任只在独立工作能改变结果时调用,不增加隐藏的每轮前置流程或 stage runner。可靠直答和只读查询不为展示路由调用其他角色。 不再使用时可以说“用 odai 卸载当前项目的能力路由”。安装器会合并既有宿主设置,记录原始 Codex 总控配置以便精确恢复,只删除清单中仍未被外部修改的托管文件,并保留无关设置;安装、更新或实际卸载后须开启新会话。默认只影响当前项目。自动安装器可为 Codex、Claude Code 与 GitHub Copilot CLI 生成托管角色配置;Codex 另有原生角色核验,另外两个宿主尚未取得等价证据时不能宣称同等程度的运行时路由。 它怎么判断 odai 持续判断四个维度: - 复杂度:直接行动、增加少量结构、分段执行,还是维护可恢复的长期状态与可信记忆。 - 明确度:证据足够直接做、先安全探索,还是确实需要用户决定。 - 风险度:可逆任务轻验证;外部或难回退任务使用更强授权和证据。 - 领域:代码、文档、表格、演示、浏览器、图像、游戏等内部工艺、项目规则或宿主专项技能。 加载任何指南前,先过静默轻门:结果、动作、路径、授权和验证已经清楚且低风险,就直接做。只有前提可疑、要求冲突、关键歧义、跨层取舍、高风险副作用或长依赖出现时才展开。 深度不会在开始时定死。影响面扩大就升级,检查后发现只是局部小改就降级。SDD、TDD、BDD、agent、合议和正式计划都只是可选方法,不是强制模式。 用于启发、对照、说明或验证的对象默认只读。以理解、判断、建议或方案为核心的请求不会被升级成修改现有对象的授权;即使用户要求产生变更,也只修改已经明确的目标对象。 重点不是让 agent 慢下来,而是让它在该快的地方快,在不该猜的地方停稳。 架构逻辑 用户任务 v +---------------------------------------------+ | /odai -> 轻量自适应内核 | | 理解局面 -> 选择下一项最高价值动作 | +---------------------+-----------------------+ +---------------------+-----------------------+ v v v 直接行动 内部工作能力 宿主技能 / 工具 + 领域知识 + 项目规则 +---------------------+-----------------------+ v 行动 -> 验证 -> 交付新证据及时改路 按实际缺口取得支撑,稳定后撤回;确需续作才外化状态,确有独立贡献才协作。 odai 从理解到交付持续负责当前任务。八份按需资料分别负责边界、计划、制作、验证、状态与记忆、外部能力、日常关怀与危机保护,各自只补当前缺口。 odai 的完整能力不只是入口文本,而是“内核 + 内置基本工艺 + 项目上下文 + 值得借用的专业能力”。已安装且明确匹配的能力可直接借用;通用缺口只在净增益成立时推荐安装;稳定、反复且项目专属的工艺才值得固化成项目 skill。不论路线如何,odai 都负责整合原始证据、验收与最终交付;仅仅“找到、推荐、创建或调用了能力”不算成事。 内部地图 内部按职责分层,而不是按强制阶段排列: | 层级 | 职责 | | 根内核 | 总纲,按事、实、法、成、界组织的规则,交付与按缺口取用 | | care.md | 非危机日常关怀、降低行动负担与用户可控的回应风格 | | human-safety.md | 人身与心理危机的早期识别、自然干预、二次伤害防止与授权安全连续性 | | dao.md | 事的所有权、事实校准、授权、参考只读与高影响边界 | | craft.md | 已决定结果的实施与排障、设计、UI / 实时交互、文档与审查工艺 | | planning.md | 可执行工程计划、需求覆盖、工作包依赖、持久交接与恢复顺序 | | verification.md | 验收、证据强度与完成判断 | | memory.md | 长期信息、项目叠加层与项目规则和技能的固化;续作状态由 planning 统一维护 | | leverage.md | 工具、资料与技能选择;外部能力的发现、净增益、安装、创建与组合 | 领域深度由任务事实自动判断,不让用户选择内部资料包。游戏、UI、文档和软件任务先使用内置工艺,再只为明确缺口借用项目资料、宿主工具或专业技能。frontend 这类可选宿主责任只在当前任务已证制作缺口内适配用户配置的模型与预算,不是可选领域包,也不构成按数据库、安全等领域继续枚举角色的先例;没有外部技能或责任映射时,odai 仍完成当前模型能够可靠完成的部分。 内容任务保留事实、既有模板、未完成责任与外部发布边界。复杂或长期任务只有在确实改善恢复时,才把决定、状态和验收写回一个既有维护位置;代码、测试或目标产物已经完整承载结果时,不额外制造文档。 常用提示词 信息不全也没关系,按你知道的程度说: /odai 接这个任务。你自己判断路线,只在边界或验收缺口会影响推进时问我。 /odai 审当前 diff,findings first,不要修改文件。 /odai 刷新这个仓库的 README。删掉过时截图,安装路径要清楚。 /odai 这个任务会影响用户体验。未经确认不要改行为,先验证建议路线。 安装方式 大多数人只需要统一入口: npx skills add https://github.com/orziz/odai --skill odai 其他安装方式: 安装仓库里的所有 skill npx skills add https://github.com/orziz/odai --all 安装更省 token 的分支 npx skills add https://github.com/orziz/odai#mini 安装旧的「一个能力一个 skill」布局 npx skills add https://github.com/orziz/odai#old 只有还依赖旧独立技能布局,或正在做迁移对照时,才建议使用 old 分支。 canonical source 都在 skills/ 下。分发走 skills.sh 安装流程;本仓库不再维护各平台镜像产物。当前 source、验证、冻结与发布口径见 MAINTAINING.md,已冻结架构变更见 CHANGELOG.md。 Codex 桌宠 本仓库提供两个互补、而非简单换色的 Codex v2 桌宠: | 桌宠 | 角色定位 | 性格 | 分工 | | 阿岱(dai) | 黑青行事官与执行搭档 | 沉着、可靠、克制 | 推进任务、执行、验收并收尾 | | 欧黛(odai) | 银白蓝紫吉祥物与陪伴搭档 | 活泼、亲近、好奇 | 陪伴、卖萌、回应进展、打气并庆祝完成 | 阿岱负责把事做成,欧黛负责让做事的过程有人陪;欧黛不是行事官。两者都包含 9 组标准动画和 16 个观察方向。安装 odai skill 不会自动安装桌宠。 完整人物资料分别见 阿岱设定档案 与 欧黛设定档案。 克隆或下载本仓库后,选择一个桌宠,将它的两个运行文件复制到同名 Codex 桌宠目录。 Windows PowerShell(以下安装 odai;黑色版把两处名称改成 dai): $petName = "odai" $petDir = Join-Path $env:USERPROFILE ".codex\pets\$petName" New-Item -ItemType Directory -Force $petDir | Out-Null Copy-Item -LiteralPath "pets\$petName\pet.json","pets\$petName\spritesheet.webp" -Destination $petDir -Force macOS 或 Linux: pet_name="odai" # 黑色版改成 "dai" mkdir -p "$HOME/.codex/pets/$pet_name" cp "pets/$pet_name/pet.json" "pets/$pet_name/spritesheet.webp" "$HOME/.codex/pets/$pet_name/" 然后打开 Codex 设置 → Pets,刷新列表并选择 dai 或 odai;也可以用 /pet 打开桌宠选择器。预览和格式说明见 dai 分发包 README 或 odai 分发包 README。 可选 Hooks 增强 skill 负责判断,Hooks 只把项目已经明确的边界变成机械护栏。它们默认不安装、不启用,也不改变 odai 的主流程;只有项目创建 .odai/hooks.json 后,才会针对受支持的结构化写工具(含 Claude Code 的 NotebookEdit)保护显式只读路径,并在收口时运行显式声明且与当前变更相关的验收命令。没有策略文件时完全静默。 项目护栏与显式开启 --named-dispatch 的路由 Hook 独立管理配置,可以共存,互不替代。 仓库维护一份无依赖运行时,按需生成宿主原生适配,不常驻六套平台镜像: node integrations/hooks/scripts/build-hooks.mjs --host all --out /tmp/odai-hooks 也可以把 all 换成 codex、claude、copilot、gemini、grok 或 kimi。每个输出目录里的 ADAPTER.json 会说明安装形态;策略从 integrations/hooks/assets/hooks-policy.example.json 起步,按项目事实改好后放到项目根 .odai/hooks.json。 | 宿主 | 写前只读路径保护 | 收口前显式验收 | | Codex | PreToolUse | Stop | | Claude Code | PreToolUse | Stop | | GitHub Copilot | preToolUse | agentStop | | Gemini CLI | BeforeTool | AfterAgent | | Grok Build | PreToolUse | — | | Kimi Code CLI | PreToolUse | Stop | Grok Build 当前只有 PreToolUse 是可阻断边界,因此适配器不会伪造 Stop 验收。Hooks 只检查受支持的结构化写工具和项目明确配置的验收命令;普通 shell 写入不在此路径保护范围内,Hooks 不解析任意 shell 命令,也不推断用户意图、目标文件或测试方案;它们是权限、沙箱和人工确认之外的轻量保险丝,不是完整安全边界。启用前应审查生成配置与 .odai/hooks.json。 评测 当前源码候选为 DSH 0.3.3 / 治理 0.7.1(runtime contract 9)/ 编排 0.2.3,最新已发布 Odai DSH 双包为 0.3.2(已修复会话格式缺陷;0.2.50 增加 DSH 0.2.0-rc.1 的 goal / todo 适配),面向 DSH 0.1.5-rc.2 的已发布版本为 0.2.37(治理 0.7.0)。当前证据与限制见模型评测及运行时验证,历史模型分数不作为后续源码的质量证明。 当前分数、重试状态和限制见 docs/evaluation-results.md,真实协作证据见 docs/routing-results.md,运行契约见 docs/evaluation.md。这些有限样本不证明全量验收、稳定提质或节省费用。 下表保留历史冻结版本的全量与配对测评,覆盖19条现实委托和其中13条配对A/B。每题先按真实完成度评为0–4,再乘预设权重;全量满分144、A/B满分96。历史分数按各自版本、宿主和采样方法解释,不迁移为当前源码成绩。 | Runner | 全量 on | A/B on | A/B off | 净增 | A/B runner token on / off | | GPT-6 Astra / xhigh(Codex 0.153.1) | 144/144 | 96/96 | 86/96 | +10 | 1,977,266 / 1,396,703(+41.6%) | | GPT-5.6-sol / high | 144/144 | 96/96 | 80/96 | +16 | 396,899 / 317,761(+24.9%) | | Claude Opus 5 | 144/144 | 96/96 | 77/96 | +19 | 2,273,558 / 1,937,782(+17.3%) | | Grok 4.6 / default high | 144/144 | 96/96 | 67/96 | +29 | 2,236,506 / 1,285,461(+74.0%) | | Grok 4.5 | 144/144 | 96/96 | 69/96 | +27 | 1,579,533 / 1,054,670(+49.8%) | | Gemini 3.7 Flash High | 134/144 | 88/96 | 72/96 | +16 | 1,813,203 / 1,580,475(+14.7%) | | Gemini 3.6 Flash High | 126/144 | 82/96 | 67/96 | +15 | 1,381,447 / 2,235,193(-38.2%) | | Kimi K3 | 144/144 | 96/96 | 75/96 | +21 | 2,192,056 / 1,632,057(+34.3%) | | DeepSeek V4 Pro / max(DSH) | 144/144 | 96/96 | 63/96 | +33 | 2,131,373 / 1,652,030(+29.0%) | | DeepSeek V4 Flash | 144/144 | 96/96 | 61/96 | +35 | 5,341,138 / 3,975,731(+34.3%) | GPT-6 Astra 的历史 adopted 结果使用C06/C10完整复跑及未变C05的规则对齐重裁;该方法不是首跑或稳定性统计。GPT-6 Astra、Gemini 3.7与DeepSeek V4 Pro(DSH)取得逐题隔离回执,其余记录形成于该契约生效前。十个历史runner的配对分差均为正,但九个用了更多token,不能推导无条件提质或节省。原始版本、范围和采样说明保留在测评报告中。 欢迎 star,也欢迎 PR。
预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
orziz/odai
odai 是面向 AI agent 的治理内核驱动的通用任务执行框架。
相关插件 · 平台集成
智能体工程课walkinglabs/learn-harness-engineering
一门项目制课程,教你搭建环境、管理状态、做验证、加控制机制,让 AI 编程智能体稳定干活。
★ 21,155已汉化DSH
71.7
视频翻译配音liuzhao1225/YouDub-webui
开源视频本地化工作台:导入视频,识别、翻译并逐句克隆原声,生成字幕和配音成片。
★ 5,778已汉化Cordis
71.4
失败经验库Ikalus1988/MisakaNet
📚 零依赖、由 git 支撑的微课程库,让 AI 智能体异步分享并检索经过验证的调试经验。| https://misakanet.org
★ 550已汉化DSH
71.2
桌面智能体工作区freestylefly/wesight
WeSight 是开源桌面控制台,面向本地 AI 智能体。它帮你安装或复用 Claude…
★ 933已汉化MCP
71
IM 机器人接入xmanrui/dsh-im
让 DeepSeek Harness 触手可及 Connecting DeepSeek Harness
★ 3,110已汉化DeepSeek 客户端
70.9
中国平台研究引擎Jesseovo/last30days-skill-cn
给 AI Agent 的中文互联网研究 Skill:检索 8 大平台最近 30…
★ 2,031已汉化DSH
70.7