diff --git a/web/classic/src/pages/Midjourney/index.jsx b/web/classic/src/pages/Midjourney/index.jsx
index 7585e21a..6a14f4fa 100644
--- a/web/classic/src/pages/Midjourney/index.jsx
+++ b/web/classic/src/pages/Midjourney/index.jsx
@@ -20,10 +20,10 @@ For commercial licensing, please contact support@quantumnous.com
import React from 'react';
import MjLogsTable from '../../components/table/mj-logs';
-const Midjourney = () => (
+const MjProxy = () => (
);
-export default Midjourney;
+export default MjProxy;
diff --git a/web/default/scripts/sync-i18n.mjs b/web/default/scripts/sync-i18n.mjs
index ff5d463a..3235a9ec 100644
--- a/web/default/scripts/sync-i18n.mjs
+++ b/web/default/scripts/sync-i18n.mjs
@@ -58,9 +58,8 @@ const BRAND_AND_LITERAL_KEYS = new Set([
'JustSong',
'LingYiWanWu',
'LinuxDO',
- 'Midjourney',
- 'MidjourneyPlus',
- 'Midjourney-Proxy',
+ 'MjProxy',
+ 'MjProxyPlus',
'MiniMax',
'Mistral',
'MokaAI',
diff --git a/web/default/src/features/channels/constants.ts b/web/default/src/features/channels/constants.ts
index 32a5c90b..19607a4f 100644
--- a/web/default/src/features/channels/constants.ts
+++ b/web/default/src/features/channels/constants.ts
@@ -24,10 +24,10 @@ For commercial licensing, please contact support@quantumnous.com
export const CHANNEL_TYPES = {
0: 'Unknown',
1: 'OpenAI',
- 2: 'Midjourney',
+ 2: 'MjProxy',
3: 'Azure',
4: 'Ollama',
- 5: 'MidjourneyPlus',
+ 5: 'MjProxyPlus',
// 6: 'OpenAIMax',
7: 'OhMyGPT',
8: 'Custom',
diff --git a/web/default/src/features/channels/lib/channel-utils.ts b/web/default/src/features/channels/lib/channel-utils.ts
index d3cad658..55f2c375 100644
--- a/web/default/src/features/channels/lib/channel-utils.ts
+++ b/web/default/src/features/channels/lib/channel-utils.ts
@@ -92,8 +92,8 @@ export function getChannelTypeIcon(type: number): string {
20: 'OpenRouter', // OpenRouter
// Image/Video generation
- 2: 'Midjourney', // Midjourney
- 5: 'Midjourney', // MidjourneyPlus
+ 2: 'Midjourney', // MjProxy
+ 5: 'Midjourney', // MjProxyPlus
50: 'Kling', // Kling
51: 'Jimeng', // Jimeng
52: 'Vidu', // Vidu
diff --git a/web/default/src/features/system-settings/content/drawing-settings-section.tsx b/web/default/src/features/system-settings/content/drawing-settings-section.tsx
index eedf4138..672afde6 100644
--- a/web/default/src/features/system-settings/content/drawing-settings-section.tsx
+++ b/web/default/src/features/system-settings/content/drawing-settings-section.tsx
@@ -87,14 +87,14 @@ export function DrawingSettingsSection({
name: 'DrawingEnabled',
label: t('Enable drawing features'),
description: t(
- 'Required to expose Midjourney-style image generation to end users.'
+ 'Required to expose MjProxy-style image generation to end users.'
),
},
{
name: 'MjNotifyEnabled',
label: t('Allow upstream callbacks'),
description: t(
- 'When enabled, Midjourney callbacks are accepted (reveals server IP).'
+ 'When enabled, MjProxy callbacks are accepted (reveals server IP).'
),
},
{
@@ -115,7 +115,7 @@ export function DrawingSettingsSection({
name: 'MjModeClearEnabled',
label: t('Clear mode flags in prompts'),
description: t(
- 'Removes Midjourney flags such as --fast, --relax, and --turbo from user prompts.'
+ 'Removes MjProxy flags such as --fast, --relax, and --turbo from user prompts.'
),
},
{
diff --git a/web/default/src/features/system-settings/maintenance/sidebar-modules-section.tsx b/web/default/src/features/system-settings/maintenance/sidebar-modules-section.tsx
index 782fbd4d..98b8829b 100644
--- a/web/default/src/features/system-settings/maintenance/sidebar-modules-section.tsx
+++ b/web/default/src/features/system-settings/maintenance/sidebar-modules-section.tsx
@@ -108,7 +108,7 @@ export function SidebarModulesSection({
},
midjourney: {
title: t('Drawing logs'),
- description: t('History of Midjourney-style image tasks.'),
+ description: t('History of MjProxy-style image tasks.'),
},
task: {
title: t('Task logs'),
diff --git a/web/default/src/features/usage-logs/api.ts b/web/default/src/features/usage-logs/api.ts
index 15209a6d..720c5813 100644
--- a/web/default/src/features/usage-logs/api.ts
+++ b/web/default/src/features/usage-logs/api.ts
@@ -91,7 +91,7 @@ export async function getUserInfo(
}
// ============================================================================
-// Midjourney (Drawing) Logs API
+// MjProxy (Drawing) Logs API
// ============================================================================
export const getAllMidjourneyLogs = (params: GetMidjourneyLogsParams) =>
diff --git a/web/default/src/features/usage-logs/components/columns/common-logs-columns.tsx b/web/default/src/features/usage-logs/components/columns/common-logs-columns.tsx
index 7ca4f114..7ef4e1c7 100644
--- a/web/default/src/features/usage-logs/components/columns/common-logs-columns.tsx
+++ b/web/default/src/features/usage-logs/components/columns/common-logs-columns.tsx
@@ -18,7 +18,7 @@ For commercial licensing, please contact support@quantumnous.com
*/
import { useState } from 'react'
import { type ColumnDef } from '@tanstack/react-table'
-import { CircleAlert, Sparkles, KeyRound } from 'lucide-react'
+import { CircleAlert, GitBranch, Sparkles, KeyRound } from 'lucide-react'
import { useTranslation } from 'react-i18next'
import { getUserAvatarFallback, getUserAvatarStyle } from '@/lib/avatar'
import { formatBillingCurrencyFromUSD } from '@/lib/currency'
@@ -29,6 +29,11 @@ import {
} from '@/lib/format'
import { cn } from '@/lib/utils'
import { Avatar, AvatarFallback } from '@/components/ui/avatar'
+import {
+ Popover,
+ PopoverContent,
+ PopoverTrigger,
+} from '@/components/ui/popover'
import {
Tooltip,
TooltipContent,
@@ -318,16 +323,23 @@ export function useCommonLogsColumns(isAdmin: boolean): ColumnDef
[] {
const other = parseLogOther(log.other)
const affinity = other?.admin_info?.channel_affinity
- const useChannel = other?.admin_info?.use_channel
+ const rawUseChannel = other?.admin_info?.use_channel ?? []
+ const useChannel = Array.isArray(rawUseChannel)
+ ? rawUseChannel.map(String).filter(Boolean)
+ : []
+ const hasRetryChain = useChannel.length > 1
const channelChain =
- useChannel && useChannel.length > 0
- ? useChannel.join(' → ')
- : undefined
+ hasRetryChain ? useChannel.join(' → ') : undefined
const channelDisplay = log.channel_name
? `${log.channel_name} #${log.channel}`
: `#${log.channel}`
const channelIdDisplay = `#${log.channel}`
const channelName = sensitiveVisible ? log.channel_name : '••••'
+ const multiKeyIndex = other?.admin_info?.multi_key_index
+ const showMultiKeyIndex =
+ other?.admin_info?.is_multi_key === true &&
+ typeof multiKeyIndex === 'number' &&
+ Number.isFinite(multiKeyIndex)
return (
@@ -337,7 +349,7 @@ export function useCommonLogsColumns(isAdmin: boolean): ColumnDef[] {
}
>
-
+
[] {
showDot={false}
className='font-mono'
/>
+ {showMultiKeyIndex && (
+
+ )}
+ {hasRetryChain && (
+
+ e.stopPropagation()}
+ />
+ }
+ >
+
+
+
+
+
{t('Retry Chain')}
+
+ {channelChain}
+
+
+
+
+ )}
{affinity && (