DeepSeek Harness 开源:把 AI Agent 运行时拆成可插拔基础设施

2026-08-20 35 预计阅读时间: 1 分钟
来源: infoq.com AI 摘要 Original link

Disclaimer: This article is an AI-assisted summary. Read it together with the original source when precision matters. The summary may omit context, version differences, or edge cases and is not official documentation.

预计阅读时间:7 分钟

DeepSeek 发布了 DeepSeek Harness(dsh)开发者预览版。它不是一个只负责调用模型的 SDK,而是面向自主 AI Agent 的开源执行运行时:用微内核承载最小核心能力,再通过插件扩展具体功能。

这种设计把 Agent 基础设施从一个越来越庞大的单体程序,变成可以替换、审计和演进的模块集合。与此同时,dsh 提供了 append-only 事件日志,用于记录执行过程中的活动,为调试、回放和运行审计提供基础。

为什么运行时边界值得拆开

一个 Agent 通常同时处理模型调用、工具执行、状态管理、权限控制、重试和观测。如果这些能力全部写进一个执行器,早期开发很快,后期却容易出现三个问题:

  • 替换一个工具或模型适配器,需要修改核心流程。
  • 发生错误时,只能看到最终结果,难以还原 Agent 做过哪些决策。
  • 不同团队各自维护私有分支,接口逐渐失去一致性。

微内核架构的核心思路是收缩核心职责。内核负责调度生命周期、加载插件和派发事件;模型连接器、工具、记忆、策略以及观测能力则作为独立功能单元存在。这样做并不自动解决 Agent 的复杂性,但能把复杂性放到清晰的边界之后。

事件日志让执行过程可见

dsh 的 append-only 事件日志是这次发布中很关键的设计。执行器不应该只返回“成功”或“失败”,还应留下类似下面的事件序列:

agent.started
tool.requested
tool.completed
model.called
agent.completed

追加写入意味着历史事件不被原地修改。工程团队可以基于这些事件实现:

  • 调试:定位哪个工具调用产生了错误。
  • 审计:确认 Agent 是否执行了敏感操作。
  • 回放:使用同一份事件记录复查一次运行。
  • 指标:统计模型调用次数、工具耗时和失败率。

实际部署时仍要处理日志大小、敏感数据脱敏、事件版本兼容以及重放时的外部副作用。事件日志提供的是可观察性基础,不等于天然具备完整的审计合规能力。

一个最小的插件化执行模型

下面的 Python 示例不是 dsh 的官方 API,而是一个可以帮助理解该架构的最小实现。它展示了内核如何加载插件、执行插件并追加事件。运行环境只需要 Python 3.10 及以上。

from dataclasses import dataclass, asdict
from datetime import datetime, timezone
import json
from pathlib import Path
from typing import Any, Protocol


class Plugin(Protocol):
    name: str

    def run(self, payload: dict[str, Any]) -> dict[str, Any]:
        ...


@dataclass
class Event:
    name: str
    payload: dict[str, Any]
    timestamp: str


class EchoPlugin:
    name = "echo"

    def run(self, payload: dict[str, Any]) -> dict[str, Any]:
        return {"echo": payload.get("message", "")}


class Runtime:
    def __init__(self, log_file: str = "events.jsonl") -> None:
        self.plugins: dict[str, Plugin] = {}
        self.log_file = Path(log_file)

    def register(self, plugin: Plugin) -> None:
        self.plugins[plugin.name] = plugin

    def emit(self, name: str, payload: dict[str, Any]) -> None:
        event = Event(
            name=name,
            payload=payload,
            timestamp=datetime.now(timezone.utc).isoformat(),
        )
        with self.log_file.open("a", encoding="utf-8") as file:
            file.write(json.dumps(asdict(event), ensure_ascii=False) + "\n")

    def execute(self, plugin_name: str, payload: dict[str, Any]) -> dict[str, Any]:
        plugin = self.plugins[plugin_name]
        self.emit("plugin.requested", {"plugin": plugin_name, "payload": payload})
        result = plugin.run(payload)
        self.emit("plugin.completed", {"plugin": plugin_name, "result": result})
        return result


if __name__ == "__main__":
    runtime = Runtime()
    runtime.register(EchoPlugin())
    print(runtime.execute("echo", {"message": "hello agent"}))

保存为 runtime_demo.py 后运行:

python runtime_demo.py
cat events.jsonl

在更完整的实现中,可以把 EchoPlugin 替换为模型调用、数据库查询或沙箱命令执行插件,同时保留内核的生命周期和日志协议。插件边界需要明确输入输出、超时、错误类型、权限和版本约束;否则“可插拔”只会变成把隐式耦合搬到运行时。

采用前需要验证什么

DeepSeek Harness 的长期价值,很大程度上取决于插件生态和 API 的稳定性。开发团队可以按以下顺序评估:

  1. 先用一个低风险、可回滚的工具任务验证执行模型。
  2. 检查插件接口是否覆盖超时、取消、重试和资源限制。
  3. 确认事件格式是否足够稳定,能否接入现有日志和指标系统。
  4. 为插件锁定版本,并准备 API 变更的兼容层。
  5. 不要让具有副作用的工具直接参与无约束的 Agent 回放。

如果这些契约能够持续维护,微内核加插件的方向有机会让 Agent 运行时更易替换、更容易观察,也更适合由多个团队共同扩展。当前它仍是开发者预览版,生产采用应以实际 API、插件质量和维护节奏为准。


相关推荐