use serde::{Deserialize, Serialize};
use crate::api::{ContentBlock, Message, ToolDefinition};
use crate::types::ModelId;
#[derive(Debug, Clone)]
pub struct InferenceRequest {
pub model: ModelId,
pub messages: Vec<Message>,
pub tools: Vec<ToolDefinition>,
pub max_tokens: u32,
pub temperature: Option<f32>,
pub system: String,
}
#[derive(Debug, Clone)]
pub struct InferenceResponse {
pub content: Vec<ContentBlock>,
pub stop_reason: String,
pub usage: Usage,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Usage {
pub input_tokens: u32,
pub output_tokens: u32,
}
#[async_trait::async_trait]
pub trait InferenceProvider: Send + Sync {
async fn infer(
&self,
req: &InferenceRequest,
) -> Result<InferenceResponse, Box<dyn std::error::Error + Send + Sync>>;
fn name(&self) -> &str;
fn model(&self) -> &ModelId;
fn validate_config(&self) -> Result<(), Box<dyn std::error::Error + Send + Sync>>;
fn supports_tool_use(&self) -> bool {
true
}
}