跳到主要内容

agentrix-run

agentrix-run 用于从命令行或 CI 任务提交 Agentrix CI run。它适合放在流水线里,让 Agentrix 代理审阅 PR、总结变更、生成结构化输出,或者启动一个异步任务后再到 Agentrix 应用里查看结果。

它和主 agentrix 守护进程 CLI 是两套工具。agentrix-run 直接调用 Agentrix API 创建 CI run,可以持续流式输出事件直到任务结束,也可以只创建任务后立即返回。

前置条件​

  • CI 任务里有 Node.js 20 或更高版本。
  • 有一个能访问目标组织和仓库的 Agentrix API key。
  • 能访问 Agentrix API。公有云 API 地址默认是 https://agentrix.xmz.ai。
  • 目标仓库已接入 Agentrix。在 GitHub Actions 和 GitLab CI 中,agentrix-run 可以从 CI 环境变量自动识别当前仓库。
  • 一个 runner ID。只有部署里配置了默认 cloud runner,或选择的 companion agent 已经绑定机器时,才可以省略。
  • 如果使用 --resume,需要已有 task ID;此模式不需要仓库上下文或 runner ID。

建议把 API key 放到环境变量里:

export AGENTRIX_API_KEY=<your-api-key>

也可以通过 --api-key 显式传入 key。只有需要覆盖默认公有云 API 地址时,才需要传 --base-url 或设置 AGENTRIX_BASE_URL。

安全模式​

agentrix-run 通过 Agentrix API 创建 CI run。即使传入的是 machine-* runner ID,task 会在对应的本地机器上执行,但这个 CI run 仍然是明文 CI 模式:prompt 和 CI 上下文会作为普通 API 请求数据发送到服务端,并作为普通 task event 保存。

这不同于从 Agentrix 应用里发起的本地 task。应用本地持有用户的加密材料,因此可以提交 encryptedMessage、dataEncryptionKey 和 ownerEncryptedDataKey。不要把密钥或敏感凭据写进 --prompt;这类数据应留在 CI secret store 或机器本地配置里。

在 shell 中运行​

CI 里建议固定 npm 包版本。当前包名是 @agentrix/agentrix-run。

npx --yes @agentrix/[email protected] \
--agent codex \
--prompt "Review this change and return one short summary sentence." \
--response-mode stream \
--runner-id cloud-default

如果不是在 GitHub Actions 或 GitLab CI 中运行,需要手动传仓库上下文:

npx --yes @agentrix/[email protected] \
--agent codex \
--prompt "Review this branch." \
--repo '{"gitServerId":"github","owner":"xmz-ai","name":"agentrix"}' \
--base-ref develop \
--head-ref feature/demo \
--pr-number 123 \
--runner-id cloud-default

也可以向已有 task 追加消息。agentrix-run 会复用 task 的执行上下文;worker 在线时直接投递给 agent,worker 已退出时由后端恢复 task:

npx --yes @agentrix/[email protected] \
--resume task-abc123 \
--prompt "继续检查刚才失败的测试,并给出最终结论。" \
--response-mode stream

响应模式​

模式行为退出码
stream创建 run,流式输出任务事件,等待终态后退出。这是默认模式。只有最终状态为 completed 时返回 0;failed、canceled 或 timeout 会返回非零。
async创建 run 并打印基础元数据,不等待任务完成。run 创建成功时返回 0。

使用 --resume 时,响应模式含义相同:stream 会在追加消息被接受后继续流式观察该 task,async 只确认消息已交给后端。

stream 模式下,stdout 会输出 JSON lines:

{"type":"run.created","data":{"runId":"run-..."}}
{"type":"task.event","data":{}}
{"type":"run.completed","data":{"runId":"run-...","status":"completed","result":"...","detailUrl":"..."}}

async 模式下,stdout 会输出标准字段:

run_id=run-abc123
status=queued
detail_url=https://agentrix.xmz.ai/tasks/task-abc123

如果后续 CI 步骤需要读取结果,用 --result-file 写入 JSON 文件:

npx --yes @agentrix/[email protected] \
--agent codex \
--prompt "Summarize this PR." \
--result-file agentrix-result.json

结果文件格式如下:

