ZENLLC commited on
Commit
b4b8242
·
verified ·
1 Parent(s): 803da64

Create ledger.py

Browse files
Files changed (1) hide show
  1. core/ledger.py +51 -0
core/ledger.py ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from dataclasses import dataclass, field
2
+ from typing import Dict, Any, Optional, List
3
+
4
+ @dataclass
5
+ class Ledger:
6
+ spend_usd: float = 0.0
7
+ tokens_prompt: int = 0
8
+ tokens_completion: int = 0
9
+ tokens_cached_prompt: int = 0
10
+ tokens_reasoning: int = 0
11
+
12
+ latency_ms_total: int = 0
13
+ llm_calls: int = 0
14
+ tool_calls: int = 0
15
+
16
+ spend_by_agent: Dict[str, float] = field(default_factory=dict)
17
+ spend_by_model: Dict[str, float] = field(default_factory=dict)
18
+
19
+ alerts: List[str] = field(default_factory=list)
20
+
21
+ def add_cost(self, usd: float, agent_id: Optional[str], model_key: Optional[str]):
22
+ self.spend_usd += float(usd)
23
+ if agent_id:
24
+ self.spend_by_agent[agent_id] = self.spend_by_agent.get(agent_id, 0.0) + float(usd)
25
+ if model_key:
26
+ self.spend_by_model[model_key] = self.spend_by_model.get(model_key, 0.0) + float(usd)
27
+
28
+ def add_tokens(self, tokens: Dict[str, Any]):
29
+ self.tokens_prompt += int(tokens.get("prompt_tokens", 0))
30
+ self.tokens_completion += int(tokens.get("completion_tokens", 0))
31
+ self.tokens_cached_prompt += int(tokens.get("cached_prompt_tokens", 0))
32
+ self.tokens_reasoning += int(tokens.get("reasoning_tokens", 0))
33
+
34
+ def add_latency(self, latency_ms: int):
35
+ self.latency_ms_total += int(latency_ms)
36
+
37
+ def mark_llm_call(self):
38
+ self.llm_calls += 1
39
+
40
+ def mark_tool_call(self):
41
+ self.tool_calls += 1
42
+
43
+ def check_budget(self, soft: float, hard: float):
44
+ if self.spend_usd >= hard:
45
+ msg = f"BUDGET_HARD_EXCEEDED: spend=${self.spend_usd:.4f} >= ${hard:.2f}"
46
+ if not self.alerts or self.alerts[-1] != msg:
47
+ self.alerts.append(msg)
48
+ elif self.spend_usd >= soft:
49
+ msg = f"BUDGET_SOFT_EXCEEDED: spend=${self.spend_usd:.4f} >= ${soft:.2f}"
50
+ if not self.alerts or self.alerts[-1] != msg:
51
+ self.alerts.append(msg)