-
Notifications
You must be signed in to change notification settings - Fork 22
Open
Labels
bugSomething isn't workingSomething isn't workinghelp wantedExtra attention is neededExtra attention is needed
Description
问题描述
V2LearningIntegration.__init__() 在 AstrBot 的 Provider 注册表(provider_manager.inst_map)填充之前就调用 _create_embedding_provider() 和 _create_rerank_provider(),导致 LightRAG 知识引擎和 Reranker 始终无法初始化。
复现步骤
- 在
V2_Architecture_Settings中配置embedding_provider_id和rerank_provider_id - 将
knowledge_engine设为lightrag - 重启 AstrBot
实际行为
[V2Integration] Initialised — knowledge=lightrag, memory=legacy, embedding=no, reranker=no
[V2Integration] LightRAG requires an embedding provider but none is available; knowledge engine disabled
即使配置正确,embedding 和 rerank provider 始终解析为 None。
根因
AstrBot 启动时序:
- 插件加载阶段(
star_manager载入插件)→ 此时provider_manager.inst_map为空 V2LearningIntegration.__init__()→ 调用EmbeddingProviderFactory.create()→context.get_provider_by_id()→ 返回 NoneV2LearningIntegration.start()→ 同样时机过早,inst_map 仍为空- Provider 加载阶段(
provider.manager实例化各 provider)→inst_map才被填充 AstrBot 启动完成
FrameworkLLMAdapter 有类似的时序问题,但它有 _needs_lazy_init 机制在实际使用时重试。V2LearningIntegration 缺少这个机制。
临时 Workaround
在 start() 中用 asyncio.create_task() 启动后台 retry 任务:
async def start(self) -> None:
# Schedule background retry for providers not yet available
if (not self._embedding_provider or not self._rerank_provider) and self._context:
asyncio.create_task(self._lazy_resolve_providers())
# ... existing start logic ...
async def _lazy_resolve_providers(self) -> None:
for attempt in range(30):
await asyncio.sleep(3)
if not self._embedding_provider:
self._embedding_provider = self._create_embedding_provider()
if not self._rerank_provider:
self._rerank_provider = self._create_rerank_provider()
if self._embedding_provider and self._rerank_provider:
break
if self._embedding_provider:
if not self._knowledge_manager:
self._knowledge_manager = self._create_knowledge_manager()
if self._knowledge_manager and hasattr(self._knowledge_manager, 'start'):
await self._knowledge_manager.start()
if not self._exemplar_library:
self._exemplar_library = self._create_exemplar_library()建议修复
- 在
V2LearningIntegration中加入类似FrameworkLLMAdapter._needs_lazy_init的延迟初始化机制 - 或者利用 AstrBot 的
on_astrbot_loadedhook,在所有 provider 就绪后再初始化 V2 模块
环境
- AstrBot: v4.19.4
- self-learning: Next-2.0.6
- Python: 3.12
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
bugSomething isn't workingSomething isn't workinghelp wantedExtra attention is neededExtra attention is needed