Skip to main content
Managed agents are only available on Enterprise plans.
A project with thousands of traces holds patterns no single trace shows you. Some are what users keep asking for, some are the ways your agent keeps failing, and neither shows up in a latency chart. A managed agent can read the whole project, summarize each trace, group the summaries into named patterns, and write those patterns back onto the traces as annotations so you can filter by them. Arize AX offers three other ways to turn traces into named patterns: Arize Skills in your coding agent, Alyx in the product, or manual annotation. A managed agent works through traces in one unattended run.

Overview

You will start a managed agent session against a tracing project, hand it a prompt that describes a summarize-and-cluster pipeline, and read the patterns it finds. The agent runs four stages: it summarizes each trace in a sentence using its own model, turns those summaries into vectors, reduces the vectors to a few dimensions, and clusters the result. It names each cluster and annotates the traces in it with that name, so you can then filter your traces by pattern. This guide is for builders who already have tracing projects in Arize AX and have managed agents enabled on their account. No prior experience with managed agents is required. You should be comfortable with:
  • Tracing projects in Arize AX, and reading traces in the UI
  • Annotations as a way to label spans
  • Basic clustering vocabulary: vector representations, dimensionality reduction, clusters, and outliers
By the end, you will be able to:
  • Write a prompt that turns an open-ended “find the patterns” request into a repeatable pipeline
  • Judge whether the clusters an agent reports are real
  • Filter traces by pattern, and build datasets from them

Before you start

You need:
  • A tracing project with at least one hundred traces. The patterns surfaced in smaller projects may already be obvious.
  • Managed agents enabled on your account, and write access to the space. See Skills and permissions.
  • The ax CLI installed and authenticated locally, for the filter and export commands at the end. The agent’s own copy comes preinstalled in its sandbox.

What managed agents can access

Each run happens in a sandbox, an isolated container that Arize AX tears down afterward. What the agent can reach is fixed before the run starts, and the prompts below are written to fit those limits:

Two routes

Which pipeline you can ask for comes down to one thing: whether a GitHub repo is attached to the run, because that is what opens PyPI. With a repo attached, the agent installs scikit-learn and UMAP and clusters with the libraries built for the job, which produces tighter clusters and handles more traces per run. Without a repo, every step has to be computable with the standard library, and requires no repo setup. It is recommended for batches of up to a few thousand traces. Past a few thousand, narrow the time window or attach a repo. Both routes produce the same summaries, the same annotation config, and the same filters. Only vectorizing and clustering differ.

Cluster the patterns

Three methods carry the pipeline, all computable with the standard library:
  • TF-IDF weighs each word by how often it appears in one summary against how rare it is across all of them, turning short summaries into vectors with nothing downloaded.
  • Spectral reduction takes the top eigenvectors of the trace-by-trace similarity matrix, which is classical multidimensional scaling on the cosine kernel. Sparse text vectors cluster poorly at full width, and this is the part UMAP would do if you could install it.
  • Average-link agglomerative clustering merges the closest pair of clusters until nothing is similar enough to join, so you set a similarity threshold rather than a cluster count.
1

Start a session in Agent Studio

Open Observe → Signal & Agents → + New Agent and choose Start from scratch. Then:
  1. Select the tracing project you want analyzed. This is the project the agent reads and annotates.
  2. Leave the preset as None.

Configuring a run in Agent Studio: selecting a project, and the preset, skill, and repo options this pipeline leaves alone

2

Give it the pipeline as a prompt

Paste this as the task prompt. It describes the pipeline in stages, and each stage names its own output so the agent cannot quietly skip one. Replace <project> with your project’s name first; $ARIZE_SPACE_ID is already set inside the sandbox, so leave it as written.
The diagnostics in steps 6 and 8 are what let you audit the result. Compare the reported trace count against your project’s actual volume, because an agent that quietly worked on a subset produces labels that look complete and undercount every pattern. A cluster confined to a single hour is an incident rather than a pattern, which is why each one carries a time range.Click Run session.
If your account restricts annotation config creation, create the config yourself before the run and paste its allowed values into step 9 in place of the create instruction:
Values are capped at 30 characters each, and a categorical config needs between 2 and 100 of them. Short slugs, not sentences.

Read and use the patterns

Everything from here is the same for both routes.
1

Read the clusters

Follow the transcript from the session detail slide-over, opened from the Agent List tab under Signal & Agents. The run exports spans, writes summaries, reduces and clusters them, then reports a named pattern for every cluster with the number of traces in it. The example below comes from a customer support agent:Read past the labels to the counts and examples. In this example the largest patterns are the ones the agent exists to handle, and the interesting ones are smaller: a dependency that fails for one class of input, and requests the agent has no tool to satisfy. That last kind never shows up in an error rate, because from the agent’s side those runs succeeded. It just quietly could not help.Notice that these labels lean on outcome rather than intent: one kind of request split into separate patterns according to whether it succeeded. That is the pipeline working as intended, and it is worth knowing before you read your own result, because patterns divide on whatever the summaries make salient.
2

Filter traces by pattern

Open any trace in the project and check the Annotations panel on its root span. The pattern label and the trace summary appear there, which confirms the write landed.Patterns are now a filter:
Use it in the trace view, in a saved view, or from the CLI:
Because the agent annotates root spans, this returns one span per matching trace rather than every span in those traces.From there a pattern behaves like any other slice: curate it into a dataset for an experiment, put it in a dashboard to watch its volume, or send it to a labeling queue for review.
3

