Skip to main content
Arize AX managed agents run a harness (Claude Code, Codex, Cursor, or OpenCode) inside a sandbox to investigate traces, fix bugs, and open pull requests, either as a one-off session or on a recurring automation. Signal is a managed agent that reviews a tracing project on a schedule, groups recurring trace failures into ranked issues, and can open a PR or GitHub issue for one. The mutations below provision the sandbox infrastructure (integrations, configs, templates), run and message jobs, manage automations, and drive Signal end to end.

Find the IDs you need

Most mutations here take a spaceId, a modelId (project), an accountId, or a sandboxConfigId/sandboxIntegrationId. Start from viewer for spaces and projects, and from account for account-scoped sandbox resources:
sandboxConfigs and sandboxIntegrations are account-scoped, so this returns every config and credential the account has, not just the current space’s. See Using global node IDs for resolving a GID you already have (for example from a URL) with node.

List sandbox jobs and automations in a space

Once you have a space GID, list its recent sandbox jobs and configured automations in one call:
automationId on a job is null for manual jobs and Setup Repo sessions, so filter on it to separate ad-hoc runs from automation-spawned ones. Reference: sandboxJobs and automations on Space.

Create a sandbox integration and attach it to a config

A sandbox integration stores the credential (for example a GitHub token) a sandbox injects as an environment variable. A sandbox config bundles a repo, a harness, and a set of integrations into a reusable preset:
Then create a config that links it:
To add an integration to a config that already exists instead of recreating it, use addIntegrationToSandboxConfig. Update or remove either resource later with updateSandboxIntegration, deleteSandboxIntegration, updateSandboxConfig, or deleteSandboxConfig. Reference: createSandboxIntegration, createSandboxConfig.

Launch a sandbox job and send it a follow-up message

Launch a job with a prompt, then steer it with a follow-up message while it’s running:
Reference: createSandboxJob, sendSandboxMessage.

Snapshot a sandbox as a reusable template

A Setup Repo session (isSetupSession: true on createSandboxJob) clones and configures a repo once so future jobs can boot from the result instead of repeating setup:
templateId comes back as a string, but sandboxTemplateId on createSandboxConfig/updateSandboxConfig is an Int (the underlying DB id), so convert it before linking the template to a config:
Reference: createSandboxTemplate, updateSandboxConfig.

Create a cron or metric-triggered automation, then trigger it now

An automation spawns sandbox jobs from a sandboxConfigId on a schedule, either a fixed cadence or a metric threshold crossing. Provide exactly one of cron or metric:
Mutation
Variables
Fire the automation immediately without waiting for its schedule:
triggerAutomationNow still runs the normal admission gates (cooloff window, capacity, Signal issue limit), so it can be a no-op for an automation already at its cap. Pause an automation with setAutomationEnabled (enabled: false), repoint it to a different repo with setAutomationRepo (empty string clears the override), change its schedule with updateAutomation, or remove it with deleteAutomation (soft-delete). Reference: createAutomation, triggerAutomationNow.

Enable Signal on one project, or many at once

Enabling Signal lazily provisions the built-in Signal automation for the project if one doesn’t exist yet:
To roll it out across many projects in one call, use setSignalEnabledBulk, which processes each project independently and reports per-project outcomes:
The same bulk call scripted in Python, reading project GIDs from a prior list query:
llmIntegrationId on either mutation only applies when enabled is true; disabling a project ignores it. Reference: setSignalEnabled, setSignalEnabledBulk.

Tune Signal’s schedule and agent config

Change how often Signal runs and the extra context injected into its prompt:
cadenceSeconds must be between 4 hours (14400) and 30 days (2592000). To run Signal from a custom sandbox config instead of the shared built-in default, attach one:
Revert to the shared default with resetSignalAgentConfig (modelId only); it detaches the custom config without deleting it, so you can reattach it later. Reference: updateSignalConfig, setSignalAgentConfig.

List Signal issues for a project and resolve or fix one

List the open and ignored issues Signal has filed for a project:
Resolve or ignore an issue (or re-open one you dismissed). A resolved issue silently re-opens if the problem recurs; an ignored one stays suppressed across runs:
When hasAttachedRepo is true, launch a fix PR for the issue, borrowing the repo and GitHub credential from the automation that filed it:
To just track the issue in GitHub without launching an agent, use openSignalIssueGitHubIssue with the same id input; it returns the new issue’s issueUrl. When you’re done with Signal on a project entirely, deleteSignal removes its automation and is a no-op if none exists. Reference: setSignalIssueStatus, openSignalIssuePR.

Gotchas and behavior notes

  1. createAutomation.promptTemplate is required even when unused: set it to an empty string when agentTemplateKey is set, and to a real Go text/template string otherwise.
  2. createAutomation and updateAutomation both require exactly one of cron or metric. Sending both, or neither, is rejected.
  3. ID typing is inconsistent: jobId is a String! on CreateSandboxTemplateInput and SendSandboxMessageInput, but an ID! on CreateSandboxJobPayload. createSandboxTemplate likewise returns templateId as a String!, while sandboxTemplateId on the config mutations is an Int. Convert between them when chaining calls.
  4. setSignalEnabled and setSignalEnabledBulk only apply llmIntegrationId when enabled: true; disabling ignores it.
  5. UpdateSignalConfigInput.cadenceSeconds must be between 14400 (4 hours) and 2592000 (30 days).
  6. setAutomationRepo and the per-automation repo on createAutomation override the bound sandboxConfig’s own repo. SignalStatus.hasAttachedRepo and SignalIssue.hasAttachedRepo reflect this effective, resolved repo, so checking agentConfig.repo alone can be wrong.
  7. setSignalIssueStatus, openSignalIssuePR, and openSignalIssueGitHubIssue are gated by project-update access on the issue’s owning project, not just space membership.
  8. deleteAutomation and deleteSignal are both idempotent: deleting one that’s already gone is a no-op rather than an error.
  9. The config and integration CRUD inputs accept an optional spaceId purely to authorize via space membership; the underlying rows are always account-scoped, not space-scoped.

Managed agent and Signal mutations

All GraphQL mutations

API explorer