gproxy_protocol/claude/common/blocks/
fallback.rs1use serde::{Deserialize, Serialize};
2use serde_json::Value;
3
4use super::super::{ClaudeModel, JsonObject, RefusalCategory};
5
6#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
7#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
8pub struct FallbackBlockParam {
9 pub from: FallbackInfo,
10 pub to: FallbackInfo,
11 #[serde(rename = "type")]
12 pub type_: FallbackBlockType,
13 #[serde(
17 default,
18 deserialize_with = "deserialize_present_value",
19 skip_serializing_if = "Option::is_none"
20 )]
21 pub trigger: Option<Value>,
22 #[serde(default, flatten, skip_serializing_if = "JsonObject::is_empty")]
23 pub rest: JsonObject,
24}
25
26#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
27#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
28pub struct ResponseFallbackBlock {
29 pub from: FallbackInfo,
30 pub to: FallbackInfo,
31 pub trigger: FallbackRefusalTrigger,
32 #[serde(rename = "type")]
33 pub type_: FallbackBlockType,
34 #[serde(default, flatten, skip_serializing_if = "JsonObject::is_empty")]
35 pub rest: JsonObject,
36}
37
38#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
39#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
40pub struct FallbackRefusalTrigger {
41 pub category: RefusalCategory,
42 #[serde(rename = "type")]
43 pub type_: FallbackRefusalTriggerType,
44 #[serde(default, flatten, skip_serializing_if = "JsonObject::is_empty")]
45 pub rest: JsonObject,
46}
47
48#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
49#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
50pub struct FallbackInfo {
51 pub model: ClaudeModel,
52 #[serde(default, flatten, skip_serializing_if = "JsonObject::is_empty")]
53 pub rest: JsonObject,
54}
55
56#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
57#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
58pub enum FallbackBlockType {
59 #[serde(rename = "fallback")]
60 Fallback,
61}
62
63#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
64#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
65pub enum FallbackRefusalTriggerType {
66 #[serde(rename = "refusal")]
67 Refusal,
68}
69
70fn deserialize_present_value<'de, D>(deserializer: D) -> Result<Option<Value>, D::Error>
71where
72 D: serde::Deserializer<'de>,
73{
74 Value::deserialize(deserializer).map(Some)
75}