@zqagent/core 0.0.0-stage → 0.1.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +182 -2
- package/bin/zqagent +2 -0
- package/dist/ToolRegistry-BmvPxgMr.d.cts +209 -0
- package/dist/ToolRegistry-BmvPxgMr.d.ts +209 -0
- package/dist/cli/index.cjs +6317 -0
- package/dist/cli/index.cjs.map +1 -0
- package/dist/cli/index.d.cts +2 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +6293 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/explore-OI6htHN1.d.cts +594 -0
- package/dist/explore-Pmhyk4gv.d.ts +594 -0
- package/dist/index.cjs +5053 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +442 -0
- package/dist/index.d.ts +442 -0
- package/dist/index.js +4977 -0
- package/dist/index.js.map +1 -0
- package/dist/server/index.cjs +5398 -0
- package/dist/server/index.cjs.map +1 -0
- package/dist/server/index.d.cts +2 -0
- package/dist/server/index.d.ts +2 -0
- package/dist/server/index.js +5374 -0
- package/dist/server/index.js.map +1 -0
- package/dist/tools/ask.cjs +81 -0
- package/dist/tools/ask.cjs.map +1 -0
- package/dist/tools/ask.d.cts +14 -0
- package/dist/tools/ask.d.ts +14 -0
- package/dist/tools/ask.js +55 -0
- package/dist/tools/ask.js.map +1 -0
- package/dist/tools/diff.cjs +424 -0
- package/dist/tools/diff.cjs.map +1 -0
- package/dist/tools/diff.d.cts +6 -0
- package/dist/tools/diff.d.ts +6 -0
- package/dist/tools/diff.js +389 -0
- package/dist/tools/diff.js.map +1 -0
- package/dist/tools/directories.cjs +86 -0
- package/dist/tools/directories.cjs.map +1 -0
- package/dist/tools/directories.d.cts +16 -0
- package/dist/tools/directories.d.ts +16 -0
- package/dist/tools/directories.js +60 -0
- package/dist/tools/directories.js.map +1 -0
- package/dist/tools/explore.cjs +2433 -0
- package/dist/tools/explore.cjs.map +1 -0
- package/dist/tools/explore.d.cts +4 -0
- package/dist/tools/explore.d.ts +4 -0
- package/dist/tools/explore.js +2394 -0
- package/dist/tools/explore.js.map +1 -0
- package/dist/tools/files.cjs +297 -0
- package/dist/tools/files.cjs.map +1 -0
- package/dist/tools/files.d.cts +11 -0
- package/dist/tools/files.d.ts +11 -0
- package/dist/tools/files.js +262 -0
- package/dist/tools/files.js.map +1 -0
- package/dist/tools/git.cjs +173 -0
- package/dist/tools/git.cjs.map +1 -0
- package/dist/tools/git.d.cts +6 -0
- package/dist/tools/git.d.ts +6 -0
- package/dist/tools/git.js +148 -0
- package/dist/tools/git.js.map +1 -0
- package/dist/tools/plan.cjs +84 -0
- package/dist/tools/plan.cjs.map +1 -0
- package/dist/tools/plan.d.cts +17 -0
- package/dist/tools/plan.d.ts +17 -0
- package/dist/tools/plan.js +58 -0
- package/dist/tools/plan.js.map +1 -0
- package/dist/tools/search.cjs +95 -0
- package/dist/tools/search.cjs.map +1 -0
- package/dist/tools/search.d.cts +6 -0
- package/dist/tools/search.d.ts +6 -0
- package/dist/tools/search.js +70 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/shell.cjs +116 -0
- package/dist/tools/shell.cjs.map +1 -0
- package/dist/tools/shell.d.cts +6 -0
- package/dist/tools/shell.d.ts +6 -0
- package/dist/tools/shell.js +81 -0
- package/dist/tools/shell.js.map +1 -0
- package/dist/tools/todo.cjs +89 -0
- package/dist/tools/todo.cjs.map +1 -0
- package/dist/tools/todo.d.cts +27 -0
- package/dist/tools/todo.d.ts +27 -0
- package/dist/tools/todo.js +63 -0
- package/dist/tools/todo.js.map +1 -0
- package/dist/tools/web.cjs +467 -0
- package/dist/tools/web.cjs.map +1 -0
- package/dist/tools/web.d.cts +35 -0
- package/dist/tools/web.d.ts +35 -0
- package/dist/tools/web.js +432 -0
- package/dist/tools/web.js.map +1 -0
- package/package.json +182 -4
package/README.md
CHANGED
|
@@ -1,3 +1,183 @@
|
|
|
1
|
-
#
|
|
1
|
+
# zqagent TS
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
TypeScript 实现的 zqagent Agent 引擎核心(CLI),复刻 Python 版的核心机制:
|
|
4
|
+
|
|
5
|
+
- **TurnEngine** — 异步生成器事件循环,驱动"思考 → 工具调用 → 观察"的迭代
|
|
6
|
+
- **ToolRegistry** — 工具注册 / 执行 / 元数据管理
|
|
7
|
+
- **PermissionEngine** — 工具风险分类 + 运行模式门控 + Y/N 交互审批
|
|
8
|
+
- **OpenAIProvider** — 基于 OpenAI SDK 的流式 LLM 调用
|
|
9
|
+
|
|
10
|
+
## 快速开始
|
|
11
|
+
|
|
12
|
+
### 全局安装(推荐)
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
# 从私有仓库全局安装(其它机器需先配置该 registry,或加 --registry 参数)
|
|
16
|
+
npm i -g @zqagent/core --registry=https://npm2.cd-zq.com/
|
|
17
|
+
|
|
18
|
+
# 启动 CLI
|
|
19
|
+
zqagent
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
启动后无需手动写 `.env`,输入 `/connect` 即可交互式配置 LLM 连接:
|
|
23
|
+
选择 provider(DeepSeek / OpenAI / 自定义)→ 输入 API Key → 自动刷新模型列表并选择 →
|
|
24
|
+
设置推理强度。API Key 会 AES-256-GCM 加密保存到本机 `~/.config/zqagent/`。
|
|
25
|
+
|
|
26
|
+
### 本地开发
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
# 安装依赖
|
|
30
|
+
npm install
|
|
31
|
+
|
|
32
|
+
# 配置环境变量(复制为 .env 后填写),或启动后直接 /connect
|
|
33
|
+
# OPENAI_API_KEY=sk-... # 必填(未用 /connect 时)
|
|
34
|
+
# OPENAI_MODEL=gpt-4o # 可选,默认 gpt-4o
|
|
35
|
+
# OPENAI_BASE_URL=... # 可选,自定义端点
|
|
36
|
+
# WORKSPACE=./ # 可选,工作区根目录,默认当前目录
|
|
37
|
+
cp .env.example .env
|
|
38
|
+
|
|
39
|
+
# 启动 CLI
|
|
40
|
+
npm run dev
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## 使用
|
|
44
|
+
|
|
45
|
+
启动后进入交互式 CLI,直接输入自然语言任务即可。内置命令:
|
|
46
|
+
|
|
47
|
+
| 命令 | 说明 |
|
|
48
|
+
| --- | --- |
|
|
49
|
+
| `/plan` | 切换为计划模式(只读探索 + 计划提案) |
|
|
50
|
+
| `/interactive` | 切换为交互式审批模式(默认) |
|
|
51
|
+
| `/auto` | 切换为全自动模式(无需审批,高风险) |
|
|
52
|
+
| `/discuss` | 切换为讨论模式(只读对话) |
|
|
53
|
+
| `/mode` | 显示当前模式 |
|
|
54
|
+
| `/connect` | 连接 LLM(选 provider → key → 刷新模型列表 → 推理强度) |
|
|
55
|
+
| `/connect rm` | 清除连接配置(回退到环境变量) |
|
|
56
|
+
| `/sessions` | 列出已保存会话并选择恢复(切换后回显最近消息) |
|
|
57
|
+
| `/history` | 列出当前会话的用户指令 |
|
|
58
|
+
| `/model <id>` | 切换 LLM 模型 |
|
|
59
|
+
| `/agent <name>` | 切换 agent(Prompt + 可选模型同步) |
|
|
60
|
+
| `/agents` | 列出所有 agent(当前高亮) |
|
|
61
|
+
| `/agent add <name> <prompt...>` | 新增自定义 agent |
|
|
62
|
+
| `/agent edit <name> <prompt...>` | 修改 agent 的 Prompt(当前 agent 即时热更新) |
|
|
63
|
+
| `/agent rm <name>` | 删除 agent |
|
|
64
|
+
| `/agent show [name]` | 查看 agent 详情 |
|
|
65
|
+
| `/mcp` | 列出 MCP 服务器与连接状态 |
|
|
66
|
+
| `/mcp add <name> stdio <cmd...>\|http <url>` | 添加并连接 MCP 服务器(工具自动注入) |
|
|
67
|
+
| `/mcp rm\|enable\|disable\|refresh [name]` | 移除 / 启用 / 禁用 / 刷新工具列表 |
|
|
68
|
+
| `/tools` | 列出所有工具(来源、风险、禁用状态) |
|
|
69
|
+
| `/tool add <name> <cmd...>` | 添加命令工具(执行 shell 命令) |
|
|
70
|
+
| `/tool rm\|disable\|enable <name>` | 移除 / 禁用 / 启用工具 |
|
|
71
|
+
| `/clear` | 清空会话,重建引擎 |
|
|
72
|
+
| `quit` / `exit` | 退出 |
|
|
73
|
+
| `reset` | 重置会话 |
|
|
74
|
+
|
|
75
|
+
> **Agent 机制**:内置 `code`(编程助手)/ `cowork`(通用协作)两个 agent。
|
|
76
|
+
> 通过 `/agent add / edit / rm` 可运行时维护任意数量的 agent(名称 + Prompt + 可选模型);
|
|
77
|
+
> 定义持久化到项目内 `.agent/agents.json`(可提交 git,随项目共享)。
|
|
78
|
+
> 切换 agent 时若其配置了 `model`,LLM 模型会同步切换;否则沿用当前模型。
|
|
79
|
+
> 提示符以 `[模式][agent名] > ` 形式展示当前状态,如 `[plan][code] > `。
|
|
80
|
+
|
|
81
|
+
> **MCP 与工具管理**:运行时可通过 `/mcp add` 注入外部 MCP 服务器
|
|
82
|
+
> (stdio 本地进程或 http 远程端点),其工具自动以 `mcp__<server>__<tool>`
|
|
83
|
+
> 前缀注册到工具表;`/tool add` 可创建执行 shell 命令的命令工具。
|
|
84
|
+
> 引擎每次请求都实时拉取工具 schema,因此工具的新增 / 移除 / 禁用 / 替换
|
|
85
|
+
> 对下一次 LLM 调用立即生效,无需重启。
|
|
86
|
+
> MCP 服务器配置持久化到 `.agent/mcp.json`,命令工具到 `.agent/tools.json`
|
|
87
|
+
> (均随项目走,可提交 git);MCP 注入工具默认按高风险归类,交互模式下需逐次审批。
|
|
88
|
+
|
|
89
|
+
### 运行模式
|
|
90
|
+
|
|
91
|
+
| 模式 | 行为 |
|
|
92
|
+
| --- | --- |
|
|
93
|
+
| `discuss` | 只读,禁止一切写入与执行 |
|
|
94
|
+
| `plan` | 只读,禁止一切写入与执行,面向计划提案 |
|
|
95
|
+
| `interactive` | 有副作用的操作需用户逐次审批(默认) |
|
|
96
|
+
| `auto` | 有副作用的操作全部放行(高风险,需自行承担) |
|
|
97
|
+
|
|
98
|
+
交互模式下,审批卡片支持:`Y` 允许一次 / `A` 总是允许此工具 / `D` 拒绝;
|
|
99
|
+
`run_shell` 额外支持 `C` 总是允许此命令(按具体命令白名单,比放行整个工具更安全)。
|
|
100
|
+
|
|
101
|
+
## 内置工具(18 个)
|
|
102
|
+
|
|
103
|
+
| 类别 | 工具 |
|
|
104
|
+
| --- | --- |
|
|
105
|
+
| 文件 | `read_file`, `write_file`, `replace_in_file`, `list_files`, `grep` |
|
|
106
|
+
| Shell | `run_shell`(持久化 shell,命令白名单在 Auto 模式下自动放行) |
|
|
107
|
+
| 网络 | `web_search`, `web_fetch` |
|
|
108
|
+
| Git | `git_log`, `git_status`, `git_diff`(只读) |
|
|
109
|
+
| 补丁 | `apply_patch`, `apply_unified_diff` |
|
|
110
|
+
| 协作 | `ask_user`, `propose_plan`, `request_directory` |
|
|
111
|
+
| 任务 | `todo_write`(共享进度状态) |
|
|
112
|
+
| 子代理 | `explore`(独立 TurnEngine 实例,只读研究) |
|
|
113
|
+
|
|
114
|
+
## 项目结构
|
|
115
|
+
|
|
116
|
+
```
|
|
117
|
+
src/
|
|
118
|
+
├── index.ts # CLI 入口:装配组件、命令行审批器、事件渲染
|
|
119
|
+
├── agents/
|
|
120
|
+
│ └── AgentRegistry.ts # Agent 注册表(运行时增删改查 / 切换 agent)
|
|
121
|
+
├── mcp/
|
|
122
|
+
│ ├── McpClient.ts # 单个 MCP 服务器客户端(stdio / http)
|
|
123
|
+
│ └── McpManager.ts # 多服务器管理 + 工具动态注入 ToolRegistry
|
|
124
|
+
├── engine/
|
|
125
|
+
│ ├── TurnEngine.ts # 异步生成器事件循环
|
|
126
|
+
│ ├── events.ts # 事件类型定义
|
|
127
|
+
│ └── types.ts
|
|
128
|
+
├── permissions/
|
|
129
|
+
│ └── PermissionEngine.ts # 风险分类 + 模式门控 + 审批决策
|
|
130
|
+
├── providers/
|
|
131
|
+
│ └── OpenAIProvider.ts # 流式 LLM 调用
|
|
132
|
+
├── prompts/
|
|
133
|
+
│ └── index.ts # 中文系统提示词模板
|
|
134
|
+
└── tools/
|
|
135
|
+
├── ToolRegistry.ts # 工具注册表(注册/移除/禁用/替换)
|
|
136
|
+
├── files.ts shell.ts search.ts web.ts
|
|
137
|
+
├── git.ts diff.ts todo.ts explore.ts
|
|
138
|
+
└── ask.ts plan.ts directories.ts
|
|
139
|
+
test/ # Vitest 单元测试
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
## 开发
|
|
143
|
+
|
|
144
|
+
```bash
|
|
145
|
+
npm run build # tsc 类型检查与构建
|
|
146
|
+
npm test # Vitest 运行测试
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
## 云端多租户 Server
|
|
150
|
+
|
|
151
|
+
`src/server/` 提供多租户云端化 API(独立于 CLI):每租户独立工作区/模型配置/状态存储,
|
|
152
|
+
支持审批与提问的**挂起 → 持久化 → 超时回收 → resume 恢复**完整链路。
|
|
153
|
+
|
|
154
|
+
```bash
|
|
155
|
+
npm run server # 启动(默认端口 8787,首次启动自动创建演示租户 demo/demo-key)
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
- 完整 curl 教程(审批/提问/超时回收/多租户隔离):[docs/server-api.md](docs/server-api.md)
|
|
159
|
+
- 一键测试:`bash scripts/test-server.sh`(无需 Key 的烟雾测试,18 项);模型配置
|
|
160
|
+
(`OPENAI_API_KEY` 等)未显式设置时自动从项目 `.env` 读取,此时为完整链路测试
|
|
161
|
+
(真实对话 + 提问挂起 + 超时回收 + resume 恢复,24 项)
|
|
162
|
+
|
|
163
|
+
## 桌面应用(macOS / Windows)
|
|
164
|
+
|
|
165
|
+
`desktop/` 把 Server 打包成桌面应用:Tauri 2 外壳 + 内嵌 Node sidecar,前端复用
|
|
166
|
+
`test_web/` 的 React 页面(本地引擎自动连接、托盘常驻、自动更新)。
|
|
167
|
+
|
|
168
|
+
```bash
|
|
169
|
+
# 开发调试
|
|
170
|
+
cd desktop && npm install && npm run tauri dev
|
|
171
|
+
|
|
172
|
+
# 一键构建
|
|
173
|
+
./desktop/scripts/build_macos.sh # macOS → DMG
|
|
174
|
+
.\desktop\scripts\build_windows.ps1 # Windows → NSIS + MSI
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
详见 [desktop/README.md](desktop/README.md)。
|
|
178
|
+
|
|
179
|
+
## 测试 Web 界面(test_web/)
|
|
180
|
+
|
|
181
|
+
`test_web/` 是 Server 的 React 测试页:多租户 profile 管理、会话/审批/提问全链路。
|
|
182
|
+
桌面壳会注入 `window.__ZQ_HTTP__/__ZQ_API_KEY__` 并自动注册「本地引擎」profile,
|
|
183
|
+
浏览器模式(`npm run dev`)行为不变。
|
package/bin/zqagent
ADDED
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 基础类型定义
|
|
3
|
+
*
|
|
4
|
+
* 与 Python 版 zqagent 对齐的基础类型。这里定义了 Agent 引擎内部
|
|
5
|
+
* 流转的核心数据模型:LLM 工具调用、助手回复、Token 用量、流式 chunk、
|
|
6
|
+
* 对话消息以及 OpenAI 工具 Schema。
|
|
7
|
+
*/
|
|
8
|
+
/** LLM 请求的工具调用 */
|
|
9
|
+
interface ToolCall {
|
|
10
|
+
/** 工具调用 ID(OpenAI 格式,用于把 tool 结果消息关联回对应的调用) */
|
|
11
|
+
id: string;
|
|
12
|
+
/** 工具名称 */
|
|
13
|
+
name: string;
|
|
14
|
+
/** 工具参数(已解析为对象的形态) */
|
|
15
|
+
arguments: Record<string, unknown>;
|
|
16
|
+
}
|
|
17
|
+
/** LLM 一次回复 */
|
|
18
|
+
interface AssistantTurn {
|
|
19
|
+
/** 回复正文文本;无文本时为 null */
|
|
20
|
+
text: string | null;
|
|
21
|
+
/** 本次回复请求的工具调用列表(可能为空) */
|
|
22
|
+
toolCalls: ToolCall[];
|
|
23
|
+
/** 结束原因(stop / tool_calls / length 等),由 Provider 提供 */
|
|
24
|
+
finishReason: string | null;
|
|
25
|
+
/** 推理过程内容(如 OpenAI o 系列模型的 reasoning_content) */
|
|
26
|
+
reasoning: string | null;
|
|
27
|
+
/** 本次调用的 Token 用量统计 */
|
|
28
|
+
usage: TokenUsage | null;
|
|
29
|
+
}
|
|
30
|
+
/** 标准化的 Token 用量 */
|
|
31
|
+
interface TokenUsage {
|
|
32
|
+
/** 输入 token 数 */
|
|
33
|
+
input: number;
|
|
34
|
+
/** 输出 token 数 */
|
|
35
|
+
output: number;
|
|
36
|
+
/** 命中缓存(缓存读取)的 token 数 */
|
|
37
|
+
cacheRead: number;
|
|
38
|
+
/** 写入缓存的 token 数 */
|
|
39
|
+
cacheWrite: number;
|
|
40
|
+
}
|
|
41
|
+
/** 流式输出的单个 chunk */
|
|
42
|
+
interface StreamChunk {
|
|
43
|
+
/** 文本增量;该 chunk 无文本时为 null */
|
|
44
|
+
content: string | null;
|
|
45
|
+
/** 推理内容增量 */
|
|
46
|
+
reasoning: string | null;
|
|
47
|
+
/**
|
|
48
|
+
* 工具调用:流式过程中为 null;
|
|
49
|
+
* 流结束的最终 chunk 中,有工具调用时为完整列表,否则为 null
|
|
50
|
+
*/
|
|
51
|
+
toolCalls: ToolCall[] | null;
|
|
52
|
+
/** 累计 Token 用量(OpenAI 在流结束前的最后一个 chunk 中返回) */
|
|
53
|
+
usage: TokenUsage | null;
|
|
54
|
+
/** 结束原因(仅在流结束 chunk 中出现) */
|
|
55
|
+
finishReason: string | null;
|
|
56
|
+
}
|
|
57
|
+
/** 对话消息 */
|
|
58
|
+
interface Message {
|
|
59
|
+
/** 本轮任务ID */
|
|
60
|
+
taskId?: string;
|
|
61
|
+
/** 消息角色 */
|
|
62
|
+
role: "system" | "user" | "assistant" | "tool" | "notice";
|
|
63
|
+
/** 消息正文 */
|
|
64
|
+
content: string;
|
|
65
|
+
/** 附加来源信息(展示用) */
|
|
66
|
+
source?: Record<string, unknown>;
|
|
67
|
+
/** 展示用的替代文本(展示用) */
|
|
68
|
+
_display?: string;
|
|
69
|
+
/** 消息时间戳 */
|
|
70
|
+
ts?: number;
|
|
71
|
+
/** 推理过程文本(assistant 消息) */
|
|
72
|
+
reasoning?: string;
|
|
73
|
+
/** Token 用量(assistant 消息) */
|
|
74
|
+
usage?: Record<string, unknown>;
|
|
75
|
+
/** 关联的工具调用 ID(tool 消息回填用) */
|
|
76
|
+
tool_call_id?: string;
|
|
77
|
+
/** 工具调用名称(tool 消息回填用) */
|
|
78
|
+
tool_call_name?: string;
|
|
79
|
+
/** 工具调用列表(assistant 消息,OpenAI 格式) */
|
|
80
|
+
tool_calls?: {
|
|
81
|
+
id: string;
|
|
82
|
+
type: "function";
|
|
83
|
+
function: {
|
|
84
|
+
name: string;
|
|
85
|
+
arguments: string;
|
|
86
|
+
};
|
|
87
|
+
}[];
|
|
88
|
+
/** 通知类型:错误 / 中断 / 上下文压缩 / 模型切换 */
|
|
89
|
+
kind?: "error" | "interrupted" | "compacted" | "model_switch";
|
|
90
|
+
/** 通知附加文本 */
|
|
91
|
+
text?: string;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* 推理强度(reasoning effort)
|
|
95
|
+
*
|
|
96
|
+
* 控制模型在生成答案前投入的推理计算量(OpenAI 的
|
|
97
|
+
* reasoning_effort / Responses 的 reasoning.effort 参数)。
|
|
98
|
+
* 仅对支持该参数的非 DeepSeek 模型生效(DeepSeek 用 thinking
|
|
99
|
+
* 布尔开关,不支持级别控制,Provider 层会跳过)。
|
|
100
|
+
*/
|
|
101
|
+
type ReasoningEffort = "low" | "medium" | "high";
|
|
102
|
+
/** OpenAI 工具 Schema */
|
|
103
|
+
interface ToolSchema {
|
|
104
|
+
type: "function";
|
|
105
|
+
function: {
|
|
106
|
+
name: string;
|
|
107
|
+
description: string;
|
|
108
|
+
parameters: Record<string, unknown>;
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* 工具注册表
|
|
114
|
+
*
|
|
115
|
+
* 对齐 Python 版 ToolRegistry。负责集中管理所有可用的 Agent 工具:
|
|
116
|
+
* 注册(含内置 schema 推导)、按名查询、批量导出 OpenAI Schema
|
|
117
|
+
* (供 LLM 调用)、按名执行。是 TurnEngine 与具体工具实现之间的桥梁。
|
|
118
|
+
*/
|
|
119
|
+
|
|
120
|
+
/** 工具风险等级 (对齐 Python 版 RiskClass) */
|
|
121
|
+
declare enum RiskClass {
|
|
122
|
+
/** 只读,无副作用(如 read_file、grep) */
|
|
123
|
+
READ = "read",
|
|
124
|
+
/** 写入本地文件 */
|
|
125
|
+
WRITE_LOCAL = "write_local",
|
|
126
|
+
/** 执行 shell 命令 */
|
|
127
|
+
EXEC = "exec",
|
|
128
|
+
/** 访问外部网络资源 */
|
|
129
|
+
EXTERNAL = "external"
|
|
130
|
+
}
|
|
131
|
+
/** 工具元数据 */
|
|
132
|
+
interface ToolMetadata {
|
|
133
|
+
/** 工具分类(filesystem / shell / search / web / planning 等) */
|
|
134
|
+
category: string;
|
|
135
|
+
/** 风险级别(low / medium / high) */
|
|
136
|
+
riskLevel: "low" | "medium" | "high";
|
|
137
|
+
/** 能力标签(用于生成默认描述) */
|
|
138
|
+
capabilities: string[];
|
|
139
|
+
/** 是否强制需要人工审批 */
|
|
140
|
+
requiresApproval: boolean;
|
|
141
|
+
}
|
|
142
|
+
/** 单个工具规格 */
|
|
143
|
+
interface ToolSpec {
|
|
144
|
+
/** 工具名 */
|
|
145
|
+
name: string;
|
|
146
|
+
/** OpenAI 工具 Schema(供 LLM 识别调用方式) */
|
|
147
|
+
schema: ToolSchema;
|
|
148
|
+
/** 实际执行函数 */
|
|
149
|
+
func: (args: Record<string, unknown>) => unknown;
|
|
150
|
+
/** 工具元数据(供权限引擎评估风险) */
|
|
151
|
+
metadata: ToolMetadata;
|
|
152
|
+
/**
|
|
153
|
+
* 工具来源标识(展示用,可选):
|
|
154
|
+
* "internal" 内置、`mcp:<server>` MCP 工具、"cli:command" 命令工具等
|
|
155
|
+
*/
|
|
156
|
+
source?: string;
|
|
157
|
+
}
|
|
158
|
+
/** 工具注册表 (对齐 Python 版 ToolRegistry) */
|
|
159
|
+
declare class ToolRegistry {
|
|
160
|
+
/** 工具名 → 工具规格 的映射表 */
|
|
161
|
+
private tools;
|
|
162
|
+
/** 已禁用的工具名集合(禁用的工具不出现在 schemas 中,模型不可调用) */
|
|
163
|
+
private disabled;
|
|
164
|
+
/**
|
|
165
|
+
* 注册一个工具 (内置 schema 自动推导;同名注册即替换,可实现"替换工具")
|
|
166
|
+
*
|
|
167
|
+
* @param func 工具执行函数(工具名优先取 schema.function.name,
|
|
168
|
+
* 否则回退到 func.name;可返回 Promise,引擎会自动 await)
|
|
169
|
+
* @param metadata 工具元数据(风险等级、分类等)
|
|
170
|
+
* @param schema OpenAI 工具 Schema;缺省时根据 metadata 自动构建
|
|
171
|
+
* @param source 工具来源标识(展示用,如 "mcp:<server>")
|
|
172
|
+
* @returns 注册完成后的 ToolSpec
|
|
173
|
+
*/
|
|
174
|
+
register(func: (args: Record<string, unknown>) => unknown, metadata: ToolMetadata, schema?: ToolSchema, source?: string): ToolSpec;
|
|
175
|
+
/** 移除工具。@returns 是否移除成功 */
|
|
176
|
+
remove(name: string): boolean;
|
|
177
|
+
/** 是否存在指定工具 */
|
|
178
|
+
has(name: string): boolean;
|
|
179
|
+
/** 禁用工具(从 schemas 移除,模型不可再调用;已排队的调用仍会执行)。@returns 是否成功 */
|
|
180
|
+
disable(name: string): boolean;
|
|
181
|
+
/** 重新启用工具。@returns 是否成功(原本处于禁用状态) */
|
|
182
|
+
enable(name: string): boolean;
|
|
183
|
+
/** 工具当前是否被禁用 */
|
|
184
|
+
isDisabled(name: string): boolean;
|
|
185
|
+
/** 获取所有启用中的工具的 OpenAI Schema(供 LLM 工具调用使用) */
|
|
186
|
+
schemas(): ToolSchema[];
|
|
187
|
+
/** 获取全部工具名列表(含禁用的) */
|
|
188
|
+
names(): string[];
|
|
189
|
+
/** 获取全部工具规格(含禁用的,返回副本) */
|
|
190
|
+
list(): ToolSpec[];
|
|
191
|
+
/** 获取单个工具 */
|
|
192
|
+
get(name: string): ToolSpec | undefined;
|
|
193
|
+
/**
|
|
194
|
+
* 执行工具
|
|
195
|
+
*
|
|
196
|
+
* @throws 工具未注册时抛出错误
|
|
197
|
+
*/
|
|
198
|
+
execute(name: string, args: Record<string, unknown>): unknown;
|
|
199
|
+
/**
|
|
200
|
+
* 构建默认 Schema
|
|
201
|
+
*
|
|
202
|
+
* 未显式提供 schema 时使用:描述取 capabilities 的逗号拼接,
|
|
203
|
+
* parameters 为空对象(此时模型可能不知道参数结构,因此
|
|
204
|
+
* 正式工具都应显式提供完整 schema)。
|
|
205
|
+
*/
|
|
206
|
+
private _defaultSchema;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
export { type AssistantTurn as A, type Message as M, type ReasoningEffort as R, type StreamChunk as S, ToolRegistry as T, type TokenUsage as a, type ToolMetadata as b, type ToolSchema as c, RiskClass as d, type ToolCall as e, type ToolSpec as f };
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 基础类型定义
|
|
3
|
+
*
|
|
4
|
+
* 与 Python 版 zqagent 对齐的基础类型。这里定义了 Agent 引擎内部
|
|
5
|
+
* 流转的核心数据模型:LLM 工具调用、助手回复、Token 用量、流式 chunk、
|
|
6
|
+
* 对话消息以及 OpenAI 工具 Schema。
|
|
7
|
+
*/
|
|
8
|
+
/** LLM 请求的工具调用 */
|
|
9
|
+
interface ToolCall {
|
|
10
|
+
/** 工具调用 ID(OpenAI 格式,用于把 tool 结果消息关联回对应的调用) */
|
|
11
|
+
id: string;
|
|
12
|
+
/** 工具名称 */
|
|
13
|
+
name: string;
|
|
14
|
+
/** 工具参数(已解析为对象的形态) */
|
|
15
|
+
arguments: Record<string, unknown>;
|
|
16
|
+
}
|
|
17
|
+
/** LLM 一次回复 */
|
|
18
|
+
interface AssistantTurn {
|
|
19
|
+
/** 回复正文文本;无文本时为 null */
|
|
20
|
+
text: string | null;
|
|
21
|
+
/** 本次回复请求的工具调用列表(可能为空) */
|
|
22
|
+
toolCalls: ToolCall[];
|
|
23
|
+
/** 结束原因(stop / tool_calls / length 等),由 Provider 提供 */
|
|
24
|
+
finishReason: string | null;
|
|
25
|
+
/** 推理过程内容(如 OpenAI o 系列模型的 reasoning_content) */
|
|
26
|
+
reasoning: string | null;
|
|
27
|
+
/** 本次调用的 Token 用量统计 */
|
|
28
|
+
usage: TokenUsage | null;
|
|
29
|
+
}
|
|
30
|
+
/** 标准化的 Token 用量 */
|
|
31
|
+
interface TokenUsage {
|
|
32
|
+
/** 输入 token 数 */
|
|
33
|
+
input: number;
|
|
34
|
+
/** 输出 token 数 */
|
|
35
|
+
output: number;
|
|
36
|
+
/** 命中缓存(缓存读取)的 token 数 */
|
|
37
|
+
cacheRead: number;
|
|
38
|
+
/** 写入缓存的 token 数 */
|
|
39
|
+
cacheWrite: number;
|
|
40
|
+
}
|
|
41
|
+
/** 流式输出的单个 chunk */
|
|
42
|
+
interface StreamChunk {
|
|
43
|
+
/** 文本增量;该 chunk 无文本时为 null */
|
|
44
|
+
content: string | null;
|
|
45
|
+
/** 推理内容增量 */
|
|
46
|
+
reasoning: string | null;
|
|
47
|
+
/**
|
|
48
|
+
* 工具调用:流式过程中为 null;
|
|
49
|
+
* 流结束的最终 chunk 中,有工具调用时为完整列表,否则为 null
|
|
50
|
+
*/
|
|
51
|
+
toolCalls: ToolCall[] | null;
|
|
52
|
+
/** 累计 Token 用量(OpenAI 在流结束前的最后一个 chunk 中返回) */
|
|
53
|
+
usage: TokenUsage | null;
|
|
54
|
+
/** 结束原因(仅在流结束 chunk 中出现) */
|
|
55
|
+
finishReason: string | null;
|
|
56
|
+
}
|
|
57
|
+
/** 对话消息 */
|
|
58
|
+
interface Message {
|
|
59
|
+
/** 本轮任务ID */
|
|
60
|
+
taskId?: string;
|
|
61
|
+
/** 消息角色 */
|
|
62
|
+
role: "system" | "user" | "assistant" | "tool" | "notice";
|
|
63
|
+
/** 消息正文 */
|
|
64
|
+
content: string;
|
|
65
|
+
/** 附加来源信息(展示用) */
|
|
66
|
+
source?: Record<string, unknown>;
|
|
67
|
+
/** 展示用的替代文本(展示用) */
|
|
68
|
+
_display?: string;
|
|
69
|
+
/** 消息时间戳 */
|
|
70
|
+
ts?: number;
|
|
71
|
+
/** 推理过程文本(assistant 消息) */
|
|
72
|
+
reasoning?: string;
|
|
73
|
+
/** Token 用量(assistant 消息) */
|
|
74
|
+
usage?: Record<string, unknown>;
|
|
75
|
+
/** 关联的工具调用 ID(tool 消息回填用) */
|
|
76
|
+
tool_call_id?: string;
|
|
77
|
+
/** 工具调用名称(tool 消息回填用) */
|
|
78
|
+
tool_call_name?: string;
|
|
79
|
+
/** 工具调用列表(assistant 消息,OpenAI 格式) */
|
|
80
|
+
tool_calls?: {
|
|
81
|
+
id: string;
|
|
82
|
+
type: "function";
|
|
83
|
+
function: {
|
|
84
|
+
name: string;
|
|
85
|
+
arguments: string;
|
|
86
|
+
};
|
|
87
|
+
}[];
|
|
88
|
+
/** 通知类型:错误 / 中断 / 上下文压缩 / 模型切换 */
|
|
89
|
+
kind?: "error" | "interrupted" | "compacted" | "model_switch";
|
|
90
|
+
/** 通知附加文本 */
|
|
91
|
+
text?: string;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* 推理强度(reasoning effort)
|
|
95
|
+
*
|
|
96
|
+
* 控制模型在生成答案前投入的推理计算量(OpenAI 的
|
|
97
|
+
* reasoning_effort / Responses 的 reasoning.effort 参数)。
|
|
98
|
+
* 仅对支持该参数的非 DeepSeek 模型生效(DeepSeek 用 thinking
|
|
99
|
+
* 布尔开关,不支持级别控制,Provider 层会跳过)。
|
|
100
|
+
*/
|
|
101
|
+
type ReasoningEffort = "low" | "medium" | "high";
|
|
102
|
+
/** OpenAI 工具 Schema */
|
|
103
|
+
interface ToolSchema {
|
|
104
|
+
type: "function";
|
|
105
|
+
function: {
|
|
106
|
+
name: string;
|
|
107
|
+
description: string;
|
|
108
|
+
parameters: Record<string, unknown>;
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* 工具注册表
|
|
114
|
+
*
|
|
115
|
+
* 对齐 Python 版 ToolRegistry。负责集中管理所有可用的 Agent 工具:
|
|
116
|
+
* 注册(含内置 schema 推导)、按名查询、批量导出 OpenAI Schema
|
|
117
|
+
* (供 LLM 调用)、按名执行。是 TurnEngine 与具体工具实现之间的桥梁。
|
|
118
|
+
*/
|
|
119
|
+
|
|
120
|
+
/** 工具风险等级 (对齐 Python 版 RiskClass) */
|
|
121
|
+
declare enum RiskClass {
|
|
122
|
+
/** 只读,无副作用(如 read_file、grep) */
|
|
123
|
+
READ = "read",
|
|
124
|
+
/** 写入本地文件 */
|
|
125
|
+
WRITE_LOCAL = "write_local",
|
|
126
|
+
/** 执行 shell 命令 */
|
|
127
|
+
EXEC = "exec",
|
|
128
|
+
/** 访问外部网络资源 */
|
|
129
|
+
EXTERNAL = "external"
|
|
130
|
+
}
|
|
131
|
+
/** 工具元数据 */
|
|
132
|
+
interface ToolMetadata {
|
|
133
|
+
/** 工具分类(filesystem / shell / search / web / planning 等) */
|
|
134
|
+
category: string;
|
|
135
|
+
/** 风险级别(low / medium / high) */
|
|
136
|
+
riskLevel: "low" | "medium" | "high";
|
|
137
|
+
/** 能力标签(用于生成默认描述) */
|
|
138
|
+
capabilities: string[];
|
|
139
|
+
/** 是否强制需要人工审批 */
|
|
140
|
+
requiresApproval: boolean;
|
|
141
|
+
}
|
|
142
|
+
/** 单个工具规格 */
|
|
143
|
+
interface ToolSpec {
|
|
144
|
+
/** 工具名 */
|
|
145
|
+
name: string;
|
|
146
|
+
/** OpenAI 工具 Schema(供 LLM 识别调用方式) */
|
|
147
|
+
schema: ToolSchema;
|
|
148
|
+
/** 实际执行函数 */
|
|
149
|
+
func: (args: Record<string, unknown>) => unknown;
|
|
150
|
+
/** 工具元数据(供权限引擎评估风险) */
|
|
151
|
+
metadata: ToolMetadata;
|
|
152
|
+
/**
|
|
153
|
+
* 工具来源标识(展示用,可选):
|
|
154
|
+
* "internal" 内置、`mcp:<server>` MCP 工具、"cli:command" 命令工具等
|
|
155
|
+
*/
|
|
156
|
+
source?: string;
|
|
157
|
+
}
|
|
158
|
+
/** 工具注册表 (对齐 Python 版 ToolRegistry) */
|
|
159
|
+
declare class ToolRegistry {
|
|
160
|
+
/** 工具名 → 工具规格 的映射表 */
|
|
161
|
+
private tools;
|
|
162
|
+
/** 已禁用的工具名集合(禁用的工具不出现在 schemas 中,模型不可调用) */
|
|
163
|
+
private disabled;
|
|
164
|
+
/**
|
|
165
|
+
* 注册一个工具 (内置 schema 自动推导;同名注册即替换,可实现"替换工具")
|
|
166
|
+
*
|
|
167
|
+
* @param func 工具执行函数(工具名优先取 schema.function.name,
|
|
168
|
+
* 否则回退到 func.name;可返回 Promise,引擎会自动 await)
|
|
169
|
+
* @param metadata 工具元数据(风险等级、分类等)
|
|
170
|
+
* @param schema OpenAI 工具 Schema;缺省时根据 metadata 自动构建
|
|
171
|
+
* @param source 工具来源标识(展示用,如 "mcp:<server>")
|
|
172
|
+
* @returns 注册完成后的 ToolSpec
|
|
173
|
+
*/
|
|
174
|
+
register(func: (args: Record<string, unknown>) => unknown, metadata: ToolMetadata, schema?: ToolSchema, source?: string): ToolSpec;
|
|
175
|
+
/** 移除工具。@returns 是否移除成功 */
|
|
176
|
+
remove(name: string): boolean;
|
|
177
|
+
/** 是否存在指定工具 */
|
|
178
|
+
has(name: string): boolean;
|
|
179
|
+
/** 禁用工具(从 schemas 移除,模型不可再调用;已排队的调用仍会执行)。@returns 是否成功 */
|
|
180
|
+
disable(name: string): boolean;
|
|
181
|
+
/** 重新启用工具。@returns 是否成功(原本处于禁用状态) */
|
|
182
|
+
enable(name: string): boolean;
|
|
183
|
+
/** 工具当前是否被禁用 */
|
|
184
|
+
isDisabled(name: string): boolean;
|
|
185
|
+
/** 获取所有启用中的工具的 OpenAI Schema(供 LLM 工具调用使用) */
|
|
186
|
+
schemas(): ToolSchema[];
|
|
187
|
+
/** 获取全部工具名列表(含禁用的) */
|
|
188
|
+
names(): string[];
|
|
189
|
+
/** 获取全部工具规格(含禁用的,返回副本) */
|
|
190
|
+
list(): ToolSpec[];
|
|
191
|
+
/** 获取单个工具 */
|
|
192
|
+
get(name: string): ToolSpec | undefined;
|
|
193
|
+
/**
|
|
194
|
+
* 执行工具
|
|
195
|
+
*
|
|
196
|
+
* @throws 工具未注册时抛出错误
|
|
197
|
+
*/
|
|
198
|
+
execute(name: string, args: Record<string, unknown>): unknown;
|
|
199
|
+
/**
|
|
200
|
+
* 构建默认 Schema
|
|
201
|
+
*
|
|
202
|
+
* 未显式提供 schema 时使用:描述取 capabilities 的逗号拼接,
|
|
203
|
+
* parameters 为空对象(此时模型可能不知道参数结构,因此
|
|
204
|
+
* 正式工具都应显式提供完整 schema)。
|
|
205
|
+
*/
|
|
206
|
+
private _defaultSchema;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
export { type AssistantTurn as A, type Message as M, type ReasoningEffort as R, type StreamChunk as S, ToolRegistry as T, type TokenUsage as a, type ToolMetadata as b, type ToolSchema as c, RiskClass as d, type ToolCall as e, type ToolSpec as f };
|