Skip to content

Commit 0515ef6

Browse files
catlog22claude
andcommitted
refactor: Simplify CodexLens rotation UI, link to API Settings
- Simplify rotation section to show status only - Add link to navigate to API Settings Embedding Pool - Update loadRotationStatus to read from embedding-pool API - Remove detailed modal in favor of API Settings config - Add i18n translations for 'Configure in API Settings' 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <[email protected]>
1 parent 777d5df commit 0515ef6

File tree

2 files changed

+50
-22
lines changed

2 files changed

+50
-22
lines changed

ccw/src/templates/dashboard-js/i18n.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,7 @@ const i18n = {
291291
'codexlens.useAllKeys': 'Use All Keys',
292292
'codexlens.selectKeys': 'Select Keys',
293293
'codexlens.configureRotation': 'Configure Rotation',
294+
'codexlens.configureInApiSettings': 'Configure in API Settings',
294295
'codexlens.rotationSaved': 'Rotation config saved successfully',
295296
'codexlens.endpointsSynced': 'endpoints synced to CodexLens',
296297
'codexlens.syncFailed': 'Sync failed',
@@ -1997,6 +1998,7 @@ const i18n = {
19971998
'codexlens.useAllKeys': '使用所有密钥',
19981999
'codexlens.selectKeys': '选择密钥',
19992000
'codexlens.configureRotation': '配置轮训',
2001+
'codexlens.configureInApiSettings': '在 API 设置中配置',
20002002
'codexlens.rotationSaved': '轮训配置保存成功',
20012003
'codexlens.endpointsSynced': '个端点已同步到 CodexLens',
20022004
'codexlens.syncFailed': '同步失败',

ccw/src/templates/dashboard-js/views/codexlens-manager.js

Lines changed: 48 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2058,7 +2058,7 @@ function buildCodexLensManagerPage(config) {
20582058
'</div>' +
20592059
'<p class="text-xs text-muted-foreground mt-1">' + t('codexlens.concurrencyHint') + '</p>' +
20602060
'</div>' +
2061-
// Multi-Provider Rotation (only for LiteLLM backend)
2061+
// Multi-Provider Rotation (only for LiteLLM backend) - Simplified, config in API Settings
20622062
'<div id="rotationSection" class="hidden">' +
20632063
'<div class="border border-border rounded-lg p-3 bg-muted/30">' +
20642064
'<div class="flex items-center justify-between mb-2">' +
@@ -2070,13 +2070,15 @@ function buildCodexLensManagerPage(config) {
20702070
t('common.disabled') +
20712071
'</div>' +
20722072
'</div>' +
2073-
'<p class="text-xs text-muted-foreground mb-3">' + t('codexlens.rotationDesc') + '</p>' +
2073+
'<p class="text-xs text-muted-foreground mb-2">' + t('codexlens.rotationDesc') + '</p>' +
2074+
'<div id="rotationDetails" class="text-xs text-muted-foreground mb-3 hidden">' +
2075+
'<span id="rotationModelName"></span> · <span id="rotationEndpointCount"></span>' +
2076+
'</div>' +
20742077
'<div class="flex items-center gap-2">' +
2075-
'<button class="btn-sm btn-outline flex items-center gap-1.5" onclick="showRotationConfigModal()">' +
2076-
'<i data-lucide="settings" class="w-3.5 h-3.5"></i>' +
2077-
t('codexlens.configureRotation') +
2078-
'</button>' +
2079-
'<span id="rotationEndpointCount" class="text-xs text-muted-foreground"></span>' +
2078+
'<a href="#" class="btn-sm btn-outline flex items-center gap-1.5" onclick="navigateToApiSettingsEmbeddingPool(); return false;">' +
2079+
'<i data-lucide="external-link" class="w-3.5 h-3.5"></i>' +
2080+
t('codexlens.configureInApiSettings') +
2081+
'</a>' +
20802082
'</div>' +
20812083
'</div>' +
20822084
'</div>' +
@@ -2656,45 +2658,69 @@ async function cleanAllIndexesFromPage() {
26562658
*/
26572659
async function loadRotationStatus() {
26582660
try {
2659-
var response = await fetch('/api/litellm-api/codexlens/rotation');
2661+
// Load from unified embedding-pool API (handles both new and legacy config)
2662+
var response = await fetch('/api/litellm-api/embedding-pool');
26602663
if (!response.ok) {
2661-
console.warn('[CodexLens] Failed to load rotation config:', response.status);
2664+
console.warn('[CodexLens] Failed to load embedding pool config:', response.status);
26622665
return;
26632666
}
26642667
var data = await response.json();
2665-
window.rotationConfig = data.rotationConfig;
2666-
window.availableRotationProviders = data.availableProviders;
2667-
updateRotationStatusDisplay(data.rotationConfig);
2668+
window.embeddingPoolConfig = data.poolConfig;
2669+
window.embeddingPoolAvailableModels = data.availableModels || [];
2670+
2671+
// Also get endpoint count
2672+
var endpointsResponse = await fetch('/api/litellm-api/codexlens/rotation/endpoints');
2673+
var endpointsData = endpointsResponse.ok ? await endpointsResponse.json() : { count: 0 };
2674+
2675+
updateRotationStatusDisplay(data.poolConfig, endpointsData.count);
26682676
} catch (err) {
26692677
console.error('[CodexLens] Error loading rotation status:', err);
26702678
}
26712679
}
26722680

26732681
/**
26742682
* Update the rotation status display in the page
2683+
* @param {Object} poolConfig - The embedding pool configuration
2684+
* @param {number} endpointCount - Number of active endpoints
26752685
*/
2676-
function updateRotationStatusDisplay(rotationConfig) {
2686+
function updateRotationStatusDisplay(poolConfig, endpointCount) {
26772687
var badge = document.getElementById('rotationStatusBadge');
2688+
var detailsEl = document.getElementById('rotationDetails');
2689+
var modelNameEl = document.getElementById('rotationModelName');
26782690
var countEl = document.getElementById('rotationEndpointCount');
26792691

26802692
if (!badge) return;
26812693

2682-
if (rotationConfig && rotationConfig.enabled) {
2694+
if (poolConfig && poolConfig.enabled) {
26832695
badge.textContent = t('common.enabled');
26842696
badge.className = 'text-xs px-2 py-0.5 rounded-full bg-success/10 text-success';
26852697

2686-
// Show endpoint count
2687-
if (countEl && rotationConfig.providers) {
2688-
var totalEndpoints = 0;
2689-
rotationConfig.providers.forEach(function(p) {
2690-
if (p.enabled) totalEndpoints += (p.useAllKeys ? 4 : 1); // Estimate
2691-
});
2692-
countEl.textContent = '~' + totalEndpoints + ' ' + t('codexlens.totalEndpoints').toLowerCase();
2698+
// Show details
2699+
if (detailsEl) {
2700+
detailsEl.classList.remove('hidden');
2701+
if (modelNameEl) modelNameEl.textContent = poolConfig.targetModel || '';
2702+
if (countEl) countEl.textContent = (endpointCount || 0) + ' ' + t('codexlens.totalEndpoints').toLowerCase();
26932703
}
26942704
} else {
26952705
badge.textContent = t('common.disabled');
26962706
badge.className = 'text-xs px-2 py-0.5 rounded-full bg-muted text-muted-foreground';
2697-
if (countEl) countEl.textContent = '';
2707+
if (detailsEl) detailsEl.classList.add('hidden');
2708+
}
2709+
}
2710+
2711+
/**
2712+
* Navigate to API Settings Embedding Pool tab
2713+
*/
2714+
function navigateToApiSettingsEmbeddingPool() {
2715+
// Navigate to API Settings page with embedding-pool tab
2716+
if (typeof switchView === 'function') {
2717+
switchView('api-settings');
2718+
// Give time for page to render, then switch to embedding-pool tab
2719+
setTimeout(function() {
2720+
if (typeof switchSidebarTab === 'function') {
2721+
switchSidebarTab('embedding-pool');
2722+
}
2723+
}, 100);
26982724
}
26992725
}
27002726

0 commit comments

Comments
 (0)