1use async_trait::async_trait;
2use crate::types::{ChatCompletionRequest, ChatCompletionResponse, AiLibError};
3use futures::stream::Stream;
4
5#[async_trait]
12pub trait ChatApi: Send + Sync {
13 async fn chat_completion(
21 &self,
22 request: ChatCompletionRequest,
23 ) -> Result<ChatCompletionResponse, AiLibError>;
24
25 async fn chat_completion_stream(
33 &self,
34 request: ChatCompletionRequest,
35 ) -> Result<Box<dyn Stream<Item = Result<ChatCompletionChunk, AiLibError>> + Send + Unpin>, AiLibError>;
36
37 async fn list_models(&self) -> Result<Vec<String>, AiLibError>;
42
43 async fn get_model_info(&self, model_id: &str) -> Result<ModelInfo, AiLibError>;
51}
52
53#[derive(Debug, Clone)]
57pub struct ChatCompletionChunk {
58 pub id: String,
59 pub object: String,
60 pub created: u64,
61 pub model: String,
62 pub choices: Vec<ChoiceDelta>,
63}
64
65#[derive(Debug, Clone)]
69pub struct ChoiceDelta {
70 pub index: u32,
71 pub delta: MessageDelta,
72 pub finish_reason: Option<String>,
73}
74
75#[derive(Debug, Clone)]
79pub struct MessageDelta {
80 pub role: Option<Role>,
81 pub content: Option<String>,
82}
83
84#[derive(Debug, Clone)]
88pub struct ModelInfo {
89 pub id: String,
90 pub object: String,
91 pub created: u64,
92 pub owned_by: String,
93 pub permission: Vec<ModelPermission>,
94}
95
96#[derive(Debug, Clone)]
100pub struct ModelPermission {
101 pub id: String,
102 pub object: String,
103 pub created: u64,
104 pub allow_create_engine: bool,
105 pub allow_sampling: bool,
106 pub allow_logprobs: bool,
107 pub allow_search_indices: bool,
108 pub allow_view: bool,
109 pub allow_fine_tuning: bool,
110 pub organization: String,
111 pub group: Option<String>,
112 pub is_blocking: bool,
113}
114
115use crate::types::Role;