use std::collections::BTreeMap;
use runtime_types::{ConversationId, RuntimeInstanceId, WorkspaceId};
use serde::{Deserialize, Serialize};
use serde_json::Value;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ClaudeMessageRequest {
pub model: String,
pub max_tokens: u32,
pub messages: Vec<ClaudeInputMessage>,
#[serde(default)]
pub system: Option<Value>,
#[serde(default)]
pub stream: bool,
#[serde(default)]
pub metadata: BTreeMap<String, Value>,
#[serde(default)]
pub stop_sequences: Vec<String>,
#[serde(default)]
pub tools: Vec<Value>,
#[serde(default)]
pub tool_choice: Option<Value>,
#[serde(default)]
pub temperature: Option<f64>,
#[serde(default)]
pub top_p: Option<f64>,
#[serde(default)]
pub top_k: Option<u32>,
#[serde(default)]
pub thinking: Option<Value>,
#[serde(default)]
pub output_config: Option<Value>,
#[serde(default)]
pub service_tier: Option<String>,
#[serde(default)]
pub agent: Option<ClaudeAgentOptions>,
#[serde(default, flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct ClaudeInputMessage {
pub role: String,
pub content: Value,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct ClaudeAgentOptions {
#[serde(default)]
pub runtime_id: Option<RuntimeInstanceId>,
#[serde(default)]
pub workspace_id: Option<WorkspaceId>,
#[serde(default)]
pub conversation_id: Option<ConversationId>,
#[serde(default)]
pub downstream_model: Option<String>,
#[serde(default)]
pub deadline_seconds: Option<u64>,
#[serde(default)]
pub max_model_turns: Option<usize>,
#[serde(default)]
pub max_tool_calls: Option<usize>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ClaudeMessage {
pub id: String,
#[serde(rename = "type")]
pub message_type: String,
pub role: String,
pub content: Vec<ClaudeContentBlock>,
pub model: String,
pub stop_reason: Option<String>,
pub stop_sequence: Option<String>,
pub usage: ClaudeUsage,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum ClaudeContentBlock {
Text { text: String },
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct ClaudeUsage {
pub input_tokens: u64,
pub output_tokens: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct ClaudeErrorEnvelope {
#[serde(rename = "type")]
pub envelope_type: String,
pub error: ClaudeError,
pub request_id: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct ClaudeError {
#[serde(rename = "type")]
pub error_type: String,
pub message: String,
}