#!/usr/bin/env bash set -uo pipefail # CASAN H6 — provider usage telemetry API fetch (D2). # Pulls usage records from a provider usage HTTP API (production: the # OpenAI/Anthropic usage endpoints) and imports them into provider-usage.jsonl # through the same schema gate as import-provider-telemetry.sh. # Fail-loud by design: unreachable API or invalid schema => non-zero exit and # NOTHING is imported (all-or-nothing, no partial/dirty telemetry). # # Usage: provider-usage-fetch.sh [out-jsonl] # # Greppable outputs: # PROVIDER_TELEMETRY_FETCHED | PROVIDER_USAGE_INVALID | PROVIDER_API_UNREACHABLE API_URL="${1:-}" if [[ -z "$API_URL" ]]; then echo "Usage: provider-usage-fetch.sh [out-jsonl]" >&2 exit 64 fi SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "$SCRIPT_DIR/../../.." && pwd)" OUT="${2:-$PROJECT_ROOT/.specify/logs/level5/provider-usage.jsonl}" mkdir -p "$(dirname "$OUT")" BODY="$(mktemp)" trap 'rm -f "$BODY"' EXIT if ! curl -sS -m 10 --retry 2 --retry-delay 1 -f "$API_URL" -o "$BODY" 2>/dev/null; then echo "PROVIDER_API_UNREACHABLE url=$API_URL (telemetry NOT imported)" >&2 exit 1 fi python - "$BODY" "$OUT" "$API_URL" <<'PY' import json import sys from datetime import datetime, timezone src, out, url = sys.argv[1], sys.argv[2], sys.argv[3] try: data = json.load(open(src, encoding="utf-8")) except (json.JSONDecodeError, UnicodeDecodeError): raise SystemExit("PROVIDER_USAGE_INVALID response is not JSON") records = data if isinstance(data, list) else [data] required = ["provider", "model", "run_id", "step", "input_tokens", "output_tokens", "total_tokens", "cost_usd", "latency_ms", "status"] for idx, rec in enumerate(records): if not isinstance(rec, dict): raise SystemExit(f"PROVIDER_USAGE_INVALID record[{idx}] is not an object") missing = [key for key in required if key not in rec] if missing: raise SystemExit(f"PROVIDER_USAGE_INVALID record[{idx}] missing={missing}") now = datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ") with open(out, "a", encoding="utf-8") as fh: for rec in records: fh.write(json.dumps({ "timestamp": now, "harness": "L5-provider-telemetry", "telemetry_source": "provider_api", "api_endpoint": url, **rec, }) + "\n") print(f"PROVIDER_TELEMETRY_FETCHED count={len(records)} url={url} output={out}") PY RC=$? if [[ "$RC" -ne 0 ]]; then echo "PROVIDER_USAGE_INVALID import rejected (nothing written)" >&2 exit 1 fi