Skip to main content

llm_api/
continuation.rs

1use serde::{Deserialize, Serialize};
2use serde_json::Value;
3
4/// Provider-issued replay data attached to exactly one completed model message.
5/// Adapters own the format and compatibility key. Callers must not synthesize or edit payloads.
6#[derive(Clone, PartialEq, Serialize, Deserialize)]
7#[serde(deny_unknown_fields)]
8pub struct Continuation {
9    pub format: String,
10    pub compatibility_key: String,
11    pub payload: Value,
12}
13
14impl std::fmt::Debug for Continuation {
15    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
16        f.debug_struct("Continuation")
17            .field("format", &self.format)
18            .field("compatibility_key", &self.compatibility_key)
19            .finish_non_exhaustive()
20    }
21}
22
23#[cfg(test)]
24mod tests {
25    use super::*;
26    #[test]
27    fn opaque_state_roundtrips_but_is_redacted_from_debug() {
28        let c = Continuation {
29            format: "openrouter.reasoning.v1".into(),
30            compatibility_key: "model".into(),
31            payload: serde_json::json!({"reasoning_details":[{"signature":"secret-signature"}]}),
32        };
33        assert_eq!(
34            serde_json::from_slice::<Continuation>(&serde_json::to_vec(&c).unwrap()).unwrap(),
35            c
36        );
37        assert!(!format!("{c:?}").contains("secret-signature"));
38    }
39}