Skip to main content

gproxy_protocol/protocol/claude/common/
thinking.rs

1use std::collections::BTreeMap;
2
3use serde::{Deserialize, Serialize};
4
5use super::{
6    JsonObject, ThinkingDisplay, ThinkingDroppedReason, ThinkingPrefixMismatchBehavior, TypedObject,
7};
8
9#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
10#[serde(untagged)]
11#[non_exhaustive]
12pub enum ThinkingConfig {
13    Enabled(ThinkingEnabled),
14    Disabled(ThinkingDisabled),
15    Adaptive(ThinkingAdaptive),
16    Unknown(TypedObject),
17}
18
19#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
20#[non_exhaustive]
21pub struct ThinkingEnabled {
22    pub budget_tokens: u64,
23    #[serde(rename = "type")]
24    pub type_: ThinkingEnabledType,
25    #[serde(skip_serializing_if = "Option::is_none")]
26    pub block_binding: Option<ThinkingBlockBinding>,
27    #[serde(skip_serializing_if = "Option::is_none")]
28    pub display: Option<ThinkingDisplay>,
29    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
30    pub extra: JsonObject,
31}
32
33#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
34#[non_exhaustive]
35pub enum ThinkingEnabledType {
36    #[serde(rename = "enabled")]
37    Enabled,
38}
39
40#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
41#[non_exhaustive]
42pub struct ThinkingDisabled {
43    #[serde(rename = "type")]
44    pub type_: ThinkingDisabledType,
45    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
46    pub extra: JsonObject,
47}
48
49#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
50#[non_exhaustive]
51pub enum ThinkingDisabledType {
52    #[serde(rename = "disabled")]
53    Disabled,
54}
55
56#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
57#[non_exhaustive]
58pub struct ThinkingAdaptive {
59    #[serde(rename = "type")]
60    pub type_: ThinkingAdaptiveType,
61    #[serde(skip_serializing_if = "Option::is_none")]
62    pub block_binding: Option<ThinkingBlockBinding>,
63    #[serde(skip_serializing_if = "Option::is_none")]
64    pub display: Option<ThinkingDisplay>,
65    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
66    pub extra: JsonObject,
67}
68
69#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
70#[non_exhaustive]
71pub enum ThinkingAdaptiveType {
72    #[serde(rename = "adaptive")]
73    Adaptive,
74}
75
76#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
77#[non_exhaustive]
78pub struct ThinkingBlockBinding {
79    #[serde(skip_serializing_if = "Option::is_none")]
80    pub prefix_mismatch_behavior: Option<ThinkingPrefixMismatchBehavior>,
81    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
82    pub extra: JsonObject,
83}
84
85#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
86#[serde(untagged)]
87#[non_exhaustive]
88pub enum InputTransformation {
89    ThinkingDropped(ThinkingDroppedInputTransformation),
90    Unknown(TypedObject),
91}
92
93#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
94#[non_exhaustive]
95pub struct ThinkingDroppedInputTransformation {
96    pub path: String,
97    pub reason: ThinkingDroppedReason,
98    #[serde(rename = "type")]
99    pub type_: ThinkingDroppedInputTransformationType,
100    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
101    pub extra: JsonObject,
102}
103
104#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
105#[non_exhaustive]
106pub enum ThinkingDroppedInputTransformationType {
107    #[serde(rename = "thinking_dropped")]
108    ThinkingDropped,
109}