moai-adk 0.25.4__py3-none-any.whl → 0.32.8__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of moai-adk might be problematic. Click here for more details.
- moai_adk/__init__.py +2 -5
- moai_adk/__main__.py +114 -82
- moai_adk/cli/__init__.py +6 -1
- moai_adk/cli/commands/__init__.py +1 -3
- moai_adk/cli/commands/analyze.py +5 -16
- moai_adk/cli/commands/doctor.py +6 -18
- moai_adk/cli/commands/init.py +56 -125
- moai_adk/cli/commands/language.py +14 -35
- moai_adk/cli/commands/status.py +9 -15
- moai_adk/cli/commands/update.py +1555 -190
- moai_adk/cli/prompts/init_prompts.py +112 -56
- moai_adk/cli/spec_status.py +263 -0
- moai_adk/cli/ui/__init__.py +44 -0
- moai_adk/cli/ui/progress.py +422 -0
- moai_adk/cli/ui/prompts.py +389 -0
- moai_adk/cli/ui/theme.py +129 -0
- moai_adk/cli/worktree/__init__.py +27 -0
- moai_adk/cli/worktree/__main__.py +31 -0
- moai_adk/cli/worktree/cli.py +672 -0
- moai_adk/cli/worktree/exceptions.py +89 -0
- moai_adk/cli/worktree/manager.py +490 -0
- moai_adk/cli/worktree/models.py +65 -0
- moai_adk/cli/worktree/registry.py +128 -0
- moai_adk/core/PHASE2_OPTIMIZATIONS.md +467 -0
- moai_adk/core/analysis/session_analyzer.py +17 -56
- moai_adk/core/claude_integration.py +26 -54
- moai_adk/core/command_helpers.py +10 -10
- moai_adk/core/comprehensive_monitoring_system.py +1183 -0
- moai_adk/core/config/auto_spec_config.py +5 -11
- moai_adk/core/config/migration.py +19 -9
- moai_adk/core/config/unified.py +436 -0
- moai_adk/core/context_manager.py +6 -12
- moai_adk/core/enterprise_features.py +1404 -0
- moai_adk/core/error_recovery_system.py +725 -112
- moai_adk/core/event_driven_hook_system.py +1371 -0
- moai_adk/core/git/__init__.py +8 -0
- moai_adk/core/git/branch_manager.py +3 -11
- moai_adk/core/git/checkpoint.py +1 -3
- moai_adk/core/git/conflict_detector.py +413 -0
- moai_adk/core/git/manager.py +91 -1
- moai_adk/core/hooks/post_tool_auto_spec_completion.py +56 -80
- moai_adk/core/input_validation_middleware.py +1006 -0
- moai_adk/core/integration/engine.py +6 -18
- moai_adk/core/integration/integration_tester.py +10 -9
- moai_adk/core/integration/utils.py +1 -1
- moai_adk/core/issue_creator.py +10 -28
- moai_adk/core/jit_context_loader.py +956 -0
- moai_adk/core/jit_enhanced_hook_manager.py +1987 -0
- moai_adk/core/language_config_resolver.py +485 -0
- moai_adk/core/language_validator.py +28 -41
- moai_adk/core/mcp/setup.py +15 -12
- moai_adk/core/merge/__init__.py +9 -0
- moai_adk/core/merge/analyzer.py +481 -0
- moai_adk/core/migration/alfred_to_moai_migrator.py +383 -0
- moai_adk/core/migration/backup_manager.py +78 -9
- moai_adk/core/migration/custom_element_scanner.py +358 -0
- moai_adk/core/migration/file_migrator.py +8 -17
- moai_adk/core/migration/interactive_checkbox_ui.py +488 -0
- moai_adk/core/migration/selective_restorer.py +470 -0
- moai_adk/core/migration/template_utils.py +74 -0
- moai_adk/core/migration/user_selection_ui.py +338 -0
- moai_adk/core/migration/version_detector.py +6 -10
- moai_adk/core/migration/version_migrator.py +3 -3
- moai_adk/core/performance/cache_system.py +8 -10
- moai_adk/core/phase_optimized_hook_scheduler.py +879 -0
- moai_adk/core/project/checker.py +2 -4
- moai_adk/core/project/detector.py +1 -3
- moai_adk/core/project/initializer.py +135 -23
- moai_adk/core/project/phase_executor.py +54 -81
- moai_adk/core/project/validator.py +6 -12
- moai_adk/core/quality/trust_checker.py +9 -27
- moai_adk/core/realtime_monitoring_dashboard.py +1724 -0
- moai_adk/core/robust_json_parser.py +611 -0
- moai_adk/core/rollback_manager.py +73 -148
- moai_adk/core/session_manager.py +10 -26
- moai_adk/core/skill_loading_system.py +579 -0
- moai_adk/core/spec/confidence_scoring.py +31 -100
- moai_adk/core/spec/ears_template_engine.py +351 -286
- moai_adk/core/spec/quality_validator.py +35 -69
- moai_adk/core/spec_status_manager.py +64 -74
- moai_adk/core/template/backup.py +45 -20
- moai_adk/core/template/config.py +112 -39
- moai_adk/core/template/merger.py +11 -19
- moai_adk/core/template/processor.py +253 -149
- moai_adk/core/template_engine.py +73 -40
- moai_adk/core/template_variable_synchronizer.py +417 -0
- moai_adk/core/unified_permission_manager.py +745 -0
- moai_adk/core/user_behavior_analytics.py +851 -0
- moai_adk/core/version_sync.py +429 -0
- moai_adk/foundation/__init__.py +56 -0
- moai_adk/foundation/backend.py +1027 -0
- moai_adk/foundation/database.py +1115 -0
- moai_adk/foundation/devops.py +1585 -0
- moai_adk/foundation/ears.py +431 -0
- moai_adk/foundation/frontend.py +870 -0
- moai_adk/foundation/git/commit_templates.py +4 -12
- moai_adk/foundation/git.py +376 -0
- moai_adk/foundation/langs.py +484 -0
- moai_adk/foundation/ml_ops.py +1162 -0
- moai_adk/foundation/testing.py +1524 -0
- moai_adk/foundation/trust/trust_principles.py +23 -72
- moai_adk/foundation/trust/validation_checklist.py +57 -162
- moai_adk/project/__init__.py +0 -0
- moai_adk/project/configuration.py +1084 -0
- moai_adk/project/documentation.py +566 -0
- moai_adk/project/schema.py +447 -0
- moai_adk/statusline/alfred_detector.py +1 -3
- moai_adk/statusline/config.py +13 -4
- moai_adk/statusline/enhanced_output_style_detector.py +23 -15
- moai_adk/statusline/main.py +51 -15
- moai_adk/statusline/renderer.py +104 -48
- moai_adk/statusline/update_checker.py +3 -9
- moai_adk/statusline/version_reader.py +140 -46
- moai_adk/templates/.claude/agents/moai/ai-nano-banana.md +549 -0
- moai_adk/templates/.claude/agents/moai/builder-agent.md +445 -0
- moai_adk/templates/.claude/agents/moai/builder-command.md +1132 -0
- moai_adk/templates/.claude/agents/moai/builder-skill.md +601 -0
- moai_adk/templates/.claude/agents/moai/expert-backend.md +831 -0
- moai_adk/templates/.claude/agents/moai/expert-database.md +774 -0
- moai_adk/templates/.claude/agents/moai/expert-debug.md +396 -0
- moai_adk/templates/.claude/agents/moai/expert-devops.md +711 -0
- moai_adk/templates/.claude/agents/moai/expert-frontend.md +666 -0
- moai_adk/templates/.claude/agents/moai/expert-security.md +474 -0
- moai_adk/templates/.claude/agents/moai/expert-uiux.md +1038 -0
- moai_adk/templates/.claude/agents/moai/manager-claude-code.md +429 -0
- moai_adk/templates/.claude/agents/moai/manager-docs.md +570 -0
- moai_adk/templates/.claude/agents/moai/manager-git.md +937 -0
- moai_adk/templates/.claude/agents/moai/manager-project.md +891 -0
- moai_adk/templates/.claude/agents/moai/manager-quality.md +598 -0
- moai_adk/templates/.claude/agents/moai/manager-spec.md +713 -0
- moai_adk/templates/.claude/agents/moai/manager-strategy.md +600 -0
- moai_adk/templates/.claude/agents/moai/manager-tdd.md +603 -0
- moai_adk/templates/.claude/agents/moai/mcp-context7.md +369 -0
- moai_adk/templates/.claude/agents/moai/mcp-figma.md +1567 -0
- moai_adk/templates/.claude/agents/moai/mcp-notion.md +749 -0
- moai_adk/templates/.claude/agents/moai/mcp-playwright.md +427 -0
- moai_adk/templates/.claude/agents/moai/mcp-sequential-thinking.md +994 -0
- moai_adk/templates/.claude/commands/moai/0-project.md +1143 -0
- moai_adk/templates/.claude/commands/moai/1-plan.md +1435 -0
- moai_adk/templates/.claude/commands/moai/2-run.md +883 -0
- moai_adk/templates/.claude/commands/moai/3-sync.md +993 -0
- moai_adk/templates/.claude/commands/moai/9-feedback.md +314 -0
- moai_adk/templates/.claude/hooks/__init__.py +8 -0
- moai_adk/templates/.claude/hooks/moai/__init__.py +8 -0
- moai_adk/templates/.claude/hooks/moai/lib/__init__.py +85 -0
- moai_adk/templates/.claude/hooks/moai/lib/checkpoint.py +244 -0
- moai_adk/templates/.claude/hooks/moai/lib/common.py +131 -0
- moai_adk/templates/.claude/hooks/moai/lib/config_manager.py +446 -0
- moai_adk/templates/.claude/hooks/moai/lib/config_validator.py +639 -0
- moai_adk/templates/.claude/hooks/moai/lib/example_config.json +104 -0
- moai_adk/templates/.claude/hooks/moai/lib/git_operations_manager.py +590 -0
- moai_adk/templates/.claude/hooks/moai/lib/language_validator.py +317 -0
- moai_adk/templates/.claude/hooks/moai/lib/models.py +102 -0
- moai_adk/templates/.claude/hooks/moai/lib/path_utils.py +28 -0
- moai_adk/templates/.claude/hooks/moai/lib/project.py +768 -0
- moai_adk/templates/.claude/hooks/moai/lib/test_hooks_improvements.py +443 -0
- moai_adk/templates/.claude/hooks/moai/lib/timeout.py +160 -0
- moai_adk/templates/.claude/hooks/moai/lib/unified_timeout_manager.py +530 -0
- moai_adk/templates/.claude/hooks/moai/session_end__auto_cleanup.py +862 -0
- moai_adk/templates/.claude/hooks/moai/session_start__show_project_info.py +921 -0
- moai_adk/templates/.claude/output-styles/moai/r2d2.md +380 -0
- moai_adk/templates/.claude/output-styles/moai/yoda.md +338 -0
- moai_adk/templates/.claude/settings.json +172 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/SKILL.md +247 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/README.md +44 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/api-documentation.md +130 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/code-documentation.md +152 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/multi-format-output.md +178 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/user-guides.md +147 -0
- moai_adk/templates/.claude/skills/moai-domain-backend/SKILL.md +319 -0
- moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +320 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/README.md +53 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/mongodb.md +231 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/postgresql.md +169 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/redis.md +262 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/SKILL.md +496 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/SKILL.md +453 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/examples.md +560 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/accessibility-wcag.md +260 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/component-architecture.md +228 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/design-system-tokens.md +405 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/icon-libraries.md +401 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/theming-system.md +373 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/reference.md +243 -0
- moai_adk/templates/.claude/skills/moai-formats-data/SKILL.md +491 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/README.md +98 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/SKILL-MODULARIZATION-TEMPLATE.md +278 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/caching-performance.md +459 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/data-validation.md +485 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/json-optimization.md +374 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/toon-encoding.md +308 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/SKILL.md +201 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/best-practices-checklist.md +616 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-custom-slash-commands-official.md +729 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-hooks-official.md +560 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-iam-official.md +635 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-memory-official.md +543 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-settings-official.md +663 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-skills-official.md +113 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-sub-agents-official.md +238 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/complete-configuration-guide.md +175 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-examples.md +1674 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-formatting-guide.md +729 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-examples.md +1513 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-formatting-guide.md +1086 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-integration-patterns.md +1100 -0
- moai_adk/templates/.claude/skills/moai-foundation-context/SKILL.md +438 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/SKILL.md +515 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/README.md +296 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/agents-reference.md +346 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/commands-reference.md +432 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/delegation-patterns.md +757 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/execution-rules.md +687 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/modular-system.md +665 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/progressive-disclosure.md +649 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/spec-first-tdd.md +864 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/token-optimization.md +708 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/trust-5-framework.md +981 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/SKILL.md +362 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/examples.md +1232 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/best-practices.md +261 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/integration-patterns.md +194 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/proactive-analysis.md +229 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/trust5-validation.md +169 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/reference.md +1266 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/scripts/quality-gate.sh +668 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/templates/github-actions-quality.yml +481 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/templates/quality-config.yaml +519 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/SKILL.md +352 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/README.md +52 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/error-handling.md +334 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/integration-patterns.md +310 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/security-authentication.md +256 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/server-architecture.md +253 -0
- moai_adk/templates/.claude/skills/moai-lang-unified/README.md +133 -0
- moai_adk/templates/.claude/skills/moai-lang-unified/SKILL.md +296 -0
- moai_adk/templates/.claude/skills/moai-lang-unified/examples.md +1269 -0
- moai_adk/templates/.claude/skills/moai-lang-unified/reference.md +331 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/SKILL.md +298 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/advanced-patterns.md +465 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/examples.md +270 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/optimization.md +440 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/reference.md +228 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/SKILL.md +316 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/advanced-patterns.md +336 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-deployment-patterns.md +182 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-patterns.md +17 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/configuration.md +57 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/content-architecture-optimization.md +162 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/deployment.md +52 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/framework-core-configuration.md +186 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/i18n-setup.md +55 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/mdx-components.md +52 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/optimization.md +303 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/SKILL.md +370 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/examples.md +575 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/advanced-patterns.md +394 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/optimization.md +278 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-components.md +457 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-theming.md +373 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/reference.md +74 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/README.md +186 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/SKILL.md +290 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/examples.md +1225 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/reference.md +567 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/scripts/provider-selector.py +323 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/templates/stack-config.yaml +204 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/SKILL.md +446 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/advanced-patterns.md +379 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/optimization.md +286 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/README.md +190 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/SKILL.md +387 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/__init__.py +520 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/complete_workflow_demo_fixed.py +574 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_project_setup.py +317 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_workflow_demo.py +663 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/config-migration-example.json +190 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/question-examples.json +135 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/quick_start.py +196 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/__init__.py +17 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/advanced-patterns.md +158 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/ask_user_integration.py +340 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/batch_questions.py +713 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/config_manager.py +538 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/documentation_manager.py +1336 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/language_initializer.py +730 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/migration_manager.py +608 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/template_optimizer.py +1005 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/schemas/config-schema.json +316 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/schemas/tab_schema.json +1362 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/config-template.json +71 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/product-template.md +44 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/structure-template.md +48 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/tech-template.md +71 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/config-manager-setup.json +109 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/language-initializer.json +228 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/menu-project-config.json +130 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/project-batch-questions.json +97 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/spec-workflow-setup.json +150 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/test_integration_simple.py +436 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/SKILL.md +374 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/modules/code-templates.md +124 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/modules/feedback-templates.md +100 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/modules/template-optimizer.md +138 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/LICENSE.txt +202 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/SKILL.md +453 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/advanced-patterns.md +576 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/ai-powered-testing.py +294 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/console_logging.py +35 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/element_discovery.py +40 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/static_html_automation.py +34 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/README.md +220 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/ai-debugging.md +845 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review.md +1416 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization.md +1234 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/smart-refactoring.md +1243 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7.md +1260 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/optimization.md +505 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/reference/playwright-best-practices.md +57 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/scripts/with_server.py +218 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/templates/alfred-integration.md +376 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/workflows/enterprise-testing-workflow.py +571 -0
- moai_adk/templates/.claude/skills/moai-worktree/SKILL.md +410 -0
- moai_adk/templates/.claude/skills/moai-worktree/examples.md +606 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/integration-patterns.md +982 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/parallel-development.md +778 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-commands.md +646 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-management.md +782 -0
- moai_adk/templates/.claude/skills/moai-worktree/reference.md +357 -0
- moai_adk/templates/.git-hooks/pre-commit +103 -41
- moai_adk/templates/.git-hooks/pre-push +116 -21
- moai_adk/templates/.github/workflows/ci-universal.yml +513 -0
- moai_adk/templates/.github/workflows/security-secrets-check.yml +179 -0
- moai_adk/templates/.gitignore +184 -44
- moai_adk/templates/.mcp.json +7 -9
- moai_adk/templates/.moai/cache/personalization.json +10 -0
- moai_adk/templates/.moai/config/config.yaml +344 -0
- moai_adk/templates/.moai/config/presets/manual.yaml +28 -0
- moai_adk/templates/.moai/config/presets/personal.yaml +30 -0
- moai_adk/templates/.moai/config/presets/team.yaml +33 -0
- moai_adk/templates/.moai/config/questions/_schema.yaml +79 -0
- moai_adk/templates/.moai/config/questions/tab1-user.yaml +108 -0
- moai_adk/templates/.moai/config/questions/tab2-project.yaml +122 -0
- moai_adk/templates/.moai/config/questions/tab3-git.yaml +542 -0
- moai_adk/templates/.moai/config/questions/tab4-quality.yaml +167 -0
- moai_adk/templates/.moai/config/questions/tab5-system.yaml +152 -0
- moai_adk/templates/.moai/config/sections/git-strategy.yaml +40 -0
- moai_adk/templates/.moai/config/sections/language.yaml +11 -0
- moai_adk/templates/.moai/config/sections/project.yaml +13 -0
- moai_adk/templates/.moai/config/sections/quality.yaml +15 -0
- moai_adk/templates/.moai/config/sections/system.yaml +14 -0
- moai_adk/templates/.moai/config/sections/user.yaml +5 -0
- moai_adk/templates/.moai/config/statusline-config.yaml +86 -0
- moai_adk/templates/.moai/scripts/setup-glm.py +136 -0
- moai_adk/templates/CLAUDE.md +382 -501
- moai_adk/utils/__init__.py +24 -1
- moai_adk/utils/banner.py +7 -10
- moai_adk/utils/common.py +16 -30
- moai_adk/utils/link_validator.py +4 -12
- moai_adk/utils/safe_file_reader.py +2 -6
- moai_adk/utils/timeout.py +160 -0
- moai_adk/utils/toon_utils.py +256 -0
- moai_adk/version.py +22 -0
- moai_adk-0.32.8.dist-info/METADATA +2478 -0
- moai_adk-0.32.8.dist-info/RECORD +396 -0
- {moai_adk-0.25.4.dist-info → moai_adk-0.32.8.dist-info}/WHEEL +1 -1
- {moai_adk-0.25.4.dist-info → moai_adk-0.32.8.dist-info}/entry_points.txt +1 -0
- moai_adk/cli/commands/backup.py +0 -82
- moai_adk/cli/commands/improve_user_experience.py +0 -348
- moai_adk/cli/commands/migrate.py +0 -158
- moai_adk/cli/commands/validate_links.py +0 -118
- moai_adk/templates/.github/workflows/moai-gitflow.yml +0 -413
- moai_adk/templates/.github/workflows/moai-release-create.yml +0 -100
- moai_adk/templates/.github/workflows/moai-release-pipeline.yml +0 -188
- moai_adk/utils/user_experience.py +0 -531
- moai_adk-0.25.4.dist-info/METADATA +0 -2279
- moai_adk-0.25.4.dist-info/RECORD +0 -112
- {moai_adk-0.25.4.dist-info → moai_adk-0.32.8.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,1162 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Enterprise MLOps Architecture Module
|
|
3
|
+
|
|
4
|
+
This module provides production-grade MLOps patterns including:
|
|
5
|
+
- ML pipeline orchestration (MLflow, Kubeflow, Airflow)
|
|
6
|
+
- Model version management and lineage tracking
|
|
7
|
+
- Data pipeline construction and validation
|
|
8
|
+
- Model deployment planning (Ray Serve, KServe)
|
|
9
|
+
- Drift detection and monitoring
|
|
10
|
+
- Performance optimization strategies
|
|
11
|
+
- MLOps metrics collection
|
|
12
|
+
|
|
13
|
+
Usage:
|
|
14
|
+
from moai_adk.foundation.ml_ops import (
|
|
15
|
+
MLPipelineOrchestrator,
|
|
16
|
+
ModelVersionManager,
|
|
17
|
+
DataPipelineBuilder,
|
|
18
|
+
ModelDeploymentPlanner,
|
|
19
|
+
DriftDetectionMonitor,
|
|
20
|
+
PerformanceOptimizer,
|
|
21
|
+
MLOpsMetricsCollector,
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
# Orchestrate ML pipeline
|
|
25
|
+
orchestrator = MLPipelineOrchestrator()
|
|
26
|
+
config = orchestrator.orchestrate_mlflow_pipeline(
|
|
27
|
+
experiment_name="fraud_detection",
|
|
28
|
+
run_name="exp_001",
|
|
29
|
+
tracking_uri="http://mlflow:5000"
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
# Register model version
|
|
33
|
+
version_manager = ModelVersionManager()
|
|
34
|
+
version = version_manager.register_model_version(
|
|
35
|
+
model_name="fraud_classifier",
|
|
36
|
+
version="v2.1.0",
|
|
37
|
+
registry_uri="s3://models/registry"
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
Enterprise Patterns:
|
|
41
|
+
- Pipeline-as-Code: Declarative pipeline definitions
|
|
42
|
+
- Model Registry: Centralized version management
|
|
43
|
+
- Feature Store: Reusable feature engineering
|
|
44
|
+
- A/B Testing: Deployment strategies
|
|
45
|
+
- Monitoring: Drift detection and alerting
|
|
46
|
+
"""
|
|
47
|
+
|
|
48
|
+
import hashlib
|
|
49
|
+
import uuid
|
|
50
|
+
from datetime import UTC, datetime
|
|
51
|
+
from typing import Any, Dict, List, Optional
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
class MLPipelineOrchestrator:
|
|
55
|
+
"""
|
|
56
|
+
ML pipeline orchestration for multiple platforms.
|
|
57
|
+
|
|
58
|
+
Supports:
|
|
59
|
+
- MLflow: Experiment tracking and model registry
|
|
60
|
+
- Kubeflow: Kubernetes-native ML workflows
|
|
61
|
+
- Airflow: DAG-based pipeline scheduling
|
|
62
|
+
|
|
63
|
+
Example:
|
|
64
|
+
orchestrator = MLPipelineOrchestrator()
|
|
65
|
+
mlflow_config = orchestrator.orchestrate_mlflow_pipeline(
|
|
66
|
+
experiment_name="recommendation",
|
|
67
|
+
run_name="baseline_v1",
|
|
68
|
+
tracking_uri="http://localhost:5000"
|
|
69
|
+
)
|
|
70
|
+
"""
|
|
71
|
+
|
|
72
|
+
def __init__(self) -> None:
|
|
73
|
+
"""Initialize MLPipelineOrchestrator."""
|
|
74
|
+
self.supported_platforms = ["mlflow", "kubeflow", "airflow"]
|
|
75
|
+
self.execution_history: List[Dict[str, Any]] = []
|
|
76
|
+
|
|
77
|
+
def orchestrate_mlflow_pipeline(
|
|
78
|
+
self,
|
|
79
|
+
experiment_name: str,
|
|
80
|
+
run_name: str,
|
|
81
|
+
tracking_uri: str,
|
|
82
|
+
tags: Optional[Dict[str, str]] = None,
|
|
83
|
+
) -> Dict[str, Any]:
|
|
84
|
+
"""
|
|
85
|
+
Generate MLflow pipeline configuration.
|
|
86
|
+
|
|
87
|
+
Args:
|
|
88
|
+
experiment_name: Name of MLflow experiment
|
|
89
|
+
run_name: Unique run identifier
|
|
90
|
+
tracking_uri: MLflow tracking server URI
|
|
91
|
+
tags: Optional metadata tags
|
|
92
|
+
|
|
93
|
+
Returns:
|
|
94
|
+
MLflow configuration dict with experiment and run settings
|
|
95
|
+
"""
|
|
96
|
+
config = {
|
|
97
|
+
"type": "mlflow",
|
|
98
|
+
"experiment_name": experiment_name,
|
|
99
|
+
"run_name": run_name,
|
|
100
|
+
"tracking_uri": tracking_uri,
|
|
101
|
+
"parameters": {
|
|
102
|
+
"log_params": True,
|
|
103
|
+
"log_metrics": True,
|
|
104
|
+
"log_artifacts": True,
|
|
105
|
+
"auto_log": False,
|
|
106
|
+
},
|
|
107
|
+
"metrics": {
|
|
108
|
+
"accuracy": None,
|
|
109
|
+
"precision": None,
|
|
110
|
+
"recall": None,
|
|
111
|
+
"f1_score": None,
|
|
112
|
+
},
|
|
113
|
+
"artifacts": {
|
|
114
|
+
"model_path": f"/tmp/models/{experiment_name}",
|
|
115
|
+
"logs_path": f"/tmp/logs/{run_name}",
|
|
116
|
+
},
|
|
117
|
+
"tags": tags or {"framework": "pytorch", "environment": "dev"},
|
|
118
|
+
"created_at": datetime.now(UTC).isoformat(),
|
|
119
|
+
}
|
|
120
|
+
return config
|
|
121
|
+
|
|
122
|
+
def orchestrate_kubeflow_pipeline(
|
|
123
|
+
self,
|
|
124
|
+
pipeline_name: str,
|
|
125
|
+
namespace: str,
|
|
126
|
+
components: List[str],
|
|
127
|
+
parameters: Optional[Dict[str, Any]] = None,
|
|
128
|
+
) -> Dict[str, Any]:
|
|
129
|
+
"""
|
|
130
|
+
Generate Kubeflow pipeline specification.
|
|
131
|
+
|
|
132
|
+
Args:
|
|
133
|
+
pipeline_name: Name of Kubeflow pipeline
|
|
134
|
+
namespace: Kubernetes namespace
|
|
135
|
+
components: List of pipeline component names
|
|
136
|
+
parameters: Optional pipeline parameters
|
|
137
|
+
|
|
138
|
+
Returns:
|
|
139
|
+
Kubeflow pipeline specification dict
|
|
140
|
+
"""
|
|
141
|
+
spec = {
|
|
142
|
+
"type": "kubeflow",
|
|
143
|
+
"pipeline_name": pipeline_name,
|
|
144
|
+
"namespace": namespace,
|
|
145
|
+
"components": components,
|
|
146
|
+
"parameters": parameters or {"batch_size": 32, "epochs": 10},
|
|
147
|
+
"resources": {
|
|
148
|
+
"cpu": "2",
|
|
149
|
+
"memory": "4Gi",
|
|
150
|
+
"gpu": "1",
|
|
151
|
+
},
|
|
152
|
+
"volumes": [
|
|
153
|
+
{"name": "data", "path": "/mnt/data"},
|
|
154
|
+
{"name": "models", "path": "/mnt/models"},
|
|
155
|
+
],
|
|
156
|
+
"created_at": datetime.now(UTC).isoformat(),
|
|
157
|
+
}
|
|
158
|
+
return spec
|
|
159
|
+
|
|
160
|
+
def orchestrate_airflow_dags(
|
|
161
|
+
self,
|
|
162
|
+
dag_id: str,
|
|
163
|
+
schedule_interval: str,
|
|
164
|
+
tasks: List[str],
|
|
165
|
+
dependencies: Optional[Dict[str, List[str]]] = None,
|
|
166
|
+
) -> Dict[str, Any]:
|
|
167
|
+
"""
|
|
168
|
+
Generate Airflow DAG configuration.
|
|
169
|
+
|
|
170
|
+
Args:
|
|
171
|
+
dag_id: Unique DAG identifier
|
|
172
|
+
schedule_interval: Cron expression for scheduling
|
|
173
|
+
tasks: List of task names
|
|
174
|
+
dependencies: Task dependency mapping
|
|
175
|
+
|
|
176
|
+
Returns:
|
|
177
|
+
Airflow DAG configuration dict
|
|
178
|
+
"""
|
|
179
|
+
# Auto-generate linear dependencies if not provided
|
|
180
|
+
if dependencies is None:
|
|
181
|
+
dependencies = {}
|
|
182
|
+
for i in range(len(tasks) - 1):
|
|
183
|
+
dependencies[tasks[i]] = [tasks[i + 1]]
|
|
184
|
+
|
|
185
|
+
dag_config = {
|
|
186
|
+
"type": "airflow",
|
|
187
|
+
"dag_id": dag_id,
|
|
188
|
+
"schedule_interval": schedule_interval,
|
|
189
|
+
"tasks": tasks,
|
|
190
|
+
"dependencies": dependencies,
|
|
191
|
+
"default_args": {
|
|
192
|
+
"owner": "mlops_team",
|
|
193
|
+
"retries": 3,
|
|
194
|
+
"retry_delay": "5m",
|
|
195
|
+
},
|
|
196
|
+
"catchup": False,
|
|
197
|
+
"max_active_runs": 1,
|
|
198
|
+
"created_at": datetime.now(UTC).isoformat(),
|
|
199
|
+
}
|
|
200
|
+
return dag_config
|
|
201
|
+
|
|
202
|
+
def track_pipeline_execution(
|
|
203
|
+
self,
|
|
204
|
+
pipeline_id: str,
|
|
205
|
+
status: str,
|
|
206
|
+
start_time: str,
|
|
207
|
+
end_time: Optional[str] = None,
|
|
208
|
+
) -> Dict[str, Any]:
|
|
209
|
+
"""
|
|
210
|
+
Track pipeline execution metrics.
|
|
211
|
+
|
|
212
|
+
Args:
|
|
213
|
+
pipeline_id: Unique pipeline identifier
|
|
214
|
+
status: Execution status (running, completed, failed)
|
|
215
|
+
start_time: ISO 8601 start timestamp
|
|
216
|
+
end_time: Optional ISO 8601 end timestamp
|
|
217
|
+
|
|
218
|
+
Returns:
|
|
219
|
+
Execution metrics dict
|
|
220
|
+
"""
|
|
221
|
+
metrics = {
|
|
222
|
+
"pipeline_id": pipeline_id,
|
|
223
|
+
"status": status,
|
|
224
|
+
"start_time": start_time,
|
|
225
|
+
"end_time": end_time or datetime.now(UTC).isoformat(),
|
|
226
|
+
"execution_metrics": {
|
|
227
|
+
"tasks_completed": 0,
|
|
228
|
+
"tasks_failed": 0,
|
|
229
|
+
"tasks_pending": 0,
|
|
230
|
+
},
|
|
231
|
+
"resource_usage": {
|
|
232
|
+
"cpu_hours": 0.0,
|
|
233
|
+
"memory_gb_hours": 0.0,
|
|
234
|
+
"gpu_hours": 0.0,
|
|
235
|
+
},
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
self.execution_history.append(metrics)
|
|
239
|
+
return metrics
|
|
240
|
+
|
|
241
|
+
|
|
242
|
+
class ModelVersionManager:
|
|
243
|
+
"""
|
|
244
|
+
Model version management and lineage tracking.
|
|
245
|
+
|
|
246
|
+
Provides:
|
|
247
|
+
- Model registry integration
|
|
248
|
+
- Version control and tagging
|
|
249
|
+
- Lineage tracking from data to deployment
|
|
250
|
+
- Artifact management
|
|
251
|
+
|
|
252
|
+
Example:
|
|
253
|
+
manager = ModelVersionManager()
|
|
254
|
+
version = manager.register_model_version(
|
|
255
|
+
model_name="sentiment_model",
|
|
256
|
+
version="v1.0.0",
|
|
257
|
+
registry_uri="s3://models/registry",
|
|
258
|
+
metadata={"framework": "tensorflow", "accuracy": 0.94}
|
|
259
|
+
)
|
|
260
|
+
"""
|
|
261
|
+
|
|
262
|
+
def __init__(self) -> None:
|
|
263
|
+
"""Initialize ModelVersionManager."""
|
|
264
|
+
self.registry: Dict[str, Dict[str, Any]] = {}
|
|
265
|
+
self.lineage_graph: Dict[str, Dict[str, Any]] = {}
|
|
266
|
+
|
|
267
|
+
def register_model_version(
|
|
268
|
+
self,
|
|
269
|
+
model_name: str,
|
|
270
|
+
version: str,
|
|
271
|
+
registry_uri: str,
|
|
272
|
+
metadata: Optional[Dict[str, Any]] = None,
|
|
273
|
+
) -> Dict[str, Any]:
|
|
274
|
+
"""
|
|
275
|
+
Register model version in registry.
|
|
276
|
+
|
|
277
|
+
Args:
|
|
278
|
+
model_name: Model identifier
|
|
279
|
+
version: Semantic version (e.g., v1.2.0)
|
|
280
|
+
registry_uri: Storage URI for model artifacts
|
|
281
|
+
metadata: Optional model metadata
|
|
282
|
+
|
|
283
|
+
Returns:
|
|
284
|
+
Registration result with version_id and timestamps
|
|
285
|
+
"""
|
|
286
|
+
version_id = str(uuid.uuid4())
|
|
287
|
+
created_at = datetime.now(UTC).isoformat()
|
|
288
|
+
|
|
289
|
+
result = {
|
|
290
|
+
"model_name": model_name,
|
|
291
|
+
"version": version,
|
|
292
|
+
"version_id": version_id,
|
|
293
|
+
"registry_uri": registry_uri,
|
|
294
|
+
"created_at": created_at,
|
|
295
|
+
"metadata": metadata or {},
|
|
296
|
+
"stage": "staging", # staging, production, archived
|
|
297
|
+
"tags": [],
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
# Store in registry
|
|
301
|
+
if model_name not in self.registry:
|
|
302
|
+
self.registry[model_name] = {}
|
|
303
|
+
self.registry[model_name][version] = result
|
|
304
|
+
|
|
305
|
+
return result
|
|
306
|
+
|
|
307
|
+
def track_model_lineage(
|
|
308
|
+
self,
|
|
309
|
+
model_id: str,
|
|
310
|
+
include_data_sources: bool = True,
|
|
311
|
+
include_training_runs: bool = True,
|
|
312
|
+
) -> Dict[str, Any]:
|
|
313
|
+
"""
|
|
314
|
+
Track model lineage from data to deployment.
|
|
315
|
+
|
|
316
|
+
Args:
|
|
317
|
+
model_id: Model identifier
|
|
318
|
+
include_data_sources: Include data lineage
|
|
319
|
+
include_training_runs: Include training history
|
|
320
|
+
|
|
321
|
+
Returns:
|
|
322
|
+
Lineage graph with data sources, training runs, and deployments
|
|
323
|
+
"""
|
|
324
|
+
lineage: Dict[str, Any] = {
|
|
325
|
+
"model_id": model_id,
|
|
326
|
+
"data_sources": [] if include_data_sources else None,
|
|
327
|
+
"training_runs": [] if include_training_runs else None,
|
|
328
|
+
"parent_models": [],
|
|
329
|
+
"deployment_history": [],
|
|
330
|
+
"lineage_graph": {
|
|
331
|
+
"nodes": [
|
|
332
|
+
{"id": "data", "type": "dataset"},
|
|
333
|
+
{"id": model_id, "type": "model"},
|
|
334
|
+
{"id": "deployment", "type": "endpoint"},
|
|
335
|
+
],
|
|
336
|
+
"edges": [
|
|
337
|
+
{"from": "data", "to": model_id},
|
|
338
|
+
{"from": model_id, "to": "deployment"},
|
|
339
|
+
],
|
|
340
|
+
},
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
if include_data_sources:
|
|
344
|
+
lineage["data_sources"] = [
|
|
345
|
+
{"dataset_id": "train_001", "version": "v1", "rows": 100000},
|
|
346
|
+
{"dataset_id": "valid_001", "version": "v1", "rows": 20000},
|
|
347
|
+
]
|
|
348
|
+
|
|
349
|
+
if include_training_runs:
|
|
350
|
+
lineage["training_runs"] = [
|
|
351
|
+
{
|
|
352
|
+
"run_id": "run_001",
|
|
353
|
+
"framework": "pytorch",
|
|
354
|
+
"accuracy": 0.92,
|
|
355
|
+
"timestamp": datetime.now(UTC).isoformat(),
|
|
356
|
+
}
|
|
357
|
+
]
|
|
358
|
+
|
|
359
|
+
self.lineage_graph[model_id] = lineage
|
|
360
|
+
return lineage
|
|
361
|
+
|
|
362
|
+
def manage_model_artifacts(
|
|
363
|
+
self,
|
|
364
|
+
model_id: str,
|
|
365
|
+
artifact_types: List[str],
|
|
366
|
+
storage_backend: str = "s3",
|
|
367
|
+
) -> Dict[str, Any]:
|
|
368
|
+
"""
|
|
369
|
+
Manage model artifacts (weights, config, metadata).
|
|
370
|
+
|
|
371
|
+
Args:
|
|
372
|
+
model_id: Model identifier
|
|
373
|
+
artifact_types: List of artifact types (weights, config, metadata)
|
|
374
|
+
storage_backend: Storage backend (s3, gcs, azure)
|
|
375
|
+
|
|
376
|
+
Returns:
|
|
377
|
+
Artifact paths and metadata
|
|
378
|
+
"""
|
|
379
|
+
artifacts: Dict[str, Any] = {
|
|
380
|
+
"storage_backend": storage_backend,
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
for artifact_type in artifact_types:
|
|
384
|
+
if artifact_type == "weights":
|
|
385
|
+
artifacts["weights"] = {
|
|
386
|
+
"path": f"{storage_backend}://models/{model_id}/weights.pkl",
|
|
387
|
+
"size_mb": 150.5,
|
|
388
|
+
"checksum": hashlib.sha256(model_id.encode()).hexdigest(),
|
|
389
|
+
}
|
|
390
|
+
elif artifact_type == "config":
|
|
391
|
+
artifacts["config"] = {
|
|
392
|
+
"path": f"{storage_backend}://models/{model_id}/config.json",
|
|
393
|
+
"version": "v1.0",
|
|
394
|
+
}
|
|
395
|
+
elif artifact_type == "metadata":
|
|
396
|
+
artifacts["metadata"] = {
|
|
397
|
+
"path": f"{storage_backend}://models/{model_id}/metadata.yaml",
|
|
398
|
+
"created_at": datetime.now(UTC).isoformat(),
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
return artifacts
|
|
402
|
+
|
|
403
|
+
|
|
404
|
+
class DataPipelineBuilder:
|
|
405
|
+
"""
|
|
406
|
+
Data pipeline construction and validation.
|
|
407
|
+
|
|
408
|
+
Features:
|
|
409
|
+
- Feature engineering pipelines
|
|
410
|
+
- Data quality validation
|
|
411
|
+
- Missing value handling strategies
|
|
412
|
+
- Schema validation
|
|
413
|
+
|
|
414
|
+
Example:
|
|
415
|
+
builder = DataPipelineBuilder()
|
|
416
|
+
pipeline = builder.build_feature_pipeline(
|
|
417
|
+
features=["age", "income", "credit_score"],
|
|
418
|
+
transformations=["normalize", "encode_categorical"]
|
|
419
|
+
)
|
|
420
|
+
"""
|
|
421
|
+
|
|
422
|
+
def __init__(self) -> None:
|
|
423
|
+
"""Initialize DataPipelineBuilder."""
|
|
424
|
+
self.pipelines: Dict[str, Dict[str, Any]] = {}
|
|
425
|
+
|
|
426
|
+
def build_feature_pipeline(
|
|
427
|
+
self,
|
|
428
|
+
features: List[str],
|
|
429
|
+
transformations: List[str],
|
|
430
|
+
) -> Dict[str, Any]:
|
|
431
|
+
"""
|
|
432
|
+
Build feature engineering pipeline.
|
|
433
|
+
|
|
434
|
+
Args:
|
|
435
|
+
features: List of feature names
|
|
436
|
+
transformations: List of transformation steps
|
|
437
|
+
|
|
438
|
+
Returns:
|
|
439
|
+
Feature pipeline specification
|
|
440
|
+
"""
|
|
441
|
+
pipeline: Dict[str, Any] = {
|
|
442
|
+
"features": features,
|
|
443
|
+
"transformations": transformations,
|
|
444
|
+
"pipeline_steps": [],
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
# Generate pipeline steps
|
|
448
|
+
for idx, transformation in enumerate(transformations):
|
|
449
|
+
# Create interaction features if needed
|
|
450
|
+
if transformation == "create_interactions":
|
|
451
|
+
interaction_features = [
|
|
452
|
+
f"{features[i]}_{features[j]}" for i in range(len(features)) for j in range(i + 1, len(features))
|
|
453
|
+
]
|
|
454
|
+
output_features = features + interaction_features
|
|
455
|
+
else:
|
|
456
|
+
output_features = [f"{f}_transformed" for f in features]
|
|
457
|
+
|
|
458
|
+
step = {
|
|
459
|
+
"step_id": idx + 1,
|
|
460
|
+
"transformation": transformation,
|
|
461
|
+
"input_features": features,
|
|
462
|
+
"output_features": output_features,
|
|
463
|
+
}
|
|
464
|
+
pipeline["pipeline_steps"].append(step)
|
|
465
|
+
|
|
466
|
+
return pipeline
|
|
467
|
+
|
|
468
|
+
def validate_data_quality(
|
|
469
|
+
self,
|
|
470
|
+
dataset_id: str,
|
|
471
|
+
checks: List[str],
|
|
472
|
+
) -> Dict[str, Any]:
|
|
473
|
+
"""
|
|
474
|
+
Validate data quality with specified checks.
|
|
475
|
+
|
|
476
|
+
Args:
|
|
477
|
+
dataset_id: Dataset identifier
|
|
478
|
+
checks: List of validation checks
|
|
479
|
+
|
|
480
|
+
Returns:
|
|
481
|
+
Validation result with quality score and violations
|
|
482
|
+
"""
|
|
483
|
+
validation: Dict[str, Any] = {
|
|
484
|
+
"dataset_id": dataset_id,
|
|
485
|
+
"quality_score": 0.0,
|
|
486
|
+
"violations": [],
|
|
487
|
+
"passed_checks": [],
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
# Simulate validation results
|
|
491
|
+
passed_count = 0
|
|
492
|
+
for check in checks:
|
|
493
|
+
if check in ["missing_values", "schema_compliance"]:
|
|
494
|
+
validation["passed_checks"].append(check)
|
|
495
|
+
passed_count += 1
|
|
496
|
+
elif check == "outliers":
|
|
497
|
+
validation["violations"].append(
|
|
498
|
+
{
|
|
499
|
+
"check": check,
|
|
500
|
+
"severity": "warning",
|
|
501
|
+
"details": "5 outliers detected in 'income' column",
|
|
502
|
+
}
|
|
503
|
+
)
|
|
504
|
+
|
|
505
|
+
validation["quality_score"] = passed_count / len(checks) if checks else 0.0
|
|
506
|
+
return validation
|
|
507
|
+
|
|
508
|
+
def handle_missing_values(
|
|
509
|
+
self,
|
|
510
|
+
column_name: str,
|
|
511
|
+
missing_ratio: float,
|
|
512
|
+
data_type: str,
|
|
513
|
+
) -> Dict[str, Any]:
|
|
514
|
+
"""
|
|
515
|
+
Determine missing value handling strategy.
|
|
516
|
+
|
|
517
|
+
Args:
|
|
518
|
+
column_name: Column name
|
|
519
|
+
missing_ratio: Ratio of missing values (0.0-1.0)
|
|
520
|
+
data_type: Data type (numeric, categorical, datetime)
|
|
521
|
+
|
|
522
|
+
Returns:
|
|
523
|
+
Imputation strategy dict
|
|
524
|
+
"""
|
|
525
|
+
# Strategy selection logic
|
|
526
|
+
if missing_ratio > 0.5:
|
|
527
|
+
method = "drop"
|
|
528
|
+
elif data_type == "numeric":
|
|
529
|
+
method = "median" if missing_ratio > 0.1 else "mean"
|
|
530
|
+
elif data_type == "categorical":
|
|
531
|
+
method = "mode"
|
|
532
|
+
else:
|
|
533
|
+
method = "forward_fill"
|
|
534
|
+
|
|
535
|
+
strategy = {
|
|
536
|
+
"column_name": column_name,
|
|
537
|
+
"method": method,
|
|
538
|
+
"missing_ratio": missing_ratio,
|
|
539
|
+
"parameters": {
|
|
540
|
+
"fill_value": None if method != "drop" else "N/A",
|
|
541
|
+
"strategy": method,
|
|
542
|
+
},
|
|
543
|
+
}
|
|
544
|
+
return strategy
|
|
545
|
+
|
|
546
|
+
def get_data_statistics(self, dataset_id: str) -> Dict[str, Any]:
|
|
547
|
+
"""
|
|
548
|
+
Get dataset statistics.
|
|
549
|
+
|
|
550
|
+
Args:
|
|
551
|
+
dataset_id: Dataset identifier
|
|
552
|
+
|
|
553
|
+
Returns:
|
|
554
|
+
Statistics dict with mean, std, missing counts
|
|
555
|
+
"""
|
|
556
|
+
return {
|
|
557
|
+
"dataset_id": dataset_id,
|
|
558
|
+
"row_count": 100000,
|
|
559
|
+
"column_count": 25,
|
|
560
|
+
"missing_count": 1500,
|
|
561
|
+
"mean": 45.2,
|
|
562
|
+
"std": 12.8,
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
|
|
566
|
+
class ModelDeploymentPlanner:
|
|
567
|
+
"""
|
|
568
|
+
Model deployment planning and containerization.
|
|
569
|
+
|
|
570
|
+
Supports:
|
|
571
|
+
- Ray Serve: Scalable model serving
|
|
572
|
+
- KServe: Kubernetes-native serving
|
|
573
|
+
- Docker containerization
|
|
574
|
+
- Inference endpoint creation
|
|
575
|
+
|
|
576
|
+
Example:
|
|
577
|
+
planner = ModelDeploymentPlanner()
|
|
578
|
+
config = planner.plan_ray_serve_deployment(
|
|
579
|
+
model_name="fraud_detector",
|
|
580
|
+
replicas=3,
|
|
581
|
+
route_prefix="/predict"
|
|
582
|
+
)
|
|
583
|
+
"""
|
|
584
|
+
|
|
585
|
+
def __init__(self) -> None:
|
|
586
|
+
"""Initialize ModelDeploymentPlanner."""
|
|
587
|
+
self.deployments: Dict[str, Dict[str, Any]] = {}
|
|
588
|
+
|
|
589
|
+
def plan_ray_serve_deployment(
|
|
590
|
+
self,
|
|
591
|
+
model_name: str,
|
|
592
|
+
replicas: int,
|
|
593
|
+
route_prefix: str,
|
|
594
|
+
autoscaling: bool = True,
|
|
595
|
+
) -> Dict[str, Any]:
|
|
596
|
+
"""
|
|
597
|
+
Plan Ray Serve deployment configuration.
|
|
598
|
+
|
|
599
|
+
Args:
|
|
600
|
+
model_name: Model identifier
|
|
601
|
+
replicas: Number of replicas
|
|
602
|
+
route_prefix: HTTP route prefix
|
|
603
|
+
autoscaling: Enable autoscaling
|
|
604
|
+
|
|
605
|
+
Returns:
|
|
606
|
+
Ray Serve deployment configuration
|
|
607
|
+
"""
|
|
608
|
+
config = {
|
|
609
|
+
"type": "ray_serve",
|
|
610
|
+
"model_name": model_name,
|
|
611
|
+
"replicas": replicas,
|
|
612
|
+
"route_prefix": route_prefix,
|
|
613
|
+
"deployment_config": {
|
|
614
|
+
"num_replicas": replicas,
|
|
615
|
+
"max_concurrent_queries": 100,
|
|
616
|
+
"ray_actor_options": {
|
|
617
|
+
"num_cpus": 2,
|
|
618
|
+
"num_gpus": 0.5,
|
|
619
|
+
},
|
|
620
|
+
},
|
|
621
|
+
"autoscaling": {
|
|
622
|
+
"enabled": autoscaling,
|
|
623
|
+
"min_replicas": 1,
|
|
624
|
+
"max_replicas": 10,
|
|
625
|
+
"target_num_ongoing_requests_per_replica": 10,
|
|
626
|
+
},
|
|
627
|
+
}
|
|
628
|
+
self.deployments[model_name] = config
|
|
629
|
+
return config
|
|
630
|
+
|
|
631
|
+
def plan_kserve_deployment(
|
|
632
|
+
self,
|
|
633
|
+
model_name: str,
|
|
634
|
+
framework: str,
|
|
635
|
+
storage_uri: str,
|
|
636
|
+
) -> Dict[str, Any]:
|
|
637
|
+
"""
|
|
638
|
+
Plan KServe deployment specification.
|
|
639
|
+
|
|
640
|
+
Args:
|
|
641
|
+
model_name: Model identifier
|
|
642
|
+
framework: ML framework (pytorch, tensorflow, sklearn)
|
|
643
|
+
storage_uri: Model storage URI
|
|
644
|
+
|
|
645
|
+
Returns:
|
|
646
|
+
KServe InferenceService specification
|
|
647
|
+
"""
|
|
648
|
+
spec = {
|
|
649
|
+
"type": "kserve",
|
|
650
|
+
"model_name": model_name,
|
|
651
|
+
"framework": framework,
|
|
652
|
+
"storage_uri": storage_uri,
|
|
653
|
+
"predictor": {
|
|
654
|
+
"model_format": framework,
|
|
655
|
+
"protocol": "v2",
|
|
656
|
+
"runtime": f"{framework}-serving",
|
|
657
|
+
},
|
|
658
|
+
"resources": {
|
|
659
|
+
"requests": {"cpu": "1", "memory": "2Gi"},
|
|
660
|
+
"limits": {"cpu": "2", "memory": "4Gi"},
|
|
661
|
+
},
|
|
662
|
+
"scaling": {
|
|
663
|
+
"minReplicas": 1,
|
|
664
|
+
"maxReplicas": 5,
|
|
665
|
+
},
|
|
666
|
+
}
|
|
667
|
+
return spec
|
|
668
|
+
|
|
669
|
+
def containerize_model(
|
|
670
|
+
self,
|
|
671
|
+
model_path: str,
|
|
672
|
+
base_image: str,
|
|
673
|
+
requirements: List[str],
|
|
674
|
+
) -> Dict[str, Any]:
|
|
675
|
+
"""
|
|
676
|
+
Containerize model with Docker.
|
|
677
|
+
|
|
678
|
+
Args:
|
|
679
|
+
model_path: Path to model file
|
|
680
|
+
base_image: Docker base image
|
|
681
|
+
requirements: Python package requirements
|
|
682
|
+
|
|
683
|
+
Returns:
|
|
684
|
+
Container build configuration
|
|
685
|
+
"""
|
|
686
|
+
dockerfile_content = f"""
|
|
687
|
+
FROM {base_image}
|
|
688
|
+
WORKDIR /app
|
|
689
|
+
COPY requirements.txt .
|
|
690
|
+
RUN pip install -r requirements.txt
|
|
691
|
+
COPY {model_path} /app/model.pkl
|
|
692
|
+
CMD ["python", "serve.py"]
|
|
693
|
+
"""
|
|
694
|
+
|
|
695
|
+
container = {
|
|
696
|
+
"dockerfile_path": "/tmp/Dockerfile",
|
|
697
|
+
"dockerfile_content": dockerfile_content.strip(),
|
|
698
|
+
"base_image": base_image,
|
|
699
|
+
"requirements": requirements,
|
|
700
|
+
"build_config": {
|
|
701
|
+
"tag": "model:latest",
|
|
702
|
+
"platform": "linux/amd64",
|
|
703
|
+
"no_cache": False,
|
|
704
|
+
},
|
|
705
|
+
}
|
|
706
|
+
return container
|
|
707
|
+
|
|
708
|
+
def create_inference_endpoint(
|
|
709
|
+
self,
|
|
710
|
+
model_id: str,
|
|
711
|
+
endpoint_name: str,
|
|
712
|
+
auth_enabled: bool = True,
|
|
713
|
+
) -> Dict[str, Any]:
|
|
714
|
+
"""
|
|
715
|
+
Create inference endpoint configuration.
|
|
716
|
+
|
|
717
|
+
Args:
|
|
718
|
+
model_id: Model identifier
|
|
719
|
+
endpoint_name: Endpoint name
|
|
720
|
+
auth_enabled: Enable authentication
|
|
721
|
+
|
|
722
|
+
Returns:
|
|
723
|
+
Endpoint configuration with URL and auth token
|
|
724
|
+
"""
|
|
725
|
+
auth_token = hashlib.sha256(f"{model_id}_{endpoint_name}".encode()).hexdigest()[:32] if auth_enabled else None
|
|
726
|
+
|
|
727
|
+
endpoint = {
|
|
728
|
+
"endpoint_url": f"https://api.example.com/{endpoint_name}",
|
|
729
|
+
"endpoint_name": endpoint_name,
|
|
730
|
+
"model_id": model_id,
|
|
731
|
+
"auth_enabled": auth_enabled,
|
|
732
|
+
"auth_token": auth_token,
|
|
733
|
+
"health_check_url": f"https://api.example.com/{endpoint_name}/health",
|
|
734
|
+
"methods": ["POST"],
|
|
735
|
+
"rate_limit": {"requests_per_minute": 1000},
|
|
736
|
+
}
|
|
737
|
+
return endpoint
|
|
738
|
+
|
|
739
|
+
|
|
740
|
+
class DriftDetectionMonitor:
|
|
741
|
+
"""
|
|
742
|
+
Model monitoring and drift detection.
|
|
743
|
+
|
|
744
|
+
Detects:
|
|
745
|
+
- Data drift: Input distribution changes
|
|
746
|
+
- Model drift: Performance degradation
|
|
747
|
+
- Concept drift: Target distribution changes
|
|
748
|
+
|
|
749
|
+
Example:
|
|
750
|
+
monitor = DriftDetectionMonitor()
|
|
751
|
+
result = monitor.detect_data_drift(
|
|
752
|
+
reference_data_id="train_2024",
|
|
753
|
+
current_data_id="prod_2025_01",
|
|
754
|
+
features=["age", "income"]
|
|
755
|
+
)
|
|
756
|
+
"""
|
|
757
|
+
|
|
758
|
+
def __init__(self, threshold: float = 0.1) -> None:
|
|
759
|
+
"""
|
|
760
|
+
Initialize DriftDetectionMonitor.
|
|
761
|
+
|
|
762
|
+
Args:
|
|
763
|
+
threshold: Drift detection threshold (0.0-1.0)
|
|
764
|
+
"""
|
|
765
|
+
self.threshold = threshold
|
|
766
|
+
self.drift_history: List[Dict[str, Any]] = []
|
|
767
|
+
|
|
768
|
+
def detect_data_drift(
|
|
769
|
+
self,
|
|
770
|
+
reference_data_id: str,
|
|
771
|
+
current_data_id: str,
|
|
772
|
+
features: List[str],
|
|
773
|
+
) -> Dict[str, Any]:
|
|
774
|
+
"""
|
|
775
|
+
Detect data drift between reference and current data.
|
|
776
|
+
|
|
777
|
+
Args:
|
|
778
|
+
reference_data_id: Reference dataset ID
|
|
779
|
+
current_data_id: Current dataset ID
|
|
780
|
+
features: Features to monitor
|
|
781
|
+
|
|
782
|
+
Returns:
|
|
783
|
+
Drift detection result with score and drifted features
|
|
784
|
+
"""
|
|
785
|
+
# Simulate drift detection (Kolmogorov-Smirnov test)
|
|
786
|
+
drift_score = 0.08 # Below threshold
|
|
787
|
+
drifted_features: List[str] = []
|
|
788
|
+
|
|
789
|
+
result = {
|
|
790
|
+
"drift_detected": drift_score > self.threshold,
|
|
791
|
+
"drift_score": drift_score,
|
|
792
|
+
"threshold": self.threshold,
|
|
793
|
+
"drifted_features": drifted_features,
|
|
794
|
+
"reference_data_id": reference_data_id,
|
|
795
|
+
"current_data_id": current_data_id,
|
|
796
|
+
"features_monitored": features,
|
|
797
|
+
"timestamp": datetime.now(UTC).isoformat(),
|
|
798
|
+
}
|
|
799
|
+
|
|
800
|
+
self.drift_history.append(result)
|
|
801
|
+
return result
|
|
802
|
+
|
|
803
|
+
def detect_model_drift(
|
|
804
|
+
self,
|
|
805
|
+
model_id: str,
|
|
806
|
+
baseline_metrics: Dict[str, float],
|
|
807
|
+
current_metrics: Dict[str, float],
|
|
808
|
+
) -> Dict[str, Any]:
|
|
809
|
+
"""
|
|
810
|
+
Detect model performance drift.
|
|
811
|
+
|
|
812
|
+
Args:
|
|
813
|
+
model_id: Model identifier
|
|
814
|
+
baseline_metrics: Baseline performance metrics
|
|
815
|
+
current_metrics: Current performance metrics
|
|
816
|
+
|
|
817
|
+
Returns:
|
|
818
|
+
Drift detection result with degradation percentage
|
|
819
|
+
"""
|
|
820
|
+
degraded_metrics = []
|
|
821
|
+
total_degradation = 0.0
|
|
822
|
+
|
|
823
|
+
for metric_name in baseline_metrics:
|
|
824
|
+
baseline = baseline_metrics[metric_name]
|
|
825
|
+
current = current_metrics.get(metric_name, 0.0)
|
|
826
|
+
degradation = (baseline - current) / baseline if baseline > 0 else 0.0
|
|
827
|
+
|
|
828
|
+
if degradation > 0.05: # 5% degradation threshold
|
|
829
|
+
degraded_metrics.append(
|
|
830
|
+
{
|
|
831
|
+
"metric": metric_name,
|
|
832
|
+
"baseline": baseline,
|
|
833
|
+
"current": current,
|
|
834
|
+
"degradation": degradation,
|
|
835
|
+
}
|
|
836
|
+
)
|
|
837
|
+
total_degradation += degradation
|
|
838
|
+
|
|
839
|
+
result = {
|
|
840
|
+
"model_id": model_id,
|
|
841
|
+
"performance_degradation": (total_degradation / len(baseline_metrics) if baseline_metrics else 0.0),
|
|
842
|
+
"alert": len(degraded_metrics) > 0,
|
|
843
|
+
"degraded_metrics": degraded_metrics,
|
|
844
|
+
"timestamp": datetime.now(UTC).isoformat(),
|
|
845
|
+
}
|
|
846
|
+
|
|
847
|
+
return result
|
|
848
|
+
|
|
849
|
+
def detect_concept_drift(
|
|
850
|
+
self,
|
|
851
|
+
model_id: str,
|
|
852
|
+
prediction_window: str = "7d",
|
|
853
|
+
threshold: float = 0.15,
|
|
854
|
+
) -> Dict[str, Any]:
|
|
855
|
+
"""
|
|
856
|
+
Detect concept drift in model predictions.
|
|
857
|
+
|
|
858
|
+
Args:
|
|
859
|
+
model_id: Model identifier
|
|
860
|
+
prediction_window: Time window for analysis
|
|
861
|
+
threshold: Drift threshold
|
|
862
|
+
|
|
863
|
+
Returns:
|
|
864
|
+
Concept drift detection result
|
|
865
|
+
"""
|
|
866
|
+
# Simulate concept drift detection
|
|
867
|
+
drift_detected = False
|
|
868
|
+
explanation = "No significant concept drift detected in prediction window"
|
|
869
|
+
confidence = 0.92
|
|
870
|
+
|
|
871
|
+
result = {
|
|
872
|
+
"detected": drift_detected,
|
|
873
|
+
"model_id": model_id,
|
|
874
|
+
"prediction_window": prediction_window,
|
|
875
|
+
"threshold": threshold,
|
|
876
|
+
"explanation": explanation,
|
|
877
|
+
"confidence": confidence,
|
|
878
|
+
"timestamp": datetime.now(UTC).isoformat(),
|
|
879
|
+
}
|
|
880
|
+
|
|
881
|
+
return result
|
|
882
|
+
|
|
883
|
+
def get_drift_metrics(self) -> Dict[str, Any]:
|
|
884
|
+
"""
|
|
885
|
+
Get drift monitoring metrics.
|
|
886
|
+
|
|
887
|
+
Returns:
|
|
888
|
+
Metrics dict with drift scores and status
|
|
889
|
+
"""
|
|
890
|
+
return {
|
|
891
|
+
"drift_score": 0.08,
|
|
892
|
+
"threshold": self.threshold,
|
|
893
|
+
"status": "healthy",
|
|
894
|
+
"total_checks": len(self.drift_history),
|
|
895
|
+
"drift_incidents": sum(1 for d in self.drift_history if d["drift_detected"]),
|
|
896
|
+
}
|
|
897
|
+
|
|
898
|
+
|
|
899
|
+
class PerformanceOptimizer:
|
|
900
|
+
"""
|
|
901
|
+
Model performance optimization strategies.
|
|
902
|
+
|
|
903
|
+
Techniques:
|
|
904
|
+
- Quantization: Reduce model size
|
|
905
|
+
- Pruning: Remove unnecessary weights
|
|
906
|
+
- Distillation: Transfer knowledge to smaller model
|
|
907
|
+
- Inference optimization: Reduce latency
|
|
908
|
+
|
|
909
|
+
Example:
|
|
910
|
+
optimizer = PerformanceOptimizer()
|
|
911
|
+
quantized = optimizer.quantize_model(
|
|
912
|
+
model_path="/models/large_model.pkl",
|
|
913
|
+
precision="int8"
|
|
914
|
+
)
|
|
915
|
+
"""
|
|
916
|
+
|
|
917
|
+
def __init__(self) -> None:
|
|
918
|
+
"""Initialize PerformanceOptimizer."""
|
|
919
|
+
self.optimization_history: List[Dict[str, Any]] = []
|
|
920
|
+
|
|
921
|
+
def quantize_model(
|
|
922
|
+
self,
|
|
923
|
+
model_path: str,
|
|
924
|
+
precision: str = "int8",
|
|
925
|
+
) -> Dict[str, Any]:
|
|
926
|
+
"""
|
|
927
|
+
Quantize model to reduce size.
|
|
928
|
+
|
|
929
|
+
Args:
|
|
930
|
+
model_path: Path to model file
|
|
931
|
+
precision: Target precision (int8, int4, float16)
|
|
932
|
+
|
|
933
|
+
Returns:
|
|
934
|
+
Quantization result with size reduction
|
|
935
|
+
"""
|
|
936
|
+
# Simulate quantization (4x reduction for int8)
|
|
937
|
+
original_size = 600.0 # MB
|
|
938
|
+
reduction_factor = {"int8": 4.0, "int4": 8.0, "float16": 2.0}.get(precision, 1.0)
|
|
939
|
+
quantized_size = original_size / reduction_factor
|
|
940
|
+
|
|
941
|
+
result = {
|
|
942
|
+
"quantized_model": f"{model_path}.quantized",
|
|
943
|
+
"precision": precision,
|
|
944
|
+
"original_size_mb": original_size,
|
|
945
|
+
"quantized_size_mb": quantized_size,
|
|
946
|
+
"size_reduction": 1.0 - (quantized_size / original_size),
|
|
947
|
+
"accuracy_impact": -0.01, # 1% accuracy drop
|
|
948
|
+
}
|
|
949
|
+
|
|
950
|
+
return result
|
|
951
|
+
|
|
952
|
+
def prune_model(
|
|
953
|
+
self,
|
|
954
|
+
model_path: str,
|
|
955
|
+
sparsity_target: float = 0.5,
|
|
956
|
+
) -> Dict[str, Any]:
|
|
957
|
+
"""
|
|
958
|
+
Prune model weights.
|
|
959
|
+
|
|
960
|
+
Args:
|
|
961
|
+
model_path: Path to model file
|
|
962
|
+
sparsity_target: Target sparsity ratio (0.0-1.0)
|
|
963
|
+
|
|
964
|
+
Returns:
|
|
965
|
+
Pruning result with sparsity ratio
|
|
966
|
+
"""
|
|
967
|
+
result = {
|
|
968
|
+
"pruned_model": f"{model_path}.pruned",
|
|
969
|
+
"sparsity_ratio": sparsity_target,
|
|
970
|
+
"parameters_removed": int(10000000 * sparsity_target),
|
|
971
|
+
"inference_speedup": 1.5,
|
|
972
|
+
}
|
|
973
|
+
|
|
974
|
+
return result
|
|
975
|
+
|
|
976
|
+
def distill_model(
|
|
977
|
+
self,
|
|
978
|
+
teacher_model_path: str,
|
|
979
|
+
student_architecture: str,
|
|
980
|
+
) -> Dict[str, Any]:
|
|
981
|
+
"""
|
|
982
|
+
Distill knowledge to smaller model.
|
|
983
|
+
|
|
984
|
+
Args:
|
|
985
|
+
teacher_model_path: Path to teacher model
|
|
986
|
+
student_architecture: Student model architecture
|
|
987
|
+
|
|
988
|
+
Returns:
|
|
989
|
+
Distillation result with teacher and student models
|
|
990
|
+
"""
|
|
991
|
+
result = {
|
|
992
|
+
"teacher_model": teacher_model_path,
|
|
993
|
+
"student_model": f"{teacher_model_path}.distilled",
|
|
994
|
+
"student_architecture": student_architecture,
|
|
995
|
+
"size_reduction": 0.9, # 10x smaller
|
|
996
|
+
"accuracy_retention": 0.95, # 95% of teacher accuracy
|
|
997
|
+
}
|
|
998
|
+
|
|
999
|
+
return result
|
|
1000
|
+
|
|
1001
|
+
def optimize_inference_latency(
|
|
1002
|
+
self,
|
|
1003
|
+
model_path: str,
|
|
1004
|
+
target_latency_ms: float = 100.0,
|
|
1005
|
+
) -> Dict[str, Any]:
|
|
1006
|
+
"""
|
|
1007
|
+
Optimize model inference latency.
|
|
1008
|
+
|
|
1009
|
+
Args:
|
|
1010
|
+
model_path: Path to model file
|
|
1011
|
+
target_latency_ms: Target latency in milliseconds
|
|
1012
|
+
|
|
1013
|
+
Returns:
|
|
1014
|
+
Optimization strategy dict
|
|
1015
|
+
"""
|
|
1016
|
+
strategy = {
|
|
1017
|
+
"model_path": model_path,
|
|
1018
|
+
"target_latency_ms": target_latency_ms,
|
|
1019
|
+
"optimizations": [
|
|
1020
|
+
"batch_inference",
|
|
1021
|
+
"caching",
|
|
1022
|
+
"gpu_acceleration",
|
|
1023
|
+
"model_compilation",
|
|
1024
|
+
],
|
|
1025
|
+
"estimated_latency_ms": target_latency_ms * 0.8,
|
|
1026
|
+
"throughput_improvement": 2.5,
|
|
1027
|
+
}
|
|
1028
|
+
|
|
1029
|
+
return strategy
|
|
1030
|
+
|
|
1031
|
+
|
|
1032
|
+
class MLOpsMetricsCollector:
|
|
1033
|
+
"""
|
|
1034
|
+
MLOps metrics collection and monitoring.
|
|
1035
|
+
|
|
1036
|
+
Collects:
|
|
1037
|
+
- Training metrics: Accuracy, loss, F1 score
|
|
1038
|
+
- Inference metrics: Latency, throughput, error rate
|
|
1039
|
+
- Model performance timeline
|
|
1040
|
+
- Health status assessment
|
|
1041
|
+
|
|
1042
|
+
Example:
|
|
1043
|
+
collector = MLOpsMetricsCollector()
|
|
1044
|
+
metrics = collector.collect_training_metrics(
|
|
1045
|
+
run_id="run_001",
|
|
1046
|
+
epoch=10
|
|
1047
|
+
)
|
|
1048
|
+
"""
|
|
1049
|
+
|
|
1050
|
+
def __init__(self) -> None:
|
|
1051
|
+
"""Initialize MLOpsMetricsCollector."""
|
|
1052
|
+
self.metrics_history: List[Dict[str, Any]] = []
|
|
1053
|
+
|
|
1054
|
+
def collect_training_metrics(
|
|
1055
|
+
self,
|
|
1056
|
+
run_id: str = "run_001",
|
|
1057
|
+
epoch: int = 10,
|
|
1058
|
+
) -> Dict[str, Any]:
|
|
1059
|
+
"""
|
|
1060
|
+
Collect training metrics.
|
|
1061
|
+
|
|
1062
|
+
Args:
|
|
1063
|
+
run_id: Training run identifier
|
|
1064
|
+
epoch: Current epoch number
|
|
1065
|
+
|
|
1066
|
+
Returns:
|
|
1067
|
+
Training metrics dict
|
|
1068
|
+
"""
|
|
1069
|
+
metrics = {
|
|
1070
|
+
"run_id": run_id,
|
|
1071
|
+
"epoch": epoch,
|
|
1072
|
+
"accuracy": 0.94,
|
|
1073
|
+
"loss": 0.12,
|
|
1074
|
+
"f1_score": 0.93,
|
|
1075
|
+
"precision": 0.92,
|
|
1076
|
+
"recall": 0.94,
|
|
1077
|
+
"auc_roc": 0.96,
|
|
1078
|
+
"training_time_seconds": 3600.0,
|
|
1079
|
+
"timestamp": datetime.now(UTC).isoformat(),
|
|
1080
|
+
}
|
|
1081
|
+
|
|
1082
|
+
self.metrics_history.append(metrics)
|
|
1083
|
+
return metrics
|
|
1084
|
+
|
|
1085
|
+
def collect_inference_metrics(
|
|
1086
|
+
self,
|
|
1087
|
+
model_id: str = "model_001",
|
|
1088
|
+
) -> Dict[str, Any]:
|
|
1089
|
+
"""
|
|
1090
|
+
Collect inference metrics.
|
|
1091
|
+
|
|
1092
|
+
Args:
|
|
1093
|
+
model_id: Model identifier
|
|
1094
|
+
|
|
1095
|
+
Returns:
|
|
1096
|
+
Inference metrics dict
|
|
1097
|
+
"""
|
|
1098
|
+
metrics = {
|
|
1099
|
+
"model_id": model_id,
|
|
1100
|
+
"latency_p50_ms": 45.0,
|
|
1101
|
+
"latency_p95_ms": 85.0,
|
|
1102
|
+
"latency_p99_ms": 120.0,
|
|
1103
|
+
"throughput_qps": 500.0,
|
|
1104
|
+
"error_rate": 0.001,
|
|
1105
|
+
"success_rate": 0.999,
|
|
1106
|
+
"timestamp": datetime.now(UTC).isoformat(),
|
|
1107
|
+
}
|
|
1108
|
+
|
|
1109
|
+
return metrics
|
|
1110
|
+
|
|
1111
|
+
def track_model_performance(
|
|
1112
|
+
self,
|
|
1113
|
+
model_id: str,
|
|
1114
|
+
time_window: str = "7d",
|
|
1115
|
+
) -> List[Dict[str, Any]]:
|
|
1116
|
+
"""
|
|
1117
|
+
Track model performance over time.
|
|
1118
|
+
|
|
1119
|
+
Args:
|
|
1120
|
+
model_id: Model identifier
|
|
1121
|
+
time_window: Time window for tracking
|
|
1122
|
+
|
|
1123
|
+
Returns:
|
|
1124
|
+
Performance timeline list
|
|
1125
|
+
"""
|
|
1126
|
+
timeline = [
|
|
1127
|
+
{
|
|
1128
|
+
"timestamp": "2025-11-17T00:00:00Z",
|
|
1129
|
+
"accuracy": 0.94,
|
|
1130
|
+
"latency_ms": 50.0,
|
|
1131
|
+
},
|
|
1132
|
+
{
|
|
1133
|
+
"timestamp": "2025-11-24T00:00:00Z",
|
|
1134
|
+
"accuracy": 0.93,
|
|
1135
|
+
"latency_ms": 55.0,
|
|
1136
|
+
},
|
|
1137
|
+
]
|
|
1138
|
+
|
|
1139
|
+
return timeline
|
|
1140
|
+
|
|
1141
|
+
def get_mlops_health_status(self) -> Dict[str, Any]:
|
|
1142
|
+
"""
|
|
1143
|
+
Get overall MLOps health status.
|
|
1144
|
+
|
|
1145
|
+
Returns:
|
|
1146
|
+
Health status dict with overall score and components
|
|
1147
|
+
"""
|
|
1148
|
+
status = {
|
|
1149
|
+
"overall_score": 0.95,
|
|
1150
|
+
"status": "healthy",
|
|
1151
|
+
"components": {
|
|
1152
|
+
"data_pipeline": {"status": "healthy", "score": 0.98},
|
|
1153
|
+
"model_training": {"status": "healthy", "score": 0.94},
|
|
1154
|
+
"model_serving": {"status": "healthy", "score": 0.96},
|
|
1155
|
+
"monitoring": {"status": "healthy", "score": 0.93},
|
|
1156
|
+
},
|
|
1157
|
+
"alerts": [],
|
|
1158
|
+
"recommendations": ["Consider retraining model after 30 days"],
|
|
1159
|
+
"timestamp": datetime.now(UTC).isoformat(),
|
|
1160
|
+
}
|
|
1161
|
+
|
|
1162
|
+
return status
|