Skip to main content

gproxy_protocol/protocol/claude/
models.rs

1use std::collections::BTreeMap;
2
3use serde::{Deserialize, Serialize};
4use serde_json::Value;
5
6use super::common::{AnthropicBetaHeaders, ClaudeModel, JsonObject, ModelObjectType};
7
8pub type ListModelsRequestHeaders = AnthropicBetaHeaders;
9pub type RetrieveModelRequestHeaders = AnthropicBetaHeaders;
10
11#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
12pub struct ListModelsQuery {
13    #[serde(skip_serializing_if = "Option::is_none")]
14    pub after_id: Option<String>,
15    #[serde(skip_serializing_if = "Option::is_none")]
16    pub before_id: Option<String>,
17    #[serde(skip_serializing_if = "Option::is_none")]
18    pub limit: Option<u64>,
19    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
20    pub extra: JsonObject,
21}
22
23#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
24pub struct RetrieveModelPath {
25    pub model_id: ClaudeModel,
26}
27
28#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
29pub struct ListModelsResponse {
30    pub data: Vec<ModelInfo>,
31    pub first_id: String,
32    pub has_more: bool,
33    pub last_id: String,
34    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
35    pub extra: JsonObject,
36}
37
38#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
39pub struct ModelInfo {
40    pub id: ClaudeModel,
41    pub allowed_fallback_models: Vec<ClaudeModel>,
42    #[serde(rename = "type")]
43    pub type_: ModelObjectType,
44    pub created_at: String,
45    pub display_name: String,
46    pub max_input_tokens: u64,
47    pub max_tokens: u64,
48    pub capabilities: ModelCapabilities,
49    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
50    pub extra: JsonObject,
51}
52
53#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
54pub struct ModelCapabilities {
55    pub batch: CapabilitySupport,
56    pub citations: CapabilitySupport,
57    pub code_execution: CapabilitySupport,
58    pub context_management: ContextManagementCapability,
59    pub effort: EffortCapability,
60    pub image_input: CapabilitySupport,
61    pub pdf_input: CapabilitySupport,
62    pub structured_outputs: CapabilitySupport,
63    pub thinking: ThinkingCapability,
64    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
65    pub extra: JsonObject,
66}
67
68#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
69pub struct CapabilitySupport {
70    pub supported: bool,
71    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
72    pub extra: JsonObject,
73}
74
75#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
76pub struct ContextManagementCapability {
77    pub supported: bool,
78    #[serde(skip_serializing_if = "Option::is_none")]
79    pub clear_thinking_20251015: Option<CapabilitySupport>,
80    #[serde(skip_serializing_if = "Option::is_none")]
81    pub clear_tool_uses_20250919: Option<CapabilitySupport>,
82    #[serde(skip_serializing_if = "Option::is_none")]
83    pub compact_20260112: Option<CapabilitySupport>,
84    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
85    pub extra: JsonObject,
86}
87
88#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
89pub struct EffortCapability {
90    pub supported: bool,
91    #[serde(skip_serializing_if = "Option::is_none")]
92    pub low: Option<CapabilitySupport>,
93    #[serde(skip_serializing_if = "Option::is_none")]
94    pub medium: Option<CapabilitySupport>,
95    #[serde(skip_serializing_if = "Option::is_none")]
96    pub high: Option<CapabilitySupport>,
97    #[serde(skip_serializing_if = "Option::is_none")]
98    pub xhigh: Option<CapabilitySupport>,
99    #[serde(skip_serializing_if = "Option::is_none")]
100    pub max: Option<CapabilitySupport>,
101    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
102    pub extra: JsonObject,
103}
104
105#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
106pub struct ThinkingCapability {
107    pub supported: bool,
108    pub types: ThinkingTypes,
109    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
110    pub extra: JsonObject,
111}
112
113#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
114pub struct ThinkingTypes {
115    #[serde(skip_serializing_if = "Option::is_none")]
116    pub adaptive: Option<CapabilitySupport>,
117    #[serde(skip_serializing_if = "Option::is_none")]
118    pub enabled: Option<CapabilitySupport>,
119    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
120    pub extra: JsonObject,
121}
122
123#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
124pub struct ModelError {
125    #[serde(rename = "type")]
126    pub type_: String,
127    pub message: String,
128    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
129    pub extra: BTreeMap<String, Value>,
130}