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