{
"runId": "run-abc123",
"status": "completed",
"result": "Short summary text.",
"structuredOutput": null,
"detailUrl": "https://agentrix.xmz.ai/tasks/task-abc123"
}

结构化输出​

通过 --output-schema 传入 JSON Schema 字符串。agentrix-run 会把对象 schema 规范化为严格结构化输出:对象节点会自动设置 additionalProperties: false,并把所有声明的属性加入 required。

npx --yes @agentrix/[email protected] \
--agent codex \
--prompt "Summarize this change." \
--output-schema '{"type":"object","properties":{"summary":{"type":"string"},"risk":{"type":"string"}}}' \
--result-file agentrix-result.json

规范化后的结构化输出会写入结果文件里的 structuredOutput 字段。GitHub Action 会把它暴露为 structured-output-json 输出。

GitHub Actions​

GitHub Actions 中推荐使用公开 action wrapper:

name: Agentrix

on:
pull_request:

jobs:
agentrix:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- id: agentrix
uses: xmz-ai/agentrix-run-action@v1
with:
api-key: ${{ secrets.AGENTRIX_API_KEY }}
agent: codex
prompt: >-
Review this PR and return one short summary sentence.
runner-id: cloud-default

- name: Print result
run: |
echo "run id: ${{ steps.agentrix.outputs.run-id }}"
echo "status: ${{ steps.agentrix.outputs.status }}"
echo "detail url: ${{ steps.agentrix.outputs.detail-url }}"
echo "result: ${{ steps.agentrix.outputs.result }}"

这个 action 会从 GitHub Actions 环境变量中自动识别仓库 owner、仓库名、ref、commit SHA、PR base/head 分支、PR 编号、事件名和 workflow run URL。

GitHub Action 输入​

输入必填说明
agent是Agent ID 或名称,例如 codex。
prompt是发送给 Agentrix 的任务内容。
base-url否Agentrix API 地址覆盖值。默认是 https://agentrix.xmz.ai。
api-key是Agentrix API key。建议放在 GitHub Actions secrets 中。
title否Agentrix 中显示的自定义任务标题。
output-schema否用于结构化输出的 JSON Schema 字符串。
repo否仓库 JSON 覆盖值。自动识别不够用时再传。
git-server-id否自动识别仓库时使用的 Git server ID,默认是 github。
response-mode否stream 或 async。默认是 stream。
issue-number否Issue 编号覆盖值。PR 编号会从事件 payload 中自动识别。
branch-name否显式 checkout 分支。设置后会覆盖自动识别到的 PR/MR head 分支,作为 workspace checkout 目标。
timeout否HTTP 读取超时时间;在 stream 模式下同时是总等待时间,单位为秒。async 默认 30 秒,stream 默认 1800 秒。
capability-profile否传给执行层的 capability profile。
runner-id通常是指定 runner ID,例如 cloud-* 或 machine-*。只有部署里配置了默认 cloud runner,或选择的 companion agent 已经绑定机器时,才可以省略。

GitHub Action 输出​

输出说明
run-idAgentrix run ID。
statusstream 模式下的最终状态,或 async 模式下的创建状态。
detail-urlAgentrix 任务 URL。
result最终结果文本。async 模式下为空。
structured-output-json最终结构化输出的 JSON 字符串。没有结构化输出时为 null。

GitLab CI​

在 GitLab CI 中,可以把下面这个隐藏 job 放进项目的 .gitlab-ci.yml,也可以放进你们自己维护的共享 CI 模板:

.agentrix-run:
image: node:20-alpine
variables:
AGENTRIX_RESPONSE_MODE: stream
script:
- |
set -eu
set -- \
--agent "$AGENTRIX_AGENT" \
--prompt "$AGENTRIX_PROMPT" \
--response-mode "${AGENTRIX_RESPONSE_MODE:-stream}" \
--runner-id "$AGENTRIX_RUNNER_ID"

