diff --git a/data/users/demo.sqlite-shm b/data/users/demo.sqlite-shm index f5df5c8..056709c 100644 Binary files a/data/users/demo.sqlite-shm and b/data/users/demo.sqlite-shm differ diff --git a/src/api/index.ts b/src/api/index.ts index 6bac23c..a91c5e7 100644 --- a/src/api/index.ts +++ b/src/api/index.ts @@ -301,6 +301,7 @@ case 'search_keyword': { case 'search_agents': { const body: any = { query: a.query } if (a.conversationId) body.conversation_id = a.conversationId + if (a.outputLanguage) body.output_language = a.outputLanguage return { url: '/api/v1/agents/search', method: 'POST', body, timeout: 180000 } } diff --git a/src/locales/en.json b/src/locales/en.json index 981103d..c036a84 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -413,6 +413,7 @@ "processorConfig": "Processor Configuration", "filterConfig": "Filter Configuration", "searchConfig": "Search Configuration", + "pipelineConfig": "Pipeline Configuration", "systemConfig": "System Configuration", "uploadPath": "Upload Path", "serviceUrls": "Service URLs" @@ -448,6 +449,26 @@ "stat": { "users": "Users", "shares": "Shares" + }, + "vlm": { + "minScore": "VLM Min Score", + "maxResults": "VLM Max Results", + "outputLanguage": "Output Language", + "hint": { + "minScore": "Minimum similarity score for VLM search", + "maxResults": "Maximum number of VLM search results", + "outputLanguage": "Language for VLM descriptions" + } + }, + "pipeline": { + "enabled": "Enabled", + "maxConcurrentStages": "Max Concurrent Stages", + "defaultTimeoutSecs": "Default Timeout (seconds)", + "hint": { + "enabled": "Enable pipeline processing", + "maxConcurrentStages": "Maximum number of stages to run concurrently", + "defaultTimeoutSecs": "Default timeout for pipeline execution" + } } }, "app": { diff --git a/src/locales/ja.json b/src/locales/ja.json index c5aaef7..fc260c1 100644 --- a/src/locales/ja.json +++ b/src/locales/ja.json @@ -445,6 +445,26 @@ "stat": { "users": "ユーザー", "shares": "共有" + }, + "vlm": { + "minScore": "VLM 最小スコア", + "maxResults": "VLM 最大結果数", + "outputLanguage": "出力言語", + "hint": { + "minScore": "VLM検索の最小類似度スコア", + "maxResults": "VLM検索の最大結果数", + "outputLanguage": "VLM説明の言語" + } + }, + "pipeline": { + "enabled": "有効", + "maxConcurrentStages": "最大並列ステージ数", + "defaultTimeoutSecs": "デフォルトタイムアウト(秒)", + "hint": { + "enabled": "パイプライン処理を有効化", + "maxConcurrentStages": "同時に実行する最大ステージ数", + "defaultTimeoutSecs": "パイプライン実行のデフォルトタイムアウト" + } } }, "app": { diff --git a/src/locales/zh-TW.json b/src/locales/zh-TW.json index 28b1b31..41fb143 100644 --- a/src/locales/zh-TW.json +++ b/src/locales/zh-TW.json @@ -448,6 +448,26 @@ "stat": { "users": "用戶", "shares": "共享" + }, + "vlm": { + "minScore": "VLM 最低分數", + "maxResults": "VLM 最大結果數", + "outputLanguage": "輸出語言", + "hint": { + "minScore": "VLM 搜尋的最低相似度分數", + "maxResults": "VLM 搜尋的最大結果數量", + "outputLanguage": "VLM 描述的語言" + } + }, + "pipeline": { + "enabled": "啟用", + "maxConcurrentStages": "最大並行階段數", + "defaultTimeoutSecs": "預設超時(秒)", + "hint": { + "enabled": "啟用管線處理", + "maxConcurrentStages": "同時執行的最大階段數", + "defaultTimeoutSecs": "管線執行的預設超時時間" + } } }, "app": { diff --git a/src/views/AdminView.vue b/src/views/AdminView.vue index a387e38..ebe9ee5 100644 --- a/src/views/AdminView.vue +++ b/src/views/AdminView.vue @@ -408,6 +408,44 @@ + +
+

+ {{ expandedSections.pipeline ? '▼' : '▶' }} + {{ t('admin.section.pipelineConfig') }} +

+
+
+ + + {{ t('admin.pipeline.hint.enabled') }} +
+
+ + + {{ t('admin.pipeline.hint.maxConcurrentStages') }} +
+
+ + + {{ t('admin.pipeline.hint.defaultTimeoutSecs') }} +
+
+
+

@@ -1130,7 +1168,7 @@ const configSaving = ref(false) const configError = ref('') const configSaveMsg = ref('') const configSaveOk = ref(false) -const expandedSections = ref({ vlm: true, llm: true, proc: true, filter: true, search: true, sys: false, lang: false }) +const expandedSections = ref({ vlm: true, llm: true, proc: true, filter: true, search: true, pipeline: false, sys: false, lang: false }) const vlmPrompts = ref>({}) const llmConfig = ref>({}) @@ -1142,6 +1180,11 @@ const searchConfig = ref>({ vlm_max_results: 5, vlm_output_language: 'en' }) +const pipelineConfig = ref>({ + enabled: false, + max_concurrent_stages: 3, + default_timeout_secs: 3600 +}) function toggleSection(section: string) { expandedSections.value[section] = !expandedSections.value[section] @@ -1188,6 +1231,7 @@ async function loadConfig() { filterConfig.value = data.filter_config || {} systemConfig.value = data.system_config || {} searchConfig.value = data.search || { vlm_min_score: 0.0, vlm_max_results: 5, vlm_output_language: 'en' } + pipelineConfig.value = data.pipeline || { enabled: false, max_concurrent_stages: 3, default_timeout_secs: 3600 } } catch (e: any) { configError.value = 'Failed to load config: ' + (e.message || e) } finally { @@ -1215,6 +1259,11 @@ async function saveConfig() { vlm_max_results: searchConfig.value.vlm_max_results || 5, vlm_output_language: searchConfig.value.vlm_output_language || 'en' }, + pipeline: { + enabled: pipelineConfig.value.enabled ?? false, + max_concurrent_stages: pipelineConfig.value.max_concurrent_stages || 3, + default_timeout_secs: pipelineConfig.value.default_timeout_secs || 3600 + }, } const saveRes = await fetch('/api/v1/admin/config', { method: 'POST', diff --git a/src/views/SearchView.vue b/src/views/SearchView.vue index e78746f..dc30c4f 100644 --- a/src/views/SearchView.vue +++ b/src/views/SearchView.vue @@ -815,6 +815,7 @@ async function sendMessage() { const res: any = await apiCall('search_agents', { query: q, conversationId: conversationId.value || null, + outputLanguage: searchConfig.value.vlm_output_language || 'en', }) if (searchSeq !== seq) return if (res?.conversation_id) conversationId.value = res.conversation_id