Development of an AI-as-a-Service platform (White-Label)
The white-label AI platform allows resellers and partners to provide AI services under their own brand. Partners receive a fully functional platform with a customized UI, pricing, and domain name, without disclosing the end technology provider.
Architecture of a multi-tenant white-label platform
┌─────────────────────────────────────────────────────────┐
│ Partner A Partner B │
│ ai.company-a.com ai.company-b.com │
│ [Brand A UI] [Brand B UI] │
└─────────────────┬────────────────────────┬──────────────┘
↓ ↓
┌─────────────────────────────────────────────────────────┐
│ White-Label Gateway │
│ [Tenant Resolution] → [Brand Config] → [API Proxy] │
└─────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────┐
│ Core AI Platform │
│ [Model Inference] [Billing] [Analytics] [Management] │
└─────────────────────────────────────────────────────────┘
Tenant Management
from dataclasses import dataclass
@dataclass
class WhiteLabelTenant:
tenant_id: str
partner_id: str
# Брендинг
brand_name: str
logo_url: str
primary_color: str
custom_domain: str
# Функциональность
enabled_models: list[str]
custom_model_names: dict # Переименование моделей для партнёра
# Ценообразование
markup_percent: float # Наценка партнёра
custom_pricing: dict # Кастомные цены (перекрывают markup)
# Контракт
revenue_share_percent: float # % от выручки партнёра, идущий к нам
min_monthly_revenue: float
class TenantResolver:
async def resolve(self, request: Request) -> WhiteLabelTenant:
# Определение тенанта по домену
host = request.headers.get('host', '')
# Поиск по custom domain
tenant = await self.db.get_by_domain(host)
if tenant:
return tenant
# Fallback: по API ключу
api_key = request.headers.get('X-API-Key')
if api_key:
return await self.db.get_by_api_key_prefix(api_key)
raise TenantNotFoundError(f"Unknown domain: {host}")
White-Label API Gateway
@app.middleware("http")
async def white_label_middleware(request: Request, call_next):
tenant = await tenant_resolver.resolve(request)
# Подмена brand-specific конфигурации
request.state.tenant = tenant
request.state.brand_config = await brand_config_store.get(tenant.tenant_id)
response = await call_next(request)
# Удаление внутренних заголовков
response.headers.pop("X-Powered-By", None)
response.headers.pop("X-Internal-Model-Id", None)
return response
@app.post("/v1/chat/completions")
async def chat_completions(request: ChatRequest, req: Request):
tenant = req.state.tenant
# Маппинг model names: "gpt-4" (клиент) → "actual-model-id" (внутренний)
internal_model = tenant.custom_model_names.get(
request.model,
request.model
)
# Проверка доступности модели для этого тенанта
if internal_model not in tenant.enabled_models:
raise HTTPException(404, f"Model '{request.model}' not available")
# Кастомное ценообразование
pricing = tenant.custom_pricing.get(internal_model) or \
base_pricing.get(internal_model) * (1 + tenant.markup_percent / 100)
result = await inference_service.run(internal_model, request)
await billing.charge(tenant, result.usage, pricing)
return result
UI customization
Partners manage branding through the admin panel:
@dataclass
class BrandConfig:
logo_url: str
favicon_url: str
primary_color: str # "#0066cc"
secondary_color: str
font_family: str
custom_css: str # Дополнительный CSS для тонкой настройки
support_email: str
privacy_policy_url: str
terms_url: str
# Белый список разрешённых функций
show_model_selection: bool = True
show_usage_analytics: bool = True
show_api_docs: bool = True
custom_nav_items: list[dict] = None # Дополнительные пункты меню
Development time: 4-6 months for a full white-label platform with multi-tenancy, billing, analytics, and an admin portal for partners.