if [ -n "${AGENTRIX_TITLE:-}" ]; then
set -- "$@" --title "$AGENTRIX_TITLE"
fi
if [ -n "${AGENTRIX_OUTPUT_SCHEMA:-}" ]; then
set -- "$@" --output-schema "$AGENTRIX_OUTPUT_SCHEMA"
fi
if [ -n "${AGENTRIX_REPO:-}" ]; then
set -- "$@" --repo "$AGENTRIX_REPO"
fi
if [ -n "${AGENTRIX_BRANCH_NAME:-}" ]; then
set -- "$@" --branch-name "$AGENTRIX_BRANCH_NAME"
fi
if [ -n "${AGENTRIX_TIMEOUT:-}" ]; then
set -- "$@" --timeout "$AGENTRIX_TIMEOUT"
fi
if [ -n "${AGENTRIX_CAPABILITY_PROFILE:-}" ]; then
set -- "$@" --capability-profile "$AGENTRIX_CAPABILITY_PROFILE"
fi
if [ -n "${AGENTRIX_RESULT_FILE:-}" ]; then
set -- "$@" --result-file "$AGENTRIX_RESULT_FILE"
fi
if [ -n "${AGENTRIX_BASE_URL:-}" ]; then
set -- "$@" --base-url "$AGENTRIX_BASE_URL"
fi

npx --yes @agentrix/agentrix-run "$@"

然后在实际 pipeline job 里继承它:

agentrix_review:
extends: .agentrix-run
variables:
AGENTRIX_AGENT: codex
AGENTRIX_PROMPT: Review this merge request and return one short summary sentence.
AGENTRIX_RESPONSE_MODE: stream
AGENTRIX_RUNNER_ID: cloud-default

把 AGENTRIX_API_KEY 保存为 masked CI variable。GitLab CI 自动识别会读取项目路径、commit ref、commit SHA、MR source/target 分支、MR IID、job URL 和 pipeline URL。

daemon webhook 触发的 pipeline​

如果 GitLab pipeline 是由 Agentrix daemon webhook bridge 触发的,daemon 会把 GitLab webhook 规范化成 GITLAB_BRIDGE_EVENT_NAME 和 GITLAB_BRIDGE_EVENT_ACTION,并用同样的 GITLAB_BRIDGE_* 前缀设置 issue/MR/pipeline/comment 相关变量。此时 GitLab 标准变量仍然可用, agentrix-run 会用 CI_PROJECT_PATH、CI_COMMIT_REF_NAME 和 CI_COMMIT_SHA 自动识别仓库和 commit。

建议每类 webhook 单独写 job,用 rules 按规范化事件变量分流:

agentrix_issue_triage:
extends: .agentrix-run
rules:
- if: '$GITLAB_BRIDGE_EVENT_NAME == "issues"'
when: on_success
- when: never
variables:
AGENTRIX_AGENT: codex
AGENTRIX_RESPONSE_MODE: stream
AGENTRIX_RUNNER_ID: cloud-default
AGENTRIX_TITLE: "Issue #$GITLAB_BRIDGE_ISSUE_NUMBER: $GITLAB_BRIDGE_EVENT_ACTION"
AGENTRIX_PROMPT: >-
Review GitLab issue #$GITLAB_BRIDGE_ISSUE_NUMBER in this repository.
Event action: $GITLAB_BRIDGE_EVENT_ACTION.
Issue title: $GITLAB_BRIDGE_ISSUE_TITLE.
Decide whether this needs agent work, and return a short triage summary.

MR review job:

agentrix_mr_review:
extends: .agentrix-run
rules:
- if: '$GITLAB_BRIDGE_EVENT_NAME == "pull_request" && ($GITLAB_BRIDGE_EVENT_ACTION == "opened" || $GITLAB_BRIDGE_EVENT_ACTION == "reopened" || $GITLAB_BRIDGE_EVENT_ACTION == "synchronize")'
when: on_success
- when: never
variables:
AGENTRIX_AGENT: codex
AGENTRIX_RESPONSE_MODE: stream
AGENTRIX_RUNNER_ID: cloud-default
AGENTRIX_TITLE: "MR !$GITLAB_BRIDGE_PR_NUMBER review"
AGENTRIX_PROMPT: >-
Review GitLab merge request !$GITLAB_BRIDGE_PR_NUMBER.
Source branch: $GITLAB_BRIDGE_HEAD_REF.
Target branch: $GITLAB_BRIDGE_BASE_REF.
Return concise findings and suggested fixes.

