#[cfg(feature = "websocket")]
pub mod websocket;
#[cfg(feature = "mqtt")]
pub mod mqtt;
#[cfg(feature = "grpc")]
pub mod grpc;
#[cfg(feature = "rest")]
pub mod rest;
#[cfg(feature = "websocket")]
pub use websocket::WebSocketAdapter;
#[cfg(feature = "mqtt")]
pub use mqtt::MqttAdapter;
#[cfg(feature = "grpc")]
pub use grpc::GrpcAdapter;
#[cfg(feature = "rest")]
pub use rest::{RestAdapter, RestServer};
use scirs2_core::ndarray::Array1;
use serde::{Deserialize, Serialize};
#[cfg(feature = "async")]
use crate::error::InferenceResult;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct InferenceMessage {
pub request_id: String,
pub input: Vec<f32>,
#[serde(default)]
pub config: MessageConfig,
pub timestamp: i64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct InferenceResponse {
pub request_id: String,
pub output: Vec<f32>,
pub latency_ms: f64,
pub num_tokens: usize,
pub timestamp: i64,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct MessageConfig {
pub temperature: Option<f32>,
pub top_k: Option<usize>,
pub top_p: Option<f32>,
pub max_tokens: Option<usize>,
}
impl InferenceMessage {
pub fn new(request_id: impl Into<String>, input: Vec<f32>) -> Self {
Self {
request_id: request_id.into(),
input,
config: MessageConfig::default(),
timestamp: chrono::Utc::now().timestamp_millis(),
}
}
pub fn to_array(&self) -> Array1<f32> {
Array1::from_vec(self.input.clone())
}
}
impl InferenceResponse {
pub fn new(
request_id: impl Into<String>,
output: Vec<f32>,
latency_ms: f64,
num_tokens: usize,
) -> Self {
Self {
request_id: request_id.into(),
output,
latency_ms,
num_tokens,
timestamp: chrono::Utc::now().timestamp_millis(),
}
}
pub fn to_array(&self) -> Array1<f32> {
Array1::from_vec(self.output.clone())
}
}
#[cfg(feature = "async")]
pub trait NetworkAdapter {
fn start(&mut self) -> impl std::future::Future<Output = InferenceResult<()>>;
fn stop(&mut self) -> impl std::future::Future<Output = InferenceResult<()>>;
fn is_running(&self) -> bool;
}