logo
2
4
WeChat Login

agent-mini logo

agent-mini

CI-First AI Agent CLI 工具

agent-mini 是一个极简的 AI Agent CLI 工具,具备 ReAct 推理循环、8 个内置工具、技能系统和会话持久化。

使用方式

# 交互模式
npc

# 单次调用
npc agent --message "帮我查看 package.json"

# JSON 格式输出(方便程序化调用)
npc agent --json --message "列出当前目录的文件"

# 指定会话 ID(多轮对话复用)
npc agent --message "继续上次的任务" --session-id "my_session"

# 外部注入 system prompt
npc agent --message "评审这个 PR" --system-prompt "你是代码评审专家"

# 图片识别(需配置 vision,见下方说明)
npc agent --message "帮我识别这张图片" --images https://example.com/screenshot.png

# 多张图片
npc agent --message "对比这两张截图的差异" --images https://example.com/before.png https://example.com/after.png

# 图片 + JSON 输出
npc agent --json --message "识别图片中的文字" --images https://example.com/doc.png

# 测试模式
npc --test

CLI 参数

参数缩写说明
agent-子命令,进入单次调用模式
--message-m发送的消息内容
--session-id-s会话 ID(默认 cli:local
--system-prompt-外部注入的 system prompt
--json-JSON 格式输出
--test-测试模式,发送测试消息后退出

配置

多来源配置,优先级:CLI 参数 > 环境变量 (.env) > 配置文件 (npc.json) > 默认值

配置文件按顺序查找:$NPC_CONFIG_PATH./npc.json~/.npc/npc.json

最小配置

只需指定 API Key 和 Base URL 即可运行:

{
  "agent": {
    "defaultModel": "deepseek-chat",
    "providers": {
      "openai": {
        "apiKey": "sk-xxx",
        "baseUrl": "https://api.deepseek.com/v1"
      }
    }
  }
}

自定义 Base URL 和模型

NPC 支持任何 OpenAI 兼容的 API 端点。通过 npc.jsonagent.providers 字段配置。

Provider 配置字段

字段类型必填说明
agent.defaultModelstring全局默认模型名(默认 gpt-4o
agent.providerstring首选 provider 名(对应 providers 中的 key)
agent.providers.<name>.apiKeystringAPI 密钥,支持 ${ENV_VAR} 环境变量模板
agent.providers.<name>.baseUrlstringAPI 基础 URL,支持 ${ENV_VAR} 环境变量模板
agent.providers.<name>.modelstringProvider 级模型名,优先于 defaultModel
agent.providers.<name>.typestringopenai / openai-compatible / anthropic(不填则自动推断)

示例:使用 DeepSeek

{
  "agent": {
    "defaultModel": "deepseek-chat",
    "providers": {
      "openai": {
        "apiKey": "sk-xxx",
        "baseUrl": "https://api.deepseek.com/v1"
      }
    }
  }
}

示例:使用 Anthropic Claude

{
  "agent": {
    "providers": {
      "anthropic": {
        "apiKey": "sk-ant-xxx",
        "model": "claude-sonnet-4-20250514"
      }
    }
  }
}

示例:使用自建/代理 API(Ollama、vLLM 等)

{
  "agent": {
    "providers": {
      "openai": {
        "apiKey": "any-value",
        "baseUrl": "http://localhost:11434/v1",
        "model": "llama3",
        "type": "openai-compatible"
      }
    }
  }
}

示例:多 Provider 切换

可以配置多个 provider,通过 agent.provider 指定使用哪个:

{
  "agent": {
    "provider": "deepseek",
    "providers": {
      "openai": {
        "apiKey": "sk-openai-xxx",
        "baseUrl": "https://api.openai.com/v1",
        "model": "gpt-4o"
      },
      "deepseek": {
        "apiKey": "sk-deepseek-xxx",
        "baseUrl": "https://api.deepseek.com/v1",
        "model": "deepseek-chat",
        "type": "openai-compatible"
      },
      "anthropic": {
        "apiKey": "sk-ant-xxx",
        "model": "claude-sonnet-4-20250514"
      }
    }
  }
}

不指定 agent.provider 时,自动选择优先级:anthropic > openai > 其他(取第一个有 apiKey 的)。

使用环境变量模板(推荐)

配置文件中的字符串值支持 ${VAR_NAME} 语法引用环境变量,避免明文密钥:

{
  "agent": {
    "providers": {
      "openai": {
        "apiKey": "${MY_API_KEY}",
        "baseUrl": "${MY_BASE_URL}",
        "model": "gpt-4o"
      }
    }
  }
}

在项目根目录的 .env 文件或系统环境变量中设置:

MY_API_KEY=sk-xxxxxxxxxxxx
MY_BASE_URL=https://api.openai.com/v1

Type 自动推断

未显式设置 type 时,系统按以下规则自动推断:

条件推断为
model 名包含 claudeanthropic
model 名包含 gpt 或匹配 o1/o3openai
有 baseUrl 且 URL 包含 anthropicanthropic
有 baseUrl(其他情况)openai-compatible
都不匹配openai-compatible(兜底)

Vision 配置(可选)

当主模型不支持图片识别时,可配置独立的视觉模型。图片会先由 vision 模型识别为文本描述,再发给主模型处理。不配置则直接透传图片给主模型(要求主模型本身支持 vision)。

{
  "agent": {
    "defaultModel": "deepseek-chat",
    "providers": {
      "openai": { "apiKey": "sk-xxx", "baseUrl": "https://api.deepseek.com/v1" }
    },
    "vision": {
      "model": "gpt-4o",
      "provider": {
        "apiKey": "sk-xxx",
        "baseUrl": "https://api.openai.com/v1"
      }
    }
  }
}
字段说明
vision.model视觉模型名称,如 gpt-4o / glm-4v-plus / qwen-vl-max
vision.provider.apiKey可选,不配则复用主 provider 的 apiKey
vision.provider.baseUrl可选,不配则复用主 provider 的 baseUrl

环境变量

除了配置文件,也可以直接通过环境变量配置(优先级高于配置文件):

# 基础配置
OPENAI_API_KEY=sk-xxx              # → providers.openai.apiKey
LLM_BASE_URL=https://api.xxx/v1   # → providers.openai.baseUrl(type 自动改为 openai-compatible)
LLM_MODEL=gpt-4o                  # → agent.defaultModel
LLM_PROVIDER=openai               # → agent.provider

# Anthropic
ANTHROPIC_API_KEY=sk-ant-xxx       # → providers.anthropic.apiKey
ANTHROPIC_BASE_URL=https://...     # → providers.anthropic.baseUrl

# 可选
BRAVE_SEARCH_API_KEY=xxx           # 启用 Brave 搜索

# Vision(可选)
VISION_MODEL=gpt-4o
VISION_API_KEY=sk-xxx
VISION_BASE_URL=https://api.openai.com/v1

⚠️ 注意:LLM_BASE_URL 必须配合 OPENAI_API_KEY 一起设置才能生效。

环境变量覆盖采用"打包覆盖"策略——LLM_BASE_URL 嵌套在 OPENAI_API_KEY 的判断逻辑内。如果你在 npc.json 中通过 ${CNB_TOKEN} 等模板配置了 apiKey,但没有设置 OPENAI_API_KEY 环境变量,则单独设置 LLM_BASE_URL 不会生效

# ❌ 不生效:npc.json 里已有 apiKey,但没设 OPENAI_API_KEY 环境变量
export LLM_BASE_URL=https://api.example.com/v1

# ✅ 正确:同时设置 OPENAI_API_KEY,环境变量覆盖才会触发
export OPENAI_API_KEY=your-token
export LLM_BASE_URL=https://api.example.com/v1

# ✅ 或者:直接在 npc.json 中用 ${ENV} 模板配置 baseUrl,无需依赖环境变量覆盖
# { "agent": { "providers": { "openai": { "apiKey": "${MY_TOKEN}", "baseUrl": "${MY_BASE_URL}" } } } }

Skills(技能系统)

NPC 内置了一套技能系统,允许你通过 SKILL.md 文件为 Agent 注入领域知识、工作流程和自定义工具,无需修改源代码。

搜索目录与优先级

Skills 从以下目录自动加载,后加载的同名 skill 会覆盖先加载的

优先级目录说明
1(最低)<安装目录>/skills/bundled/内置 skills
2~/.npc/skills/全局用户 skills
3<项目>/skills/项目级 skills
4(最高)配置文件 skills.dirs 中指定的目录自定义额外目录

创建一个 Skill

每个 skill 是一个独立目录,必须包含 SKILL.md 文件:

skills/
└── my-skill/
    ├── SKILL.md          # 必须:技能定义文件
    ├── tools/            # 可选:自带工具
    │   └── my-tool.js
    └── scripts/          # 可选:脚本

SKILL.md 格式

SKILL.md 使用 YAML frontmatter + Markdown 正文。frontmatter 定义元数据,正文作为 prompt 注入到 Agent 的 system prompt 中:

---
name: my-skill # 必填:技能唯一标识
description: 我的自定义技能 # 必填:技能描述
version: "1.0" # 可选:版本号
requires: # 可选:运行条件检查
  bins: [node, npm] #   依赖的系统命令
  env: [MY_API_KEY] #   依赖的环境变量
os: [darwin, linux] # 可选:支持的操作系统
tools: # 可选:自带工具声明
  - name: my_tool
    file: ./tools/my-tool.js
depends: # 可选:依赖其他 skill
  - name: other-skill
    optional: true
---
## 你是 XXX 专家

这里写 prompt 正文,会自动注入到 Agent  system prompt 中。
可以包含工作流程、规范、示例等任何 Markdown 内容。

自带工具

Skill 可以声明自带工具(JS 模块),工具需要导出一个符合 Tool 接口的对象:

// tools/my-tool.js
export default {
  name: "my_tool",
  description: "我的自定义工具",
  parameters: {
    type: "object",
    properties: {
      input: { type: "string", description: "输入参数" },
    },
    required: ["input"],
  },
  async execute(params) {
    // 实现逻辑...
    return { success: true, output: "执行结果" };
  },
};

配置文件中的 Skills 配置

npc.json 中通过 skills 字段配置:

{
  "skills": {
    "dirs": ["./my-skills", "/path/to/shared-skills"],
    "entries": {
      "my-skill": {
        "apiKey": "${MY_SKILL_API_KEY}",
        "env": { "CUSTOM_VAR": "value" },
        "disabled": false
      }
    }
  }
}
字段类型说明
skills.dirsstring[]额外的技能搜索目录
skills.entries.<name>.apiKeystring注入到该技能的 API Key,支持 ${ENV} 模板
skills.entries.<name>.envRecord<string, string>注入到该技能的环境变量
skills.entries.<name>.disabledboolean设为 true 禁用该技能

示例:创建一个代码评审 Skill

  1. 创建目录和文件:
mkdir -p skills/code-review
  1. 编写 skills/code-review/SKILL.md
---
name: code-review
description: 代码评审专家,遵循团队规范进行代码审查
version: "1.0"
---
## 代码评审规范

你是一个代码评审专家,在评审代码时请遵循以下规范:

1. **命名规范**:变量使用 camelCase,常量使用 UPPER_SNAKE_CASE
2. **错误处理**:所有异步操作必须有错误处理
3. **性能**:避免不必要的重渲染和内存泄漏
4. **安全**:检查 SQL 注入、XSS 等安全隐患
  1. 启动 NPC,skill 会自动加载。

远程 Skills

支持从 Git 仓库同步 skills:

{
  "skills": {
    "remotes": [
      {
        "url": "https://cnb.cool/org/skills-repo.git",
        "path": "skills/",
        "ref": "main"
      }
    ]
  }
}

远程 skills 会浅克隆到 ~/.npc/skills-cache/ 目录,支持增量更新。

热重载

开发模式下,修改 SKILL.md 文件会自动触发热重载,无需重启 Agent。

Docker

docker build -t npc .
docker run -it npc
docker run npc agent --message "列出文件"

License

MIT

About

No description, topics, or website provided.
804.00 KiB
2 forks4 stars12 branches0 TagREADMEMIT license
Language
TypeScript97.1%
JavaScript2.8%
Dockerfile0.1%