gproxy_protocol/protocol/claude/common/
context_management.rs1use 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}