blob: 86e7b9749a4507cfb9427ec13578f04a29c5f312 [file] [view]
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
# Native build tooling
[English](README.md)
这些脚本从指定源码构建原生包及 npm 启动器。对外构建与发布顺序见 [packages/cli](../../packages/cli/README.zh-CN.md)。
macOS 原生打包需要 Xcode 26 或更新版本。Linux 需要 GLib、X11/XCB、xkbcommon、Wayland、Fontconfig 和 FreeType 开发文件,以及 cargo-zigbuild 与 Zig。[原生 CI 工作流](../../.github/workflows/npm-publication.yml)记录构建环境。
Rust 构建需要 libclang 来生成 SQLite preupdate-hook 绑定,即使已有 V8 缓存包也需要。
发布包使用关闭可选 LGPL glibc 数学代码的固定 V8 构建。完成的库、绑定和 notices 缓存在 `target/v8` 或 `$CARGO_TARGET_DIR/v8`。缓存未命中时,构建器下载 [v8-prebuilts.json](v8-prebuilts.json)指定的包并校验摘要。缓存损坏或固定来源失效会直接报错;没有对应固定来源时才从源码构建。源码构建还需要 Python、Git、Clang/libclang 19 或更新版本、C++ 工具链,以及较多磁盘空间和时间。
缓存键标识 V8 源码、目标、特性和生成代码。新增键时,使用已完成原生工作流输出的精确归档,将其发布为带版本的依赖预发布资产,再把 URL、哈希和验证依据写入 manifest。保留已有资产及键的含义。每个包仍执行原生链接和 smoke 检查。
依赖变更后执行:
```sh
node scripts/rust/dependencies.mjs generate
node scripts/rust/notices.mjs generate
node scripts/rust/dependencies.mjs check
node scripts/rust/notices.mjs check
```
检查生成的清单和许可证文本。[notices-sources.json](notices-sources.json)记录已审查的上游例外。发布组装还包含实际 V8 构建与 Rust 标准库的 notices。TSV 清单不能替代完整许可证文本。
终端行为使用当前 [terminal-shell 真实 Host 测试](../../products/maka/terminal-shell/tests/real_host.rs),包含生产 PTY 生命周期。通过 `cargo test -p maka-cli --no-default-features --test terminal_real_host` 运行。比较保留的 release 产物时,使用相同渲染器、终端协议、视口和负载;分别报告输入延迟、帧编码和输出传输。
长任务对比使用两个版本保留的 release 测试可执行文件,基准夹具必须相同。
通过 `cargo test --release --no-run` 构建 `maka-event-log --test archive`
和 `maka-agent-engine --test integration`,然后运行:
```sh
python3 scripts/rust/benchmark-long-task.py --kind engine \
--baseline /tmp/engine-before --candidate /tmp/engine-after \
--sizes 250,1000 --runs 5 --output /tmp/maka-long-task
```
归档测试可执行文件使用 `--kind prune`;真实上下文压缩后的 Engine 测量使用
`--checkpoint`。脚本交替运行两个版本,检查实际完成的工作相同,保留原始日志、
错误、中位数和范围。记录构建 profile、目标架构和依赖 feature;feature unification
可能使独立测试与产品使用不同的哈希后端。使用 `sha2` 0.10 的旧 Engine 基线在受支持的
ARM64 平台上需加 `--features sha2/asm`,才能与产品后端一致。当前依赖在运行时选择
受支持的 CPU 指令,并保留软件回退。
造数据不计时;Engine 耗时涵盖请求送达与执行完成,不包含
Host IPC。[Engine 夹具](../../plugins/agent/engine/tests/integration/long_task_perf.rs)
和 [prune 夹具](../../platform/event-log/tests/archive/performance.rs) 提供工具稀疏、
工具密集及投影大小等参数。测量时不要同时构建;CPU 剖析与耗时对比分开运行。
测量 1,000 / 10,000 / 100,000 轮时,将 `MAKA_ENGINE_PERF_FIXTURE_DIR` 指向
系统临时目录内的一次性目录,并用 `MAKA_ENGINE_PERF_FIXTURE_TAG` 明确标记版本。
Engine 夹具走真实 append 校验,每 1,000 轮执行真实压缩;关闭后的 SQLite 快照
按全部负载参数及夹具源码哈希缓存,修改夹具会使缓存失效。对夹具源码一致的保留
可执行文件运行 `--kind engine --checkpoint --sizes 1000,10000,100000`。
造数据与请求耗时分开,前者可能远长于实际测量过程。
历史与取消测试使用 `--kind responsive`,并将 `MAKA_RESPONSIVENESS_FIXTURES`
设为上述一次性 `.sqlite` 快照路径,以逗号分隔。它验证真实的有界
历史页,以及 admission 前、admission 完成后 10 ms 和模型 HTTP 请求到达后的取消。
`long_history_window` 在打开复制的存储后直接测量首个历史页,不含打开时首次安装目录
的耗时;首次安装必须单独测量。保留的 `long_history_preparation` 记录仍表示旧探针的
先准备再读取过程,不重新解释为直接读取结果。
admission 前覆盖普通与手动消息预检:10 ms 触发时 start 必须仍在等待,随后取消且
不产生 opening 或模型请求。夹具需足够大,提前完成 admission 会使测试失败。
admission 后的定时触发不保证引擎仍处于准备阶段,需核对模型请求计数。
停止计时截至 start 返回取消,或已 admission 的 Engine 完成清理且持久化取消结果;
不包含 EventLog 关闭时等待被放弃读取结束的时间。
这些是存储/Engine API 指标,不是 GUI 或 Host IPC 延迟。上下文与裁剪读取在
调用方取消后通过 SQLite progress handler 中断,并等事务清理完成后复用连接;
双 reader 回收及事务恢复另有行为测试,不代表任意同步 Rust 计算都可立即中断。
`--kind transcript --sizes 128,512` 使用保留的 release
`maka-event-log --test transcript_index` 可执行文件,补测同一 invocation 内的
大量模型步骤。每个样本从新副本生成 transcript,并逐条核对助手消息内容。
`--kind executor --sizes 128,512` 用同一 transcript 可执行文件测量外部执行器
的连续工具调用,并将全部持久化消息与 canonical replay 对比,覆盖工具进度、
结果和最终 invocation 状态。
要测量同一活跃 Host 会话中的多轮压缩,保留 release 构建的
`maka-agent-native --lib` 测试可执行文件,再运行:
```sh
MAKA_COMPACTION_CYCLES=10 MAKA_COMPACTION_PROMPT_BYTES=65536 \
"$NATIVE" owner::tests::scale::compaction::real_host_same_session_compaction \
--ignored --exact --nocapture --test-threads=1
```
每轮新增输入并通过真实 Host 回执执行手动压缩。最后一次请求验证最新 checkpoint
已被采用,分页历史核对原始消息。`MAKA_AGENT_COMPACTION` JSON 输出实际请求与
checkpoint 数量、已验证字节数及各操作的延迟/CPU 时间。操作计时排除初始化、
证据读取和关闭,但包含同进程内的受控 HTTP 模型。请求 JSON 大小是规范化后的
序列化长度;峰值 RSS 覆盖整个进程。该探针使用四个 Tokio worker,不测量 IPC、
渲染、自动压缩、模型推理或能耗。
要测量真实 Executor 附件捕获,使用同一个 release native 测试可执行文件:
```sh
MAKA_ARTIFACT_PROBE_BYTES=51847623 \
"$NATIVE" owner::tests::executor::executor_attachments_use_only_owned_immutable_uploads_and_original_receipts \
--exact --nocapture --test-threads=1
```
该设置只改变第一个上传文件,另十六个小文件保留顺序、字节/摘要、权限和原操作
重放校验。`MAKA_ARTIFACT_PROBE` 输出实际工作量、SQLite 版本、观察到的完成延迟/CPU
及清理结果。阶段计时排除上传,但包含 Host 准备、同步服务读取/摘要和观察开销;
服务入口的观察时间可能已包含整个服务调用。峰值 RSS 包含驱动程序。比较时保持
测试源码和特性一致,每个大小至少交替运行五次,另行采集 profile;这些指标不是
独立 SQLite、IPC、渲染、模型推理或能耗测量。
要在 Unix 上测量真实服务工具执行,使用同一个 release native 测试可执行文件,每个进程
只运行一个 case:
```sh
MAKA_TOOL_STORM_CALLS=64 MAKA_TOOL_STORM_PAYLOAD_BYTES=128 \
MAKA_TOOL_STORM_BACKEND=native \
"$NATIVE" owner::tests::service_tools::storm::real_service_tool_storm \
--ignored --exact --nocapture --test-threads=1
```
该 case 连续执行 mutation。改用同模块的 `real_service_query_fanout` 可测量
同一模型 step 中的只读调用;backend `javascript` 使用真实 JavaScript 服务。
fanout 数量不代表同时执行的 handler 数量。`MAKA_AGENT_TOOL_STORM` JSON 记录
实际调用、精确结果校验、请求、延迟/CPU、进程峰值 RSS 和清理结果。计时包含
受控 HTTP responder,不包含外部推理、IPC 或渲染。大 payload 可以触发真实自动
压缩:responder 返回 Summary 正文,验证生成的 checkpoint 及后续 Main 对它的
采用,同时通过历史逐一核对原始工具结果。Summary 请求和 checkpoint 与工具工作量
分别记录。这验证受控协议和生命周期,不证明真实模型的上下文容量或摘要质量。
只有完整执行且全部校验通过的工作才计为成功 case。
要在 Unix 上验证真实图像上传,使用同一个 release native 测试可执行文件:
```sh
MAKA_IMAGE_COUNT=2 MAKA_IMAGE_SIDE=512 \
"$NATIVE" owner::tests::scale::image_upload::real_image_upload_vision_scale \
--ignored --exact --nocapture --test-threads=1
```
通过 `MAKA_IMAGE_PROTOCOL` 选择实际协议:默认 `openai-compatible`,或
`openai-chat-completions`、`anthropic`、`responses`。Compatible 设置
`MAKA_IMAGE_RETRY=true` 时会收到一次明确的 `stream_options` 拒绝;
两次 HTTP 请求都必须包含全部原图。
每个进程生成不同的有效 RGBA PNG,完整解码核验后,逐张捕获文件快照并通过 Host
上传。探针核对持久上传回执、原始 artifact 字节和 canonical 引用、真实 provider
HTTP 请求中有序且精确的图像、完整公开历史和清理结果。只有原图精确送达才通过;
上传已受理或以替代文字完成回答均不算成功。`MAKA_AGENT_IMAGE_SCALE` 记录实际编码
大小、像素尺寸、分阶段计时、进程峰值 RSS 和失败证据。生成和校验与上传、turn
分别计时,但其内存仍计入进程峰值 RSS。HTTP responder 和校验在同一进程运行。
该探针不测量产品像素解码、IPC、渲染、真实模型推理或能耗。分别扩张图像数量与尺寸;
若现有边界阻止原图送达,保留失败 case。
在 Linux 上离线比较生产 Rust 与 TypeScript Host,可使用
[Host 对比工具](host-comparison/README.md)。工具通过真实公开客户端调用本地 SSE
服务,逐字核验持久化结果,并保留进程和系统指标。后台 agent 容量测试分别记录
请求的会话数、实际活跃执行数、已确认完成数及结果未确认的调用。