NexAU 的 Node.js/TypeScript 兼容重写版本。
目标是保持与 Python 版运行行为兼容,同时提供更容易嵌入的 CLI / HTTP / STDIO 接口。
- Node.js 22+,TypeScript 严格模式
- Agent 执行主循环:
LLM -> Tool -> LLM - 支持
stop_tools、重试、超时、中断信号、上下文压缩 - 支持子 Agent 调用(含递归深度保护)
- 内置文件 / Shell / Session / Web 工具
- 支持 MCP(HTTP 与 stdio)动态发现并注入工具
- 会话存储:内存模式 + SQLite 持久化
- 传输层:CLI、HTTP(含 SSE 流式事件)、STDIO(JSON Lines)
- Tracer:In-memory 与 Langfuse 适配器
- 跨框架 parity bench(Python baseline vs Node rewrite)
- Node.js
>=22 - pnpm
10.x
pnpm install
pnpm buildagent.yaml:
type: agent
name: demo_agent
system_prompt: You are a concise assistant.
tool_call_mode: openai
llm_config:
model: gpt-4o-mini
base_url: https://api.openai.com/v1
api_key: ${env.OPENAI_API_KEY}pnpm exec nexau chat -c ./agent.yaml -m "你好"或直接用编译产物:
node dist/cli/main.js chat -c ./agent.yaml -m "你好"pnpm exec nexau chat -c ./agent.yaml输入 /exit 或 /quit 退出。
pnpm exec nexau serve http -c ./agent.yaml --host 127.0.0.1 --port 8787pnpm exec nexau serve stdio -c ./agent.yamlNexAU-NodeJS 已内置 Python 基线的 examples/,可在本仓库直接运行兼容示例,不依赖外部 NexAU-latest 目录。
核心示例:
examples/code_agent/code_agent.yamlexamples/deep_research/deep_research_agent.yamlexamples/nexau_building_team/leader_agent.yaml
示例运行(CLI 单轮):
pnpm exec nexau chat -c examples/code_agent/code_agent.yaml -m "请先读取当前目录结构"pnpm exec nexau chat -c <config> [-m <message>] [--stream] [--user-id <id>] [--session-id <id>] [--session-db <path>]-m/--message:单轮模式;不传则进入交互模式--stream:输出执行事件流--session-db:启用 SQLite 会话持久化
pnpm exec nexau serve http -c <config> [--host 127.0.0.1] [--port 8787] [--session-db <path>]pnpm exec nexau serve stdio -c <config> [--session-db <path>]默认由 serve http 启动。
返回:
{ "status": "ok" }返回运行时信息(agent 名称、工具数量、上下文限制等)。
请求体:
{
"input": "hello",
"user_id": "u1",
"session_id": "s1",
"history": []
}同 query 入参,但返回 SSE:
run.startedcontext.compactedllm.requestedllm.respondedtool.calledtool.completedsubagent.calledsubagent.completedrun.completed/run.failedresultend
每行一个 JSON 请求:
{"id":"1","method":"health"}
{"id":"2","method":"info"}
{"id":"3","method":"query","params":{"input":"hello"}}
{"id":"4","method":"stream","params":{"input":"hello"}}返回格式:
{"id":"...","type":"result","result":...}{"id":"...","type":"event","event":...}(仅stream){"id":"...","type":"error","error":{"message":"..."}}
核心字段(节选):
name、descriptionsystem_prompt+system_prompt_type(string|file|jinja)tools(工具 YAML + binding)skills(技能目录,自动注入LoadSkill工具)sub_agents(递归加载)llm_config(模型与请求参数)stop_toolsmiddlewaresmcp_serverstracersmax_context_tokens(默认128000)max_iterations(默认100)retry_attempts(默认5)timeout(秒,默认300)tool_call_mode:xml | openai | anthropic
支持:
${this_file_dir}${env.VAR_NAME}${variables.foo.bar}(二次解析,且仅允许标量替换)
llm_config 中未显式提供时,按以下优先组读取:
model:MODEL/OPENAI_MODEL/LLM_MODELbase_url:OPENAI_BASE_URL/BASE_URL/LLM_BASE_URLapi_key:LLM_API_KEY/OPENAI_API_KEY/API_KEY/ANTHROPIC_API_KEY
支持两种 API 形态:
api_type: openai_chat_completion(默认)api_type: openai_responses
按工具名/绑定可解析到实现:
- 文件类:
read_file/write_file/replace/list_directory/glob/search_file_content/read_many_files - 文件增强:
apply_patch/read_visual_file - Shell:
run_shell_command - Session:
save_memory/write_todos/ask_user/complete_task - Web:
web_search/web_read/WebSearch/WebRead/WebFetch - 兼容别名:
Bash/TodoWrite/Write
说明:
web_search当前为 stub(返回空结果集)web_fetch会抓取网页并返回去标签后的文本摘要BackgroundTaskManage当前为未实现占位read_visual_file当前支持图片读取(base64 data URL);视频输入返回兼容元信息占位apply_patch支持 Codex 风格*** Begin Patch/*** End Patch增删改与 move
- 默认:
InMemorySessionManager - 启用持久化:通过
--session-db <path>使用SqliteSessionManager - 会话键维度:
user_id + session_id + agent_id agent_id使用配置指纹(name#hash),避免同名不同配置串话- 兼容旧数据:若新键无状态,会回退读取 legacy 键并迁移
mcp_servers 支持:
- HTTP JSON-RPC
- stdio(
Content-Lengthframed JSON-RPC)
启动时会执行工具发现,并把 MCP 工具注入为本地工具名:
mcp__<server_name>__<tool_name>
- 内置识别
LoggingMiddleware变体(写入agentState日志) - 未识别中间件按 pass-through 处理(保证旧 YAML 可运行)
InMemoryTracerLangfuseTracer(向/api/public/ingestion上报)- 多 tracer 自动组合为
CompositeTracer
pnpm build
pnpm format
pnpm format:check
pnpm lint
pnpm typecheck
pnpm test
pnpm check跨框架 parity:
pnpm parity:cross
pnpm parity:cross:check
pnpm parity:assets
pnpm parity:assets:check
pnpm parity:all
pnpm parity:all:check
pnpm parity:all:failures
pnpm parity:all:diagnose
pnpm parity:all:triage默认输出到临时目录(命令 stdout 会返回路径)。 如需落盘到仓库目录,使用:
python3 compat/parity/cross-framework/run_compare.py --output-dir compat/parity/cross-framework/results当前 parity gate 除了 prompt payload 一致外,还会检查:
- 工具调用的一致性(名称顺序 + tool_call_id + 参数)
- 最终输出一致性
- 长上下文压缩中的 compaction 次数与最终消息数 delta
examples/结构化资产(yaml/yml/json)语义一致性(缺失/语义差异 gate)- 可选:非结构化资产严格门禁(全部严格或按路径前缀严格)
统一汇总报告(runtime + assets)由 parity:all 生成,默认输出临时目录并返回路径。
报告会同时输出 runtime 场景级摘要表和 asset 差异分类摘要,便于快速定位偏差来源。
当 CI 失败时,优先使用 parity:all:failures 获取失败优先摘要(仅失败项)。
随后运行 parity:all:diagnose,可直接拿到 failure_highlights 与对应 runtime/asset 明细片段。
若只需要关键字段,可直接用 parity:all:triage(一条命令,无需 jq)。
src/
cli/ # commander 命令入口
core/ # AgentConfig / LLMConfig / Executor
tool/ # Tool 抽象、内置工具、MCP 客户端
transport/ # RuntimeService + HTTP/STDIO 服务
session/ # 内存与 SQLite 会话管理
tracer/ # tracing 抽象与适配器
compat/ # YAML 变量兼容层
docs/ # 兼容矩阵、差异说明、集成案例
compat/parity/ # 跨框架基准、fixture、报告
flowchart TD
A["CLI / HTTP / STDIO"] --> B["RuntimeService"]
B --> C["SessionManager (InMemory / SQLite)"]
B --> D["Agent"]
D --> E["MCP tools 初始化 (可选)"]
D --> F["AgentExecutor"]
F --> G["Middleware Pipeline"]
F --> H["LLM Client (OpenAI-compatible)"]
F --> I["Tool 调用 (builtin / MCP / YAML)"]
F --> J["Sub-agent 递归调用"]
F --> K["Tracer (InMemory / Langfuse / Composite)"]
I --> L["Tool Registry + Tool Schema Validate"]
H --> M["HTTP fetch: /chat/completions or /responses"]
请求路径统一为:
- 入口层(CLI/HTTP/STDIO)把请求规范化为
RuntimeRequest RuntimeService读取/更新会话状态(history + agentState)Agent确保 MCP 工具注入完成后调用AgentExecutorAgentExecutor执行LLM -> Tool -> LLM迭代直到完成、停止或失败- 结果写回会话存储,并返回标准化响应
| 模块 | 主要职责 | 直接依赖 | 被谁依赖 |
|---|---|---|---|
src/cli |
命令行参数解析与子命令分发 | core, transport, session |
用户入口 |
src/transport |
HTTP/STDIO 协议适配与运行时封装 | core, session |
cli、外部服务 |
src/core/agent-config.ts |
YAML 配置解析、校验、默认值、子 agent/skill/tool 组装 | compat/yaml-loader, tool/tool, llm-config |
cli, Agent, 测试 |
src/core/agent.ts |
Agent 运行门面,MCP 工具延迟注入 | core/execution/executor, tool/builtin/mcp-client |
RuntimeService |
src/core/execution |
执行主循环、中断、重试、超时、上下文压缩、并发工具调用 | tool, tracer |
Agent |
src/tool/tool.ts |
Tool 抽象、JSON Schema 校验、执行错误统一包装 | ajv, yaml, registry |
core, mcp-client |
src/tool/registry.ts |
binding/tool-name 到实现函数映射 | tool/builtin/* |
Tool |
src/tool/builtin/mcp-client.ts |
MCP server 发现工具并封装为本地 Tool |
tool/tool, fetch, child_process |
Agent |
src/session |
会话状态存取(内存/SQLite) | node:sqlite(SQLite 实现) |
RuntimeService, CLI |
src/tracer |
追踪抽象、路由与适配器组合 | fetch(Langfuse) |
AgentExecutor |
src/compat |
${env.*}、${variables.*}、${this_file_dir} 模板替换 |
yaml |
AgentConfig |
| 功能 | 关键内部依赖 | 外部依赖/协议 | 关键配置字段 |
|---|---|---|---|
| 聊天执行(单轮/多轮) | RuntimeService, Agent, AgentExecutor |
OpenAI-compatible HTTP API | llm_config, max_iterations, timeout |
| 工具调用(本地) | Tool, registry, tool/builtin/* |
JSON Schema Draft-07 | tools[].yaml_path, tools[].binding |
| 工具并发执行 | AgentExecutor 并发分支 |
Node Promise 调度 | disable_parallel, stop_tools |
| 子 Agent 协作 | AgentConfig.sub_agents, AgentExecutor |
递归调用 | sub_agents, max_running_subagents |
| 长上下文压缩 | AgentExecutor + middleware 参数解析 |
内部 token 估算策略 | max_context_tokens, middlewares |
| 会话持久化 | RuntimeService + SqliteSessionManager |
SQLite WAL | --session-db, user_id/session_id |
| MCP 工具接入 | initializeMcpTools, McpHttpClient, McpStdioClient |
MCP JSON-RPC(HTTP / stdio framing) | mcp_servers |
| 可观测性追踪 | resolveTracer, LangfuseTracer, CompositeTracer |
Langfuse ingestion API | tracers, LANGFUSE_* |
| HTTP 服务 | transport/http/server.ts |
REST + SSE | serve http 参数 |
| STDIO 服务 | transport/stdio/server.ts |
JSON Lines | serve stdio 参数 |
| 依赖 | 用途 | 使用位置 |
|---|---|---|
commander |
CLI 命令定义与参数解析 | src/cli/main.ts |
yaml |
解析 agent/tool YAML | src/core/agent-config.ts, src/tool/tool.ts, src/compat/yaml-loader.ts |
zod |
Agent 配置结构校验 | src/core/agent-config.ts |
ajv |
Tool input_schema JSON Schema 校验 |
src/tool/tool.ts |
minimatch |
文件 glob / include / ignore 匹配 | src/tool/builtin/file-tools.ts |
node:sqlite |
SQLite 会话持久化 | src/session/sqlite-session-manager.ts |
| 你要改的目标 | 首先关注的目录 |
|---|---|
| 新增 CLI 子命令 | src/cli/main.ts, src/cli/commands/* |
| 新增/修改运行时协议 | src/transport/http, src/transport/stdio, src/transport/runtime-service.ts |
| 调整 Agent 执行行为 | src/core/execution/executor.ts, src/core/execution/middleware.ts |
| 扩展配置字段 | src/core/agent-config.ts + 对应测试 |
| 新增内置工具 | src/tool/builtin/*, src/tool/registry.ts |
| 接入新 tracer | src/tracer/resolve.ts, src/tracer/adapters/* |
| 会话模型变更 | src/session/*, src/transport/runtime-service.ts |
| 兼容性回归验证 | compat/parity/*, docs/compat-*.md |
docs/compat-matrix.mddocs/compat-differences.mddocs/integration-cases.md