diff --git a/crates/brightstaff/src/handlers/models.rs b/crates/brightstaff/src/handlers/models.rs index 7f3427a0..5e4b55b2 100644 --- a/crates/brightstaff/src/handlers/models.rs +++ b/crates/brightstaff/src/handlers/models.rs @@ -1,6 +1,6 @@ use bytes::Bytes; -use common::api::open_ai::Models; -use common::configuration::LlmProvider; +use common::configuration::{IntoModels, LlmProvider}; +use hermesllm::providers::openai::types::Models; use http_body_util::{combinators::BoxBody, BodyExt, Full}; use hyper::{Response, StatusCode}; use serde_json; @@ -11,7 +11,7 @@ pub async fn list_models( ) -> Response> { let prov = llm_providers.clone(); let providers = (*prov).clone(); - let openai_models = Models::from(providers); + let openai_models: Models = providers.into_models(); match serde_json::to_string(&openai_models) { Ok(json) => { diff --git a/crates/common/src/configuration.rs b/crates/common/src/configuration.rs index 5438b03e..b4982fcd 100644 --- a/crates/common/src/configuration.rs +++ b/crates/common/src/configuration.rs @@ -1,3 +1,4 @@ +use hermesllm::providers::openai::types::{ModelDetail, ModelObject, Models}; use serde::{Deserialize, Serialize}; use std::collections::HashMap; use std::fmt::Display; @@ -206,6 +207,30 @@ pub struct LlmProvider { pub usage: Option, } +pub trait IntoModels { + fn into_models(self) -> Models; +} + +impl IntoModels for Vec { + fn into_models(self) -> Models { + let data = self + .iter() + .map(|provider| ModelDetail { + id: provider.name.clone(), + object: "model".to_string(), + created: 0, + owned_by: "system".to_string(), + }) + .collect(); + + Models { + object: ModelObject::List, + data, + } + } +} + + impl Default for LlmProvider { fn default() -> Self { Self { diff --git a/crates/hermesllm/src/providers/openai/types.rs b/crates/hermesllm/src/providers/openai/types.rs index 66f0dc29..470103b2 100644 --- a/crates/hermesllm/src/providers/openai/types.rs +++ b/crates/hermesllm/src/providers/openai/types.rs @@ -202,6 +202,26 @@ impl<'a> TryFrom<&'a [u8]> for SseChatCompletionIter> { } } +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct ModelDetail { + pub id: String, + pub object: String, + pub created: usize, + pub owned_by: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub enum ModelObject { + #[serde(rename = "list")] + List, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct Models { + pub object: ModelObject, + pub data: Vec, +} + #[cfg(test)] mod tests { use super::*;