Skip to main content

agent_runtime_http_api/
claude.rs

1//! Anthropic Claude Messages API wire types for the compatibility adapter.
2
3use std::collections::BTreeMap;
4
5use runtime_types::{ConversationId, RuntimeInstanceId, WorkspaceId};
6use serde::{Deserialize, Serialize};
7use serde_json::Value;
8
9#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
10pub struct ClaudeMessageRequest {
11    pub model: String,
12    pub max_tokens: u32,
13    pub messages: Vec<ClaudeInputMessage>,
14    #[serde(default)]
15    pub system: Option<Value>,
16    #[serde(default)]
17    pub stream: bool,
18    #[serde(default)]
19    pub metadata: BTreeMap<String, Value>,
20    #[serde(default)]
21    pub stop_sequences: Vec<String>,
22    #[serde(default)]
23    pub tools: Vec<Value>,
24    #[serde(default)]
25    pub tool_choice: Option<Value>,
26    #[serde(default)]
27    pub temperature: Option<f64>,
28    #[serde(default)]
29    pub top_p: Option<f64>,
30    #[serde(default)]
31    pub top_k: Option<u32>,
32    #[serde(default)]
33    pub thinking: Option<Value>,
34    #[serde(default)]
35    pub output_config: Option<Value>,
36    #[serde(default)]
37    pub service_tier: Option<String>,
38    #[serde(default)]
39    pub agent: Option<ClaudeAgentOptions>,
40    /// Anthropic evolves this API independently. Unknown fields are retained
41    /// for an explicit invalid_request_error rather than ignored by Serde.
42    #[serde(default, flatten)]
43    pub extra: BTreeMap<String, Value>,
44}
45
46#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
47#[serde(deny_unknown_fields)]
48pub struct ClaudeInputMessage {
49    pub role: String,
50    pub content: Value,
51}
52
53#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
54#[serde(rename_all = "camelCase", deny_unknown_fields)]
55pub struct ClaudeAgentOptions {
56    #[serde(default)]
57    pub runtime_id: Option<RuntimeInstanceId>,
58    #[serde(default)]
59    pub workspace_id: Option<WorkspaceId>,
60    #[serde(default)]
61    pub conversation_id: Option<ConversationId>,
62    #[serde(default)]
63    pub downstream_model: Option<String>,
64    #[serde(default)]
65    pub deadline_seconds: Option<u64>,
66    #[serde(default)]
67    pub max_model_turns: Option<usize>,
68    #[serde(default)]
69    pub max_tool_calls: Option<usize>,
70}
71
72#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
73pub struct ClaudeMessage {
74    pub id: String,
75    #[serde(rename = "type")]
76    pub message_type: String,
77    pub role: String,
78    pub content: Vec<ClaudeContentBlock>,
79    pub model: String,
80    pub stop_reason: Option<String>,
81    pub stop_sequence: Option<String>,
82    pub usage: ClaudeUsage,
83}
84
85#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
86#[serde(tag = "type", rename_all = "snake_case")]
87pub enum ClaudeContentBlock {
88    Text { text: String },
89}
90
91#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
92pub struct ClaudeUsage {
93    pub input_tokens: u64,
94    pub output_tokens: u64,
95}
96
97#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
98pub struct ClaudeErrorEnvelope {
99    #[serde(rename = "type")]
100    pub envelope_type: String,
101    pub error: ClaudeError,
102    pub request_id: Option<String>,
103}
104
105#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
106pub struct ClaudeError {
107    #[serde(rename = "type")]
108    pub error_type: String,
109    pub message: String,
110}