chore: fix private open api key in config (#1112)

* chore: fix private open api key in config

* chore: fmt
This commit is contained in:
Nathan.fooo 2025-01-02 13:03:01 +08:00 committed by GitHub
parent 21d5325235
commit 3ee52ad8d0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
9 changed files with 24 additions and 17 deletions

1
Cargo.lock generated
View File

@ -4231,6 +4231,7 @@ dependencies = [
"prometheus-client", "prometheus-client",
"rayon", "rayon",
"redis 0.25.4", "redis 0.25.4",
"secrecy",
"serde", "serde",
"serde_json", "serde_json",
"sqlx", "sqlx",

View File

@ -241,7 +241,6 @@ prometheus-client = "0.22.0"
brotli = "3.4.0" brotli = "3.4.0"
collab-stream = { path = "libs/collab-stream" } collab-stream = { path = "libs/collab-stream" }
dotenvy = "0.15.7" dotenvy = "0.15.7"
secrecy = { version = "0.8", features = ["serde"] }
serde_json = "1.0.111" serde_json = "1.0.111"
serde_repr = "0.1.18" serde_repr = "0.1.18"
serde = { version = "1.0.195", features = ["derive"] } serde = { version = "1.0.195", features = ["derive"] }
@ -292,7 +291,7 @@ chrono = { version = "0.4.39", features = [
], default-features = false } ], default-features = false }
http = "0.2.12" http = "0.2.12"
tokio-tungstenite = "0.20" tokio-tungstenite = "0.20"
secrecy = { version = "0.8.0", features = ["serde"] }
# collaboration # collaboration
yrs = { version = "0.21.3", features = ["sync"] } yrs = { version = "0.21.3", features = ["sync"] }
collab = { version = "0.2.0" } collab = { version = "0.2.0" }

View File

@ -38,3 +38,4 @@ redis = { workspace = true, features = [
"connection-manager", "connection-manager",
] } ] }
tokio-util = "0.7.12" tokio-util = "0.7.12"
secrecy = { workspace = true, features = ["serde"] }

View File

@ -18,6 +18,7 @@ use database_entity::dto::AFCollabEmbeddedChunk;
use infra::env_util::get_env_var; use infra::env_util::get_env_var;
use rayon::prelude::*; use rayon::prelude::*;
use redis::aio::ConnectionManager; use redis::aio::ConnectionManager;
use secrecy::{ExposeSecret, Secret};
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use sqlx::PgPool; use sqlx::PgPool;
use std::cmp::max; use std::cmp::max;
@ -49,7 +50,7 @@ pub struct IndexerScheduler {
#[derive(Debug)] #[derive(Debug)]
pub struct IndexerConfiguration { pub struct IndexerConfiguration {
pub enable: bool, pub enable: bool,
pub openai_api_key: String, pub openai_api_key: Secret<String>,
/// High watermark for the number of embeddings that can be buffered before being written to the database. /// High watermark for the number of embeddings that can be buffered before being written to the database.
pub embedding_buffer_size: usize, pub embedding_buffer_size: usize,
} }
@ -129,7 +130,7 @@ impl IndexerScheduler {
} }
// if openai api key is empty, return false // if openai api key is empty, return false
if self.config.openai_api_key.is_empty() { if self.config.openai_api_key.expose_secret().is_empty() {
return false; return false;
} }
@ -141,14 +142,14 @@ impl IndexerScheduler {
} }
pub(crate) fn create_embedder(&self) -> Result<Embedder, AppError> { pub(crate) fn create_embedder(&self) -> Result<Embedder, AppError> {
if self.config.openai_api_key.is_empty() { if self.config.openai_api_key.expose_secret().is_empty() {
return Err(AppError::AIServiceUnavailable( return Err(AppError::AIServiceUnavailable(
"OpenAI API key is empty".to_string(), "OpenAI API key is empty".to_string(),
)); ));
} }
Ok(Embedder::OpenAI(open_ai::Embedder::new( Ok(Embedder::OpenAI(open_ai::Embedder::new(
self.config.openai_api_key.clone(), self.config.openai_api_key.expose_secret().clone(),
))) )))
} }

View File

@ -15,7 +15,7 @@ use aws_sdk_s3::operation::create_bucket::CreateBucketError;
use aws_sdk_s3::types::{ use aws_sdk_s3::types::{
BucketInfo, BucketLocationConstraint, BucketType, CreateBucketConfiguration, BucketInfo, BucketLocationConstraint, BucketType, CreateBucketConfiguration,
}; };
use secrecy::ExposeSecret; use secrecy::{ExposeSecret, Secret};
use sqlx::postgres::PgPoolOptions; use sqlx::postgres::PgPoolOptions;
use sqlx::PgPool; use sqlx::PgPool;
use tracing::info; use tracing::info;
@ -158,7 +158,7 @@ pub async fn init_state(config: &Config, rt_cmd_tx: CLCommandSender) -> Result<A
enable: get_env_var("APPFLOWY_INDEXER_ENABLED", "true") enable: get_env_var("APPFLOWY_INDEXER_ENABLED", "true")
.parse::<bool>() .parse::<bool>()
.unwrap_or(true), .unwrap_or(true),
openai_api_key: get_env_var("APPFLOWY_AI_OPENAI_API_KEY", ""), openai_api_key: Secret::new(get_env_var("APPFLOWY_AI_OPENAI_API_KEY", "")),
embedding_buffer_size: get_env_var("APPFLOWY_INDEXER_EMBEDDING_BUFFER_SIZE", "2000") embedding_buffer_size: get_env_var("APPFLOWY_INDEXER_EMBEDDING_BUFFER_SIZE", "2000")
.parse::<usize>() .parse::<usize>()
.unwrap_or(2000), .unwrap_or(2000),

