mirror of
https://github.com/langbot-app/LangBot.git
synced 2026-06-02 03:55:55 +00:00
* Initial plan * Add multi-knowledge base support to pipelines - Created database migration dbm010 to convert knowledge-base field from string to array - Updated default pipeline config to use knowledge-bases array - Updated pipeline metadata to use knowledge-base-multi-selector type - Modified localagent.py to retrieve from multiple knowledge bases and concatenate results - Added KNOWLEDGE_BASE_MULTI_SELECTOR type to frontend form entities - Implemented multi-selector UI component with dialog for selecting multiple knowledge bases Co-authored-by: RockChinQ <45992437+RockChinQ@users.noreply.github.com> * Add i18n translations for multi-knowledge base selector Co-authored-by: RockChinQ <45992437+RockChinQ@users.noreply.github.com> * Fix prettier formatting errors in DynamicFormItemComponent Co-authored-by: RockChinQ <45992437+RockChinQ@users.noreply.github.com> * Add accessibility attributes to knowledge base selector checkbox Co-authored-by: RockChinQ <45992437+RockChinQ@users.noreply.github.com> * fix: minor fix --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: RockChinQ <45992437+RockChinQ@users.noreply.github.com> Co-authored-by: Junyan Qin <rockchinq@gmail.com>
89 lines
3.6 KiB
Python
89 lines
3.6 KiB
Python
from .. import migration
|
|
|
|
import sqlalchemy
|
|
|
|
from ...entity.persistence import pipeline as persistence_pipeline
|
|
|
|
|
|
@migration.migration_class(10)
|
|
class DBMigratePipelineMultiKnowledgeBase(migration.DBMigration):
|
|
"""Pipeline support multiple knowledge base binding"""
|
|
|
|
async def upgrade(self):
|
|
"""Upgrade"""
|
|
# read all pipelines
|
|
pipelines = await self.ap.persistence_mgr.execute_async(sqlalchemy.select(persistence_pipeline.LegacyPipeline))
|
|
|
|
for pipeline in pipelines:
|
|
serialized_pipeline = self.ap.persistence_mgr.serialize_model(persistence_pipeline.LegacyPipeline, pipeline)
|
|
|
|
config = serialized_pipeline['config']
|
|
|
|
# Convert knowledge-base from string to array
|
|
if 'local-agent' in config['ai']:
|
|
current_kb = config['ai']['local-agent'].get('knowledge-base', '')
|
|
|
|
# If it's already a list, skip
|
|
if isinstance(current_kb, list):
|
|
continue
|
|
|
|
# Convert string to list
|
|
if current_kb and current_kb != '__none__':
|
|
config['ai']['local-agent']['knowledge-bases'] = [current_kb]
|
|
else:
|
|
config['ai']['local-agent']['knowledge-bases'] = []
|
|
|
|
# Remove old field
|
|
if 'knowledge-base' in config['ai']['local-agent']:
|
|
del config['ai']['local-agent']['knowledge-base']
|
|
|
|
await self.ap.persistence_mgr.execute_async(
|
|
sqlalchemy.update(persistence_pipeline.LegacyPipeline)
|
|
.where(persistence_pipeline.LegacyPipeline.uuid == serialized_pipeline['uuid'])
|
|
.values(
|
|
{
|
|
'config': config,
|
|
'for_version': self.ap.ver_mgr.get_current_version(),
|
|
}
|
|
)
|
|
)
|
|
|
|
async def downgrade(self):
|
|
"""Downgrade"""
|
|
# read all pipelines
|
|
pipelines = await self.ap.persistence_mgr.execute_async(sqlalchemy.select(persistence_pipeline.LegacyPipeline))
|
|
|
|
for pipeline in pipelines:
|
|
serialized_pipeline = self.ap.persistence_mgr.serialize_model(persistence_pipeline.LegacyPipeline, pipeline)
|
|
|
|
config = serialized_pipeline['config']
|
|
|
|
# Convert knowledge-bases from array back to string
|
|
if 'local-agent' in config['ai']:
|
|
current_kbs = config['ai']['local-agent'].get('knowledge-bases', [])
|
|
|
|
# If it's already a string, skip
|
|
if isinstance(current_kbs, str):
|
|
continue
|
|
|
|
# Convert list to string (take first one or empty)
|
|
if current_kbs and len(current_kbs) > 0:
|
|
config['ai']['local-agent']['knowledge-base'] = current_kbs[0]
|
|
else:
|
|
config['ai']['local-agent']['knowledge-base'] = ''
|
|
|
|
# Remove new field
|
|
if 'knowledge-bases' in config['ai']['local-agent']:
|
|
del config['ai']['local-agent']['knowledge-bases']
|
|
|
|
await self.ap.persistence_mgr.execute_async(
|
|
sqlalchemy.update(persistence_pipeline.LegacyPipeline)
|
|
.where(persistence_pipeline.LegacyPipeline.uuid == serialized_pipeline['uuid'])
|
|
.values(
|
|
{
|
|
'config': config,
|
|
'for_version': self.ap.ver_mgr.get_current_version(),
|
|
}
|
|
)
|
|
)
|