va_ai_api_bridge/
stream.rs1use std::collections::BTreeMap;
2
3use serde::{Deserialize, Serialize};
4use serde_json::Value;
5
6use crate::{ContentBlock, Extensions, FinishReason, Role, Usage};
7
8#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
9#[serde(rename_all = "camelCase")]
10pub struct DecodeState {
11 #[serde(default, skip_serializing_if = "Extensions::is_empty")]
12 pub extensions: Extensions,
13}
14
15#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
16#[serde(rename_all = "camelCase")]
17pub struct EncodeState {
18 #[serde(default, skip_serializing_if = "Extensions::is_empty")]
19 pub extensions: Extensions,
20}
21
22#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
23#[serde(
24 tag = "type",
25 rename_all = "snake_case",
26 rename_all_fields = "camelCase"
27)]
28pub enum UniversalEvent {
29 ResponseStart {
30 #[serde(default, skip_serializing_if = "Option::is_none")]
31 id: Option<String>,
32 #[serde(default, skip_serializing_if = "Option::is_none")]
33 model: Option<String>,
34 #[serde(default, skip_serializing_if = "Extensions::is_empty")]
35 extensions: Extensions,
36 },
37 MessageStart {
38 id: String,
39 role: Role,
40 #[serde(default, skip_serializing_if = "Extensions::is_empty")]
41 extensions: Extensions,
42 },
43 ContentStart {
44 index: usize,
45 block: ContentBlock,
46 },
47 TextDelta {
48 index: usize,
49 text: String,
50 },
51 ReasoningDelta {
52 index: usize,
53 text: String,
54 },
55 ToolCallDelta {
56 id: String,
57 #[serde(default, skip_serializing_if = "Option::is_none")]
58 name: Option<String>,
59 arguments_delta: String,
60 },
61 ContentDone {
62 index: usize,
63 #[serde(default, skip_serializing_if = "Option::is_none")]
64 final_block: Option<ContentBlock>,
65 },
66 MessageDone {
67 #[serde(default, skip_serializing_if = "Option::is_none")]
68 finish_reason: Option<FinishReason>,
69 #[serde(default, skip_serializing_if = "Option::is_none")]
70 usage: Option<Usage>,
71 #[serde(default, skip_serializing_if = "Extensions::is_empty")]
72 extensions: Extensions,
73 },
74 ResponseDone {
75 #[serde(default, skip_serializing_if = "Option::is_none")]
76 usage: Option<Usage>,
77 #[serde(default, skip_serializing_if = "Extensions::is_empty")]
78 extensions: Extensions,
79 },
80 Error {
81 message: String,
82 #[serde(default, skip_serializing_if = "Option::is_none")]
83 raw: Option<Value>,
84 },
85 Unknown {
86 raw: Value,
87 #[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
88 tags: BTreeMap<String, String>,
89 },
90}