1use async_trait::async_trait;
9use serde::{Deserialize, Serialize};
10use serde_json::Value;
11
12use crate::error::Result;
13use crate::message::Message;
14
15pub mod mock;
16pub mod openai;
17
18pub use mock::MockProvider;
19pub use openai::OpenAiProvider;
20
21#[derive(Debug, Clone, Serialize, Deserialize)]
23pub struct ToolSpec {
24 pub name: String,
25 pub description: String,
26 pub parameters: Value,
28}
29
30#[derive(Debug, Clone, Serialize, Deserialize)]
32pub struct ToolCall {
33 pub id: String,
34 pub name: String,
35 pub arguments: Value,
37}
38
39#[derive(Debug, Clone)]
41pub struct Completion {
42 pub content: String,
43 pub tool_calls: Vec<ToolCall>,
44 pub finish_reason: Option<String>,
45}
46
47#[async_trait]
48pub trait LlmProvider: Send + Sync {
49 async fn complete(&self, messages: &[Message], tools: &[ToolSpec]) -> Result<Completion>;
50}