Commit 5e98f4e
authored
Migrate LlmUsageAccumulator to typed event filter (#138)
* Migrate LlmUsageAccumulator to typed event filter
Switch the reference accumulator's filter from the 4-stage
NodeEvent + namespace + phase + payload-narrow check to a single
isinstance(event, LlmCompletionEvent) call. Field access moves
from event.pre_state.X to event.usage.X (reusing the same Usage
shape the sentinel payload mirrored). Per-invocation bucketing
reads event.invocation_id directly off the typed event instead
of going through current_invocation_id(), reducing one level of
indirection that the typed-event surface enables.
Add a defensive guard against a None usage record. Spec types the
field as nullable; python's provider always passes a Usage instance
today, but the guard keeps the accumulator robust against future
providers that exercise the null option.
Document the success-only semantic of LlmCompletionEvent and its
effect on bucket.call_count: failed LLM calls flow through the
exception path and do not emit the typed event, so call_count now
reflects successful calls only. Production code migrating an
existing accumulator from the sentinel pattern should expect this
counting shift if it was previously counting failure-path events.
A pipeline tracking attempt-level failure rates needs a separate
listener (sentinel NodeEvent pair, or a future failure-event
typed variant if that proposal lands).
Disclaimer in the docs walkthrough that the captured OTel span
name and gen_ai.usage.* attribute family still come from the
sentinel handler; the OTel + Langfuse observers have not yet
migrated to consuming the typed event. Span names and attribute
paths may shift when the observer migration lands.
Reframe comment and docs language to describe the architectural
state without pinning specific release numbers. Forward-looking
promises and historical version pins both age poorly; the
CHANGELOG is the authoritative reference for cutoff timing.
* Count successful LLM calls without reported usage
Address PR review feedback: the early-return on usage is None was
tying call_count to "successful AND reported usage" rather than just
"successful." The spec contract has those independent — providers may
legitimately omit usage on a successful call.
Restructure so the bucket creation and call_count increment happen
unconditionally for any LlmCompletionEvent, with the usage-None guard
gating only the token-counting math. Successful calls without reported
usage now count toward call_count and contribute zero tokens (the only
honest value we can record).
Smoke test confirms a sequence of one event with usage populated and
one event with usage=None produces call_count=2 with token totals
matching the populated event only.1 parent 3307b5b commit 5e98f4e
2 files changed
Lines changed: 100 additions & 49 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
85 | 85 | | |
86 | 86 | | |
87 | 87 | | |
88 | | - | |
89 | | - | |
90 | | - | |
91 | | - | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
92 | 93 | | |
93 | 94 | | |
94 | 95 | | |
| |||
97 | 98 | | |
98 | 99 | | |
99 | 100 | | |
100 | | - | |
101 | | - | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
102 | 127 | | |
103 | 128 | | |
104 | 129 | | |
| |||
167 | 192 | | |
168 | 193 | | |
169 | 194 | | |
170 | | - | |
171 | | - | |
| 195 | + | |
| 196 | + | |
| 197 | + | |
| 198 | + | |
| 199 | + | |
| 200 | + | |
| 201 | + | |
| 202 | + | |
| 203 | + | |
172 | 204 | | |
173 | 205 | | |
174 | 206 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
49 | 49 | | |
50 | 50 | | |
51 | 51 | | |
52 | | - | |
53 | | - | |
54 | | - | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
55 | 56 | | |
56 | 57 | | |
57 | 58 | | |
| |||
99 | 100 | | |
100 | 101 | | |
101 | 102 | | |
102 | | - | |
| 103 | + | |
103 | 104 | | |
104 | 105 | | |
105 | 106 | | |
| |||
112 | 113 | | |
113 | 114 | | |
114 | 115 | | |
115 | | - | |
116 | 116 | | |
117 | 117 | | |
118 | 118 | | |
| |||
163 | 163 | | |
164 | 164 | | |
165 | 165 | | |
166 | | - | |
167 | | - | |
168 | | - | |
169 | | - | |
170 | | - | |
171 | | - | |
172 | | - | |
| 166 | + | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
| 173 | + | |
| 174 | + | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
| 180 | + | |
| 181 | + | |
| 182 | + | |
| 183 | + | |
| 184 | + | |
| 185 | + | |
| 186 | + | |
| 187 | + | |
| 188 | + | |
| 189 | + | |
| 190 | + | |
173 | 191 | | |
174 | 192 | | |
175 | 193 | | |
| |||
199 | 217 | | |
200 | 218 | | |
201 | 219 | | |
202 | | - | |
203 | | - | |
204 | | - | |
205 | | - | |
206 | | - | |
207 | | - | |
| 220 | + | |
208 | 221 | | |
209 | | - | |
210 | | - | |
211 | | - | |
212 | | - | |
213 | | - | |
214 | | - | |
215 | | - | |
216 | | - | |
217 | | - | |
| 222 | + | |
| 223 | + | |
| 224 | + | |
| 225 | + | |
| 226 | + | |
| 227 | + | |
| 228 | + | |
| 229 | + | |
| 230 | + | |
| 231 | + | |
| 232 | + | |
| 233 | + | |
| 234 | + | |
| 235 | + | |
| 236 | + | |
| 237 | + | |
| 238 | + | |
| 239 | + | |
218 | 240 | | |
219 | | - | |
220 | | - | |
221 | | - | |
222 | | - | |
223 | | - | |
224 | | - | |
| 241 | + | |
| 242 | + | |
| 243 | + | |
| 244 | + | |
225 | 245 | | |
226 | 246 | | |
227 | | - | |
228 | | - | |
229 | | - | |
230 | | - | |
231 | | - | |
232 | | - | |
233 | | - | |
234 | | - | |
| 247 | + | |
| 248 | + | |
| 249 | + | |
| 250 | + | |
| 251 | + | |
| 252 | + | |
| 253 | + | |
235 | 254 | | |
236 | 255 | | |
237 | 256 | | |
| |||
0 commit comments