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

Проектуємо та впроваджуємо системи штучного інтелекту: від прототипу до production-ready рішення. Наша команда поєднує експертизу в машинному навчанні, дата-інжинірингу та MLOps, щоб AI працював не в лабораторії, а в реальному бізнесі.
Показано 1 з 1Усі 1566 послуг
Розробка системи версіонування та ліцензування AI-моделей на маркетплейсі
Середній
~2-4 тижні
Часті запитання

Напрямки AI-розробки

Етапи розробки AI-рішення

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1305
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1214
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    916
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1144
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    608
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    881

Розробка системи версіонування та ліцензування 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-системи клієнтів.