use crate::resources::v1::buffers::models::{
V1ReplayBuffer, V1ReplayBufferRequest, V1UpdateReplayBufferRequest,
};
use nebulous::models::V1ResourceMeta;
use nebulous::models::V1ResourceMetaRequest;
use nebulous::resources::v1::containers::models::{
V1Container, V1ContainerRequest, V1UpdateContainer,
};
use serde::{Deserialize, Serialize};
#[derive(Deserialize, Serialize, Clone, Debug)]
pub struct V1OnlineLLMRequest {
pub metadata: V1ResourceMetaRequest,
pub model: String,
pub buffer: V1BufferOptionRequest,
pub server: V1ServerOptionRequest,
pub chat_schema: Option<String>,
}
#[derive(Deserialize, Serialize, Clone, Debug)]
pub struct V1UpdateOnlineLLMRequest {
pub model: Option<String>,
pub buffer: Option<V1UpdateBufferOption>,
pub server: Option<V1UpdateServerOption>,
pub chat_schema: Option<String>,
pub no_delete: Option<bool>,
}
#[derive(Deserialize, Serialize, Clone, Default)]
pub struct V1OnlineLLMStatus {
pub is_online: Option<bool>,
pub endpoint: Option<String>,
pub last_error: Option<String>,
}
#[derive(Deserialize, Serialize, Clone, Default)]
pub struct V1OnlineLLM {
pub metadata: V1ResourceMeta,
pub model: String,
pub buffer: V1ReplayBuffer,
pub server: V1Container,
pub chat_schema: Option<String>,
pub status: V1OnlineLLMStatus,
}
#[derive(Deserialize, Serialize, Clone, Default)]
pub struct V1OnlineLLMs {
pub llms: Vec<V1OnlineLLM>,
}
#[derive(Deserialize, Serialize, Clone, Debug)]
#[serde(untagged)]
pub enum V1BufferOption {
Id(String),
Buffer(V1ReplayBuffer),
}
#[derive(Deserialize, Serialize, Clone, Debug)]
#[serde(untagged)]
pub enum V1UpdateBufferOption {
Id(String),
Buffer(V1UpdateReplayBufferRequest),
}
#[derive(Deserialize, Serialize, Clone, Debug)]
#[serde(untagged)]
pub enum V1BufferOptionRequest {
Id(String),
Buffer(V1ReplayBufferRequest),
}
#[derive(Deserialize, Serialize, Clone, Debug)]
#[serde(untagged)]
pub enum V1ServerOption {
Ref(V1ResourceReference),
Server(V1Container),
}
#[derive(Deserialize, Serialize, Clone, Debug)]
#[serde(untagged)]
pub enum V1UpdateServerOption {
Ref(V1ResourceReference),
Server(V1UpdateContainer),
}
#[derive(Deserialize, Serialize, Clone, Debug)]
pub struct V1ResourceReference {
pub kind: String,
pub name: String,
pub namespace: String,
}
impl V1ResourceReference {
pub fn to_string_encoded(&self) -> String {
format!("{}.{}.{}", self.name, self.namespace, self.kind)
}
pub fn from_str_encoded(encoded: &str) -> Result<Self, String> {
let parts: Vec<&str> = encoded.split('.').collect();
if parts.len() != 3 {
return Err(format!(
"Invalid reference string: expected 3 parts, got {}",
parts.len()
));
}
Ok(Self {
name: parts[0].to_string(),
namespace: parts[1].to_string(),
kind: parts[2].to_string(),
})
}
}
#[derive(Deserialize, Serialize, Clone, Debug)]
#[serde(untagged)]
pub enum V1ServerOptionRequest {
Ref(V1ResourceReference),
Server(V1ContainerRequest),
}