Run it again as traffic changes

Patterns drift, so a single run describes the window it read and nothing later. Re-run the same prompt against a newer window whenever you want a current picture.Step 9 is what makes a second run safe. Each run clusters from scratch and would otherwise invent fresh slug names, which silently breaks saved filters, so the prompt tells the agent to read the existing config and reuse the slugs already in it. Config names are unique per space, so a run that tries to create pattern again fails outright, and an agent left to improvise may route around that error by creating a differently named config.Because a run inside the sandbox cannot amend a config’s values, genuinely new patterns come back reported rather than labelled. Widen the config yourself when that happens:
--value replaces the whole list rather than adding to it, so pass every value you want to keep, or existing annotations will point at labels the config no longer allows.

Tuning the clusters

The numbers in either prompt are starting points, not settled values. The two knobs pull in opposite directions: a higher similarity threshold splits clusters apart, while a higher min_cluster_size merges them by discarding the small ones. On the no-repo route the threshold is the lever; on the repo route it is min_cluster_size. Clusters that mix unrelated patterns. Raise the threshold above 0.30, or on the repo route lower min_cluster_size. A threshold set too low produces one large cluster that has swallowed several unrelated intents. Ask for more clusters than feels natural and merge them yourself, since over-merged clusters hide exactly the small patterns worth finding. Too many traces landing in unclustered. Lower the threshold. The unclustered share climbs steeply once the threshold is too high, so move it in small steps. On the repo route, lower min_cluster_size instead. One pattern split across several clusters. Expect some of this and merge by hand. TF-IDF matches shared words rather than shared meaning, so “asking for a refund” and “want my money back” need not meet, and a single intent can end up spread across two or three clusters however you tune it. On the no-repo route, the number of eigenvectors is a secondary lever: more of them tends to fragment, fewer tends to merge. Everything in one cluster. The summaries are the problem rather than the parameters. Incidental detail like order IDs gives TF-IDF spurious signal, and a shared boilerplate phrase in every summary flattens the contrast between them. Tighten the summary instruction.
Do not read a low unclustered count as proof the clustering was good. Reduction pulls outliers toward the mass, so genuinely one-off traces are more likely to be absorbed into a cluster than set aside. The count is useful for spotting a threshold set too high; it is not outlier detection.

Troubleshooting

  • Fewer traces annotated than you expected. The most common cause is the export, not the clustering: --limit defaults to 100, and --all cannot be used in the sandbox. Check the span and trace counts the agent reported, and if the span count sits exactly on the limit it truncated the window. Partial labels look complete and undercount every pattern.
  • The agent tries to install packages and then improvises. PyPI is unreachable without a repo attached, and a blocked install rarely stops a run: the agent invents its own method instead, which no longer matches any guidance here. The no-repo prompt’s opening constraint exists to prevent this, so keep it.
  • The install fails on the repo route. Check that GitHub is authorized and not only that a repo is named, since the repo field is ignored without it. If umap-learn pulls in a numba that will not build, pin umap-learn and numba to recent versions with prebuilt wheels for Python 3.13.
  • ax spans export fails with a proxy or connection error on --all. Bulk export uses Arrow Flight, which the sandbox blocks. Use --days and --limit instead.
  • ax spans annotate rejects the whole batch. Every span ID has to fall inside the lookup window, and the window cannot exceed 31 days, so keep the export window inside that limit rather than widening --days past it. Spans older than 31 days cannot be annotated this way at all. Batches are also capped at 1000 records.
  • Annotations are rejected with label '<x>' is not one of the allowed values. The agent invented a slug that the annotation config does not list. Have it create the config from its own slugs, or paste the allowed values into the prompt.
  • no annotation config with name 'pattern' exists. The config must exist before any span is annotated. Confirm the name in the prompt matches it exactly.
  • Labels cannot exceed 30 characters while creating the config. The agent used a cluster summary as a value. Ask for a separate short slug and keep the summary in the annotation’s text field.
  • Everything lands in one cluster or all in noise. See Tuning the clusters. Check the summaries first: if they all end in the same phrase, or all name the same tool, they will cluster into a single blob no matter what the parameters say.

Beyond patterns

You now have a repeatable pipeline: one prompt that summarizes, clusters, and labels a whole project, and a filter that turns any pattern into a slice you can act on. Clustering is one job you can hand a managed agent, not the limit of what they do. The same agent reads your traces, runs code, and reports back, so the pattern generalizes:

Evaluating agents

Point a run at a slice of traces and have it draft labels and an evaluator prompt from what it finds.

Skills and permissions

With a GitHub skill attached, a session can trace a failure to its source, write a test, and open a PR.

Agent Swarms

Run any of the above on a cron schedule or a metric threshold instead of by hand.

Surface issues with Signal

Signal scans a project continuously and surfaces ranked issues, with no prompt required.
What these share is the shape of the request: a goal, a bound project, and permission to use tools. Anything you could work out by reading traces and running code, you can hand to an agent instead, once as a session or on a schedule.

Next steps

How agents work

Sandboxes, data access, credentials, and the boundaries of a run.

Agent Studio

Start sessions and automations, and bind a project to a run.

Agent Presets

Save the runtime, sandbox, and skills a run should use, instead of configuring each one.

Human review

Annotation configs, labeling traces, and review workflows.