Skip to main content

gproxy_protocol/protocol/claude/common/
context_management.rs

1use std::collections::BTreeMap;
2
3use serde::{Deserialize, Serialize};
4
5use super::{BoolOrStringArray, JsonObject, TypedObject};
6
7#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
8#[non_exhaustive]
9pub struct ContextManagementConfig {
10    #[serde(skip_serializing_if = "Option::is_none")]
11    pub edits: Option<Vec<ContextEdit>>,
12    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
13    pub extra: JsonObject,
14}
15
16#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
17#[serde(untagged)]
18#[non_exhaustive]
19pub enum ContextEdit {
20    Known(KnownContextEdit),
21    Unknown(TypedObject),
22}
23
24#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
25#[serde(tag = "type")]
26#[non_exhaustive]
27pub enum KnownContextEdit {
28    #[serde(rename = "clear_tool_uses_20250919")]
29    ClearToolUses {
30        #[serde(skip_serializing_if = "Option::is_none")]
31        clear_at_least: Option<InputTokensValue>,
32        #[serde(skip_serializing_if = "Option::is_none")]
33        clear_tool_inputs: Option<BoolOrStringArray>,
34        #[serde(skip_serializing_if = "Option::is_none")]
35        exclude_tools: Option<Vec<String>>,
36        #[serde(skip_serializing_if = "Option::is_none")]
37        keep: Option<ToolUsesValue>,
38        #[serde(skip_serializing_if = "Option::is_none")]
39        trigger: Option<ContextTrigger>,
40        #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
41        extra: JsonObject,
42    },
43    #[serde(rename = "clear_thinking_20251015")]
44    ClearThinking {
45        #[serde(skip_serializing_if = "Option::is_none")]
46        keep: Option<ThinkingKeep>,
47        #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
48        extra: JsonObject,
49    },
50    #[serde(rename = "compact_20260112")]
51    Compact {
52        #[serde(skip_serializing_if = "Option::is_none")]
53        instructions: Option<String>,
54        #[serde(skip_serializing_if = "Option::is_none")]
55        pause_after_compaction: Option<bool>,
56        #[serde(skip_serializing_if = "Option::is_none")]
57        trigger: Option<InputTokensValue>,
58        #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
59        extra: JsonObject,
60    },
61}
62
63#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
64#[non_exhaustive]
65pub struct InputTokensValue {
66    #[serde(rename = "type")]
67    pub type_: InputTokensValueType,
68    pub value: u64,
69}
70
71#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
72#[non_exhaustive]
73pub enum InputTokensValueType {
74    #[serde(rename = "input_tokens")]
75    InputTokens,
76}
77
78#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
79#[non_exhaustive]
80pub struct ToolUsesValue {
81    #[serde(rename = "type")]
82    pub type_: ToolUsesValueType,
83    pub value: u64,
84}
85
86#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
87#[non_exhaustive]
88pub enum ToolUsesValueType {
89    #[serde(rename = "tool_uses")]
90    ToolUses,
91}
92
93#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
94#[serde(untagged)]
95#[non_exhaustive]
96pub enum ContextTrigger {
97    InputTokens(InputTokensValue),
98    ToolUses(ToolUsesValue),
99}
100
101#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
102#[serde(untagged)]
103#[non_exhaustive]
104pub enum ThinkingKeep {
105    Object(ThinkingKeepObject),
106    All(ThinkingAllValue),
107}
108
109#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
110#[serde(tag = "type")]
111#[non_exhaustive]
112pub enum ThinkingKeepObject {
113    #[serde(rename = "thinking_turns")]
114    ThinkingTurns { value: u64 },
115    #[serde(rename = "all")]
116    All,
117}
118
119#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
120#[non_exhaustive]
121pub enum ThinkingAllValue {
122    #[serde(rename = "all")]
123    All,
124}
125
126#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
127#[non_exhaustive]
128pub struct ContextManagementResponse {
129    #[serde(skip_serializing_if = "Option::is_none")]
130    pub applied_edits: Option<Vec<AppliedContextEdit>>,
131    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
132    pub extra: JsonObject,
133}
134
135#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
136#[serde(untagged)]
137#[non_exhaustive]
138pub enum AppliedContextEdit {
139    Known(KnownAppliedContextEdit),
140    Unknown(TypedObject),
141}
142
143#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
144#[serde(tag = "type")]
145#[non_exhaustive]
146pub enum KnownAppliedContextEdit {
147    #[serde(rename = "clear_tool_uses_20250919")]
148    ClearToolUses {
149        cleared_input_tokens: u64,
150        cleared_tool_uses: u64,
151    },
152    #[serde(rename = "clear_thinking_20251015")]
153    ClearThinking {
154        cleared_input_tokens: u64,
155        cleared_thinking_turns: u64,
156    },
157}