use serde::{Deserialize, Serialize};
use crate::model::Ceiling;
use crate::reach::Reach;
#[derive(Debug, Clone, PartialEq, Eq, Default, Serialize, Deserialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub struct ModelFacts {
pub id: String,
pub context_tokens: Option<u64>,
pub max_output_tokens: Option<Ceiling>,
pub input_modalities: Vec<String>,
pub input_price: Option<String>,
pub output_price: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub struct EndpointProbed {
pub name: String,
pub base_url: String,
pub reach: Reach,
pub models: Vec<String>,
pub facts: Vec<ModelFacts>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub failed: Option<ProbeFailure>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub struct ProbeFailure {
pub code: String,
pub subject: String,
}
#[cfg(test)]
#[allow(clippy::unwrap_used, reason = "test code")]
mod tests {
use super::*;
use crate::event::Payload;
#[test]
fn a_probed_line_keeps_the_bytes_its_ledger_already_holds() {
let line = concat!(
r#"{"base_url":"http://127.0.0.1:1","facts":[],"#,
r#""failed":{"code":"E_PROVIDER","subject":"m"},"models":[],"name":"local","#,
r#""reach":{"answered":{"detail":"no socket","state":"unreachable"},"#,
r#""connected":{"state":"refused"},"elapsed_ms":3,"host":"127.0.0.1","#,
r#""named":{"detail":1,"state":"resolved"},"through":{"state":"direct"}}}"#,
);
let read: EndpointProbed = serde_json::from_str::<Payload>(line)
.unwrap()
.read()
.unwrap();
assert_eq!(
serde_json::to_string(&Payload::of(&read).unwrap()).unwrap(),
line
);
}
}