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    #[serde(rename = "type")]
42    pub type_: ModelObjectType,
43    pub created_at: String,
44    pub display_name: String,
45    pub max_input_tokens: u64,
46    pub max_tokens: u64,
47    pub capabilities: ModelCapabilities,
48    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
49    pub extra: JsonObject,
50}
51
52#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
53pub struct ModelCapabilities {
54    pub batch: CapabilitySupport,
55    pub citations: CapabilitySupport,
56    pub code_execution: CapabilitySupport,
57    pub context_management: ContextManagementCapability,
58    pub effort: EffortCapability,
59    pub image_input: CapabilitySupport,
60    pub pdf_input: CapabilitySupport,
61    pub structured_outputs: CapabilitySupport,
62    pub thinking: ThinkingCapability,
63    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
64    pub extra: JsonObject,
65}
66
67#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
68pub struct CapabilitySupport {
69    pub supported: bool,
70    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
71    pub extra: JsonObject,
72}
73
74#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
75pub struct ContextManagementCapability {
76    pub supported: bool,
77    #[serde(skip_serializing_if = "Option::is_none")]
78    pub clear_thinking_20251015: Option<CapabilitySupport>,
79    #[serde(skip_serializing_if = "Option::is_none")]
80    pub clear_tool_uses_20250919: Option<CapabilitySupport>,
81    #[serde(skip_serializing_if = "Option::is_none")]
82    pub compact_20260112: Option<CapabilitySupport>,
83    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
84    pub extra: JsonObject,
85}
86
87#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
88pub struct EffortCapability {
89    pub supported: bool,
90    #[serde(skip_serializing_if = "Option::is_none")]
91    pub low: Option<CapabilitySupport>,
92    #[serde(skip_serializing_if = "Option::is_none")]
93    pub medium: Option<CapabilitySupport>,
94    #[serde(skip_serializing_if = "Option::is_none")]
95    pub high: Option<CapabilitySupport>,
96    #[serde(skip_serializing_if = "Option::is_none")]
97    pub xhigh: Option<CapabilitySupport>,
98    #[serde(skip_serializing_if = "Option::is_none")]
99    pub max: Option<CapabilitySupport>,
100    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
101    pub extra: JsonObject,
102}
103
104#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
105pub struct ThinkingCapability {
106    pub supported: bool,
107    pub types: ThinkingTypes,
108    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
109    pub extra: JsonObject,
110}
111
112#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
113pub struct ThinkingTypes {
114    #[serde(skip_serializing_if = "Option::is_none")]
115    pub adaptive: Option<CapabilitySupport>,
116    #[serde(skip_serializing_if = "Option::is_none")]
117    pub enabled: Option<CapabilitySupport>,
118    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
119    pub extra: JsonObject,
120}
121
122#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
123pub struct ModelError {
124    #[serde(rename = "type")]
125    pub type_: String,
126    pub message: String,
127    #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
128    pub extra: BTreeMap<String, Value>,
129}