log:简化启动时log
This commit is contained in:
@@ -130,7 +130,7 @@ export function Layout({ children }: LayoutProps) {
|
||||
key="settings-sidebar"
|
||||
className="relative z-40 hidden shrink-0 lg:block"
|
||||
initial={{ width: 0, opacity: 0 }}
|
||||
animate={{ width: sidebarOpen ? 224 : 64, opacity: 1 }}
|
||||
animate={{ width: sidebarOpen ? 208 : 64, opacity: 1 }}
|
||||
exit={{ width: 0, opacity: 0 }}
|
||||
transition={{
|
||||
type: 'spring',
|
||||
|
||||
@@ -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',
|
||||
inheritsPageBackground ? 'bg-transparent' : 'bg-card',
|
||||
// 移动端始终显示完整宽度,桌面端根据 sidebarOpen 切换
|
||||
'w-56 lg:w-auto',
|
||||
sidebarOpen ? 'lg:w-56' : 'lg:w-16',
|
||||
'w-52 lg:w-auto',
|
||||
sidebarOpen ? 'lg:w-52' : 'lg:w-16',
|
||||
mobileMenuOpen ? 'translate-x-0' : '-translate-x-full lg:translate-x-0'
|
||||
)}
|
||||
>
|
||||
|
||||
@@ -183,7 +183,7 @@
|
||||
--layout-space-lg: 1.5rem;
|
||||
--layout-space-xl: 2rem;
|
||||
--layout-space-2xl: 3rem;
|
||||
--layout-sidebar-width: 14rem;
|
||||
--layout-sidebar-width: 13rem;
|
||||
--layout-header-height: 3.5rem;
|
||||
--layout-max-content-width: 1280px;
|
||||
|
||||
|
||||
@@ -225,7 +225,7 @@ export const defaultLightTokens: ThemeTokens = {
|
||||
'space-lg': '1.5rem',
|
||||
'space-xl': '2rem',
|
||||
'space-2xl': '3rem',
|
||||
'sidebar-width': '16rem',
|
||||
'sidebar-width': '13rem',
|
||||
'header-height': '3.5rem',
|
||||
'max-content-width': '1280px',
|
||||
},
|
||||
@@ -320,7 +320,7 @@ export const defaultDarkTokens: ThemeTokens = {
|
||||
'space-lg': '1.5rem',
|
||||
'space-xl': '2rem',
|
||||
'space-2xl': '3rem',
|
||||
'sidebar-width': '16rem',
|
||||
'sidebar-width': '13rem',
|
||||
'header-height': '3.5rem',
|
||||
'max-content-width': '1280px',
|
||||
},
|
||||
|
||||
@@ -113,22 +113,6 @@ export const FeaturesSection = React.memo(function FeaturesSection({
|
||||
记忆检索过程中是否启用黑话识别
|
||||
</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">
|
||||
<h4 className="text-sm font-semibold mb-3">聊天历史总结配置</h4>
|
||||
|
||||
@@ -84,7 +84,6 @@ export interface MemoryConfig {
|
||||
max_agent_iterations: number
|
||||
agent_timeout_seconds: number
|
||||
enable_jargon_detection: boolean
|
||||
global_memory: boolean
|
||||
chat_history_topic_check_message_threshold: number
|
||||
chat_history_topic_check_time_hours: number
|
||||
chat_history_topic_check_min_messages: number
|
||||
|
||||
@@ -605,12 +605,12 @@ export function AppearanceTab() {
|
||||
<div className="flex justify-between">
|
||||
<Label>{t('settings.appearance.sidebarWidthLabel')}</Label>
|
||||
<span className="text-sm text-muted-foreground">
|
||||
{getTokenValue(themeConfig.tokenOverrides, 'layout', 'sidebar-width', '16rem')}
|
||||
{getTokenValue(themeConfig.tokenOverrides, 'layout', 'sidebar-width', '13rem')}
|
||||
</span>
|
||||
</div>
|
||||
<Slider
|
||||
defaultValue={[16]}
|
||||
value={[parseFloat(getTokenValue(themeConfig.tokenOverrides, 'layout', 'sidebar-width', '16'))]}
|
||||
value={[parseFloat(getTokenValue(themeConfig.tokenOverrides, 'layout', 'sidebar-width', '13'))]}
|
||||
min={12}
|
||||
max={24}
|
||||
step={0.5}
|
||||
|
||||
@@ -60,10 +60,10 @@ class EmbeddingAPIAdapter:
|
||||
self._total_time = 0.0
|
||||
|
||||
logger.info(
|
||||
"EmbeddingAPIAdapter 初始化: "
|
||||
f"batch_size={self.batch_size}, "
|
||||
f"max_concurrent={self.max_concurrent}, "
|
||||
f"configured_dim={self.default_dimension}, "
|
||||
"Embedding 初始化: "
|
||||
f"batch={self.batch_size}, "
|
||||
f"concurrent={self.max_concurrent}, "
|
||||
f"dim={self.default_dimension}, "
|
||||
f"model={self.model_name}"
|
||||
)
|
||||
|
||||
@@ -258,10 +258,10 @@ class EmbeddingAPIAdapter:
|
||||
if cached_dimension is not None:
|
||||
self._dimension = int(cached_dimension)
|
||||
self._dimension_detected = True
|
||||
logger.info(f"嵌入维度命中进程缓存: {self._dimension}")
|
||||
logger.debug(f"嵌入维度命中进程缓存: {self._dimension}")
|
||||
return self._dimension
|
||||
|
||||
logger.info("正在检测嵌入模型维度...")
|
||||
logger.info("检测嵌入维度...")
|
||||
try:
|
||||
target_dim = self.default_dimension
|
||||
logger.debug(f"尝试请求指定维度: {target_dim}")
|
||||
@@ -269,7 +269,7 @@ class EmbeddingAPIAdapter:
|
||||
if test_embedding and isinstance(test_embedding, list):
|
||||
detected_dim = len(test_embedding)
|
||||
if detected_dim == target_dim:
|
||||
logger.info(f"嵌入维度检测成功 (匹配 configured/requested): {detected_dim}")
|
||||
logger.info(f"嵌入维度: {detected_dim}")
|
||||
else:
|
||||
logger.warning(
|
||||
f"requested_dimension={target_dim} 但模型返回 detected_dimension={detected_dim},将使用真实输出维度"
|
||||
@@ -288,7 +288,7 @@ class EmbeddingAPIAdapter:
|
||||
self._dimension = detected_dim
|
||||
self._dimension_detected = True
|
||||
self._GLOBAL_DIMENSION_CACHE[cache_key] = int(detected_dim)
|
||||
logger.info(f"嵌入维度检测成功 (自然维度): {detected_dim}")
|
||||
logger.info(f"嵌入维度: {detected_dim} (自然输出)")
|
||||
return detected_dim
|
||||
logger.warning(f"嵌入维度检测失败,使用 configured_dimension: {self.default_dimension}")
|
||||
except Exception as exc:
|
||||
|
||||
@@ -249,7 +249,7 @@ class DualPathRetriever:
|
||||
config=self.config.graph_recall,
|
||||
)
|
||||
|
||||
logger.info(
|
||||
logger.debug(
|
||||
f"DualPathRetriever 初始化: "
|
||||
f"strategy={self.config.retrieval_strategy.value}, "
|
||||
f"top_k_para={self.config.top_k_paragraphs}, "
|
||||
|
||||
@@ -88,7 +88,7 @@ class PersonalizedPageRank:
|
||||
self._total_iterations = 0
|
||||
self._convergence_history: List[int] = []
|
||||
|
||||
logger.info(
|
||||
logger.debug(
|
||||
f"PersonalizedPageRank 初始化: "
|
||||
f"alpha={self.config.alpha}, "
|
||||
f"max_iter={self.config.max_iter}"
|
||||
|
||||
@@ -122,7 +122,7 @@ class SparseBM25Index:
|
||||
self._conn = conn
|
||||
self._loaded = True
|
||||
self._prepare_tokenizer()
|
||||
logger.info(
|
||||
logger.debug(
|
||||
"SparseBM25Index loaded: "
|
||||
f"backend=fts5, tokenizer={self.config.tokenizer_mode}, mode={self.config.mode}"
|
||||
)
|
||||
|
||||
@@ -99,7 +99,7 @@ class DynamicThresholdFilter:
|
||||
self._total_processed = 0
|
||||
self._threshold_history: List[float] = []
|
||||
|
||||
logger.info(
|
||||
logger.debug(
|
||||
f"DynamicThresholdFilter 初始化: "
|
||||
f"method={self.config.method.value}, "
|
||||
f"min_threshold={self.config.min_threshold}"
|
||||
|
||||
@@ -161,7 +161,7 @@ async def initialize_storage_async(plugin: Any) -> None:
|
||||
|
||||
try:
|
||||
detected_dimension = await plugin.embedding_manager._detect_dimension()
|
||||
logger.info(f"嵌入维度检测成功: {detected_dimension}")
|
||||
logger.info(f"嵌入维度: {detected_dimension}")
|
||||
except Exception as e:
|
||||
logger.warning(f"嵌入维度检测失败: {e},使用默认值")
|
||||
detected_dimension = plugin.embedding_manager.default_dimension
|
||||
@@ -194,11 +194,11 @@ async def initialize_storage_async(plugin: Any) -> None:
|
||||
matrix_format=matrix_format,
|
||||
data_dir=data_dir / "graph",
|
||||
)
|
||||
logger.info("图存储初始化完成")
|
||||
logger.debug("图存储初始化完成")
|
||||
|
||||
plugin.metadata_store = MetadataStore(data_dir=data_dir / "metadata")
|
||||
plugin.metadata_store.connect()
|
||||
logger.info("元数据存储初始化完成")
|
||||
logger.debug("元数据存储初始化完成")
|
||||
|
||||
plugin.relation_write_service = RelationWriteService(
|
||||
metadata_store=plugin.metadata_store,
|
||||
@@ -233,7 +233,7 @@ async def initialize_storage_async(plugin: Any) -> None:
|
||||
if plugin.vector_store.has_data():
|
||||
try:
|
||||
plugin.vector_store.load()
|
||||
logger.info(f"向量数据已加载,共 {plugin.vector_store.num_vectors} 个向量")
|
||||
logger.debug(f"向量数据已加载,共 {plugin.vector_store.num_vectors} 个向量")
|
||||
except Exception as e:
|
||||
logger.warning(f"加载向量数据失败: {e}")
|
||||
|
||||
@@ -259,7 +259,7 @@ async def initialize_storage_async(plugin: Any) -> None:
|
||||
if plugin.graph_store.has_data():
|
||||
try:
|
||||
plugin.graph_store.load()
|
||||
logger.info(f"图数据已加载,共 {plugin.graph_store.num_nodes} 个节点")
|
||||
logger.debug(f"图数据已加载,共 {plugin.graph_store.num_nodes} 个节点")
|
||||
except Exception as e:
|
||||
logger.warning(f"加载图数据失败: {e}")
|
||||
|
||||
|
||||
@@ -222,7 +222,7 @@ def build_search_runtime(
|
||||
)
|
||||
runtime.threshold_filter = DynamicThresholdFilter(threshold_config)
|
||||
runtime.error = ""
|
||||
log.info(f"{prefix_text}[{owner}] 检索运行时初始化完成")
|
||||
log.info(f"{prefix_text}[{owner}] 检索运行时就绪")
|
||||
except Exception as e:
|
||||
runtime.retriever = None
|
||||
runtime.threshold_filter = None
|
||||
|
||||
@@ -119,7 +119,7 @@ class GraphStore:
|
||||
# V5: 简单的异步锁 (实际上 asyncio 环境下单线程主循环可能不需要,但为了安全保留)
|
||||
self._lock = asyncio.Lock()
|
||||
|
||||
logger.info(f"GraphStore 初始化: format={matrix_format}")
|
||||
logger.debug(f"图存储初始化: format={matrix_format}")
|
||||
|
||||
def _canonicalize(self, node: str) -> str:
|
||||
"""规范化节点名称 (用于去重和内部索引)"""
|
||||
@@ -1317,8 +1317,8 @@ class GraphStore:
|
||||
|
||||
self._adjacency_dirty = True
|
||||
logger.info(
|
||||
f"图存储已加载: {len(self._nodes)} 个节点, "
|
||||
f"{self._adjacency.nnz if self._adjacency is not None else 0} 条边"
|
||||
f"图存储已加载: 节点={len(self._nodes)}, "
|
||||
f"边={self._adjacency.nnz if self._adjacency is not None else 0}"
|
||||
)
|
||||
|
||||
def _expand_adjacency_matrix(self, added_nodes: int) -> None:
|
||||
|
||||
@@ -72,7 +72,7 @@ class MetadataStore:
|
||||
self._is_initialized = False
|
||||
self._db_path: Optional[Path] = None
|
||||
|
||||
logger.info(f"MetadataStore 初始化: db={db_name}")
|
||||
logger.debug(f"元数据存储初始化: db={db_name}")
|
||||
|
||||
def connect(
|
||||
self,
|
||||
@@ -114,7 +114,7 @@ class MetadataStore:
|
||||
self._conn.execute("PRAGMA temp_store=MEMORY")
|
||||
self._conn.execute("PRAGMA foreign_keys = ON") # 开启外键约束支持级联删除
|
||||
|
||||
logger.info(f"连接到数据库: {db_path}")
|
||||
logger.info(f"数据库已连接: {db_path}")
|
||||
|
||||
# 初始化或校验 schema
|
||||
if not self._is_initialized:
|
||||
|
||||
@@ -108,7 +108,7 @@ class VectorStore:
|
||||
# Thread safety lock
|
||||
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):
|
||||
"""初始化空的 Faiss 索引"""
|
||||
@@ -379,7 +379,7 @@ class VectorStore:
|
||||
预热状态摘要
|
||||
"""
|
||||
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:
|
||||
with self._lock:
|
||||
@@ -435,7 +435,7 @@ class VectorStore:
|
||||
)
|
||||
return summary
|
||||
|
||||
logger.info(
|
||||
logger.debug(
|
||||
"metric.vector_index_prewarm_success=1 "
|
||||
f"metric.vector_index_prewarm_duration_ms={summary['duration_ms']:.2f} "
|
||||
f"trained={summary['trained']} "
|
||||
|
||||
@@ -57,7 +57,7 @@ MODEL_CONFIG_PATH: Path = (CONFIG_DIR / "model_config.toml").resolve().absolute(
|
||||
LEGACY_ENV_PATH: Path = (PROJECT_ROOT / ".env").resolve().absolute()
|
||||
A_MEMORIX_LEGACY_CONFIG_PATH: Path = (CONFIG_DIR / "a_memorix.toml").resolve().absolute()
|
||||
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"
|
||||
|
||||
logger = get_logger("config")
|
||||
|
||||
@@ -392,11 +392,6 @@ def try_migrate_legacy_bot_config_dict(data: dict[str, Any]) -> MigrationResult:
|
||||
migrated_any = True
|
||||
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"))
|
||||
if keyword_reaction is not None:
|
||||
if _drop_empty_keyword_rules(keyword_reaction, "keyword_rules"):
|
||||
|
||||
@@ -472,26 +472,6 @@ class MemoryConfig(ConfigBase):
|
||||
|
||||
__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(
|
||||
default=True,
|
||||
json_schema_extra={
|
||||
|
||||
Reference in New Issue
Block a user