feat: add issue_usage tracking and metrics for AI ticket enhancement and planning

Add `issue_usage` table with columns for user_uid, tokens, cost, and latency metrics, including a unique index on user_uid. Wire `accumulate_usage` into `enhance_ticket` and `generate_plan` to capture per-request AI usage, persist totals via `add_issue_usage` in both `IssueCreateService` and `PlanningReportService`, and expose aggregated usage as metric cards through `IssueTrackerService.collect_metrics`. Update planning API docs summary to reflect the new phased implementation document format.
This commit is contained in:
2026-06-19 11:59:40 +00:00
parent 7bbaf51450
commit ff3cbbbfe2
16 changed files with 503 additions and 122 deletions
+37
View File
@@ -222,6 +222,43 @@ def test_add_news_usage_ignores_zero_call_batches(local_db):
assert get_news_usage()["calls"] == 0
def test_issue_usage_accumulates_and_computes_averages(local_db):
from devplacepy.database import add_issue_usage, get_issue_usage
get_table("issue_usage").delete()
empty = get_issue_usage()
assert empty["calls"] == 0
assert empty["avg_tokens"] == 0.0
totals = {
"calls": 2,
"prompt_tokens": 2000,
"completion_tokens": 400,
"total_tokens": 2400,
"cost_usd": 0.0005,
"upstream_latency_ms": 1600.0,
"total_latency_ms": 1800.0,
}
add_issue_usage(totals)
add_issue_usage(totals)
usage = get_issue_usage()
assert usage["calls"] == 4
assert usage["total_tokens"] == 4800
assert abs(usage["cost_usd"] - 0.001) < 1e-9
assert usage["avg_tokens"] == 1200.0
assert usage["avg_cost_usd"] == 0.00025
assert usage["avg_tokens_per_second"] == 250.0
def test_add_issue_usage_ignores_zero_call_batches(local_db):
from devplacepy.database import add_issue_usage, get_issue_usage
get_table("issue_usage").delete()
add_issue_usage({"calls": 0, "total_tokens": 999, "cost_usd": 1.0})
assert get_issue_usage()["calls"] == 0
def test_interleave_by_author_spreads_consecutive_runs():
from devplacepy.database import interleave_by_author