walrus_core/model/
response.rs1use crate::model::{Message, Role, tool::ToolCall};
4use compact_str::CompactString;
5pub use crabtalk_core::{CompletionTokensDetails, FinishReason, Usage};
6use serde::{Deserialize, Serialize};
7
8#[derive(Debug, Clone, Deserialize, Default)]
10pub struct CompletionMeta {
11 pub id: CompactString,
13
14 pub object: CompactString,
16
17 pub created: u64,
19
20 pub model: CompactString,
22
23 pub system_fingerprint: Option<CompactString>,
25}
26
27#[derive(Debug, Clone, Deserialize, Default)]
31pub struct Delta {
32 pub role: Option<Role>,
34
35 pub content: Option<String>,
37
38 pub reasoning_content: Option<String>,
40
41 pub tool_calls: Option<Vec<ToolCall>>,
43}
44
45#[derive(Debug, Clone, Deserialize)]
47pub struct Response {
48 #[serde(flatten)]
50 pub meta: CompletionMeta,
51
52 pub choices: Vec<Choice>,
54
55 pub usage: Usage,
57}
58
59impl Response {
60 pub fn message(&self) -> Option<Message> {
61 let choice = self.choices.first()?;
62 Some(Message::assistant(
63 choice.delta.content.clone().unwrap_or_default(),
64 choice.delta.reasoning_content.clone(),
65 choice.delta.tool_calls.as_deref(),
66 ))
67 }
68
69 pub fn content(&self) -> Option<&String> {
71 self.choices
72 .first()
73 .and_then(|choice| choice.delta.content.as_ref())
74 }
75
76 pub fn reasoning(&self) -> Option<&String> {
78 self.choices
79 .first()
80 .and_then(|choice| choice.delta.reasoning_content.as_ref())
81 }
82
83 pub fn tool_calls(&self) -> Option<&[ToolCall]> {
85 self.choices
86 .first()
87 .and_then(|choice| choice.delta.tool_calls.as_deref())
88 }
89
90 pub fn reason(&self) -> Option<&FinishReason> {
92 self.choices
93 .first()
94 .and_then(|choice| choice.finish_reason.as_ref())
95 }
96}
97
98#[derive(Debug, Clone, Deserialize, Default)]
100pub struct Choice {
101 pub index: u32,
103
104 #[serde(alias = "message")]
106 pub delta: Delta,
107
108 pub finish_reason: Option<FinishReason>,
110
111 pub logprobs: Option<LogProbs>,
113}
114
115#[derive(Debug, Clone, Deserialize)]
117pub struct LogProbs {
118 pub content: Option<Vec<LogProb>>,
120}
121
122#[derive(Debug, Clone, Deserialize, Serialize)]
124pub struct LogProb {
125 pub token: String,
127
128 pub logprob: f64,
130
131 #[serde(skip_serializing_if = "Option::is_none")]
133 pub bytes: Option<Vec<u8>>,
134
135 #[serde(skip_serializing_if = "Option::is_none")]
137 pub top_logprobs: Option<Vec<TopLogProb>>,
138}
139
140#[derive(Debug, Clone, Deserialize, Serialize)]
142pub struct TopLogProb {
143 pub token: String,
145
146 pub logprob: f64,
148
149 #[serde(skip_serializing_if = "Option::is_none")]
151 pub bytes: Option<Vec<u8>>,
152}