Skip to main content

gproxy_protocol/claude/create_message/
stream.rs

1use serde::{Deserialize, Serialize};
2
3use crate::claude::create_message::types::{
4    BetaContainer, BetaContentBlock, BetaContextManagementResponse, BetaIterationsUsage,
5    BetaMessage, BetaServerToolUsage, BetaStopReason, BetaTextCitation,
6};
7use crate::claude::types::BetaError;
8
9/// Stream event payload for Claude Messages SSE responses.
10///
11/// Each SSE `data:` line deserializes to one of these variants,
12/// discriminated by the `type` field in JSON.
13#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
14#[serde(tag = "type")]
15pub enum ClaudeStreamEvent {
16    #[serde(rename = "message_start")]
17    MessageStart { message: BetaMessage },
18    #[serde(rename = "content_block_start")]
19    ContentBlockStart {
20        content_block: BetaContentBlock,
21        index: u64,
22    },
23    #[serde(rename = "content_block_delta")]
24    ContentBlockDelta {
25        delta: BetaRawContentBlockDelta,
26        index: u64,
27    },
28    #[serde(rename = "content_block_stop")]
29    ContentBlockStop { index: u64 },
30    #[serde(rename = "message_delta")]
31    MessageDelta {
32        #[serde(default)]
33        context_management: Option<BetaContextManagementResponse>,
34        delta: BetaRawMessageDelta,
35        usage: BetaMessageDeltaUsage,
36    },
37    #[serde(rename = "message_stop")]
38    MessageStop {},
39    #[serde(rename = "ping")]
40    Ping {},
41    #[serde(rename = "error")]
42    Error { error: BetaError },
43}
44
45#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
46#[serde(tag = "type")]
47pub enum BetaRawContentBlockDelta {
48    #[serde(rename = "text_delta")]
49    Text { text: String },
50    #[serde(rename = "input_json_delta")]
51    InputJson { partial_json: String },
52    #[serde(rename = "citations_delta")]
53    Citations { citation: BetaTextCitation },
54    #[serde(rename = "thinking_delta")]
55    Thinking { thinking: String },
56    #[serde(rename = "signature_delta")]
57    Signature { signature: String },
58    #[serde(rename = "compaction_delta")]
59    Compaction { content: Option<String> },
60}
61
62#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
63pub struct BetaRawMessageDelta {
64    #[serde(default)]
65    pub container: Option<BetaContainer>,
66    #[serde(default)]
67    pub stop_reason: Option<BetaStopReason>,
68    #[serde(default)]
69    pub stop_sequence: Option<String>,
70}
71
72/// Cumulative usage counters carried in stream `message_delta` events.
73#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
74pub struct BetaMessageDeltaUsage {
75    #[serde(default)]
76    pub cache_creation_input_tokens: Option<u64>,
77    #[serde(default)]
78    pub cache_read_input_tokens: Option<u64>,
79    #[serde(default)]
80    pub input_tokens: Option<u64>,
81    #[serde(default)]
82    pub iterations: Option<BetaIterationsUsage>,
83    pub output_tokens: u64,
84    #[serde(default)]
85    pub server_tool_use: Option<BetaServerToolUsage>,
86}