use async_trait::async_trait;
use serde::{Deserialize, Serialize};
use serde_json::Value;
use crate::error::Result;
use crate::message::Message;
pub mod mock;
pub mod openai;
pub use mock::MockProvider;
pub use openai::OpenAiProvider;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ToolSpec {
pub name: String,
pub description: String,
pub parameters: Value,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ToolCall {
pub id: String,
pub name: String,
pub arguments: Value,
}
#[derive(Debug, Clone)]
pub struct Completion {
pub content: String,
pub tool_calls: Vec<ToolCall>,
pub finish_reason: Option<String>,
}
#[async_trait]
pub trait LlmProvider: Send + Sync {
async fn complete(&self, messages: &[Message], tools: &[ToolSpec]) -> Result<Completion>;
}