ragit_api/response/
openai.rs

1use super::{IntoChatResponse, Response};
2use crate::error::Error;
3use serde::Deserialize;
4
5#[allow(dead_code)]
6#[derive(Deserialize)]
7pub struct OpenAiResponse {
8    id: String,
9    object: String,
10    created: i64,
11    model: String,
12    choices: Vec<OpenAiChoice>,
13    usage: OpenAiUsage,
14}
15
16#[allow(dead_code)]
17#[derive(Deserialize)]
18struct OpenAiChoice {
19    index: usize,
20    message: OpenAiMessage,
21    finish_reason: String,
22}
23
24#[allow(dead_code)]
25#[derive(Deserialize)]
26struct OpenAiUsage {
27    prompt_tokens: usize,
28    completion_tokens: usize,
29    total_tokens: usize,
30
31    // only on groq api
32    #[serde(skip)]
33    prompt_time: f32,
34    #[serde(skip)]
35    completion_time: f32,
36    #[serde(skip)]
37    total_time: f32,
38}
39
40#[allow(dead_code)]
41#[derive(Deserialize)]
42struct OpenAiMessage {
43    role: String,
44    content: String,
45    reasoning_content: Option<String>,
46}
47
48impl IntoChatResponse for OpenAiResponse {
49    fn into_chat_response(&self) -> Result<Response, Error> {
50        Ok(Response {
51            messages: self.choices.iter().map(
52                |choice| choice.message.content.to_string()
53            ).collect(),
54            reasonings: self.choices.iter().map(
55                |choice| choice.message.reasoning_content.clone()
56            ).collect(),
57            output_tokens: self.usage.completion_tokens,
58            prompt_tokens: self.usage.prompt_tokens,
59            total_tokens: self.usage.total_tokens,
60        })
61    }
62}