odai

93Star16Fork0Issue1Watching

为 DSH 注入治理内核与责任路由,让 agent 按任务复杂度自动在研究/规划/执行/验收之间切换,避免轻任务被流程拖慢、重任务被仓促带过。

语言
JavaScript
License
MIT
分支
main
agent-skillsagentic-workflowai-agentai-agentsai-governanceclaude-codecodexdsh

安装

$ dsh plugin --profile web add github:orziz/odai

在终端中运行以上命令,通过 dsh CLI 安装此插件。可在右上角切换 Profile。 第一次用 dsh?看这篇新手教程

一句话定位

odai 是一个把治理(goal / fact / authorization / risk / acceptance)写进任务执行流的内核,给 DSH 里的 AI agent 当主控;它根据任务的复杂度、清晰度、风险、领域缺口自动调节处理深度,并按需在研究、规划、执行、验收、前端设计之间拆分责任。

核心能力

  • 注入一段常驻治理 prompt,让 agent 在每次请求时按"事|实|法|成|界"五项静默判断后才动手
  • 依据当前任务的复杂度、清晰度、风险与领域需求,在直接执行、同轮升级、外包子代理三种模式间自动选择
  • 维护可配置的责任模型映射(researcher / planner / executor / reviewer / frontend),用户用自然语言命名 provider 与 model 后即持久化并下轮生效
  • 持久化输出形态(normal / 软精简 / 经济模式)、压缩摘要模型、技能来源(bundled / auto / user)与语义记忆,全部写在 $DSH_HOME/odai/ 下的对应 JSON 文件
  • 注册 odai_routing_configodai_route_cardodai_output_configodai_compaction_configodai_memory 等工具,让控制器在不修改宿主文件的前提下读取和修改自身治理状态
  • 提供 skill 自演化叠加层,用户在不重装包的情况下替换治理 markdown 内容;每次替换都留下 base/result 代际记录和血缘关系

技术实现

  • 语言: JavaScript(Node.js ESM .mjs),无构建步骤
  • 关键依赖: @deepseek-ai/dsh(peerDependency,作为 DSH Cordis 宿主;optional 标记)、node:crypto node:fs node:path node:os(内置模块),独立 yaml 仅用于 Agent 安装器(dsh/agent/package.json:48-50
  • 架构模式: 通过 DSH 的 Cordis patch bundle(dsh/plugin/cordis.patch.yml:1-7)向宿主注册一个名为 odai-governance 的插件,注入点为 systemPrompt / tools / subagents / sessionsdsh/runtime/src/index.mjs:95-96);运行时挂载多个 ctx.on 钩子(system-prompt/assembleagent/pre-stepagent/requestagent/turn-stoppingsession/eventtools/resultllm/stream)实现治理与路由
  • 入口文件: dsh/runtime/src/index.mjs(通过 dsh/plugin/cordis.patch.yml 挂载;package.json:16 的 main 与 exports 也指向同一文件)

适用场景

适合让 DSH agent 处理真实项目改动、又不想让它带着虚假确定性乱冲的人:原版宿主在面对模糊、跨能力、高风险任务时容易直接动手或流于仪式。odai 把"先看清事实、再选最短充分路径、做完要靠证据"固化为可复用治理,同时保证琐碎请求不被流程拖慢。它在保留宿主默认模型的前提下工作,用户不需要预先指定每个责任用什么模型。

前置依赖与兼容性

依赖最低版本说明
DeepSeek Harness (dsh)0.1.0-rc.6两个包均以 optional peerDependency 形式声明 @deepseek-ai/dsh@0.1.0-rc.6;Agent 安装器在 dsh -V 输出版本不等于该值时直接拒绝
Node.js>=22.15.0两个 package.json#engines.node 均声明该下限
pnpm未声明具体版本Plugin 安装命令会调用 pnpm,要求 pnpmPATH
平台跨平台未声明 os / cpu 限制;plugin 在所有 DSH 支持平台生效
原生模块全部依赖 Node.js 内置模块或可选 peer 提供的宿主

安装方式

dsh plugin --profile web add github:orziz/odai

配置项

配置类型说明默认值
routing.mode字符串(off/observe/auto/execute)责任路由模式:off 完全关闭;observe 只观察不执行;auto 由路由表决定;execute 总是执行auto
routing.provider字符串实际生成子代理时使用的 provider idspawn
routing.maxInputChars整数(≥256)每次路由决定时截取任务文本的最大字符数12000
routing.configPath路径字符串用户责任模型映射的持久化 JSON 路径$DSH_HOME/odai/routing.json
routing.roles.{researcher,planner,executor,reviewer,frontend}对象每个角色对应的 provider/model,可选 reasoningEffort/maxTokens未配置时由 odai_routing_config 工具写入
governance.additionalDeniedTools字符串数组在内置黑名单之外再禁用的工具名[]
governance.skillSource字符串(bundled/auto/user)技能来源优先级;bundled 锁定包内 skill,auto/user 由 odai_skill_source_config 切换bundled
governance.skillConfigPath路径字符串技能来源持久化文件$DSH_HOME/odai/source.json
governance.evolutionRoot路径字符串用户技能自演化叠加层根目录$DSH_HOME/odai/skill-evolution
output.configPath路径字符串输出形态持久化 JSON 路径$DSH_HOME/odai/output.json
compaction.configPath路径字符串压缩摘要模型持久化 JSON 路径$DSH_HOME/odai/compaction.json
compaction.cacheRetention字符串(provider-default/short/long/none)压缩请求里 prompt-cache 留存策略provider-default
memory.mode字符串(auto/off)语义记忆是否在每个 controller 步骤自动激活auto
memory.storePath路径字符串语义记忆持久化 JSON 路径$DSH_HOME/odai/memory/store.json
memory.maxRetrieved整数(1–12)每个轮注入上下文的最大记忆条数6
skillPath路径字符串显式覆盖默认的 canonical skill 路径;不设置时使用 bundled skillODAI_SKILL_PATH 或包内位置自动解析

