infernum_core/
response.rs1use serde::{Deserialize, Serialize};
4
5use crate::types::{FinishReason, ModelId, RequestId, Usage};
6
7#[derive(Debug, Clone, Serialize, Deserialize)]
9pub struct GenerateResponse {
10 pub request_id: RequestId,
12
13 pub model: ModelId,
15
16 pub choices: Vec<Choice>,
18
19 pub usage: Usage,
21
22 #[serde(skip_serializing_if = "Option::is_none")]
24 pub time_to_first_token_ms: Option<f64>,
25
26 #[serde(skip_serializing_if = "Option::is_none")]
28 pub total_time_ms: Option<f64>,
29}
30
31#[derive(Debug, Clone, Serialize, Deserialize)]
33pub struct Choice {
34 pub index: u32,
36
37 pub text: String,
39
40 #[serde(skip_serializing_if = "Option::is_none")]
42 pub finish_reason: Option<FinishReason>,
43
44 #[serde(skip_serializing_if = "Option::is_none")]
46 pub logprobs: Option<LogProbs>,
47}
48
49#[derive(Debug, Clone, Serialize, Deserialize)]
51pub struct LogProbs {
52 pub tokens: Vec<String>,
54
55 pub token_logprobs: Vec<f32>,
57
58 #[serde(skip_serializing_if = "Option::is_none")]
60 pub top_logprobs: Option<Vec<Vec<TopLogProb>>>,
61}
62
63#[derive(Debug, Clone, Serialize, Deserialize)]
65pub struct TopLogProb {
66 pub token: String,
68
69 pub logprob: f32,
71}
72
73#[derive(Debug, Clone, Serialize, Deserialize)]
75pub struct TokenInfo {
76 pub id: u32,
78
79 pub text: String,
81
82 #[serde(skip_serializing_if = "Option::is_none")]
84 pub logprob: Option<f32>,
85
86 #[serde(default)]
88 pub special: bool,
89}
90
91#[derive(Debug, Clone, Serialize, Deserialize)]
93pub struct EmbedResponse {
94 pub request_id: RequestId,
96
97 pub model: ModelId,
99
100 pub data: Vec<Embedding>,
102
103 pub usage: Usage,
105}
106
107#[derive(Debug, Clone, Serialize, Deserialize)]
109pub struct Embedding {
110 pub index: u32,
112
113 pub embedding: EmbeddingData,
115}
116
117#[derive(Debug, Clone, Serialize, Deserialize)]
119#[serde(untagged)]
120pub enum EmbeddingData {
121 Float(Vec<f32>),
123
124 Base64(String),
126}
127
128impl EmbeddingData {
129 pub fn as_floats(&self) -> Result<Vec<f32>, &'static str> {
135 match self {
136 Self::Float(v) => Ok(v.clone()),
137 Self::Base64(_) => Err("base64 decoding not implemented"),
138 }
139 }
140
141 #[must_use]
143 pub fn dimensions(&self) -> usize {
144 match self {
145 Self::Float(v) => v.len(),
146 Self::Base64(s) => {
147 (s.len() * 3) / 16
149 },
150 }
151 }
152}