groqu/
lib.rs

1pub mod models;
2
3use anyhow::Result;
4use reqwest::{ Client, header::{ HeaderMap, HeaderValue } };
5
6use crate::models::{ ChatCompletionRequest, ChatCompletionResponse };
7
8/// Represents the Groq client.
9#[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    /// Creates chat completion.
26    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}