core 提供单体 ReAct 与挂载点,harness 的 DeepAgent 包在外面
包结构就是边界:openjiuwen/core 放基础设施、单体 ReActAgent、会话与上下文引擎,以及挂载点的事件枚举;openjiuwen/harness 放 DeepAgent——它把一个内层 ReActAgent 包起来,在外面加任务循环、rails、子代理运行时、技能与工作区。边界的代价写在这三组常量里:每个挂载点事件必须明确路由到内层还是外层的回调命名空间。harness/rails/AGENTS.md 专门警告,新增事件漏了路由不会报错,只会让 rail 静默失效,所以另有单测断言三个集合恰好覆盖全部事件、互不相交。
- 适合
- 想先用一个完整的单体 Agent,再按需叠加 Harness 能力的团队。
- 代价
- 两层 Agent 之间的事件路由、状态传递要靠约定与单测维护。
此后的变化
- 2026-W36 →
自我演化落在 harness/rails/evolution/ 扩展层而非内核,可由 dynamic_graph_enabled 整体关闭,异常时回退静态规划——「稳定内核 + Rails」路线的又一例证。
- 2026-W35 →
「模板与插件的创建、加载与执行」由 W34 的 feat 转为同名 fix,插件机制进入修补期;是否构成内核边界迁移仍需继续观察。
- 2026-W34 →
feat(harness) 支持模板与插件的创建/加载/执行,内核与扩展的边界可能正在移动。
# Events bridged to the inner ReActAgent.
_BRIDGE_EVENTS = frozenset(
{
AgentCallbackEvent.BEFORE_MODEL_CALL,
AgentCallbackEvent.AFTER_MODEL_CALL,
AgentCallbackEvent.ON_MODEL_EXCEPTION,
AgentCallbackEvent.BEFORE_TOOL_CALL,
AgentCallbackEvent.AFTER_TOOL_CALL,
AgentCallbackEvent.ON_TOOL_EXCEPTION,
# Fired by the inner ReActAgent at each successful iteration end, so a
# rail registered via DeepAgent.register_rail must bridge to the inner
# agent (same callback-manager namespace) rather than the outer one.
AgentCallbackEvent.AFTER_REACT_ITERATION,
# Same reason: the inner agent is what admits consumed inputs into the
# conversation, so it is what fires this.
AgentCallbackEvent.ON_USER_MESSAGE,
# And it is what takes them off the steering queue, one model call
# before that.
AgentCallbackEvent.BEFORE_STEERING_DRAIN,
}
)
# Events that stay on the outer DeepAgent only.
_OUTER_ONLY_EVENTS = frozenset(
{
AgentCallbackEvent.BEFORE_INVOKE,
AgentCallbackEvent.AFTER_INVOKE,
}
)
# Deep extension events.
_DEEP_EVENTS = frozenset(
{
AgentCallbackEvent.BEFORE_TASK_ITERATION,
AgentCallbackEvent.AFTER_TASK_ITERATION,
}
)
# ...(183-255 行:常量与辅助函数)
class DeepAgent(BaseAgent):
"""High-level agent that delegates to an internal ReActAgent."""
def __init__(self, card: AgentCard):
self._deep_config: Optional[DeepAgentConfig] = None
self._react_agent: Optional[ReActAgent] = None
self._pending_rails: List[AgentRail] = []
self._stale_rails: List[AgentRail] = []
self._registered_rails: List[AgentRail] = []
self._loop_coordinator: Optional[LoopCoordinator] = None