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)]
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}