diff --git a/ccw/src/templates/dashboard-js/i18n.js b/ccw/src/templates/dashboard-js/i18n.js
index 8cb6928c..6460f39c 100644
--- a/ccw/src/templates/dashboard-js/i18n.js
+++ b/ccw/src/templates/dashboard-js/i18n.js
@@ -254,6 +254,11 @@ const i18n = {
'codexlens.cleanAllIndexes': 'Clean All Indexes',
'codexlens.installCodexLens': 'Install CodexLens',
'codexlens.createIndex': 'Create Index',
+ 'codexlens.embeddingBackend': 'Embedding Backend',
+ 'codexlens.localFastembed': 'Local (FastEmbed)',
+ 'codexlens.apiLitellm': 'API (LiteLLM)',
+ 'codexlens.backendHint': 'Select local model or remote API endpoint',
+ 'codexlens.noApiModels': 'No API embedding models configured',
'codexlens.embeddingModel': 'Embedding Model',
'codexlens.modelHint': 'Select embedding model for vector search (models with ✓ are installed)',
'codexlens.fullIndex': 'Full',
@@ -1901,6 +1906,11 @@ const i18n = {
'codexlens.cleanAllIndexes': '清理所有索引',
'codexlens.installCodexLens': '安装 CodexLens',
'codexlens.createIndex': '创建索引',
+ 'codexlens.embeddingBackend': '嵌入后端',
+ 'codexlens.localFastembed': '本地 (FastEmbed)',
+ 'codexlens.apiLitellm': 'API (LiteLLM)',
+ 'codexlens.backendHint': '选择本地模型或远程 API 端点',
+ 'codexlens.noApiModels': '未配置 API 嵌入模型',
'codexlens.embeddingModel': '嵌入模型',
'codexlens.modelHint': '选择向量搜索的嵌入模型(带 ✓ 的已安装)',
'codexlens.fullIndex': '全部',
diff --git a/ccw/src/templates/dashboard-js/views/codexlens-manager.js b/ccw/src/templates/dashboard-js/views/codexlens-manager.js
index 0d1dc0bc..913aa2db 100644
--- a/ccw/src/templates/dashboard-js/views/codexlens-manager.js
+++ b/ccw/src/templates/dashboard-js/views/codexlens-manager.js
@@ -1890,9 +1890,15 @@ async function renderCodexLensManager() {
// Load LiteLLM API config for embedding backend options
try {
+ console.log('[CodexLens] Loading LiteLLM config...');
var litellmResponse = await fetch('/api/litellm-api/config');
+ console.log('[CodexLens] LiteLLM response status:', litellmResponse.status);
if (litellmResponse.ok) {
window.litellmApiConfig = await litellmResponse.json();
+ console.log('[CodexLens] LiteLLM config loaded:', window.litellmApiConfig);
+ console.log('[CodexLens] Providers:', window.litellmApiConfig?.providers?.length || 0);
+ } else {
+ console.warn('[CodexLens] LiteLLM config response not ok:', litellmResponse.status);
}
} catch (e) {
console.warn('[CodexLens] Could not load LiteLLM config:', e);
@@ -2180,13 +2186,21 @@ function buildModelSelectOptionsForPage() {
function onEmbeddingBackendChange() {
var backendSelect = document.getElementById('pageBackendSelect');
var modelSelect = document.getElementById('pageModelSelect');
- if (!backendSelect || !modelSelect) return;
-
+ if (!backendSelect || !modelSelect) {
+ console.warn('[CodexLens] Backend or model select not found');
+ return;
+ }
+
var backend = backendSelect.value;
-
+ console.log('[CodexLens] Backend changed to:', backend);
+ console.log('[CodexLens] Current litellmApiConfig:', window.litellmApiConfig);
+
if (backend === 'litellm') {
// Load LiteLLM embedding models
- modelSelect.innerHTML = buildLiteLLMModelOptions();
+ console.log('[CodexLens] Building LiteLLM model options...');
+ var options = buildLiteLLMModelOptions();
+ console.log('[CodexLens] Built options HTML:', options);
+ modelSelect.innerHTML = options;
} else {
// Load local fastembed models
modelSelect.innerHTML = buildModelSelectOptionsForPage();
@@ -2198,24 +2212,39 @@ function onEmbeddingBackendChange() {
*/
function buildLiteLLMModelOptions() {
var litellmConfig = window.litellmApiConfig || {};
+ console.log('[CodexLens] litellmApiConfig:', litellmConfig);
+
var providers = litellmConfig.providers || [];
+ console.log('[CodexLens] providers count:', providers.length);
+
var options = '';
-
+
providers.forEach(function(provider) {
+ console.log('[CodexLens] Processing provider:', provider.id, 'enabled:', provider.enabled);
if (!provider.enabled) return;
- var models = provider.models || [];
+
+ // Check embeddingModels array (config structure)
+ var models = provider.embeddingModels || provider.models || [];
+ console.log('[CodexLens] Provider', provider.id, 'embeddingModels:', models.length, models);
+
models.forEach(function(model) {
- if (model.type !== 'embedding' || !model.enabled) return;
+ console.log('[CodexLens] Processing model:', model.id, 'type:', model.type, 'enabled:', model.enabled);
+ // Accept embedding type or models from embeddingModels array
+ if (model.type && model.type !== 'embedding') return;
+ if (!model.enabled) return;
var label = model.name || model.id;
+ var providerName = provider.name || provider.id;
var selected = options === '' ? ' selected' : '';
- options += '';
+ options += '';
+ console.log('[CodexLens] Added option:', label, 'from', providerName);
});
});
-
+
if (options === '') {
+ console.warn('[CodexLens] No embedding models found in LiteLLM config');
options = '';
}
-
+
return options;
}