View File

@ -46,7 +46,7 @@ sqlx = { workspace = true, default-features = false, features = [
"chrono", "chrono",
"migrate", "migrate",
] } ] }
secrecy = { version = "0.8", features = ["serde"] } secrecy = { workspace = true, features = ["serde"] }
aws-sdk-s3 = { version = "1.36.0", features = [ aws-sdk-s3 = { version = "1.36.0", features = [
"behavior-version-latest", "behavior-version-latest",
"rt-tokio", "rt-tokio",

View File

@ -11,7 +11,6 @@ use crate::import_worker::email_notifier::EmailNotifier;
use crate::s3_client::S3ClientImpl; use crate::s3_client::S3ClientImpl;
use axum::Router; use axum::Router;
use secrecy::ExposeSecret;
use crate::mailer::AFWorkerMailer; use crate::mailer::AFWorkerMailer;
use crate::metric::ImportMetrics; use crate::metric::ImportMetrics;
@ -24,6 +23,7 @@ use indexer::metrics::EmbeddingMetrics;
use indexer::thread_pool::ThreadPoolNoAbortBuilder; use indexer::thread_pool::ThreadPoolNoAbortBuilder;
use infra::env_util::get_env_var; use infra::env_util::get_env_var;
use mailer::sender::Mailer; use mailer::sender::Mailer;
use secrecy::{ExposeSecret, Secret};
use std::sync::{Arc, Once}; use std::sync::{Arc, Once};
use std::time::Duration; use std::time::Duration;
use tokio::net::TcpListener; use tokio::net::TcpListener;
@ -144,7 +144,10 @@ pub async fn create_app(listener: TcpListener, config: Config) -> Result<(), Err
enable: appflowy_collaborate::config::get_env_var("APPFLOWY_INDEXER_ENABLED", "true") enable: appflowy_collaborate::config::get_env_var("APPFLOWY_INDEXER_ENABLED", "true")
.parse::<bool>() .parse::<bool>()
.unwrap_or(true), .unwrap_or(true),
open_api_key: appflowy_collaborate::config::get_env_var("APPFLOWY_AI_OPENAI_API_KEY", ""), open_api_key: Secret::new(appflowy_collaborate::config::get_env_var(
"APPFLOWY_AI_OPENAI_API_KEY",
"",
)),
tick_interval_secs: 10, tick_interval_secs: 10,
}, },
)); ));

View File

@ -15,6 +15,7 @@ use indexer::vector::embedder::Embedder;
use indexer::vector::open_ai; use indexer::vector::open_ai;
use rayon::prelude::*; use rayon::prelude::*;
use redis::aio::ConnectionManager; use redis::aio::ConnectionManager;
use secrecy::{ExposeSecret, Secret};
use sqlx::PgPool; use sqlx::PgPool;
use std::sync::Arc; use std::sync::Arc;
use std::time::{Duration, Instant}; use std::time::{Duration, Instant};
@ -23,10 +24,9 @@ use tokio::sync::RwLock;
use tokio::time::{interval, MissedTickBehavior}; use tokio::time::{interval, MissedTickBehavior};
use tracing::{error, info, trace}; use tracing::{error, info, trace};
#[derive(Debug)]
pub struct BackgroundIndexerConfig { pub struct BackgroundIndexerConfig {
pub enable: bool, pub enable: bool,
pub open_api_key: String, pub open_api_key: Secret<String>,
pub tick_interval_secs: u64, pub tick_interval_secs: u64,
} }
@ -42,7 +42,7 @@ pub async fn run_background_indexer(
return; return;
} }
if config.open_api_key.is_empty() { if config.open_api_key.expose_secret().is_empty() {
error!("OpenAI API key is not set. Stop background indexer"); error!("OpenAI API key is not set. Stop background indexer");
return; return;
} }
@ -243,5 +243,7 @@ fn handle_task(
} }
fn create_embedder(config: &BackgroundIndexerConfig) -> Embedder { fn create_embedder(config: &BackgroundIndexerConfig) -> Embedder {
Embedder::OpenAI(open_ai::Embedder::new(config.open_api_key.clone())) Embedder::OpenAI(open_ai::Embedder::new(
config.open_api_key.expose_secret().clone(),
))
} }

View File

@ -327,7 +327,7 @@ pub async fn init_state(config: &Config, rt_cmd_tx: CLCommandSender) -> Result<A
enable: get_env_var("APPFLOWY_INDEXER_ENABLED", "true") enable: get_env_var("APPFLOWY_INDEXER_ENABLED", "true")
.parse::<bool>() .parse::<bool>()
.unwrap_or(true), .unwrap_or(true),
openai_api_key: get_env_var("APPFLOWY_AI_OPENAI_API_KEY", ""), openai_api_key: Secret::new(get_env_var("APPFLOWY_AI_OPENAI_API_KEY", "")),
embedding_buffer_size: appflowy_collaborate::config::get_env_var( embedding_buffer_size: appflowy_collaborate::config::get_env_var(
"APPFLOWY_INDEXER_EMBEDDING_BUFFER_SIZE", "APPFLOWY_INDEXER_EMBEDDING_BUFFER_SIZE",
"5000", "5000",