Commit 76c579d
authored
fix(completions): preserve unknown chat delta fields end-to-end (#677)
`ChatDelta` is a typed struct with no `#[serde(flatten)]` catch-all,
so any field the upstream emits that's not in our explicit field list
is silently dropped on deserialize and never reaches the client.
This bites the inference-proxy's server-side agent loop
(nearai/inference-proxy#144): the proxy emits a synthetic
`delta.nearai_tool_result` chunk between iterations carrying the
tool's grounded output. Empirically, against a freshly-deployed
staging running #676, the model successfully called
`web_context_search` (we saw the tool_calls chunks on the wire), but
the proxy's `nearai_tool_result` chunks never made it through to the
client — cloud-api stripped them on chunk re-serialization. Same root
cause as #676 on the request side: typed structs with no catch-all.
Fix: add a flattened `extra: HashMap<String, serde_json::Value>` to
`ChatDelta`. Unknown delta fields are now preserved verbatim on the
deserialize-then-re-serialize round trip. Derived `Default` on the
struct so the empty catch-all is `HashMap::new()` by default, then
updated the handful of explicit `ChatDelta { ... }` literals across
the workspace to set `extra: Default::default()`.
Regression test: `chat_delta_preserves_unknown_fields_round_trip`
constructs a chunk with `delta.nearai_tool_result`, deserializes it,
asserts the catch-all contains the expected payload, and round-trips
the re-serialized JSON to confirm the synthetic field survives.
`cargo test --workspace --lib` clean (315 + 174 + 106 + 16 + 11
passing, including the new test). `cargo clippy --all-targets
-- -D warnings` clean.1 parent f017653 commit 76c579d
4 files changed
Lines changed: 74 additions & 1 deletion
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
507 | 507 | | |
508 | 508 | | |
509 | 509 | | |
| 510 | + | |
510 | 511 | | |
511 | 512 | | |
512 | 513 | | |
| |||
709 | 710 | | |
710 | 711 | | |
711 | 712 | | |
| 713 | + | |
712 | 714 | | |
713 | 715 | | |
714 | 716 | | |
| |||
769 | 771 | | |
770 | 772 | | |
771 | 773 | | |
| 774 | + | |
772 | 775 | | |
773 | 776 | | |
774 | 777 | | |
| |||
1563 | 1566 | | |
1564 | 1567 | | |
1565 | 1568 | | |
| 1569 | + | |
1566 | 1570 | | |
1567 | 1571 | | |
1568 | 1572 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
59 | 59 | | |
60 | 60 | | |
61 | 61 | | |
| 62 | + | |
62 | 63 | | |
63 | 64 | | |
64 | 65 | | |
| |||
76 | 77 | | |
77 | 78 | | |
78 | 79 | | |
| 80 | + | |
79 | 81 | | |
80 | 82 | | |
81 | 83 | | |
| |||
107 | 109 | | |
108 | 110 | | |
109 | 111 | | |
| 112 | + | |
110 | 113 | | |
111 | 114 | | |
112 | 115 | | |
| |||
133 | 136 | | |
134 | 137 | | |
135 | 138 | | |
| 139 | + | |
136 | 140 | | |
137 | 141 | | |
138 | 142 | | |
| |||
170 | 174 | | |
171 | 175 | | |
172 | 176 | | |
| 177 | + | |
173 | 178 | | |
174 | 179 | | |
175 | 180 | | |
| |||
191 | 196 | | |
192 | 197 | | |
193 | 198 | | |
| 199 | + | |
194 | 200 | | |
195 | 201 | | |
196 | 202 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
371 | 371 | | |
372 | 372 | | |
373 | 373 | | |
| 374 | + | |
374 | 375 | | |
375 | 376 | | |
376 | 377 | | |
| |||
415 | 416 | | |
416 | 417 | | |
417 | 418 | | |
| 419 | + | |
418 | 420 | | |
419 | 421 | | |
420 | 422 | | |
| |||
460 | 462 | | |
461 | 463 | | |
462 | 464 | | |
| 465 | + | |
463 | 466 | | |
464 | 467 | | |
465 | 468 | | |
| |||
510 | 513 | | |
511 | 514 | | |
512 | 515 | | |
| 516 | + | |
513 | 517 | | |
514 | 518 | | |
515 | 519 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
18 | 18 | | |
19 | 19 | | |
20 | 20 | | |
21 | | - | |
| 21 | + | |
22 | 22 | | |
23 | 23 | | |
24 | 24 | | |
| |||
34 | 34 | | |
35 | 35 | | |
36 | 36 | | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
37 | 48 | | |
38 | 49 | | |
39 | 50 | | |
| |||
1197 | 1208 | | |
1198 | 1209 | | |
1199 | 1210 | | |
| 1211 | + | |
| 1212 | + | |
| 1213 | + | |
| 1214 | + | |
| 1215 | + | |
| 1216 | + | |
| 1217 | + | |
| 1218 | + | |
| 1219 | + | |
| 1220 | + | |
| 1221 | + | |
| 1222 | + | |
| 1223 | + | |
| 1224 | + | |
| 1225 | + | |
| 1226 | + | |
| 1227 | + | |
| 1228 | + | |
| 1229 | + | |
| 1230 | + | |
| 1231 | + | |
| 1232 | + | |
| 1233 | + | |
| 1234 | + | |
| 1235 | + | |
| 1236 | + | |
| 1237 | + | |
| 1238 | + | |
| 1239 | + | |
| 1240 | + | |
| 1241 | + | |
| 1242 | + | |
| 1243 | + | |
| 1244 | + | |
| 1245 | + | |
| 1246 | + | |
| 1247 | + | |
| 1248 | + | |
| 1249 | + | |
| 1250 | + | |
| 1251 | + | |
| 1252 | + | |
| 1253 | + | |
| 1254 | + | |
| 1255 | + | |
| 1256 | + | |
| 1257 | + | |
| 1258 | + | |
1200 | 1259 | | |
1201 | 1260 | | |
1202 | 1261 | | |
| |||
0 commit comments