1pub mod models;
2
3use anyhow::Result;
4use reqwest::{ Client, header::{ HeaderMap, HeaderValue } };
5
6use crate::models::{ ChatCompletionRequest, ChatCompletionResponse };
7
8#[derive(Debug, Clone)]
10pub struct Groq {
11 client: Client,
12}
13
14impl Groq {
15 pub fn new<K: AsRef<str>>(token: K) -> Self {
16 let mut headers = HeaderMap::new();
17 headers.append(
18 "Authorization",
19 HeaderValue::from_str(&format!("Bearer {}", token.as_ref())).unwrap()
20 );
21
22 Self { client: Client::builder().default_headers(headers).build().unwrap() }
23 }
24
25 pub async fn create_chat_completion(
27 &self,
28 request: ChatCompletionRequest
29 ) -> Result<ChatCompletionResponse> {
30 let res = self.client
31 .post("https://api.groq.com/openai/v1/chat/completions")
32 .json(&request)
33 .send().await?;
34
35 let status = res.status();
36 if status.is_success() {
37 Ok(res.json().await?)
38 } else {
39 Err(anyhow::anyhow!("Error ({}):\n{:#?}", status, res.text().await?))
40 }
41 }
42}
43
44#[cfg(test)]
45mod tests {
46 use crate::models::{ ChatCompletionRequest, ChatMessage, ChatRole };
47
48 #[test]
49 fn lol() {
50 let messages = vec![ChatMessage {
51 role: ChatRole::User,
52 content: "hEllo".into(),
53 name: None,
54 }];
55 let rq = ChatCompletionRequest::builder().model("waltuh").messages(&messages).build();
56 println!("{rq:#?}");
57 }
58}