openai_client_cli/service/
client.rs

1use crate::{loaders::*, service::*, traits::*, Result};
2use http::header::AUTHORIZATION;
3use reqwest::{
4  Client as ReqwestClient,
5  Response,
6};
7use tracing::info;
8
9/// The client to send the OpenAI API requests.
10pub struct OpenAIClient {
11  key: Key,
12  organization: Option<Organization>,
13}
14
15impl OpenAIClient {
16  /// Create a new client.
17  pub fn new(key: Key, organization: Option<Organization>) -> Self {
18    Self { key, organization }
19  }
20
21  /// Send a request to the OpenAI API and receive the response.
22  pub async fn send(&self, request: OpenAIRequest) -> Result<Response> {
23    let method = request.method.value();
24    let url = request.url;
25    let authorization = format!("Bearer {}", self.key.value_ref());
26    let organization = self.organization
27      .as_ref()
28      .map(Loader::value_ref);
29    let body = request.parameter
30      .as_ref()
31      .map(Loader::value_ref);
32
33    let client = ReqwestClient::new();
34
35    info!("Sending request to {:?}", url.to_string());
36    let mut request = client.request(method, url);
37    request = request.header(AUTHORIZATION, authorization);
38    if let Some(organization) = organization {
39      request = request.header("OpenAI-Organization", organization);
40    }
41    if let Some(body) = body {
42      request = request.json(body);
43    }
44    let response = request.send().await?;
45    info!("Received the API response: {}", response.status());
46    Ok(response)
47  }
48}