评论 job。daemon 默认转发 supported 非 system 评论:

agentrix_comment_command:
extends: .agentrix-run
rules:
- if: '$GITLAB_BRIDGE_EVENT_NAME == "issue_comment"'
when: on_success
- when: never
variables:
AGENTRIX_AGENT: codex
AGENTRIX_RESPONSE_MODE: stream
AGENTRIX_RUNNER_ID: cloud-default
AGENTRIX_TITLE: "Agentrix comment command"
AGENTRIX_PROMPT: >-
Handle this GitLab comment.
Issue: $GITLAB_BRIDGE_ISSUE_NUMBER.
Merge request: $GITLAB_BRIDGE_PR_NUMBER.
Comment: $GITLAB_BRIDGE_COMMENT_BODY

Pipeline failed 诊断 job。Pipeline webhook 会作为 workflow_run 事件转发,包括由 trigger token 创建的 pipeline:

agentrix_pipeline_failed:
extends: .agentrix-run
rules:
- if: '$GITLAB_BRIDGE_EVENT_NAME == "workflow_run" && $GITLAB_BRIDGE_EVENT_ACTION == "completed" && $GITLAB_BRIDGE_WORKFLOW_RUN_CONCLUSION == "failure"'
when: on_success
- when: never
variables:
AGENTRIX_AGENT: codex
AGENTRIX_RESPONSE_MODE: stream
AGENTRIX_RUNNER_ID: cloud-default
AGENTRIX_TITLE: "Pipeline $GITLAB_BRIDGE_WORKFLOW_RUN_ID failed"
AGENTRIX_PROMPT: >-
Diagnose failed GitLab pipeline $GITLAB_BRIDGE_WORKFLOW_RUN_ID.
Ref: $GITLAB_BRIDGE_WORKFLOW_RUN_REF.
SHA: $GITLAB_BRIDGE_WORKFLOW_RUN_SHA.
Pipeline URL: $GITLAB_BRIDGE_WORKFLOW_RUN_URL.
Explain the likely cause and propose the smallest fix.

其他常见分流写法:

agentrix_issue_closed:
extends: .agentrix-run
rules:
- if: '$GITLAB_BRIDGE_EVENT_NAME == "issues" && $GITLAB_BRIDGE_EVENT_ACTION == "closed"'
when: on_success
- when: never
variables:
AGENTRIX_AGENT: codex
AGENTRIX_PROMPT: "Summarize the closing state of GitLab issue #$GITLAB_BRIDGE_ISSUE_NUMBER."
AGENTRIX_RESPONSE_MODE: async
AGENTRIX_RUNNER_ID: cloud-default

不要只依赖 CI_PIPELINE_SOURCE 区分来源。daemon 触发的 pipeline 在 GitLab 中通常也是 trigger pipeline,应优先用 GITLAB_BRIDGE_EVENT_NAME 和 GITLAB_BRIDGE_EVENT_ACTION 做分流。

CLI 选项​

