looprs_core/ports/
inference_provider.rs1use serde::{Deserialize, Serialize};
4
5use crate::api::{ContentBlock, Message, ToolDefinition};
6use crate::types::ModelId;
7
8#[derive(Debug, Clone)]
10pub struct InferenceRequest {
11 pub model: ModelId,
12 pub messages: Vec<Message>,
13 pub tools: Vec<ToolDefinition>,
14 pub max_tokens: u32,
15 pub temperature: Option<f32>,
16 pub system: String,
17}
18
19#[derive(Debug, Clone)]
21pub struct InferenceResponse {
22 pub content: Vec<ContentBlock>,
23 pub stop_reason: String,
24 pub usage: Usage,
25}
26
27#[derive(Debug, Clone, Serialize, Deserialize)]
29pub struct Usage {
30 pub input_tokens: u32,
31 pub output_tokens: u32,
32}
33
34#[async_trait::async_trait]
38pub trait InferenceProvider: Send + Sync {
44 async fn infer(
46 &self,
47 req: &InferenceRequest,
48 ) -> Result<InferenceResponse, Box<dyn std::error::Error + Send + Sync>>;
49
50 fn name(&self) -> &str;
52
53 fn model(&self) -> &ModelId;
55
56 fn validate_config(&self) -> Result<(), Box<dyn std::error::Error + Send + Sync>>;
58
59 fn supports_tool_use(&self) -> bool {
61 true
62 }
63}