Разработка системы версионирования и лицензирования AI-моделей на маркетплейсе

Проектируем и внедряем системы искусственного интеллекта: от прототипа до production-ready решения. Наша команда объединяет экспертизу в машинном обучении, дата-инжиниринге и MLOps, чтобы AI работал не в лаборатории, а в реальном бизнесе.
Показано 1 из 1 услугВсе 1566 услуг
Разработка системы версионирования и лицензирования AI-моделей на маркетплейсе
Средняя
~2-4 недели
Часто задаваемые вопросы
Направления AI-разработки
Этапы разработки AI-решения
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1229
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1166
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    863
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1077
  • image_logo-advance_0.png
    Разработка логотипа компании B2B Advance
    563
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    829

Разработка системы версионирования и лицензирования AI-моделей на маркетплейсе

Версионирование и лицензирование — критические компоненты коммерческого AI-маркетплейса. Потребители должны знать, что именно они используют, а провайдеры — контролировать доступ к разным версиям своих моделей.

Семантическое версионирование для AI-моделей

AI-модели следуют семантическому версионированию, но с ML-специфичной семантикой:

  • Major (2.0.0): принципиально другая архитектура, несовместимые входные/выходные форматы, значительно другое поведение
  • Minor (1.3.0): дообучение на новых данных, улучшение метрик, обратно совместимые изменения поведения
  • Patch (1.2.1): исправление конкретных ошибок, микрооптимизации
from dataclasses import dataclass
from enum import Enum

class ChangeType(Enum):
    MAJOR = "major"
    MINOR = "minor"
    PATCH = "patch"

@dataclass
class ModelVersion:
    major: int
    minor: int
    patch: int
    release_notes: str
    breaking_changes: list[str]
    improvements: list[str]
    benchmark_deltas: dict  # {"accuracy": +0.02, "latency_ms": -5}
    compatibility: dict  # {"backward": True, "api_version": "v2"}

    def __str__(self):
        return f"{self.major}.{self.minor}.{self.patch}"

    @property
    def is_stable(self):
        return self.major > 0 and not self.is_prerelease

class ModelVersionManager:
    def create_version(self, model_id: str, artifacts: ModelArtifacts,
                       change_type: ChangeType) -> ModelVersion:
        current = self.get_latest(model_id)
        if change_type == ChangeType.MAJOR:
            new = ModelVersion(current.major + 1, 0, 0, ...)
        elif change_type == ChangeType.MINOR:
            new = ModelVersion(current.major, current.minor + 1, 0, ...)
        else:
            new = ModelVersion(current.major, current.minor, current.patch + 1, ...)

        # Автоматический benchmark comparison
        new.benchmark_deltas = self.compare_benchmarks(current, artifacts)
        return new

Лицензионные схемы

class LicenseType(Enum):
    COMMUNITY = "community"      # Бесплатно, некоммерческое использование
    DEVELOPER = "developer"      # Коммерческое, до N req/month
    PROFESSIONAL = "professional" # Без ограничений, SLA 99.9%
    ENTERPRISE = "enterprise"    # On-premise, custom terms

@dataclass
class License:
    type: LicenseType
    commercial_use: bool
    attribution_required: bool
    modification_allowed: bool
    redistribution_allowed: bool
    derivative_models_allowed: bool
    on_premise_allowed: bool
    max_monthly_requests: int = None  # None = unlimited
    geographic_restrictions: list[str] = None

STANDARD_LICENSES = {
    LicenseType.COMMUNITY: License(
        type=LicenseType.COMMUNITY,
        commercial_use=False,
        attribution_required=True,
        modification_allowed=True,
        redistribution_allowed=False,
        derivative_models_allowed=False,
        on_premise_allowed=False,
        max_monthly_requests=10_000
    ),
    LicenseType.ENTERPRISE: License(
        type=LicenseType.ENTERPRISE,
        commercial_use=True,
        attribution_required=False,
        modification_allowed=True,
        redistribution_allowed=False,
        derivative_models_allowed=True,
        on_premise_allowed=True,
        max_monthly_requests=None
    )
}

API для управления версиями на маркетплейсе

# Потребитель явно указывает версию в API запросе
@app.post("/v1/models/{model_id}@{version}/predict")
async def predict_versioned(model_id: str, version: str, request: PredictRequest):
    # Поддержка alias: "latest", "stable", "2.x" (последняя 2.x версия)
    resolved_version = version_resolver.resolve(model_id, version)
    return await inference_gateway.run(model_id, resolved_version, request)

# Deprecation уведомления
async def check_deprecated_version_usage(model_id: str, version: str):
    version_info = await version_registry.get(model_id, version)
    if version_info.deprecated_at:
        sunset_date = version_info.sunset_date
        days_left = (sunset_date - datetime.utcnow()).days
        return {
            "deprecated": True,
            "message": f"Version {version} deprecated. Sunset in {days_left} days.",
            "recommended_version": version_info.replacement
        }

Политика жизненного цикла версий

  • Новая major версия: предыдущая major поддерживается 12 месяцев
  • Deprecation warning за 6 месяцев до sunset
  • Автоматические email-уведомления потребителям при deprecation
  • Миграционные гайды обязательны для breaking changes

Это создаёт предсказуемую среду для потребителей и позволяет провайдерам стабильно развивать модели без страха сломать production-системы клиентов.