use async_trait::async_trait; use serde::{Deserialize, Serialize}; #[derive(Debug, Clone, Serialize, Deserialize)] pub struct Message { pub role: String, pub content: String, } #[derive(Debug, Clone, Serialize, Deserialize)] pub struct Tool { #[serde(rename = "type")] pub tool_type: String, pub function: ToolFunction, } #[derive(Debug, Clone, Serialize, Deserialize)] pub struct ToolFunction { pub name: String, pub description: String, pub parameters: serde_json::Value, } #[derive(Debug, Clone, Serialize, Deserialize)] pub struct ToolCall { pub id: String, pub name: String, pub arguments: serde_json::Value, } #[derive(Debug, Clone, Serialize, Deserialize)] pub struct ChatCompletionRequest { pub messages: Vec, pub temperature: Option, pub max_tokens: Option, pub tools: Option>, } #[derive(Debug, Clone, Serialize, Deserialize)] pub struct ChatCompletionResponse { pub id: String, pub model: String, pub content: String, pub tool_calls: Vec, pub usage: Usage, } #[derive(Debug, Clone, Serialize, Deserialize)] pub struct Usage { pub prompt_tokens: u32, pub completion_tokens: u32, pub total_tokens: u32, } #[async_trait] pub trait LLMProvider: Send + Sync { async fn chat( &self, request: ChatCompletionRequest, ) -> Result>; fn ptype(&self) -> &str; fn name(&self) -> &str; fn model_id(&self) -> &str; }