use crate::v2::tool::{ToolCallId, ToolUseInput};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum StopReasonV2 {
EndTurn,
MaxTokens,
ToolUse,
StopSequence,
Cancelled,
Error,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub struct UsageV2 {
pub input_tokens: u32,
pub output_tokens: u32,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum ResponseBlock {
Text {
delta: String,
},
Thinking {
delta: String,
},
ToolUse {
tool_call_id: ToolCallId,
name: String,
input: ToolUseInput,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ErrorCodeV2 {
QueueFull,
BackendUnavailable,
InvalidRequest,
FrameTooLarge,
Internal,
AttachmentUnsupported,
ToolCallMalformed,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum ResponseV2 {
Frame {
id: String,
block: ResponseBlock,
},
Done {
id: String,
usage: UsageV2,
stop_reason: StopReasonV2,
backend: String,
},
Error {
id: String,
code: ErrorCodeV2,
message: String,
},
}
impl ResponseV2 {
pub fn id(&self) -> &str {
match self {
ResponseV2::Frame { id, .. }
| ResponseV2::Done { id, .. }
| ResponseV2::Error { id, .. } => id,
}
}
pub fn is_terminal(&self) -> bool {
matches!(self, ResponseV2::Done { .. } | ResponseV2::Error { .. })
}
}