选项必填说明
--agent <agent>新建 run 时必填Agent ID 或名称。
--resume <task-id>否向已有 task 追加一条 --prompt 消息。设置后不创建新的 CI run,也不需要 --agent。
--prompt <prompt>是发送给 Agentrix 的任务内容。
--title <text>否Agentrix 中显示的自定义任务标题。
--client-task-id <id>否用于幂等创建的稳定业务键。同一 API 用户使用相同业务键重试时返回同一个 run,以首次请求为准。
--repo <json>通常自动识别仓库 JSON 对象。必须包含 gitServerId,并且包含 serverRepoId 或同时包含 owner 与 name。
--output-schema <json>否用于结构化输出的 JSON Schema 字符串。对象 schema 会被规范化为严格输出。
--ref <ref>否本次 run 的 Git ref。会覆盖 CI 自动识别的 ref。
--sha <sha>否本次 run 的 commit SHA。会覆盖 CI 自动识别的 SHA。
--base-ref <ref>否PR 或 MR 的 base/target 分支,会作为 git.baseRef 传给 API。
--head-ref <ref>否PR 或 MR 的 head/source 分支,会作为 git.headRef 传给 API。
--head-sha <sha>否PR 或 MR 的 head/source commit,会作为 git.headSha 传给 API。
--checkout-ref <ref>否显式指定 workspace 初始化 ref;这是 git.checkoutRef 的唯一来源。
--checkout-sha <sha>否显式指定 workspace 初始化 SHA;这是 git.checkoutSha 的唯一来源。
--branch-name <name>否显式任务工作分支,会作为 git.branchName 传给 API;设置后会创建显式 task branch binding。
--pr-number <number>否PR 或 MR 编号。必须是正整数。
--issue-number <number>否Issue 编号。必须是正整数。
--response-mode <stream|async>否stream 等待完成;async 只创建 run。默认是 stream。
--timeout <seconds>否HTTP 读取超时时间;在 stream 模式下同时是总等待时间。async 默认是 30,stream 默认是 1800。必须是正整数。连接超时固定为 10 秒。
--capability-profile <name>否传给执行层的 capability profile。
--runner-id <cloud-id|machine-id>通常是指定 runner,例如 cloud-default 或 machine-...。只有部署里配置了默认 cloud runner,或选择的 companion agent 已经绑定机器时,才可以省略。
--result-file <path>否把 run 结果 JSON 写入指定路径。
--base-url <url>否Agentrix API 地址覆盖值。默认是 https://agentrix.xmz.ai;优先级高于 AGENTRIX_BASE_URL。
--api-key <api-key>未设置 AGENTRIX_API_KEY 时必填Agentrix API key。推荐通过环境变量或 CI secret 传。
--metadata <key=value>否给 run 添加 metadata。可以重复传多次。
--help否打印命令帮助。

仓库 JSON​

--repo 接收以下形状的 JSON 对象:

{
"gitServerId": "github",
"owner": "xmz-ai",
"name": "agentrix"
}

也可以通过服务端仓库 ID 标识仓库:

{
"gitServerId": "github",
"serverRepoId": "repo-abc123"
}

检测到 CI provider 时,--repo 中的显式字段会覆盖自动识别出来的字段。

分支上下文和 worker 环境​

agentrix-run 会把分支上下文放在 CreateCiRunRequest.git 中传给 API:

显式 CLI 参数始终优先。自动探测的 git.ref 和 git.sha 只描述当前 CI Job 的 checkout: GitHub 使用 GITHUB_REF 和 GITHUB_SHA,GitLab 使用 CI_COMMIT_REF_NAME 和 CI_COMMIT_SHA。 bridge 变量不会覆盖这两个字段。

CLI 参数API 字段含义
--base-refgit.baseRefPR/MR 的目标分支,例如 main。
--head-refgit.headRefPR/MR 的来源分支,例如 feature/demo。
--head-shagit.headShaPR/MR 的来源 commit。
--checkout-refgit.checkoutRefworkspace 初始化起点 ref。
--checkout-shagit.checkoutShaworkspace 初始化起点 SHA。
--branch-namegit.branchName显式任务工作分支覆盖值。

API 会把这些值映射到受控的 Agentrix task 字段:

  • git.baseRef 写入 task baseBranch。
  • git.headRef 和 git.headSha 保持为观测到的 PR/MR head context。
  • git.ref 和 git.sha 是当前 Job 事实,不会提升为 checkout 指令或 MR head 字段。
  • 只有显式的 git.checkoutRef 和 git.checkoutSha 才定义 workspace 初始化起点。
  • 只有调用方显式传入 git.checkoutSha 时才会使用它;不会再从 git.sha 或 git.headSha 推导。
  • 显式传入 git.branchName 时写入 task branchName。
  • 未传入 git.branchName 时,task branchName 保持未设置,branch binding 保持 none。

worker 只会优先使用显式的 checkoutSha;否则使用 checkoutRef 或 base 分支初始化未绑定的 CI workspace,但不会把这些来源分支绑定成 task 本地分支。显式 branchName 任务仍把该分支作为强任务分支绑定。

最终 agent 进程会从这些 task 字段获得受保护的环境变量:

