9988ac9b5f
CI / docker (push) Successful in 4m19s
Text keys use OpenAI routes; image keys use Replicate predictions and model listing, with admin UI whitelist filtering and per-key documentation pages. Co-authored-by: Cursor <cursoragent@cursor.com>
314 lines
12 KiB
TypeScript
314 lines
12 KiB
TypeScript
export default {
|
|
common: {
|
|
brand: 'Luminary',
|
|
cancel: 'Cancel',
|
|
confirm: 'Confirm',
|
|
save: 'Save',
|
|
edit: 'Edit',
|
|
create: 'Create',
|
|
add: 'Add',
|
|
delete: 'Delete',
|
|
refresh: 'Refresh',
|
|
query: 'Search',
|
|
copy: 'Copy',
|
|
actions: 'Actions',
|
|
name: 'Name',
|
|
status: 'Status',
|
|
type: 'Type',
|
|
enabled: 'Enabled',
|
|
disabled: 'Disabled',
|
|
yes: 'Yes',
|
|
no: 'No',
|
|
all: 'All',
|
|
loading: 'Loading...',
|
|
empty: '(empty)',
|
|
dash: '—',
|
|
infinity: '∞',
|
|
confirmDelete: 'Delete this item?',
|
|
auto: 'Auto',
|
|
detail: 'Details',
|
|
model: 'Model',
|
|
requests: 'Requests',
|
|
tokens: 'Tokens',
|
|
cost: 'Cost ($)',
|
|
latencyMs: 'Latency (ms)',
|
|
latency: 'Latency',
|
|
stream: 'Stream',
|
|
error: 'Error',
|
|
time: 'Time',
|
|
username: 'Username',
|
|
password: 'Password',
|
|
weight: 'Weight',
|
|
priority: 'Priority',
|
|
category: 'Category',
|
|
budget: 'Budget',
|
|
soon: 'Coming soon',
|
|
whitelistMore: '{items} and {count} more',
|
|
language: 'Language',
|
|
zh: '中文',
|
|
en: 'English',
|
|
},
|
|
nav: {
|
|
dashboard: 'Dashboard',
|
|
providers: 'Egress',
|
|
ingress: 'Ingress',
|
|
logs: 'Request Logs',
|
|
ipRules: 'IP Rules',
|
|
settings: 'Settings',
|
|
security: 'Security',
|
|
logout: 'Sign out',
|
|
},
|
|
login: {
|
|
subtitle: 'AI Gateway Console',
|
|
title: 'Sign in',
|
|
username: 'Username',
|
|
passwordPlaceholder: 'Enter password',
|
|
submit: 'Sign in',
|
|
footer: 'Luminary Gateway — unified AI egress & ingress management',
|
|
success: 'Signed in successfully',
|
|
failed: 'Sign in failed. Check username and password.',
|
|
rateLimited: 'Too many attempts. Please try again later.',
|
|
rateLimitedSec: 'Too many attempts. Try again in {sec} seconds.',
|
|
ipBlocked: 'Your IP is not allowed to access the admin console. Check IP rules or contact an administrator.',
|
|
},
|
|
dashboard: {
|
|
title: 'Dashboard',
|
|
description: 'Real-time gateway requests, error rate, and provider health',
|
|
requests24h: '24h Requests',
|
|
tokens24h: '24h Tokens',
|
|
errorRate: 'Error Rate',
|
|
activeIngressKeys: 'Active Ingress Keys',
|
|
requestTrend: '24h Request Trend',
|
|
tokenTrend: '24h Token Trend',
|
|
seriesRequests: 'Requests',
|
|
seriesErrors: 'Errors',
|
|
seriesTokens: 'Tokens',
|
|
providerHealth: 'Provider Health',
|
|
ingressTop5: 'Top 5 Ingress Keys',
|
|
providerModelUsage: 'Provider + Model Usage (24h)',
|
|
clientIpUsage: 'Client IP Usage (24h)',
|
|
clientIp: 'Client IP',
|
|
requestCount: 'Requests',
|
|
},
|
|
providers: {
|
|
title: 'Egress Providers',
|
|
description: 'Configure upstream providers, API paths, and keys',
|
|
addProvider: 'Add Provider',
|
|
protocolType: 'Protocol',
|
|
baseUrl: 'Base URL',
|
|
baseUrlPlaceholder: 'Leave empty for default',
|
|
enabledEndpoints: 'Enabled Endpoints',
|
|
models: 'Models',
|
|
modelsEmpty: 'No models yet. Click Sync Models to pull from upstream.',
|
|
displayName: 'Display Name',
|
|
syncedAt: 'Synced At',
|
|
addDialogTitle: 'Add Provider',
|
|
endpointConfig: 'Endpoint Config',
|
|
endpointConfigTitle: 'Endpoint Config — {name}',
|
|
endpointDivider: 'Endpoints & Paths',
|
|
endpointEditDivider: 'Enabled Endpoints & Path Overrides',
|
|
pathHint: 'Path can be relative (based on Base URL) or a full http(s) URL',
|
|
keysTitle: 'Keys — {name}',
|
|
addKey: 'Add Key',
|
|
addKeyDialogTitle: 'Add Provider Key',
|
|
apiKey: 'API Key',
|
|
modelWhitelist: 'Model Whitelist',
|
|
modelWhitelistPlaceholder: '["*"] or gpt-4o-mini',
|
|
maxRequestsPerDay: 'Max Requests / Day',
|
|
maxTokensPerDay: 'Max Tokens / Day',
|
|
requestsToday: 'Requests Today',
|
|
modelsTitle: 'Models — {name}',
|
|
syncModels: 'Sync Models',
|
|
addModel: 'Add Model',
|
|
addModelDialogTitle: 'Add Model',
|
|
modelId: 'Model ID',
|
|
ingressModelId: 'Ingress Model ID',
|
|
ingressModelIdHint: 'Clients use this name in the version field of /v1/predictions',
|
|
ingressModelIdRequired: 'Ingress Model ID is required',
|
|
modelAlias: 'Ingress alias',
|
|
modelAliasPlaceholder: 'Optional; ingress API uses this name',
|
|
modelAliasHint: 'Leave empty to use upstream Model ID at ingress',
|
|
upstreamModelId: 'Upstream Model ID',
|
|
editModelDialogTitle: 'Edit model',
|
|
providerNameExists: 'Provider name already exists',
|
|
modelAliasExists: 'Model alias already exists',
|
|
modelIdRequired: 'Model ID is required',
|
|
modelAdded: 'Model added',
|
|
modelDeleted: 'Model deleted',
|
|
confirmDeleteModel: 'Delete this model?',
|
|
modelsSummary: '{total} models, {enabled} enabled',
|
|
modelsAction: 'Models',
|
|
endpointsAction: 'Endpoints',
|
|
keysAction: 'Keys',
|
|
modelNotLoaded: 'Model data not loaded. Refresh and try again.',
|
|
modelEnabled: 'Model enabled',
|
|
modelDisabled: 'Model disabled',
|
|
modelNotFound: 'Model not found. Sync models and try again.',
|
|
updateFailed: 'Update failed',
|
|
createSuccess: 'Created successfully',
|
|
saved: 'Saved',
|
|
deleted: 'Deleted',
|
|
syncedCount: 'Synced {count} models',
|
|
syncFailed: 'Sync failed',
|
|
keyAdded: 'Key added',
|
|
},
|
|
ingress: {
|
|
title: 'Ingress Keys',
|
|
description: 'Create virtual keys with budget, rate limits, and routing',
|
|
createKey: 'Create Ingress Key',
|
|
keyPrefix: 'Key Prefix',
|
|
providerWhitelist: 'Provider Whitelist',
|
|
modelWhitelist: 'Model Whitelist',
|
|
budgetLimit: 'Budget Limit',
|
|
rpmLimit: 'RPM Limit',
|
|
tpmLimit: 'TPM Limit',
|
|
whitelistAction: 'Whitelist',
|
|
routingAction: 'Routing',
|
|
createDialogTitle: 'Create Ingress Key',
|
|
providerWhitelistPlaceholder: 'Empty means all providers',
|
|
modelWhitelistPlaceholder: 'Empty means all models',
|
|
whitelistHint: 'Empty selection allows all',
|
|
modelWhitelistHint: 'Empty allows all; sync models in Egress first',
|
|
editWhitelistTitle: 'Edit Whitelist',
|
|
plainKeyTitle: 'Save your key (shown once)',
|
|
plainKeyWarning: 'Copy now — the full key cannot be viewed again after closing',
|
|
routingTitle: 'Routing Rules — {name}',
|
|
addRule: 'Add Rule',
|
|
modelPattern: 'Model Pattern',
|
|
modelPatternPlaceholder: 'gpt-4o* or claude-3-5-sonnet',
|
|
providerId: 'Provider',
|
|
providerIdPlaceholder: 'Select provider',
|
|
keyIdOptional: 'Provider key',
|
|
keyIdPlaceholder: 'Leave empty for auto load balancing',
|
|
providerRequired: 'Please select a provider',
|
|
addRuleTitle: 'Add Routing Rule',
|
|
whitelistUpdated: 'Whitelist updated',
|
|
confirmDeleteKey: 'Delete this key?',
|
|
copied: 'Copied',
|
|
ruleAdded: 'Rule added',
|
|
protocol: 'Protocol',
|
|
protocolText: 'Text (OpenAI)',
|
|
protocolImage: 'Image (Replicate)',
|
|
protocolHint: 'Text keys use /v1/chat/completions etc.; image keys use /v1/predictions and Replicate model listing',
|
|
editKeyTitle: 'Edit Key',
|
|
protocolUpdated: 'Key updated',
|
|
apiDoc: 'API Docs',
|
|
},
|
|
logs: {
|
|
title: 'Request Logs',
|
|
description: 'Latest 500 records including inference and admin login',
|
|
ingress: 'Ingress',
|
|
endpoint: 'Endpoint',
|
|
modelOrUser: 'Model / User',
|
|
modelOrUserPlaceholder: 'Model / username',
|
|
clientIpPlaceholder: 'Client IP',
|
|
statusSuccess: 'Success',
|
|
statusError: 'Error',
|
|
endpointAdminLogin: 'Admin Login',
|
|
pagerHint: '{total} total, up to {max} retained',
|
|
detailTitle: 'Request Details',
|
|
requestBody: 'Request Body',
|
|
responseBody: 'Response Body',
|
|
predictionStatus: 'Prediction status',
|
|
},
|
|
ipRules: {
|
|
title: 'IP Rules',
|
|
description: 'Whitelist / blacklist for admin console and inference API',
|
|
addRule: 'Add IP Rule',
|
|
cidr: 'CIDR / IP',
|
|
cidrPlaceholder: '192.168.1.0/24 or 127.0.0.1',
|
|
scope: 'Scope',
|
|
typeAllow: 'Allow',
|
|
typeDeny: 'Deny',
|
|
scopeProxy: 'Inference API',
|
|
scopeAdmin: 'Admin Console',
|
|
scopeAll: 'All (Admin + API)',
|
|
allowWarning: 'Allow rules restrict admin access. Ensure your current IP is included.',
|
|
added: 'Added',
|
|
},
|
|
settings: {
|
|
title: 'Settings',
|
|
description: 'All runtime parameters are managed here — no config file required',
|
|
securitySession: 'Security & Session',
|
|
gatewayMonitor: 'Gateway & Monitoring',
|
|
changePassword: 'Change Admin Password',
|
|
encryptionKey: 'Encryption Key',
|
|
encryptionKeyPlaceholder: 'Leave empty to keep unchanged; must match old key to decrypt existing provider keys',
|
|
encryptionKeyCurrent: 'Current: {hint}',
|
|
sessionTtl: 'Session TTL (seconds)',
|
|
loginMaxAttempts: 'Max Login Attempts',
|
|
loginLockout: 'Login Lockout (seconds)',
|
|
trustedProxies: 'Trusted Proxy IPs / CIDRs',
|
|
trustedProxiesPlaceholder: 'One per line, e.g. 127.0.0.1 or 10.0.0.0/8',
|
|
usageFlush: 'Usage Flush Interval (seconds)',
|
|
healthCheck: 'Health Check Interval (seconds)',
|
|
gatewayMaxRetries: 'Gateway Max Retries',
|
|
retryBackoff: 'Retry Backoff (ms)',
|
|
saveSettings: 'Save Settings',
|
|
oldPassword: 'Current Password',
|
|
newPassword: 'New Password',
|
|
savePassword: 'Save Password',
|
|
settingsSaved: 'Settings saved',
|
|
passwordUpdated: 'Password updated',
|
|
},
|
|
apiDocs: {
|
|
backToKeys: 'Back to Ingress Keys',
|
|
authTitle: 'Authentication',
|
|
authDesc: 'Send your ingress key (sk-lum-*) using either header:',
|
|
endpointsTitle: 'Endpoints',
|
|
method: 'Method',
|
|
path: 'Path',
|
|
summary: 'Summary',
|
|
text: {
|
|
title: 'Text API (OpenAI compatible)',
|
|
description: 'For ingress keys with the Text protocol. Compatible with OpenAI SDKs.',
|
|
note: 'Available endpoints depend on enabled egress endpoints. Empty whitelist means no provider/model restriction.',
|
|
endpointRows: [
|
|
{ method: 'GET', path: '/v1/models', summary: 'List models (OpenAI format)', status: 'Supported' },
|
|
{ method: 'POST', path: '/v1/chat/completions', summary: 'Chat completions; SSE when stream: true', status: 'Supported' },
|
|
{ method: 'POST', path: '/v1/responses', summary: 'OpenAI Responses API', status: 'Supported' },
|
|
{ method: 'POST', path: '/v1/completions', summary: 'Legacy text completions', status: 'Supported' },
|
|
{ method: 'POST', path: '/v1/embeddings', summary: 'Embeddings', status: 'Supported' },
|
|
{ method: 'POST', path: '/v1/rerank', summary: 'Cohere-compatible rerank', status: 'Supported' },
|
|
],
|
|
exampleRows: [
|
|
{
|
|
title: 'List models',
|
|
code: 'curl {baseURL}/models \\\n -H "Authorization: Bearer sk-lum-..."',
|
|
},
|
|
{
|
|
title: 'Chat completion',
|
|
code: 'curl {baseURL}/chat/completions \\\n -H "Authorization: Bearer sk-lum-..." \\\n -H "Content-Type: application/json" \\\n -d \'{"model":"gpt-4o-mini","messages":[{"role":"user","content":"Hello"}]}\'',
|
|
},
|
|
{
|
|
title: 'Embeddings',
|
|
code: 'curl {baseURL}/embeddings \\\n -H "Authorization: Bearer sk-lum-..." \\\n -H "Content-Type: application/json" \\\n -d \'{"model":"text-embedding-3-small","input":"hello"}\'',
|
|
},
|
|
],
|
|
},
|
|
image: {
|
|
title: 'Image API (Replicate compatible)',
|
|
description: 'For ingress keys with the Image protocol. Async ComfyUI txt2img / img2img workflows.',
|
|
note: 'Request field version is the workflow hash from egress model config. Outputs are signed URLs (/files/:id?exp=&sig=).',
|
|
endpointRows: [
|
|
{ method: 'GET', path: '/v1/models', summary: 'List workflow models (Replicate format)', status: 'Supported' },
|
|
{ method: 'POST', path: '/v1/predictions', summary: 'Create async job; Prefer: wait for sync', status: 'Supported' },
|
|
{ method: 'GET', path: '/v1/predictions', summary: 'List jobs (cursor pagination)', status: 'Supported' },
|
|
{ method: 'GET', path: '/v1/predictions/:id', summary: 'Get job status and output', status: 'Supported' },
|
|
{ method: 'POST', path: '/v1/predictions/:id/cancel', summary: 'Cancel a running job', status: 'Supported' },
|
|
{ method: 'GET', path: '/v1/predictions/:id/stream', summary: 'SSE progress stream', status: 'Supported' },
|
|
],
|
|
exampleRows: [
|
|
{
|
|
title: 'List workflow models',
|
|
code: 'curl {baseURL}/models \\\n -H "Authorization: Bearer sk-lum-..."',
|
|
},
|
|
{
|
|
title: 'Create prediction',
|
|
code: 'curl -X POST {baseURL}/predictions \\\n -H "Authorization: Bearer sk-lum-..." \\\n -H "Content-Type: application/json" \\\n -d \'{"version":"<workflow-version-hash>","input":{"prompt":"a cat"}}\'',
|
|
},
|
|
],
|
|
},
|
|
},
|
|
}
|