log:简化启动时log

This commit is contained in:
SengokuCola
2026-05-06 16:06:21 +08:00
parent 98294b39ad
commit 3bdc2a9f70
20 changed files with 35 additions and 77 deletions

View File

@@ -130,7 +130,7 @@ export function Layout({ children }: LayoutProps) {
key="settings-sidebar" key="settings-sidebar"
className="relative z-40 hidden shrink-0 lg:block" className="relative z-40 hidden shrink-0 lg:block"
initial={{ width: 0, opacity: 0 }} initial={{ width: 0, opacity: 0 }}
animate={{ width: sidebarOpen ? 224 : 64, opacity: 1 }} animate={{ width: sidebarOpen ? 208 : 64, opacity: 1 }}
exit={{ width: 0, opacity: 0 }} exit={{ width: 0, opacity: 0 }}
transition={{ transition={{
type: 'spring', type: 'spring',

View File

@@ -32,8 +32,8 @@ export function Sidebar({
'fixed inset-y-0 left-0 z-50 isolate flex flex-col border-r transition-all duration-300 lg:relative lg:z-0 lg:h-full', 'fixed inset-y-0 left-0 z-50 isolate flex flex-col border-r transition-all duration-300 lg:relative lg:z-0 lg:h-full',
inheritsPageBackground ? 'bg-transparent' : 'bg-card', inheritsPageBackground ? 'bg-transparent' : 'bg-card',
// 移动端始终显示完整宽度,桌面端根据 sidebarOpen 切换 // 移动端始终显示完整宽度,桌面端根据 sidebarOpen 切换
'w-56 lg:w-auto', 'w-52 lg:w-auto',
sidebarOpen ? 'lg:w-56' : 'lg:w-16', sidebarOpen ? 'lg:w-52' : 'lg:w-16',
mobileMenuOpen ? 'translate-x-0' : '-translate-x-full lg:translate-x-0' mobileMenuOpen ? 'translate-x-0' : '-translate-x-full lg:translate-x-0'
)} )}
> >

View File

@@ -183,7 +183,7 @@
--layout-space-lg: 1.5rem; --layout-space-lg: 1.5rem;
--layout-space-xl: 2rem; --layout-space-xl: 2rem;
--layout-space-2xl: 3rem; --layout-space-2xl: 3rem;
--layout-sidebar-width: 14rem; --layout-sidebar-width: 13rem;
--layout-header-height: 3.5rem; --layout-header-height: 3.5rem;
--layout-max-content-width: 1280px; --layout-max-content-width: 1280px;

View File

@@ -225,7 +225,7 @@ export const defaultLightTokens: ThemeTokens = {
'space-lg': '1.5rem', 'space-lg': '1.5rem',
'space-xl': '2rem', 'space-xl': '2rem',
'space-2xl': '3rem', 'space-2xl': '3rem',
'sidebar-width': '16rem', 'sidebar-width': '13rem',
'header-height': '3.5rem', 'header-height': '3.5rem',
'max-content-width': '1280px', 'max-content-width': '1280px',
}, },
@@ -320,7 +320,7 @@ export const defaultDarkTokens: ThemeTokens = {
'space-lg': '1.5rem', 'space-lg': '1.5rem',
'space-xl': '2rem', 'space-xl': '2rem',
'space-2xl': '3rem', 'space-2xl': '3rem',
'sidebar-width': '16rem', 'sidebar-width': '13rem',
'header-height': '3.5rem', 'header-height': '3.5rem',
'max-content-width': '1280px', 'max-content-width': '1280px',
}, },

View File

@@ -113,22 +113,6 @@ export const FeaturesSection = React.memo(function FeaturesSection({
</p> </p>
<div className="flex items-center space-x-2">
<Switch
id="global_memory"
checked={memoryConfig.global_memory ?? false}
onCheckedChange={(checked) =>
onMemoryChange({ ...memoryConfig, global_memory: checked })
}
/>
<Label htmlFor="global_memory" className="cursor-pointer">
</Label>
</div>
<p className="text-xs text-muted-foreground -mt-2">
</p>
{/* 聊天历史总结配置 */} {/* 聊天历史总结配置 */}
<div className="border-t pt-4 mt-4"> <div className="border-t pt-4 mt-4">
<h4 className="text-sm font-semibold mb-3"></h4> <h4 className="text-sm font-semibold mb-3"></h4>

View File

@@ -84,7 +84,6 @@ export interface MemoryConfig {
max_agent_iterations: number max_agent_iterations: number
agent_timeout_seconds: number agent_timeout_seconds: number
enable_jargon_detection: boolean enable_jargon_detection: boolean
global_memory: boolean
chat_history_topic_check_message_threshold: number chat_history_topic_check_message_threshold: number
chat_history_topic_check_time_hours: number chat_history_topic_check_time_hours: number
chat_history_topic_check_min_messages: number chat_history_topic_check_min_messages: number

View File

@@ -605,12 +605,12 @@ export function AppearanceTab() {
<div className="flex justify-between"> <div className="flex justify-between">
<Label>{t('settings.appearance.sidebarWidthLabel')}</Label> <Label>{t('settings.appearance.sidebarWidthLabel')}</Label>
<span className="text-sm text-muted-foreground"> <span className="text-sm text-muted-foreground">
{getTokenValue(themeConfig.tokenOverrides, 'layout', 'sidebar-width', '16rem')} {getTokenValue(themeConfig.tokenOverrides, 'layout', 'sidebar-width', '13rem')}
</span> </span>
</div> </div>
<Slider <Slider
defaultValue={[16]} defaultValue={[16]}
value={[parseFloat(getTokenValue(themeConfig.tokenOverrides, 'layout', 'sidebar-width', '16'))]} value={[parseFloat(getTokenValue(themeConfig.tokenOverrides, 'layout', 'sidebar-width', '13'))]}
min={12} min={12}
max={24} max={24}
step={0.5} step={0.5}

View File

@@ -60,10 +60,10 @@ class EmbeddingAPIAdapter:
self._total_time = 0.0 self._total_time = 0.0
logger.info( logger.info(
"EmbeddingAPIAdapter 初始化: " "Embedding 初始化: "
f"batch_size={self.batch_size}, " f"batch={self.batch_size}, "
f"max_concurrent={self.max_concurrent}, " f"concurrent={self.max_concurrent}, "
f"configured_dim={self.default_dimension}, " f"dim={self.default_dimension}, "
f"model={self.model_name}" f"model={self.model_name}"
) )
@@ -258,10 +258,10 @@ class EmbeddingAPIAdapter:
if cached_dimension is not None: if cached_dimension is not None:
self._dimension = int(cached_dimension) self._dimension = int(cached_dimension)
self._dimension_detected = True self._dimension_detected = True
logger.info(f"嵌入维度命中进程缓存: {self._dimension}") logger.debug(f"嵌入维度命中进程缓存: {self._dimension}")
return self._dimension return self._dimension
logger.info("正在检测嵌入模型维度...") logger.info("检测嵌入维度...")
try: try:
target_dim = self.default_dimension target_dim = self.default_dimension
logger.debug(f"尝试请求指定维度: {target_dim}") logger.debug(f"尝试请求指定维度: {target_dim}")
@@ -269,7 +269,7 @@ class EmbeddingAPIAdapter:
if test_embedding and isinstance(test_embedding, list): if test_embedding and isinstance(test_embedding, list):
detected_dim = len(test_embedding) detected_dim = len(test_embedding)
if detected_dim == target_dim: if detected_dim == target_dim:
logger.info(f"嵌入维度检测成功 (匹配 configured/requested): {detected_dim}") logger.info(f"嵌入维度: {detected_dim}")
else: else:
logger.warning( logger.warning(
f"requested_dimension={target_dim} 但模型返回 detected_dimension={detected_dim},将使用真实输出维度" f"requested_dimension={target_dim} 但模型返回 detected_dimension={detected_dim},将使用真实输出维度"
@@ -288,7 +288,7 @@ class EmbeddingAPIAdapter:
self._dimension = detected_dim self._dimension = detected_dim
self._dimension_detected = True self._dimension_detected = True
self._GLOBAL_DIMENSION_CACHE[cache_key] = int(detected_dim) self._GLOBAL_DIMENSION_CACHE[cache_key] = int(detected_dim)
logger.info(f"嵌入维度检测成功 (自然维度): {detected_dim}") logger.info(f"嵌入维度: {detected_dim} (自然输出)")
return detected_dim return detected_dim
logger.warning(f"嵌入维度检测失败,使用 configured_dimension: {self.default_dimension}") logger.warning(f"嵌入维度检测失败,使用 configured_dimension: {self.default_dimension}")
except Exception as exc: except Exception as exc:

View File

@@ -249,7 +249,7 @@ class DualPathRetriever:
config=self.config.graph_recall, config=self.config.graph_recall,
) )
logger.info( logger.debug(
f"DualPathRetriever 初始化: " f"DualPathRetriever 初始化: "
f"strategy={self.config.retrieval_strategy.value}, " f"strategy={self.config.retrieval_strategy.value}, "
f"top_k_para={self.config.top_k_paragraphs}, " f"top_k_para={self.config.top_k_paragraphs}, "

View File

@@ -88,7 +88,7 @@ class PersonalizedPageRank:
self._total_iterations = 0 self._total_iterations = 0
self._convergence_history: List[int] = [] self._convergence_history: List[int] = []
logger.info( logger.debug(
f"PersonalizedPageRank 初始化: " f"PersonalizedPageRank 初始化: "
f"alpha={self.config.alpha}, " f"alpha={self.config.alpha}, "
f"max_iter={self.config.max_iter}" f"max_iter={self.config.max_iter}"

View File

@@ -122,7 +122,7 @@ class SparseBM25Index:
self._conn = conn self._conn = conn
self._loaded = True self._loaded = True
self._prepare_tokenizer() self._prepare_tokenizer()
logger.info( logger.debug(
"SparseBM25Index loaded: " "SparseBM25Index loaded: "
f"backend=fts5, tokenizer={self.config.tokenizer_mode}, mode={self.config.mode}" f"backend=fts5, tokenizer={self.config.tokenizer_mode}, mode={self.config.mode}"
) )

View File

@@ -99,7 +99,7 @@ class DynamicThresholdFilter:
self._total_processed = 0 self._total_processed = 0
self._threshold_history: List[float] = [] self._threshold_history: List[float] = []
logger.info( logger.debug(
f"DynamicThresholdFilter 初始化: " f"DynamicThresholdFilter 初始化: "
f"method={self.config.method.value}, " f"method={self.config.method.value}, "
f"min_threshold={self.config.min_threshold}" f"min_threshold={self.config.min_threshold}"

View File

@@ -161,7 +161,7 @@ async def initialize_storage_async(plugin: Any) -> None:
try: try:
detected_dimension = await plugin.embedding_manager._detect_dimension() detected_dimension = await plugin.embedding_manager._detect_dimension()
logger.info(f"嵌入维度检测成功: {detected_dimension}") logger.info(f"嵌入维度: {detected_dimension}")
except Exception as e: except Exception as e:
logger.warning(f"嵌入维度检测失败: {e},使用默认值") logger.warning(f"嵌入维度检测失败: {e},使用默认值")
detected_dimension = plugin.embedding_manager.default_dimension detected_dimension = plugin.embedding_manager.default_dimension
@@ -194,11 +194,11 @@ async def initialize_storage_async(plugin: Any) -> None:
matrix_format=matrix_format, matrix_format=matrix_format,
data_dir=data_dir / "graph", data_dir=data_dir / "graph",
) )
logger.info("图存储初始化完成") logger.debug("图存储初始化完成")
plugin.metadata_store = MetadataStore(data_dir=data_dir / "metadata") plugin.metadata_store = MetadataStore(data_dir=data_dir / "metadata")
plugin.metadata_store.connect() plugin.metadata_store.connect()
logger.info("元数据存储初始化完成") logger.debug("元数据存储初始化完成")
plugin.relation_write_service = RelationWriteService( plugin.relation_write_service = RelationWriteService(
metadata_store=plugin.metadata_store, metadata_store=plugin.metadata_store,
@@ -233,7 +233,7 @@ async def initialize_storage_async(plugin: Any) -> None:
if plugin.vector_store.has_data(): if plugin.vector_store.has_data():
try: try:
plugin.vector_store.load() plugin.vector_store.load()
logger.info(f"向量数据已加载,共 {plugin.vector_store.num_vectors} 个向量") logger.debug(f"向量数据已加载,共 {plugin.vector_store.num_vectors} 个向量")
except Exception as e: except Exception as e:
logger.warning(f"加载向量数据失败: {e}") logger.warning(f"加载向量数据失败: {e}")
@@ -259,7 +259,7 @@ async def initialize_storage_async(plugin: Any) -> None:
if plugin.graph_store.has_data(): if plugin.graph_store.has_data():
try: try:
plugin.graph_store.load() plugin.graph_store.load()
logger.info(f"图数据已加载,共 {plugin.graph_store.num_nodes} 个节点") logger.debug(f"图数据已加载,共 {plugin.graph_store.num_nodes} 个节点")
except Exception as e: except Exception as e:
logger.warning(f"加载图数据失败: {e}") logger.warning(f"加载图数据失败: {e}")

View File

@@ -222,7 +222,7 @@ def build_search_runtime(
) )
runtime.threshold_filter = DynamicThresholdFilter(threshold_config) runtime.threshold_filter = DynamicThresholdFilter(threshold_config)
runtime.error = "" runtime.error = ""
log.info(f"{prefix_text}[{owner}] 检索运行时初始化完成") log.info(f"{prefix_text}[{owner}] 检索运行时就绪")
except Exception as e: except Exception as e:
runtime.retriever = None runtime.retriever = None
runtime.threshold_filter = None runtime.threshold_filter = None

View File

@@ -119,7 +119,7 @@ class GraphStore:
# V5: 简单的异步锁 (实际上 asyncio 环境下单线程主循环可能不需要,但为了安全保留) # V5: 简单的异步锁 (实际上 asyncio 环境下单线程主循环可能不需要,但为了安全保留)
self._lock = asyncio.Lock() self._lock = asyncio.Lock()
logger.info(f"GraphStore 初始化: format={matrix_format}") logger.debug(f"图存储初始化: format={matrix_format}")
def _canonicalize(self, node: str) -> str: def _canonicalize(self, node: str) -> str:
"""规范化节点名称 (用于去重和内部索引)""" """规范化节点名称 (用于去重和内部索引)"""
@@ -1317,8 +1317,8 @@ class GraphStore:
self._adjacency_dirty = True self._adjacency_dirty = True
logger.info( logger.info(
f"图存储已加载: {len(self._nodes)} 个节点, " f"图存储已加载: 节点={len(self._nodes)}, "
f"{self._adjacency.nnz if self._adjacency is not None else 0} 条边" f"边={self._adjacency.nnz if self._adjacency is not None else 0}"
) )
def _expand_adjacency_matrix(self, added_nodes: int) -> None: def _expand_adjacency_matrix(self, added_nodes: int) -> None:

View File

@@ -72,7 +72,7 @@ class MetadataStore:
self._is_initialized = False self._is_initialized = False
self._db_path: Optional[Path] = None self._db_path: Optional[Path] = None
logger.info(f"MetadataStore 初始化: db={db_name}") logger.debug(f"元数据存储初始化: db={db_name}")
def connect( def connect(
self, self,
@@ -114,7 +114,7 @@ class MetadataStore:
self._conn.execute("PRAGMA temp_store=MEMORY") self._conn.execute("PRAGMA temp_store=MEMORY")
self._conn.execute("PRAGMA foreign_keys = ON") # 开启外键约束支持级联删除 self._conn.execute("PRAGMA foreign_keys = ON") # 开启外键约束支持级联删除
logger.info(f"连接到数据库: {db_path}") logger.info(f"数据库已连接: {db_path}")
# 初始化或校验 schema # 初始化或校验 schema
if not self._is_initialized: if not self._is_initialized:

View File

@@ -108,7 +108,7 @@ class VectorStore:
# Thread safety lock # Thread safety lock
self._lock = threading.RLock() self._lock = threading.RLock()
logger.info(f"VectorStore Init: dim={dimension}, SQ8 Mode, Append-Only Storage") logger.info(f"向量存储初始化: dim={dimension}, mode=SQ8")
def _init_index(self): def _init_index(self):
"""初始化空的 Faiss 索引""" """初始化空的 Faiss 索引"""
@@ -379,7 +379,7 @@ class VectorStore:
预热状态摘要 预热状态摘要
""" """
started = time.perf_counter() started = time.perf_counter()
logger.info(f"metric.vector_index_prewarm_started=1 force_train={bool(force_train)}") logger.debug(f"metric.vector_index_prewarm_started=1 force_train={bool(force_train)}")
try: try:
with self._lock: with self._lock:
@@ -435,7 +435,7 @@ class VectorStore:
) )
return summary return summary
logger.info( logger.debug(
"metric.vector_index_prewarm_success=1 " "metric.vector_index_prewarm_success=1 "
f"metric.vector_index_prewarm_duration_ms={summary['duration_ms']:.2f} " f"metric.vector_index_prewarm_duration_ms={summary['duration_ms']:.2f} "
f"trained={summary['trained']} " f"trained={summary['trained']} "

View File

@@ -57,7 +57,7 @@ MODEL_CONFIG_PATH: Path = (CONFIG_DIR / "model_config.toml").resolve().absolute(
LEGACY_ENV_PATH: Path = (PROJECT_ROOT / ".env").resolve().absolute() LEGACY_ENV_PATH: Path = (PROJECT_ROOT / ".env").resolve().absolute()
A_MEMORIX_LEGACY_CONFIG_PATH: Path = (CONFIG_DIR / "a_memorix.toml").resolve().absolute() A_MEMORIX_LEGACY_CONFIG_PATH: Path = (CONFIG_DIR / "a_memorix.toml").resolve().absolute()
MMC_VERSION: str = "1.0.0-pre.11" MMC_VERSION: str = "1.0.0-pre.11"
CONFIG_VERSION: str = "8.10.7" CONFIG_VERSION: str = "8.10.8"
MODEL_CONFIG_VERSION: str = "1.15.3" MODEL_CONFIG_VERSION: str = "1.15.3"
logger = get_logger("config") logger = get_logger("config")

View File

@@ -392,11 +392,6 @@ def try_migrate_legacy_bot_config_dict(data: dict[str, Any]) -> MigrationResult:
migrated_any = True migrated_any = True
reasons.append("visual.visual_style_removed") reasons.append("visual.visual_style_removed")
memory = _as_dict(data.get("memory"))
if memory is not None and _migrate_target_item_list(memory, "global_memory_blacklist"):
migrated_any = True
reasons.append("memory.global_memory_blacklist")
keyword_reaction = _as_dict(data.get("keyword_reaction")) keyword_reaction = _as_dict(data.get("keyword_reaction"))
if keyword_reaction is not None: if keyword_reaction is not None:
if _drop_empty_keyword_rules(keyword_reaction, "keyword_rules"): if _drop_empty_keyword_rules(keyword_reaction, "keyword_rules"):

View File

@@ -472,26 +472,6 @@ class MemoryConfig(ConfigBase):
__ui_parent__ = "a_memorix" __ui_parent__ = "a_memorix"
global_memory: bool = Field(
default=False,
json_schema_extra={
"x-widget": "switch",
"x-icon": "globe",
},
)
"""是否允许记忆检索在聊天记录中进行全局查询忽略当前chat_id仅对 search_chat_history 等工具生效)"""
global_memory_blacklist: list[TargetItem] = Field(
default_factory=lambda: [],
json_schema_extra={
"x-widget": "custom",
"x-icon": "shield-off",
},
)
"""_wrap_全局记忆黑名单当启用全局记忆时不将特定聊天流纳入检索"""
enable_memory_query_tool: bool = Field( enable_memory_query_tool: bool = Field(
default=True, default=True,
json_schema_extra={ json_schema_extra={