use std::collections::HashMap;
use crate::OPENAI_URL;
use crate::{into_vec::IntoVec, model::Model};
use derive_builder::Builder;
use serde::{Deserialize, Serialize};
use super::RequestInfo;
#[derive(Debug, Clone, PartialEq, Serialize, Builder)]
#[builder_struct_attr(doc = "# Required")]
#[builder_struct_attr(doc = "[`model`][Self::model()]")]
#[builder_struct_attr(doc = "[`question`][Self::question()]")]
#[builder_struct_attr(doc = "[`examples`][Self::examples()]")]
#[builder_struct_attr(doc = "[`examples_context`][Self::examples_context()]")]
#[builder_struct_attr(doc = "")]
#[builder(name = "Builder")]
pub struct Request {
pub model: Model,
#[builder(setter(into))]
pub question: String,
#[builder(setter(into))]
pub examples: IntoVec<Vec<String>>,
#[builder(setter(into))]
pub examples_context: String,
#[builder(default, setter(strip_option, into))]
#[serde(skip_serializing_if = "Option::is_none")]
pub documents: Option<IntoVec<String>>,
#[builder(default, setter(strip_option, into))]
#[serde(skip_serializing_if = "Option::is_none")]
pub file: Option<String>,
#[builder(default, setter(strip_option, into))]
#[serde(skip_serializing_if = "Option::is_none")]
pub search_model: Option<Model>,
#[builder(default, setter(strip_option, into))]
#[serde(skip_serializing_if = "Option::is_none")]
pub max_rerank: Option<u64>,
#[builder(default, setter(strip_option, into))]
#[serde(skip_serializing_if = "Option::is_none")]
pub temperature: Option<f64>,
#[builder(default, setter(strip_option))]
#[serde(skip_serializing_if = "Option::is_none")]
pub logprobs: Option<u8>,
#[builder(default, setter(strip_option))]
#[serde(skip_serializing_if = "Option::is_none")]
pub max_tokens: Option<u64>,
#[builder(default, setter(strip_option, into))]
#[serde(skip_serializing_if = "Option::is_none")]
pub stop: Option<IntoVec<String>>,
#[builder(default, setter(strip_option))]
#[serde(skip_serializing_if = "Option::is_none")]
pub n: Option<u16>,
#[builder(default, setter(strip_option))]
#[serde(skip_serializing_if = "Option::is_none")]
pub logit_bits: Option<HashMap<String, i8>>,
#[builder(default, setter(strip_option))]
#[serde(skip_serializing_if = "Option::is_none")]
pub return_metadata: Option<bool>,
#[builder(default, setter(strip_option))]
#[serde(skip_serializing_if = "Option::is_none")]
pub return_prompt: Option<bool>,
#[builder(default, setter(strip_option, into))]
#[serde(skip_serializing_if = "Option::is_none")]
pub expand: Option<IntoVec<String>>,
#[builder(default, setter(strip_option, into))]
#[serde(skip_serializing_if = "Option::is_none")]
pub user: Option<String>,
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Response {
pub answers: Vec<String>,
pub completion: String,
pub model: String,
pub object: String,
pub search_model: String,
pub selected_documents: Vec<SelectedDocument>,
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct SelectedDocument {
pub document: usize,
pub text: String,
}
impl RequestInfo for Request {
fn url(&self) -> String {
format!("{OPENAI_URL}/answers")
}
}
#[cfg_attr(not(feature = "blocking"), async_trait::async_trait)]
impl crate::client::Request for Request {
type Response = Response;
}