|
1 | 1 | """Get symbol source code.""" |
2 | 2 |
|
3 | 3 | import hashlib |
| 4 | +import os |
4 | 5 | import time |
5 | 6 | from typing import Optional |
6 | 7 |
|
7 | | -from ..storage import IndexStore |
| 8 | +from ..storage import IndexStore, record_savings, estimate_savings |
8 | 9 |
|
9 | 10 |
|
10 | 11 | def _make_meta(timing_ms: float, **kwargs) -> dict: |
@@ -93,6 +94,18 @@ def get_symbol( |
93 | 94 | stored_hash = symbol.get("content_hash", "") |
94 | 95 | meta["content_verified"] = actual_hash == stored_hash if stored_hash else None |
95 | 96 |
|
| 97 | + # Token savings: raw file size vs symbol byte length |
| 98 | + raw_bytes = 0 |
| 99 | + try: |
| 100 | + raw_file = store._content_dir(owner, name) / symbol["file"] |
| 101 | + raw_bytes = os.path.getsize(raw_file) |
| 102 | + except OSError: |
| 103 | + pass |
| 104 | + tokens_saved = estimate_savings(raw_bytes, symbol.get("byte_length", 0)) |
| 105 | + total_saved = record_savings(tokens_saved) |
| 106 | + meta["tokens_saved"] = tokens_saved |
| 107 | + meta["total_tokens_saved"] = total_saved |
| 108 | + |
96 | 109 | elapsed = (time.perf_counter() - start) * 1000 |
97 | 110 |
|
98 | 111 | result = { |
@@ -172,10 +185,30 @@ def get_symbols( |
172 | 185 | "source": source or "" |
173 | 186 | }) |
174 | 187 |
|
| 188 | + # Token savings: unique file sizes vs sum of symbol byte_lengths |
| 189 | + raw_bytes = 0 |
| 190 | + seen_files: set = set() |
| 191 | + response_bytes = 0 |
| 192 | + for symbol_id in symbol_ids: |
| 193 | + symbol = index.get_symbol(symbol_id) |
| 194 | + if not symbol: |
| 195 | + continue |
| 196 | + f = symbol["file"] |
| 197 | + if f not in seen_files: |
| 198 | + seen_files.add(f) |
| 199 | + try: |
| 200 | + raw_bytes += os.path.getsize(store._content_dir(owner, name) / f) |
| 201 | + except OSError: |
| 202 | + pass |
| 203 | + response_bytes += symbol.get("byte_length", 0) |
| 204 | + tokens_saved = estimate_savings(raw_bytes, response_bytes) |
| 205 | + total_saved = record_savings(tokens_saved) |
| 206 | + |
175 | 207 | elapsed = (time.perf_counter() - start) * 1000 |
176 | 208 |
|
177 | 209 | return { |
178 | 210 | "symbols": symbols, |
179 | 211 | "errors": errors, |
180 | | - "_meta": _make_meta(elapsed, symbol_count=len(symbols)), |
| 212 | + "_meta": _make_meta(elapsed, symbol_count=len(symbols), |
| 213 | + tokens_saved=tokens_saved, total_tokens_saved=total_saved), |
181 | 214 | } |
0 commit comments