openai_protocol/
models.rs1use std::collections::HashSet;
7
8use serde::{Deserialize, Serialize};
9use serde_json::Value;
10
11use super::{model_card::ModelCard, worker::ProviderType};
12
13#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
15pub struct ModelObject {
16 pub id: String,
18 pub object: String,
20 pub created: i64,
22 pub owned_by: String,
24}
25
26#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
28pub struct ListModelsResponse {
29 pub object: String,
31 pub data: Vec<ModelObject>,
33}
34
35impl ListModelsResponse {
36 pub fn from_model_cards(cards: impl IntoIterator<Item = ModelCard>) -> Self {
40 let mut seen = HashSet::new();
41 let data = cards
42 .into_iter()
43 .filter(|card| seen.insert(card.id.clone()))
44 .map(ModelCard::into_model_object)
45 .collect();
46 Self {
47 object: "list".to_owned(),
48 data,
49 }
50 }
51
52 pub fn parse_upstream(json: &Value, provider: Option<ProviderType>) -> Vec<ModelCard> {
58 let Some(data) = json.get("data").and_then(|d| d.as_array()) else {
59 return Vec::new();
60 };
61 data.iter()
62 .filter_map(|m| m.get("id").and_then(|id| id.as_str()))
63 .map(|id| {
64 let mut card = ModelCard::new(id);
65 card.provider.clone_from(&provider);
66 card
67 })
68 .collect()
69 }
70}