agents: report tokens + $ cost on every agent comment
Each run now appends a report to the agent's reply: the tool calls it made plus input/output token totals and the dollar cost. opencode's --format json emits per-step `tokens` and `cost` (USD, priced from the model) on step_finish events; build-activity-log.sh sums them across the run. - build-activity-log.sh: compute for EVERY agent (not just devs — @pm/@qa also call tools and cost money); output a collapsed <details> report (summary line shows "N tool calls · in X · out Y · $Z"; body lists the tools + a token/cost breakdown). Zero-tool runs get a one-line "$Z · in X · out Y" footer. - publish.sh: build $activity once (near the top) and append it to every agent's reply — @pm plan/finalize, @qa verdict/recommendations, and dev PR comments. - agent.yml: rename the step accordingly. Models without pricing (self-hosted ollama) report cost $0.0000. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
af38a44d86
commit
6334ebe8c6
@@ -91,6 +91,9 @@ reply=$(printf '%s' "$reply" | awk -v me="@$NAME" '
|
||||
# Prefer the agent's clean delimited PR description; fall back to the whole reply.
|
||||
prdesc=$(awk '/BEGIN_PR_DESCRIPTION/{f=1;next} /END_PR_DESCRIPTION/{f=0} f' /tmp/agent_out.md)
|
||||
[ -z "$prdesc" ] && prdesc="$reply"
|
||||
# Run report (tool calls + input/output tokens + $ cost) built by build-activity-log.sh. Appended to
|
||||
# every agent's reply comment so each run reports what it did and what it cost.
|
||||
activity="$(cat /tmp/activity_log.md 2>/dev/null || true)"
|
||||
|
||||
# comment-only roles (pm/qa): never change files
|
||||
if [ "$MODE" != "pr" ]; then
|
||||
@@ -103,13 +106,13 @@ if [ "$MODE" != "pr" ]; then
|
||||
if [ "$NAME" = "qa" ]; then
|
||||
PRN=$(resolve_pr)
|
||||
if grep -qiE '^[[:space:]]*APPROVE[[:space:]]*$' /tmp/agent_out.md; then
|
||||
post_to "$ISSN" "$(printf '✅ Reviewed PR #%s — looks good.\n\n%s' "${PRN:-?}" "$reply")"
|
||||
post_to "$ISSN" "$(printf '✅ Reviewed PR #%s — looks good.\n\n%s%s' "${PRN:-?}" "$reply" "$activity")"
|
||||
trig "$ISSN" "@pm — @qa approved PR #${PRN:-?} (issue #$ISSN). Over to you."
|
||||
elif grep -qiE '^[[:space:]]*BOUNCE:[[:space:]]*@(junior|senior|lead)' /tmp/agent_out.md; then
|
||||
dev=$(grep -oiE 'BOUNCE:[[:space:]]*@(junior|senior|lead)' /tmp/agent_out.md | head -1 | grep -oiE '(junior|senior|lead)' | tr '[:upper:]' '[:lower:]')
|
||||
[ -z "$dev" ] && [ -n "$PRN" ] && dev=$(curl -sS "${hdr[@]}" "$API/pulls/$PRN" | jq -r '.user.login // "junior"')
|
||||
dest="${PRN:-$NUM}"
|
||||
post_to "$dest" "$reply" # recommendations, on the PR
|
||||
post_to "$dest" "$reply$activity" # recommendations, on the PR
|
||||
# Bounce budget: count prior "fix attempt" markers on the PR thread; stop after 3.
|
||||
prior=$(curl -sS "${hdr[@]}" "$API/issues/$dest/comments?limit=100" | jq -r 'if type=="array" then [.[]|select(.body|test("fix attempt"))]|length else 0 end' 2>/dev/null); prior=${prior:-0}
|
||||
if [ "$prior" -ge 3 ]; then
|
||||
@@ -121,9 +124,9 @@ if [ "$MODE" != "pr" ]; then
|
||||
fi
|
||||
elif grep -qiE '^[[:space:]]*HALT([_ ]AUTOPILOT)?[[:space:]]*$' /tmp/agent_out.md; then
|
||||
[ "$AUTOPILOT" = "true" ] && del_autopilot_label "$ISSN"
|
||||
post_to "$ISSN" "$(printf '🛑 This needs a human decision (not a dev fix) — @ffaerber please take a look.\n\n%s' "$reply")"
|
||||
post_to "$ISSN" "$(printf '🛑 This needs a human decision (not a dev fix) — @ffaerber please take a look.\n\n%s%s' "$reply" "$activity")"
|
||||
else
|
||||
post_to "${PRN:-$NUM}" "$reply" # no verdict yet (a question) — post where qa works
|
||||
post_to "${PRN:-$NUM}" "$reply$activity" # no verdict yet (a question) — post where qa works
|
||||
fi
|
||||
exit 0
|
||||
fi
|
||||
@@ -173,7 +176,7 @@ if [ "$MODE" != "pr" ]; then
|
||||
done < /tmp/subtasks.txt
|
||||
subtext=$(printf '\n\n---\nCreated sub-issues%s (mention an agent on each when ready):%b' "${ms:+ under milestone **$ms**}" "$links")
|
||||
fi
|
||||
post "$(printf '%s%s' "$msg" "$subtext")"
|
||||
post "$(printf '%s%s%s' "$msg" "$subtext" "$activity")"
|
||||
|
||||
# --- @pm autopilot merge: @pm is the ONLY agent that merges, and ONLY under the autopilot label ---
|
||||
# (@qa never merges — it approves and hands back here.) Merge with the PAT (TTOK), not the built-in
|
||||
@@ -246,16 +249,8 @@ git fetch -q origin 2>/dev/null || true
|
||||
prbody=$(printf '%s\n\n---\nResolves #%s' "$prdesc" "$NUM")
|
||||
owner=${GITHUB_REPOSITORY%%/*}
|
||||
|
||||
# Post the agent's activity trail (tool calls + reasoning) inline in the same comment so
|
||||
# each run produces exactly ONE comment (issue #38). Computed once here so every dev-agent
|
||||
# exit path (no-changes, PR-open-failed, normal) appends it to the single reply comment.
|
||||
activity=""
|
||||
if [ -s /tmp/activity_log.md ]; then
|
||||
entries=$(wc -l < /tmp/activity_log.md 2>/dev/null || echo 0)
|
||||
log=$(cat /tmp/activity_log.md)
|
||||
activity=$(printf '\n\n<details>\n<summary>🔧 activity — %s tool calls</summary>\n\n%s\n\n</details>' "$entries" "$log")
|
||||
fi
|
||||
|
||||
# $activity (the run report: tool calls + tokens + $ cost) was built once near the top, so every
|
||||
# dev-agent exit path (no-changes, PR-open-failed, normal) appends it to the single reply comment.
|
||||
# One PR per run: publish ONLY this run's own branch ($BRANCH), never sibling
|
||||
# ai/issue-N-* branches. This removes the multi-PR ambiguity that left the
|
||||
# activity log stranded on the triggering issue instead of the PR thread.
|
||||
|
||||
Reference in New Issue
Block a user