aboutsummaryrefslogtreecommitdiffstats
path: root/packages/shared/config.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/shared/config.ts')
-rw-r--r--packages/shared/config.ts32
1 files changed, 32 insertions, 0 deletions
diff --git a/packages/shared/config.ts b/packages/shared/config.ts
index 60beae1e..cfcf1532 100644
--- a/packages/shared/config.ts
+++ b/packages/shared/config.ts
@@ -58,6 +58,8 @@ const allEnv = z.object({
TURNSTILE_SECRET_KEY: z.string().optional(),
OPENAI_API_KEY: z.string().optional(),
OPENAI_BASE_URL: z.string().url().optional(),
+ OPENAI_PROXY_URL: z.string().url().optional(),
+ OPENAI_SERVICE_TIER: z.enum(["auto", "default", "flex"]).optional(),
OLLAMA_BASE_URL: z.string().url().optional(),
OLLAMA_KEEP_ALIVE: z.string().optional(),
INFERENCE_JOB_TIMEOUT_SEC: z.coerce.number().default(30),
@@ -80,6 +82,7 @@ const allEnv = z.object({
.default("eng")
.transform((val) => val.split(",")),
OCR_CONFIDENCE_THRESHOLD: z.coerce.number().default(50),
+ OCR_USE_LLM: stringBool("false"),
CRAWLER_HEADLESS_BROWSER: stringBool("true"),
BROWSER_WEB_URL: z.string().optional(),
BROWSER_WEBSOCKET_URL: z.string().optional(),
@@ -93,10 +96,12 @@ const allEnv = z.object({
SEARCH_JOB_TIMEOUT_SEC: z.coerce.number().default(30),
WEBHOOK_NUM_WORKERS: z.coerce.number().default(1),
ASSET_PREPROCESSING_NUM_WORKERS: z.coerce.number().default(1),
+ ASSET_PREPROCESSING_JOB_TIMEOUT_SEC: z.coerce.number().default(60),
RULE_ENGINE_NUM_WORKERS: z.coerce.number().default(1),
CRAWLER_DOWNLOAD_BANNER_IMAGE: stringBool("true"),
CRAWLER_STORE_SCREENSHOT: stringBool("true"),
CRAWLER_FULL_PAGE_SCREENSHOT: stringBool("false"),
+ CRAWLER_STORE_PDF: stringBool("false"),
CRAWLER_FULL_PAGE_ARCHIVE: stringBool("false"),
CRAWLER_VIDEO_DOWNLOAD: stringBool("false"),
CRAWLER_VIDEO_DOWNLOAD_MAX_SIZE: z.coerce.number().default(50),
@@ -122,8 +127,11 @@ const allEnv = z.object({
INFERENCE_LANG: z.string().default("english"),
WEBHOOK_TIMEOUT_SEC: z.coerce.number().default(5),
WEBHOOK_RETRY_TIMES: z.coerce.number().int().min(0).default(3),
+ MAX_RSS_FEEDS_PER_USER: z.coerce.number().default(1000),
+ MAX_WEBHOOKS_PER_USER: z.coerce.number().default(100),
// Build only flag
SERVER_VERSION: z.string().optional(),
+ CHANGELOG_VERSION: z.string().optional(),
DISABLE_NEW_RELEASE_CHECK: stringBool("false"),
// A flag to detect if the user is running in the old separete containers setup
@@ -205,6 +213,12 @@ const allEnv = z.object({
// Database configuration
DB_WAL_MODE: stringBool("false"),
+
+ // OpenTelemetry tracing configuration
+ OTEL_TRACING_ENABLED: stringBool("false"),
+ OTEL_EXPORTER_OTLP_ENDPOINT: z.string().url().optional(),
+ OTEL_SERVICE_NAME: z.string().default("karakeep"),
+ OTEL_SAMPLE_RATE: z.coerce.number().min(0).max(1).default(1.0),
});
const serverConfigSchema = allEnv.transform((val, ctx) => {
@@ -264,6 +278,8 @@ const serverConfigSchema = allEnv.transform((val, ctx) => {
fetchTimeoutSec: val.INFERENCE_FETCH_TIMEOUT_SEC,
openAIApiKey: val.OPENAI_API_KEY,
openAIBaseUrl: val.OPENAI_BASE_URL,
+ openAIProxyUrl: val.OPENAI_PROXY_URL,
+ openAIServiceTier: val.OPENAI_SERVICE_TIER,
ollamaBaseUrl: val.OLLAMA_BASE_URL,
ollamaKeepAlive: val.OLLAMA_KEEP_ALIVE,
textModel: val.INFERENCE_TEXT_MODEL,
@@ -296,6 +312,7 @@ const serverConfigSchema = allEnv.transform((val, ctx) => {
downloadBannerImage: val.CRAWLER_DOWNLOAD_BANNER_IMAGE,
storeScreenshot: val.CRAWLER_STORE_SCREENSHOT,
fullPageScreenshot: val.CRAWLER_FULL_PAGE_SCREENSHOT,
+ storePdf: val.CRAWLER_STORE_PDF,
fullPageArchive: val.CRAWLER_FULL_PAGE_ARCHIVE,
downloadVideo: val.CRAWLER_VIDEO_DOWNLOAD,
maxVideoDownloadSize: val.CRAWLER_VIDEO_DOWNLOAD_MAX_SIZE,
@@ -321,6 +338,7 @@ const serverConfigSchema = allEnv.transform((val, ctx) => {
langs: val.OCR_LANGS,
cacheDir: val.OCR_CACHE_DIR,
confidenceThreshold: val.OCR_CONFIDENCE_THRESHOLD,
+ useLLM: val.OCR_USE_LLM,
},
search: {
numWorkers: val.SEARCH_NUM_WORKERS,
@@ -338,12 +356,17 @@ const serverConfigSchema = allEnv.transform((val, ctx) => {
assetsDir: val.ASSETS_DIR ?? path.join(val.DATA_DIR, "assets"),
maxAssetSizeMb: val.MAX_ASSET_SIZE_MB,
serverVersion: val.SERVER_VERSION,
+ changelogVersion: val.CHANGELOG_VERSION,
disableNewReleaseCheck: val.DISABLE_NEW_RELEASE_CHECK,
usingLegacySeparateContainers: val.USING_LEGACY_SEPARATE_CONTAINERS,
webhook: {
timeoutSec: val.WEBHOOK_TIMEOUT_SEC,
retryTimes: val.WEBHOOK_RETRY_TIMES,
numWorkers: val.WEBHOOK_NUM_WORKERS,
+ maxWebhooksPerUser: val.MAX_WEBHOOKS_PER_USER,
+ },
+ feeds: {
+ maxRssFeedsPerUser: val.MAX_RSS_FEEDS_PER_USER,
},
proxy: {
httpProxy: val.CRAWLER_HTTP_PROXY,
@@ -353,6 +376,7 @@ const serverConfigSchema = allEnv.transform((val, ctx) => {
allowedInternalHostnames: val.CRAWLER_ALLOWED_INTERNAL_HOSTNAMES,
assetPreprocessing: {
numWorkers: val.ASSET_PREPROCESSING_NUM_WORKERS,
+ jobTimeoutSec: val.ASSET_PREPROCESSING_JOB_TIMEOUT_SEC,
},
ruleEngine: {
numWorkers: val.RULE_ENGINE_NUM_WORKERS,
@@ -399,6 +423,12 @@ const serverConfigSchema = allEnv.transform((val, ctx) => {
database: {
walMode: val.DB_WAL_MODE,
},
+ tracing: {
+ enabled: val.OTEL_TRACING_ENABLED,
+ otlpEndpoint: val.OTEL_EXPORTER_OTLP_ENDPOINT,
+ serviceName: val.OTEL_SERVICE_NAME,
+ sampleRate: val.OTEL_SAMPLE_RATE,
+ },
};
if (obj.auth.emailVerificationRequired && !obj.email.smtp) {
ctx.addIssue({
@@ -441,6 +471,8 @@ export const clientConfig = {
inference: {
isConfigured: serverConfig.inference.isConfigured,
inferredTagLang: serverConfig.inference.inferredTagLang,
+ enableAutoTagging: serverConfig.inference.enableAutoTagging,
+ enableAutoSummarization: serverConfig.inference.enableAutoSummarization,
},
serverVersion: serverConfig.serverVersion,
disableNewReleaseCheck: serverConfig.disableNewReleaseCheck,