ScienceDiscovery
English GitHub

Agent 后端:Native executor

Status: Current native executor implementation

本文只描述 services/api/src/native-agent/ 的 native executor。所有启动器默认使用 JiuwenSwarm;用 --no-jiuwenswarm 或 SCIENCE_AGENT_EXECUTOR=native 选择 native。Executor 选择和共同控制面见整体运行时架构。

JiuwenSwarm 路径的协议适配以:

为准。

1. Executor seam

所有主/子 Agent run 最终进入:

createAgentRun(profile, bindings, input)

定义在:

services/api/src/agent-run/create-agent-run.ts

defaultAgentFactory() 根据部署配置选择:

native       → createNativeAgent
jiuwenswarm  → createJiuwenSwarmAgentFactory

因此修改 createAgentRun 时要保持 executor-neutral;native 专属行为应留在 native-agent/。

2. Native executor 代码入口

当前 services/api/src/native-agent/ 主要包含:

文件 作用
index.ts NativeAgent、主循环、tool dispatch、超时、context/model 调用
versioning.ts run/versioning snapshot 与 authority 记录
native-agent.test.ts native loop 核心单测
context-assembly.integration.test.ts context assembly 与 native loop 集成
versioning.test.ts versioning 行为

模型、工具、context 等能力大量来自 packages,而不是全部实现在该目录:

3. Native run 数据流

API run orchestration
       │
       ▼
createAgentRun(...)
       │ native factory
       ▼
NativeAgent.execute(prompt)
       │
       ├─ assemble context
       ├─ stream model turn
       ├─ emit text/thinking/usage events
       ├─ parse tool calls
       ├─ execute tool handlers
       ├─ append tool results
       └─ repeat until no tool calls / abort / timeout
       │
       ▼
finalMessages

Tool handler 的真实基础设施仍由 API bindings 注入,因此 native executor 不直接拥有 Project/Session storage、permission persistence 或 Runner lifecycle。

4. Context 与 system prompt

Native executor 在构造/运行期间组合:

动态 context 机制本身由 packages/context 提供,见动态上下文组装。

修改 prompt/context 时,需要同时检查:

5. Model transport

Native executor 通过 ScienceDiscovery model package/client 直接调用用户配置的模型 endpoint,并把流式 delta 转成 Agent events。

需要保持的产品语义包括:

JiuwenSwarm 不直接绕过这些产品语义:其模型请求经 ScienceDiscovery 的 per-run model gateway/proxy 路径重新进入产品模型层。

6. Tool dispatch

Native executor 接收模型 tool call 后调用 ScienceDiscovery tool table。

核心约束:

Tool policy、permission、Runner、MCP、Artifact/provenance 等不是 native loop 自己的持久化职责。

7. 超时与外部等待

Native executor 区分:

beginExternalWait() 用于暂停 run deadline,使等待人工审批或子 Agent 时不被错误计入主 Agent 的 active time。

超时错误 wording 与子 Agent failure classification 存在契约关系,修改前应先查相关测试。

8. History 与版本记录

Native executor 保存模型 assistant message 和 tool result,最终返回 finalMessages 给控制面。

Versioning 记录的目标不是复制 Session store,而是冻结本次 Agent trajectory 中对结果有影响的 authority,例如:

相关代码:

9. Native 与 JiuwenSwarm 必须保持的共同语义

如果修改的是产品行为,而非 native-only optimization,应检查 JiuwenSwarm 路径是否仍一致:

语义 Native JiuwenSwarm
Project/Session authority API API
Tool implementations ScienceDiscovery bindings adapter MCP bridge → 同一 bindings
Permission ScienceDiscovery ScienceDiscovery tool bridge
Artifact/provenance ScienceDiscovery ScienceDiscovery tool bridge
Model provider semantics product model client adapter/API model gateway
Run events native AgentEvent mapping adapter frame mapping
Cancel/timeout native executor JiuwenSwarm agent adapter

不要只修改 native-agent/index.ts 就假设发行版行为已经改变。

10. 测试入口

优先运行:

pnpm --filter @sciencediscovery/api test

关键测试包括:

若变更用户可观察行为,还需要相应 E2E / journey。

11. 已退役架构

以下内容不属于当前实现,不应在新代码中恢复:

历史兼容命名可能仍存在于字段或环境目录中,但不代表旧服务边界仍成立。

相关文档