From 1dc55f8811871e68dee7cc9057bc82d9aaf7f82c Mon Sep 17 00:00:00 2001 From: catlog22 Date: Thu, 25 Dec 2025 13:11:51 +0800 Subject: [PATCH] =?UTF-8?q?feat(ui):=20=E6=94=AF=E6=8C=81=E8=87=AA?= =?UTF-8?q?=E5=AE=9A=E4=B9=89=20API=20=E5=B9=B6=E5=8F=91=E6=95=B0=20(1-32?= =?UTF-8?q?=20workers)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加 codexlens.concurrency 和 concurrencyHint 翻译 (中英文) - 将 worker 下拉菜单改为数字输入框,支持 1-32 范围 - 添加 validateConcurrencyInput 输入验证函数 - 默认值 4 workers,显示推荐提示 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- ccw/src/templates/dashboard-js/i18n.js | 6 ++++ .../dashboard-js/views/codexlens-manager.js | 33 +++++++++++++------ 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/ccw/src/templates/dashboard-js/i18n.js b/ccw/src/templates/dashboard-js/i18n.js index 178baf99..63fe998e 100644 --- a/ccw/src/templates/dashboard-js/i18n.js +++ b/ccw/src/templates/dashboard-js/i18n.js @@ -266,6 +266,9 @@ const i18n = { 'codexlens.noApiModels': 'No API embedding models configured', 'codexlens.embeddingModel': 'Embedding Model', 'codexlens.modelHint': 'Select embedding model for vector search (models with ✓ are installed)', + 'codexlens.concurrency': 'API Concurrency', + 'codexlens.concurrencyHint': 'Number of parallel API calls (1-32). Higher values speed up indexing but may hit rate limits.', + 'codexlens.concurrencyCustom': 'Custom', 'codexlens.fullIndex': 'Full', 'codexlens.vectorIndex': 'Vector', 'codexlens.ftsIndex': 'FTS', @@ -1925,6 +1928,9 @@ const i18n = { 'codexlens.noApiModels': '未配置 API 嵌入模型', 'codexlens.embeddingModel': '嵌入模型', 'codexlens.modelHint': '选择向量搜索的嵌入模型(带 ✓ 的已安装)', + 'codexlens.concurrency': 'API 并发数', + 'codexlens.concurrencyHint': '并行 API 调用数量(1-32)。较高的值可加速索引但可能触发速率限制。', + 'codexlens.concurrencyCustom': '自定义', 'codexlens.fullIndex': '全部', 'codexlens.vectorIndex': '向量', 'codexlens.ftsIndex': 'FTS', diff --git a/ccw/src/templates/dashboard-js/views/codexlens-manager.js b/ccw/src/templates/dashboard-js/views/codexlens-manager.js index 53471bd4..6456a12f 100644 --- a/ccw/src/templates/dashboard-js/views/codexlens-manager.js +++ b/ccw/src/templates/dashboard-js/views/codexlens-manager.js @@ -1999,14 +1999,15 @@ function buildCodexLensManagerPage(config) { '' + // Concurrency selector (only for LiteLLM backend) '' + // Index buttons - two modes: full (FTS + Vector) or FTS only '
' + @@ -2204,6 +2205,18 @@ function buildModelSelectOptionsForPage() { return options; } +/** + * Validate concurrency input value (1-32) + */ +function validateConcurrencyInput(input) { + var value = parseInt(input.value, 10); + if (isNaN(value) || value < 1) { + input.value = 1; + } else if (value > 32) { + input.value = 32; + } +} + /** * Handle embedding backend change */ @@ -2290,10 +2303,10 @@ window.onEmbeddingBackendChange = onEmbeddingBackendChange; function initCodexLensIndexFromPage(indexType) { var backendSelect = document.getElementById('pageBackendSelect'); var modelSelect = document.getElementById('pageModelSelect'); - var concurrencySelect = document.getElementById('pageConcurrencySelect'); + var concurrencyInput = document.getElementById('pageConcurrencyInput'); var selectedBackend = backendSelect ? backendSelect.value : 'fastembed'; var selectedModel = modelSelect ? modelSelect.value : 'code'; - var selectedConcurrency = concurrencySelect ? parseInt(concurrencySelect.value, 10) : 1; + var selectedConcurrency = concurrencyInput ? Math.min(32, Math.max(1, parseInt(concurrencyInput.value, 10) || 4)) : 4; // For FTS-only index, model is not needed if (indexType === 'normal') {