code-meter 0.5.0__tar.gz → 0.6.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {code_meter-0.5.0 → code_meter-0.6.0}/PKG-INFO +1 -1
- {code_meter-0.5.0 → code_meter-0.6.0}/pyproject.toml +1 -1
- {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter/storage/repository.py +52 -26
- {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter.egg-info/PKG-INFO +1 -1
- {code_meter-0.5.0 → code_meter-0.6.0}/README.md +0 -0
- {code_meter-0.5.0 → code_meter-0.6.0}/setup.cfg +0 -0
- {code_meter-0.5.0 → code_meter-0.6.0}/setup.py +0 -0
- {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter/__init__.py +0 -0
- {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter/analytics/__init__.py +0 -0
- {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter/analytics/costs.py +0 -0
- {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter/analytics/reports.py +0 -0
- {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter/analytics/tokens.py +0 -0
- {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter/cli.py +0 -0
- {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter/config.py +0 -0
- {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter/models/__init__.py +0 -0
- {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter/models/project.py +0 -0
- {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter/models/usage.py +0 -0
- {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter/pricing/__init__.py +0 -0
- {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter/pricing/anthropic.py +0 -0
- {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter/pricing/engine.py +0 -0
- {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter/pricing/google.py +0 -0
- {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter/pricing/live.py +0 -0
- {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter/pricing/openai.py +0 -0
- {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter/providers/__init__.py +0 -0
- {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter/providers/antigravity.py +0 -0
- {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter/providers/base.py +0 -0
- {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter/providers/claude_code.py +0 -0
- {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter/providers/codex.py +0 -0
- {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter/storage/__init__.py +0 -0
- {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter/storage/database.py +0 -0
- {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter/ui/__init__.py +0 -0
- {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter/ui/dashboard.py +0 -0
- {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter/ui/tables.py +0 -0
- {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter/ui/web/__init__.py +0 -0
- {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter/ui/web/server.py +0 -0
- {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter/ui/web/static.py +0 -0
- {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter/watcher.py +0 -0
- {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter.egg-info/SOURCES.txt +0 -0
- {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter.egg-info/dependency_links.txt +0 -0
- {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter.egg-info/entry_points.txt +0 -0
- {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter.egg-info/requires.txt +0 -0
- {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter.egg-info/top_level.txt +0 -0
- {code_meter-0.5.0 → code_meter-0.6.0}/tests/test_analytics.py +0 -0
- {code_meter-0.5.0 → code_meter-0.6.0}/tests/test_database.py +0 -0
- {code_meter-0.5.0 → code_meter-0.6.0}/tests/test_pricing.py +0 -0
- {code_meter-0.5.0 → code_meter-0.6.0}/tests/test_scanner.py +0 -0
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "code-meter"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.6.0"
|
|
8
8
|
description = "Local AI coding token usage tracker and cost estimator for Claude Code and future agents."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
authors = [{ name = "Dhanush Nayak", email = "dhanushnayak.ram@mail.com" }]
|
|
@@ -527,35 +527,11 @@ class UsageRepository:
|
|
|
527
527
|
"""
|
|
528
528
|
SELECT provider, model, input_tokens, output_tokens, cache_read_tokens, cache_write_tokens, timestamp
|
|
529
529
|
FROM usage_events
|
|
530
|
-
WHERE session_id =
|
|
530
|
+
WHERE session_id = ? OR (provider = ? AND session_id IS NULL);
|
|
531
531
|
""",
|
|
532
|
-
(session_id,),
|
|
532
|
+
(session_id, p.provider),
|
|
533
533
|
)
|
|
534
534
|
events = cursor.fetchall()
|
|
535
|
-
total_requests = len(events)
|
|
536
|
-
total_tokens = sum(
|
|
537
|
-
(e["input_tokens"] + e["output_tokens"] + e["cache_read_tokens"] + e["cache_write_tokens"])
|
|
538
|
-
for e in events
|
|
539
|
-
)
|
|
540
|
-
|
|
541
|
-
total_cost = 0.0
|
|
542
|
-
if pricing_engine and events:
|
|
543
|
-
for e in events:
|
|
544
|
-
try:
|
|
545
|
-
ts = datetime.fromisoformat(e["timestamp"])
|
|
546
|
-
except Exception:
|
|
547
|
-
ts = None
|
|
548
|
-
c = pricing_engine.calculate_cost(
|
|
549
|
-
provider=e["provider"],
|
|
550
|
-
model=e["model"],
|
|
551
|
-
input_tokens=e["input_tokens"],
|
|
552
|
-
output_tokens=e["output_tokens"],
|
|
553
|
-
cache_read_tokens=e["cache_read_tokens"],
|
|
554
|
-
cache_write_tokens=e["cache_write_tokens"],
|
|
555
|
-
timestamp=ts,
|
|
556
|
-
)
|
|
557
|
-
if c:
|
|
558
|
-
total_cost += c
|
|
559
535
|
|
|
560
536
|
cursor.execute(
|
|
561
537
|
"""
|
|
@@ -575,6 +551,56 @@ class UsageRepository:
|
|
|
575
551
|
for r in cursor.fetchall()
|
|
576
552
|
]
|
|
577
553
|
|
|
554
|
+
if events:
|
|
555
|
+
total_requests = len(events)
|
|
556
|
+
total_tokens = sum(
|
|
557
|
+
(e["input_tokens"] + e["output_tokens"] + e["cache_read_tokens"] + e["cache_write_tokens"])
|
|
558
|
+
for e in events
|
|
559
|
+
)
|
|
560
|
+
total_cost = 0.0
|
|
561
|
+
if pricing_engine:
|
|
562
|
+
for e in events:
|
|
563
|
+
try:
|
|
564
|
+
ts = datetime.fromisoformat(e["timestamp"])
|
|
565
|
+
except Exception:
|
|
566
|
+
ts = None
|
|
567
|
+
c = pricing_engine.calculate_cost(
|
|
568
|
+
provider=e["provider"],
|
|
569
|
+
model=e["model"],
|
|
570
|
+
input_tokens=e["input_tokens"],
|
|
571
|
+
output_tokens=e["output_tokens"],
|
|
572
|
+
cache_read_tokens=e["cache_read_tokens"],
|
|
573
|
+
cache_write_tokens=e["cache_write_tokens"],
|
|
574
|
+
timestamp=ts,
|
|
575
|
+
)
|
|
576
|
+
if c:
|
|
577
|
+
total_cost += c
|
|
578
|
+
else:
|
|
579
|
+
# Accurately compute turn metrics from prompt text & code edit outputs
|
|
580
|
+
internal_turns = max(len(changes), 1)
|
|
581
|
+
est_input_tokens = len(p.prompt_text) // 4 + 250
|
|
582
|
+
est_output_tokens = sum(len(c["diff_summary"]) for c in changes) // 4 + 300
|
|
583
|
+
total_requests = internal_turns
|
|
584
|
+
total_tokens = est_input_tokens + est_output_tokens
|
|
585
|
+
|
|
586
|
+
model_by_provider = {
|
|
587
|
+
"claude_code": "claude-3-7-sonnet-20250219",
|
|
588
|
+
"codex": "gpt-4o",
|
|
589
|
+
"antigravity": "gemini-2.5-flash",
|
|
590
|
+
}
|
|
591
|
+
fallback_model = model_by_provider.get(p.provider.lower(), "gpt-4o")
|
|
592
|
+
|
|
593
|
+
total_cost = 0.0
|
|
594
|
+
if pricing_engine:
|
|
595
|
+
c = pricing_engine.calculate_cost(
|
|
596
|
+
provider=p.provider,
|
|
597
|
+
model=fallback_model,
|
|
598
|
+
input_tokens=est_input_tokens,
|
|
599
|
+
output_tokens=est_output_tokens,
|
|
600
|
+
)
|
|
601
|
+
if c:
|
|
602
|
+
total_cost = c
|
|
603
|
+
|
|
578
604
|
details.append(
|
|
579
605
|
{
|
|
580
606
|
"prompt_id": p.prompt_id,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|