chore: fix private open api key in config (#1112)
* chore: fix private open api key in config * chore: fmt
This commit is contained in:
parent
21d5325235
commit
3ee52ad8d0
|
|
@ -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",
|
||||||
|
|
|
||||||
|
|
@ -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" }
|
||||||
|
|
|
||||||
|
|
@ -37,4 +37,5 @@ redis = { workspace = true, features = [
|
||||||
"tokio-comp",
|
"tokio-comp",
|
||||||
"connection-manager",
|
"connection-manager",
|
||||||
] }
|
] }
|
||||||
tokio-util = "0.7.12"
|
tokio-util = "0.7.12"
|
||||||
|
secrecy = { workspace = true, features = ["serde"] }
|
||||||
|
|
|
||||||
|
|
@ -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(),
|
||||||
)))
|
)))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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),
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
},
|
},
|
||||||
));
|
));
|
||||||
|
|
|
||||||
|
|
@ -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(),
|
||||||
|
))
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue