Import Buzz agent team sessions into Agent Analytics
このページはまだあなたの言語に翻訳されていません。 現在取り組んでいますので、後でもう一度確認してください。
The Buzz integration sends each agent team thread to Agent Analytics as one session: the person's requests, the coordinator's delegations, each worker's replies, and the model, tokens, and cost of every agent turn. Worker agents nest under the coordinator, so you can see who delegated, which agent did what, and what each one cost. When workers commit code, the commits join the team session.
A forwarder runs on the Buzz owner's machine and reads the Buzz desktop app's local archive, read-only. The desktop app already stores turn metrics as plaintext, so the forwarder never holds a private key. It posts events to the Amplitude HTTP API. The forwarder requires @amplitude/ai 0.28.0 or later.
Set up with your AI coding agent (recommended)
Paste this prompt into your AI coding agent, such as Cursor, Claude Code, Windsurf, GitHub Copilot, or Codex. The agent fetches the guide, builds the forwarder, and starts with a dry run.
Forward our Buzz agent team threads to Amplitude Agent Analytics.
Fetch https://raw.githubusercontent.com/amplitude/Amplitude-AI-Node/main/docs/integrations/buzz.md
If @amplitude/ai is installed, the same file is under node_modules/@amplitude/ai/docs/integrations/.
Also follow https://raw.githubusercontent.com/amplitude/Amplitude-AI-Node/main/docs/integrations/privacy.md
Follow links in the guide. If your source isn't listed, start at https://raw.githubusercontent.com/amplitude/Amplitude-AI-Node/main/docs/integrations/README.md
Follow "Part 2: Coding agent procedure". Start with a dry run.
The agent stops and asks for values it can't infer, such as the mapping from Buzz members to your user IDs. Review its changes, then verify with the steps in Get started.
What this means for you
- You run: The forwarder on a schedule, for example every 15 minutes, on the machine where the Buzz owner's desktop app runs. Insert IDs come from Buzz event IDs and goose tool call IDs, so a run that re-reads a thread doesn't count anything twice.
- You turn on: Local save for each team channel in the Buzz desktop app. The desktop app archives only saved channels.
- You need: Your Amplitude project API key, egress to
api2.amplitude.com(orapi.eu.amplitude.comfor EU data residency), and a mapping file from Buzz member public keys to your user IDs. - You don't need: A Buzz member key or the Amplitude AI SDK in your agents.
For workers that commit code, also run npx -y -p @amplitude/ai amplitude-ai coding-agents init --harness goose in the repository they work in. It writes the outcomes workflow. The workflow scores only commits with an Agent-Session-Id trailer, and workers that commit through the GitHub API or MCP tools carry none, so Buzz team sessions get no outcome scores. Refer to Connect to outcomes.
What carries over
| Buzz data | Amplitude event |
|---|---|
A person's message, or an @agent mention | [Agent] User Message from that person |
| A coordinator message that mentions a worker | [Agent] User Message to the worker, with [Agent] Parent Agent ID set to the coordinator |
| An agent's reply | [Agent] AI Response |
| Turn metrics | Model and finish reason on that agent's last reply in the turn. Input and output tokens and cost only when Buzz marks the turn's usage as reliable. |
| goose worker tool calls | [Agent] Tool Call under the worker's turn, with arguments and result. A git commit call adds commit_sha when it can be read. |
| Delegation | [Agent] Root Agent Name and [Agent] Agent Chain Depth on every event. The agent the thread starts with is depth 1, and each delegation adds 1. |
| How the run started | [Agent] Session Trigger on every event, when your mapping file sets trigger to interactive, headless, ci, scheduled, or event, for example scheduled for a run on a schedule. The forwarder ignores other values and doesn't read environment variables for it. |
Tool calls for goose workers, Buzz's default harness, come from goose's local session store on the same machine, read-only. A worker on another harness, such as Claude Code, sends its tool calls through that harness's own integration on these pages, and its session links to the team through [Agent] Parent Agent ID.
| Value | Where it comes from |
|---|---|
| Session | The thread's root message, else the channel and an idle window you choose |
| User | The root person's public key, translated through your mapping file |
| Agent or person | A profile with an owner attestation is an agent, and its profile name is the Agent ID unless your mapping file names one. An agent without an attestation needs a mapping entry. |
Freshness and limits
- Latency: Each run reads archive events from a start time you set, and sends what it finds. Built-in signals run once, after the session has been idle for 30 minutes.
- User ID: There is no default. The forwarder skips and counts people who aren't in your mapping file, rather than storing them as
unknown. It never sends a public key as a user ID. - Archive mode: The forwarder reads only channels the desktop app archives locally. Without the owner's archive, a dedicated member account invited to channels can forward messages only, with no turn metrics or tool calls.
- Resends: Insert IDs are stable. Amplitude deduplicates resent events within 7 days.
Privacy gates
Message text and tool arguments are sent unless you choose metadata only. In metadata-only mode, sessions, users, delegation, models, tokens, cost, tool names, tool success, and commit_sha still arrive. The forwarder can also scrub content before the post. Amplitude doesn't scrub content after receipt. Refer to Agent Analytics privacy modes.
Connect to outcomes
The outcome of a team thread is the delegated task. Signals to chart:
- The person's follow-up after the coordinator reports done.
- An explicit thumbs up or down, sent as an
[Agent] Score. Refer to Collect user feedback. - What happened to the code, when workers commit. A worker's commit tool call carries
commit_sha. The outcomes workflow doesn't score Buzz team sessions: a Buzz session's[Agent] Session IDis the thread, not goose'sAGENT_SESSION_ID, and commits made through the GitHub API carry no trailer. Don't turn on the commit hook in a worker's checkout, because its trailer would name a goose session that isn't in Amplitude.
In-session outcomes come from your [Agent] Tool Call events, with no extra setup. Binary evaluators can label sessions that made a commit, opened a pull request, or ended with passing tests. A code evaluator with a regex over tool turns, such as \bgit\s+commit\b, finds commits and pull requests. An LLM evaluator judges whether the last test command succeeded. Refer to Create and calibrate evaluators.
Code evaluators read the tool input of every turn, so a commit at the end of a long session still counts. Each evaluator writes an [Agent] Evaluator Result, so you can compare it with built-in signals: do Task Completed sessions actually produce commits? A tool call that creates a commit can also carry a commit_sha event property. It's read from the [branch sha] line that git commit prints, or from the sha in a JSON result when the tool name or input names a commit, pull request, or file push as a whole word, such as create_pull_request or push_files. Output from git log, git show, and other hex strings is never read as a commit.
Downstream outcomes, such as merged, reverted, and deployed, need two pieces that coding-agents init writes into the repository:
- A
prepare-commit-msghook in.githooks/that stampsAgent-Session-IdandAgent-Nametrailers on every commit the agent makes. Human commits stay unchanged, and--no-verifydoesn't skip this hook. It also adds anAgent-Triggertrailer when it knows how the session started, as described after the score tables. - A GitHub Actions workflow,
.github/workflows/agent-outcomes.yml, that reads those trailers and sends each outcome to the Amplitude HTTP API as an[Agent] Scoreon the session that wrote the commit. The outcome appears next to the session's own events and evaluator results, with no new event type. Store the project API key in theAMPLITUDE_API_KEYrepository secret. These repository variables are optional:
| Variable | Effect |
|---|---|
AMPLITUDE_REGION | eu sends to the EU data center. The default is US. |
AMPLITUDE_OUTCOMES_DRY_RUN | true prints the scores instead of sending them. |
AMPLITUDE_USER_ID_SOURCE | email (default) uses the commit author email as the user ID. login uses the GitHub login. Use the value your agent sessions use as the user ID. |
AMPLITUDE_AGENT_SETUP_PATHS | Comma-separated root-level files or folders that make up your agent setup, for agent_setup_version. The default is AGENTS.md,CLAUDE.md,GEMINI.md,.claude,.codex,.cursor,.cursorrules,.gemini,.goosehints,.mcp.json. The workflow ignores names that contain / and uses the first 20 names. Changing it changes every later agent_setup_version. |
The workflow asks for read access to contents, pull-requests, deployments, actions, checks, and statuses. It reads workflow runs, check runs, and commit statuses for ci_passed_first_run. For a pull request from a fork, meaning one whose head branch is in another repository, GitHub doesn't pass repository secrets to the run, so the workflow logs a notice and sends nothing instead of failing.
Each score sets these properties:
| Property | Value |
|---|---|
[Agent] Session ID and [Agent] Target ID | The commit's Agent-Session-Id trailer. |
[Agent] Target Type | session. |
[Agent] Agent ID | The commit's Agent-Name trailer, such as claude-code, codex, cursor, or goose. Otherwise the agent that signed the commit, as its author or in a Co-authored-by line. |
[Agent] Evaluation Source | outcome. |
[Agent] Score Name and [Agent] Score Value | One of the scores in the next table. |
The event time is the commit's author date, so the score falls inside the session that wrote the commit. outcome_time holds when the outcome happened: the merge, the revert's merge, or the deployment.
| Score Name | Value | Sent when | Also carries |
|---|---|---|---|
commit_merged | 1 | A pull request merges. One score for each agent commit in the pull request. | pr_number, merge_commit_sha, and base_branch. |
commit_reverted | 1 | A merged pull request's description or commits contain This reverts commit <sha>. One score on the session that wrote the reverted commit. | revert_pr_number and revert_merge_commit_sha. |
deploy_succeeded | 1 | A GitHub deployment succeeds. One score for each agent commit from the previous successful deployment to the same environment up to the deployed commit. When there's no earlier successful deployment, the deployed commit only. | deployment_sha and environment. |
deploy_failed | 1 | A GitHub deployment status is failure or error. One score for each agent commit in the same range as deploy_succeeded. | deployment_sha, environment, and deployment_state, which is failure or error. |
ci_passed_first_run, review_rounds, review_count, changes_requested_count, hours_open, and hours_to_first_review | The measure. ci_passed_first_run is 1 or 0. | A pull request merges. One of each for every agent session in the pull request, on that session's first commit in it. | pr_number, merge_commit_sha, base_branch, commit_count, agent_commit_count, session_commit_count, and pr_session_count. |
Every score also carries commit_sha, agent_session_id, agent_name, agent_trigger, agent_setup_version, repo, outcome_time, and outcomes_workflow_version, set to 3.
- Only agent sessions get scores. A commit without an
Agent-Session-Idtrailer sends nothing. That covers human commits, Gemini CLI commits, commits made through the GitHub API or MCP tools, and cloud-agent commits known only by their author orCo-authored-byline. For a pull request with no such commit, the workflow also skips the reviews and CI lookups. - A pull request counts once for each session. When several sessions wrote one pull request, each gets the pull request scores, and
pr_session_countsays how many sessions there were. To count pull requests, count distinctpr_numbervalues. - The user ID is the commit author email, or the GitHub login with
AMPLITUDE_USER_ID_SOURCE=login. It must match the user ID your agent sessions use.coding-agents initsets the session user ID to the git email. Withlogin, the pull request scores fall back to the pull request author when the session's first commit has no GitHub account. A commit with no user ID gets no scores. - A score with no value isn't sent, such as
hours_to_first_reviewfor a pull request with no human review. - Insert IDs are the score name, the repository, and the commit SHA, plus the deployment ID for deploy scores, the revert's pull request number for
commit_reverted, and the pull request number and session instead of the SHA for the pull request scores. A rerun within Amplitude's 7-day deduplication window doesn't count twice. - Outcome scores aren't user feedback. Agent Analytics reads only scores with the
usersource as user feedback, so an outcome never counts as a thumbs up or down.
agent_trigger says how the session that wrote the commit started, with the same values as [Agent] Session Trigger on the session's events: interactive, headless, ci, scheduled, or event. It comes from the Agent-Trigger trailer. The hook adds that trailer only to commits it stamps with an agent session or name, and only when it knows the value. It resolves the value the way the Codex and Cursor hooks resolve [Agent] Session Trigger, so a commit and its session get the same value:
AMPLITUDE_SESSION_TRIGGERin the environment, when it's one of the five values. Set it where the agent runs, for exampleAMPLITUDE_SESSION_TRIGGER=headlessfor a script that runs the agent without a person, orscheduledfor a scheduled job. When the variable is set, the hook doesn't read.amplitude-ai/local.envfor it.- Otherwise
AMPLITUDE_SESSION_TRIGGERin.amplitude-ai/local.envat the repository root. The hook reads the file asKEY=valuelines and never runs it. - Otherwise
ci, whenGITHUB_ACTIONSistrue, orCIis set to anything other than an empty value,false, or0. - Otherwise, for Codex, how the session started, from
sourcein the first line of the session transcript under$CODEX_HOME/sessions(by default~/.codex/sessions):codex execor the MCP server givesheadless, and the CLI or VS Code givesinteractive. - Otherwise no trailer.
Without a valid trailer, agent_trigger is event when a coding agent is the commit author, as when a cloud agent works from an issue or an assignment, and null otherwise.
The pull request scores use these definitions:
| Score Name | Description |
|---|---|
hours_open | Hours from opening the pull request to merging it, rounded to 2 decimals. Time as a draft counts. |
review_count | Human reviews submitted as approved, changes requested, or commented with a comment. A reply in a review thread doesn't count, and neither do reviews from bots or the pull request author. A review with only inline comments and no summary doesn't count either. |
changes_requested_count | The reviews in review_count that requested changes. |
hours_to_first_review | Hours from opening the pull request to the first review in review_count, rounded to 2 decimals. Not sent when there's no such review. |
review_rounds | The reviews in changes_requested_count that at least one later commit followed, meaning a commit in the pull request whose committer date is after the review. A rebase gives commits a new committer date, so a rebase after a review counts as a commit that followed it. |
ci_passed_first_run | 1 when CI passed on its first attempt, 0 when it didn't. The workflow finds the first push that CI ran on, which is the head commit of the pull request's earliest GitHub Actions workflow run between opening and merging, other than the outcomes workflow itself, and reads the earliest run of each check and commit status on it. A push of several commits runs CI on the last one only, so this works however many commits the pull request opened with. Runs are matched by the pull request's commits, so after a force-push the earliest push that survived counts. Without GitHub Actions runs, the workflow takes the first commit with finished CI results among the pull request's first 20 commits. success, neutral, and skipped count as passing. Cancelled and unfinished runs don't count. A later rerun that passes doesn't change the value. Not sent when the pull request has no CI. |
commit_count is the pull request's commit count. GitHub lists at most 250 commits, so commit_merged, agent_commit_count, and session_commit_count cover the first 250.
agent_setup_version identifies the agent setup a commit was written with. It's the first 12 hex characters of a SHA-256 over the root-level entries named in AMPLITUDE_AGENT_SETUP_PATHS, read from the commit's parent. Any change to one of those files, or to a file inside one of those folders, produces a new value. It's null when none of the entries exist. A commit that edits AGENTS.md carries the version from before the edit, and the next commit carries the new one. On the pull request scores, it's the value for the session's first commit in the pull request.
agent_setup_version and the review and CI scores are best effort. Together they make at most 300 GitHub API requests in a run, counting each page of results. When one fails or the budget runs out, the workflow leaves out that property or score, logs a warning, and still sends the rest. The run log includes an enrichments: line that shows which ones succeeded and how many API calls the run made. Treat a missing value as unknown, not as 0.
Because each outcome is a score on its session, you can chart it next to the session's own events with no join. Every chart below starts from [Agent] Score filtered on [Agent] Score Name. Charts by event time bucket outcomes by when the work was written. The step-by-step recipe is the code outcomes recipe.
- How much agent work holds? Chart the count of
commit_mergedminus the count ofcommit_reverted, grouped by[Agent] Agent ID. Both are timed at the commit's author date, so a date range that ends 30 days ago counts the changes written at least 30 days ago that are still unreverted. The revert rate iscommit_reverteddivided bycommit_merged. - Did a change to the agent setup help? Divide
commit_revertedbycommit_merged, anddeploy_failedby both deploy scores, grouped byagent_setup_version. A deploy score counts one commit in one deployment attempt, so a commit in a failed deployment that later succeeds counts once in each. - Do agent pull requests pass CI the first time, and how much review do they need? Chart the average
[Agent] Score Valueofci_passed_first_run, which is the pass rate, and ofreview_roundsandchanges_requested_count, grouped by[Agent] Agent IDoragent_setup_version. Every session in a pull request carries these scores, so for rates by pull request, count distinctpr_numbervalues. - Which sessions reach production? Build a funnel from an
[Agent] Tool Callwherecommit_shais set, tocommit_merged, todeploy_succeeded, held on[Agent] Session ID. - Which session patterns get reverted? Group
commit_revertedby an evaluator's result, such as the Session Shape evaluator.
These charts compare work across stages: a person at the keyboard, a headless run, CI, a schedule, or an event.
- Sessions by stage: Count distinct
[Agent] Session IDvalues on[Agent] User Message, grouped by[Agent] Session Trigger. Add a filter on[Agent] Agent Chain Depthgreater than 1 to see delegated work. Sessions whose harness can't tell how they started have no trigger. - Grind rate by intent and model: Chart
[Agent] Evaluator Resultwhere[Agent] Evaluator Nameis the Session Shape evaluator, grouped by[Agent] Primary Labeland[Agent] Models Used. The Grind share is the grind rate. Chart the Coding Intent evaluator's results the same way, as the second breakdown next to it. Each Evaluator Result carries one evaluator's label, so the two results don't combine on one event. Refer to Coding agent templates. - Claimed done without verification, by stage: Chart
[Agent] Evaluator Resultwhere[Agent] Evaluator Nameis the Claimed Done Without Verification evaluator, grouped by[Agent] Session Trigger, with the average of[Agent] Binary Valueas the metric. That average is the rate for each stage. Evaluator Results carry the session's trigger, so this is one event and no join. - Review effort by stage: Chart the average
[Agent] Score Valueofreview_roundsandhours_to_first_review, grouped byagent_trigger. - Cost per merged change, by stage or by agent tree: A formula that divides the sum of
[Agent] Cost USDon[Agent] AI Responseby the count of[Agent] Scorewhere[Agent] Score Nameiscommit_merged. Group the two sides on the matching value:[Agent] Session Triggeragainstagent_trigger, or[Agent] Root Agent Nameagainstagent_name. It's an aggregate ratio, not a join for each change, and it counts cost only from harnesses that report one.
Measure a prompt that went viral. A prompt or skill can spread to many teams before anyone checks whether it works on their code. To find out across every session, by outcome:
- A pasted prompt: Create an evaluator from the Prompt or Skill Used template, a Regex evaluator that scans user messages, and replace its placeholder pattern with the prompt's text. It reads user message text, so it matches only sessions that send prompts, as in the
fullcontent mode or withOTEL_LOG_USER_PROMPTS=1for Claude Code. Then compare Session Shape and Claimed Done Without Verification on the matching sessions against the rest: filter the Sessions tab by the Prompt or Skill Used result, onceTrueand onceFalse, and read the other two evaluators' results. - A prompt saved as a command or skill: Saving it under a path in
AMPLITUDE_AGENT_SETUP_PATHS, such as the default.claude,.codex, or.cursor, changesagent_setup_version. Compare thereview_roundsandci_passed_first_runscores, the revert rate (commit_reverteddivided bycommit_merged), and the deploy failure rate (deploy_faileddivided by both deploy scores) byagent_setup_version, before and after the version that added it. - Across harnesses: Group the session charts by
[Agent] Agent ID, for exampleclaude-codeagainstcodex, to see whether the prompt works as well in each one.
Upgrade from an earlier version: Run init again, with npx -y -p @amplitude/ai amplitude-ai coding-agents init, or amplitude-ai coding-agents init in a Python project. It replaces an unchanged copy of an earlier workflow. init reports a workflow you edited as customized and leaves it alone. --force replaces it, or you can move your edits to the new workflow by hand. coding-agents doctor reports the workflow as current, outdated, or customized. Version 3 sends [Agent] Score events in place of the Commit Merged, Commit Reverted, Pull Request Merged, Deploy Succeeded, and Deploy Failed events that earlier versions sent, so rebuild charts that use those events on [Agent] Score Name.
Get started
Follow the Buzz integration guide. Start with a dry run, which prints the events without sending them. Then forward one thread where a person asks the coordinator for a task and a goose worker makes a commit, and confirm in Live Events:
- Session ID is the thread, and User ID is the person from your mapping file.
- The worker's events carry
[Agent] Parent Agent IDset to the coordinator. - Each agent reply shows the model, and both token counts when Buzz marked the turn's usage as reliable.
- The worker's tool calls appear under its turn, and the
git commitcarriescommit_sha. - A second run over the same window adds no duplicates.
これは役に立ちましたか?
For AI agents: a documentation index is available at /docs/llms.txt. Append .md to any page URL for markdown, or send Accept: text/markdown.