@qwen-code/arena-agent 0.0.10-dev.14 → 0.0.10-dev.16
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/.env.example +32 -6
- package/CHANGELOG.md +36 -1
- package/README.md +144 -31
- package/dist/agent.d.ts +8 -2
- package/dist/agent.js +101 -28
- package/dist/agent.js.map +1 -1
- package/dist/arena-history.d.ts +12 -0
- package/dist/arena-history.js +119 -0
- package/dist/arena-history.js.map +1 -0
- package/dist/brave-search.js +7 -4
- package/dist/brave-search.js.map +1 -1
- package/dist/canonical-data.d.ts +7 -0
- package/dist/canonical-data.js +10 -3
- package/dist/canonical-data.js.map +1 -1
- package/dist/cli.js +75 -13
- package/dist/cli.js.map +1 -1
- package/dist/code-tools.js +2 -4
- package/dist/code-tools.js.map +1 -1
- package/dist/compaction.d.ts +4 -0
- package/dist/compaction.js +54 -10
- package/dist/compaction.js.map +1 -1
- package/dist/config.d.ts +4 -2
- package/dist/config.js +5 -5
- package/dist/config.js.map +1 -1
- package/dist/connector-errors.d.ts +16 -0
- package/dist/connector-errors.js +69 -0
- package/dist/connector-errors.js.map +1 -0
- package/dist/connector-files.d.ts +31 -0
- package/dist/connector-files.js +249 -0
- package/dist/connector-files.js.map +1 -0
- package/dist/connector-input.d.ts +10 -0
- package/dist/connector-input.js +79 -0
- package/dist/connector-input.js.map +1 -0
- package/dist/connector-mcp.d.ts +15 -2
- package/dist/connector-mcp.js +201 -41
- package/dist/connector-mcp.js.map +1 -1
- package/dist/connectors.d.ts +7 -2
- package/dist/connectors.js +42 -30
- package/dist/connectors.js.map +1 -1
- package/dist/fetch-page.js +2 -2
- package/dist/fetch-page.js.map +1 -1
- package/dist/history.d.ts +4 -2
- package/dist/history.js +4 -1
- package/dist/history.js.map +1 -1
- package/dist/image-choice.d.ts +23 -0
- package/dist/image-choice.js +190 -0
- package/dist/image-choice.js.map +1 -0
- package/dist/image-model.d.ts +6 -0
- package/dist/image-model.js +32 -0
- package/dist/image-model.js.map +1 -0
- package/dist/model-router-media.js +5 -3
- package/dist/model-router-media.js.map +1 -1
- package/dist/process-manager.js +9 -9
- package/dist/process-manager.js.map +1 -1
- package/dist/prompts.d.ts +0 -1
- package/dist/prompts.js +3 -27
- package/dist/prompts.js.map +1 -1
- package/dist/provider.d.ts +18 -0
- package/dist/provider.js +52 -16
- package/dist/provider.js.map +1 -1
- package/dist/repo.d.ts +1 -1
- package/dist/repo.js +26 -4
- package/dist/repo.js.map +1 -1
- package/dist/routify-web-fetch.js +2 -2
- package/dist/routify-web-fetch.js.map +1 -1
- package/dist/server.js +24 -12
- package/dist/server.js.map +1 -1
- package/dist/session-memory-prompts.d.ts +2 -1
- package/dist/session-memory-prompts.js +2 -1
- package/dist/session-memory-prompts.js.map +1 -1
- package/dist/spec.d.ts +4 -4
- package/dist/spec.js +25 -12
- package/dist/spec.js.map +1 -1
- package/dist/startup-config.d.ts +39 -0
- package/dist/startup-config.js +346 -0
- package/dist/startup-config.js.map +1 -0
- package/dist/startup-main-config.d.ts +63 -0
- package/dist/startup-main-config.js +94 -0
- package/dist/startup-main-config.js.map +1 -0
- package/dist/startup-tool-config.d.ts +8 -0
- package/dist/startup-tool-config.js +116 -0
- package/dist/startup-tool-config.js.map +1 -0
- package/dist/summary-compaction.d.ts +2 -0
- package/dist/summary-compaction.js +17 -3
- package/dist/summary-compaction.js.map +1 -1
- package/dist/tools.d.ts +2 -0
- package/dist/tools.js +133 -49
- package/dist/tools.js.map +1 -1
- package/dist/tui.js +15 -2
- package/dist/tui.js.map +1 -1
- package/dist/types.d.ts +6 -0
- package/dist/web/app.js +8 -0
- package/dist/web/app.js.map +1 -1
- package/docs/BINARY_DISTRIBUTION.md +43 -8
- package/docs/MODES_AND_RELEASES.md +23 -5
- package/package.json +1 -1
- package/web/styles.css +22 -0
package/.env.example
CHANGED
|
@@ -28,6 +28,10 @@ ARENA_HARNESS_MODE=arena
|
|
|
28
28
|
# ARENA_STREAM_HISTORY=full
|
|
29
29
|
# ARENA_CODE_STREAM_HISTORY remains a lower-priority compatibility alias.
|
|
30
30
|
|
|
31
|
+
# Headless configuration: a redacted startup record and actual request settings
|
|
32
|
+
# on stderr and in the session's startup-config.jsonl. Set false to disable both.
|
|
33
|
+
# ARENA_CONFIG_LOGGING=true
|
|
34
|
+
|
|
31
35
|
# Native provider fallbacks used when OPENAI_BASE_URL/API_KEY are unset.
|
|
32
36
|
# ANTHROPIC_BASE_URL=https://api.anthropic.com/v1
|
|
33
37
|
# ANTHROPIC_API_KEY=
|
|
@@ -64,11 +68,18 @@ ARENA_HARNESS_MODE=arena
|
|
|
64
68
|
# ARENA_TOOL_CHOICE=auto
|
|
65
69
|
# JSON array of exact tool names hidden from the model and rejected if called.
|
|
66
70
|
# ARENA_DISALLOWED_TOOLS=["bash","write_file"]
|
|
67
|
-
# Agent Arena connectors through Merge MCP
|
|
71
|
+
# Agent Arena connectors through Merge MCP; opt-in, ignored by Code Arena.
|
|
68
72
|
# Enable the captured catalog in the Tool Pack; connect apps for the Registered
|
|
69
73
|
# User through Merge Link. The key and user must belong to the same environment.
|
|
70
74
|
# One configured Registered User is shared by all sessions of this process.
|
|
71
|
-
#
|
|
75
|
+
# Slugs: notion, google_calendar, google_drive, google_docs, google_sheets,
|
|
76
|
+
# google_slides, gmail, dropbox, supabase, vercel, linear.
|
|
77
|
+
# ARENA_CONNECTORS=["notion","google_drive","google_docs","google_sheets"]
|
|
78
|
+
# Optional host-provided authenticated-app snapshot, separate from conversation
|
|
79
|
+
# enablement. This does not authorize apps or query Merge. Explicit [] enables
|
|
80
|
+
# discovery with the captured no-connected-apps prompt. Omit both arrays to keep
|
|
81
|
+
# the connector-off baseline.
|
|
82
|
+
# ARENA_CONNECTED_CONNECTORS=["notion","google_drive","google_docs","google_sheets","gmail"]
|
|
72
83
|
# ARENA_MERGE_ACCESS_KEY=
|
|
73
84
|
# ARENA_MERGE_TOOL_PACK_ID=
|
|
74
85
|
# ARENA_MERGE_REGISTERED_USER_ID=
|
|
@@ -87,14 +98,14 @@ ARENA_HARNESS_MODE=arena
|
|
|
87
98
|
# Agent Arena: threshold is 250000 unless BOTH variables below have valid
|
|
88
99
|
# values, in which case threshold = context window * ratio.
|
|
89
100
|
# Code Arena keeps independent controls (default window 1000000, ratio 0.7).
|
|
90
|
-
#
|
|
91
|
-
# mode uses the historical local token estimate.
|
|
101
|
+
# Compaction counts use completed-request usage plus newer messages.
|
|
92
102
|
# ARENA_CONTEXT_WINDOW=1000000
|
|
93
103
|
# ARENA_CONTEXT_COMPACTION_RATIO=0.25
|
|
94
|
-
# Restore Agent Arena background memory
|
|
104
|
+
# Restore Agent Arena background memory by default; set false to disable.
|
|
95
105
|
# CLI overrides: --restore-session-memory / --no-restore-session-memory.
|
|
96
106
|
# ARENA_RESTORE_SESSION_MEMORY=true
|
|
97
107
|
# Provisional Agent Arena background-memory budget for newly archivable content.
|
|
108
|
+
# Uses request-usage deltas with local supplements; local counts omit tool-call IDs.
|
|
98
109
|
# ARENA_MEMORY_UPDATE_TOKENS=24000
|
|
99
110
|
# Default: rolling memory 131072; summary mode and Code Arena 8192.
|
|
100
111
|
# ARENA_COMPACTION_SUMMARY_MAX_TOKENS=131072
|
|
@@ -157,6 +168,12 @@ ARENA_HARNESS_MODE=arena
|
|
|
157
168
|
|
|
158
169
|
# Search, page reading, image generation, and speech through ModelRouter/Routify.
|
|
159
170
|
ROUTIFY_API_KEY=
|
|
171
|
+
# Optional per-tool keys override ROUTIFY_API_KEY; unset or blank falls back.
|
|
172
|
+
# ROUTIFY_WEB_SEARCH_API_KEY=
|
|
173
|
+
# ROUTIFY_IMAGE_SEARCH_API_KEY=
|
|
174
|
+
# ROUTIFY_GENERATE_IMAGE_API_KEY=
|
|
175
|
+
# For an image proxy, keep the real MR key in ROUTIFY_API_KEY and set only
|
|
176
|
+
# ROUTIFY_GENERATE_IMAGE_API_KEY to the proxy key, with the base URL below.
|
|
160
177
|
# ROUTIFY_WEB_SEARCH_URL=https://routify-pub.alibaba-inc.com/protocol/compatible-mode/res/v1/llm/context
|
|
161
178
|
# ROUTIFY_IMAGE_SEARCH_URL=https://routify-pub.alibaba-inc.com/protocol/brave/res/v1/images/search
|
|
162
179
|
# ROUTIFY_VERTEX_BASE_URL=https://routify-pub.alibaba-inc.com/protocol/vertex/v1beta
|
|
@@ -168,8 +185,17 @@ ROUTIFY_API_KEY=
|
|
|
168
185
|
# Code Arena web_fetch content cap (UTF-8 bytes, including truncation notice).
|
|
169
186
|
# Applies to local and Routify readers in all formats; must be a positive integer.
|
|
170
187
|
# CODE_HARNESS_WEB_FETCH_MAX_BYTES=40000
|
|
171
|
-
#
|
|
188
|
+
# Agent Arena single images randomly use Gemini or gpt-image-2 by default.
|
|
189
|
+
# Set this variable to pin a model (also overrides option one).
|
|
190
|
+
# ARENA_IMAGE_MODEL=gpt-image-2
|
|
191
|
+
# Second model for Agent Arena generate_image with offer_options=true.
|
|
192
|
+
# Defaults to gpt-image-2 (or Gemini when that is the primary).
|
|
193
|
+
# Without a user handler, save option one and continue; otherwise ask the user.
|
|
194
|
+
# ARENA_IMAGE_ALTERNATIVE_MODEL=gpt-image-2
|
|
172
195
|
# ARENA_IMAGE_SIZE=1024*1024
|
|
196
|
+
# Code Arena randomly uses Sunburst or Flare.
|
|
197
|
+
# Set this variable to pin a model; otherwise an explicit ARENA_IMAGE_MODEL
|
|
198
|
+
# also pins Code Arena. Grok and Muse are not enabled.
|
|
173
199
|
# CODE_HARNESS_IMAGE_MODEL=gpt-image-2.5-sunburst
|
|
174
200
|
# CODE_HARNESS_IMAGE_SIZE=1024*1024
|
|
175
201
|
# ARENA_SPEECH_MODEL=gemini-3.1-flash-tts-preview
|
package/CHANGELOG.md
CHANGED
|
@@ -12,6 +12,39 @@
|
|
|
12
12
|
|
|
13
13
|
## [Unreleased]
|
|
14
14
|
|
|
15
|
+
## [0.0.10-dev.16] - 2026-11-04
|
|
16
|
+
|
|
17
|
+
### Agent Arena
|
|
18
|
+
|
|
19
|
+
- Repo 会话记住目标仓库,新增同级仓库后仍可继续和恢复;目标缺失或 Git 状态异常时明确报错。
|
|
20
|
+
- 对齐近期日志中的工作区、Repo 和记忆提示词,以及已有工具的声明顺序。
|
|
21
|
+
- `read_file` 支持 `offset`、`limit` 分页;`bash` 超时返回已有输出并允许命令继续运行,主动取消仍终止进程树。
|
|
22
|
+
- 对齐工具参数的默认值、实时与恢复历史格式,以及同批工具并发执行和结果顺序。
|
|
23
|
+
- 扩展 MCP 应用至 Google Drive、Docs、Sheets、Slides、Gmail、Dropbox、Supabase、Vercel 和 Linear,并对齐 Notion 工具、工作区文件传输及重复调用保护。
|
|
24
|
+
- 新增 `ARENA_CONNECTED_CONNECTORS`,区分已连接但未开启和未连接的应用。
|
|
25
|
+
- `generate_image` 单图默认随机使用 GPT Image 2 或 Gemini 3.1 Flash,`offer_options` 并行生成双图供选择,保存未选图片并支持中断后重试;第二模型可用 `ARENA_IMAGE_ALTERNATIVE_MODEL` 配置。
|
|
26
|
+
- Headless 未配置用户 handler 时,`generate_image` 的 `offer_options=true` 默认保存第一张候选图并继续执行。
|
|
27
|
+
|
|
28
|
+
### Code Arena
|
|
29
|
+
|
|
30
|
+
- `generate_image` 默认随机使用 `gpt-image-2.5-sunburst` 或 `gpt-image-2.5-flare`。
|
|
31
|
+
|
|
32
|
+
### 通用
|
|
33
|
+
|
|
34
|
+
- 新增 `ROUTIFY_WEB_SEARCH_API_KEY`、`ROUTIFY_IMAGE_SEARCH_API_KEY`、`ROUTIFY_GENERATE_IMAGE_API_KEY`,支持搜索与生图独立密钥,未设置或留空时继续使用 `ROUTIFY_API_KEY`。
|
|
35
|
+
|
|
36
|
+
## [0.0.10-dev.15] - 2026-10-28
|
|
37
|
+
|
|
38
|
+
### Agent Arena
|
|
39
|
+
|
|
40
|
+
- 后台记忆更新按服务端 token 用量差分判断新增预算,减少长签名造成的提前更新。
|
|
41
|
+
- 默认恢复同 session 的后台记忆,避免多轮调用重复更新;可用 `ARENA_RESTORE_SESSION_MEMORY=false` 或 `--no-restore-session-memory` 关闭。
|
|
42
|
+
|
|
43
|
+
### 通用
|
|
44
|
+
|
|
45
|
+
- 本地上下文估算忽略工具调用 ID,避免内嵌长签名抬高计数。
|
|
46
|
+
- Headless 记录生效配置、脱敏输入及实际模型请求参数和工具列表,输出到 stderr 与会话的 `startup-config.jsonl`,可用 `ARENA_CONFIG_LOGGING=false` 关闭。
|
|
47
|
+
|
|
15
48
|
## [0.0.10-dev.14] - 2026-10-26
|
|
16
49
|
|
|
17
50
|
### 通用
|
|
@@ -267,7 +300,9 @@
|
|
|
267
300
|
- `bash` 用于一次性命令,区分超时与信号终止,并清理遗留后台进程;需要持续运行
|
|
268
301
|
的任务改用进程工具。预览端口支持 E2B Host 探测及按需返回告警。
|
|
269
302
|
|
|
270
|
-
[Unreleased]: https://code.alibaba-inc.com/know-how/arena-harness/compare?from=v0.0.10-dev.
|
|
303
|
+
[Unreleased]: https://code.alibaba-inc.com/know-how/arena-harness/compare?from=v0.0.10-dev.16&to=master&mergeBase=true
|
|
304
|
+
[0.0.10-dev.16]: https://code.alibaba-inc.com/know-how/arena-harness/compare?from=v0.0.10-dev.15&to=v0.0.10-dev.16&mergeBase=true
|
|
305
|
+
[0.0.10-dev.15]: https://code.alibaba-inc.com/know-how/arena-harness/compare?from=v0.0.10-dev.14&to=v0.0.10-dev.15&mergeBase=true
|
|
271
306
|
[0.0.10-dev.14]: https://code.alibaba-inc.com/know-how/arena-harness/compare?from=v0.0.10-dev.13&to=v0.0.10-dev.14&mergeBase=true
|
|
272
307
|
[0.0.10-dev.13]: https://code.alibaba-inc.com/know-how/arena-harness/compare?from=v0.0.10-dev.12&to=v0.0.10-dev.13&mergeBase=true
|
|
273
308
|
[0.0.10-dev.12]: https://code.alibaba-inc.com/know-how/arena-harness/compare?from=v0.0.10-dev.11&to=v0.0.10-dev.12&mergeBase=true
|
package/README.md
CHANGED
|
@@ -113,6 +113,55 @@ code-harness --file prompt.txt --mode react
|
|
|
113
113
|
`CODE_HARNESS_MODE`、`ARENA_MODE` 及旧模式别名。详细目录和发包决策见
|
|
114
114
|
[`docs/MODES_AND_RELEASES.md`](docs/MODES_AND_RELEASES.md)。
|
|
115
115
|
|
|
116
|
+
### 启动配置日志
|
|
117
|
+
|
|
118
|
+
`arena -p`、`--file` 和 `--continue` 默认在 stderr 输出一条 `[arena:config]`
|
|
119
|
+
JSON 启动日志,并将同一条记录追加到会话目录下的 `startup-config.jsonl`,与
|
|
120
|
+
`history.json` 放在一起。日志中的 `run.configLogFile` 给出完整路径;AP 可直接
|
|
121
|
+
收集 stderr,或从 `ARENA_HOME` 指定的状态目录读取文件。
|
|
122
|
+
|
|
123
|
+
`config` 按环境变量名记录解析后的主模型、工具、搜索、图片与语音、缓存、代理、
|
|
124
|
+
预览和快照配置,包括默认值;没有对应环境变量的计算结果保留字段名,例如
|
|
125
|
+
`compactionThresholdTokens`。同一设置使用主变量名,例如 `OPENAI_MODEL` 表示最终选中的
|
|
126
|
+
模型,即使输入来自 `ARENA_MODEL` 或 `--model`。未配置或当前模式不适用的项记为 `null`。
|
|
127
|
+
工具配置表示启动时的默认设置,单次工具调用仍可覆盖超时、选择声音等参数。
|
|
128
|
+
|
|
129
|
+
`inputs.environment` 和 `inputs.workspaceEnv` 分别保留启动环境和工作区 `.env` 的
|
|
130
|
+
相关原始键值,包括被覆盖的值;`inputs.arguments` 记录解析后的 CLI 选项。进程环境
|
|
131
|
+
优先于 `.env`,CLI 参数在加载配置后覆盖,续跑记录恢复后的模式和模型。未知的
|
|
132
|
+
`ARENA_*` 等变量只出现在输入中,不会被当成生效配置。这里只记录 harness 相关设置,
|
|
133
|
+
不会转储整个进程环境。快照配置只采用启动环境;server/TUI 专用配置在 headless 中不生效。
|
|
134
|
+
|
|
135
|
+
`connection` 记录实际模型协议和连接地址,`connection.sources` 标明最终使用的地址和
|
|
136
|
+
凭据来源,例如 `OPENAI_API_KEY` 或 `ANTHROPIC_API_KEY`;密钥值仍会脱敏。
|
|
137
|
+
`run.cwd` 记录实际工作目录,`run.history` 记录历史是否加载、消息数、来源,以及
|
|
138
|
+
模型和模式是否继承历史。不带 `--continue` 时,同一 session 也可能加载已有历史。
|
|
139
|
+
`sessionMemoryAvailable` 只表示存在可供检查的快照,`restoreSessionMemory` 表示允许恢复,
|
|
140
|
+
不表示已通过历史匹配检查。`inputs.workspaceEnvFile` 记录 `.env` 的路径、读取状态和错误码。
|
|
141
|
+
`modelInput.inputAllowed` 汇总文字、图片、视频和音频的输入开关,图片等开关也保留在
|
|
142
|
+
`config.ARENA_MODEL_SUPPORTS_*_INPUT`。`modelInput.sources` 说明每种模态的判断来源:
|
|
143
|
+
对应环境变量名表示显式覆盖,`model_registry` 表示命中内置模型规则,
|
|
144
|
+
`unknown_model_default` 表示未知模型默认允许尝试;这种默认值不表示已验证远端支持。
|
|
145
|
+
`registryKnown`、`registryRule` 和 `normalizedModel` 可用于核对模型名是否被正确识别。
|
|
146
|
+
这些字段描述主模型的输入能力,与图片、语音生成工具使用的模型配置分开。
|
|
147
|
+
`modelInput.transport.userContent` 另行说明传输处理:Chat Completions 为 `passthrough`,
|
|
148
|
+
当前 Responses/Anthropic 编码器为 `text_and_images_only`;模态开关不会扩展编码器支持范围。
|
|
149
|
+
设置 `ARENA_EXTRA_BODY.model` 时,`modelInput.requestModelOverride` 会单独显示该覆盖值,
|
|
150
|
+
模态规则仍按 `modelInput.model` 判断。`imageFallback` 记录图片转文字 fallback 是否启用、
|
|
151
|
+
原因和启用时的实际连接;它只适用于 Agent Arena 的 `read_file` 图片输入。
|
|
152
|
+
|
|
153
|
+
密钥只显示 `[set]` / `[unset]`,URL 移除账号、密码、查询参数与片段,自定义提示词
|
|
154
|
+
和额外请求体中的自由文本仅记录字符数与 SHA-256。
|
|
155
|
+
|
|
156
|
+
启动记录的 `event` 为 `startup_config`。实际 HTTP 请求准备好后,会在相同位置补写
|
|
157
|
+
`model_request_config`,记录协议映射和 `ARENA_EXTRA_BODY` 覆盖后的模型、参数与工具名称,
|
|
158
|
+
使用接口字段名,例如 `max_output_tokens`。被协议省略的参数不会出现在这条记录中。
|
|
159
|
+
同一进程内相同请求配置只记录一次;模型、参数或工具定义变化时再记录。
|
|
160
|
+
因此可以直接核对温度、thinking 设置和工具是否真正进入请求,无需从启动配置推导。
|
|
161
|
+
这条记录表示请求已构造,不表示服务端已接受;完整调用过程仍可查看 `llm-calls.jsonl`。
|
|
162
|
+
`ARENA_MODEL_CALL_LOGGING=false` 不影响配置日志;设置 `ARENA_CONFIG_LOGGING=false`
|
|
163
|
+
会同时关闭 stderr 和文件中的启动、请求配置日志。stdout 输出格式保持不变。
|
|
164
|
+
|
|
116
165
|
### 中途快照与单步执行
|
|
117
166
|
|
|
118
167
|
Headless CLI 可通过 JavaScript Hook 决定何时继续或创建 Harbor 快照。工具校验在
|
|
@@ -214,8 +263,11 @@ arena serve --system-prompt '只使用中文回复。'
|
|
|
214
263
|
history.json、增量日志和返回的 messages 只保存对话历史(含 compaction),不保存运行时生成的开头 system;中途出现的 system 消息会保留。
|
|
215
264
|
新会话和续跑均在构建模型请求时前置运行时 system;官方以 user 开头的历史可直接续跑。
|
|
216
265
|
旧版带开头 system 的本地历史仍可读取,该旧前缀不作为本次指令,后续写入会移除它。
|
|
217
|
-
|
|
218
|
-
|
|
266
|
+
Agent Arena 在尚未选定仓库时,沿用“工作区根不是 Git 仓库,且仅有一个直接子仓库”的自动识别规则。
|
|
267
|
+
成功识别后,会话记住该子仓库的相对路径;新消息、`--continue`、TUI 和服务端恢复均沿用该目标,
|
|
268
|
+
新增同级仓库不会使会话退出 Repo 模式。普通会话后续出现首个可识别仓库时仍可自动进入 Repo 模式。
|
|
269
|
+
每次运行仍从当前 Git 状态刷新分支(包括 `arena/...`)、远端和基准提交,不复用旧 system 中的信息。
|
|
270
|
+
已绑定仓库缺失或 Git 状态无法解析时明确报错,不会静默换仓库或模式。旧历史没有绑定信息时仍按原规则识别。
|
|
219
271
|
|
|
220
272
|
如需保留当前 mode 生成的 system prompt,只在末尾追加任务或部署指令,可传入
|
|
221
273
|
`--append-system-prompt <text>`:
|
|
@@ -367,29 +419,49 @@ ARENA_DISALLOWED_TOOLS=["bash","write_file"]
|
|
|
367
419
|
被禁用的工具不会发送给模型;即使模型仍构造了该工具调用,执行层也会
|
|
368
420
|
在产生副作用前拒绝。
|
|
369
421
|
|
|
370
|
-
Agent Arena 可通过 Merge MCP 调用 Notion
|
|
422
|
+
Agent Arena 可通过 Merge MCP 调用 Notion、Google Calendar、Google Drive、Docs、
|
|
423
|
+
Sheets、Slides、Gmail、Dropbox、Supabase 和 Vercel,应用范围由
|
|
371
424
|
`ARENA_CONNECTORS` JSON 数组控制。先在 Merge 创建 Tool Pack 和 Registered User,
|
|
372
425
|
让该用户通过 Merge Link 连接目标应用,再配置同一环境的 Access Key:
|
|
373
426
|
|
|
374
427
|
```sh
|
|
375
428
|
# 写入本地 .env;三个 Merge 值从自己的 Merge 环境取得。
|
|
376
|
-
ARENA_CONNECTORS='["notion","
|
|
429
|
+
ARENA_CONNECTORS='["notion","google_drive","google_docs","google_sheets"]'
|
|
377
430
|
ARENA_MERGE_ACCESS_KEY=...
|
|
378
431
|
ARENA_MERGE_TOOL_PACK_ID=...
|
|
379
432
|
ARENA_MERGE_REGISTERED_USER_ID=...
|
|
380
433
|
```
|
|
381
434
|
|
|
382
|
-
首次可运行 `arena -p '加载 Google
|
|
383
|
-
Tool Pack
|
|
435
|
+
首次可运行 `arena -p '加载 Google Drive 工具并最多列出一个文件,不要创建或修改文件'`。
|
|
436
|
+
Tool Pack 需启用所选应用的完整捕获目录,见
|
|
384
437
|
[目录源文件](spec/connectors/catalog.json)。缺少工具时会明确报错;上游新增的工具不会自动暴露给模型。
|
|
385
438
|
|
|
386
|
-
|
|
439
|
+
| 应用 slug | 工具数 | 模型参数定义 |
|
|
440
|
+
| --- | ---: | --- |
|
|
441
|
+
| `notion` | 22 | 历史完整捕获 |
|
|
442
|
+
| `google_drive` | 49 | 历史完整捕获 |
|
|
443
|
+
| `google_docs` | 46 | 历史完整捕获 |
|
|
444
|
+
| `google_sheets` | 56 | 历史完整捕获 |
|
|
445
|
+
| `google_slides` | 50 | 历史完整捕获 |
|
|
446
|
+
| `gmail` | 29 | 历史完整捕获 |
|
|
447
|
+
| `dropbox` | 33 | 历史完整捕获 |
|
|
448
|
+
| `supabase` | 42 | 历史完整捕获 |
|
|
449
|
+
| `vercel` | 53 | 历史完整捕获 |
|
|
450
|
+
| `linear` | 41 | 历史完整捕获 |
|
|
451
|
+
| `google_calendar` | 42 | 旧捕获目录与 Merge 实时 schema |
|
|
452
|
+
|
|
453
|
+
默认不启用应用。非空 `ARENA_CONNECTORS` 在基础工具集合中注册
|
|
387
454
|
`list_connector_tools`,并在普通/Repo 系统提示词末尾加入捕获的 `Connected apps`
|
|
388
|
-
|
|
455
|
+
段落,列出数组中的应用。接受上表中的 slug;重复项去重,
|
|
389
456
|
保留输入顺序,未知名称或非法 JSON 会在启动时报错。Code Arena 忽略此配置。
|
|
390
457
|
|
|
391
|
-
|
|
392
|
-
|
|
458
|
+
可选 `ARENA_CONNECTED_CONNECTORS` JSON 数组由宿主提供已连接应用的快照,用来区分
|
|
459
|
+
“已连接但未开启”和“未连接”。它不执行 OAuth,也不自动查询账号状态。未设置时按
|
|
460
|
+
`ARENA_CONNECTORS` 提供会话应用;显式 `[]` 可启用“尚无连接应用”的提示和发现入口。
|
|
461
|
+
两项均未设置时,基础提示词和工具集合保持原样。
|
|
462
|
+
|
|
463
|
+
模型调用 `list_connector_tools` 后,harness 才连接 Merge、校验后端目录并注册业务工具。
|
|
464
|
+
每条新用户消息都需要重新发现;暂停续跑恢复目录及重复调用保护,不重放已执行的操作。
|
|
393
465
|
数组表示本次会话允许哪些应用,加载目录成功也不保证账号具有全部读写权限。
|
|
394
466
|
缺少配置、授权失败或目录不完整时返回明确错误;业务调用按历史日志包装结果。
|
|
395
467
|
`ARENA_DISALLOWED_TOOLS` 禁用发现工具时也会省略应用提示词;显式 `--system-prompt`
|
|
@@ -400,18 +472,23 @@ Tool Pack 需启用所选应用的完整捕获目录:Notion 22 个、Calendar
|
|
|
400
472
|
已经完成写入,需先查询确认。当前一个进程使用一个 Registered User,Web 会话共用该账号;
|
|
401
473
|
尚未提供各 Web 用户独立登录和账号绑定界面。
|
|
402
474
|
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
475
|
+
Drive、Dropbox 上传及 Gmail 草稿附件使用 `input.file_path` 读取工作区文件;下载/导出
|
|
476
|
+
通过 Merge 文件接口落盘并返回文件路径。单文件上限为 100 MiB。同一回复中已完成或正在
|
|
477
|
+
执行的相同写调用、已失败的相同业务调用会被拦截;上传限流也会阻止该回复继续上传文件。
|
|
478
|
+
|
|
479
|
+
提示词、发现入口和十家应用的 421 个完整模型工具定义(含 Linear 的 41 个工具)保存在 `spec/connectors/`,
|
|
480
|
+
由构建脚本嵌入;后端要求的 nullable 字段和文件引用只在发送给 Merge 时转换。
|
|
481
|
+
Google Calendar 本批没有完整历史 schema,继续使用实时定义。
|
|
482
|
+
配置步骤及历史与真实后端的验证边界见 [Connector 接入分析](docs/research/AGENT_ARENA_CONNECTOR_BACKEND.md)。
|
|
408
483
|
|
|
409
484
|
`ARENA_EXTRA_BODY` 会在配置加载时解析为 JSON 对象,既作为最后一层请求
|
|
410
485
|
参数覆盖,也会原样写入 `history.json` 的
|
|
411
486
|
`metadata.parameters.extra_body`。
|
|
412
487
|
|
|
413
488
|
`ROUTIFY_API_KEY` 供 `web_search`、`image_search`、`generate_image` 和
|
|
414
|
-
`generate_speech`
|
|
489
|
+
`generate_speech` 使用。前三者分别支持 `ROUTIFY_WEB_SEARCH_API_KEY`、
|
|
490
|
+
`ROUTIFY_IMAGE_SEARCH_API_KEY`、`ROUTIFY_GENERATE_IMAGE_API_KEY` 独立覆盖;
|
|
491
|
+
未设置或留空(含纯空白)时回退到 `ROUTIFY_API_KEY`,旧配置无需修改。开启
|
|
415
492
|
`CODE_HARNESS_ROUTIFY_WEB_FETCH_ENABLED` 后,Arena 的 `fetch_page` 和 Code Arena 的
|
|
416
493
|
`web_fetch` 也复用该密钥,通过 Routify 先调用 Firecrawl,失败时回退到
|
|
417
494
|
Jina Reader。
|
|
@@ -446,9 +523,18 @@ Agent Arena 历史 metadata 记录本次压缩方式;下一次运行仍以当
|
|
|
446
523
|
以下后台记忆机制适用于 `rolling` 模式。
|
|
447
524
|
|
|
448
525
|
Agent Arena 在每次模型调用前检查新增对话预算:自上次成功记忆更新以来,
|
|
449
|
-
|
|
526
|
+
可归档内容的 token 增量达到 `ARENA_MEMORY_UPDATE_TOKENS`(默认 24000)时,
|
|
450
527
|
启动一个后台记忆更新任务。24000 是根据历史日志选择的暂定策略,不是已确认的官方常数。
|
|
451
528
|
已有记忆、系统提示词和工具定义不计入新增预算;最新完整的模型/工具步骤保留原文。
|
|
529
|
+
新增预算优先用该段首个有效 assistant 的 input usage 作为基线,减去公共输入前缀:
|
|
530
|
+
末个有效 assistant 的 total usage 减去该基线,再补估段首用户消息及末尾工具结果。
|
|
531
|
+
total 缺失时尝试 input/output 相加;只有 input 时,连同该 assistant 一起补估。
|
|
532
|
+
缺失 usage 的中间步骤由后续 input 覆盖,没有可用基线、input usage 倒退或用量自相矛盾时回退本地估算。
|
|
533
|
+
差分依赖同一模型和稳定的输入前缀;切换模型或工具定义后若 usage 未被清除,
|
|
534
|
+
仅靠数值无法识别所有口径变化。
|
|
535
|
+
回填已归档消息仍会触发现有的历史前缀校验失效,清除覆盖位置并重新计算新增范围。
|
|
536
|
+
本地估算忽略工具调用 ID(包括 Responses 的函数调用 ID)和 usage 元数据,
|
|
537
|
+
保留参数、结果正文及图片计数;实际历史与请求中的 ID 和签名保持完整。
|
|
452
538
|
更新完成只刷新缓存,主模型继续使用原上下文。
|
|
453
539
|
|
|
454
540
|
整体上下文达到压缩阈值时才回注最新记忆。Agent Arena 默认固定为 250,000 tokens;
|
|
@@ -480,10 +566,11 @@ Agent Arena 使用捕获的 session-memory 协议:只输出变化章节并合
|
|
|
480
566
|
这些字段及 `outer`/`inner` 值来自下载的官方 dump;本地将回合开始/工具循环内的
|
|
481
567
|
压缩分别标为 `outer`/`inner`。token 数和比例使用本地估算,不代表已复刻官方计数。
|
|
482
568
|
|
|
483
|
-
Agent Arena
|
|
484
|
-
`--
|
|
485
|
-
|
|
486
|
-
|
|
569
|
+
Agent Arena 默认恢复后台记忆缓存,包括同 session 的新一轮 `-p`、`--continue`
|
|
570
|
+
和 `--single-step`。设置 `ARENA_RESTORE_SESSION_MEMORY=false` 或
|
|
571
|
+
`--no-restore-session-memory` 可显式关闭(适用于 CLI、TUI 和服务端,命令行标志优先);
|
|
572
|
+
`--restore-session-memory` 可覆盖环境变量的关闭设置。
|
|
573
|
+
恢复前会校验记忆覆盖的历史前缀;不匹配的缓存会被丢弃。
|
|
487
574
|
关闭恢复不会删除仍有效的已存快照。恢复缓存本身不触发压缩,也不影响历史里
|
|
488
575
|
已应用的 `compaction` 记录。
|
|
489
576
|
|
|
@@ -1041,7 +1128,8 @@ watcher 或任务应使用 `start_process`;随后可用 `get_process_output`
|
|
|
1041
1128
|
保持普通捕获的结果 shape 不变。
|
|
1042
1129
|
|
|
1043
1130
|
`web_search` 使用 Routify 网关提供的 Brave LLM Context,从工作区 `.env`
|
|
1044
|
-
|
|
1131
|
+
优先读取 `ROUTIFY_WEB_SEARCH_API_KEY`,未设置或留空时读取 `ROUTIFY_API_KEY`,
|
|
1132
|
+
默认通过内置的 ModelRouter 兼容接口调用
|
|
1045
1133
|
`brave.llm-context` 路由。实现按 depth 请求最多 3/5/8 条结果,并将
|
|
1046
1134
|
`grounding.generic` 的内容片段及 `sources` 的来源信息转换成 Arena 的既有工具
|
|
1047
1135
|
结果。请求固定考虑最多 20 个搜索候选,再通过 `maximum_number_of_urls` 将
|
|
@@ -1052,8 +1140,9 @@ snippets,仅在没有 grounding 内容时回退到来源摘要。三个 Code A
|
|
|
1052
1140
|
token 预算 512/1280/1536。
|
|
1053
1141
|
可用 `ROUTIFY_WEB_SEARCH_URL` 和 `ARENA_WEB_SEARCH_MODEL` 覆盖默认值。
|
|
1054
1142
|
|
|
1055
|
-
`image_search` 使用 Routify 网关提供的 Brave Images Search
|
|
1056
|
-
`
|
|
1143
|
+
`image_search` 使用 Routify 网关提供的 Brave Images Search,优先读取
|
|
1144
|
+
`ROUTIFY_IMAGE_SEARCH_API_KEY`,未设置或留空时读取 `ROUTIFY_API_KEY`,
|
|
1145
|
+
通过 `X-Subscription-Token` 发送 GET 请求。默认使用内置的
|
|
1057
1146
|
ModelRouter 兼容接口,可用 `ROUTIFY_IMAGE_SEARCH_URL` 覆盖。实现优先下载 Brave
|
|
1058
1147
|
返回的原图地址,原图不可用
|
|
1059
1148
|
时回退到 Brave 代理缩略图,并保持既有工具结果格式和工作区文件命名不变。
|
|
@@ -1064,11 +1153,25 @@ Arena 的 `fetch_page` 和 Code Arena 的 `web_fetch` 默认仍使用本地抓
|
|
|
1064
1153
|
错误。`fetch_page` 仍按 8000 字符分块并缓存同一 URL 的后续 chunk。认证复用
|
|
1065
1154
|
`ROUTIFY_API_KEY`。
|
|
1066
1155
|
|
|
1067
|
-
`generate_image`、`generate_speech` 使用 ModelRouter/Routify
|
|
1068
|
-
|
|
1156
|
+
`generate_image`、`generate_speech` 使用 ModelRouter/Routify。图片生成优先读取
|
|
1157
|
+
`ROUTIFY_GENERATE_IMAGE_API_KEY`,未设置或留空时回退到 `ROUTIFY_API_KEY`;
|
|
1158
|
+
语音仍使用 `ROUTIFY_API_KEY`。GPT Image 图片生成与编辑使用 OpenAI 图片
|
|
1069
1159
|
协议,可用 `ROUTIFY_OPENAI_BASE_URL` 覆盖 ModelRouter 根地址。显式选择 Gemini
|
|
1070
1160
|
图片模型及默认 Gemini TTS 时使用 Google 协议,可用 `ROUTIFY_VERTEX_BASE_URL`
|
|
1071
|
-
|
|
1161
|
+
覆盖对应根地址。
|
|
1162
|
+
|
|
1163
|
+
例如,搜索直连 MR、GPT Image 生图走 proxy 时,可以在 `.env` 中配置:
|
|
1164
|
+
|
|
1165
|
+
```dotenv
|
|
1166
|
+
ROUTIFY_API_KEY=your-real-mr-key
|
|
1167
|
+
ROUTIFY_GENERATE_IMAGE_API_KEY=your-proxy-key
|
|
1168
|
+
ROUTIFY_OPENAI_BASE_URL=https://your-proxy.example/v1
|
|
1169
|
+
ARENA_IMAGE_MODEL=gpt-image-2
|
|
1170
|
+
```
|
|
1171
|
+
|
|
1172
|
+
Gemini 生图使用同一个生图专用 key,但 proxy 地址需配置到
|
|
1173
|
+
`ROUTIFY_VERTEX_BASE_URL`(该地址也供 Gemini TTS 使用)。新密钥配置对 Agent Arena
|
|
1174
|
+
和提供对应工具的 Code Arena 模式均生效,不改变请求协议、模型默认值或工具契约。
|
|
1072
1175
|
|
|
1073
1176
|
`fetch_page` 使用 Defuddle 将 HTML 正文转换为 Markdown,并使用
|
|
1074
1177
|
`pdf-parse` 提取 PDF 的前 30 页。响应按 Markdown 边界稳定分块,同一轮内
|
|
@@ -1083,10 +1186,20 @@ XLSX 仍可提取文字和表格内容,旧版 DOC、PPT、XLS 会先通过 Lib
|
|
|
1083
1186
|
内容继续发送给模型。所有工具结果另有 1,000,000 字符的最终兜底。当前不做
|
|
1084
1187
|
OCR,扫描版 PDF 只会返回无可提取文字的提示。
|
|
1085
1188
|
|
|
1086
|
-
Agent Arena
|
|
1087
|
-
`gemini-3.1-flash-tts-preview
|
|
1088
|
-
|
|
1089
|
-
`
|
|
1189
|
+
Agent Arena 单图生成默认在 `gemini-3.1-flash-image` 和 `gpt-image-2` 中每次等概率随机选择;
|
|
1190
|
+
设置 `ARENA_IMAGE_MODEL` 可固定模型。语音默认使用 `gemini-3.1-flash-tts-preview`,
|
|
1191
|
+
可用 `ARENA_SPEECH_MODEL` 覆盖。
|
|
1192
|
+
`generate_image` 的 `offer_options=true` 默认并行调用 Gemini 和 GPT Image 2 生成候选图,等用户选择后
|
|
1193
|
+
把选中的图保存到 `file_path`,另一张保存到工作区根目录的 `Unselected files`。
|
|
1194
|
+
选择“两张都不要”或跳过时保留已有目标文件。省略该参数或传 `false` 仍直接生成一张图。
|
|
1195
|
+
第一模型可用 `ARENA_IMAGE_MODEL` 指定,第二模型可用 `ARENA_IMAGE_ALTERNATIVE_MODEL` 指定,
|
|
1196
|
+
默认 `gpt-image-2`;第一模型已经使用它时,第二模型默认改为 `gemini-3.1-flash-image`,两者不能相同。
|
|
1197
|
+
Web UI 直接展示两张图;TUI 给出候选图片路径供查看。没有交互 handler 的 headless 模式
|
|
1198
|
+
仍生成两张候选图,默认保存第一张并继续执行;也可配置支持图片预览的远程用户 handler 供选择。未完成的候选图保存在
|
|
1199
|
+
`ARENA_HOME/image-options`,同一会话重试相同请求时可复用;选择完成后清理临时图片。
|
|
1200
|
+
Code Arena 单图生成默认在 `gpt-image-2.5-sunburst` 和 `gpt-image-2.5-flare` 中
|
|
1201
|
+
每次等概率随机选择,暂不使用 Grok 和 `muse-image`。配置时优先使用 `CODE_HARNESS_IMAGE_MODEL` 固定模型,
|
|
1202
|
+
其次使用显式设置的 `ARENA_IMAGE_MODEL`。Code Arena 不提供 `offer_options`。图片生成结果和
|
|
1090
1203
|
搜索到的图片会立即下载到工作区;每次图片搜索的结果按生产命名保存为
|
|
1091
1204
|
`image-search/<query slug>-<序号>.<扩展名>`,并作为可预览文件显示在 Web UI。
|
|
1092
1205
|
语音生成先由 `add_voice` 生成两个试听候选并让用户选择,选择结果注册为稳定的
|
package/dist/agent.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { type ArenaConfig } from "./config.js";
|
|
2
2
|
import { type StoredSessionMemory, type SessionMemoryCache } from "./compaction.js";
|
|
3
|
+
import { type ModelRequestObserver } from "./provider.js";
|
|
3
4
|
import { EventSink } from "./protocol.js";
|
|
4
5
|
import { type HarnessMode } from "./mode.js";
|
|
5
6
|
import { ToolExecutor } from "./tools.js";
|
|
@@ -15,6 +16,8 @@ interface AgentOptions {
|
|
|
15
16
|
signal?: AbortSignal;
|
|
16
17
|
clientContext?: ClientContext;
|
|
17
18
|
workspaceContext?: WorkspaceContext;
|
|
19
|
+
/** Restore the session's selected direct workspace child. */
|
|
20
|
+
repoDirectory?: string;
|
|
18
21
|
onCheckpoint?: (messages: readonly Message[], tools: readonly ToolDefinition[], sessionMemory?: StoredSessionMemory | null) => Promise<void>;
|
|
19
22
|
/** Inspect repetition, tool-call batches and pending Agent Arena compactions. */
|
|
20
23
|
midturnCheckpointHook?: MidturnCheckpointHook;
|
|
@@ -28,6 +31,7 @@ interface AgentOptions {
|
|
|
28
31
|
/** Explicit Agent Arena override of the resolved compaction threshold. */
|
|
29
32
|
compactionThresholdTokens?: number;
|
|
30
33
|
onModelFailure?: (messages: readonly Message[], error: unknown) => void;
|
|
34
|
+
onModelRequest?: ModelRequestObserver;
|
|
31
35
|
/** Reuse immutable loaded history messages instead of cloning the full prefix. */
|
|
32
36
|
reuseHistoryMessages?: boolean;
|
|
33
37
|
}
|
|
@@ -36,18 +40,20 @@ interface AgentRunOptions {
|
|
|
36
40
|
userMessage?: UserTurnMessage;
|
|
37
41
|
resumeFromHistory?: boolean;
|
|
38
42
|
singleStep?: boolean;
|
|
39
|
-
/**
|
|
43
|
+
/** Overrides config; defaults to true. Restores the cache without forcing compaction. */
|
|
40
44
|
restoreSessionMemory?: boolean;
|
|
41
45
|
}
|
|
42
46
|
export declare function isContinuableHistory(messages: readonly Message[]): boolean;
|
|
43
|
-
export declare function resolveRepoContext(workspace: string, _history?: Message[], mode?: HarnessMode): RepoContext | undefined;
|
|
47
|
+
export declare function resolveRepoContext(workspace: string, _history?: Message[], mode?: HarnessMode, repoDirectory?: string): RepoContext | undefined;
|
|
44
48
|
export declare class Agent {
|
|
45
49
|
private readonly config;
|
|
46
50
|
private readonly sink;
|
|
47
51
|
private readonly options;
|
|
48
52
|
private checkpointQueue;
|
|
53
|
+
private readonly restoredToolCalls;
|
|
49
54
|
private checkpointError?;
|
|
50
55
|
private persistedMemory?;
|
|
56
|
+
private repoDirectory?;
|
|
51
57
|
private readonly memoryCache;
|
|
52
58
|
private readonly client;
|
|
53
59
|
private readonly tools;
|