配置项也可以不写在 cordis.patch.yml 里,而是由 odai_routing_configodai_output_configodai_compaction_configodai_skill_source_configodai_memory 这些工具在用户提出自然语言请求时自动持久化。

常见问题

Q: 安装后必须重启 DSH 会话才生效吗?

A: 需要。Plugin 是 profile 级 bundle,安装完后必须重启当前 DSH 进程、再用该 profile 开新会话才能拿到治理注入;当前会话仍按宿主默认行为运行。

Q: 装上以后每个简单问题都会被流程拖慢吗?

A: 不会。运行时会先做一道轻任务闸门:结果、动作、路径、授权、验证都已清楚且低风险时直接执行;只有前提可疑、范围冲突、跨层权衡或高风险副作用出现时才展开。

Q: 需要我手动指定规划或执行用的模型吗?

A: 不需要。两包都默认 routing.mode=auto,宿主默认模型就够完成的任务不会自作主张切换;只有用户用自然语言明确指定"规划用 provider/model,推理档 high"才会被持久化到 $DSH_HOME/odai/routing.json,下个用户轮生效。Odai 不会主动帮你选模型。

Q: 哪些状态会写入本地?

A: 路由映射、输出模式、压缩模型、技能来源、技能自演化内容分别写入 $DSH_HOME/odai/ 下的 routing.jsonoutput.jsoncompaction.jsonsource.jsonskill-evolution/;语义记忆写入 memory/store.json。这些目录由 Agent 与 Plugin 共享,卸载任何一个包时不会被自动清理。

Q: 安装 odai-dsh-plugin 后还需要装 odai-dsh-agent 吗?

A: 通常不需要。Plugin 已自带 canonical skill 与 DSH runtime,覆盖整个 profile;Agent 是按 session 选择 Odai preset 的独立形态。两者刻意共存时共用同一份快照,常规同时安装属冗余,只在用户明确想组合两种作用域时才需要。

Q: 升级或卸载前需要先停掉 DSH 吗?

A: 需要。Plugin 的 repair-sessions 子命令和 Agent 的 install/update/uninstall 都会主动确认 DSH 进程已停止;本地进程检查失败或发现仍在运行的 DSH 时直接拒绝。

Q: 经济模式(economy)的 token ceiling 一定能生效吗?

A: 不一定。运行时只把用户指定的 maxTokens 通过 DSH 透传给 provider,无法强制 provider 遵守:实际用量可能包含隐藏推理、超过请求值,或在拿到完整文本前结束。要严格核算必须用宿主返回的真实 usage 数据。

上手难度

进阶 — 需要理解 DSH 的 profile、Plugin 与 Agent 概念,以及 $DSH_HOME/odai/ 下多份 JSON 的含义;想自己写治理 skill 还得熟悉 skills/odai/ 下的 SKILL.md 与六份 references。普通用户用默认配置直接 /odai 即可,但调整路由、压缩或技能来源时要看懂配置项与持久化路径。

已知问题与限制

  • 当持久化的 routing / output / compaction / memory 配置文件损坏或字段不合法时,运行时不会强行恢复,只会输出 warning 并退回宿主默认路由;若一个高影响路由因此缺失,控制器会被设为只读(fail closed)而不是假装成功(dsh/runtime/src/index.mjs:556-557673-680706-714
  • compaction.cacheRetention 设为 short/long/none 时仍是请求级建议;若上游 provider 不支持或选择忽略,DSH 仍按自身默认落地,无法强制(dsh/README.md:55
  • odai/cli 是 provider-neutral 独立产品,不属于本次 DSH 集成;不要把它和 odai-dsh-pluginodai-dsh-agent 混用(dsh/README.md:11
  • Agent 安装器对 dsh 版本是硬匹配,不支持 >= 范围;当前只接受 dsh@0.1.0-rc.6,升级 DSH 必须同步刷新 Agent preset 与两个包的版本(dsh/agent/bin/odai-dsh-agent.mjs:52-63
  • 同时安装 Plugin 与 Agent 时两者共用同一份 per-agent/per-turn 快照;prompt 治理和路由 role contract 不能各自选不同的 skill bundle(README.md:94
  • 用户语义记忆由 Plugin 与 Agent 共享,且 Agent 的 install/update/uninstall 与 Plugin 的 update 都不会管理或删除 $DSH_HOME/odai/memory/;卸载前需自行备份或清空(dsh/README.md:45
  • odai-repair-sessions 在本地进程检查失败或检测到 DSH 仍在运行时直接拒绝,不留模糊地带;必须在 DSH 完全停止后才能跑(dsh/plugin/README.md:25-27