use serde::de::{Error, MapAccess, Visitor};
use serde::{Deserialize, Deserializer, Serialize};
use serde_with::skip_serializing_none;
use std::fmt::{self, Formatter};
#[non_exhaustive]
#[skip_serializing_none]
#[derive(Clone, Debug, PartialEq, Serialize)]
pub struct LLMObsIntegrationInferenceResponse {
#[serde(rename = "anthropic_metadata")]
pub anthropic_metadata: Option<crate::datadogV2::model::LLMObsAnthropicMetadata>,
#[serde(rename = "azure_openai_metadata")]
pub azure_openai_metadata: Option<crate::datadogV2::model::LLMObsAzureOpenAIMetadata>,
#[serde(rename = "bedrock_metadata")]
pub bedrock_metadata: Option<crate::datadogV2::model::LLMObsBedrockMetadata>,
#[serde(rename = "error_response")]
pub error_response: Option<crate::datadogV2::model::LLMObsInferenceErrorResponse>,
#[serde(
rename = "frequency_penalty",
default,
with = "::serde_with::rust::double_option"
)]
pub frequency_penalty: Option<Option<f64>>,
#[serde(
rename = "json_schema",
default,
with = "::serde_with::rust::double_option"
)]
pub json_schema: Option<Option<String>>,
#[serde(
rename = "max_completion_tokens",
default,
with = "::serde_with::rust::double_option"
)]
pub max_completion_tokens: Option<Option<i64>>,
#[serde(
rename = "max_tokens",
default,
with = "::serde_with::rust::double_option"
)]
pub max_tokens: Option<Option<i64>>,
#[serde(rename = "messages")]
pub messages: Vec<crate::datadogV2::model::LLMObsInferenceMessage>,
#[serde(rename = "model_id")]
pub model_id: String,
#[serde(rename = "openai_metadata")]
pub openai_metadata: Option<crate::datadogV2::model::LLMObsOpenAIMetadata>,
#[serde(
rename = "presence_penalty",
default,
with = "::serde_with::rust::double_option"
)]
pub presence_penalty: Option<Option<f64>>,
#[serde(rename = "response")]
pub response: crate::datadogV2::model::LLMObsInferenceRunResult,
#[serde(
rename = "temperature",
default,
with = "::serde_with::rust::double_option"
)]
pub temperature: Option<Option<f64>>,
#[serde(rename = "tools")]
pub tools: Option<Vec<crate::datadogV2::model::LLMObsInferenceTool>>,
#[serde(rename = "top_k", default, with = "::serde_with::rust::double_option")]
pub top_k: Option<Option<i64>>,
#[serde(rename = "top_p", default, with = "::serde_with::rust::double_option")]
pub top_p: Option<Option<f64>>,
#[serde(rename = "vertex_ai_metadata")]
pub vertex_ai_metadata: Option<crate::datadogV2::model::LLMObsVertexAIMetadata>,
#[serde(flatten)]
pub additional_properties: std::collections::BTreeMap<String, serde_json::Value>,
#[serde(skip)]
#[serde(default)]
pub(crate) _unparsed: bool,
}
impl LLMObsIntegrationInferenceResponse {
pub fn new(
messages: Vec<crate::datadogV2::model::LLMObsInferenceMessage>,
model_id: String,
response: crate::datadogV2::model::LLMObsInferenceRunResult,
) -> LLMObsIntegrationInferenceResponse {
LLMObsIntegrationInferenceResponse {
anthropic_metadata: None,
azure_openai_metadata: None,
bedrock_metadata: None,
error_response: None,
frequency_penalty: None,
json_schema: None,
max_completion_tokens: None,
max_tokens: None,
messages,
model_id,
openai_metadata: None,
presence_penalty: None,
response,
temperature: None,
tools: None,
top_k: None,
top_p: None,
vertex_ai_metadata: None,
additional_properties: std::collections::BTreeMap::new(),
_unparsed: false,
}
}
pub fn anthropic_metadata(
mut self,
value: crate::datadogV2::model::LLMObsAnthropicMetadata,
) -> Self {
self.anthropic_metadata = Some(value);
self
}
pub fn azure_openai_metadata(
mut self,
value: crate::datadogV2::model::LLMObsAzureOpenAIMetadata,
) -> Self {
self.azure_openai_metadata = Some(value);
self
}
pub fn bedrock_metadata(
mut self,
value: crate::datadogV2::model::LLMObsBedrockMetadata,
) -> Self {
self.bedrock_metadata = Some(value);
self
}
pub fn error_response(
mut self,
value: crate::datadogV2::model::LLMObsInferenceErrorResponse,
) -> Self {
self.error_response = Some(value);
self
}
pub fn frequency_penalty(mut self, value: Option<f64>) -> Self {
self.frequency_penalty = Some(value);
self
}
pub fn json_schema(mut self, value: Option<String>) -> Self {
self.json_schema = Some(value);
self
}
pub fn max_completion_tokens(mut self, value: Option<i64>) -> Self {
self.max_completion_tokens = Some(value);
self
}
pub fn max_tokens(mut self, value: Option<i64>) -> Self {
self.max_tokens = Some(value);
self
}
pub fn openai_metadata(mut self, value: crate::datadogV2::model::LLMObsOpenAIMetadata) -> Self {
self.openai_metadata = Some(value);
self
}
pub fn presence_penalty(mut self, value: Option<f64>) -> Self {
self.presence_penalty = Some(value);
self
}
pub fn temperature(mut self, value: Option<f64>) -> Self {
self.temperature = Some(value);
self
}
pub fn tools(mut self, value: Vec<crate::datadogV2::model::LLMObsInferenceTool>) -> Self {
self.tools = Some(value);
self
}
pub fn top_k(mut self, value: Option<i64>) -> Self {
self.top_k = Some(value);
self
}
pub fn top_p(mut self, value: Option<f64>) -> Self {
self.top_p = Some(value);
self
}
pub fn vertex_ai_metadata(
mut self,
value: crate::datadogV2::model::LLMObsVertexAIMetadata,
) -> Self {
self.vertex_ai_metadata = Some(value);
self
}
pub fn additional_properties(
mut self,
value: std::collections::BTreeMap<String, serde_json::Value>,
) -> Self {
self.additional_properties = value;
self
}
}
impl<'de> Deserialize<'de> for LLMObsIntegrationInferenceResponse {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
struct LLMObsIntegrationInferenceResponseVisitor;
impl<'a> Visitor<'a> for LLMObsIntegrationInferenceResponseVisitor {
type Value = LLMObsIntegrationInferenceResponse;
fn expecting(&self, f: &mut Formatter<'_>) -> fmt::Result {
f.write_str("a mapping")
}
fn visit_map<M>(self, mut map: M) -> Result<Self::Value, M::Error>
where
M: MapAccess<'a>,
{
let mut anthropic_metadata: Option<
crate::datadogV2::model::LLMObsAnthropicMetadata,
> = None;
let mut azure_openai_metadata: Option<
crate::datadogV2::model::LLMObsAzureOpenAIMetadata,
> = None;
let mut bedrock_metadata: Option<crate::datadogV2::model::LLMObsBedrockMetadata> =
None;
let mut error_response: Option<
crate::datadogV2::model::LLMObsInferenceErrorResponse,
> = None;
let mut frequency_penalty: Option<Option<f64>> = None;
let mut json_schema: Option<Option<String>> = None;
let mut max_completion_tokens: Option<Option<i64>> = None;
let mut max_tokens: Option<Option<i64>> = None;
let mut messages: Option<Vec<crate::datadogV2::model::LLMObsInferenceMessage>> =
None;
let mut model_id: Option<String> = None;
let mut openai_metadata: Option<crate::datadogV2::model::LLMObsOpenAIMetadata> =
None;
let mut presence_penalty: Option<Option<f64>> = None;
let mut response: Option<crate::datadogV2::model::LLMObsInferenceRunResult> = None;
let mut temperature: Option<Option<f64>> = None;
let mut tools: Option<Vec<crate::datadogV2::model::LLMObsInferenceTool>> = None;
let mut top_k: Option<Option<i64>> = None;
let mut top_p: Option<Option<f64>> = None;
let mut vertex_ai_metadata: Option<
crate::datadogV2::model::LLMObsVertexAIMetadata,
> = None;
let mut additional_properties: std::collections::BTreeMap<
String,
serde_json::Value,
> = std::collections::BTreeMap::new();
let mut _unparsed = false;
while let Some((k, v)) = map.next_entry::<String, serde_json::Value>()? {
match k.as_str() {
"anthropic_metadata" => {
if v.is_null() {
continue;
}
anthropic_metadata =
Some(serde_json::from_value(v).map_err(M::Error::custom)?);
}
"azure_openai_metadata" => {
if v.is_null() {
continue;
}
azure_openai_metadata =
Some(serde_json::from_value(v).map_err(M::Error::custom)?);
}
"bedrock_metadata" => {
if v.is_null() {
continue;
}
bedrock_metadata =
Some(serde_json::from_value(v).map_err(M::Error::custom)?);
}
"error_response" => {
if v.is_null() {
continue;
}
error_response =
Some(serde_json::from_value(v).map_err(M::Error::custom)?);
}
"frequency_penalty" => {
if v.as_str() == Some("") {
continue;
}
frequency_penalty =
Some(serde_json::from_value(v).map_err(M::Error::custom)?);
}
"json_schema" => {
json_schema =
Some(serde_json::from_value(v).map_err(M::Error::custom)?);
}
"max_completion_tokens" => {
max_completion_tokens =
Some(serde_json::from_value(v).map_err(M::Error::custom)?);
}
"max_tokens" => {
max_tokens = Some(serde_json::from_value(v).map_err(M::Error::custom)?);
}
"messages" => {
messages = Some(serde_json::from_value(v).map_err(M::Error::custom)?);
}
"model_id" => {
model_id = Some(serde_json::from_value(v).map_err(M::Error::custom)?);
}
"openai_metadata" => {
if v.is_null() {
continue;
}
openai_metadata =
Some(serde_json::from_value(v).map_err(M::Error::custom)?);
}
"presence_penalty" => {
if v.as_str() == Some("") {
continue;
}
presence_penalty =
Some(serde_json::from_value(v).map_err(M::Error::custom)?);
}
"response" => {
response = Some(serde_json::from_value(v).map_err(M::Error::custom)?);
}
"temperature" => {
if v.as_str() == Some("") {
continue;
}
temperature =
Some(serde_json::from_value(v).map_err(M::Error::custom)?);
}
"tools" => {
if v.is_null() {
continue;
}
tools = Some(serde_json::from_value(v).map_err(M::Error::custom)?);
}
"top_k" => {
top_k = Some(serde_json::from_value(v).map_err(M::Error::custom)?);
}
"top_p" => {
if v.as_str() == Some("") {
continue;
}
top_p = Some(serde_json::from_value(v).map_err(M::Error::custom)?);
}
"vertex_ai_metadata" => {
if v.is_null() {
continue;
}
vertex_ai_metadata =
Some(serde_json::from_value(v).map_err(M::Error::custom)?);
}
&_ => {
if let Ok(value) = serde_json::from_value(v.clone()) {
additional_properties.insert(k, value);
}
}
}
}
let messages = messages.ok_or_else(|| M::Error::missing_field("messages"))?;
let model_id = model_id.ok_or_else(|| M::Error::missing_field("model_id"))?;
let response = response.ok_or_else(|| M::Error::missing_field("response"))?;
let content = LLMObsIntegrationInferenceResponse {
anthropic_metadata,
azure_openai_metadata,
bedrock_metadata,
error_response,
frequency_penalty,
json_schema,
max_completion_tokens,
max_tokens,
messages,
model_id,
openai_metadata,
presence_penalty,
response,
temperature,
tools,
top_k,
top_p,
vertex_ai_metadata,
additional_properties,
_unparsed,
};
Ok(content)
}
}
deserializer.deserialize_any(LLMObsIntegrationInferenceResponseVisitor)
}
}