use async_trait::async_trait;
use serde::{Deserialize, Serialize};
use serde_json::Value;
use anyhow::Result;
#[async_trait]
pub trait Provider: Send + Sync {
async fn complete(
&self,
messages: Vec<Message>,
tools: Option<Vec<Tool>>,
max_tokens: Option<u32>,
system_prompt: Option<String>
) -> Result<CompletionResponse>;
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Message {
pub role: String, pub content: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Tool {
pub name: String,
pub description: String,
pub input_schema: Value,
}
#[derive(Debug, Clone)]
pub struct CompletionResponse {
pub text: Option<String>,
pub tool_calls: Vec<ToolCall>,
pub stop_reason: StopReason,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ToolCall {
pub id: String,
pub name: String,
pub input: Value,
}
#[derive(Debug, Clone, PartialEq)]
pub enum StopReason {
EndTurn, ToolUse, MaxTokens, ContentFilter, Error, }