Skip to content

Commit dbde022

Browse files
authored
Use secrecy for OpenAIConfig and AzureConfig (64bit#114)
* Use `secrecy` for OpenAIConfig and AzureConfig * return Secret<String> in api_key()
1 parent 3db68af commit dbde022

File tree

2 files changed

+15
-33
lines changed

2 files changed

+15
-33
lines changed

async-openai/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ tokio-util = { version = "0.7.7", features = ["codec", "io-util"] }
3939
tracing = "0.1.37"
4040
derive_builder = "0.12.0"
4141
async-convert = "1.0.0"
42+
secrecy = { version = "0.8.0", features=["serde"] }
4243

4344
[dev-dependencies]
4445
tokio-test = "0.4.2"

async-openai/src/config.rs

Lines changed: 14 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
//! Client configurations: [OpenAIConfig] for OpenAI, [AzureConfig] for Azure OpenAI Service.
22
use reqwest::header::{HeaderMap, AUTHORIZATION};
3+
use secrecy::{ExposeSecret, Secret};
34
use serde::Deserialize;
45

56
/// Default v1 API base url
@@ -16,33 +17,23 @@ pub trait Config: Clone {
1617

1718
fn api_base(&self) -> &str;
1819

19-
fn api_key(&self) -> &str;
20+
fn api_key(&self) -> &Secret<String>;
2021
}
2122

2223
/// Configuration for OpenAI API
23-
#[derive(Clone, Deserialize)]
24+
#[derive(Clone, Debug, Deserialize)]
2425
#[serde(default)]
2526
pub struct OpenAIConfig {
2627
api_base: String,
27-
api_key: String,
28+
api_key: Secret<String>,
2829
org_id: String,
2930
}
3031

31-
impl std::fmt::Debug for OpenAIConfig {
32-
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
33-
f.debug_struct("OpenAIConfig")
34-
.field("api_base", &self.api_base)
35-
.field("api_key", &"[redacted]")
36-
.field("org_id", &self.org_id)
37-
.finish()
38-
}
39-
}
40-
4132
impl Default for OpenAIConfig {
4233
fn default() -> Self {
4334
Self {
4435
api_base: OPENAI_API_BASE.to_string(),
45-
api_key: std::env::var("OPENAI_API_KEY").unwrap_or_else(|_| "".to_string()),
36+
api_key: std::env::var("OPENAI_API_KEY").unwrap_or_else(|_| "".to_string()).into(),
4637
org_id: Default::default(),
4738
}
4839
}
@@ -62,7 +53,7 @@ impl OpenAIConfig {
6253

6354
/// To use a different API key different from default OPENAI_API_KEY env var
6455
pub fn with_api_key<S: Into<String>>(mut self, api_key: S) -> Self {
65-
self.api_key = api_key.into();
56+
self.api_key = Secret::from(api_key.into());
6657
self
6758
}
6859

@@ -89,7 +80,7 @@ impl Config for OpenAIConfig {
8980

9081
headers.insert(
9182
AUTHORIZATION,
92-
format!("Bearer {}", self.api_key).as_str().parse().unwrap(),
83+
format!("Bearer {}", self.api_key.expose_secret()).as_str().parse().unwrap(),
9384
);
9485

9586
headers
@@ -103,7 +94,7 @@ impl Config for OpenAIConfig {
10394
&self.api_base
10495
}
10596

106-
fn api_key(&self) -> &str {
97+
fn api_key(&self) -> &Secret<String> {
10798
&self.api_key
10899
}
109100

@@ -113,31 +104,21 @@ impl Config for OpenAIConfig {
113104
}
114105

115106
/// Configuration for Azure OpenAI Service
116-
#[derive(Clone, Deserialize)]
107+
#[derive(Clone, Debug, Deserialize)]
117108
#[serde(default)]
118109
pub struct AzureConfig {
119110
api_version: String,
120111
deployment_id: String,
121112
api_base: String,
122-
api_key: String,
113+
api_key: Secret<String>,
123114
}
124115

125-
impl std::fmt::Debug for AzureConfig {
126-
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
127-
f.debug_struct("AzureConfig")
128-
.field("api_version", &self.api_version)
129-
.field("deployment_id", &self.deployment_id)
130-
.field("api_base", &self.api_base)
131-
.field("api_key", &"[redacted]")
132-
.finish()
133-
}
134-
}
135116

136117
impl Default for AzureConfig {
137118
fn default() -> Self {
138119
Self {
139120
api_base: Default::default(),
140-
api_key: std::env::var("OPENAI_API_KEY").unwrap_or_else(|_| "".to_string()),
121+
api_key: std::env::var("OPENAI_API_KEY").unwrap_or_else(|_| "".to_string()).into(),
141122
deployment_id: Default::default(),
142123
api_version: Default::default(),
143124
}
@@ -161,7 +142,7 @@ impl AzureConfig {
161142

162143
/// To use a different API key different from default OPENAI_API_KEY env var
163144
pub fn with_api_key<S: Into<String>>(mut self, api_key: S) -> Self {
164-
self.api_key = api_key.into();
145+
self.api_key = Secret::from(api_key.into());
165146
self
166147
}
167148

@@ -176,7 +157,7 @@ impl Config for AzureConfig {
176157
fn headers(&self) -> HeaderMap {
177158
let mut headers = HeaderMap::new();
178159

179-
headers.insert("api-key", self.api_key.as_str().parse().unwrap());
160+
headers.insert("api-key", self.api_key.expose_secret().as_str().parse().unwrap());
180161

181162
headers
182163
}
@@ -192,7 +173,7 @@ impl Config for AzureConfig {
192173
&self.api_base
193174
}
194175

195-
fn api_key(&self) -> &str {
176+
fn api_key(&self) -> &Secret<String> {
196177
&self.api_key
197178
}
198179

0 commit comments

Comments
 (0)