{{ 'XP.ModelGateway.AdminTitle' | translate: { Default: 'Model API gateway' } }}
{{ 'XP.ModelGateway.AdminDescription' | translate : { Default: 'Review external API usage, manage API keys, and configure gateway limits and retention.' } }}
@if (loading()) {
} @else { @switch (activeTab()) { @case ('calls') {
{{ 'XP.ModelGateway.SearchCalls' | translate: { Default: 'Search calls' } }}
@for (call of calls(); track call.id) { }
{{ 'XP.ModelGateway.RequestId' | translate: { Default: 'Request ID' } }} {{ 'XP.ModelGateway.User' | translate: { Default: 'User' } }} {{ 'XP.ModelGateway.Model' | translate: { Default: 'Model' } }} {{ 'XP.ModelGateway.Status' | translate: { Default: 'Status' } }} {{ 'XP.ModelGateway.Points' | translate: { Default: 'Points' } }} {{ 'XP.ModelGateway.StartedAt' | translate: { Default: 'Started at' } }} {{ 'XP.ModelGateway.Actions' | translate: { Default: 'Actions' } }}
{{ call.requestId }}
{{ call.userName || call.userId }}
@if (call.userName && call.userName !== call.userId) { {{ call.userId }} }
{{ call.externalModelId }} {{ 'XP.ModelGateway.CallStatus.' + call.status | translate: { Default: call.status } }} {{ call.chargedPoints | number: '1.0-2' }} {{ formatDate(call.startedAt) }} @if (call.bodyExpiresAt) { }
@if (callTotal()) {
{{ 'XP.ModelGateway.PageSummary' | translate : { current: activePageNumber(), pages: activePageCount(), total: activeTotal(), Default: 'Page {{current}} of {{ pages }} · {{ total }} records' } }}
} } @case ('keys') {
{{ 'XP.ModelGateway.SearchKeys' | translate: { Default: 'Search API keys' } }}
@for (key of keys(); track key.id) { }
{{ 'XP.ModelGateway.User' | translate: { Default: 'User' } }} {{ 'XP.ModelGateway.KeyName' | translate: { Default: 'Name' } }} {{ 'XP.ModelGateway.Prefix' | translate: { Default: 'Prefix' } }} {{ 'XP.ModelGateway.Status' | translate: { Default: 'Status' } }} {{ 'XP.ModelGateway.LastUsedAt' | translate: { Default: 'Last used' } }} {{ 'XP.ModelGateway.ExpiresAt' | translate: { Default: 'Expires at' } }} {{ 'XP.ModelGateway.Actions' | translate: { Default: 'Actions' } }}
{{ key.userName || key.userId }}
@if (key.userName && key.userName !== key.userId) { {{ key.userId }} }
{{ key.name }} {{ key.prefix }}… {{ 'XP.ModelGateway.KeyStatus.' + key.status | translate: { Default: key.status } }} {{ formatDate(key.lastUsedAt) }} {{ formatDate(key.validUntil) }} @if (key.status === keyStatus.Active) { }
@if (keyTotal()) {
{{ 'XP.ModelGateway.PageSummary' | translate : { current: activePageNumber(), pages: activePageCount(), total: activeTotal(), Default: 'Page {{current}} of {{ pages }} · {{ total }} records' } }}
} } @case ('settings') {

{{ 'XP.ModelGateway.RequestLimits' | translate: { Default: 'Request limits' } }}

{{ 'XP.ModelGateway.RequestLimitsHint' | translate : { Default: 'Limits apply to all API keys owned by the same user. Requests over the limit receive 429 and are not queued.' } }}

{{ 'XP.ModelGateway.RequestsPerMinute' | translate: { Default: 'Requests per minute' } }} @if (requestsPerMinuteCtrl.invalid && requestsPerMinuteCtrl.touched) { {{ 'XP.ModelGateway.RequestsPerMinuteError' | translate: { Default: requestsPerMinuteErrorDefault } }} } {{ 'XP.ModelGateway.MaxConcurrentRequests' | translate: { Default: 'Maximum concurrent requests' } }} @if (maxConcurrentRequestsCtrl.invalid && maxConcurrentRequestsCtrl.touched) { {{ 'XP.ModelGateway.MaxConcurrentRequestsError' | translate: { Default: concurrentRequestsErrorDefault } }} }

{{ 'XP.ModelGateway.Retention' | translate: { Default: 'Request and response retention' } }}

{{ 'XP.ModelGateway.RetentionHint' | translate : { Default: 'Off by default. When enabled, encrypted request and response bodies are deleted after the configured number of days.' } }}

{{ 'XP.ModelGateway.StoreBodies' | translate: { Default: 'Store bodies' } }}
@if (settingsForm.controls.storeBodies.value) {
{{ 'XP.ModelGateway.RetentionDays' | translate: { Default: 'Retention days' } }} @if (bodyRetentionDaysCtrl.invalid && bodyRetentionDaysCtrl.touched) { {{ 'XP.ModelGateway.RetentionDaysError' | translate: { Default: bodyRetentionDaysErrorDefault } }} }
}
} } }