npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

zerodiff-agent

v1.2.0

Published

A modular TypeScript agent runtime with pluggable tools, skills, and LLM backends.

Downloads

1,740

Readme

zerodiff-agent

English | 简体中文

zerodiff-agent 是一个用于构建 LLM Agent 的 TypeScript 库。你创建一个 Agent,传入 LLM 运行时和工具,然后调用 agent.run(...)

能力总览

  • LLM 后端:OpenAI 兼容 Chat Completions、OpenAI Responses API、Anthropic Messages API
  • Agent 运行时:有状态会话、流式输出、reasoning 输出、详细运行结果、取消运行、上下文压缩
  • 工具:Zod schema、自定义工具注册表、默认本地代码工具、hook 控制
  • 模型:模型档案、运行时切换、按模型配置 endpoint、thinking 控制、reasoning effort 控制、计费元数据
  • 配置:通过 loadAppConfig() 读取文件配置,并转换成 AgentConfig
  • 可观测性:token 用量、缓存用量、上下文窗口用量、成本统计和回调 hooks
  • Skills:从 data/skills 发现和加载
  • 可选 CLI:基于 Ink 的本地交互式 Agent UI

安装

npm install zerodiff-agent openai

如果使用 Anthropic:

npm install zerodiff-agent @anthropic-ai/sdk

需要 Node.js 20+。

创建 Agent

import OpenAI from "openai";
import { Agent } from "zerodiff-agent";

const agent = new Agent({
  llm: {
    provider: "openai",
    client: new OpenAI({ apiKey: process.env.OPENAI_API_KEY }),
  },
  model: "gpt-4o-mini",
});

提问

const answer = await agent.run("读取 package.json 并总结这个项目。");
console.log(answer);

流式输出:

await agent.run("解释源码目录结构。", {
  onChunk: (text) => process.stdout.write(text),
});

观察 reasoning、工具和用量事件:

await agent.run("检查工作区。", {
  onThinkingChunk: (text) => console.error(text),
  onToolCall: (name, args) => console.log("tool", name, args),
  onToolResult: (name, result) => console.log("result", name, result),
  onTurnCost: (cost) => console.log(cost),
  onContextUsage: (usage) => console.log(usage),
});

保留会话状态:

const session = agent.createSession();

await agent.run("找出主入口文件。", { session });
await agent.run("现在解释为什么它是入口。", { session });

主动压缩会话:

const result = await agent.compressSession({
  session,
  keepRecent: 4,
  onContextCompression: (phase) => console.log(phase),
});

console.log(result.compressed, result.summaryTokens);

读取运行结果:

const result = await agent.run("准备发布检查清单。", {
  onTurnCost: (cost) => console.log(cost),
  onContextUsage: (usage) => console.log(usage),
});

取消运行:

const controller = new AbortController();

await agent.run("分析这个仓库。", {
  signal: controller.signal,
});

配置模型

简单使用时,model 可以只是模型 id:

const agent = new Agent({ llm, model: "gpt-4o-mini" });

多个模型时,把完整档案放在 models[]model 只负责选择当前 id:

const agent = new Agent({
  llm,
  model: "gpt-5.5",
  models: [
    {
      id: "gpt-5.5",
      provider: "openai",
      baseUrl: "https://api.openai.com/v1/responses",
      controls: { reasoningEffort: "high" },
      capabilities: {
        thinking: true,
        reasoningEfforts: ["high", "xhigh"],
      },
    },
    {
      id: "claude-sonnet-4-5",
      provider: "anthropic",
    },
  ],
});

const session = agent.createSession();
agent.switchModel("claude-sonnet-4-5", session);

OpenAI 兼容模型的 baseUrl/responses 结尾时使用 Responses API,否则使用 Chat Completions。

模型档案可以包含 providerapiKeybaseUrlstreamcontextWindowTokenscontrolscapabilitiesbilling

使用配置文件

如果更适合用文件配置,可以使用 loadAppConfig()

import { createAgentConfig, createLlmRuntime, loadAppConfig } from "zerodiff-agent";

const appConfig = loadAppConfig(process.cwd());
const llm = createLlmRuntime(appConfig);
const agent = new Agent(createAgentConfig(appConfig, llm));

最小 data/config/config.json

{
  "llm": {
    "provider": "openai",
    "apiKey": "REPLACE_WITH_YOUR_LLM_API_SECRET",
    "baseUrl": "https://api.openai.com/v1",
    "model": "gpt-4o-mini",
    "models": [
      {
        "id": "gpt-4o-mini",
        "provider": "openai",
        "baseUrl": "https://api.openai.com/v1"
      }
    ],
    "maxOutputTokens": 8192,
    "stream": true,
    "controls": {}
  },
  "agent": {
    "maxSteps": 25
  }
}

旧的顶层配置字段会直接报错。请使用嵌套的 llmagent 字段。

调用 loadAppConfig() 时,也会写入当前结构的 data/config/config.example.json

工具

默认 Agent 包含本地代码工具:shell、glob、grep、文件读写编辑 diff、todo、Skill 加载。

需要更小权限面时替换工具集:

import { Agent, defineTool } from "zerodiff-agent";
import { z } from "zod";

const getIssue = defineTool({
  name: "get_issue",
  description: "根据 id 获取 issue。",
  schema: z.strictObject({
    id: z.number().int().positive(),
  }),
  async execute({ id }) {
    return { success: true, issue: await issueClient.get(id) };
  },
});

const agent = new Agent({
  llm,
  model: "gpt-4o-mini",
  toolsOverride: [getIssue],
});

工具返回值必须可 JSON 序列化。预期失败用 success: falseerror 表达。

运行 hook:

const session = agent.createSession();

await agent.run("检查仓库。", {
  session,
  onPreToolUse: ({ toolName, args }) => {
    if (toolName === "shell" && String((args as { command?: unknown }).command).includes("rm -rf")) {
      return { action: "block", reason: "拒绝危险命令" };
    }
  },
  onPreCompact: ({ messages }) => {
    saveFullContext(messages);
  },
  onPostCompact: ({ messagesAfter }) => ({
    messages: [
      { role: "user", content: "继续遵守项目约束。" },
      ...messagesAfter,
    ],
  }),
});

session.enqueueUserGuidance("上一轮完成后,优先解释风险。");

Skills

Skill 是 data/skills 下的指令包。目录中需要有 SKILL.mdskill.md,且 YAML frontmatter 包含 description

默认 skill provider 会把 skill 目录注入系统提示词。内置 list_skillsload_skill 工具可让 Agent 查看并加载 Skill 指令。

const agent = new Agent({
  llm,
  model: "gpt-4o-mini",
  listSkillsInPrompt: false,
});

可选 CLI

包也导出了基于 Ink 的 CLI:

import { createAgentConfig, createLlmRuntime, loadAppConfig } from "zerodiff-agent";
import { startCLI } from "zerodiff-agent/cli";

const appConfig = loadAppConfig(process.cwd());
startCLI(createAgentConfig(appConfig, createLlmRuntime(appConfig)));

CLI 命令包括 /models/model <id>/tokens/messages/prompt/thinking/effort

公共 API

  • AgentAgentSessionrunLoop
  • defineToolcreateToolRegistrycreateDefaultToolRegistrycoreTools
  • loadAppConfigcreateAgentConfigcreateLlmRuntime
  • discoverSkillsloadSkillloadSkillByName
  • AgentAbortErrorisAbortErrorthrowIfAborted
  • startCLIzerodiff-agent/cli 导入