重构:移除 AI 管理模块

This commit is contained in:
焦龙言
2026-07-24 19:06:55 +08:00
parent a509dada79
commit 5209911dd8
32 changed files with 96 additions and 4084 deletions
@@ -0,0 +1,92 @@
import json
import re
import unittest
from pathlib import Path
PROJECT_ROOT = Path(__file__).resolve().parents[3]
BACKEND_ROOT = PROJECT_ROOT / 'shierfeng-fastapi-backend'
FRONTEND_ROOT = PROJECT_ROOT / 'shierfeng-fastapi-frontend'
AI_DEPENDENCIES = {
'agno',
'anthropic',
'cerebras-cloud-sdk',
'cohere',
'google-genai',
'groq',
'litellm',
'llama-api-client',
'mistralai',
'ollama',
'openai',
'portkey-ai',
}
AI_FRONTEND_DEPENDENCIES = {
'katex',
'markstream-vue',
'mermaid',
'shiki',
'stream-markdown',
'stream-monaco',
'uuid',
'vite-plugin-monaco-editor-esm',
}
def _parse_requirement_names(requirements_path: Path) -> set[str]:
names = set()
for raw_line in requirements_path.read_text(encoding='utf-8').splitlines():
line = raw_line.partition('#')[0].strip()
if not line or line == '.':
continue
match = re.match(r'[A-Za-z0-9_.-]+', line)
if match:
names.add(match.group(0).lower().replace('_', '-'))
return names
class AiRemovalContractTest(unittest.TestCase):
def test_ai_source_files_are_removed(self) -> None:
remaining_files = []
module_ai = BACKEND_ROOT / 'module_ai'
if module_ai.exists():
remaining_files.extend(module_ai.rglob('*.py'))
explicit_files = (
BACKEND_ROOT / 'utils/ai_util.py',
BACKEND_ROOT / 'utils/crypto_util.py',
FRONTEND_ROOT / 'src/api/ai/chat.js',
FRONTEND_ROOT / 'src/api/ai/model.js',
FRONTEND_ROOT / 'src/views/ai/chat/components/AiMessage.vue',
FRONTEND_ROOT / 'src/views/ai/chat/index.vue',
FRONTEND_ROOT / 'src/views/ai/model/index.vue',
FRONTEND_ROOT / 'src/assets/icons/svg/ai-chat.svg',
FRONTEND_ROOT / 'src/assets/icons/svg/ai-manage.svg',
FRONTEND_ROOT / 'src/assets/icons/svg/ai-model.svg',
)
remaining_files.extend(path for path in explicit_files if path.exists())
self.assertEqual([], sorted(str(path.relative_to(PROJECT_ROOT)) for path in remaining_files))
def test_ai_dependencies_are_removed(self) -> None:
backend_dependencies = set()
for filename in ('requirements.txt', 'requirements-pg.txt'):
backend_dependencies.update(_parse_requirement_names(BACKEND_ROOT / filename))
self.assertEqual([], sorted(AI_DEPENDENCIES & backend_dependencies))
package_json = json.loads((FRONTEND_ROOT / 'package.json').read_text(encoding='utf-8'))
frontend_dependencies = set(package_json.get('dependencies', {}))
frontend_dependencies.update(package_json.get('devDependencies', {}))
self.assertEqual([], sorted(AI_FRONTEND_DEPENDENCIES & frontend_dependencies))
def test_initialization_sql_has_no_ai_or_external_menu(self) -> None:
forbidden_terms = ('ai_models', 'ai_chat_config', 'ai_provider_type', '施尔丰仓库')
violations = []
for filename in ('shierfeng-fastapi.sql', 'shierfeng-fastapi-pg.sql'):
sql = (BACKEND_ROOT / 'sql' / filename).read_text(encoding='utf-8').lower()
violations.extend(f'{filename}: {term}' for term in forbidden_terms if term.lower() in sql)
self.assertEqual([], violations)
if __name__ == '__main__':
unittest.main()