운영 지표와 지원 요청 저장소 추가
This commit is contained in:
parent
50fa4ad432
commit
e7ebb38177
20 changed files with 3038 additions and 39 deletions
75
apps/api/app/test_usage_report.py
Normal file
75
apps/api/app/test_usage_report.py
Normal file
|
|
@ -0,0 +1,75 @@
|
|||
from __future__ import annotations
|
||||
|
||||
import unittest
|
||||
|
||||
from .services.usage_report import REPORT_SCHEMA, build_model_cost_report
|
||||
|
||||
|
||||
class UsageReportTest(unittest.TestCase):
|
||||
def test_model_cost_report_derives_cost_efficiency_and_warnings(self) -> None:
|
||||
report = build_model_cost_report(
|
||||
{
|
||||
"source": "database",
|
||||
"durable": True,
|
||||
"window_days": 7,
|
||||
"total_turns": 5,
|
||||
"metered_turns": 4,
|
||||
"tokens_in": 300,
|
||||
"tokens_out": 100,
|
||||
"cost_usd": 0.4,
|
||||
"budget": {
|
||||
"status": "warn",
|
||||
"limit_usd": 0.5,
|
||||
"used_ratio": 0.8,
|
||||
"remaining_usd": 0.1,
|
||||
},
|
||||
"evaluator_cache": {
|
||||
"enabled": True,
|
||||
"requests": 10,
|
||||
"hits": 2,
|
||||
"misses": 8,
|
||||
"hit_rate": 0.2,
|
||||
},
|
||||
"by_provider": [
|
||||
{
|
||||
"provider": "cheap",
|
||||
"model": "mini",
|
||||
"turns": 3,
|
||||
"tokens_in": 100,
|
||||
"tokens_out": 50,
|
||||
"cost_usd": 0.04,
|
||||
},
|
||||
{
|
||||
"provider": "claude_cli",
|
||||
"model": "opus",
|
||||
"turns": 1,
|
||||
"tokens_in": 200,
|
||||
"tokens_out": 50,
|
||||
"cost_usd": 0.36,
|
||||
},
|
||||
],
|
||||
}
|
||||
)
|
||||
|
||||
self.assertEqual(report["schema"], REPORT_SCHEMA)
|
||||
self.assertEqual(report["summary"]["metered_coverage"], 0.8)
|
||||
self.assertEqual(report["summary"]["cost_per_1k_tokens_usd"], 1.0)
|
||||
self.assertEqual(report["models"][0]["provider"], "claude_cli")
|
||||
self.assertEqual(report["models"][0]["cost_share"], 0.9)
|
||||
self.assertEqual(report["models"][0]["cost_per_1k_tokens_usd"], 1.44)
|
||||
self.assertEqual(report["models"][1]["cost_per_turn_usd"], 0.013333)
|
||||
self.assertIn("partial_metering", report["warnings"])
|
||||
self.assertIn("budget_warn", report["warnings"])
|
||||
self.assertIn("low_evaluator_cache_hit_rate", report["warnings"])
|
||||
self.assertIn("dominant_model_cost", report["warnings"])
|
||||
|
||||
def test_model_cost_report_handles_empty_usage(self) -> None:
|
||||
report = build_model_cost_report({"budget": {}, "evaluator_cache": {}})
|
||||
|
||||
self.assertEqual(report["models"], [])
|
||||
self.assertIsNone(report["top_cost_model"])
|
||||
self.assertEqual(report["summary"]["metered_coverage"], 0.0)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
Loading…
Add table
Add a link
Reference in a new issue