MCPcopy Create free account
hub / github.com/OpenBMB/ChatDev / TokenTracker

Class TokenTracker

utils/token_tracker.py:36–152  ·  view source on GitHub ↗

Singleton class to track token usage across a workflow.

Source from the content-addressed store, hash-verified

34
35
36class TokenTracker:
37 """Singleton class to track token usage across a workflow."""
38
39 def __init__(self, workflow_id: str):
40 self.workflow_id = workflow_id
41 self.total_usage = TokenUsage()
42 self.node_usages = defaultdict(TokenUsage)
43 self.model_usages = defaultdict(TokenUsage)
44 self.call_history = []
45 self.node_call_counts = defaultdict(int) # Track how many times each node is called
46
47 def record_usage(self, node_id: str, model_name: str, usage: TokenUsage, provider: str = None):
48 """Records token usage for a specific call, handling multiple node executions."""
49 # Update the usage with provider if it wasn't set already
50 if provider and not usage.provider:
51 usage.provider = provider
52
53 # Add to total usage
54 self.total_usage.input_tokens += usage.input_tokens
55 self.total_usage.output_tokens += usage.output_tokens
56 self.total_usage.total_tokens += usage.total_tokens
57
58 # Add to node-specific usage
59 node_usage = self.node_usages[node_id]
60 node_usage.input_tokens += usage.input_tokens
61 node_usage.output_tokens += usage.output_tokens
62 node_usage.total_tokens += usage.total_tokens
63 if provider:
64 node_usage.provider = provider # Store provider info
65
66 # Add to model-specific usage
67 model_usage = self.model_usages[model_name]
68 model_usage.input_tokens += usage.input_tokens
69 model_usage.output_tokens += usage.output_tokens
70 model_usage.total_tokens += usage.total_tokens
71 if provider:
72 model_usage.provider = provider # Store provider info
73
74 # Increment call count for this node
75 self.node_call_counts[node_id] += 1
76
77 # Add to call history
78 history_entry = {
79 "node_id": node_id,
80 "model_name": model_name,
81 "input_tokens": usage.input_tokens,
82 "output_tokens": usage.output_tokens,
83 "total_tokens": usage.total_tokens,
84 "metadata": dict(usage.metadata),
85 "timestamp": usage.timestamp.isoformat(),
86 "execution_number": self.node_call_counts[node_id] # Track which execution this is
87 }
88
89 # Add provider to history entry if available
90 if provider:
91 history_entry["provider"] = provider
92
93 self.call_history.append(history_entry)

Callers 1

buildMethod · 0.90

Calls

no outgoing calls

Tested by

no test coverage detected