Worker 环境变量来源 task 字段含义
AGENTRIX_BASE_REFbaseBranchTarget/base 分支。
AGENTRIX_HEAD_REFheadRef观测到的 PR/MR 来源分支。
AGENTRIX_HEAD_SHAheadSha观测到的 PR/MR 来源 commit。
AGENTRIX_CHECKOUT_REFcheckoutRefworkspace 初始化 ref。
AGENTRIX_CHECKOUT_SHAcheckoutShaworkspace 初始化 SHA。
AGENTRIX_TASK_BRANCHbranchName存在绑定时的任务分支。
AGENTRIX_TASK_BRANCH_BINDINGbranchBinding任务分支绑定模式。

这些 worker 环境变量属于平台 task context,会覆盖同名的用户自定义 agent 环境变量。

环境变量​

变量使用方说明
AGENTRIX_BASE_URLCLI、GitHub Action 子进程、GitLab 模板可选的 Agentrix API 地址覆盖值。默认是 https://agentrix.xmz.ai;传入 --base-url 时会被覆盖。
AGENTRIX_API_KEYCLI、GitHub Action 子进程、GitLab 模板API key,会作为 bearer token 使用。传入 --api-key 时会被覆盖。
AGENTRIX_GIT_SERVER_IDCI 自动识别自动识别仓库时使用的 Git server ID。GitHub Actions 默认是 github,GitLab CI 默认是 gitlab。
CI_COMMIT_REF_NAME / CI_COMMIT_SHAGitLab CI 自动识别当前 GitLab Job 的 ref 和 commit;它们是 git.ref 和 git.sha 唯一的自动来源。
GITHUB_REF / GITHUB_SHAGitHub Actions 自动识别当前 GitHub Job 的 ref 和 commit;它们是 git.ref 和 git.sha 唯一的自动来源。
GITLAB_BRIDGE_EVENT_NAMEGitLab daemon webhook 识别daemon bridge 注入的规范化事件名。
GITLAB_BRIDGE_EVENT_ACTIONGitLab daemon webhook 识别daemon bridge 注入的规范化事件动作。
GITLAB_BRIDGE_ISSUE_NUMBERGitLab daemon webhook 识别issue 和 issue comment 事件注入的 Issue 编号。
GITLAB_BRIDGE_PR_NUMBERGitLab daemon webhook 识别merge request 和 MR comment 事件注入的 PR 编号。
GITLAB_BRIDGE_BASE_REF / GITLAB_BRIDGE_HEAD_REF / GITLAB_BRIDGE_HEAD_SHAGitLab daemon webhook 识别观测到的 MR 上下文,仅在 GitLab 标准 MR 变量不存在时补充。
AGENTRIX_JOB_URLCI 自动识别覆盖自动识别的 job URL。
AGENTRIX_AGENTGitLab 模板Agent ID 或名称。
AGENTRIX_PROMPTGitLab 模板任务内容。
AGENTRIX_TITLEGitLab 模板自定义任务标题。
AGENTRIX_OUTPUT_SCHEMAGitLab 模板用于结构化输出的 JSON Schema 字符串。
AGENTRIX_REPOGitLab 模板仓库 JSON 覆盖值。
AGENTRIX_BRANCH_NAMECLI、GitLab 模板Task 分支名覆盖值。传入 --branch-name 时会被覆盖。
AGENTRIX_RESPONSE_MODEGitLab 模板stream 或 async。模板中默认是 stream。
AGENTRIX_TIMEOUTGitLab 模板HTTP 读取超时时间;在 stream 模式下同时是总等待时间,单位为秒。async 默认 30 秒,stream 默认 1800 秒。
AGENTRIX_CAPABILITY_PROFILEGitLab 模板Capability profile。
AGENTRIX_RUNNER_IDGitLab 模板Runner ID。上面的模板要求设置这个变量。
AGENTRIX_RESULT_FILEGitLab 模板结果 JSON 文件路径。

agentrix-run 不会根据 issue 或 workflow 阶段推断 checkout 策略。在 daemon 触发的 GitLab pipeline 中,GITLAB_BRIDGE_* 只补充 webhook 事件和观测到的 MR 上下文;不会覆盖当前 Job 的 ref/SHA,也不会生成 checkoutRef 或 checkoutSha。