diff --git a/src/langbot/pkg/pipeline/preproc/preproc.py b/src/langbot/pkg/pipeline/preproc/preproc.py index eacf4772..c4bcf6b3 100644 --- a/src/langbot/pkg/pipeline/preproc/preproc.py +++ b/src/langbot/pkg/pipeline/preproc/preproc.py @@ -176,6 +176,16 @@ class PreProcessor(stage.PipelineStage): query.variables['user_message_text'] = plain_text query.user_message = provider_message.Message(role='user', content=content_list) + + # Extract knowledge base UUIDs into query variables so plugins can modify them + # during PromptPreProcessing before the runner performs retrieval. + kb_uuids = query.pipeline_config['ai']['local-agent'].get('knowledge-bases', []) + if not kb_uuids: + old_kb_uuid = query.pipeline_config['ai']['local-agent'].get('knowledge-base', '') + if old_kb_uuid and old_kb_uuid != '__none__': + kb_uuids = [old_kb_uuid] + query.variables['_knowledge_base_uuids'] = list(kb_uuids) + # =========== 触发事件 PromptPreProcessing event = events.PromptPreProcessing( diff --git a/src/langbot/pkg/plugin/handler.py b/src/langbot/pkg/plugin/handler.py index 1d190220..6ce98800 100644 --- a/src/langbot/pkg/plugin/handler.py +++ b/src/langbot/pkg/plugin/handler.py @@ -675,11 +675,15 @@ class RuntimeConnectionHandler(handler.Handler): ) try: + session_name = f'{query.session.launcher_type.value}_{query.session.launcher_id}' entries = await kb.retrieve( query_text, settings={ 'top_k': top_k, 'filters': filters, + 'session_name': session_name, + 'bot_uuid': query.bot_uuid or '', + 'sender_id': str(query.sender_id), }, ) results = [entry.model_dump(mode='json') for entry in entries] diff --git a/src/langbot/pkg/provider/runners/localagent.py b/src/langbot/pkg/provider/runners/localagent.py index 62a534a1..65f86678 100644 --- a/src/langbot/pkg/provider/runners/localagent.py +++ b/src/langbot/pkg/provider/runners/localagent.py @@ -132,14 +132,9 @@ class LocalAgentRunner(runner.RequestRunner): """Run request""" pending_tool_calls = [] - # Get knowledge bases list (new field) - kb_uuids = query.pipeline_config['ai']['local-agent'].get('knowledge-bases', []) - - # Fallback to old field for backward compatibility - if not kb_uuids: - old_kb_uuid = query.pipeline_config['ai']['local-agent'].get('knowledge-base', '') - if old_kb_uuid and old_kb_uuid != '__none__': - kb_uuids = [old_kb_uuid] + # Get knowledge bases list from query variables (set by PreProcessor, + # may have been modified by plugins during PromptPreProcessing) + kb_uuids = query.variables.get('_knowledge_base_uuids', []) user_message = copy.deepcopy(query.user_message)