From 672abfe95d749b76583ace0c2e63c072692f9563 Mon Sep 17 00:00:00 2001 From: RockChinQ Date: Sat, 13 Jun 2026 05:26:01 -0400 Subject: [PATCH] refactor(core): remove pre-3.x legacy config migration system The pkg/core/migrations system (m001-m043 DBMigration-style config migrations, MigrationStage, and the core.migration base class) only ever ran when upgrading from LangBot 3.x. The last 3.x release is over a year old and is no longer supported, so this dead code is removed entirely: - delete pkg/core/migrations/ (43 mXXX_*.py + __init__) - delete pkg/core/migration.py (base class + registry) - delete pkg/core/stages/migrate.py (MigrationStage) - drop 'MigrationStage' from boot.py stage_order - delete tests/unit_tests/core/test_migration.py (tested the removed base class) --- src/langbot/pkg/core/boot.py | 1 - src/langbot/pkg/core/migration.py | 45 ---- src/langbot/pkg/core/migrations/__init__.py | 0 .../m001_sensitive_word_migration.py | 24 -- .../m002_openai_config_migration.py | 44 ---- ...m003_anthropic_requester_cfg_completion.py | 29 --- .../m004_moonshot_cfg_completion.py | 29 --- .../m005_deepseek_cfg_completion.py | 29 --- .../pkg/core/migrations/m006_vision_config.py | 19 -- .../core/migrations/m007_qcg_center_url.py | 20 -- .../m008_ad_fixwin_config_migrate.py | 25 -- .../core/migrations/m009_msg_truncator_cfg.py | 22 -- .../m010_ollama_requester_config.py | 23 -- .../migrations/m011_command_prefix_config.py | 19 -- .../pkg/core/migrations/m012_runner_config.py | 19 -- .../core/migrations/m013_http_api_config.py | 29 --- .../migrations/m014_force_delay_config.py | 22 -- .../core/migrations/m015_gitee_ai_config.py | 27 -- .../core/migrations/m016_dify_service_api.py | 23 -- .../m017_dify_api_timeout_params.py | 27 -- .../pkg/core/migrations/m018_xai_config.py | 23 -- .../core/migrations/m019_zhipuai_config.py | 23 -- .../pkg/core/migrations/m020_wecom_config.py | 36 --- .../pkg/core/migrations/m021_lark_config.py | 35 --- .../core/migrations/m022_lmstudio_config.py | 23 -- .../migrations/m023_siliconflow_config.py | 25 -- .../core/migrations/m024_discord_config.py | 31 --- .../core/migrations/m025_gewechat_config.py | 35 --- .../core/migrations/m026_qqofficial_config.py | 33 --- .../m027_wx_official_account_config.py | 35 --- .../m028_aliyun_requester_config.py | 25 -- .../m029_dashscope_app_api_config.py | 27 -- .../core/migrations/m030_lark_config_cmpl.py | 31 --- .../core/migrations/m031_dingtalk_config.py | 33 --- .../core/migrations/m032_volcark_config.py | 25 -- .../migrations/m033_dify_thinking_config.py | 24 -- .../m034_gewechat_file_url_config.py | 29 --- .../pkg/core/migrations/m035_wxoa_mode.py | 26 -- .../migrations/m036_wxoa_loading_message.py | 26 -- .../pkg/core/migrations/m037_mcp_config.py | 18 -- .../migrations/m038_tg_dingtalk_markdown.py | 25 -- .../m039_modelscope_cfg_completion.py | 29 --- .../pkg/core/migrations/m040_ppio_config.py | 29 --- .../m041_dingtalk_card_autolayout_config.py | 17 -- .../pkg/core/migrations/m042_weknora_api.py | 27 -- .../pkg/core/migrations/m043_deerflow_api.py | 30 --- src/langbot/pkg/core/stages/migrate.py | 43 ---- tests/unit_tests/core/test_migration.py | 238 ------------------ 48 files changed, 1477 deletions(-) delete mode 100644 src/langbot/pkg/core/migration.py delete mode 100644 src/langbot/pkg/core/migrations/__init__.py delete mode 100644 src/langbot/pkg/core/migrations/m001_sensitive_word_migration.py delete mode 100644 src/langbot/pkg/core/migrations/m002_openai_config_migration.py delete mode 100644 src/langbot/pkg/core/migrations/m003_anthropic_requester_cfg_completion.py delete mode 100644 src/langbot/pkg/core/migrations/m004_moonshot_cfg_completion.py delete mode 100644 src/langbot/pkg/core/migrations/m005_deepseek_cfg_completion.py delete mode 100644 src/langbot/pkg/core/migrations/m006_vision_config.py delete mode 100644 src/langbot/pkg/core/migrations/m007_qcg_center_url.py delete mode 100644 src/langbot/pkg/core/migrations/m008_ad_fixwin_config_migrate.py delete mode 100644 src/langbot/pkg/core/migrations/m009_msg_truncator_cfg.py delete mode 100644 src/langbot/pkg/core/migrations/m010_ollama_requester_config.py delete mode 100644 src/langbot/pkg/core/migrations/m011_command_prefix_config.py delete mode 100644 src/langbot/pkg/core/migrations/m012_runner_config.py delete mode 100644 src/langbot/pkg/core/migrations/m013_http_api_config.py delete mode 100644 src/langbot/pkg/core/migrations/m014_force_delay_config.py delete mode 100644 src/langbot/pkg/core/migrations/m015_gitee_ai_config.py delete mode 100644 src/langbot/pkg/core/migrations/m016_dify_service_api.py delete mode 100644 src/langbot/pkg/core/migrations/m017_dify_api_timeout_params.py delete mode 100644 src/langbot/pkg/core/migrations/m018_xai_config.py delete mode 100644 src/langbot/pkg/core/migrations/m019_zhipuai_config.py delete mode 100644 src/langbot/pkg/core/migrations/m020_wecom_config.py delete mode 100644 src/langbot/pkg/core/migrations/m021_lark_config.py delete mode 100644 src/langbot/pkg/core/migrations/m022_lmstudio_config.py delete mode 100644 src/langbot/pkg/core/migrations/m023_siliconflow_config.py delete mode 100644 src/langbot/pkg/core/migrations/m024_discord_config.py delete mode 100644 src/langbot/pkg/core/migrations/m025_gewechat_config.py delete mode 100644 src/langbot/pkg/core/migrations/m026_qqofficial_config.py delete mode 100644 src/langbot/pkg/core/migrations/m027_wx_official_account_config.py delete mode 100644 src/langbot/pkg/core/migrations/m028_aliyun_requester_config.py delete mode 100644 src/langbot/pkg/core/migrations/m029_dashscope_app_api_config.py delete mode 100644 src/langbot/pkg/core/migrations/m030_lark_config_cmpl.py delete mode 100644 src/langbot/pkg/core/migrations/m031_dingtalk_config.py delete mode 100644 src/langbot/pkg/core/migrations/m032_volcark_config.py delete mode 100644 src/langbot/pkg/core/migrations/m033_dify_thinking_config.py delete mode 100644 src/langbot/pkg/core/migrations/m034_gewechat_file_url_config.py delete mode 100644 src/langbot/pkg/core/migrations/m035_wxoa_mode.py delete mode 100644 src/langbot/pkg/core/migrations/m036_wxoa_loading_message.py delete mode 100644 src/langbot/pkg/core/migrations/m037_mcp_config.py delete mode 100644 src/langbot/pkg/core/migrations/m038_tg_dingtalk_markdown.py delete mode 100644 src/langbot/pkg/core/migrations/m039_modelscope_cfg_completion.py delete mode 100644 src/langbot/pkg/core/migrations/m040_ppio_config.py delete mode 100644 src/langbot/pkg/core/migrations/m041_dingtalk_card_autolayout_config.py delete mode 100644 src/langbot/pkg/core/migrations/m042_weknora_api.py delete mode 100644 src/langbot/pkg/core/migrations/m043_deerflow_api.py delete mode 100644 src/langbot/pkg/core/stages/migrate.py delete mode 100644 tests/unit_tests/core/test_migration.py diff --git a/src/langbot/pkg/core/boot.py b/src/langbot/pkg/core/boot.py index 952a7168..f2b335ac 100644 --- a/src/langbot/pkg/core/boot.py +++ b/src/langbot/pkg/core/boot.py @@ -16,7 +16,6 @@ importutil.import_modules_in_pkg(stages) stage_order = [ 'LoadConfigStage', - 'MigrationStage', 'GenKeysStage', 'SetupLoggerStage', 'BuildAppStage', diff --git a/src/langbot/pkg/core/migration.py b/src/langbot/pkg/core/migration.py deleted file mode 100644 index a921e6c7..00000000 --- a/src/langbot/pkg/core/migration.py +++ /dev/null @@ -1,45 +0,0 @@ -from __future__ import annotations - -import abc -import typing - -from . import app - - -preregistered_migrations: list[typing.Type[Migration]] = [] -"""Currently not supported for extension""" - - -def migration_class(name: str, number: int): - """Register a migration""" - - def decorator(cls: typing.Type[Migration]) -> typing.Type[Migration]: - cls.name = name - cls.number = number - preregistered_migrations.append(cls) - return cls - - return decorator - - -class Migration(abc.ABC): - """A version migration""" - - name: str - - number: int - - ap: app.Application - - def __init__(self, ap: app.Application): - self.ap = ap - - @abc.abstractmethod - async def need_migrate(self) -> bool: - """Determine if the current environment needs to run this migration""" - pass - - @abc.abstractmethod - async def run(self): - """Run migration""" - pass diff --git a/src/langbot/pkg/core/migrations/__init__.py b/src/langbot/pkg/core/migrations/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/src/langbot/pkg/core/migrations/m001_sensitive_word_migration.py b/src/langbot/pkg/core/migrations/m001_sensitive_word_migration.py deleted file mode 100644 index 35cb076f..00000000 --- a/src/langbot/pkg/core/migrations/m001_sensitive_word_migration.py +++ /dev/null @@ -1,24 +0,0 @@ -from __future__ import annotations - -import os - -from .. import migration - - -@migration.migration_class('sensitive-word-migration', 1) -class SensitiveWordMigration(migration.Migration): - """敏感词迁移""" - - async def need_migrate(self) -> bool: - """判断当前环境是否需要运行此迁移""" - return os.path.exists('data/config/sensitive-words.json') and not os.path.exists( - 'data/metadata/sensitive-words.json' - ) - - async def run(self): - """执行迁移""" - # 移动文件 - os.rename('data/config/sensitive-words.json', 'data/metadata/sensitive-words.json') - - # 重新加载配置 - await self.ap.sensitive_meta.load_config() diff --git a/src/langbot/pkg/core/migrations/m002_openai_config_migration.py b/src/langbot/pkg/core/migrations/m002_openai_config_migration.py deleted file mode 100644 index 9a35370c..00000000 --- a/src/langbot/pkg/core/migrations/m002_openai_config_migration.py +++ /dev/null @@ -1,44 +0,0 @@ -from __future__ import annotations - -from .. import migration - - -@migration.migration_class('openai-config-migration', 2) -class OpenAIConfigMigration(migration.Migration): - """OpenAI配置迁移""" - - async def need_migrate(self) -> bool: - """判断当前环境是否需要运行此迁移""" - return 'openai-config' in self.ap.provider_cfg.data - - async def run(self): - """执行迁移""" - old_openai_config = self.ap.provider_cfg.data['openai-config'].copy() - - if 'keys' not in self.ap.provider_cfg.data: - self.ap.provider_cfg.data['keys'] = {} - - if 'openai' not in self.ap.provider_cfg.data['keys']: - self.ap.provider_cfg.data['keys']['openai'] = [] - - self.ap.provider_cfg.data['keys']['openai'] = old_openai_config['api-keys'] - - self.ap.provider_cfg.data['model'] = old_openai_config['chat-completions-params']['model'] - - del old_openai_config['chat-completions-params']['model'] - - if 'requester' not in self.ap.provider_cfg.data: - self.ap.provider_cfg.data['requester'] = {} - - if 'openai-chat-completions' not in self.ap.provider_cfg.data['requester']: - self.ap.provider_cfg.data['requester']['openai-chat-completions'] = {} - - self.ap.provider_cfg.data['requester']['openai-chat-completions'] = { - 'base-url': old_openai_config['base_url'], - 'args': old_openai_config['chat-completions-params'], - 'timeout': old_openai_config['request-timeout'], - } - - del self.ap.provider_cfg.data['openai-config'] - - await self.ap.provider_cfg.dump_config() diff --git a/src/langbot/pkg/core/migrations/m003_anthropic_requester_cfg_completion.py b/src/langbot/pkg/core/migrations/m003_anthropic_requester_cfg_completion.py deleted file mode 100644 index 19369679..00000000 --- a/src/langbot/pkg/core/migrations/m003_anthropic_requester_cfg_completion.py +++ /dev/null @@ -1,29 +0,0 @@ -from __future__ import annotations - -from .. import migration - - -@migration.migration_class('anthropic-requester-config-completion', 3) -class AnthropicRequesterConfigCompletionMigration(migration.Migration): - """OpenAI配置迁移""" - - async def need_migrate(self) -> bool: - """判断当前环境是否需要运行此迁移""" - return ( - 'anthropic-messages' not in self.ap.provider_cfg.data['requester'] - or 'anthropic' not in self.ap.provider_cfg.data['keys'] - ) - - async def run(self): - """执行迁移""" - if 'anthropic-messages' not in self.ap.provider_cfg.data['requester']: - self.ap.provider_cfg.data['requester']['anthropic-messages'] = { - 'base-url': 'https://api.anthropic.com', - 'args': {'max_tokens': 1024}, - 'timeout': 120, - } - - if 'anthropic' not in self.ap.provider_cfg.data['keys']: - self.ap.provider_cfg.data['keys']['anthropic'] = [] - - await self.ap.provider_cfg.dump_config() diff --git a/src/langbot/pkg/core/migrations/m004_moonshot_cfg_completion.py b/src/langbot/pkg/core/migrations/m004_moonshot_cfg_completion.py deleted file mode 100644 index de086159..00000000 --- a/src/langbot/pkg/core/migrations/m004_moonshot_cfg_completion.py +++ /dev/null @@ -1,29 +0,0 @@ -from __future__ import annotations - -from .. import migration - - -@migration.migration_class('moonshot-config-completion', 4) -class MoonshotConfigCompletionMigration(migration.Migration): - """OpenAI配置迁移""" - - async def need_migrate(self) -> bool: - """判断当前环境是否需要运行此迁移""" - return ( - 'moonshot-chat-completions' not in self.ap.provider_cfg.data['requester'] - or 'moonshot' not in self.ap.provider_cfg.data['keys'] - ) - - async def run(self): - """执行迁移""" - if 'moonshot-chat-completions' not in self.ap.provider_cfg.data['requester']: - self.ap.provider_cfg.data['requester']['moonshot-chat-completions'] = { - 'base-url': 'https://api.moonshot.cn/v1', - 'args': {}, - 'timeout': 120, - } - - if 'moonshot' not in self.ap.provider_cfg.data['keys']: - self.ap.provider_cfg.data['keys']['moonshot'] = [] - - await self.ap.provider_cfg.dump_config() diff --git a/src/langbot/pkg/core/migrations/m005_deepseek_cfg_completion.py b/src/langbot/pkg/core/migrations/m005_deepseek_cfg_completion.py deleted file mode 100644 index d4d82e3f..00000000 --- a/src/langbot/pkg/core/migrations/m005_deepseek_cfg_completion.py +++ /dev/null @@ -1,29 +0,0 @@ -from __future__ import annotations - -from .. import migration - - -@migration.migration_class('deepseek-config-completion', 5) -class DeepseekConfigCompletionMigration(migration.Migration): - """OpenAI配置迁移""" - - async def need_migrate(self) -> bool: - """判断当前环境是否需要运行此迁移""" - return ( - 'deepseek-chat-completions' not in self.ap.provider_cfg.data['requester'] - or 'deepseek' not in self.ap.provider_cfg.data['keys'] - ) - - async def run(self): - """执行迁移""" - if 'deepseek-chat-completions' not in self.ap.provider_cfg.data['requester']: - self.ap.provider_cfg.data['requester']['deepseek-chat-completions'] = { - 'base-url': 'https://api.deepseek.com', - 'args': {}, - 'timeout': 120, - } - - if 'deepseek' not in self.ap.provider_cfg.data['keys']: - self.ap.provider_cfg.data['keys']['deepseek'] = [] - - await self.ap.provider_cfg.dump_config() diff --git a/src/langbot/pkg/core/migrations/m006_vision_config.py b/src/langbot/pkg/core/migrations/m006_vision_config.py deleted file mode 100644 index ea824d44..00000000 --- a/src/langbot/pkg/core/migrations/m006_vision_config.py +++ /dev/null @@ -1,19 +0,0 @@ -from __future__ import annotations - -from .. import migration - - -@migration.migration_class('vision-config', 6) -class VisionConfigMigration(migration.Migration): - """迁移""" - - async def need_migrate(self) -> bool: - """判断当前环境是否需要运行此迁移""" - return 'enable-vision' not in self.ap.provider_cfg.data - - async def run(self): - """执行迁移""" - if 'enable-vision' not in self.ap.provider_cfg.data: - self.ap.provider_cfg.data['enable-vision'] = False - - await self.ap.provider_cfg.dump_config() diff --git a/src/langbot/pkg/core/migrations/m007_qcg_center_url.py b/src/langbot/pkg/core/migrations/m007_qcg_center_url.py deleted file mode 100644 index 2783e079..00000000 --- a/src/langbot/pkg/core/migrations/m007_qcg_center_url.py +++ /dev/null @@ -1,20 +0,0 @@ -from __future__ import annotations - -from .. import migration - - -@migration.migration_class('qcg-center-url-config', 7) -class QCGCenterURLConfigMigration(migration.Migration): - """迁移""" - - async def need_migrate(self) -> bool: - """判断当前环境是否需要运行此迁移""" - return 'qcg-center-url' not in self.ap.system_cfg.data - - async def run(self): - """执行迁移""" - - if 'qcg-center-url' not in self.ap.system_cfg.data: - self.ap.system_cfg.data['qcg-center-url'] = 'https://api.qchatgpt.rockchin.top/api/v2' - - await self.ap.system_cfg.dump_config() diff --git a/src/langbot/pkg/core/migrations/m008_ad_fixwin_config_migrate.py b/src/langbot/pkg/core/migrations/m008_ad_fixwin_config_migrate.py deleted file mode 100644 index 964e819b..00000000 --- a/src/langbot/pkg/core/migrations/m008_ad_fixwin_config_migrate.py +++ /dev/null @@ -1,25 +0,0 @@ -from __future__ import annotations - -from .. import migration - - -@migration.migration_class('ad-fixwin-cfg-migration', 8) -class AdFixwinConfigMigration(migration.Migration): - """迁移""" - - async def need_migrate(self) -> bool: - """判断当前环境是否需要运行此迁移""" - return isinstance(self.ap.pipeline_cfg.data['rate-limit']['fixwin']['default'], int) - - async def run(self): - """执行迁移""" - - for session_name in self.ap.pipeline_cfg.data['rate-limit']['fixwin']: - temp_dict = { - 'window-size': 60, - 'limit': self.ap.pipeline_cfg.data['rate-limit']['fixwin'][session_name], - } - - self.ap.pipeline_cfg.data['rate-limit']['fixwin'][session_name] = temp_dict - - await self.ap.pipeline_cfg.dump_config() diff --git a/src/langbot/pkg/core/migrations/m009_msg_truncator_cfg.py b/src/langbot/pkg/core/migrations/m009_msg_truncator_cfg.py deleted file mode 100644 index 066af126..00000000 --- a/src/langbot/pkg/core/migrations/m009_msg_truncator_cfg.py +++ /dev/null @@ -1,22 +0,0 @@ -from __future__ import annotations - -from .. import migration - - -@migration.migration_class('msg-truncator-cfg-migration', 9) -class MsgTruncatorConfigMigration(migration.Migration): - """迁移""" - - async def need_migrate(self) -> bool: - """判断当前环境是否需要运行此迁移""" - return 'msg-truncate' not in self.ap.pipeline_cfg.data - - async def run(self): - """执行迁移""" - - self.ap.pipeline_cfg.data['msg-truncate'] = { - 'method': 'round', - 'round': {'max-round': 10}, - } - - await self.ap.pipeline_cfg.dump_config() diff --git a/src/langbot/pkg/core/migrations/m010_ollama_requester_config.py b/src/langbot/pkg/core/migrations/m010_ollama_requester_config.py deleted file mode 100644 index 8e2e15eb..00000000 --- a/src/langbot/pkg/core/migrations/m010_ollama_requester_config.py +++ /dev/null @@ -1,23 +0,0 @@ -from __future__ import annotations - -from .. import migration - - -@migration.migration_class('ollama-requester-config', 10) -class MsgTruncatorConfigMigration(migration.Migration): - """迁移""" - - async def need_migrate(self) -> bool: - """判断当前环境是否需要运行此迁移""" - return 'ollama-chat' not in self.ap.provider_cfg.data['requester'] - - async def run(self): - """执行迁移""" - - self.ap.provider_cfg.data['requester']['ollama-chat'] = { - 'base-url': 'http://127.0.0.1:11434', - 'args': {}, - 'timeout': 600, - } - - await self.ap.provider_cfg.dump_config() diff --git a/src/langbot/pkg/core/migrations/m011_command_prefix_config.py b/src/langbot/pkg/core/migrations/m011_command_prefix_config.py deleted file mode 100644 index 6165ae47..00000000 --- a/src/langbot/pkg/core/migrations/m011_command_prefix_config.py +++ /dev/null @@ -1,19 +0,0 @@ -from __future__ import annotations - -from .. import migration - - -@migration.migration_class('command-prefix-config', 11) -class CommandPrefixConfigMigration(migration.Migration): - """迁移""" - - async def need_migrate(self) -> bool: - """判断当前环境是否需要运行此迁移""" - return 'command-prefix' not in self.ap.command_cfg.data - - async def run(self): - """执行迁移""" - - self.ap.command_cfg.data['command-prefix'] = ['!', '!'] - - await self.ap.command_cfg.dump_config() diff --git a/src/langbot/pkg/core/migrations/m012_runner_config.py b/src/langbot/pkg/core/migrations/m012_runner_config.py deleted file mode 100644 index e7f0e67a..00000000 --- a/src/langbot/pkg/core/migrations/m012_runner_config.py +++ /dev/null @@ -1,19 +0,0 @@ -from __future__ import annotations - -from .. import migration - - -@migration.migration_class('runner-config', 12) -class RunnerConfigMigration(migration.Migration): - """迁移""" - - async def need_migrate(self) -> bool: - """判断当前环境是否需要运行此迁移""" - return 'runner' not in self.ap.provider_cfg.data - - async def run(self): - """执行迁移""" - - self.ap.provider_cfg.data['runner'] = 'local-agent' - - await self.ap.provider_cfg.dump_config() diff --git a/src/langbot/pkg/core/migrations/m013_http_api_config.py b/src/langbot/pkg/core/migrations/m013_http_api_config.py deleted file mode 100644 index 80e7b74f..00000000 --- a/src/langbot/pkg/core/migrations/m013_http_api_config.py +++ /dev/null @@ -1,29 +0,0 @@ -from __future__ import annotations - -from .. import migration - - -@migration.migration_class('http-api-config', 13) -class HttpApiConfigMigration(migration.Migration): - """迁移""" - - async def need_migrate(self) -> bool: - """判断当前环境是否需要运行此迁移""" - return 'http-api' not in self.ap.system_cfg.data or 'persistence' not in self.ap.system_cfg.data - - async def run(self): - """执行迁移""" - - self.ap.system_cfg.data['http-api'] = { - 'enable': True, - 'host': '0.0.0.0', - 'port': 5300, - 'jwt-expire': 604800, - } - - self.ap.system_cfg.data['persistence'] = { - 'sqlite': {'path': 'data/persistence.db'}, - 'use': 'sqlite', - } - - await self.ap.system_cfg.dump_config() diff --git a/src/langbot/pkg/core/migrations/m014_force_delay_config.py b/src/langbot/pkg/core/migrations/m014_force_delay_config.py deleted file mode 100644 index 005a2ca2..00000000 --- a/src/langbot/pkg/core/migrations/m014_force_delay_config.py +++ /dev/null @@ -1,22 +0,0 @@ -from __future__ import annotations - -from .. import migration - - -@migration.migration_class('force-delay-config', 14) -class ForceDelayConfigMigration(migration.Migration): - """迁移""" - - async def need_migrate(self) -> bool: - """判断当前环境是否需要运行此迁移""" - return isinstance(self.ap.platform_cfg.data['force-delay'], list) - - async def run(self): - """执行迁移""" - - self.ap.platform_cfg.data['force-delay'] = { - 'min': self.ap.platform_cfg.data['force-delay'][0], - 'max': self.ap.platform_cfg.data['force-delay'][1], - } - - await self.ap.platform_cfg.dump_config() diff --git a/src/langbot/pkg/core/migrations/m015_gitee_ai_config.py b/src/langbot/pkg/core/migrations/m015_gitee_ai_config.py deleted file mode 100644 index 7dd9b853..00000000 --- a/src/langbot/pkg/core/migrations/m015_gitee_ai_config.py +++ /dev/null @@ -1,27 +0,0 @@ -from __future__ import annotations - -from .. import migration - - -@migration.migration_class('gitee-ai-config', 15) -class GiteeAIConfigMigration(migration.Migration): - """迁移""" - - async def need_migrate(self) -> bool: - """判断当前环境是否需要运行此迁移""" - return ( - 'gitee-ai-chat-completions' not in self.ap.provider_cfg.data['requester'] - or 'gitee-ai' not in self.ap.provider_cfg.data['keys'] - ) - - async def run(self): - """执行迁移""" - self.ap.provider_cfg.data['requester']['gitee-ai-chat-completions'] = { - 'base-url': 'https://ai.gitee.com/v1', - 'args': {}, - 'timeout': 120, - } - - self.ap.provider_cfg.data['keys']['gitee-ai'] = ['XXXXX'] - - await self.ap.provider_cfg.dump_config() diff --git a/src/langbot/pkg/core/migrations/m016_dify_service_api.py b/src/langbot/pkg/core/migrations/m016_dify_service_api.py deleted file mode 100644 index e7c4dc6d..00000000 --- a/src/langbot/pkg/core/migrations/m016_dify_service_api.py +++ /dev/null @@ -1,23 +0,0 @@ -from __future__ import annotations - -from .. import migration - - -@migration.migration_class('dify-service-api-config', 16) -class DifyServiceAPICfgMigration(migration.Migration): - """迁移""" - - async def need_migrate(self) -> bool: - """判断当前环境是否需要运行此迁移""" - return 'dify-service-api' not in self.ap.provider_cfg.data - - async def run(self): - """执行迁移""" - self.ap.provider_cfg.data['dify-service-api'] = { - 'base-url': 'https://api.dify.ai/v1', - 'app-type': 'chat', - 'chat': {'api-key': 'app-1234567890'}, - 'workflow': {'api-key': 'app-1234567890', 'output-key': 'summary'}, - } - - await self.ap.provider_cfg.dump_config() diff --git a/src/langbot/pkg/core/migrations/m017_dify_api_timeout_params.py b/src/langbot/pkg/core/migrations/m017_dify_api_timeout_params.py deleted file mode 100644 index 67635fb5..00000000 --- a/src/langbot/pkg/core/migrations/m017_dify_api_timeout_params.py +++ /dev/null @@ -1,27 +0,0 @@ -from __future__ import annotations - -from .. import migration - - -@migration.migration_class('dify-api-timeout-params', 17) -class DifyAPITimeoutParamsMigration(migration.Migration): - """迁移""" - - async def need_migrate(self) -> bool: - """判断当前环境是否需要运行此迁移""" - return ( - 'timeout' not in self.ap.provider_cfg.data['dify-service-api']['chat'] - or 'timeout' not in self.ap.provider_cfg.data['dify-service-api']['workflow'] - or 'agent' not in self.ap.provider_cfg.data['dify-service-api'] - ) - - async def run(self): - """执行迁移""" - self.ap.provider_cfg.data['dify-service-api']['chat']['timeout'] = 120 - self.ap.provider_cfg.data['dify-service-api']['workflow']['timeout'] = 120 - self.ap.provider_cfg.data['dify-service-api']['agent'] = { - 'api-key': 'app-1234567890', - 'timeout': 120, - } - - await self.ap.provider_cfg.dump_config() diff --git a/src/langbot/pkg/core/migrations/m018_xai_config.py b/src/langbot/pkg/core/migrations/m018_xai_config.py deleted file mode 100644 index db5ed5bf..00000000 --- a/src/langbot/pkg/core/migrations/m018_xai_config.py +++ /dev/null @@ -1,23 +0,0 @@ -from __future__ import annotations - -from .. import migration - - -@migration.migration_class('xai-config', 18) -class XaiConfigMigration(migration.Migration): - """迁移""" - - async def need_migrate(self) -> bool: - """判断当前环境是否需要运行此迁移""" - return 'xai-chat-completions' not in self.ap.provider_cfg.data['requester'] - - async def run(self): - """执行迁移""" - self.ap.provider_cfg.data['requester']['xai-chat-completions'] = { - 'base-url': 'https://api.x.ai/v1', - 'args': {}, - 'timeout': 120, - } - self.ap.provider_cfg.data['keys']['xai'] = ['xai-1234567890'] - - await self.ap.provider_cfg.dump_config() diff --git a/src/langbot/pkg/core/migrations/m019_zhipuai_config.py b/src/langbot/pkg/core/migrations/m019_zhipuai_config.py deleted file mode 100644 index 081d8dcf..00000000 --- a/src/langbot/pkg/core/migrations/m019_zhipuai_config.py +++ /dev/null @@ -1,23 +0,0 @@ -from __future__ import annotations - -from .. import migration - - -@migration.migration_class('zhipuai-config', 19) -class ZhipuaiConfigMigration(migration.Migration): - """迁移""" - - async def need_migrate(self) -> bool: - """判断当前环境是否需要运行此迁移""" - return 'zhipuai-chat-completions' not in self.ap.provider_cfg.data['requester'] - - async def run(self): - """执行迁移""" - self.ap.provider_cfg.data['requester']['zhipuai-chat-completions'] = { - 'base-url': 'https://open.bigmodel.cn/api/paas/v4', - 'args': {}, - 'timeout': 120, - } - self.ap.provider_cfg.data['keys']['zhipuai'] = ['xxxxxxx'] - - await self.ap.provider_cfg.dump_config() diff --git a/src/langbot/pkg/core/migrations/m020_wecom_config.py b/src/langbot/pkg/core/migrations/m020_wecom_config.py deleted file mode 100644 index 3e833d3e..00000000 --- a/src/langbot/pkg/core/migrations/m020_wecom_config.py +++ /dev/null @@ -1,36 +0,0 @@ -from __future__ import annotations - -from .. import migration - - -@migration.migration_class('wecom-config', 20) -class WecomConfigMigration(migration.Migration): - """迁移""" - - async def need_migrate(self) -> bool: - """判断当前环境是否需要运行此迁移""" - - # for adapter in self.ap.platform_cfg.data['platform-adapters']: - # if adapter['adapter'] == 'wecom': - # return False - - # return True - return False - - async def run(self): - """执行迁移""" - self.ap.platform_cfg.data['platform-adapters'].append( - { - 'adapter': 'wecom', - 'enable': False, - 'host': '0.0.0.0', - 'port': 2290, - 'corpid': '', - 'secret': '', - 'token': '', - 'EncodingAESKey': '', - 'contacts_secret': '', - } - ) - - await self.ap.platform_cfg.dump_config() diff --git a/src/langbot/pkg/core/migrations/m021_lark_config.py b/src/langbot/pkg/core/migrations/m021_lark_config.py deleted file mode 100644 index 04f29db4..00000000 --- a/src/langbot/pkg/core/migrations/m021_lark_config.py +++ /dev/null @@ -1,35 +0,0 @@ -from __future__ import annotations - -from .. import migration - - -@migration.migration_class('lark-config', 21) -class LarkConfigMigration(migration.Migration): - """迁移""" - - async def need_migrate(self) -> bool: - """判断当前环境是否需要运行此迁移""" - - # for adapter in self.ap.platform_cfg.data['platform-adapters']: - # if adapter['adapter'] == 'lark': - # return False - - # return True - return False - - async def run(self): - """执行迁移""" - self.ap.platform_cfg.data['platform-adapters'].append( - { - 'adapter': 'lark', - 'enable': False, - 'app_id': 'cli_abcdefgh', - 'app_secret': 'XXXXXXXXXX', - 'bot_name': 'LangBot', - 'enable-webhook': False, - 'port': 2285, - 'encrypt-key': 'xxxxxxxxx', - } - ) - - await self.ap.platform_cfg.dump_config() diff --git a/src/langbot/pkg/core/migrations/m022_lmstudio_config.py b/src/langbot/pkg/core/migrations/m022_lmstudio_config.py deleted file mode 100644 index bffc6bb8..00000000 --- a/src/langbot/pkg/core/migrations/m022_lmstudio_config.py +++ /dev/null @@ -1,23 +0,0 @@ -from __future__ import annotations - -from .. import migration - - -@migration.migration_class('lmstudio-config', 22) -class LmStudioConfigMigration(migration.Migration): - """迁移""" - - async def need_migrate(self) -> bool: - """判断当前环境是否需要运行此迁移""" - - return 'lmstudio-chat-completions' not in self.ap.provider_cfg.data['requester'] - - async def run(self): - """执行迁移""" - self.ap.provider_cfg.data['requester']['lmstudio-chat-completions'] = { - 'base-url': 'http://127.0.0.1:1234/v1', - 'args': {}, - 'timeout': 120, - } - - await self.ap.provider_cfg.dump_config() diff --git a/src/langbot/pkg/core/migrations/m023_siliconflow_config.py b/src/langbot/pkg/core/migrations/m023_siliconflow_config.py deleted file mode 100644 index 31b9ee8e..00000000 --- a/src/langbot/pkg/core/migrations/m023_siliconflow_config.py +++ /dev/null @@ -1,25 +0,0 @@ -from __future__ import annotations - -from .. import migration - - -@migration.migration_class('siliconflow-config', 23) -class SiliconFlowConfigMigration(migration.Migration): - """迁移""" - - async def need_migrate(self) -> bool: - """判断当前环境是否需要运行此迁移""" - - return 'siliconflow-chat-completions' not in self.ap.provider_cfg.data['requester'] - - async def run(self): - """执行迁移""" - self.ap.provider_cfg.data['keys']['siliconflow'] = ['xxxxxxx'] - - self.ap.provider_cfg.data['requester']['siliconflow-chat-completions'] = { - 'base-url': 'https://api.siliconflow.cn/v1', - 'args': {}, - 'timeout': 120, - } - - await self.ap.provider_cfg.dump_config() diff --git a/src/langbot/pkg/core/migrations/m024_discord_config.py b/src/langbot/pkg/core/migrations/m024_discord_config.py deleted file mode 100644 index ebcae232..00000000 --- a/src/langbot/pkg/core/migrations/m024_discord_config.py +++ /dev/null @@ -1,31 +0,0 @@ -from __future__ import annotations - -from .. import migration - - -@migration.migration_class('discord-config', 24) -class DiscordConfigMigration(migration.Migration): - """迁移""" - - async def need_migrate(self) -> bool: - """判断当前环境是否需要运行此迁移""" - - # for adapter in self.ap.platform_cfg.data['platform-adapters']: - # if adapter['adapter'] == 'discord': - # return False - - # return True - return False - - async def run(self): - """执行迁移""" - self.ap.platform_cfg.data['platform-adapters'].append( - { - 'adapter': 'discord', - 'enable': False, - 'client_id': '1234567890', - 'token': 'XXXXXXXXXX', - } - ) - - await self.ap.platform_cfg.dump_config() diff --git a/src/langbot/pkg/core/migrations/m025_gewechat_config.py b/src/langbot/pkg/core/migrations/m025_gewechat_config.py deleted file mode 100644 index bb729854..00000000 --- a/src/langbot/pkg/core/migrations/m025_gewechat_config.py +++ /dev/null @@ -1,35 +0,0 @@ -from __future__ import annotations - -from .. import migration - - -@migration.migration_class('gewechat-config', 25) -class GewechatConfigMigration(migration.Migration): - """迁移""" - - async def need_migrate(self) -> bool: - """判断当前环境是否需要运行此迁移""" - - # for adapter in self.ap.platform_cfg.data['platform-adapters']: - # if adapter['adapter'] == 'gewechat': - # return False - - # return True - return False - - async def run(self): - """执行迁移""" - self.ap.platform_cfg.data['platform-adapters'].append( - { - 'adapter': 'gewechat', - 'enable': False, - 'gewechat_url': 'http://your-gewechat-server:2531', - 'gewechat_file_url': 'http://your-gewechat-server:2532', - 'port': 2286, - 'callback_url': 'http://your-callback-url:2286/gewechat/callback', - 'app_id': '', - 'token': '', - } - ) - - await self.ap.platform_cfg.dump_config() diff --git a/src/langbot/pkg/core/migrations/m026_qqofficial_config.py b/src/langbot/pkg/core/migrations/m026_qqofficial_config.py deleted file mode 100644 index 90674341..00000000 --- a/src/langbot/pkg/core/migrations/m026_qqofficial_config.py +++ /dev/null @@ -1,33 +0,0 @@ -from __future__ import annotations - -from .. import migration - - -@migration.migration_class('qqofficial-config', 26) -class QQOfficialConfigMigration(migration.Migration): - """迁移""" - - async def need_migrate(self) -> bool: - """判断当前环境是否需要运行此迁移""" - - # for adapter in self.ap.platform_cfg.data['platform-adapters']: - # if adapter['adapter'] == 'qqofficial': - # return False - - # return True - return False - - async def run(self): - """执行迁移""" - self.ap.platform_cfg.data['platform-adapters'].append( - { - 'adapter': 'qqofficial', - 'enable': False, - 'appid': '', - 'secret': '', - 'port': 2284, - 'token': '', - } - ) - - await self.ap.platform_cfg.dump_config() diff --git a/src/langbot/pkg/core/migrations/m027_wx_official_account_config.py b/src/langbot/pkg/core/migrations/m027_wx_official_account_config.py deleted file mode 100644 index 7c5b0e35..00000000 --- a/src/langbot/pkg/core/migrations/m027_wx_official_account_config.py +++ /dev/null @@ -1,35 +0,0 @@ -from __future__ import annotations - -from .. import migration - - -@migration.migration_class('wx-official-account-config', 27) -class WXOfficialAccountConfigMigration(migration.Migration): - """迁移""" - - async def need_migrate(self) -> bool: - """判断当前环境是否需要运行此迁移""" - - # for adapter in self.ap.platform_cfg.data['platform-adapters']: - # if adapter['adapter'] == 'officialaccount': - # return False - - # return True - return False - - async def run(self): - """执行迁移""" - self.ap.platform_cfg.data['platform-adapters'].append( - { - 'adapter': 'officialaccount', - 'enable': False, - 'token': '', - 'EncodingAESKey': '', - 'AppID': '', - 'AppSecret': '', - 'host': '0.0.0.0', - 'port': 2287, - } - ) - - await self.ap.platform_cfg.dump_config() diff --git a/src/langbot/pkg/core/migrations/m028_aliyun_requester_config.py b/src/langbot/pkg/core/migrations/m028_aliyun_requester_config.py deleted file mode 100644 index 8d80727a..00000000 --- a/src/langbot/pkg/core/migrations/m028_aliyun_requester_config.py +++ /dev/null @@ -1,25 +0,0 @@ -from __future__ import annotations - -from .. import migration - - -@migration.migration_class('bailian-requester-config', 28) -class BailianRequesterConfigMigration(migration.Migration): - """迁移""" - - async def need_migrate(self) -> bool: - """判断当前环境是否需要运行此迁移""" - - return 'bailian-chat-completions' not in self.ap.provider_cfg.data['requester'] - - async def run(self): - """执行迁移""" - self.ap.provider_cfg.data['keys']['bailian'] = ['sk-xxxxxxx'] - - self.ap.provider_cfg.data['requester']['bailian-chat-completions'] = { - 'base-url': 'https://dashscope.aliyuncs.com/compatible-mode/v1', - 'args': {}, - 'timeout': 120, - } - - await self.ap.provider_cfg.dump_config() diff --git a/src/langbot/pkg/core/migrations/m029_dashscope_app_api_config.py b/src/langbot/pkg/core/migrations/m029_dashscope_app_api_config.py deleted file mode 100644 index 5a61fe0d..00000000 --- a/src/langbot/pkg/core/migrations/m029_dashscope_app_api_config.py +++ /dev/null @@ -1,27 +0,0 @@ -from __future__ import annotations - -from .. import migration - - -@migration.migration_class('dashscope-app-api-config', 29) -class DashscopeAppAPICfgMigration(migration.Migration): - """迁移""" - - async def need_migrate(self) -> bool: - """判断当前环境是否需要运行此迁移""" - return 'dashscope-app-api' not in self.ap.provider_cfg.data - - async def run(self): - """执行迁移""" - self.ap.provider_cfg.data['dashscope-app-api'] = { - 'app-type': 'agent', - 'api-key': 'sk-1234567890', - 'agent': {'app-id': 'Your_app_id', 'references_quote': '参考资料来自:'}, - 'workflow': { - 'app-id': 'Your_app_id', - 'references_quote': '参考资料来自:', - 'biz_params': {'city': '北京', 'date': '2023-08-10'}, - }, - } - - await self.ap.provider_cfg.dump_config() diff --git a/src/langbot/pkg/core/migrations/m030_lark_config_cmpl.py b/src/langbot/pkg/core/migrations/m030_lark_config_cmpl.py deleted file mode 100644 index 37e8fabe..00000000 --- a/src/langbot/pkg/core/migrations/m030_lark_config_cmpl.py +++ /dev/null @@ -1,31 +0,0 @@ -from __future__ import annotations - -from .. import migration - - -@migration.migration_class('lark-config-cmpl', 30) -class LarkConfigCmplMigration(migration.Migration): - """迁移""" - - async def need_migrate(self) -> bool: - """判断当前环境是否需要运行此迁移""" - - for adapter in self.ap.platform_cfg.data['platform-adapters']: - if adapter['adapter'] == 'lark': - if 'enable-webhook' not in adapter: - return True - - return False - - async def run(self): - """执行迁移""" - for adapter in self.ap.platform_cfg.data['platform-adapters']: - if adapter['adapter'] == 'lark': - if 'enable-webhook' not in adapter: - adapter['enable-webhook'] = False - if 'port' not in adapter: - adapter['port'] = 2285 - if 'encrypt-key' not in adapter: - adapter['encrypt-key'] = 'xxxxxxxxx' - - await self.ap.platform_cfg.dump_config() diff --git a/src/langbot/pkg/core/migrations/m031_dingtalk_config.py b/src/langbot/pkg/core/migrations/m031_dingtalk_config.py deleted file mode 100644 index 22ba0bbf..00000000 --- a/src/langbot/pkg/core/migrations/m031_dingtalk_config.py +++ /dev/null @@ -1,33 +0,0 @@ -from __future__ import annotations - -from .. import migration - - -@migration.migration_class('dingtalk-config', 31) -class DingTalkConfigMigration(migration.Migration): - """迁移""" - - async def need_migrate(self) -> bool: - """判断当前环境是否需要运行此迁移""" - - # for adapter in self.ap.platform_cfg.data['platform-adapters']: - # if adapter['adapter'] == 'dingtalk': - # return False - - # return True - return False - - async def run(self): - """执行迁移""" - self.ap.platform_cfg.data['platform-adapters'].append( - { - 'adapter': 'dingtalk', - 'enable': False, - 'client_id': '', - 'client_secret': '', - 'robot_code': '', - 'robot_name': '', - } - ) - - await self.ap.platform_cfg.dump_config() diff --git a/src/langbot/pkg/core/migrations/m032_volcark_config.py b/src/langbot/pkg/core/migrations/m032_volcark_config.py deleted file mode 100644 index ae8feb52..00000000 --- a/src/langbot/pkg/core/migrations/m032_volcark_config.py +++ /dev/null @@ -1,25 +0,0 @@ -from __future__ import annotations - -from .. import migration - - -@migration.migration_class('volcark-requester-config', 32) -class VolcArkRequesterConfigMigration(migration.Migration): - """迁移""" - - async def need_migrate(self) -> bool: - """判断当前环境是否需要运行此迁移""" - - return 'volcark-chat-completions' not in self.ap.provider_cfg.data['requester'] - - async def run(self): - """执行迁移""" - self.ap.provider_cfg.data['keys']['volcark'] = ['xxxxxxxx'] - - self.ap.provider_cfg.data['requester']['volcark-chat-completions'] = { - 'base-url': 'https://ark.cn-beijing.volces.com/api/v3', - 'args': {}, - 'timeout': 120, - } - - await self.ap.provider_cfg.dump_config() diff --git a/src/langbot/pkg/core/migrations/m033_dify_thinking_config.py b/src/langbot/pkg/core/migrations/m033_dify_thinking_config.py deleted file mode 100644 index 7269765a..00000000 --- a/src/langbot/pkg/core/migrations/m033_dify_thinking_config.py +++ /dev/null @@ -1,24 +0,0 @@ -from __future__ import annotations - -from .. import migration - - -@migration.migration_class('dify-thinking-config', 33) -class DifyThinkingConfigMigration(migration.Migration): - """迁移""" - - async def need_migrate(self) -> bool: - """判断当前环境是否需要运行此迁移""" - - if 'options' not in self.ap.provider_cfg.data['dify-service-api']: - return True - - if 'convert-thinking-tips' not in self.ap.provider_cfg.data['dify-service-api']['options']: - return True - - return False - - async def run(self): - """执行迁移""" - self.ap.provider_cfg.data['dify-service-api']['options'] = {'convert-thinking-tips': 'plain'} - await self.ap.provider_cfg.dump_config() diff --git a/src/langbot/pkg/core/migrations/m034_gewechat_file_url_config.py b/src/langbot/pkg/core/migrations/m034_gewechat_file_url_config.py deleted file mode 100644 index 512b75b1..00000000 --- a/src/langbot/pkg/core/migrations/m034_gewechat_file_url_config.py +++ /dev/null @@ -1,29 +0,0 @@ -from __future__ import annotations - -from urllib.parse import urlparse - -from .. import migration - - -@migration.migration_class('gewechat-file-url-config', 34) -class GewechatFileUrlConfigMigration(migration.Migration): - """迁移""" - - async def need_migrate(self) -> bool: - """判断当前环境是否需要运行此迁移""" - - for adapter in self.ap.platform_cfg.data['platform-adapters']: - if adapter['adapter'] == 'gewechat': - if 'gewechat_file_url' not in adapter: - return True - return False - - async def run(self): - """执行迁移""" - for adapter in self.ap.platform_cfg.data['platform-adapters']: - if adapter['adapter'] == 'gewechat': - if 'gewechat_file_url' not in adapter: - parsed_url = urlparse(adapter['gewechat_url']) - adapter['gewechat_file_url'] = f'{parsed_url.scheme}://{parsed_url.hostname}:2532' - - await self.ap.platform_cfg.dump_config() diff --git a/src/langbot/pkg/core/migrations/m035_wxoa_mode.py b/src/langbot/pkg/core/migrations/m035_wxoa_mode.py deleted file mode 100644 index 6b675e30..00000000 --- a/src/langbot/pkg/core/migrations/m035_wxoa_mode.py +++ /dev/null @@ -1,26 +0,0 @@ -from __future__ import annotations - -from .. import migration - - -@migration.migration_class('wxoa-mode', 35) -class WxoaModeMigration(migration.Migration): - """迁移""" - - async def need_migrate(self) -> bool: - """判断当前环境是否需要运行此迁移""" - - for adapter in self.ap.platform_cfg.data['platform-adapters']: - if adapter['adapter'] == 'officialaccount': - if 'Mode' not in adapter: - return True - return False - - async def run(self): - """执行迁移""" - for adapter in self.ap.platform_cfg.data['platform-adapters']: - if adapter['adapter'] == 'officialaccount': - if 'Mode' not in adapter: - adapter['Mode'] = 'drop' - - await self.ap.platform_cfg.dump_config() diff --git a/src/langbot/pkg/core/migrations/m036_wxoa_loading_message.py b/src/langbot/pkg/core/migrations/m036_wxoa_loading_message.py deleted file mode 100644 index 29ecba20..00000000 --- a/src/langbot/pkg/core/migrations/m036_wxoa_loading_message.py +++ /dev/null @@ -1,26 +0,0 @@ -from __future__ import annotations - -from .. import migration - - -@migration.migration_class('wxoa-loading-message', 36) -class WxoaLoadingMessageMigration(migration.Migration): - """迁移""" - - async def need_migrate(self) -> bool: - """判断当前环境是否需要运行此迁移""" - - for adapter in self.ap.platform_cfg.data['platform-adapters']: - if adapter['adapter'] == 'officialaccount': - if 'LoadingMessage' not in adapter: - return True - return False - - async def run(self): - """执行迁移""" - for adapter in self.ap.platform_cfg.data['platform-adapters']: - if adapter['adapter'] == 'officialaccount': - if 'LoadingMessage' not in adapter: - adapter['LoadingMessage'] = 'AI正在思考中,请发送任意内容获取回复。' - - await self.ap.platform_cfg.dump_config() diff --git a/src/langbot/pkg/core/migrations/m037_mcp_config.py b/src/langbot/pkg/core/migrations/m037_mcp_config.py deleted file mode 100644 index 3752193e..00000000 --- a/src/langbot/pkg/core/migrations/m037_mcp_config.py +++ /dev/null @@ -1,18 +0,0 @@ -from __future__ import annotations - -from .. import migration - - -@migration.migration_class('mcp-config', 37) -class MCPConfigMigration(migration.Migration): - """迁移""" - - async def need_migrate(self) -> bool: - """判断当前环境是否需要运行此迁移""" - return 'mcp' not in self.ap.provider_cfg.data - - async def run(self): - """执行迁移""" - self.ap.provider_cfg.data['mcp'] = {'servers': []} - - await self.ap.provider_cfg.dump_config() diff --git a/src/langbot/pkg/core/migrations/m038_tg_dingtalk_markdown.py b/src/langbot/pkg/core/migrations/m038_tg_dingtalk_markdown.py deleted file mode 100644 index c0a85a44..00000000 --- a/src/langbot/pkg/core/migrations/m038_tg_dingtalk_markdown.py +++ /dev/null @@ -1,25 +0,0 @@ -from __future__ import annotations - -from .. import migration - - -@migration.migration_class('tg-dingtalk-markdown', 38) -class TgDingtalkMarkdownMigration(migration.Migration): - """迁移""" - - async def need_migrate(self) -> bool: - """判断当前环境是否需要运行此迁移""" - - for adapter in self.ap.platform_cfg.data['platform-adapters']: - if adapter['adapter'] in ['dingtalk', 'telegram']: - if 'markdown_card' not in adapter: - return True - return False - - async def run(self): - """执行迁移""" - for adapter in self.ap.platform_cfg.data['platform-adapters']: - if adapter['adapter'] in ['dingtalk', 'telegram']: - if 'markdown_card' not in adapter: - adapter['markdown_card'] = False - await self.ap.platform_cfg.dump_config() diff --git a/src/langbot/pkg/core/migrations/m039_modelscope_cfg_completion.py b/src/langbot/pkg/core/migrations/m039_modelscope_cfg_completion.py deleted file mode 100644 index 9eec0344..00000000 --- a/src/langbot/pkg/core/migrations/m039_modelscope_cfg_completion.py +++ /dev/null @@ -1,29 +0,0 @@ -from __future__ import annotations - -from .. import migration - - -@migration.migration_class('modelscope-config-completion', 39) -class ModelScopeConfigCompletionMigration(migration.Migration): - """ModelScope配置迁移""" - - async def need_migrate(self) -> bool: - """判断当前环境是否需要运行此迁移""" - return ( - 'modelscope-chat-completions' not in self.ap.provider_cfg.data['requester'] - or 'modelscope' not in self.ap.provider_cfg.data['keys'] - ) - - async def run(self): - """执行迁移""" - if 'modelscope-chat-completions' not in self.ap.provider_cfg.data['requester']: - self.ap.provider_cfg.data['requester']['modelscope-chat-completions'] = { - 'base-url': 'https://api-inference.modelscope.cn/v1', - 'args': {}, - 'timeout': 120, - } - - if 'modelscope' not in self.ap.provider_cfg.data['keys']: - self.ap.provider_cfg.data['keys']['modelscope'] = [] - - await self.ap.provider_cfg.dump_config() diff --git a/src/langbot/pkg/core/migrations/m040_ppio_config.py b/src/langbot/pkg/core/migrations/m040_ppio_config.py deleted file mode 100644 index d4d82b98..00000000 --- a/src/langbot/pkg/core/migrations/m040_ppio_config.py +++ /dev/null @@ -1,29 +0,0 @@ -from __future__ import annotations - -from .. import migration - - -@migration.migration_class('ppio-config', 40) -class PPIOConfigMigration(migration.Migration): - """PPIO配置迁移""" - - async def need_migrate(self) -> bool: - """判断当前环境是否需要运行此迁移""" - return ( - 'ppio-chat-completions' not in self.ap.provider_cfg.data['requester'] - or 'ppio' not in self.ap.provider_cfg.data['keys'] - ) - - async def run(self): - """执行迁移""" - if 'ppio-chat-completions' not in self.ap.provider_cfg.data['requester']: - self.ap.provider_cfg.data['requester']['ppio-chat-completions'] = { - 'base-url': 'https://api.ppinfra.com/v3/openai', - 'args': {}, - 'timeout': 120, - } - - if 'ppio' not in self.ap.provider_cfg.data['keys']: - self.ap.provider_cfg.data['keys']['ppio'] = [] - - await self.ap.provider_cfg.dump_config() diff --git a/src/langbot/pkg/core/migrations/m041_dingtalk_card_autolayout_config.py b/src/langbot/pkg/core/migrations/m041_dingtalk_card_autolayout_config.py deleted file mode 100644 index 58968d4d..00000000 --- a/src/langbot/pkg/core/migrations/m041_dingtalk_card_autolayout_config.py +++ /dev/null @@ -1,17 +0,0 @@ -from __future__ import annotations - -from .. import migration - - -@migration.migration_class('dingtalk_card_auto_layout', 41) -class DingTalkCardAutoLayoutMigration(migration.Migration): - """迁移""" - - async def need_migrate(self) -> bool: - """判断当前环境是否需要运行此迁移""" - return True - - async def run(self): - """执行迁移""" - self.ap.platform_cfg.data['platform-adapters']['app']['dingtalk']['card_auto_layout'] = False - await self.ap.platform_cfg.dump_config() diff --git a/src/langbot/pkg/core/migrations/m042_weknora_api.py b/src/langbot/pkg/core/migrations/m042_weknora_api.py deleted file mode 100644 index c3a5bf78..00000000 --- a/src/langbot/pkg/core/migrations/m042_weknora_api.py +++ /dev/null @@ -1,27 +0,0 @@ -from __future__ import annotations - -from .. import migration - - -@migration.migration_class('weknora-api-config', 42) -class WeKnoraAPICfgMigration(migration.Migration): - """WeKnora API 配置迁移""" - - async def need_migrate(self) -> bool: - """判断当前环境是否需要运行此迁移""" - return 'weknora-api' not in self.ap.provider_cfg.data - - async def run(self): - """执行迁移""" - self.ap.provider_cfg.data['weknora-api'] = { - 'base-url': 'http://localhost:8080/api/v1', - 'app-type': 'agent', - 'api-key': '', - 'agent-id': 'builtin-smart-reasoning', - 'knowledge-base-ids': [], - 'web-search-enabled': False, - 'timeout': 120, - 'base-prompt': '请回答用户的问题。', - } - - await self.ap.provider_cfg.dump_config() diff --git a/src/langbot/pkg/core/migrations/m043_deerflow_api.py b/src/langbot/pkg/core/migrations/m043_deerflow_api.py deleted file mode 100644 index e6cc2c7d..00000000 --- a/src/langbot/pkg/core/migrations/m043_deerflow_api.py +++ /dev/null @@ -1,30 +0,0 @@ -from __future__ import annotations - -from .. import migration - - -@migration.migration_class('deerflow-api-config', 43) -class DeerFlowAPICfgMigration(migration.Migration): - """DeerFlow API 配置迁移""" - - async def need_migrate(self) -> bool: - """判断当前环境是否需要运行此迁移""" - return 'deerflow-api' not in self.ap.provider_cfg.data - - async def run(self): - """执行迁移""" - self.ap.provider_cfg.data['deerflow-api'] = { - 'api-base': 'http://127.0.0.1:2026', - 'api-key': '', - 'auth-header': '', - 'assistant-id': 'lead_agent', - 'model-name': '', - 'thinking-enabled': False, - 'plan-mode': False, - 'subagent-enabled': False, - 'max-concurrent-subagents': 3, - 'timeout': 300, - 'recursion-limit': 1000, - } - - await self.ap.provider_cfg.dump_config() diff --git a/src/langbot/pkg/core/stages/migrate.py b/src/langbot/pkg/core/stages/migrate.py deleted file mode 100644 index 229e0060..00000000 --- a/src/langbot/pkg/core/stages/migrate.py +++ /dev/null @@ -1,43 +0,0 @@ -from __future__ import annotations - - -from .. import stage, app -from .. import migration -from ...utils import importutil -from .. import migrations - -importutil.import_modules_in_pkg(migrations) - - -@stage.stage_class('MigrationStage') -class MigrationStage(stage.BootingStage): - """Migration stage - - These migrations are legacy, only performed in version 3.x - """ - - async def run(self, ap: app.Application): - """Run migration""" - - if any( - [ - ap.command_cfg is None, - ap.pipeline_cfg is None, - ap.platform_cfg is None, - ap.provider_cfg is None, - ap.system_cfg is None, - ] - ): # only run migration when version is 3.x - return - - migrations = migration.preregistered_migrations - - # Sort by migration number - migrations.sort(key=lambda x: x.number) - - for migration_cls in migrations: - migration_instance = migration_cls(ap) - - if await migration_instance.need_migrate(): - await migration_instance.run() - print(f'Migration {migration_instance.name} executed') diff --git a/tests/unit_tests/core/test_migration.py b/tests/unit_tests/core/test_migration.py deleted file mode 100644 index 829cdbbd..00000000 --- a/tests/unit_tests/core/test_migration.py +++ /dev/null @@ -1,238 +0,0 @@ -"""Tests for core migration registration and abstract classes.""" - -from __future__ import annotations - -from unittest.mock import MagicMock -import pytest - -from tests.utils.import_isolation import isolated_sys_modules - - -class TestMigrationClassDecorator: - """Tests for @migration_class decorator.""" - - def _make_migration_import_mocks(self): - """Create mocks for migration import.""" - return { - 'langbot.pkg.core.app': MagicMock(), - } - - def test_migration_class_registers_migration(self): - """@migration_class registers migration in preregistered_migrations.""" - mocks = self._make_migration_import_mocks() - - with isolated_sys_modules(mocks): - from langbot.pkg.core.migration import migration_class, preregistered_migrations - - # Clear for clean test - preregistered_migrations.clear() - - @migration_class('test-migration', 1) - class TestMigration: - pass - - assert len(preregistered_migrations) == 1 - assert preregistered_migrations[0] == TestMigration - - def test_migration_class_sets_name_attribute(self): - """@migration_class sets name attribute on class.""" - mocks = self._make_migration_import_mocks() - - with isolated_sys_modules(mocks): - from langbot.pkg.core.migration import migration_class - - @migration_class('test-migration', 1) - class TestMigration: - pass - - assert TestMigration.name == 'test-migration' - - def test_migration_class_sets_number_attribute(self): - """@migration_class sets number attribute on class.""" - mocks = self._make_migration_import_mocks() - - with isolated_sys_modules(mocks): - from langbot.pkg.core.migration import migration_class - - @migration_class('test-migration', 42) - class TestMigration: - pass - - assert TestMigration.number == 42 - - def test_migration_class_returns_original_class(self): - """@migration_class returns the original class.""" - mocks = self._make_migration_import_mocks() - - with isolated_sys_modules(mocks): - from langbot.pkg.core.migration import migration_class - - @migration_class('test', 1) - class TestMigration: - custom_attr = 'value' - - assert TestMigration.custom_attr == 'value' - - def test_migration_class_multiple_migrations(self): - """Multiple migrations can be registered.""" - mocks = self._make_migration_import_mocks() - - with isolated_sys_modules(mocks): - from langbot.pkg.core.migration import migration_class, preregistered_migrations - - preregistered_migrations.clear() - - @migration_class('migration1', 1) - class Migration1: - pass - - @migration_class('migration2', 2) - class Migration2: - pass - - assert len(preregistered_migrations) == 2 - assert preregistered_migrations[0] == Migration1 - assert preregistered_migrations[1] == Migration2 - - -class TestMigrationAbstractClass: - """Tests for Migration abstract class.""" - - def _make_migration_import_mocks(self): - return {'langbot.pkg.core.app': MagicMock()} - - def test_migration_is_abstract(self): - """Migration is abstract and cannot be instantiated directly.""" - mocks = self._make_migration_import_mocks() - - with isolated_sys_modules(mocks): - from langbot.pkg.core.migration import Migration - - with pytest.raises(TypeError): - Migration(MagicMock()) - - def test_migration_requires_need_migrate_method(self): - """Subclass must implement need_migrate method.""" - mocks = self._make_migration_import_mocks() - - with isolated_sys_modules(mocks): - from langbot.pkg.core.migration import Migration - - class IncompleteMigration(Migration): - async def run(self): - pass - - with pytest.raises(TypeError): - IncompleteMigration(MagicMock()) - - def test_migration_requires_run_method(self): - """Subclass must implement run method.""" - mocks = self._make_migration_import_mocks() - - with isolated_sys_modules(mocks): - from langbot.pkg.core.migration import Migration - - class IncompleteMigration(Migration): - async def need_migrate(self) -> bool: - return False - - with pytest.raises(TypeError): - IncompleteMigration(MagicMock()) - - def test_migration_subclass_works(self): - """Complete subclass can be instantiated.""" - mocks = self._make_migration_import_mocks() - - with isolated_sys_modules(mocks): - from langbot.pkg.core.migration import Migration - - class CompleteMigration(Migration): - async def need_migrate(self) -> bool: - return True - - async def run(self): - pass - - mock_ap = MagicMock() - migration = CompleteMigration(mock_ap) - assert migration.ap == mock_ap - - def test_migration_stores_app_reference(self): - """Migration stores ap reference in __init__.""" - mocks = self._make_migration_import_mocks() - - with isolated_sys_modules(mocks): - from langbot.pkg.core.migration import Migration - - class TestMigration(Migration): - async def need_migrate(self) -> bool: - return False - - async def run(self): - pass - - mock_ap = MagicMock() - migration = TestMigration(mock_ap) - assert migration.ap is mock_ap - - @pytest.mark.asyncio - async def test_migration_need_migrate_returns_bool(self): - """need_migrate must return bool.""" - mocks = self._make_migration_import_mocks() - - with isolated_sys_modules(mocks): - from langbot.pkg.core.migration import Migration - - class TestMigration(Migration): - async def need_migrate(self) -> bool: - return True - - async def run(self): - pass - - migration = TestMigration(MagicMock()) - result = await migration.need_migrate() - assert isinstance(result, bool) - assert result == True - - -class TestPreregisteredMigrations: - """Tests for preregistered_migrations global registry.""" - - def _make_migration_import_mocks(self): - return {'langbot.pkg.core.app': MagicMock()} - - def test_preregistered_migrations_is_list(self): - """preregistered_migrations is a list.""" - mocks = self._make_migration_import_mocks() - - with isolated_sys_modules(mocks): - from langbot.pkg.core.migration import preregistered_migrations - - assert isinstance(preregistered_migrations, list) - - def test_preregistered_migrations_order(self): - """Migrations are registered in order of decoration.""" - mocks = self._make_migration_import_mocks() - - with isolated_sys_modules(mocks): - from langbot.pkg.core.migration import migration_class, preregistered_migrations - - preregistered_migrations.clear() - - @migration_class('first', 1) - class First: - pass - - @migration_class('second', 2) - class Second: - pass - - @migration_class('third', 3) - class Third: - pass - - # Order should match decoration order - assert preregistered_migrations[0].number == 1 - assert preregistered_migrations[1].number == 2 - assert preregistered_migrations[2].number == 3 \ No newline at end of file