Distributed Tracing
wshobson/agents
Implement distributed tracing with Jaeger and Tempo to track requests across microservices and identify performance bottlenecks.
Subscribe to cost events (cost:http:request, llm:generation:metering) to forward LLM and API spend to your own observability system.
$ npx skills add growthxai/output --skill output-dev-cost-hooks -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install growthxai/output output-dev-cost-hooks --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/growthxai/output.git skills-src && mkdir -p .claude/skills && cp -r skills-src/coding_assistants/claude/plugins/outputai/skills/output-dev-cost-hooks .claude/skills/output-dev-cost-hooks && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "output-dev-cost-hooks" agent skill from https://github.com/growthxai/output/tree/main/coding_assistants/claude/plugins/outputai/skills/output-dev-cost-hooks into .claude/skills/output-dev-cost-hooks/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "output-dev-cost-hooks", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/growthxai/output/tree/main/coding_assistants/claude/plugins/outputai/skills/output-dev-cost-hooksType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add growthxai/output --skill output-dev-cost-hooks -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install growthxai/output output-dev-cost-hooks --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/growthxai/output.git skills-src && mkdir -p .agents/skills && cp -r skills-src/coding_assistants/claude/plugins/outputai/skills/output-dev-cost-hooks .agents/skills/output-dev-cost-hooks && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "output-dev-cost-hooks" agent skill from https://github.com/growthxai/output/tree/main/coding_assistants/claude/plugins/outputai/skills/output-dev-cost-hooks into .agents/skills/output-dev-cost-hooks/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "output-dev-cost-hooks", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add growthxai/output --skill output-dev-cost-hooks -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install growthxai/output output-dev-cost-hooks --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/growthxai/output.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/coding_assistants/claude/plugins/outputai/skills/output-dev-cost-hooks .cursor/skills/output-dev-cost-hooks && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "output-dev-cost-hooks" agent skill from https://github.com/growthxai/output/tree/main/coding_assistants/claude/plugins/outputai/skills/output-dev-cost-hooks into .cursor/skills/output-dev-cost-hooks/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "output-dev-cost-hooks", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/growthxai/output.git --path coding_assistants/claude/plugins/outputai/skills/output-dev-cost-hooks--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add growthxai/output --skill output-dev-cost-hooks -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install growthxai/output output-dev-cost-hooks --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/growthxai/output.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/coding_assistants/claude/plugins/outputai/skills/output-dev-cost-hooks .gemini/skills/output-dev-cost-hooks && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "output-dev-cost-hooks" agent skill from https://github.com/growthxai/output/tree/main/coding_assistants/claude/plugins/outputai/skills/output-dev-cost-hooks into .gemini/skills/output-dev-cost-hooks/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "output-dev-cost-hooks", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install growthxai/output output-dev-cost-hooksInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add growthxai/output --skill output-dev-cost-hooks -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/growthxai/output.git skills-src && mkdir -p .github/skills && cp -r skills-src/coding_assistants/claude/plugins/outputai/skills/output-dev-cost-hooks .github/skills/output-dev-cost-hooks && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "output-dev-cost-hooks" agent skill from https://github.com/growthxai/output/tree/main/coding_assistants/claude/plugins/outputai/skills/output-dev-cost-hooks into .github/skills/output-dev-cost-hooks/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "output-dev-cost-hooks", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add growthxai/output --skill output-dev-cost-hooks -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install growthxai/output output-dev-cost-hooks --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/growthxai/output.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/coding_assistants/claude/plugins/outputai/skills/output-dev-cost-hooks .opencode/skills/output-dev-cost-hooks && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "output-dev-cost-hooks" agent skill from https://github.com/growthxai/output/tree/main/coding_assistants/claude/plugins/outputai/skills/output-dev-cost-hooks into .opencode/skills/output-dev-cost-hooks/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "output-dev-cost-hooks", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
output-dev-cost-hooksSubscribe to cost events (cost:http:request, llm:generation:metering) to forward LLM and API spend to your own observability system.
Output Dev Cost Hooks is an agent skill from growthxai/output. Subscribe to cost events (cost:http:request, llm:generation:metering) to forward LLM and API spend to your own observability system. Use when adding cost/spend logging, building a cost observability integration, or forwarding per-request cost data to an external system.
Its SKILL.md is about 2.7k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in DevOps & Cloud, covering Observability and Payments and billing. The repository describes itself as: The open-source TypeScript framework for building AI workflows and agents. Designed for Claude Code describe what you want, Claude builds it, with all the best practices already… The licence is Apache-2.0.
2 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 99ee298. It shows what the files ask for, not the result of running them.
Pre-approves these tools, so the agent can use them without asking each time:
ReadWriteEditGlobFrom allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
npmFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
docs.output.aiFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Output Dev Cost Hooks loads about 2.7k tokens when it runs. Until then it costs about 73 tokens; SKILL.md has 748 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from growthxai/output at commit 99ee298, republished under its Apache-2.0 licence (© growthxai). 748 words, ~2,666 tokens.
.claude/skills/output-dev-cost-hooks/SKILL.md (or your agent's skills folder).This skill documents how to subscribe to Output's cost events so every priced LLM call and every HTTP call with attached cost (via addRequestCost, see output-dev-http-client-create) can be forwarded to your own observability system — a webhook, a structured log pipeline, a metrics backend, etc. Handler errors are caught and logged by the framework; they never affect the workflow or the request that triggered them.
This skill is about project-wide hook registration for cost data already emitted by the framework. To make an HTTP client emit cost in the first place, see output-dev-http-client-create.
// src/cost_hooks.ts
import { on } from '@outputai/core/hooks';
import type { HttpRequestCostEvent } from '@outputai/http';
import type { LLMGenerationMeteringEvent } from '@outputai/llm';
on<HttpRequestCostEvent>('cost:http:request', async event => {
// handle HTTP cost
});
on<LLMGenerationMeteringEvent>('llm:generation:metering', async event => {
// handle LLM cost
});Add the file to outputai.hookFiles in package.json, alongside any existing hook files. Paths are relative to the package root and point at the built .js output — npm run output:worker:build compiles src/ to dist/ (per tsconfig.json's rootDir/outDir), so src/cost_hooks.ts is registered as dist/cost_hooks.js, not the .ts source itself. The worker loads these files at startup.
{
"outputai": {
"hookFiles": [
"./dist/cost_hooks.js"
]
}
}If you'd rather skip the build step, a hook file can also be plain, uncompiled JavaScript registered directly at its src/ path ("./src/cost_hooks.js") — see https://docs.output.ai/operations/error-hooks for that variant. The rest of this skill uses TypeScript + the built-output path, since that's what the framework's own examples (and every other file in a scaffolded project) use.
| Event | Type import | When it fires | Prefer for |
|---|---|---|---|
llm:generation:metering | LLMGenerationMeteringEvent from @outputai/llm | After every LLM generation (text, image, Agent, streaming) that reports usage — including failed calls that got at least partial usage | New LLM cost integrations |
cost:llm:request | LLMUsageEvent from @outputai/llm | Legacy/compatible LLM cost event, same completion path | Existing handlers only — do not use for new work |
cost:http:request | HttpRequestCostEvent from @outputai/http | Only when your code (or a client's afterResponse hook) calls addRequestCost(response, total) | Non-LLM paid API calls |
Every event carries the same envelope: eventId (UUID v4, stable idempotency key), eventDate (ms epoch), activityInfo and workflowDetails (present when emitted from within a step/evaluator), outputActivityKind, and payload (the event-specific data described above).
Use this when spend needs to reach an external observability system over HTTP. Forward the raw envelope plus payload; redact anything that might carry secrets (API keys or tokens embedded in query strings) before logging or sending the URL.
// src/cost_hooks.ts
import { on } from '@outputai/core/hooks';
import { credentials } from '@outputai/core/credentials';
import type { HttpRequestCostEvent } from '@outputai/http';
import type { LLMGenerationMeteringEvent } from '@outputai/llm';
// Use plain fetch here, not createKyClient/outputFetch. Handlers run inside
// the emitting step's async context, so a traced client would add its own
// HTTP trace event to that step's trace on every forwarded cost event.
//
// Read the credential lazily with `get`, not `require`, at module scope: a
// hook file is imported at worker startup by an unguarded `await import()`
// (there's no try/catch around it), so a `require()` that throws here takes
// the whole worker down. `get`/`require` also only see workflow-scoped
// credentials from inside an activity — at startup, outside any activity,
// they resolve the global credential set only, so keep this in a global
// (not per-workflow) credential file.
const getWebhookUrl = (): string | undefined => credentials.get('observability.webhook_url') as string | undefined;
const postEvent = async (json: Record<string, unknown>): Promise<void> => {
const webhookUrl = getWebhookUrl();
if (!webhookUrl) {
return;
}
const controller = new AbortController();
const timeout = setTimeout(() => controller.abort(), 5000);
try {
await fetch(`${webhookUrl}/events`, {
method: 'POST',
headers: { 'content-type': 'application/json' },
body: JSON.stringify(json),
signal: controller.signal
});
} finally {
clearTimeout(timeout);
}
};
// Strip query strings — some APIs put API keys or tokens there.
const redactUrl = (url: string): string => {
try {
const parsed = new URL(url);
return `${parsed.origin}${parsed.pathname}`;
} catch {
return '[unparseable-url]';
}
};
on<HttpRequestCostEvent>('cost:http:request', async event => {
if (!event.workflowDetails || !event.payload) {
return;
}
// A caught failure here logs with this handler's own context; an
// uncaught one is still caught and logged by the framework either way.
try {
await postEvent({
eventId: event.eventId,
eventDate: event.eventDate,
workflowId: event.workflowDetails.workflowId,
kind: 'http',
url: redactUrl(event.payload.url),
totalUsd: event.payload.total
});
} catch (error) {
console.warn('cost_hooks: failed to forward HTTP cost event', error);
}
});
on<LLMGenerationMeteringEvent>('llm:generation:metering', async event => {
if (!event.workflowDetails || !event.payload) {
return;
}
try {
await postEvent({
eventId: event.eventId,
eventDate: event.eventDate,
workflowId: event.workflowDetails.workflowId,
kind: 'llm',
providerId: event.payload.usage.providerId,
modelId: event.payload.usage.modelId,
totalUsd: event.payload.cost?.total ?? null
});
} catch (error) {
console.warn('cost_hooks: failed to forward LLM cost event', error);
}
});Use this when spend just needs to land in your log platform as structured facets, without a separate network call. Use the framework Logger so fields are emitted consistently with the rest of the worker's logs.
// src/cost_hooks.ts
import { on } from '@outputai/core/hooks';
import { Logger } from '@outputai/core';
import type { HttpRequestCostEvent } from '@outputai/http';
import type { LLMGenerationMeteringEvent } from '@outputai/llm';
const log = Logger.createLogger('CostObservability');
const redactUrl = (url: string): string => {
try {
const parsed = new URL(url);
return `${parsed.origin}${parsed.pathname}`;
} catch {
return '[unparseable-url]';
}
};
on<HttpRequestCostEvent>('cost:http:request', async event => {
if (!event.workflowDetails || !event.payload) {
return;
}
log.info('http_request_cost', {
eventId: event.eventId,
workflowId: event.workflowDetails.workflowId,
url: redactUrl(event.payload.url),
totalUsd: event.payload.total
});
});
on<LLMGenerationMeteringEvent>('llm:generation:metering', async event => {
if (!event.workflowDetails || !event.payload) {
return;
}
log.info('llm_generation_cost', {
eventId: event.eventId,
workflowId: event.workflowDetails.workflowId,
providerId: event.payload.usage.providerId,
modelId: event.payload.usage.modelId,
totalUsd: event.payload.cost?.total ?? null
});
});<eventName> hook error) and never affects the workflow, the worker, or the request that triggered the event — the same guarantee onError handlers get. Adding your own try/catch is still worthwhile so a forwarding failure logs with context you control, but it's not required for safety.event.workflowDetails and event.payload before using them — they're only populated when the event was emitted from within a step/evaluator context; eventId and eventDate, by contrast, are always present.eventId as an idempotency key when forwarding to a system that might receive the same event more than once (e.g. retried delivery).llm:generation:metering over cost:llm:request for new integrations; the legacy event's shape is frozen and misses newer cost types (e.g. tool/grounding charges).outputai.hookFiles in package.json, pointing at the built .js path (dist/...), not the .ts sourceon from @outputai/core/hooksworkflowDetails / payloadllm:generation:metering used instead of legacy cost:llm:request for new workoutput-dev-http-client-create - Attaching cost to a paid API client with addRequestCostoutput-dev-workflow-cost - Post-hoc cost calculation for a single completed workflow run via the CLIoutput-dev-credentials - Storing the observability endpoint URL/token as a credential© growthxai, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in coding_assistants/claude/plugins/outputai/skills/output-dev-cost-hooks of growthxai/output.
Open the folder on GitHubat commit 99ee298
Output Dev Cost Hooks next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Output Dev Cost Hooks this skillgrowthxai/output | 442 | — | ~2.7k | Automated safety check: Pass | Apache-2.0 | |
| Distributed Tracingwshobson/agents | 40k | 12 repos | ~527 | Automated safety check: Pass | MIT | |
| Workers Best Practiceshodgef/apiker | 127 | 6 repos | ~1.8k | Automated safety check: Pass | MIT | |
| Backend DesignxenitV1/claude-code-maestro | 229 | — | ~2.1k | Automated safety check: Notes | MIT | |
| Add Metricmicrobus-io/fabric | 172 | — | ~1.5k | Automated safety check: Pass | Apache-2.0 | |
| OmniRoute Health Monitoringdiegosouzapw/OmniRoute | 75k | — | ~1.2k | Automated safety check: Pass | MIT |
wshobson/agents
Implement distributed tracing with Jaeger and Tempo to track requests across microservices and identify performance bottlenecks.
hodgef/apiker
Reviews and authors Cloudflare Workers code against production best practices.
xenitV1/claude-code-maestro
Elite Tier Backend standards, including Vertical Slice Architecture, Zero Trust Security, and High-Performance API protocols.
microbus-io/fabric
TRIGGER when user asks to add or modify a metric, counter, gauge, or histogram, or to track/measure an operation.
diegosouzapw/OmniRoute
Checks the health of an OmniRoute gateway: provider circuit breakers, latency percentiles, budget guard alerts, connection cooldowns and model lockouts.
rapidaai/voice-ai
Add or modify telemetry instrumentation across assistant-api and integration-api while preserving metric schema compatibility and audit behavior.
growthxai/output
Implement an Output SDK workflow from a plan document. An agent skill from growthxai/output.
growthxai/output
View, edit, and set encrypted credentials in an Output.ai project.
growthxai/output
Wire encrypted credentials to environment variables using the credential: convention.
growthxai/output
Initialize encrypted credentials for an Output.ai project. An agent skill from growthxai/output.
growthxai/output
Debug Output SDK workflow issues. An agent skill from growthxai/output.
growthxai/output
Use the Agent class for multi-step tool loops, conversation history, streaming progress, and reusable LLM agents.
Categories
Subscribe to cost events (cost:http:request, llm:generation:metering) to forward LLM and API spend to your own observability system. Output Dev Cost Hooks is an agent skill from growthxai/output. Subscribe to cost events (cost:http:request, llm:generation:metering) to forward LLM and API spend to your own observability system.
Output Dev Cost Hooks fits situations like: adding cost/spend logging; building a cost observability integration; forwarding per-request cost data to an external system.
Run `npx skills add growthxai/output --skill output-dev-cost-hooks -a claude-code`. Or copy the skill folder (coding_assistants/claude/plugins/outputai/skills/output-dev-cost-hooks in growthxai/output) into .claude/skills/output-dev-cost-hooks in your project. Claude Code loads it when a task matches its description.
Run `npx skills add growthxai/output --skill output-dev-cost-hooks -a codex`. Or copy the skill folder (coding_assistants/claude/plugins/outputai/skills/output-dev-cost-hooks in growthxai/output) into .agents/skills/output-dev-cost-hooks in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add growthxai/output --skill output-dev-cost-hooks -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/output-dev-cost-hooks, .gemini/skills/output-dev-cost-hooks, .github/skills/output-dev-cost-hooks and .opencode/skills/output-dev-cost-hooks in your project.
Going by SKILL.md and its folder, Output Dev Cost Hooks needs the command-line tools its instructions call (npm). Its frontmatter pre-approves these tools: Read, Write, Edit, Glob.
SKILL.md names 1 domain. In commands or code: docs.output.ai; the agent is likely to contact it when it follows the instructions. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Output Dev Cost Hooks is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.7k tokens (SKILL.md is roughly 11k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Output Dev Cost Hooks: Distributed Tracing (wshobson/agents, 40k stars), Workers Best Practices (hodgef/apiker, 127 stars), Backend Design (xenitV1/claude-code-maestro, 229 stars) and Add Metric (microbus-io/fabric, 172 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
growthxai (a GitHub organization) maintains it in growthxai/output, which has 442 GitHub stars. The repository holds 50 skills in this directory. The repository was last updated on October 9, 2026.
Source: growthxai/output on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.