Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions env.example
Original file line number Diff line number Diff line change
Expand Up @@ -230,6 +230,14 @@ MAX_FILE_PATHS=100 # 最大文件路径数(默认100)
# 最多缓存多少个租户实例(超过后会使用 LRU 策略清理)
MAX_TENANT_INSTANCES=50

# ====== 性能监控配置 ======

# --- Metrics 缓存大小配置 ---
# 控制性能监控模块的历史数据缓存大小
# METRICS_RESPONSE_TIMES_CACHE_SIZE=500 # API 响应时间缓存大小(默认 500)
# METRICS_DOC_METRICS_CACHE_SIZE=5000 # 文档处理指标缓存大小(默认 5000)
# METRICS_ALERTS_CACHE_SIZE=500 # 告警记录缓存大小(默认 500)

# ====== RAG-Anything VLM 增强配置 ======
# 用于控制 MinerU 远程模式下的图表处理质量

Expand Down
48 changes: 38 additions & 10 deletions src/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,9 @@
重构原因: 统一配置管理,从服务商导向改为功能导向命名
"""

import os
from typing import Optional
from pydantic import Field
from pydantic_settings import BaseSettings


# ==================== LLM Configuration ====================

class LLMConfig(BaseSettings):
Expand All @@ -28,7 +25,7 @@ class LLMConfig(BaseSettings):
# Rate limiting
requests_per_minute: int = Field(default=800, description="Maximum requests per minute")
tokens_per_minute: int = Field(default=40000, description="Maximum tokens per minute (input + output)")
max_async: Optional[int] = Field(default=None, description="Maximum concurrent requests (optional, auto-calculated if not set)")
max_async: int | None = Field(default=None, description="Maximum concurrent requests (optional, auto-calculated if not set)")

class Config:
env_prefix = "LLM_"
Expand All @@ -55,7 +52,7 @@ class EmbeddingConfig(BaseSettings):
# Rate limiting
requests_per_minute: int = Field(default=1600, description="Maximum requests per minute")
tokens_per_minute: int = Field(default=400000, description="Maximum tokens per minute")
max_async: Optional[int] = Field(default=None, description="Maximum concurrent requests (optional, auto-calculated if not set)")
max_async: int | None = Field(default=None, description="Maximum concurrent requests (optional, auto-calculated if not set)")
timeout: int = Field(default=30, description="HTTP request timeout (seconds)")

class Config:
Expand All @@ -79,7 +76,7 @@ class RerankConfig(BaseSettings):
# Rate limiting
requests_per_minute: int = Field(default=1600, description="Maximum requests per minute")
tokens_per_minute: int = Field(default=400000, description="Maximum tokens per minute")
max_async: Optional[int] = Field(default=None, description="Maximum concurrent requests (optional, auto-calculated if not set)")
max_async: int | None = Field(default=None, description="Maximum concurrent requests (optional, auto-calculated if not set)")
timeout: int = Field(default=30, description="HTTP request timeout (seconds)")

class Config:
Expand Down Expand Up @@ -147,7 +144,7 @@ class DeepSeekOCRConfig(BaseSettings):
# Rate limiting
requests_per_minute: int = Field(default=800, description="Maximum requests per minute")
tokens_per_minute: int = Field(default=40000, description="Maximum tokens per minute")
max_async: Optional[int] = Field(default=None, description="Maximum concurrent requests (optional, auto-calculated if not set)")
max_async: int | None = Field(default=None, description="Maximum concurrent requests (optional, auto-calculated if not set)")

class Config:
env_prefix = "DS_OCR_"
Expand Down Expand Up @@ -247,16 +244,43 @@ class Config:
populate_by_name = True


# ==================== Metrics Configuration ====================

class MetricsConfig(BaseSettings):
"""Metrics Cache Size Configuration"""

response_times_cache_size: int = Field(
default=500,
description="Cache size for API response times (after truncation)",
alias="METRICS_RESPONSE_TIMES_CACHE_SIZE"
)
doc_metrics_cache_size: int = Field(
default=5000,
description="Cache size for document metrics (after truncation)",
alias="METRICS_DOC_METRICS_CACHE_SIZE"
)
alerts_cache_size: int = Field(
default=500,
description="Cache size for alerts (after truncation)",
alias="METRICS_ALERTS_CACHE_SIZE"
)

class Config:
env_file = ".env"
extra = "ignore"
populate_by_name = True


# ==================== Tenant Configuration (for override) ====================

class TenantConfig:
"""Tenant Configuration (Used for Overriding Global Config)"""

def __init__(
self,
llm_config: Optional[dict] = None,
embedding_config: Optional[dict] = None,
rerank_config: Optional[dict] = None,
llm_config: dict | None = None,
embedding_config: dict | None = None,
rerank_config: dict | None = None,
quota_daily_queries: int = 1000,
quota_storage_mb: int = 1000,
status: str = "active"
Expand Down Expand Up @@ -294,6 +318,7 @@ def __init__(self):
self.storage = StorageConfig()
self.lightrag_query = LightRAGQueryConfig()
self.multi_tenant = MultiTenantConfig()
self.metrics = MetricsConfig()

def validate(self) -> None:
"""Validate Configuration Integrity"""
Expand Down Expand Up @@ -334,6 +359,9 @@ def print_summary(self) -> None:
print(f"Storage - Graph: {self.storage.graph_storage}")
print(f"Storage - DocStatus: {self.storage.doc_status_storage}")
print(f"Max Tenant Instances: {self.multi_tenant.max_tenant_instances}")
print(f"Metrics - Response Times Cache: {self.metrics.response_times_cache_size}")
print(f"Metrics - Doc Metrics Cache: {self.metrics.doc_metrics_cache_size}")
print(f"Metrics - Alerts Cache: {self.metrics.alerts_cache_size}")
print("=" * 60)


Expand Down
Loading